add a more realistic bulk target
[openadk.git] / mk / build.mk
blob98dc6592cc3a1582e55746c8006956cf53112bb8
1 # This file is part of the OpenADK project. OpenADK is copyrighted
2 # material, please see the LICENCE file in the top-level directory.
4 TOPDIR=$(shell pwd)
5 export TOPDIR
7 ifneq ($(shell umask 2>/dev/null | sed 's/0*022/OK/'),OK)
8 $(error your umask is not 022)
9 endif
11 CONFIG_CONFIG_IN = Config.in
12 CONFIG = config
13 DEFCONFIG= ADK_DEVELSYSTEM=n \
14 ADK_DEBUG=n \
15 ADK_STATIC=n \
16 ADK_FORCE_PARALLEL=n \
17 ADK_PACKAGE_GRUB=n \
18 BUSYBOX_SELINUX=n \
19 BUSYBOX_MODPROBE_SMALL=n \
20 BUSYBOX_EJECT=n \
21 BUSYBOX_BUILD_LIBBUSYBOX=n \
22 BUSYBOX_FEATURE_2_4_MODULES=n \
23 BUSYBOX_LOCALE_SUPPORT=n \
24 BUSYBOX_FEATURE_PREFER_APPLETS=n \
25 BUSYBOX_FEATURE_SUID=n \
26 BUSYBOX_SELINUXENABLED=n \
27 BUSYBOX_FEATURE_INSTALLER=n \
28 BUSYBOX_PAM=n \
29 BUSYBOX_FLASH_LOCK=n \
30 BUSYBOX_FLASH_UNLOCK=n \
31 BUSYBOX_FLASH_ERASEALL=n \
32 BUSYBOX_PIE=n \
33 BUSYBOX_DEBUG=n \
34 BUSYBOX_NOMMU=n \
35 BUSYBOX_WERROR=n \
36 BUSYBOX_STATIC=n \
37 ADK_KERNEL_RT2X00_DEBUG=n \
38 ADK_KERNEL_ATH5K_DEBUG=n
40 noconfig_targets:= menuconfig \
41 _config \
42 _mconfig \
43 tags
45 MAKECLEAN_SYMBOLS= ADK_TARGET_LIB_UCLIBC \
46 ADK_TARGET_LIB_GLIBC \
47 ADK_TARGET_LIB_ECLIBC \
48 ADK_DEBUG
50 POSTCONFIG= -@ \
51 if [ -f .config.old ];then \
52 if [ -d .cfg ];then \
53 what=cleantarget; \
54 for symbol in ${MAKECLEAN_SYMBOLS}; do \
55 newval=$$(grep -e "^$$symbol=" -e "^\# $$symbol " .config); \
56 oldval=$$(cat .cfg/"$$symbol" 2>&-); \
57 [[ $$newval = $$oldval ]] && continue; \
58 echo; \
59 echo >&2 "WARNING: Toolchain related options have changed, 'make" \
60 "$$what' might be required!"; \
61 break; \
62 done; \
63 fi; \
64 if [ "$$(grep ^BUSYBOX .config|md5sum)" != "$$(grep ^BUSYBOX .config.old|md5sum)" ];then \
65 if [ -f build_*/w-busybox*/busybox*/.configure_done ];then \
66 rm build_*/w-busybox*/busybox*/.configure_done; \
67 fi; \
68 fi; \
71 # Pull in the user's configuration file
72 ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
73 -include $(TOPDIR)/.config
74 endif
76 ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)
77 include $(TOPDIR)/rules.mk
78 include ${TOPDIR}/mk/split-cfg.mk
80 all: world
82 allcopy: all
83 $(CP) $(BIN_DIR) $(TOPDIR)/bulkdir/${d}/
85 .NOTPARALLEL:
86 .PHONY: all world clean cleantarget cleandir distclean image_clean
88 world: $(DISTDIR) $(BUILD_DIR) $(TARGET_DIR) $(PACKAGE_DIR) ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
89 ${BASH} ${TOPDIR}/scripts/scan-pkgs.sh
90 ifeq ($(ADK_NATIVE),y)
91 $(MAKE) -f mk/build.mk toolchain/kernel-headers-prepare target/config-prepare target/compile package/compile root_clean package/install package_index target/install
92 else
93 ifeq ($(ADK_TOOLCHAIN_ONLY),y)
94 $(MAKE) -f mk/build.mk toolchain/install package/compile
95 else
96 $(MAKE) -f mk/build.mk toolchain/install target/config-prepare target/compile package/compile root_clean package/install package_index target/install
97 endif
98 endif
100 package_index:
101 ifeq ($(ADK_TARGET_PACKAGE_IPKG),y)
102 -cd ${PACKAGE_DIR} && \
103 ${BASH} ${TOPDIR}/scripts/ipkg-make-index.sh . >Packages
104 endif
106 $(DISTDIR):
107 mkdir -p $(DISTDIR)
109 $(BUILD_DIR):
110 mkdir -p $(BUILD_DIR)
112 $(TARGET_DIR):
113 mkdir -p $(TARGET_DIR)
115 $(PACKAGE_DIR):
116 mkdir -p ${PACKAGE_DIR}/.stamps
118 ${STAGING_DIR} ${STAGING_DIR}/etc ${STAGING_TOOLS}:
119 mkdir -p ${STAGING_DIR}/{bin,etc,lib,usr/include} \
120 ${STAGING_TOOLS}/{bin,lib}
122 ${STAGING_DIR}/etc/ipkg.conf: ${STAGING_DIR}/etc
123 echo "dest root /" >${STAGING_DIR}/etc/ipkg.conf
124 echo "option offline_root ${TARGET_DIR}" >>$(STAGING_DIR)/etc/ipkg.conf
126 package/%: ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG ${STAGING_DIR}/etc/ipkg.conf
127 $(MAKE) -C package $(patsubst package/%,%,$@)
129 target/%: ${TOPDIR}/.cfg/ADK_HAVE_DOT_CONFIG
130 $(MAKE) -C target $(patsubst target/%,%,$@)
132 toolchain/%: ${STAGING_DIR}
133 $(MAKE) -C toolchain $(patsubst toolchain/%,%,$@)
135 image:
136 $(MAKE) -C target image
138 switch:
139 echo "Saving configuration for target: ${ADK_TARGET}"
140 cp -p .config .config.${ADK_TARGET}
141 if [ -f .config.old ];then cp -p .config.old .config.old.${ADK_TARGET};fi
142 mv .cfg .cfg.${ADK_TARGET}
143 if [ -f .config.${TARGET} ];then cp -p .config.${TARGET} .config; \
144 cp -p .config.old.${TARGET} .config.old; \
145 mv .cfg.${TARGET} .cfg; \
146 echo "Setting configuration to target: ${TARGET}"; \
147 else echo "No old target config found";mv .config .config.bak; make TARGET=${TARGET};fi
149 kernelconfig:
150 cp $(TOPDIR)/target/$(ADK_TARGET)/kernel.config $(BUILD_DIR)/linux/.config
151 make -C $(BUILD_DIR)/linux/ ARCH=$(ARCH) menuconfig
152 cp $(BUILD_DIR)/linux/.config $(TOPDIR)/target/$(ADK_TARGET)/kernel.config
154 #############################################################
156 # Cleanup and misc junk
158 #############################################################
159 root_clean:
160 @$(TRACE) root_clean
161 rm -rf $(TARGET_DIR)
162 mkdir -p $(TARGET_DIR)
164 # Do a per-package clean here, too. This way stale headers and
165 # libraries from cross_*/target/ get wiped away, which keeps
166 # future package build's configure scripts from returning false
167 # dependencies information.
169 clean:
170 @$(TRACE) clean
171 $(MAKE) -C $(CONFIG) clean
172 for d in ${STAGING_PARENT}; do \
173 for f in $$(ls $$d/pkg/[a-z]* 2>/dev/null); do \
174 while read file ; do \
175 rm $$d/target/$$file 2>/dev/null; \
176 done < $$f ; \
177 rm $$f ; \
178 done \
179 done
180 rm -rf $(BUILD_DIR) $(BIN_DIR) $(TARGET_DIR) ${TOPDIR}/.cfg
181 rm -f ${TOPDIR}/package/*/info.mk
183 cleankernel:
184 @$(TRACE) cleankernel
185 rm -rf $(TOOLCHAIN_BUILD_DIR)/linux* $(BUILD_DIR)/linux
187 cleandir:
188 @$(TRACE) cleandir
189 @$(MAKE) -C $(CONFIG) clean $(MAKE_TRACE)
190 rm -rf $(BUILD_DIR_PFX) $(BIN_DIR_PFX) $(TARGET_DIR_PFX) \
191 ${TOPDIR}/.cfg*
192 rm -rf $(TOOLCHAIN_BUILD_DIR_PFX) $(STAGING_PARENT_PFX) $(TOOLS_BUILD_DIR)
193 rm -f .tmpconfig.h ${TOPDIR}/package/*/info.mk
195 cleantarget:
196 @$(TRACE) cleantarget
197 @$(MAKE) -C $(CONFIG) clean $(MAKE_TRACE)
198 rm -rf $(BUILD_DIR) $(BIN_DIR) $(TARGET_DIR) ${TOPDIR}/.cfg
199 rm -rf $(TOOLCHAIN_BUILD_DIR) $(STAGING_PARENT)
200 rm -f .tmpconfig.h ${TOPDIR}/package/*/info.mk
202 distclean:
203 @$(TRACE) distclean
204 @$(MAKE) -C $(CONFIG) clean $(MAKE_TRACE)
205 rm -rf $(BUILD_DIR_PFX) $(BIN_DIR_PFX) $(TARGET_DIR_PFX) $(DISTDIR) \
206 ${TOPDIR}/.cfg* $(TOPDIR)/bulkdir
207 rm -rf $(TOOLCHAIN_BUILD_DIR_PFX) $(STAGING_PARENT_PFX) $(TOOLS_BUILD_DIR)
208 rm -f .config* .defconfig .tmpconfig.h all.config \
209 ${TOPDIR}/package/*/info.mk
211 else # ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)
213 include $(TOPDIR)/prereq.mk
215 all: menuconfig
216 @echo "Start the build with \"make\" or with \"make v\" to be verbose"
218 # configuration
219 # ---------------------------------------------------------------------------
221 # force entering the subdir, as dependency checking is done there
222 .PHONY: $(CONFIG)/conf $(CONFIG)/mconf
224 $(CONFIG)/conf:
225 @$(MAKE) -C $(CONFIG) conf
227 $(CONFIG)/mconf:
228 @$(MAKE) -C $(CONFIG)
230 defconfig: $(CONFIG)/conf
231 ifeq (${OStype},Linux)
232 @echo ADK_HOST_LINUX=y > $(TOPDIR)/.defconfig
233 endif
234 ifeq (${OStype},FreeBSD)
235 @echo ADK_HOST_FREEBSD=y > $(TOPDIR)/.defconfig
236 endif
237 ifeq (${OStype},MirBSD)
238 @echo ADK_HOST_MIRBSD=y > $(TOPDIR)/.defconfig
239 endif
240 ifeq (${OStype},OpenBSD)
241 @echo ADK_HOST_OPENBSD=y > $(TOPDIR)/.defconfig
242 endif
243 ifeq (${OStype},NetBSD)
244 @echo ADK_HOST_NETBSD=y > $(TOPDIR)/.defconfig
245 endif
246 @if [ ! -z "$(TARGET)" ];then \
247 grep "^config" target/Config.in \
248 |grep -i "$(TARGET)" \
249 |sed -e "s#^config \(.*\)#\1=y#" \
250 >> $(TOPDIR)/.defconfig; \
251 for symbol in ${DEFCONFIG}; do \
252 echo $$symbol >> $(TOPDIR)/.defconfig; \
253 done; \
255 ifneq (,$(filter qemu%,${TARGET}))
256 @echo ADK_LINUX_QEMU=y >> $(TOPDIR)/.defconfig
257 endif
258 ifneq (,$(filter rescue%,${TARGET}))
259 @echo ADK_LINUX_RESCUE=y >> $(TOPDIR)/.defconfig
260 endif
261 ifneq (,$(filter rb%,${TARGET}))
262 @echo ADK_LINUX_MIKROTIK=y >> $(TOPDIR)/.defconfig
263 endif
264 @if [ ! -z "$(TARGET)" ];then \
265 $(CONFIG)/conf -D .defconfig $(CONFIG_CONFIG_IN); \
268 modconfig:
269 ifeq (${OStype},Linux)
270 @echo ADK_HOST_LINUX=y > $(TOPDIR)/all.config
271 endif
272 ifeq (${OStype},FreeBSD)
273 @echo ADK_HOST_FREEBSD=y > $(TOPDIR)/all.config
274 endif
275 ifeq (${OStype},MirBSD)
276 @echo ADK_HOST_MIRBSD=y > $(TOPDIR)/all.config
277 endif
278 ifeq (${OStype},OpenBSD)
279 @echo ADK_HOST_OPENBSD=y > $(TOPDIR)/all.config
280 endif
281 ifeq (${OStype},NetBSD)
282 @echo ADK_HOST_NETBSD=y > $(TOPDIR)/all.config
283 endif
284 @if [ ! -z "$(TARGET)" ];then \
285 grep "^config" target/Config.in \
286 |grep -i "$(TARGET)" \
287 |sed -e "s#^config \(.*\)#\1=y#" \
288 >> $(TOPDIR)/all.config; \
289 for symbol in ${DEFCONFIG}; do \
290 echo $$symbol >> $(TOPDIR)/all.config; \
291 done; \
293 @if [ ! -z "$(FS)" ];then \
294 grep "^config" target/Config.in \
295 |grep -i "$(FS)" \
296 |sed -e "s#^config \(.*\)#\1=y#" \
297 >> $(TOPDIR)/all.config; \
299 @if [ ! -z "$(PKG)" ];then \
300 grep "^config" target/Config.in \
301 |grep -i "$(PKG)" \
302 |sed -e "s#^config \(.*\)#\1=y#" \
303 >> $(TOPDIR)/all.config; \
305 @if [ ! -z "$(LIBC)" ];then \
306 grep "^config" target/Config.in \
307 |grep -i "$(LIBC)" \
308 |sed -e "s#^config \(.*\)#\1=y#" \
309 >> $(TOPDIR)/all.config; \
311 ifneq (,$(filter %_qemu,${TARGET}))
312 @echo ADK_LINUX_QEMU=y >> $(TOPDIR)/all.config
313 endif
314 ifneq (,$(filter %_rescue,${TARGET}))
315 @echo ADK_LINUX_RESCUE=y >> $(TOPDIR)/all.config
316 endif
317 ifneq (,$(filter rb%,${TARGET}))
318 @echo ADK_LINUX_MIKROTIK=y >> $(TOPDIR)/all.config
319 endif
321 menuconfig: $(CONFIG)/mconf defconfig
322 @if [ ! -f .config ];then \
323 $(CONFIG)/conf -D .defconfig $(CONFIG_CONFIG_IN); \
325 @$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
326 ${POSTCONFIG}
328 _config: $(CONFIG)/conf
329 -@touch .config
330 @$(CONFIG)/conf ${W} $(CONFIG_CONFIG_IN) >/dev/null
331 ${POSTCONFIG}
333 .NOTPARALLEL: _mconfig
334 _mconfig: ${CONFIG}/conf _mconfig2 _config
335 _mconfig2: ${CONFIG}/conf modconfig
336 @${CONFIG}/conf -m ${RCONFIG} >/dev/null
338 distclean:
339 @$(MAKE) -C $(CONFIG) clean
340 @rm -rf $(BUILD_DIR) $(TOOLS_BUILD_DIR) $(BIN_DIR) $(DISTDIR) \
341 ${TOPDIR}/.cfg* $(TOPDIR)/bulkdir
342 @rm -rf $(TOOLCHAIN_BUILD_DIR) $(STAGING_PARENT) $(TARGET_DIR)
343 @rm -f .config* .defconfig all.config .tmpconfig.h \
344 ${TOPDIR}/package/*/info.mk
346 endif # ! ifeq ($(strip $(ADK_HAVE_DOT_CONFIG)),y)
348 # build all targets and combinations
349 bulk:
350 while read target libc fs p; do \
351 mkdir -p $(TOPDIR)/bulkdir/$$target-$$libc-$$fs; \
353 echo === building $$target $$libc $$fs on $$(date); \
354 $(MAKE) prereq && \
355 $(MAKE) TARGET=$$target LIBC=$$libc FS=$$fs PKG=ipkg \
356 defconfig && \
357 if [ "x$$p" = xy ];then \
358 $(MAKE) TARGET=$$target LIBC=$$libc FS=$$fs PKG=ipkg \
359 allmodconfig; \
360 fi && \
361 $(MAKE) VERBOSE=1 -f mk/build.mk allcopy \
362 d=$$target-$$libc-$$fs && \
363 $(MAKE) cleantarget; \
364 rm .*config; \
365 ) 2>&1 | tee $(TOPDIR)/bulkdir/$$target-$$libc-$$fs/log; \
366 done <${TOPDIR}/target/bulk.lst