|  | # Makefile for busybox. | 
|  | # Barret Rhoden | 
|  | # | 
|  | # 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. | 
|  | # | 
|  | # Uppercase variables are 'global', in the sense that we may have them exported | 
|  | # from parent makefiles or overridden by a Makelocal. | 
|  | # | 
|  | # You can also maintain your own config and override BUSYBOX_CONFIG.  Anything | 
|  | # named local-config-* will be ignored by git. | 
|  | # | 
|  | # If you are porting new versions of busybox, you'll have to download the | 
|  | # upstream patches manually.  It wasn't worth the effort to automate that. | 
|  | # | 
|  | # As new patches are added, you should just need to make.  Busybox is small | 
|  | # enough that I just trash the old one and rebuild whenever there is a change. | 
|  | # If there is a new CC, you may need to make clean. | 
|  | # | 
|  | # TODO: | 
|  | # 	- make target for building a clone of -akaros for fast diffing and such | 
|  | # 	- make busybox target from the top-level Makefile | 
|  | # 	- port to the latest busybox version | 
|  |  | 
|  | busybox-version := 1.17.3 | 
|  |  | 
|  | # 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 | 
|  | 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)/*)) | 
|  |  | 
|  | %.tar.bz2: | 
|  | $(Q)wget http://www.busybox.net/downloads/$@ | 
|  |  | 
|  | busybox-$(busybox-version)-akaros: busybox-$(busybox-version).tar.bz2 \ | 
|  | $(akaros-patches) $(upstream-patches) \ | 
|  | $(BUSYBOX_CONFIG) | 
|  | @echo "Extracting and patching Busybox $(busybox-version)" | 
|  | $(Q)rm -rf $@ | 
|  | $(Q)tar -jxf $< | 
|  | $(Q)mv busybox-$(busybox-version) $@ | 
|  | $(Q)cp $(BUSYBOX_CONFIG) $@/.config | 
|  | $(Q)cd $@; \ | 
|  | for i in $(upstream-patches); do \ | 
|  | patch -p1 < ../$$i; \ | 
|  | done; \ | 
|  | for i in $(akaros-patches); do \ | 
|  | patch -p1 < ../$$i; \ | 
|  | done | 
|  |  | 
|  | 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 | 
|  | @echo "Making busybox" | 
|  | $(Q)cd busybox-$(busybox-version)-akaros && $(MAKE) | 
|  |  | 
|  | PHONY += busybox-install | 
|  | busybox-install: busybox-make | 
|  | $(Q)cd busybox-$(busybox-version)-akaros && $(MAKE) install | 
|  | $(Q)cp busybox-$(busybox-version)-akaros/busybox_unstripped \ | 
|  | $(install-prefix)/bin/busybox | 
|  |  | 
|  | PHONY += clean | 
|  | clean: | 
|  | $(Q)rm -rf busybox-$(busybox-version)-akaros | 
|  |  | 
|  | PHONY += mrproper | 
|  | mrproper: clean | 
|  | $(Q)rm -rf busybox-$(busybox-version) | 
|  |  | 
|  | Makefile: ; # avoid implicit rule on Makefile | 
|  |  | 
|  | # Declare the contents of the .PHONY variable as phony.  We keep that | 
|  | # information in a variable so we can use it in if_changed and friends. | 
|  | .PHONY: $(PHONY) |