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