]> rtime.felk.cvut.cz Git - l4.git/blob - l4/Makefile
fiasco: bootstrap: better to comment, not to force the undeclired param be 0.
[l4.git] / l4 / Makefile
1 #
2 # GLOBAL Makefile for the whole L4 tree
3 #
4
5 L4DIR           ?= .
6
7 PRJ_SUBDIRS   := pkg $(wildcard l4linux)
8 BUILD_DIRS    := tool
9 install-dirs  := tool pkg
10 clean-dirs    := tool pkg doc
11 cleanall-dirs := tool pkg doc
12
13 BUILD_TOOLS     = gawk gcc g++ ld perl pkg-config
14
15 CMDS_WITHOUT_OBJDIR := help checkbuild checkbuild.% up update check_build_tools
16 CMDS_NO_PROJECT_MK  := $(CMDS_WITHOUT_OBJDIR) \
17                        listplatforms listentries
18
19 # our default target is all::
20 all::
21
22 #####################
23 # config-tool
24
25 DROPSCONF               = y
26 DROPSCONF_DEFCONFIG     ?= $(L4DIR)/mk/defconfig/config.x86
27 KCONFIG_FILE            = $(OBJ_BASE)/Kconfig.generated
28 KCONFIG_FILE_SRC        = $(L4DIR)/mk/Kconfig
29 DROPSCONF_CONFIG        = $(OBJ_BASE)/.kconfig.auto
30 DROPSCONF_CONFIG_H      = $(OBJ_BASE)/include/l4/bid_config.h
31 DROPSCONF_CONFIG_MK     = $(OBJ_BASE)/.config.all
32 DROPSCONF_DONTINC_MK    = y
33 DROPSCONF_HELPFILE      = $(L4DIR)/mk/config.help
34
35 # separation in "dependent" (ie opts the build output depends on) and
36 # "independent" (ie opts the build output does not depend on) opts
37 CONFIG_MK_INDEPOPTS     = CONFIG_BID_GENERATE_MAPFILE \
38                           CONFIG_DEPEND_VERBOSE \
39                           CONFIG_VERBOSE_SWITCH \
40                           CONFIG_BID_COLORED_PHASES CONFIG_HAVE_LDSO \
41                           CONFIG_INT_CPP_NAME_SWITCH BID_LIBGENDEP_PATHS CONFIG_INT_CPP_.*_NAME \
42                           CONFIG_INT_CXX_.*_NAME CONFIG_VERBOSE CONFIG_BID_STRIP_PROGS \
43                           CONFIG_INT_LD_NAME_SWITCH CONFIG_INT_LD_.*_NAME
44 CONFIG_MK_PLATFORM_OPTS = CONFIG_PLATFORM_.*
45 CONFIG_MK_REAL          = $(OBJ_BASE)/.config
46 CONFIG_MK_INDEP         = $(OBJ_BASE)/.config.indep
47 CONFIG_MK_PLATFORM      = $(OBJ_BASE)/.config.platform
48
49 INCLUDE_BOOT_CONFIG    := optional
50
51 ifneq ($(filter $(CMDS_WITHOUT_OBJDIR),$(MAKECMDGOALS)),)
52 IGNORE_MAKECONF_INCLUDE=1
53 endif
54
55 ifneq ($(B)$(BUILDDIR_TO_CREATE),)
56 IGNORE_MAKECONF_INCLUDE=1
57 endif
58
59 ifeq ($(IGNORE_MAKECONF_INCLUDE),)
60 ifneq ($(filter help config oldconfig silentoldconfig,$(MAKECMDGOALS)),)
61 # tweek $(L4DIR)/mk/Makeconf to use the intermediate file
62 export BID_IGN_ROOT_CONF=y
63 BID_ROOT_CONF=$(DROPSCONF_CONFIG_MK)
64 endif
65
66 # $(L4DIR)/mk/Makeconf shouln't include Makeconf.local twice
67 MAKECONFLOCAL           = /dev/null
68
69
70 # Use project.mk if we use the default goal (MAKECMDGOALS is empty)
71 # or if any our goals are not CMDS_NO_PROJECT_MK goals.
72 # If all goals are CMDS_NO_PROJECT_MK use 'Makeconf', that saves us
73 # from running the time consuming project.mk find operations.
74 ifeq ($(MAKECMDGOALS),)
75   include $(L4DIR)/mk/project.mk
76 else
77   ifeq ($(filter-out $(CMDS_NO_PROJECT_MK),$(MAKECMDGOALS)),)
78     include $(L4DIR)/mk/Makeconf
79   else
80     include $(L4DIR)/mk/project.mk
81   endif
82 endif
83
84 PKGDEPS_IGNORE_MISSING :=
85 export DROPS_STDDIR
86
87 # after having absfilename, we can export BID_ROOT_CONF
88 ifneq ($(filter config oldconfig silentoldconfig gconfig nconfig xconfig, $(MAKECMDGOALS)),)
89 export BID_ROOT_CONF=$(call absfilename,$(OBJ_BASE))/.config.all
90 endif
91 endif
92
93 #####################
94 # rules follow
95
96 ifneq ($(strip $(B)),)
97 BUILDDIR_TO_CREATE := $(B)
98 endif
99 ifneq ($(strip $(BUILDDIR_TO_CREATE)),)
100 all:: check_build_tools
101         @echo "Creating build directory \"$(BUILDDIR_TO_CREATE)\"..."
102         @if [ -e "$(BUILDDIR_TO_CREATE)" ]; then        \
103                 echo "Already exists, aborting.";       \
104                 exit 1;                                 \
105         fi
106         @mkdir -p "$(BUILDDIR_TO_CREATE)"
107         @cp $(DROPSCONF_DEFCONFIG) $(BUILDDIR_TO_CREATE)/.kconfig
108         @$(MAKE) B= BUILDDIR_TO_CREATE= O=$(BUILDDIR_TO_CREATE) oldconfig
109         @echo "done."
110 else
111
112 all:: $(BUILD_DIRS) $(if $(S),,l4defs)
113
114 endif
115
116
117 #
118 # The following targets do work without explicit subdirs
119 # ('S=...') only.
120 #
121 ifeq ($(S),)
122
123 # some special cases for dependencies follow:
124 # L4Linux depends on the availability of the l4defs
125 l4linux: l4defs
126 l4linux/l4-build: l4defs
127
128 # hack for examples, they virtually depend on anything else
129 pkg/examples: $(filter-out pkg/examples,$(BUILD_SUBDIRS))
130
131 # some more dependencies
132 tool: $(DROPSCONF_CONFIG_MK)
133 $(BUILD_SUBDIRS):  $(DROPSCONF_CONFIG_MK) tool
134
135 ifneq ($(CONFIG_BID_BUILD_DOC),)
136 install-dirs += doc
137 all:: doc
138 endif
139
140 up update:
141         $(VERBOSE)svn up -N
142         $(VERBOSE)svn up mk tool/gendep tool/kconfig tool/elf-patcher doc/source conf tool/lib tool/vim tool/bin
143         $(VERBOSE)$(MAKE) -C pkg up
144
145 tool:
146         $(VERBOSE)if [ -r $@/Makefile ]; then PWD=$(PWD)/$@ $(MAKE) -C $@; fi
147
148 doc:
149         $(VERBOSE)if [ -r doc/source/Makefile ]; then PWD=$(PWD)/doc/source $(MAKE) -C doc/source; fi
150
151 BID_POST_CONT_HOOK := $(MAKE) regen_l4defs
152
153 .PHONY: all clean cleanall install up update doc
154 .PHONY: $(BUILD_DIRS) doc check_build_tools cont cleanfast
155
156 cleanfast:
157         $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg doc ext-pkg pc lib test l4defs.mk.inc l4defs.sh.inc) \
158                            $(IMAGES_DIR)
159
160 cleanall::
161         $(VERBOSE)rm -f *~
162
163 clean cleanall install::
164         $(VERBOSE)set -e; for i in $($@-dirs) ; do \
165           if [ -r $$i/Makefile -o -r $$i/GNUmakefile ] ; then \
166                 PWD=$(PWD)/$$i $(MAKE) -C $$i $@ ; fi ; done
167
168 L4DEF_FILE_MK ?= $(OBJ_BASE)/l4defs.mk.inc
169 L4DEF_FILE_SH ?= $(OBJ_BASE)/l4defs.sh.inc
170
171 l4defs: $(L4DEF_FILE_MK) $(L4DEF_FILE_SH)
172
173 generate_l4defs_files = \
174         $(VERBOSE)tmpdir=$(OBJ_BASE)/l4defs.gen.dir &&                 \
175         mkdir -p $$tmpdir &&                                           \
176         echo "L4DIR = $(L4DIR_ABS)"                      > $$tmpdir/Makefile && \
177         echo "OBJ_BASE = $(OBJ_BASE)"                   >> $$tmpdir/Makefile && \
178         echo "L4_BUILDDIR = $(OBJ_BASE)"                >> $$tmpdir/Makefile && \
179         echo "SRC_DIR = $$tmpdir"                       >> $$tmpdir/Makefile && \
180         echo "PKGDIR_ABS = $(L4DIR_ABS)/l4defs.gen.dir" >> $$tmpdir/Makefile && \
181         echo "BUILD_MESSAGE ="                          >> $$tmpdir/Makefile && \
182         cat $(L4DIR)/mk/export_defs.inc                 >> $$tmpdir/Makefile && \
183         PWD=$$tmpdir $(MAKE) -C $$tmpdir -f $$tmpdir/Makefile          \
184           CALLED_FOR=$(1) L4DEF_FILE_MK=$(L4DEF_FILE_MK) L4DEF_FILE_SH=$(L4DEF_FILE_SH) && \
185         $(RM) -r $$tmpdir
186
187 $(L4DEF_FILE_MK): $(OBJ_DIR)/.Package.deps pkg/l4re-core \
188                   $(DROPSCONF_CONFIG_MK) $(L4DIR)/mk/export_defs.inc
189         +$(call generate_l4defs_files,static)
190         +$(call generate_l4defs_files,minimal)
191         +$(call generate_l4defs_files,shared)
192         +$(call generate_l4defs_files,sharedlib)
193
194 $(L4DEF_FILE_SH): $(L4DEF_FILE_MK)
195
196 regen_l4defs:
197         +$(call generate_l4defs_files,static)
198         +$(call generate_l4defs_files,minimal)
199         +$(call generate_l4defs_files,shared)
200         +$(call generate_l4defs_files,sharedlib)
201
202 .PHONY: l4defs regen_l4defs
203 endif # empty $(S)
204
205 #####################
206 # config-rules follow
207
208 HOST_SYSTEM := $(shell uname | tr 'A-Z' 'a-z')
209 export HOST_SYSTEM
210
211 # it becomes a bit confusing now: 'make config' results in a config file, which
212 # must be postprocessed. This is done in config.inc. Then,
213 # we evaluate some variables that depend on the postprocessed config file.
214 # The variables are defined in mk/Makeconf, which sources Makeconf.bid.local.
215 # Hence, we have to 1) postprocess, 2) call make again to get the variables.
216 BID_DCOLON_TARGETS += DROPSCONF_CONFIG_MK_POST_HOOK
217 DROPSCONF_CONFIG_MK_POST_HOOK:: check_build_tools $(OBJ_DIR)/Makefile
218         # libgendep must be done before calling make with the local helper
219         $(VERBOSE)$(MAKE) libgendep
220         $(VERBOSE)$(MAKE) Makeconf.bid.local-helper || \
221                 (rm -f $(DROPSCONF_CONFIG_MK) $(CONFIG_MK_REAL) $(CONFIG_MK_INDEP); false)
222         $(VEROBSE)$(LN) -snf $(L4DIR_ABS) $(OBJ_BASE)/source
223         $(VERBOSE)$(MAKE) checkconf
224
225 define extract_var
226         $(1)=$$((cat $(2); echo printit:;                  \
227                  echo ' @echo $$($(3))') |                 \
228                 $(MAKE) --no-print-directory -f - printit)
229 endef
230
231 define create_kconfig
232         $(VERBOSE)echo "# vi:set ft=kconfig:" > $(1)
233         $(VERBOSE)echo "# This Kconfig is auto-generated." >> $(1)
234         $(VERBOSE)pt="";                                             \
235         while IFS="" read l; do                                      \
236           if [ "$$l" = "INSERT_PLATFORMS" ]; then                    \
237             for p in $(wildcard $(L4DIR)/conf/platforms/*.conf       \
238                                 $(L4DIR)/mk/platforms/*.conf); do    \
239               $(call extract_var,n,$$p,PLATFORM_NAME);               \
240               pn=$${p##*/};                                          \
241               pn=$${pn%.conf};                                       \
242               echo "config PLATFORM_TYPE_$${pn}" >> $(1);            \
243               echo "  bool \"$$n\"" >> $(1);                         \
244               pt="$$pt  default \"$$pn\" if PLATFORM_TYPE_$${pn}\n"; \
245               $(call extract_var,n,$$p,PLATFORM_ARCH);               \
246               dep="";                                                \
247               for a in $$n; do                                       \
248                 if [ -z "$$dep" ]; then                              \
249                   dep="  depends on BUILD_ARCH_$$a";                 \
250                 else                                                 \
251                   dep="$$dep || BUILD_ARCH_$$a";                     \
252                 fi;                                                  \
253               done;                                                  \
254               echo "$$dep" >> $(1);                                  \
255               echo "" >> $(1);                                       \
256             done;                                                    \
257           elif [ "$$l" = "INSERT_PLATFORM_TYPES" ]; then             \
258             echo "config PLATFORM_TYPE" >> $(1);                     \
259             echo "  string" >> $(1);                                 \
260             echo -e "$$pt" >> $(1);                                  \
261           else                                                       \
262             echo "$$l" >> $(1);                                      \
263           fi;                                                        \
264         done < $(2)
265 endef
266
267 KCONFIGS_ARCH := $(wildcard $(L4DIR)/mk/arch/Kconfig.*.inc)
268
269 $(KCONFIG_FILE): $(KCONFIG_FILE_SRC) Makefile $(wildcard $(L4DIR)/conf/platforms/*.conf $(L4DIR)/conf/platforms/*.conf) \
270                  $(KCONFIGS_ARCH)
271         $(VERBOSE)$(L4DIR)/tool/bin/gen_kconfig $(KCONFIG_FILE_SRC) $(KCONFIG_FILE).im $(KCONFIGS_ARCH)
272         +$(call create_kconfig,$@,$(KCONFIG_FILE).im)
273
274 checkconf:
275         $(VERBOSE)if [ -n "$(GCCDIR)" -a ! -e $(GCCDIR)/include/stddef.h ]; then \
276           $(ECHO); \
277           $(ECHO) "$(GCCDIR) seems wrong (stddef.h not found)."; \
278           $(ECHO) "Does it exist?"; \
279           $(ECHO); \
280           exit 1; \
281         fi
282         $(VERBOSE)if [ -z "$(filter $(CC_WHITELIST-$(BID_COMPILER_TYPE)), \
283                                     $(GCCVERSION))" ]; then \
284           $(ECHO); \
285           $(ECHO) "$(BID_COMPILER_TYPE)-$(GCCVERSION) is not supported."; \
286           $(ECHO) "Please use a $(BID_COMPILER_TYPE) of the following" \
287                   "versions: $(CC_WHITELIST-$(BID_COMPILER_TYPE))"; \
288           $(ECHO); \
289           exit 1; \
290         fi
291         $(VERBOSE)if [ -n "$(filter $(CC_BLACKLIST-$(BUILD_ARCH)-gcc), \
292                                     $(GCCVERSION).$(GCCPATCHLEVEL))" ]; then \
293           $(ECHO); \
294           $(ECHO) "GCC-$(GCCVERSION).$(GCCPATCHLEVEL) is blacklisted" \
295                   "because it showed to produce wrong results."; \
296           $(ECHO) "Please upgrade to a more recent version."; \
297           $(ECHO); \
298           exit 1; \
299         fi
300
301
302 # caching of some variables. Others are determined directly.
303 # The contents of the variables to cache is already defined in mk/Makeconf.
304 .PHONY: Makeconf.bid.local-helper Makeconf.bid.local-internal-names \
305         libgendep checkconf
306 ARCH = $(BUILD_ARCH)
307 CC := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-gcc,$(CC)),$(CC))
308 LD := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-ld,$(LD)),$(LD))
309 Makeconf.bid.local-helper:
310         $(VERBOSE)echo BUILD_SYSTEMS="$(strip $(ARCH)_$(CPU)            \
311                        $(ARCH)_$(CPU)-$(BUILD_ABI))" >> $(DROPSCONF_CONFIG_MK)
312         $(VERBOSE)$(foreach v, BID_COMPILER_TYPE GCCDIR GCCLIB_HOST GCCLIB_EH GCCLIB_S_SO \
313                         GCCVERSION GCCMAJORVERSION GCCMINORVERSION      \
314                         GCCPATCHLEVEL GCC_HAS_ATOMICS                   \
315                         GCCNOSTACKPROTOPT GCCSTACKPROTOPT GCCSTACKPROTALLOPT LDVERSION \
316                         GCCSYSLIBDIRS GCCFORTRANAVAIL                                 \
317                         $(if $(GCCNOFPU_$(ARCH)_f),GCCNOFPU_$(ARCH))    \
318                         $(if $(GCCIS_$(ARCH)_leon_f),GCCIS_$(ARCH)_leon),   \
319                         echo $(v)=$(call $(v)_f,$(ARCH))                \
320                         >>$(DROPSCONF_CONFIG_MK);)
321         $(VERBOSE)$(foreach v, crtbegin.o crtbeginS.o crtbeginT.o \
322                                crtendS.o crtend.o, \
323                         echo GCCLIB_FILE_$(v)=$(call GCCLIB_file_f,$(v))   \
324                         >>$(DROPSCONF_CONFIG_MK);)
325         $(VERBOSE)$(foreach v, LD_GENDEP_PREFIX, echo $v=$($(v)) >>$(DROPSCONF_CONFIG_MK);)
326         $(VERBOSE)echo "HOST_SYSTEM=$(HOST_SYSTEM)" >>$(DROPSCONF_CONFIG_MK)
327         $(VERBOSE)echo "LD_HAS_HASH_STYLE_OPTION=$(shell if $(LD) --help 2>&1 | grep -q ' --hash-style='; then echo y; else echo n; fi)" >>$(DROPSCONF_CONFIG_MK)
328         $(VERBOSE)# we need to call make again, because HOST_SYSTEM (set above) must be
329         $(VERBOSE)# evaluated for LD_PRELOAD to be set, which we need in the following
330         $(VERBOSE)$(MAKE) Makeconf.bid.local-internal-names
331         $(VERBOSE)sort <$(DROPSCONF_CONFIG_MK) >$(CONFIG_MK_REAL).tmp
332         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_INDEP)
333         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_PLATFORM)
334         $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_INDEPOPTS) )    <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_INDEP)
335         $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_PLATFORM_OPTS)) <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_PLATFORM)
336         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_REAL).tmp2
337         $(VERBOSE)grep -v $(addprefix -e ^,$$ # $(CONFIG_MK_INDEPOPTS) $(CONFIG_MK_PLATFORM_OPTS)) \
338                 <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_REAL).tmp2
339         $(VERBOSE)echo -e 'include $(call absfilename,$(CONFIG_MK_INDEP))' >>$(CONFIG_MK_REAL).tmp2
340         $(VERBOSE)echo -e 'include $(call absfilename,$(CONFIG_MK_PLATFORM))' >>$(CONFIG_MK_REAL).tmp2
341         $(VERBOSE)if [ -e "$(CONFIG_MK_REAL)" ]; then                        \
342                     diff --brief -I ^COLOR_TERMINAL $(CONFIG_MK_REAL) $(CONFIG_MK_REAL).tmp2 || \
343                       mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL);           \
344                   else                                                       \
345                     mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL);             \
346                   fi
347         $(VERBOSE)$(RM) $(CONFIG_MK_REAL).tmp $(CONFIG_MK_REAL).tmp2
348
349 Makeconf.bid.local-internal-names:
350 ifneq ($(CONFIG_INT_CPP_NAME_SWITCH),)
351         $(VERBOSE) set -e; X="$(OBJ_BASE)/tmp.$$$$$$RANDOM.c" ; \
352                 echo 'int main(void){}'>$$X ; \
353                 rm -f $$X.out ; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \
354                 GENDEP_OUTPUT=$$X.out $(CC) $(CCXX_FLAGS) -c $$X -o $$X.o; \
355                 test -e $$X.out; echo INT_CPP_NAME=`cat $$X.out` \
356                         >>$(DROPSCONF_CONFIG_MK); \
357                 rm -f $$X $$X.{o,out};
358         $(VERBOSE)set -e; X="$(OBJ_BASE)/tmp.$$$$$$RANDOM.cc" ; \
359                 echo 'int main(void){}'>$$X; \
360                 rm -f $$X.out; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \
361                 GENDEP_OUTPUT=$$X.out $(CXX) -c $$X -o $$X.o; \
362                 test -e $$X.out; echo INT_CXX_NAME=`cat $$X.out` \
363                         >>$(DROPSCONF_CONFIG_MK); \
364                 rm -f $$X $$X.{o,out};
365 endif
366 ifneq ($(CONFIG_INT_LD_NAME_SWITCH),)
367         $(VERBOSE) set -e; echo INT_LD_NAME=$$($(LD) 2>&1 | perl -p -e 's,^(.+/)?(.+):.+,$$2,') >> $(DROPSCONF_CONFIG_MK)
368 endif
369         $(VERBOSE)emulations=$$(LANG= $(firstword $(LD)) --help |        \
370                                 grep -i "supported emulations:" |        \
371                                 sed -e 's/.*supported emulations: //') ; \
372         unset found_it;                                                  \
373         for e in $$emulations; do                                        \
374           for c in $(LD_EMULATION_CHOICE_$(ARCH)); do                    \
375             if [ "$$e" = "$$c" ]; then                                   \
376               echo LD_EMULATION=$$e >> $(DROPSCONF_CONFIG_MK);           \
377               found_it=1;                                                \
378               break;                                                     \
379             fi;                                                          \
380           done;                                                          \
381         done;                                                            \
382         if [ "$$found_it" != "1" ]; then                                 \
383           echo "No known ld emulation found"; exit 1;                    \
384         fi
385
386 libgendep:
387         $(VERBOSE)if [ ! -r tool/gendep/Makefile ]; then        \
388                     echo "=== l4/tool/gendep missing! ===";     \
389                     exit 1;                                     \
390                   fi
391         $(VERBOSE)PWD=$(PWD)/tool/gendep $(MAKE) -C tool/gendep
392
393 check_build_tools:
394         @unset mis;                                                \
395         for i in $(BUILD_TOOLS); do                                \
396           if ! command -v $$i >/dev/null 2>&1; then                \
397             [ -n "$$mis" ] && mis="$$mis ";                        \
398             mis="$$mis$$i";                                        \
399           fi                                                       \
400         done;                                                      \
401         if [ -n "$$mis" ]; then                                    \
402           echo -e "\033[1;31mProgram(s) \"$$mis\" not found, please install!\033[0m"; \
403           exit 1;                                                  \
404         else                                                       \
405           echo "All build tools checked ok.";                      \
406         fi
407
408 define common_envvars
409         ARCH="$(ARCH)" PLATFORM_TYPE="$(PLATFORM_TYPE)"
410 endef
411 define tool_envvars
412         L4DIR=$(L4DIR)                                           \
413         SEARCHPATH="$(MODULE_SEARCH_PATH):$(BUILDDIR_SEARCHPATH)"
414 endef
415 define set_ml
416         unset ml; ml=$(L4DIR_ABS)/conf/modules.list;             \
417            [ -n "$(MODULES_LIST)" ] && ml=$(MODULES_LIST)
418 endef
419 define entryselection
420         unset e;                                                 \
421            $(set_ml);                                            \
422            [ -n "$(ENTRY)"       ] && e="$(ENTRY)";              \
423            [ -n "$(E)"           ] && e="$(E)";                  \
424            if [ -z "$$e" ]; then                                 \
425              BACKTITLE="No entry given. Use 'make $@ E=entryname' to avoid menu." \
426                L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector menu $$ml 2> $(OBJ_BASE)/.entry-selector.tmp; \
427              if [ $$? != 0 ]; then                               \
428                cat $(OBJ_BASE)/.entry-selector.tmp;              \
429                exit 1;                                           \
430              fi;                                                 \
431              e=$$(cat $(OBJ_BASE)/.entry-selector.tmp);          \
432              $(RM) $(OBJ_BASE)/.entry-selector.tmp;              \
433            fi
434 endef
435 define checkx86amd64build
436         $(VERBOSE)if [ "$(ARCH)" != "x86" -a "$(ARCH)" != "amd64" ]; then      \
437           echo "This mode can only be used with architectures x86 and amd64."; \
438           exit 1;                                                              \
439         fi
440 endef
441 define genimage
442         +$(VERBOSE)$(entryselection);                                     \
443         $(MKDIR) $(IMAGES_DIR);                                           \
444         PWD=$(PWD)/pkg/bootstrap/server/src $(common_envvars)             \
445             $(MAKE) -C pkg/bootstrap/server/src ENTRY="$$e"               \
446                     BOOTSTRAP_MODULES_LIST=$$ml $(1)                      \
447                     BOOTSTRAP_MODULE_PATH_BINLIB="$(BUILDDIR_SEARCHPATH)" \
448                     BOOTSTRAP_SEARCH_PATH="$(MODULE_SEARCH_PATH)"
449 endef
450
451 define switch_ram_base_func
452         echo "  ... Regenerating RAM_BASE settings"; set -e; \
453         echo "# File semi-automatically generated by 'make switch_ram_base'" > $(OBJ_BASE)/Makeconf.ram_base; \
454         echo "RAM_BASE := $(1)"                                             >> $(OBJ_BASE)/Makeconf.ram_base; \
455         PWD=$(PWD)/l4re-core/pkg/sigma0/server/src $(MAKE) RAM_BASE=$(1) -C pkg/l4re-core/sigma0/server/src;                      \
456         PWD=$(PWD)/l4re-core/pkg/moe/server/src    $(MAKE) RAM_BASE=$(1) -C pkg/l4re-core/moe/server/src;                         \
457         echo "RAM_BASE_SWITCH_OK := yes"                                    >> $(OBJ_BASE)/Makeconf.ram_base
458 endef
459
460 BUILDDIR_SEARCHPATH = $(OBJ_BASE)/bin/$(ARCH)_$(CPU):$(OBJ_BASE)/bin/$(ARCH)_$(CPU)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(ARCH)_$(CPU):$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(BUILD_ABI)
461
462 QEMU_ARCH_MAP_$(ARCH) ?= qemu-system-$(ARCH)
463
464 QEMU_KERNEL_TYPE          ?= elfimage
465 QEMU_KERNEL_FILE-elfimage  = $(IMAGES_DIR)/bootstrap.elf
466 QEMU_KERNEL_FILE-uimage    = $(IMAGES_DIR)/bootstrap.uimage
467 QEMU_KERNEL_FILE-rawimage  = $(IMAGES_DIR)/bootstrap.raw
468 QEMU_KERNEL_FILE          ?= $(QEMU_KERNEL_FILE-$(QEMU_KERNEL_TYPE))
469
470 FASTBOOT_BOOT_CMD    ?= fastboot boot
471
472 check_and_adjust_ram_base:
473         $(VERBOSE)if [ -z "$(PLATFORM_RAM_BASE)" ]; then   \
474           echo "Platform \"$(PLATFORM_TYPE)\" not known."; \
475           exit 1;                                          \
476         fi
477         +$(VERBOSE)if [ $$(($(RAM_BASE))) != $$(($(PLATFORM_RAM_BASE))) -o -z "$(RAM_BASE)" -o -z "$(RAM_BASE_SWITCH_OK)" ]; then \
478           echo "=========== Updating RAM_BASE for platform $(PLATFORM_TYPE) to $(PLATFORM_RAM_BASE) =========" ; \
479           $(call switch_ram_base_func,$(PLATFORM_RAM_BASE)); \
480         fi
481
482 listentries:
483         $(VERBOSE)$(set_ml); \
484           L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector list $$ml
485
486 shellcodeentry:
487         $(VERBOSE)$(entryselection);                                      \
488          SHELLCODE="$(SHELLCODE)" $(common_envvars) $(tool_envvars)       \
489           $(L4DIR)/tool/bin/shell-entry $$ml "$$e"
490
491 elfimage: check_and_adjust_ram_base
492         $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=)
493         $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.elf))
494
495 uimage: check_and_adjust_ram_base
496         $(call genimage,BOOTSTRAP_DO_UIMAGE=y BOOTSTRAP_DO_RAW_IMAGE=)
497         $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.uimage))
498
499 rawimage: check_and_adjust_ram_base
500         $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=y)
501         $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.raw))
502
503 fastboot fastboot_rawimage: rawimage
504         $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
505           $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.raw)
506
507 fastboot_uimage: uimage
508         $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
509           $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.uimage)
510
511 efiimage: check_and_adjust_ram_base
512         $(checkx86amd64build)
513         $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE= BOOTSTRAP_DO_UEFI=y)
514
515 ifneq ($(filter $(ARCH),x86 amd64),)
516 qemu:
517         $(VERBOSE)$(entryselection);                                      \
518          qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH)));   \
519          QEMU=$$qemu QEMU_OPTIONS="$(QEMU_OPTIONS)"                       \
520           $(tool_envvars) $(common_envvars)                               \
521           $(L4DIR)/tool/bin/qemu-x86-launch $$ml "$$e"
522 else
523 qemu: $(QEMU_KERNEL_TYPE)
524         $(VERBOSE)qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH))); \
525         if [ -z "$$qemu" ]; then echo "Set QEMU_PATH!"; exit 1; fi;              \
526         echo QEMU-cmd: $$qemu -kernel $(QEMU_KERNEL_FILE) $(QEMU_OPTIONS);    \
527         $$qemu -kernel $(QEMU_KERNEL_FILE) $(QEMU_OPTIONS)
528 endif
529
530 vbox: $(if $(VBOX_ISOTARGET),$(VBOX_ISOTARGET),grub2iso)
531         $(checkx86amd64build)
532         $(VERBOSE)if [ -z "$(VBOX_VM)" ]; then                                 \
533           echo "Need to set name of configured VirtualBox VM im 'VBOX_VM'.";   \
534           exit 1;                                                              \
535         fi
536         $(VERBOSE)VirtualBox                    \
537             --startvm $(VBOX_VM)                \
538             --cdrom $(IMAGES_DIR)/.current.iso  \
539             --boot d                            \
540             $(VBOX_OPTIONS)
541
542 kexec:
543         $(VERBOSE)$(entryselection);                        \
544          $(tool_envvars) $(common_envvars)                  \
545           $(L4DIR)/tool/bin/kexec-launch $$ml "$$e"
546
547 ux:
548         $(VERBOSE)if [ "$(ARCH)" != "x86" ]; then                   \
549           echo "This mode can only be used with architecture x86."; \
550           exit 1;                                                   \
551         fi
552         $(VERBOSE)$(entryselection);                                 \
553         $(tool_envvars)  $(common_envvars)                           \
554           $(if $(UX_GFX),UX_GFX="$(UX_GFX)")                         \
555           $(if $(UX_GFX_CMD),UX_GFX_CMD="$(UX_GFX_CMD)")             \
556           $(if $(UX_NET),UX_NET="$(UX_NET)")                         \
557           $(if $(UX_NET_CMD),UX_NET_CMD="$(UX_NET_CMD)")             \
558           $(if $(UX_GDB_CMD),UX_GDB_CMD="$(UX_GDB_CMD)")             \
559           $(L4DIR)/tool/bin/ux-launch $$ml "$$e" $(UX_OPTIONS)
560
561 GRUB_TIMEOUT ?= 0
562
563 define geniso
564         $(checkx86amd64build)
565         $(VERBOSE)$(entryselection);                                         \
566          $(MKDIR) $(IMAGES_DIR);                                             \
567          ISONAME=$(IMAGES_DIR)/$$(echo $$e | tr '[ A-Z]' '[_a-z]').iso;      \
568          $(tool_envvars) $(common_envvars)                                   \
569           $(L4DIR)/tool/bin/gengrub$(1)iso --timeout=$(GRUB_TIMEOUT) $$ml    \
570              $$ISONAME "$$e"                                                 \
571           && $(LN) -f $$ISONAME $(IMAGES_DIR)/.current.iso
572 endef
573
574 grub1iso:
575         $(call geniso,1)
576
577 grub2iso:
578         $(call geniso,2)
579
580 exportpack:
581         $(if $(EXPORTPACKTARGETDIR),, \
582           @echo Need to specific target directory as EXPORTPACKTARGETDIR=dir; exit 1)
583         $(VERBOSE)$(entryselection);                                      \
584          TARGETDIR=$(EXPORTPACKTARGETDIR);                                \
585          qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH)));   \
586          QEMU=$$qemu L4DIR=$(L4DIR) QEMU_OPTIONS="$(QEMU_OPTIONS)"        \
587          $(tool_envvars) $(common_envvars)                                \
588           $(L4DIR)/tool/bin/genexportpack --timeout=$(GRUB_TIMEOUT)       \
589                                            $$ml $$TARGETDIR $$e;
590
591 help::
592         @echo
593         @echo "Image generation targets:"
594         @echo "  efiimage   - Generate an EFI image, containing all modules."
595         @echo "  elfimage   - Generate an ELF image, containing all modules."
596         @echo "  rawimage   - Generate a raw image (memory dump), containing all modules."
597         @echo "  uimage     - Generate a uimage for u-boot, containing all modules."
598         @echo "  grub1iso   - Generate an ISO using GRUB1 in images/<name>.iso [x86, amd64]" 
599         @echo "  grub2iso   - Generate an ISO using GRUB2 in images/<name>.iso [x86, amd64]" 
600         @echo "  qemu       - Use Qemu to run 'name'." 
601         @echo "  exportpack - Export binaries with launch support." 
602         @echo "  vbox       - Use VirtualBox to run 'name'." 
603         @echo "  fastboot   - Call fastboot with the created rawimage."
604         @echo "  fastboot_rawimage - Call fastboot with the created rawimage."
605         @echo "  fastboot_uimage   - Call fastboot with the created uimage."
606         @echo "  ux         - Run 'name' under Fiasco/UX. [x86]" 
607         @echo "  kexec      - Issue a kexec call to start the entry." 
608         @echo " Add 'E=name' to directly select the entry without using the menu."
609         @echo " Modules are defined in conf/modules.list."
610
611 listplatforms:
612         $(VERBOSE)for p in $(wildcard $(L4DIR)/conf/platforms/*.conf    \
613                                       $(L4DIR)/mk/platforms/*.conf); do \
614           $(call extract_var,a,$$p,PLATFORM_ARCH);                      \
615           for ar in $$a; do                                             \
616             [ "$$ar" = "$(BUILD_ARCH)" ] && arch_hit=1;                 \
617           done;                                                         \
618           if [ -n "$$arch_hit" ]; then                                  \
619             $(call extract_var,n,$$p,PLATFORM_NAME);                    \
620             pn=$${p##*/};                                               \
621             pn=$${pn%.conf};                                            \
622             priv="";                                                    \
623             [ $${p#$(L4DIR)/conf/platforms/} != $$p -a                  \
624               -e $(L4DIR)/conf/platforms/$$pn.conf ] && priv=" [priv]"; \
625             printf "%20s -- %s\n" $$pn "$$n$$priv";                     \
626           fi;                                                           \
627           unset arch_hit;                                               \
628         done | sort -b
629
630
631 .PHONY: elfimage rawimage uimage qemu vbox ux switch_ram_base \
632         grub1iso grub2iso listentries shellcodeentry exportpack \
633         fastboot fastboot_rawimage fastboot_uimage \
634         check_and_adjust_ram_base listplatforms
635
636 switch_ram_base:
637         $(VERBOSE)$(call switch_ram_base_func,$(RAM_BASE))
638
639 check_base_dir:
640         @if [ -z "$(CHECK_BASE_DIR)" ]; then                                  \
641           echo "Need to set CHECK_BASE_DIR variable";                         \
642           exit 1;                                                             \
643         fi
644
645 BID_CHECKBUILD_LOG_REDIR_f = $(if $(BID_CHECKBUILD_LOG), 1>>$(BID_CHECKBUILD_LOG).$(strip $(1)).log) \
646                              $(if $(BID_CHECKBUILD_LOG), 2>&1) #>$(BID_CHECKBUILD_LOG).$(strip $(1)).log)
647
648 .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.kconfig
649 .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.config.all
650 .PHONY: FORCE
651
652 checkbuild_prepare.%:
653         $(if $(CHECK_INCREMENTAL),,rm -rf $(CHECK_BASE_DIR)/$(patsubst checkbuild_prepare.%,config.%,$@))
654
655 $(CHECK_BASE_DIR)/config.%/.kconfig: mk/defconfig/config.% checkbuild_prepare.%
656         mkdir -p $(@D)
657         cp $< $@
658
659 $(CHECK_BASE_DIR)/config.%/.config.all: $(CHECK_BASE_DIR)/config.%/.kconfig FORCE
660         $(MAKE) -j 1 O=$(@D) oldconfig $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
661
662 checkbuild.%: $(CHECK_BASE_DIR)/config.%/.config.all $(CHECK_BASE_DIR)/config.%/.kconfig check_base_dir
663         $(MAKE) O=$(<D) BID_CHECKBUILD=1 report $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
664         $(MAKE) O=$(<D) BID_CHECKBUILD=1 tool $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
665         $(MAKE) O=$(<D) BID_CHECKBUILD=1 USE_CCACHE=$(strip $(USE_CCACHE)) $(CHECK_MAKE_ARGS) $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
666         $(VERBOSE)if [ -e $(<D)/ext-pkg ]; then \
667           echo "$(<D)/ext-pkg created. That must not happen in checkbuild."; \
668           exit 1; \
669         fi
670         $(if $(CHECK_REMOVE_OBJDIR),rm -rf $(<D))
671
672 checkbuild: $(if $(USE_CONFIGS),$(addprefix checkbuild.,$(USE_CONFIGS)),$(patsubst mk/defconfig/config.%, checkbuild.%, $(wildcard mk/defconfig/config.*)))
673
674
675 report:
676         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
677         @echo -e $(EMPHSTART)" Note, this report might disclose private information"$(EMPHSTOP)
678         @echo -e $(EMPHSTART)" Please review (and edit) before sending it to public lists"$(EMPHSTOP)
679         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
680         @echo
681         @echo "make -v:"
682         @make -v || true
683         @echo
684         @echo "CC: $(CC) -v:"
685         @$(CC) -v || true
686         @echo
687         @echo "CXX: $(CXX) -v:"
688         @$(CXX) -v || true
689         @echo
690         @echo "HOST_CC: $(HOST_CC) -v:"
691         @$(HOST_CC) -v || true
692         @echo
693         @echo "HOST_CXX: $(HOST_CXX) -v:"
694         @$(HOST_CXX) -v || true
695         @echo
696         @echo -n "ld: $(LD) -v: "
697         @$(LD) -v || true
698         @echo
699         @echo -n "perl -v:"
700         @perl -v || true
701         @echo
702         @echo -n "python -V: "
703         @python -V || true
704         @echo
705         @echo "svn --version: "
706         @svn --version || true
707         @echo
708         @echo "git --version: "
709         @git --version || true
710         @echo
711         @echo "Shell is:"
712         @ls -la /bin/sh || true
713         @echo
714         @echo "uname -a: "; uname -a
715         @echo
716         @echo "Distribution"
717         @if [ -e "/etc/debian_version" ]; then                 \
718           if grep -qi ubuntu /etc/issue; then                  \
719             echo -n "Ubuntu: ";                                \
720             cat /etc/issue;                                    \
721           else                                                 \
722             echo -n "Debian: ";                                \
723           fi;                                                  \
724           cat /etc/debian_version;                             \
725         elif [ -e /etc/gentoo-release ]; then                  \
726           echo -n "Gentoo: ";                                  \
727           cat /etc/gentoo-release;                             \
728         elif [ -e /etc/SuSE-release ]; then                    \
729           echo -n "SuSE: ";                                    \
730           cat /etc/SuSE-release;                               \
731         elif [ -e /etc/fedora-release ]; then                  \
732           echo -n "Fedora: ";                                  \
733           cat /etc/fedora-release;                             \
734         elif [ -e /etc/redhat-release ]; then                  \
735           echo -n "Redhat: ";                                  \
736           cat /etc/redhat-release;                             \
737           [ -e /etc/redhat_version ]                           \
738             && echo "  Version: `cat /etc/redhat_version`";    \
739         elif [ -e /etc/slackware-release ]; then               \
740           echo -n "Slackware: ";                               \
741           cat /etc/slackware-release;                          \
742           [ -e /etc/slackware-version ]                        \
743             && echo "  Version: `cat /etc/slackware-version`"; \
744         elif [ -e /etc/mandrake-release ]; then                \
745           echo -n "Mandrake: ";                                \
746           cat /etc/mandrake-release;                           \
747         else                                                   \
748           echo "Unknown distribution";                         \
749         fi
750         @lsb_release -a || true
751         @echo
752         @echo "Running as PID"
753         @id -u || true
754         @echo
755         @echo "Archive information:"
756         @echo "SVN:"
757         @svn info || true
758         @echo "Git:"
759         @git describe || true
760         @echo
761         @echo "CC       = $(CC) $(CCXX_FLAGS)"
762         @echo "CXX      = $(CXX) $(CCXX_FLAGS)"
763         @echo "HOST_CC  = $(HOST_CC)"
764         @echo "HOST_CXX = $(HOST_CXX)"
765         @echo "LD       = $(LD)"
766         @echo "Paths"
767         @echo "Current:   $$(pwd)"
768         @echo "L4DIR:     $(L4DIR)"
769         @echo "L4DIR_ABS: $(L4DIR_ABS)"
770         @echo "OBJ_BASE:  $(OBJ_BASE)"
771         @echo "OBJ_DIR:   $(OBJ_DIR)"
772         @echo
773         @for i in pkg \
774                   ../kernel/fiasco/src/kern/ia32 \
775                   ../kernel/fiasco/tool/preprocess/src/preprocess; do \
776           if [ -e $$i ]; then \
777             echo Path $$i found ; \
778           else                \
779             echo PATH $$i IS NOT AVAILABLE; \
780           fi \
781         done
782         @echo
783         @echo Configuration:
784         @for i in $(OBJ_DIR)/.config.all $(OBJ_DIR)/.kconfig   \
785                   $(OBJ_DIR)/Makeconf.local                    \
786                   $(L4DIR_ABS)/Makeconf.local                  \
787                   $(OBJ_DIR)/conf/Makeconf.boot                \
788                   $(L4DIR_ABS)/conf/Makeconf.boot; do          \
789           if [ -e "$$i" ]; then                                \
790             echo "______start_______________________________:";\
791             echo "$$i:";                                       \
792             cat $$i;                                           \
793             echo "____________________________end___________"; \
794           else                                                 \
795             echo "$$i not found";                              \
796           fi                                                   \
797         done
798         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
799         @echo -e $(EMPHSTART)" Note, this report might disclose private information"$(EMPHSTOP)
800         @echo -e $(EMPHSTART)" Please review (and edit) before sending it to public lists"$(EMPHSTOP)
801         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
802
803 help::
804         @echo
805         @echo "Miscellaneous targets:"
806         @echo "  switch_ram_base RAM_BASE=0xaddr"
807         @echo "                   - Switch physical RAM base of build to 'addr'." 
808         @echo "  update           - Update working copy by using SVN." 
809         @echo "  cont             - Continue building after fixing a build error." 
810         @echo "  clean            - Call 'clean' target recursively." 
811         @echo "  cleanfast        - Delete all directories created during build." 
812         @echo "  report           - Print out host configuration information." 
813         @echo "  help             - Print this help text." 
814         @echo "  test             - Execute unit tests."
815         @echo "  listplatforms    - List available platforms."
816
817 test::
818         prove -rv "$(OBJ_BASE)/test/t/$(ARCH)_$(CPU)/$(BUILD_ABI)"