# 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)
