Code Review: Created makefrag-user-app helper

1 view
Skip to first unread message

Davide Libenzi

unread,
Dec 15, 2015, 6:50:14 PM12/15/15
to Akaros
For now I only used it for snc. Plan to use it for perf as well.
Did not touch kprof2perf, as it is going away in the perf branch.



The following changes since commit c8a6943551e4eb433c058e258bca0a99e713d581:

  Rename backtrace_kframe -> backtrace_hwtf [2/2] (2015-12-10 11:26:40 -0500)

are available in the git repository at:

  g...@github.com:dlibenzi/akaros makefrag_user_app

for you to fetch changes up to 8b262d2dde201f186115e7bfddd09d59df1aed7f:

  Created a new Makefrag-user-app helper for building binaries (2015-12-15 15:46:36 -0800)

----------------------------------------------------------------
Davide Libenzi (1):
      Created a new Makefrag-user-app helper for building binaries

 Makefile                |  7 +++---
 tools/apps/snc/Makefile | 41 ++-------------------------------
 user/Makefrag-user-app  | 61 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+), 42 deletions(-)
 create mode 100644 user/Makefrag-user-app

diff --git a/Makefile b/Makefile
index 8defe95..d0de66f 100644
--- a/Makefile
+++ b/Makefile
@@ -404,8 +404,9 @@ kfs-paths := kern/kfs
 endif
 
 FIRST_KFS_PATH = $(firstword $(kfs-paths))
+ABS_KFS_PATH = $(abspath $(FIRST_KFS_PATH))
 
-export OBJDIR FIRST_KFS_PATH
+export OBJDIR FIRST_KFS_PATH ABS_KFS_PATH
 
 # Avoiding implicit rules
 $(srctree)/Makelocal: ;
@@ -659,13 +660,13 @@ PHONY += apps-install
 apps-install:
  @$(call make_as_parent, -C tools/apps/busybox)
  @$(call make_as_parent, -C tools/profile/kprof2perf install)
- @$(call make_as_parent, -C tools/apps/snc install)
+ @$(MAKE) -C tools/apps/snc DEPLIBS="$^" && $(MAKE) -C tools/apps/snc install
 
 PHONY += apps-clean
 apps-clean:
  @$(call make_as_parent, -C tools/apps/busybox clean)
  @$(call make_as_parent, -C tools/profile/kprof2perf clean)
- @$(call make_as_parent, -C tools/apps/snc clean)
+ @$(MAKE) -C tools/apps/snc clean
 
 # Cross Compiler
 # =========================================================================
