2 # GLOBAL Makefile for the whole L4 tree
7 PRJ_SUBDIRS := pkg $(wildcard l4linux)
9 install-dirs := tool pkg
10 clean-dirs := tool pkg doc
11 cleanall-dirs := tool pkg doc
13 BUILD_TOOLS = gawk gcc g++ ld perl pkg-config
15 CMDS_WITHOUT_OBJDIR := help checkbuild checkbuild.% up update check_build_tools
16 CMDS_NO_PROJECT_MK := $(CMDS_WITHOUT_OBJDIR) \
17 listplatforms listentries
19 # our default target is all::
23 #choose bootstrap (JH modification)
25 BOOTSTRAP_PKG ?= bootstrap
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
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
53 INCLUDE_BOOT_CONFIG := optional
55 ifneq ($(filter $(CMDS_WITHOUT_OBJDIR),$(MAKECMDGOALS)),)
56 IGNORE_MAKECONF_INCLUDE=1
59 ifneq ($(B)$(BUILDDIR_TO_CREATE),)
60 IGNORE_MAKECONF_INCLUDE=1
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)
70 # $(L4DIR)/mk/Makeconf shouln't include Makeconf.local twice
71 MAKECONFLOCAL = /dev/null
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
81 ifeq ($(filter-out $(CMDS_NO_PROJECT_MK),$(MAKECMDGOALS)),)
82 include $(L4DIR)/mk/Makeconf
84 include $(L4DIR)/mk/project.mk
88 PKGDEPS_IGNORE_MISSING :=
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
100 ifneq ($(strip $(B)),)
101 BUILDDIR_TO_CREATE := $(B)
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."; \
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
116 all:: $(BUILD_DIRS) $(if $(S),,l4defs)
122 # The following targets do work without explicit subdirs
127 # some special cases for dependencies follow:
128 # L4Linux depends on the availability of the l4defs
130 l4linux/l4-build: l4defs
132 # hack for examples, they virtually depend on anything else
133 pkg/examples: $(filter-out pkg/examples,$(BUILD_SUBDIRS))
135 # some more dependencies
136 tool: $(DROPSCONF_CONFIG_MK)
137 $(BUILD_SUBDIRS): $(DROPSCONF_CONFIG_MK) tool
139 ifneq ($(CONFIG_BID_BUILD_DOC),)
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
150 $(VERBOSE)if [ -r $@/Makefile ]; then PWD=$(PWD)/$@ $(MAKE) -C $@; fi
153 $(VERBOSE)if [ -r doc/source/Makefile ]; then PWD=$(PWD)/doc/source $(MAKE) -C doc/source; fi
155 BID_POST_CONT_HOOK := $(MAKE) regen_l4defs
157 .PHONY: all clean cleanall install up update doc
158 .PHONY: $(BUILD_DIRS) doc check_build_tools cont cleanfast
161 $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg doc ext-pkg pc lib test l4defs.mk.inc l4defs.sh.inc) \
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
172 L4DEF_FILE_MK ?= $(OBJ_BASE)/l4defs.mk.inc
173 L4DEF_FILE_SH ?= $(OBJ_BASE)/l4defs.sh.inc
175 l4defs: $(L4DEF_FILE_MK) $(L4DEF_FILE_SH)
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) && \
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)
198 $(L4DEF_FILE_SH): $(L4DEF_FILE_MK)
201 +$(call generate_l4defs_files,static)
202 +$(call generate_l4defs_files,minimal)
203 +$(call generate_l4defs_files,shared)
204 +$(call generate_l4defs_files,sharedlib)
206 .PHONY: l4defs regen_l4defs
209 #####################
210 # config-rules follow
212 HOST_SYSTEM := $(shell uname | tr 'A-Z' 'a-z')
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
230 $(1)=$$((cat $(2); echo printit:; \
231 echo ' @echo $$($(3))') | \
232 $(MAKE) --no-print-directory -f - printit)
235 define create_kconfig
236 $(VERBOSE)echo "# vi:set ft=kconfig:" > $(1)
237 $(VERBOSE)echo "# This Kconfig is auto-generated." >> $(1)
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); \
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); \
252 if [ -z "$$dep" ]; then \
253 dep=" depends on BUILD_ARCH_$$a"; \
255 dep="$$dep || BUILD_ARCH_$$a"; \
258 echo "$$dep" >> $(1); \
261 elif [ "$$l" = "INSERT_PLATFORM_TYPES" ]; then \
262 echo "config PLATFORM_TYPE" >> $(1); \
263 echo " string" >> $(1); \
264 echo -e "$$pt" >> $(1); \
266 echo "$$l" >> $(1); \
271 KCONFIGS_ARCH := $(wildcard $(L4DIR)/mk/arch/Kconfig.*.inc)
273 $(KCONFIG_FILE): $(KCONFIG_FILE_SRC) Makefile $(wildcard $(L4DIR)/conf/platforms/*.conf $(L4DIR)/conf/platforms/*.conf) \
275 $(VERBOSE)$(L4DIR)/tool/bin/gen_kconfig $(KCONFIG_FILE_SRC) $(KCONFIG_FILE).im $(KCONFIGS_ARCH)
276 +$(call create_kconfig,$@,$(KCONFIG_FILE).im)
279 $(VERBOSE)if [ -n "$(GCCDIR)" -a ! -e $(GCCDIR)/include/stddef.h ]; then \
281 $(ECHO) "$(GCCDIR) seems wrong (stddef.h not found)."; \
282 $(ECHO) "Does it exist?"; \
286 $(VERBOSE)if [ -z "$(filter $(CC_WHITELIST-$(BID_COMPILER_TYPE)), \
287 $(GCCVERSION))" ]; then \
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))"; \
295 $(VERBOSE)if [ -n "$(filter $(CC_BLACKLIST-$(BUILD_ARCH)-gcc), \
296 $(GCCVERSION).$(GCCPATCHLEVEL))" ]; then \
298 $(ECHO) "GCC-$(GCCVERSION).$(GCCPATCHLEVEL) is blacklisted" \
299 "because it showed to produce wrong results."; \
300 $(ECHO) "Please upgrade to a more recent version."; \
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 \
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); \
349 mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL); \
351 $(VERBOSE)$(RM) $(CONFIG_MK_REAL).tmp $(CONFIG_MK_REAL).tmp2
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};
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)
373 $(VERBOSE)emulations=$$(LANG= $(firstword $(LD)) --help | \
374 grep -i "supported emulations:" | \
375 sed -e 's/.*supported emulations: //') ; \
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); \
386 if [ "$$found_it" != "1" ]; then \
387 echo "No known ld emulation found"; exit 1; \
391 $(VERBOSE)if [ ! -r tool/gendep/Makefile ]; then \
392 echo "=== l4/tool/gendep missing! ==="; \
395 $(VERBOSE)PWD=$(PWD)/tool/gendep $(MAKE) -C tool/gendep
399 for i in $(BUILD_TOOLS); do \
400 if ! command -v $$i >/dev/null 2>&1; then \
401 [ -n "$$mis" ] && mis="$$mis "; \
405 if [ -n "$$mis" ]; then \
406 echo -e "\033[1;31mProgram(s) \"$$mis\" not found, please install!\033[0m"; \
409 echo "All build tools checked ok."; \
412 define common_envvars
413 ARCH="$(ARCH)" PLATFORM_TYPE="$(PLATFORM_TYPE)"
417 SEARCHPATH="$(MODULE_SEARCH_PATH):$(BUILDDIR_SEARCHPATH)"
420 unset ml; ml=$(L4DIR_ABS)/conf/modules.list; \
421 [ -n "$(MODULES_LIST)" ] && ml=$(MODULES_LIST)
423 define entryselection
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; \
435 e=$$(cat $(OBJ_BASE)/.entry-selector.tmp); \
436 $(RM) $(OBJ_BASE)/.entry-selector.tmp; \
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."; \
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)"
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
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)
466 QEMU_ARCH_MAP_$(ARCH) ?= qemu-system-$(ARCH)
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))
474 FASTBOOT_BOOT_CMD ?= fastboot boot
476 check_and_adjust_ram_base:
477 $(VERBOSE)if [ -z "$(PLATFORM_RAM_BASE)" ]; then \
478 echo "Platform \"$(PLATFORM_TYPE)\" not known."; \
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)); \
487 $(VERBOSE)$(set_ml); \
488 L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector list $$ml
491 $(VERBOSE)$(entryselection); \
492 SHELLCODE="$(SHELLCODE)" $(common_envvars) $(tool_envvars) \
493 $(L4DIR)/tool/bin/shell-entry $$ml "$$e"
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))
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))
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))
507 fastboot fastboot_rawimage: rawimage
508 $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
509 $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.raw)
511 fastboot_uimage: uimage
512 $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
513 $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.uimage)
515 efiimage: check_and_adjust_ram_base
516 $(checkx86amd64build)
517 $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE= BOOTSTRAP_DO_UEFI=y)
519 ifneq ($(filter $(ARCH),x86 amd64),)
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"
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)
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'."; \
540 $(VERBOSE)VirtualBox \
541 --startvm $(VBOX_VM) \
542 --cdrom $(IMAGES_DIR)/.current.iso \
547 $(VERBOSE)$(entryselection); \
548 $(tool_envvars) $(common_envvars) \
549 $(L4DIR)/tool/bin/kexec-launch $$ml "$$e"
552 $(VERBOSE)if [ "$(ARCH)" != "x86" ]; then \
553 echo "This mode can only be used with architecture x86."; \
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)
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 \
575 && $(LN) -f $$ISONAME $(IMAGES_DIR)/.current.iso
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;
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."
616 $(VERBOSE)for p in $(wildcard $(L4DIR)/conf/platforms/*.conf \
617 $(L4DIR)/mk/platforms/*.conf); do \
618 $(call extract_var,a,$$p,PLATFORM_ARCH); \
620 [ "$$ar" = "$(BUILD_ARCH)" ] && arch_hit=1; \
622 if [ -n "$$arch_hit" ]; then \
623 $(call extract_var,n,$$p,PLATFORM_NAME); \
627 [ $${p#$(L4DIR)/conf/platforms/} != $$p -a \
628 -e $(L4DIR)/conf/platforms/$$pn.conf ] && priv=" [priv]"; \
629 printf "%20s -- %s\n" $$pn "$$n$$priv"; \
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
641 $(VERBOSE)$(call switch_ram_base_func,$(RAM_BASE))
644 @if [ -z "$(CHECK_BASE_DIR)" ]; then \
645 echo "Need to set CHECK_BASE_DIR variable"; \
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)
652 .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.kconfig
653 .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.config.all
656 checkbuild_prepare.%:
657 $(if $(CHECK_INCREMENTAL),,rm -rf $(CHECK_BASE_DIR)/$(patsubst checkbuild_prepare.%,config.%,$@))
659 $(CHECK_BASE_DIR)/config.%/.kconfig: mk/defconfig/config.% checkbuild_prepare.%
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, $*)
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."; \
674 $(if $(CHECK_REMOVE_OBJDIR),rm -rf $(<D))
676 checkbuild: $(if $(USE_CONFIGS),$(addprefix checkbuild.,$(USE_CONFIGS)),$(patsubst mk/defconfig/config.%, checkbuild.%, $(wildcard mk/defconfig/config.*)))
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)
688 @echo "CC: $(CC) -v:"
691 @echo "CXX: $(CXX) -v:"
694 @echo "HOST_CC: $(HOST_CC) -v:"
695 @$(HOST_CC) -v || true
697 @echo "HOST_CXX: $(HOST_CXX) -v:"
698 @$(HOST_CXX) -v || true
700 @echo -n "ld: $(LD) -v: "
706 @echo -n "python -V: "
709 @echo "svn --version: "
710 @svn --version || true
712 @echo "git --version: "
713 @git --version || true
716 @ls -la /bin/sh || true
718 @echo "uname -a: "; uname -a
721 @if [ -e "/etc/debian_version" ]; then \
722 if grep -qi ubuntu /etc/issue; then \
723 echo -n "Ubuntu: "; \
726 echo -n "Debian: "; \
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 \
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; \
752 echo "Unknown distribution"; \
754 @lsb_release -a || true
756 @echo "Running as PID"
759 @echo "Archive information:"
763 @git describe || true
765 @echo "CC = $(CC) $(CCXX_FLAGS)"
766 @echo "CXX = $(CXX) $(CCXX_FLAGS)"
767 @echo "HOST_CC = $(HOST_CC)"
768 @echo "HOST_CXX = $(HOST_CXX)"
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)"
778 ../kernel/fiasco/src/kern/ia32 \
779 ../kernel/fiasco/tool/preprocess/src/preprocess; do \
780 if [ -e $$i ]; then \
781 echo Path $$i found ; \
783 echo PATH $$i IS NOT AVAILABLE; \
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_______________________________:";\
797 echo "____________________________end___________"; \
799 echo "$$i not found"; \
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)
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."
822 prove -rv "$(OBJ_BASE)/test/t/$(ARCH)_$(CPU)/$(BUILD_ABI)"