blob: 4439677f2cffe17dbafac02a7f114ce6c16266df [file] [log] [blame] [edit]
# 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)