Extract busybox's make helpers
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 5 May 2016 15:14:09 +0000 (11:14 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 May 2016 15:14:49 +0000 (11:14 -0400)
Parts of busybox's Makefile are generic to all apps that we'll build.
Instead of just copying bits and pieces, we can have all of the apps
include a Makefrag.

It's far from perfect.  We could detect the cross compiler instead of being
told what it is, and if AKAROS_ROOT (e.g. from .bashrc) doesn't point to
the repo we're in, then weird things could happen.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/Makefrag [new file with mode: 0644]
tools/apps/busybox/Makefile

diff --git a/tools/Makefrag b/tools/Makefrag
new file mode 100644 (file)
index 0000000..6d494fd
--- /dev/null
@@ -0,0 +1,66 @@
+# Helper for writing application Makefiles
+#
+# Those apps should include this directly and be located three directories down
+# from the AKAROS_ROOT.
+#
+# Other than providing defaults for things like AKAROS_ROOT, the main thing
+# this does is set the cross compiler.  You can override some things with a
+# Makelocal.
+#
+# Exports CROSS_COMPILE, ARCH, KBUILD_VERBOSE, Q, MAKEFLAGS, BUILDDIR,
+# AKAROS_ROOT, MAKE_JOBS FIRST_KFS_PATH, KFS_ROOT
+
+# 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
+-include Makelocal
+BUILDDIR ?= $(shell pwd)
+AKAROS_ROOT ?= $(BUILDDIR)/../../..
+MAKE_JOBS ?= 4
+FIRST_KFS_PATH ?= $(AKAROS_ROOT)/kern/kfs
+KFS_ROOT = $(FIRST_KFS_PATH)
+
+# To put more focus on warnings, be less verbose as default
+# Use 'make V=1' to see the full commands
+# Yanked this from the top-level.  It might work with V=1 from there too.
+# Interestingly enough, V=1 gets passed to busybox, which also uses Kbuild,
+# allowing us to control it's verbosity too.
+ifeq ("$(origin V)", "command line")
+  KBUILD_VERBOSE ?= $(V)
+endif
+ifndef KBUILD_VERBOSE
+  KBUILD_VERBOSE = 0
+endif
+ifeq ($(KBUILD_VERBOSE),1)
+  Q ?=
+else
+  Q ?= @
+endif
+
+
+# CC prefix detection.  If we're called from the top-level Makefile, CC will be
+# set.
+
+# So that valid-arches aren't the default goal
+.DEFAULT_GOAL = all
+# Helper target, so users can say make x86_64 and get ARCH=x86_64
+valid-arches := riscv x86_64
+PHONY += $(valid-arches)
+$(valid-arches):
+       $(MAKE) ARCH=$@
+
+ifeq ($(CROSS_COMPILE),)
+    # ARCH will only be set if they called make (valid-arches) directly.
+    ifneq ($(ARCH),)
+        ifeq ($(filter $(valid-arches), $(ARCH)),)
+            $(error ARCH $(ARCH) invalid, must be one of: $(valid-arches))
+        endif
+    else
+        ARCH := x86_64
+    endif
+    CROSS_COMPILE := $(ARCH)-ucb-akaros-
+endif
index 4439677..b0387a5 100644 (file)
@@ -4,8 +4,8 @@
 # make [all] will do a full install with the default config.
 #
 # make x86_64|riscv will set the cross compiler in the .config.  You can also
-# pass ARCH or CROSS_COMPILE.  The top-level Makefile should be able to call
-# this, but it is not necessary to do so.
+# pass CROSS_COMPILE.  The top-level Makefile should be able to call this, but
+# it is not necessary to do so.
 #
 # Uppercase variables are 'global', in the sense that we may have them exported
 # from parent makefiles or overridden by a Makelocal.
 #      - make busybox target from the top-level Makefile
 #      - port to the latest busybox version
 
-busybox-version := 1.17.3
+include ../../Makefrag
 
-# 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
+busybox-version := 1.17.3
 
-# Overrides
--include Makelocal
-BUILDDIR ?= $(shell pwd)
-AKAROS_ROOT ?= $(BUILDDIR)/../../..
-MAKE_JOBS ?= 4
-FIRST_KFS_PATH ?= $(AKAROS_ROOT)/kern/kfs
 install-prefix ?= $(FIRST_KFS_PATH)
 BUSYBOX_CONFIG ?= defconfig-$(busybox-version)
 
-# To put more focus on warnings, be less verbose as default
-# Use 'make V=1' to see the full commands
-# Yanked this from the top-level.  It might work with V=1 from there too.
-# Interestingly enough, V=1 gets passed to busybox, which also uses Kbuild,
-# allowing us to control it's verbosity too.
-ifeq ("$(origin V)", "command line")
-  KBUILD_VERBOSE ?= $(V)
-endif
-ifndef KBUILD_VERBOSE
-  KBUILD_VERBOSE = 0
-endif
-ifeq ($(KBUILD_VERBOSE),1)
-  Q ?=
-else
-  Q ?= @
-endif
-
-
-# If we only call busybox's make from the top level, all of the CC detection
-# goes away. 
-valid-arches := riscv x86_64
-
-# ARCH / CC prefix detection.  Only using ARCH to help with the CC.  If we're
-# called from the top-level Makefile, CC will be set.  ARCH might be x86.
-#
-# All we do is use this to set the CC in busybox's .config down below.  If they
-# don't have an arch or a CC set, they'll get whatever is in the defconfig.
-ifeq ($(CROSS_COMPILE),)
-    ifneq ($(ARCH),)
-               # Accept x86
-        ifeq ($(ARCH),x86)
-            override ARCH := x86_64
-        endif
-        ifeq ($(filter $(valid-arches), $(ARCH)),)
-            $(error ARCH $(ARCH) invalid, must be one of: $(valid-arches))
-        endif
-        CROSS_COMPILE := $(ARCH)-ucb-akaros-
-    endif
-endif
-
-
 PHONY := all
 all: busybox-install
 
-# Helper target, so users can say make x86_64 and get ARCH=x86_64
-PHONY += $(valid-arches)
-$(valid-arches):
-       $(MAKE) ARCH=$@
-
-
 akaros-patches := $(sort $(wildcard akaros-patches/$(busybox-version)/*))
 upstream-patches := $(sort $(wildcard upstream-patches/$(busybox-version)/*))
 
@@ -117,9 +60,7 @@ busybox-$(busybox-version)-akaros: busybox-$(busybox-version).tar.bz2 \
 PHONY += busybox-config
 busybox-config: busybox-$(busybox-version)-akaros
        $(Q)sed -i '/CONFIG_PREFIX/ c CONFIG_PREFIX="$(install-prefix)"' $</.config
-ifneq ($(CROSS_COMPILE),)
        $(Q)sed -i '/CROSS_COMPILER_PREFIX/ c CONFIG_CROSS_COMPILER_PREFIX="$(CROSS_COMPILE)"' $</.config
-endif
 
 PHONY += busybox-make
 busybox-make: busybox-config