diff --git a/tools/apps/snc/Makefile b/tools/apps/snc/Makefile
index 2678e98..85eeecd 100644
--- a/tools/apps/snc/Makefile
+++ b/tools/apps/snc/Makefile
@@ -1,39 +1,2 @@
-# Do not:
-# o  use make's built-in rules and variables
-#    (this increases performance and avoids hard-to-debug behaviour);
-# o  print "Entering directory ...";
-MAKEFLAGS += -rR --no-print-directory
-
-# Overrides
-BUILDDIR ?= $(shell pwd)
-AKAROS_ROOT ?= $(BUILDDIR)/../../..
-MAKE_JOBS ?= 4
-KFS_ROOT ?= $(AKAROS_ROOT)/kern/kfs
-
-XCC = $(CROSS_COMPILE)gcc
-
-
-PHONY := all
-all: snc
-
-
-PHONY += snc
-snc: snc.c
- @$(XCC) $(ROS_CFLAGS) $(ROS_LDFLAGS) -o snc snc.c
-
-
-PHONY += install
-install: all
- @cp snc $(KFS_ROOT)/bin/snc
-
-
-PHONY += clean
-clean:
- @rm -f snc
-
-
-PHONY += mrproper
-mrproper: clean
-
-
-.PHONY: $(PHONY)
+APPNAME = snc
+include ../../../user/Makefrag-user-app
diff --git a/user/Makefrag-user-app b/user/Makefrag-user-app
new file mode 100644
index 0000000..64dac87
--- /dev/null
+++ b/user/Makefrag-user-app
@@ -0,0 +1,61 @@
+# Makefrag for most user libraries
+# They must set APPNAME, then include this fragment
+# e.g.  APPNAME = perf
+
+ARCH ?= none # catch bugs
+SRCDIR ?=
+INCDIR = $(shell if [ -d "$(SRCDIR)include" ]; then echo "$(SRCDIR)include";\
+ else echo -n ""; fi)
+
+OBJDIR ?= $(SRCDIR)obj
+# DEPLIBS passed in from the top-level Makefile
+DEPLIBS := $(DEPLIBS)
+DEPLIBAS = $(patsubst %, $(XCC_TARGET_LIB)/lib%.a, $(DEPLIBS))
+
+ifneq ($(INCDIR),)
+ INCS = -I$(INCDIR)
+endif
+
+FINALAPP = $(OBJDIR)/$(APPNAME)
+FINALAPP-INSTALL = $(ABS_KFS_PATH)/bin/$(APPNAME)
+
+uc = $(shell echo $(1) | tr a-z A-Z)
+
+APPUCNAME := $(call uc, $(APPNAME))
+HEADERS := $(shell find $(INCDIR) -name "*.h")
+CFILES  := $(wildcard $(SRCDIR)*.c)
+CFILES  += $(wildcard $(SRCDIR)$(ARCH)/*.c)
+SFILES  := $(wildcard $(SRCDIR)$(ARCH)/*.S)
+OBJS    := $(patsubst %.c, $(OBJDIR)/%.o, $(CFILES)) \
+           $(patsubst %.S, $(OBJDIR)/%.o, $(SFILES))
+
+all: $(FINALAPP)
+ @:
+
+$(OBJDIR)/$(ARCH)/%.o: $(SRCDIR)$(ARCH)/%.S $(HEADERS) $(DEPLIBAS)
+ @echo + as [$(APPUCNAME)] $<
+ @mkdir -p $(@D)
+ $(Q)$(CC) $(CFLAGS_USER) $(INCS) -o $@ -c $<
+
+$(OBJDIR)/%.o: $(SRCDIR)%.c $(HEADERS) $(DEPLIBAS)
+ @echo + cc [$(APPUCNAME)] $<
+ @mkdir -p $(@D)
+ $(Q)$(CC) $(CFLAGS_USER) $(INCS) -o $@ -c $<
+
+$(FINALAPP): $(OBJS)
+ @echo + ld [$(APPUCNAME)] $@
+ @mkdir -p $(@D)
+ $(Q)$(CC) -o $@ $(OBJS) $(DEPLIBAS)
+
+# Allow three different patterns for installing include files
+$(FINALAPP-INSTALL): $(FINALAPP)
+ @echo + in [$(APPUCNAME)] $< $@
+ @cp $< $@
+
+install: $(FINALAPP-INSTALL)
+ @echo > /dev/null
+
+clean:
+ @echo + clean [$(APPUCNAME)]
+ $(Q)rm -rf $(FINALAPP)
+ $(Q)rm -rf $(OBJDIR)

Davide Libenzi

unread,
Dec 16, 2015, 10:47:01 AM12/16/15
to Akaros
I did a revision of this, to use a style similar to the user directories, in the master makefile.

Barret Rhoden

unread,
Dec 21, 2015, 12:57:38 PM12/21/15
to aka...@googlegroups.com
Merged to master at f945c3bf7870..548361ec318c (from, to]

You can see the entire diff with 'git diff' or at
https://github.com/brho/akaros/compare/f945c3bf7870...548361ec318c



On 2015-12-15 at 15:50 "'Davide Libenzi' via Akaros"

Davide Libenzi

unread,
Dec 21, 2015, 1:35:12 PM12/21/15
to Akaros
I am not entirely happy with that, though I do not have a clear idea in mind now, for replacement.
Now we have the dependencies for a app/userlib listed in the main makefile, with the main makefile using make -C to call the child.
Ideally, the main makefile should include the child, so that the child can be a single point definition for targets and dependencies.


--
You received this message because you are subscribed to the Google Groups "Akaros" group.
To unsubscribe from this group and stop receiving emails from it, send an email to akaros+un...@googlegroups.com.
To post to this group, send email to aka...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages