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)