3 # GLOBAL Makefile for FIASCO
7 ALLBUILDDIR := build-all
8 RANDBUILDDIR := build-rand
9 TEMPLDIR := src/templates
10 MAKEFILETEMPL := $(TEMPLDIR)/Makefile.builddir.templ
12 INSTALLSUBDIRS := $(MANSUBDIRS)
13 CLEANSUBDIRS := $(MANSUBDIRS) $(wildcard $(DFLBUILDDIR))
14 CONFIG_FILE := $(TEMPLDIR)/globalconfig.out
15 TEST_TEMPLATES := $(patsubst $(CONFIG_FILE).%,%,$(wildcard $(CONFIG_FILE).*))
16 TEST_TEMPLATES := $(if $(TEMPLATE_FILTER),$(filter $(TEMPLATE_FILTER),$(TEST_TEMPLATES)),$(TEST_TEMPLATES))
17 DFL_TEMPLATE := ia32-1
19 buildmakefile = mkdir -p "$(1)"; \
20 perl -p -e '$$s = "$(CURDIR)/src"; s/\@SRCDIR\@/$$s/' \
21 < $(MAKEFILETEMPL) > $(1)/Makefile
23 ifneq ($(strip $(B)),)
26 ifneq ($(strip $(BUILDDIR)),)
28 @echo "Creating build directory \"$(BUILDDIR)\"..."
29 @if [ -e "$(BUILDDIR)" ]; then \
30 echo "Already exists, aborting."; \
33 @$(call buildmakefile,$(BUILDDIR))
37 ifneq ($(strip $(O)),)
39 @if [ ! -e "$(O)" ]; then \
40 echo "build directory does not exist: '$(O)'";\
43 @$(call buildmakefile,$(O))
47 @if [ ! -e "$(O)" ]; then \
48 echo "build directory does not exist: '$(O)'";\
51 @$(call buildmakefile,$(O))
55 ifneq ($(strip $(T)),)
58 test -f $(TEMPLDIR)/globalconfig.out.$(T); \
59 bdir=T-$(DFLBUILDDIR)-$(T); \
61 $(call buildmakefile,T-$(DFLBUILDDIR)-$(T)); \
62 cp $(TEMPLDIR)/globalconfig.out.$(T) $$bdir/globalconfig.out; \
63 $(MAKE) -C $$bdir olddefconfig; \
67 $(DFLBUILDDIR): fiasco.builddir.create
73 set -e; for i in $(CLEANSUBDIRS); do $(MAKE) -C $$i $@; done
76 $(RM) -r $(DFLBUILDDIR)
79 set -e; for i in $(MANSUBDIRS); do $(MAKE) -C $$i; done
81 fiasco.builddir.create:
82 [ -e $(DFLBUILDDIR)/Makefile ] || \
83 ($(call buildmakefile,$(DFLBUILDDIR)))
84 [ -f $(DFLBUILDDIR)/globalconfig.out ] || { \
85 cp $(TEMPLDIR)/globalconfig.out.$(DFL_TEMPLATE) \
86 $(DFLBUILDDIR)/globalconfig.out; \
87 $(MAKE) -C $(DFLBUILDDIR) olddefconfig; \
90 config $(filter config %config,$(MAKECMDGOALS)): fiasco.builddir.create
91 $(MAKE) -C $(DFLBUILDDIR) $@
93 fiasco: fiasco.builddir.create
94 $(MAKE) -C $(DFLBUILDDIR)
98 $(RM) -r $(ALLBUILDDIR); \
99 for X in $(TEST_TEMPLATES); do \
100 echo -e "\n= Building configuration: $$X\n\n"; \
101 $(call buildmakefile,$(ALLBUILDDIR)/$$X); \
102 cp $(TEMPLDIR)/globalconfig.out.$$X \
103 $(ALLBUILDDIR)/$$X/globalconfig.out; \
104 if $(MAKE) -C $(ALLBUILDDIR)/$$X; then \
105 [ -z "$(KEEP_BUILD_DIRS)" ] && \
106 $(RM) -r $(ALLBUILDDIR)/$$X; \
109 failed="$$failed $$X"; \
112 rmdir $(ALLBUILDDIR) >/dev/null 2>&1; \
113 [ "$$failed" ] && echo -e "\nFailed configurations:$$failed"; \
117 $(RM) -r $(ALLBUILDDIR)
118 $(MAKE) dobuildparallel SHELL=bash
120 .PHONY: dobuildparallel checkallp
122 dobuildparallel: $(addprefix $(ALLBUILDDIR)/,$(TEST_TEMPLATES))
124 echo "======================================================"; \
125 for d in $(TEST_TEMPLATES); do \
126 if [ -e $(ALLBUILDDIR)/$$d/build.failed ]; then \
127 error=1; failed="$$failed $$d"; \
130 for f in $$failed; do echo "====== Failed Build Log: $$f ======"; \
131 tail -60 $(ALLBUILDDIR)/$$f/build.log; \
133 rmdir $(ALLBUILDDIR) >/dev/null 2>&1; \
134 [ "$$failed" ] && echo -e "\nFailed configurations:$$failed"; \
137 $(addprefix $(ALLBUILDDIR)/,$(TEST_TEMPLATES)):
138 $(call buildmakefile,$@)
139 cp $(TEMPLDIR)/globalconfig.out.$(patsubst $(ALLBUILDDIR)/%,%,$@) \
141 INCLUDE_PPC32=y INCLUDE_SPARC=y \
142 $(MAKE) -C $@ olddefconfig 2>&1 | tee -a $@/build.log
143 INCLUDE_PPC32=y INCLUDE_SPARC=y \
144 $(MAKE) -C $@ 2>&1 | tee -a $@/build.log; \
145 if [ $${PIPESTATUS[0]} = 0 -o -e $@/buildcheck.ignore ]; \
146 then [ -z "$(KEEP_BUILD_DIRS)" ] && $(RM) -r $@; \
147 else echo $${PIPESTATUS[0]} > $@/build.failed; fi; true
151 @echo $(TEST_TEMPLATES)
153 RANDBUILDMAXTIME = $(shell $$((2 * 3600)))
155 RANDBUILDDIRS = $(foreach idx,$(shell seq $(RANDBUILDONERUN)),$(RANDBUILDDIR)/b-$(idx))
156 RANDBUILDAGAINDIRS = $(wildcard $(RANDBUILDDIR)/failed-*)
158 .PHONY: $(RANDBUILDAGAINDIRS)
161 $(RM) -r $(RANDBUILDDIR)
162 $(call buildmakefile,$(RANDBUILDDIR)/build-templ);
163 starttime=$$(date +%s); \
164 if [ -z "$$RANDBUILDTIME" ]; then d=0; else d=$$RANDBUILDTIME; fi; \
166 -o $$(date +%s) -lt $$(($$starttime + $$d)) ]; do \
167 $(MAKE) dobuildrandparallel SHELL=bash; \
168 if [ $$(ls $(RANDBUILDDIR) | grep -c failed-) \
169 -gt $$(($(RANDBUILDONERUN) / 2)) ]; \
172 echo "$$(ls $(RANDBUILDDIR) | grep -c failed-) directories" \
173 "failed to build."; \
174 echo "Build time: $$((($$(date +%s) - $$starttime) / 60)) minutes."
178 @$(MAKE) randcheck RANDBUILDTIME=$(RANDBUILDMAXTIME)
180 dobuildrandparallel: $(RANDBUILDDIRS)
182 define rand_build_a_dir
183 $(MAKE) -C $(1) 2>&1 | tee -a $(1)/build.log; \
184 if [ $${PIPESTATUS[0]} = 0 ]; then \
185 cp $(1)/globalconfig.out $(RANDBUILDDIR)/ok-$(2); \
187 elif [ -n "$(3)" ]; then \
188 [ -n "$$STOP_ON_ERROR" ] && exit 1; \
189 mv $(1) $(RANDBUILDDIR)/failed-$(2); \
194 cp -a $(RANDBUILDDIR)/build-templ $@
196 INCLUDE_PPC32=y INCLUDE_SPARC=y \
197 $(MAKE) -C $@ randconfig | tee -a $@/build.log; \
198 INCLUDE_PPC32=y INCLUDE_SPARC=y \
199 $(MAKE) -C $@ oldconfig | tee -a $@/build.log; \
200 do [ $${PIPESTATUS[0]} != 0 ]; done
201 +fn=$$(cat $@/globalconfig.out \
202 | grep -e "^CONFIG_" | sort | sha1sum \
204 if [ -e "ok-$$fn" -o -e "failed-$$fn" ]; then \
205 echo "Configuration $$fn already checked." \
208 $(call rand_build_a_dir,$@,$$fn,1)
210 $(RANDBUILDAGAINDIRS):
211 +$(call rand_build_a_dir,$@,$(patsubst $(RANDBUILDDIR)/failed-%,%,$@))
214 $(MAKE) STOP_ON_ERROR=1 randcheck
216 randcheckagain_bash: $(RANDBUILDAGAINDIRS)
219 $(MAKE) randcheckagain_bash SHELL=bash
220 @echo "Processed $(words $(RANDBUILDAGAINDIRS)) build directories."
221 @echo "$$(ls -d $(RANDBUILDDIR)/failed-* | wc -l) directories remain to fail."
224 $(MAKE) STOP_ON_ERROR=1 randcheckagain
227 @find $(RANDBUILDDIR) -name 'ok-*' | tool/configstat
228 @echo "Building: $$(ls $(RANDBUILDDIR) | grep -c b-) " \
229 "Ok: $$(ls $(RANDBUILDDIR) | grep -c ok-) " \
230 "Failed: $$(ls $(RANDBUILDDIR) | grep -c failed-)"
234 $(MAKE) --no-print-directory randcheckstat; \
239 @r=$(word 1,$(REMOTEOPTS)); h=$${r%:*}; p=$${r#*:}; \
240 ssh $$h mkdir -p $$p; \
241 rsync -aP --delete Makefile src tool $$r; \
242 ssh $$h "cd $$p && make $(wordlist 2,$(words $(REMOTEOPTS)),$(REMOTEOPTS))"; \
243 echo "Returned from $$r."
247 @echo "fiasco Builds the default configuration ($(DFL_TEMPLATE))"
248 @echo "T=template Build a certain configuration"
249 @echo "checkall Build all template configurations in one go"
250 @echo "list List templates"
252 @echo "config menuconfig xconfig oldconfig"
253 @echo " Configure kernel in \"$(DFLBUILDDIR)\""
254 @echo "$(DFLBUILDDIR) Build kernel in \"$(DFLBUILDDIR)\""
255 @echo "clean cleanall clean or cleanall in \"$(CLEANSUBDIRS)\""
256 @echo "purge cleanall, remove \"$(DFLBUILDDIR)\" and build helper"
258 @echo "Creating a custom kernel:"
260 @echo " Create a build directory with:"
261 @echo " make BUILDDIR=builddir"
262 @echo " Then build the kernel:"
267 @echo "Call \"make help\" in the build directory for more information on build targets."
269 @echo "Default target: $(DFLBUILDDIR)"
272 .PHONY: man install clean cleanall fiasco.builddir.create fiasco \
273 l4check checkall config oldconfig menuconfig nconfig xconfig \
274 randcheck randcheckstop randcheckagain_bash randcheckstat \
275 randcheckstatloop help