Busybox will rebuild when defconfig changes
[akaros.git] / tools / apps / busybox / Makefile
1 # Makefile for busybox.
2 # Barret Rhoden
3 #
4 # make [all] will do a full install with the default config.
5 #
6 # make x86_64|riscv will set the cross compiler in the .config.  You can also
7 # pass ARCH or CROSS_COMPILE.  The top-level Makefile should be able to call
8 # this, but it is not necessary to do so.
9 #
10 # Uppercase variables are 'global', in the sense that we may have them exported
11 # from parent makefiles or overridden by a Makelocal.
12 #
13 # You can also maintain your own config and override BUSYBOX_CONFIG.  Anything
14 # named local-config-* will be ignored by git.
15 #
16 # If you are porting new versions of busybox, you'll have to download the
17 # upstream patches manually.  It wasn't worth the effort to automate that.
18 #
19 # As new patches are added, you should just need to make.  Busybox is small
20 # enough that I just trash the old one and rebuild whenever there is a change.
21 # If there is a new CC, you may need to make clean.
22 #
23 # TODO:
24 #       - make target for building a clone of -akaros for fast diffing and such
25 #       - make busybox target from the top-level Makefile
26 #       - port to the latest busybox version
27
28 busybox-version := 1.17.3
29
30 # Do not:
31 # o  use make's built-in rules and variables
32 #    (this increases performance and avoids hard-to-debug behaviour);
33 # o  print "Entering directory ...";
34 MAKEFLAGS += -rR --no-print-directory
35
36 # Overrides
37 -include Makelocal
38 BUILDDIR ?= $(shell pwd)
39 AKAROS_ROOT ?= $(BUILDDIR)/../../..
40 MAKE_JOBS ?= 4
41 FIRST_KFS_PATH ?= $(AKAROS_ROOT)/kern/kfs
42 install-prefix ?= $(FIRST_KFS_PATH)
43 BUSYBOX_CONFIG ?= defconfig-$(busybox-version)
44
45 # To put more focus on warnings, be less verbose as default
46 # Use 'make V=1' to see the full commands
47 # Yanked this from the top-level.  It might work with V=1 from there too.
48 # Interestingly enough, V=1 gets passed to busybox, which also uses Kbuild,
49 # allowing us to control it's verbosity too.
50 ifeq ("$(origin V)", "command line")
51   KBUILD_VERBOSE ?= $(V)
52 endif
53 ifndef KBUILD_VERBOSE
54   KBUILD_VERBOSE = 0
55 endif
56 ifeq ($(KBUILD_VERBOSE),1)
57   Q ?=
58 else
59   Q ?= @
60 endif
61
62
63 # If we only call busybox's make from the top level, all of the CC detection
64 # goes away. 
65 valid-arches := riscv x86_64
66
67 # ARCH / CC prefix detection.  Only using ARCH to help with the CC.  If we're
68 # called from the top-level Makefile, CC will be set.  ARCH might be x86.
69 #
70 # All we do is use this to set the CC in busybox's .config down below.  If they
71 # don't have an arch or a CC set, they'll get whatever is in the defconfig.
72 ifeq ($(CROSS_COMPILE),)
73     ifneq ($(ARCH),)
74                 # Accept x86
75         ifeq ($(ARCH),x86)
76             override ARCH := x86_64
77         endif
78         ifeq ($(filter $(valid-arches), $(ARCH)),)
79             $(error ARCH $(ARCH) invalid, must be one of: $(valid-arches))
80         endif
81         CROSS_COMPILE := $(ARCH)-ucb-akaros-
82     endif
83 endif
84
85
86 PHONY := all
87 all: busybox-install
88
89 # Helper target, so users can say make x86_64 and get ARCH=x86_64
90 PHONY += $(valid-arches)
91 $(valid-arches):
92         $(MAKE) ARCH=$@
93
94
95 akaros-patches := $(sort $(wildcard akaros-patches/$(busybox-version)/*))
96 upstream-patches := $(sort $(wildcard upstream-patches/$(busybox-version)/*))
97
98 %.tar.bz2:
99         $(Q)wget http://www.busybox.net/downloads/$@
100
101 busybox-$(busybox-version)-akaros: busybox-$(busybox-version).tar.bz2 \
102                                    $(akaros-patches) $(upstream-patches) \
103                                    $(BUSYBOX_CONFIG)
104         @echo "Extracting and patching Busybox $(busybox-version)"
105         $(Q)rm -rf $@
106         $(Q)tar -jxf $<
107         $(Q)mv busybox-$(busybox-version) $@
108         $(Q)cp $(BUSYBOX_CONFIG) $@/.config
109         $(Q)cd $@; \
110         for i in $(upstream-patches); do \
111                 patch -p1 < ../$$i; \
112         done; \
113         for i in $(akaros-patches); do \
114                 patch -p1 < ../$$i; \
115         done
116
117 PHONY += busybox-config
118 busybox-config: busybox-$(busybox-version)-akaros
119         $(Q)sed -i '/CONFIG_PREFIX/ c CONFIG_PREFIX="$(install-prefix)"' $</.config
120 ifneq ($(CROSS_COMPILE),)
121         $(Q)sed -i '/CROSS_COMPILER_PREFIX/ c CONFIG_CROSS_COMPILER_PREFIX="$(CROSS_COMPILE)"' $</.config
122 endif
123
124 PHONY += busybox-make
125 busybox-make: busybox-config
126         @echo "Making busybox"
127         $(Q)cd busybox-$(busybox-version)-akaros && $(MAKE)
128
129 PHONY += busybox-install
130 busybox-install: busybox-make
131         $(Q)cd busybox-$(busybox-version)-akaros && $(MAKE) install
132         $(Q)cp busybox-$(busybox-version)-akaros/busybox_unstripped \
133            $(install-prefix)/bin/busybox
134         
135 PHONY += clean
136 clean:
137         $(Q)rm -rf busybox-$(busybox-version)-akaros
138
139 PHONY += mrproper
140 mrproper: clean
141         $(Q)rm -rf busybox-$(busybox-version) 
142
143 Makefile: ; # avoid implicit rule on Makefile
144
145 # Declare the contents of the .PHONY variable as phony.  We keep that
146 # information in a variable so we can use it in if_changed and friends.
147 .PHONY: $(PHONY)