# # GLOBAL Makefile for the whole L4 tree # L4DIR ?= . include $(L4DIR)/mk/util.mk PRJ_SUBDIRS := pkg tests $(wildcard l4linux) BUILD_DIRS := tool install-dirs := tool pkg clean-dirs := tool pkg tests doc sysroot cleanall-dirs := tool pkg tests doc sysroot BUILD_TOOLS = bash bison flex gawk perl tput \ $(foreach v,CC CXX LD HOST_CC HOST_CXX HOST_LD, \ $(firstword $(foreach x,$($(v)),\ $(if $(findstring =,$(x)),,$(x))))) BUILD_TOOLS_pkg/uvmm := dtc CMDS_WITHOUT_OBJDIR := help checkbuild checkbuild.% check_build_tools CMDS_PROJECT_MK := all clean cleanall install scrub cont doc help sysroot \ $(wildcard $(MAKECMDGOALS)) export BID_GLOBAL_MAKE := y # Hack, see project.mk BID_DCOLON_TARGETS := all clean cleanall mrproper install scrub DROPSCONF_CONFIG_MK_POST_HOOK olddefconfig oldconfig config # only use "BUILDDIR_TO_CREATE" from this point on ifneq ($(strip $(B)),) BUILDDIR_TO_CREATE := $(B) endif # only use "SUBDIRS_TO_BUILD" from this point on ifneq ($(strip $(S)),) SUBDIRS_TO_BUILD := $(S) endif # only use "CUSTOM_CONFIG_TEMPLATE" from this point on ifneq ($(strip $(T)),) CUSTOM_CONFIG_TEMPLATE := $(T) endif # This goes very early # TODO: should be done in mk/Makeconf to catch all make invocations (maybe # there's a better way?) ifneq ($(if $(BUILDDIR_TO_CREATE)$(BID_SANDBOX_IN_PROGRESS),,$(SANDBOX_ENABLE)),) .PHONY: $(MAKECMDGOALS) .PHONY: do-all-make-targets do-all-make-targets: $(VERBOSE)BID_SANDBOX_IN_PROGRESS=1 \ $(L4DIR)/tool/bin/sandbox \ --sys-dir "$(or $(SANDBOX_SYSDIR),/)" \ --dir-rw "$(OBJ_DIR)" \ --dir-ro "$(if $(L4DIR_ABS),$(L4DIR_ABS),$(CURDIR))" \ --cmd "$(MAKE) -C $(CURDIR) $(MAKECMDGOALS) O=$(OBJ_DIR)" BID_IGN_ROOT_CONF=y include $(L4DIR)/mk/Makeconf $(filter-out $(BID_DCOLON_TARGETS),$(MAKECMDGOALS)): do-all-make-targets $(filter $(BID_DCOLON_TARGETS),$(MAKECMDGOALS)):: do-all-make-targets else .PHONY: all all:: ##################### # config-tool DROPSCONF = y TEMPLDIR := mk/defconfig DFL_TEMPLATE := amd64 $(if $(filter-out undefined,$(origin DROPSCONF_DEFCONFIG)), \ $(info Please do not use DROPSCONF_DEFCONFIG anymore, use DEFCONFIG instead)) DROPSCONF_DEFCONFIG ?= $(TEMPLDIR)/config.$(DFL_TEMPLATE) DEFCONFIG ?= $(DROPSCONF_DEFCONFIG) KCONFIG_FILE = $(OBJ_BASE)/Kconfig.generated KCONFIG_FILE_DEPS = $(OBJ_BASE)/.Kconfig.generated.d KCONFIG_FILE_SRC = $(L4DIR)/mk/Kconfig DROPSCONF_CONFIG = $(OBJ_BASE)/include/config/auto.conf DROPSCONF_CONFIG_H = $(OBJ_BASE)/include/generated/autoconf.h DROPSCONF_CONFIG_MK = $(OBJ_BASE)/.config.all DROPSCONF_DONTINC_MK = y DROPSCONF_HELPFILE = $(L4DIR)/mk/config.help # separation in "dependent" (ie opts the build output depends on) and # "independent" (ie opts the build output does not depend on) opts CONFIG_MK_INDEPOPTS = BID_LIBGENDEP_PATHS CONFIG_BID_COLORED_PHASES \ CONFIG_BID_GENERATE_MAPFILE CONFIG_BID_STRIP_PROGS \ CONFIG_DEPEND_VERBOSE CONFIG_INT_CPP_.*_NAME \ CONFIG_INT_CPP_NAME_SWITCH CONFIG_INT_CXX_.*_NAME \ CONFIG_INT_LD_.*_NAME CONFIG_INT_LD_NAME_SWITCH \ CONFIG_VERBOSE CONFIG_VERBOSE_SWITCH CONFIG_MK_PLATFORM_OPTS = CONFIG_PLATFORM_.* CONFIG_MK_REAL = $(OBJ_BASE)/.config CONFIG_MK_INDEP = $(OBJ_BASE)/.config.indep CONFIG_MK_PLATFORM = $(OBJ_BASE)/.config.platform # Makeconf.boot will be included by the imagebuilder scripts, so don't include # it here. ifeq ($(filter efiimage elfimage rawimage uimage qemu, $(MAKECMDGOALS)),) INCLUDE_BOOT_CONFIG := optional endif # Do not require Makeconf if *all* targets work without a builddir. # The default target does not! ifeq ($(filter-out $(CMDS_WITHOUT_OBJDIR),$(MAKECMDGOALS)),) ifneq ($(MAKECMDGOALS),) IGNORE_MAKECONF_INCLUDE=1 endif endif ifneq ($(BUILDDIR_TO_CREATE),) IGNORE_MAKECONF_INCLUDE=1 endif ifeq ($(IGNORE_MAKECONF_INCLUDE),) _config_targets := config oldconfig olddefconfig silentoldconfig \ menuconfig nconfig gconfig xconfig \ allnoconfig allyesconfig randconfig defconfig ifneq ($(filter help $(_config_targets),$(MAKECMDGOALS)),) # tweek $(L4DIR)/mk/Makeconf to use the intermediate file export BID_IGN_ROOT_CONF=y BID_ROOT_CONF=$(DROPSCONF_CONFIG_MK) endif # $(L4DIR)/mk/Makeconf shouln't include Makeconf.local twice MAKECONFLOCAL = /dev/null # Use project.mk if we use the default goal (MAKECMDGOALS is empty) # or any of the goals listed in CMDS_PROJECT_MK, this saves us # from running the time consuming project.mk find operations. ROOT_MAKEFILE := 1 ifeq ($(MAKECMDGOALS),) include $(L4DIR)/mk/project.mk else ifneq ($(filter $(CMDS_PROJECT_MK),$(MAKECMDGOALS)),) include $(L4DIR)/mk/project.mk else include $(L4DIR)/mk/Makeconf endif endif PKGDEPS_IGNORE_MISSING := export DROPS_STDDIR # after having abspath, we can export BID_ROOT_CONF _CONFIG_TARGETS = config oldconfig olddefconfig silentoldconfig gconfig \ nconfig xconfig ifneq ($(filter $(_CONFIG_TARGETS), $(MAKECMDGOALS)),) export BID_ROOT_CONF=$(abspath $(OBJ_BASE))/.config.all endif endif ##################### # rules follow ifneq ($(strip $(BUILDDIR_TO_CREATE)),) # Use custom default configuration file if T is specified ifneq ($(CUSTOM_CONFIG_TEMPLATE),) DEFCONFIG_CANDIDATE=$(TEMPLDIR)/config.$(CUSTOM_CONFIG_TEMPLATE) ifneq ($(wildcard $(DEFCONFIG_CANDIDATE)),) DEFCONFIG=$(DEFCONFIG_CANDIDATE) else $(error ERROR: Default configuration file $(DEFCONFIG_CANDIDATE) (derived from T=$(CUSTOM_CONFIG_TEMPLATE)) not found) endif endif all:: @echo "Creating build directory \"$(BUILDDIR_TO_CREATE)\"..." @if [ -e $(BUILDDIR_TO_CREATE) ]; then \ echo "Already exists, aborting."; \ exit 1; \ fi @mkdir -p $(BUILDDIR_TO_CREATE) @cp $(DEFCONFIG) $(BUILDDIR_TO_CREATE)/.kconfig @echo CONFIG_PLATFORM_TYPE_$(PLATFORM_TYPE)=y \ >> $(BUILDDIR_TO_CREATE)/.kconfig ifneq ($(DEFCONFIG_OVERLAY),) @cat $(DEFCONFIG_OVERLAY) >> $(BUILDDIR_TO_CREATE)/.kconfig endif @$(MAKE) B= BUILDDIR_TO_CREATE= O=$(BUILDDIR_TO_CREATE) olddefconfig \ || ( $(RM) -r $(BUILDDIR_TO_CREATE) ; exit 1 ) @echo "done." else all:: $(BUILD_DIRS) $(if $(SUBDIRS_TO_BUILD),,l4defs regen_compile_commands_json) endif # # The following targets do work without explicit subdirs # ('S=...') only. # ifeq ($(SUBDIRS_TO_BUILD),) # some special cases for dependencies follow: # L4Linux depends on the availability of the l4defs l4linux: l4defs l4linux/l4-build: l4defs # some more dependencies tool: $(DROPSCONF_CONFIG_MK) $(BUILD_SUBDIRS): $(DROPSCONF_CONFIG_MK) tool ifneq ($(CONFIG_BID_BUILD_DOC),) install-dirs += doc all:: doc endif .PHONY: tool tool: $(VERBOSE)if [ -r $@/Makefile ]; then $(MAKE) -C $@; fi .PHONY: doc doc: $(VERBOSE)if [ -r doc/source/Makefile ]; then $(MAKE) -C doc/source; fi BID_POST_CONT_HOOK := $(MAKE) regen_l4defs .PHONY: cleanfast cleanfast: $(VERBOSE)if [ -f $(OBJ_BASE)/include/generated/autoconf.h ]; then \ cp -a $(OBJ_BASE)/include/generated/autoconf.h \ $(OBJ_BASE)/.tmp.bid_config.h; \ fi $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg tests \ doc ext-pkg pc lib test \ .Makeconf.phys_reloc sysroot ) \ $(L4DEFS_FILES) \ $(IMAGES_DIR) $(VERBOSE)if [ -f $(OBJ_BASE)/.tmp.bid_config.h ]; then \ mkdir -p $(OBJ_BASE)/include/generated; \ mv $(OBJ_BASE)/.tmp.bid_config.h \ $(OBJ_BASE)/include/generated/autoconf.h; \ fi .PHONY: cleanall cleanall:: $(VERBOSE)rm -f *~ .PHONY: clean-test-scripts clean-test-scripts: $(VERBOSE)$(RM) -r $(OBJ_BASE)/test/t .PHONY: clean cleanall install clean cleanall install:: $(VERBOSE)set -e; for i in $($@-dirs) ; do \ if [ -r $$i/Makefile -o -r $$i/GNUmakefile ]; then \ $(MAKE) -C $$i $@; fi; done l4defs_file = $(OBJ_BASE)/l4defs$(if $(filter std,$(1)),,-$(1)).$(2).inc L4DEFS_FILES = $(foreach v,std $(VARIANTS_AVAILABLE),$(call l4defs_file,$(v),mk) $(call l4defs_file,$(v),sh) $(call l4defs_file,$(v),pl)) .PHONY: l4defs l4defs: $(L4DEFS_FILES) generate_l4defs_files_step = \ tmpdir=$(OBJ_BASE)/l4defs.gen.dir && \ $(MKDIR) $$tmpdir && \ echo "L4DIR = $(L4DIR_ABS)" > $$tmpdir/Makefile && \ echo "OBJ_BASE = $(OBJ_BASE)" >> $$tmpdir/Makefile && \ echo "L4_BUILDDIR = $(OBJ_BASE)" >> $$tmpdir/Makefile && \ echo "SRC_DIR = $$tmpdir" >> $$tmpdir/Makefile && \ echo "PKGDIR_ABS = $(L4DIR_ABS)/l4defs.gen.dir" >> $$tmpdir/Makefile && \ echo "VARIANT = $(2)" >> $$tmpdir/Makefile && \ echo "BUILD_MESSAGE =" >> $$tmpdir/Makefile && \ cat $(L4DIR)/mk/export_defs.inc >> $$tmpdir/Makefile && \ $(MAKE) -C $$tmpdir -f $$tmpdir/Makefile \ CALLED_FOR=$(1) L4DEF_FILE_MK=$(call l4defs_file,$(2),mk) L4DEF_FILE_SH=$(call l4defs_file,$(2),sh) L4DEF_FILE_PL=$(call l4defs_file,$(2),pl) && \ $(RM) -r $$tmpdir generate_l4defs_files = \ $(call generate_l4defs_files_step,static,$(1)); \ $(call generate_l4defs_files_step,minimal,$(1)); \ $(call generate_l4defs_files_step,shared,$(1)); \ $(call generate_l4defs_files_step,sharedlib,$(1)); \ $(call generate_l4defs_files_step,finalize,$(1)) $(firstword $(L4DEFS_FILES)): $(OBJ_DIR)/.Package.deps pkg/l4re-core \ $(DROPSCONF_CONFIG_MK) $(L4DIR)/mk/export_defs.inc +$(VERBOSE)$(foreach v,std $(VARIANTS_AVAILABLE),$(call generate_l4defs_files,$(v));) $(wordlist 2,$(words $(L4DEFS_FILES)),$(L4DEFS_FILES)): $(firstword $(L4DEFS_FILES)) .PHONY: regen_l4defs regen_l4defs: +$(VERBOSE)$(foreach v,std $(VARIANTS_AVAILABLE),$(call generate_l4defs_files,$(v));) COMPILE_COMMANDS_JSON = compile_commands.json .PHONY: $(COMPILE_COMMANDS_JSON) $(COMPILE_COMMANDS_JSON): $(GEN_MESSAGE) $(VERBOSE)$(L4DIR)/tool/bin/gen_ccj $(OBJ_DIR) $@ # Automatically regenerate compile_commands.json if the file is already # there and if we build the build-directory the compile_commands.json file # was originally created from. .PHONY: regen_compile_commands_json regen_compile_commands_json: $(VERBOSE)if [ -e "$(COMPILE_COMMANDS_JSON)" ]; then \ if grep -qF "$(OBJ_DIR)" $(COMPILE_COMMANDS_JSON); then \ $(call GEN_MESSAGE,$(COMPILE_COMMANDS_JSON)); \ $(L4DIR)/tool/bin/gen_ccj $(OBJ_DIR) $(COMPILE_COMMANDS_JSON); \ fi; \ fi # Build a typical sysroot for use with external tooling such as a # L4Re-specific cross-compiler SYSROOT_LIB_DIRS = $(addprefix libc/uclibc-ng/,libc libm librt) ldscripts ldso OUTPUT_FORMAT = $(CC) $(CFLAGS) -Wl,--verbose 2>&1 | $(SED) -n '/OUTPUT_FORMAT/,/)/p' SYSROOT_PACKAGES = $(addprefix pkg/l4re-core/,ldso libc_backends libc) .PHONY: sysroot sysroot: $(SYSROOT_PACKAGES) $(GEN_MESSAGE) $(VERBOSE)$(RM) -r $(OBJ_DIR)/sysroot $(VERBOSE)$(MKDIR) $(OBJ_DIR)/sysroot/usr/include/l4 $(VERBOSE)$(MKDIR) $(OBJ_DIR)/sysroot/usr/include/l4-arch/l4 $(VERBOSE)$(MKDIR) $(OBJ_DIR)/sysroot/usr/lib $(VERBOSE)$(CP) -Lr $(OBJ_DIR)/include/$(BUILD_ARCH)/l4/sys \ $(OBJ_DIR)/include/$(BUILD_ARCH)/l4/util \ $(OBJ_DIR)/sysroot/usr/include/l4-arch/l4 $(VERBOSE)$(CP) -Lr $(OBJ_DIR)/include/$(BUILD_ARCH)/l4f/l4 \ $(OBJ_DIR)/sysroot/usr/include/l4-arch/ $(VERBOSE)$(CP) -Lr $(OBJ_DIR)/include/l4/{crtn,cxx,l4re_vfs,libc_backends,re,sys,util,bid_config.h} \ $(OBJ_DIR)/sysroot/usr/include/l4/ $(VERBOSE)$(CP) -Lr $(OBJ_DIR)/include/uclibc-ng/* $(OBJ_DIR)/sysroot/usr/include/ $(VERBOSE)$(MAKE) S='$(addprefix pkg/l4re-core/,$(SYSROOT_LIB_DIRS))' LD_SCRIPTS='' install \ INSTALLDIR_LIB=$(OBJ_DIR)/sysroot/usr/lib INSTALLDIR_INC=$(OBJ_DIR)/sysroot/usr/include $(VERBOSE)$(MAKE) S=pkg/l4re-core/libc/uclibc-ng/libpthread/src TARGET=libpthread.a install \ INSTALLDIR_LIB=$(OBJ_DIR)/sysroot/usr/lib INSTALLDIR_INC=$(OBJ_DIR)/sysroot/usr/include $(VERBOSE)mv $(OBJ_DIR)/sysroot/usr/lib/libc_nonshared.p.a $(OBJ_DIR)/sysroot/usr/lib/libc_nonshared.a $(VERBOSE)$(RM) $(OBJ_DIR)/sysroot/usr/lib/libc.so $(VERBOSE)$(OUTPUT_FORMAT) > $(OBJ_DIR)/sysroot/usr/lib/libc.so $(VERBOSE)echo "GROUP ( libc.so.1 libc_nonshared.a AS_NEEDED ( libld-l4.so.1 ) )" >> $(OBJ_DIR)/sysroot/usr/lib/libc.so endif # empty $(S) ##################### # config-rules follow HOST_SYSTEM := $(shell uname | tr 'A-Z' 'a-z') export HOST_SYSTEM # 'make config' results in a config file, which must be postprocessed. This is # done in config.inc. Then, we evaluate some variables that depend on the # postprocessed config file. The variables are defined in mk/Makeconf, which # sources Makeconf.bid.local. Hence, we have to 1) postprocess, 2) call make # again to get the variables. BID_DCOLON_TARGETS += DROPSCONF_CONFIG_MK_POST_HOOK DROPSCONF_CONFIG_MK_POST_HOOK:: check_build_tools $(OBJ_DIR)/Makefile # libgendep must be done before calling make with the local helper $(VERBOSE)$(MAKE) libgendep $(VERBOSE)$(MAKE) Makeconf.bid.local-helper || \ (rm -f $(DROPSCONF_CONFIG_MK) $(CONFIG_MK_REAL) $(CONFIG_MK_INDEP); false) $(VERBOSE)$(LN) -snf $(L4DIR_ABS) $(OBJ_BASE)/source $(VERBOSE)$(MAKE) checkconf $(KCONFIG_FILE).defines: FORCE $(VERBOSE)echo "# Automatically generated. Don't edit" >$@.tmp $(VERBOSE)echo "BID_COMPILER_TYPE := $(call BID_COMPILER_TYPE_f)" >>$@.tmp $(VERBOSE)$(call move_if_changed,$@,$@.tmp) KCONFIGS_ARCH := $(wildcard $(L4DIR)/mk/arch/Kconfig.*.inc) KCONFIG_PLATFORMS := $(wildcard $(L4DIR)/mk/platforms/*.conf $(L4DIR)/conf/platforms/*.conf) # Cannot use $^ inside the $(KCONFIG_FILE).platforms recipe to refer to its # dependencies, as this would include obsolete dependencies stored in # $(KCONFIG_FILE_DEPS).platforms from the previous generation of it. KCONFIG_FILE_PLATFORMS_DEPS_CURRENT = $(KCONFIG_PLATFORMS) Makefile $(L4DIR)/tool/bin/gen_kconfig_includes KCONFIG_FILES = $(addprefix $(KCONFIG_FILE)%, \ platform_types platforms platforms.list) $(KCONFIG_FILES): $(KCONFIG_FILE_PLATFORMS_DEPS_CURRENT) $(file >$(KCONFIG_FILE_DEPS).platforms,$@: $(KCONFIG_FILE_PLATFORMS_DEPS_CURRENT)) $(foreach f,$(KCONFIG_FILE_PLATFORMS_DEPS_CURRENT),$(file >>$(KCONFIG_FILE_DEPS).platforms,$(f):)) $(VERBOSE)MAKE="$(MAKE)"; $(L4DIR)/tool/bin/gen_kconfig_includes $(KCONFIG_FILE) $(KCONFIG_PLATFORMS) # Kconfig.L4 files must be next to the Control file PKG_DIRS := $(call find_prj_dirs,$(SRC_DIR)) PKG_KCONFIG_L4_FILES := $(wildcard $(addsuffix /Kconfig.L4,$(PKG_DIRS))) # Cannot use $^ inside the $(KCONFIG_FILE) recipe to refer to its dependencies, # as this would include obsolete dependencies stored in $(KCONFIG_FILE_DEPS) # from the previous generation of it. KCONFIG_FILE_DEPS_CURRENT = $(KCONFIG_FILE_SRC) $(PKG_KCONFIG_L4_FILES) Makefile \ $(addsuffix /Control,$(PKG_DIRS)) \ $(KCONFIGS_ARCH) $(L4DIR)/tool/bin/gen_kconfig $(KCONFIG_FILE): $(KCONFIG_FILE_DEPS_CURRENT) \ | $(KCONFIG_FILE).platform_types $(KCONFIG_FILE).platforms \ $(KCONFIG_FILE).platforms.list $(KCONFIG_FILE).defines $(file >$(KCONFIG_FILE_DEPS),$(KCONFIG_FILE): $(KCONFIG_FILE_DEPS_CURRENT)) $(foreach f,$(KCONFIG_FILE_DEPS_CURRENT),$(file >>$(KCONFIG_FILE_DEPS),$(f):)) $(VERBOSE)$(L4DIR)/tool/bin/gen_kconfig \ --kconfig-src-file $(KCONFIG_FILE_SRC) \ --kconfig-obj-file $(KCONFIG_FILE) \ $(foreach f,$(KCONFIGS_ARCH),--kconfig-arch-file $(f)) \ $(foreach f,$(PKG_KCONFIG_L4_FILES),--kconfig-pkg-file $(f)) $(VERBOSE)$(L4DIR)/mk/pkgdeps -I -K $(OBJ_BASE)/Kconfig.generated.pkgs \ genkconfig $(SRC_DIR) $(PKG_DIRS) # Include dependencies from the previous generation of $(KCONFIG_FILE) and # $(KCONFIG_FILE).platforms to detect if one of these dependencies has been # removed, in which case the files need to be regenerated. -include $(KCONFIG_FILE_DEPS) $(KCONFIG_FILE_DEPS).platforms ifeq ($(filter y 1,$(DISABLE_CC_CHECK)),) override DISABLE_CC_CHECK := endif .PHONY: checkconf checkconf: $(VERBOSE)if [ -n "$(GCCDIR)" -a ! -e $(GCCDIR)/include/stddef.h ]; then \ $(ECHO); \ $(ECHO) "$(GCCDIR) seems wrong (stddef.h not found)."; \ $(ECHO) "Does it exist?"; \ $(ECHO); \ $(if $(DISABLE_CC_CHECK),,exit 1;) \ fi $(VERBOSE)if [ -z "$(filter $(CC_WHITELIST-$(BID_COMPILER_TYPE)), \ $(GCCVERSION))" ]; then \ $(ECHO); \ $(ECHO) "$(BID_COMPILER_TYPE)-$(GCCVERSION) is not supported."; \ $(ECHO) "Please use a $(BID_COMPILER_TYPE) of the following" \ "versions: $(CC_WHITELIST-$(BID_COMPILER_TYPE))"; \ $(ECHO); \ $(if $(DISABLE_CC_CHECK),,exit 1;) \ fi $(VERBOSE)if [ -n "$(filter $(CC_BLACKLIST-$(BUILD_ARCH)-gcc), \ $(GCCVERSION).$(GCCPATCHLEVEL))" ]; then \ $(ECHO); \ $(ECHO) "GCC-$(GCCVERSION).$(GCCPATCHLEVEL) is blacklisted" \ "because it showed to produce wrong results."; \ $(ECHO) "Please upgrade to a more recent version."; \ $(ECHO); \ $(if $(DISABLE_CC_CHECK),,exit 1;) \ fi ifeq ($(CONFIG_COMPILER_RT_USE_TOOLCHAIN_LIBGCC),y) $(VERBOSE)if ! $(OBJDUMP) -f $$(grep GCCLIB_HOST= $(DROPSCONF_CONFIG_MK) | cut -d= -f2) | grep -q $(OFORMAT); then \ $(ECHO); \ $(ECHO) "Missing the cross-compiler's libgcc variant for the target ($(OFORMAT))."; \ $(ECHO) "Install it, or disable the \"Use libgcc from toolchain\" (BID_USE_TOOLCHAIN_LIBGCC) config option."; \ $(ECHO); \ exit 1; \ fi $(VERBOSE)if ! $(OBJDUMP) -f $$(grep GCCLIB_EH_HOST= $(DROPSCONF_CONFIG_MK) | cut -d= -f2) | grep -q $(OFORMAT); then \ $(ECHO); \ $(ECHO) "Missing the cross-compiler's libgcc_eh variant for the target ($(OFORMAT))."; \ $(ECHO) "Install it, or disable the \"Use libgcc from toolchain\" (BID_USE_TOOLCHAIN_LIBGCC) config option."; \ $(ECHO); \ exit 1; \ fi endif # caching of some variables. Others are determined directly. # The contents of the variables to cache is already defined in mk/Makeconf. CC := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-gcc,$(CC)),$(CC)) LD := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-ld,$(LD)),$(LD)) add_if_f = $(if $($(1)_f),$(1)) $(OBJ_BASE)/include/l4/bid_config.h: $(if $(wildcard $@),,$(file >$@,#include )) .PHONY: Makeconf.bid.local-helper Makeconf.bid.local-helper: $(OBJ_BASE)/include/l4/bid_config.h $(VERBOSE)echo BUILD_SYSTEMS="$(strip $(ARCH)_$(CPU)-plain \ $(ARCH)_$(CPU)-$(BUILD_ABI))" >> $(DROPSCONF_CONFIG_MK) $(VERBOSE)$(foreach v, BID_COMPILER_TYPE BID_LD_TYPE \ CONDITIONAL_WARNINGS_FULL CONDITIONAL_WARNINGS_MEDIUM \ DIAGNOSTICS_SARIF DIAGNOSTICS_JSON DIAGNOSTICS_COLOR \ GCCDIR GCCFORTRANAVAIL GCC_HAS_ATOMICS GCCINCFIXEDPATH \ GCCLIBCAVAIL GCCLIB_EH_HOST GCCLIB_HOST GCCMAJORVERSION \ GCCMINORVERSION GCCNOSTACKPROTOPT GCCPATCHLEVEL \ GCCPREFIXOPT GCCSTACKPROTALLOPT GCCSTACKPROTOPT \ GCCSYSLIBDIRS GCCVERSION GCCWNOC99DESIGNATOR \ GCCWNONOEXCEPTTYPE GCCWNOPSABI GCCWNOUNUSEDPRIVATEFIELD \ GCCWNOUNTERMINATEDSTRINGINITIALIZATION GNATVERSION \ HOST_GNATVERSION LDNOWARNRWX LDVERSION \ CLANGVISNEWDELETEHIDDEN \ $(call add_if_f,RISCV_ZICSR_ZIFENCEI_$(ARCH)) \ $(call add_if_f,GCCARMV5TEFPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV6FPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV6T2FPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV6ZKFPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV7AFPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV7RFPOPT_$(ARCH)) \ $(call add_if_f,GCCARMV7VEFPOPT_$(ARCH)) \ $(call add_if_f,GCCARM64OUTLINEATOMICSOPT_$(ARCH)) \ $(call add_if_f,GCCNOFPU_$(ARCH)) \ $(call add_if_f,GCCIS_$(ARCH)_leon), \ echo $(v)=$(call $(v)_f,$(ARCH)) \ >>$(DROPSCONF_CONFIG_MK);) $(VERBOSE)$(foreach v,CC CXX,\ echo CONFIGURED_$v=$(realpath $(shell which $(filter-out $(CCACHE),$($v)))) \ >>$(DROPSCONF_CONFIG_MK);) $(VERBOSE)$(foreach v, LD_GENDEP_PREFIX, echo $v=$($(v)) >>$(DROPSCONF_CONFIG_MK);) $(VERBOSE)echo "HOST_SYSTEM=$(HOST_SYSTEM)" >>$(DROPSCONF_CONFIG_MK) $(VERBOSE)# we need to call make again, because HOST_SYSTEM (set above) must be $(VERBOSE)# evaluated for LD_PRELOAD to be set, which we need in the following $(VERBOSE)$(MAKE) Makeconf.bid.local-internal-names $(VERBOSE)sort <$(DROPSCONF_CONFIG_MK) >$(CONFIG_MK_REAL).tmp $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_INDEP) $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_PLATFORM) $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_INDEPOPTS) ) <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_INDEP) $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_PLATFORM_OPTS)) <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_PLATFORM) $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_REAL).tmp2 $(VERBOSE)grep -v $(addprefix -e ^,$$ # $(CONFIG_MK_INDEPOPTS) $(CONFIG_MK_PLATFORM_OPTS)) \ <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_REAL).tmp2 $(VERBOSE)echo -e 'include $(abspath $(CONFIG_MK_INDEP))' >>$(CONFIG_MK_REAL).tmp2 $(VERBOSE)echo -e 'include $(abspath $(CONFIG_MK_PLATFORM))' >>$(CONFIG_MK_REAL).tmp2 $(VERBOSE)if [ -e "$(CONFIG_MK_REAL)" ]; then \ diff --brief -I ^COLOR_TERMINAL $(CONFIG_MK_REAL) $(CONFIG_MK_REAL).tmp2 || \ mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL); \ else \ mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL); \ fi $(VERBOSE)$(RM) $(CONFIG_MK_REAL).tmp $(CONFIG_MK_REAL).tmp2 # Scan the output of `ld --help` for `supported emulations:` and chose one of # the listed items in $(LD_EMULATION_CHOICE_$(ARCH)). define determine_emulation_gnu_ld = emulations=$$($(callld) --help \ | grep -i "supported emulations:" \ | sed -e 's/.*supported emulations: //'); \ for e in $$emulations; do \ for c in $(LD_EMULATION_CHOICE_$(ARCH)); do \ if [ "$$e" = "$$c" ]; then \ echo LD_EMULATION=$$e >> $(DROPSCONF_CONFIG_MK); \ exit 0; \ fi; \ done; \ done; \ echo "No known ld emulation found"; \ exit 1 endef # l.lld does not provide a list of supported emulations. # Just use the first item of $(LD_EMULATION_CHOICE_$(ARCH)). define determine_emulation_lld_ld = echo LD_EMULATION=$(firstword $(LD_EMULATION_CHOICE_$(ARCH))) \ >> $(DROPSCONF_CONFIG_MK) endef .PHONY: Makeconf.bid.local-internal-names Makeconf.bid.local-internal-names: ifneq ($(CONFIG_INT_CPP_NAME_SWITCH),) $(VERBOSE)set -e; X="$(OBJ_BASE)/tmp.$$$$$$RANDOM.c" ; \ echo 'int main(void){}'>$$X ; \ rm -f $$X.out; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \ GENDEP_OUTPUT=$$X.out $(CC) $(CARCHFLAGS) $(CCXX_FLAGS) -c $$X -o $$X.o; \ if [ ! -e $$X.out ]; then \ echo -e "\n\033[1;31mGendep did not generate output. Is the compiler ($(CC)) statically linked?\033[0m"; \ echo -e "Please use a dynamically linked compiler.\n"; exit 1; \ fi; echo INT_CPP_NAME=`cat $$X.out` >>$(DROPSCONF_CONFIG_MK); \ rm -f $$X $$X.{o,out}; $(VERBOSE)set -e; X="$(OBJ_BASE)/tmp.$$$$$$RANDOM.cc" ; \ echo 'int main(void){}'>$$X; \ rm -f $$X.out; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \ GENDEP_OUTPUT=$$X.out $(CXX) -c $$X -o $$X.o; \ test -e $$X.out; echo INT_CXX_NAME=`cat $$X.out` \ >>$(DROPSCONF_CONFIG_MK); \ rm -f $$X $$X.{o,out}; endif ifneq ($(CONFIG_INT_LD_NAME_SWITCH),) $(VERBOSE)set -e; echo INT_LD_NAME=$$($(callld) 2>&1 \ | perl -p -e 's,^(.+/)?([^:]+):.+,$$2,') >> $(DROPSCONF_CONFIG_MK) endif $(VERBOSE)$(if $(filter LLD,$(shell $(callld) --version)),\ $(determine_emulation_lld_ld),\ $(determine_emulation_gnu_ld)) .PHONY: libgendep libgendep: $(VERBOSE)if [ ! -r tool/gendep/Makefile ]; then \ echo "=== l4/tool/gendep missing! ==="; \ exit 1; \ fi $(VERBOSE)$(MAKE) -C tool/gendep DIRS_FOR_BUILD_TOOLS_CHECKS = $(patsubst BUILD_TOOLS_%,%, \ $(filter BUILD_TOOLS_%,$(.VARIABLES))) BUILD_TOOLS += $(foreach dir,$(DIRS_FOR_BUILD_TOOLS_CHECKS), \ $(if $(wildcard $(L4DIR)/$(dir)), \ $(BUILD_TOOLS_$(dir)))) .PHONY: check_build_tools check_build_tools: @unset mis; \ for i in $(sort $(BUILD_TOOLS)); do \ if ! command -v $$i >/dev/null 2>&1; then \ [ -n "$$mis" ] && mis="$$mis "; \ mis="$$mis$$i"; \ fi \ done; \ if [ -n "$$mis" ]; then \ echo -e "\033[1;31mProgram(s) \"$$mis\" not found, please install!\033[0m"; \ exit 1; \ else \ echo "All build tools checked ok."; \ fi define common_envvars ARCH="$(ARCH)" PLATFORM_TYPE="$(PLATFORM_TYPE)" BITS="$(BITS)" endef define tool_envvars L4DIR=$(L4DIR) \ SEARCHPATH="$(MODULE_SEARCH_PATH):$(BUILDDIR_SEARCHPATH)" endef define set_ml unset ml; ml=$(L4DIR_ABS)/conf/modules.list; \ if [ -n "$(MODULES_LIST)" ]; then \ ml=$(MODULES_LIST); \ for dir in $(OBJ_BASE)/assets/modlist; do \ if [ -f "$${dir}/$(MODULES_LIST)" ]; then \ ml="$${dir}/$(MODULES_LIST)"; break; \ fi \ done \ fi endef define entryselection unset e; \ $(set_ml); \ [ -n "$(ENTRY)" ] && e="$(ENTRY)"; \ [ -n "$(E)" ] && e="$(E)"; \ if [ -z "$$e" ]; then \ BACKTITLE="No entry given. Use \ 'make $@ E=entryname' to avoid menu." \ L4DIR=$(L4DIR) $(common_envvars) \ $(L4DIR)/tool/bin/entry-selector menu $$ml \ 2> $(OBJ_BASE)/.entry-selector.tmp; \ if [ $$? != 0 ]; then \ cat $(OBJ_BASE)/.entry-selector.tmp; \ exit 1; \ fi; \ e=$$(cat $(OBJ_BASE)/.entry-selector.tmp); \ $(RM) $(OBJ_BASE)/.entry-selector.tmp; \ fi endef define genimage +$(VERBOSE)$(entryselection); \ $(MKDIR) $(IMAGES_DIR); \ $(common_envvars) \ QEMU_BINARY_NAME=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH))) \ $(MAKE) -C pkg/bootstrap/server/src ENTRY="$$e" \ BOOTSTRAP_MODULES_LIST=$$ml $(1) \ BOOTSTRAP_MODULE_PATH_BINLIB="$(BUILDDIR_SEARCHPATH)" \ BOOTSTRAP_SEARCH_PATH="$(MODULE_SEARCH_PATH)" endef # Contains PHYS_RELOC_DIR_LIST -include $(OBJ_BASE)/.Makeconf.phys_reloc define switch_ram_base_func echo " ... Regenerating RAM_BASE settings"; set -e; \ echo "# File semi-automatically generated by 'make switch_ram_base'" > $(OBJ_BASE)/Makeconf.ram_base; \ echo "RAM_BASE := $(1)" >> $(OBJ_BASE)/Makeconf.ram_base; \ echo "RAM_BASE_SWITCH_PLATFORM_TYPE := $(PLATFORM_TYPE)" >> $(OBJ_BASE)/Makeconf.ram_base; \ $(foreach pkg,$(PHYS_RELOC_DIR_LIST), $(MAKE) -C "$(pkg)" E="" ENTRY="" PLATFORM_TYPE=$(PLATFORM_TYPE) RAM_BASE=$(1) || exit $$?; ) \ echo "RAM_BASE_SWITCH_OK := yes" >> $(OBJ_BASE)/Makeconf.ram_base endef IMAGE_SUFFIX_efiimage = efi IMAGE_SUFFIX_elfimage = elf IMAGE_SUFFIX_rawimage = raw IMAGE_SUFFIX = $(or $(IMAGE_SUFFIX_$1),$1) OMIT_PLATFORM_TYPE_INFIX-amd64 = y OMIT_PLATFORM_TYPE_INFIX-x86 = y PLATFORM_TYPE_INFIX = $(or $(TARGET_IMAGE_FILENAME_PLATFORM_TYPE_INFIX),\ $(if $(OMIT_PLATFORM_TYPE_INFIX-$(ARCH)),,$(PLATFORM_TYPE))) IMAGE_BASENAME ?= l4re BOOTSTRAP_OUTPUT_DIR ?= $(IMAGES_DIR) TARGET_IMAGE = $(BOOTSTRAP_OUTPUT_DIR)/$(IMAGE_BASENAME)$(if $2,_$2)$(if $3,_$3).$(call IMAGE_SUFFIX,$1) QEMU_KERNEL_TYPE ?= elfimage QEMU_KERNEL_FILE ?= $(or $(QEMU_KERNEL_FILE-$(QEMU_KERNEL_TYPE)) \ $(call TARGET_IMAGE,$(QEMU_KERNEL_TYPE))) FASTBOOT_BOOT_CMD ?= fastboot boot .PHONY: check_and_adjust_ram_base check_and_adjust_ram_base: $(VERBOSE)if [ -z "$(PLATFORM_RAM_BASE)" ]; then \ echo "ERROR: Platform \"$(PLATFORM_TYPE)\" not known."; \ echo "Available platforms:"; \ $(MAKE) listplatforms; \ exit 1; \ fi $(VERBOSE)if [ -z "$(filter $(ARCH),$(PLATFORM_ARCH))" ]; then \ echo "Platform \"$(PLATFORM_TYPE)\" not available for $(ARCH)."; \ exit 1; \ fi +$(VERBOSE)if [ -n "$(RAM_BASE_SWITCH_OK)" ] && [ "$(RAM_BASE_SWITCH_PLATFORM_TYPE)" != "$(PLATFORM_TYPE)" ] && [ $$(($(RAM_BASE))) != $$(($(PLATFORM_RAM_BASE))) ] \ || [ -z "$(RAM_BASE)" ] || [ -z "$(RAM_BASE_SWITCH_OK)" ]; then \ echo "=========== Updating RAM_BASE for platform $(PLATFORM_TYPE) to $(PLATFORM_RAM_BASE) =========" ; \ $(call switch_ram_base_func,$(PLATFORM_RAM_BASE)); \ fi .PHONY: listentries listentries: $(VERBOSE)$(set_ml); $(common_envvars) \ L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector list $$ml .PHONY: shellcodeentry shellcodeentry: $(VERBOSE)$(entryselection); \ SHELLCODE="$(SHELLCODE)" $(common_envvars) $(tool_envvars) \ $(L4DIR)/tool/bin/shell-entry $$ml "$$e" IMAGE_NR_FILE=$(OBJ_BASE)/.image_nr increment_image_nr = $(shell nr=$$(($$(cat $(IMAGE_NR_FILE) 2>/dev/null) + 1)); \ echo $${nr}; echo $${nr} >$(IMAGE_NR_FILE)) define link_unless_same $(if $(filter $(abspath $1),$(abspath $2)),true,ln -snf $(notdir $1) $2) endef EFI_IMAGE_STANDARD_NAME-amd64 := bootx64.efi EFI_IMAGE_STANDARD_NAME-x86 := bootia32.efi EFI_IMAGE_STANDARD_NAME-arm64 := bootaa64.efi define imagebuilder_goal .PHONY: $1 $1: $(if $(CHECK_FOR_ARCH_$1),$$(call check_for_arch,$(CHECK_FOR_ARCH_$1))) \ +$$(VERBOSE)$$(entryselection); \ $$(MKDIR) $$(IMAGES_DIR); \ L4IMAGE_EXTRA_OPTS="--set-attr l4i:sequence $$(call increment_image_nr)" \ MODULES_LIST=$$$$ml ENTRY=$$$$e E= POST_IMAGE_CMD= $$(common_envvars) $$(tool_envvars) \ $(if $(2),,TARGET_IMAGE=$(strip $(call TARGET_IMAGE,$1,$$$${e},$(PLATFORM_TYPE_INFIX)))) \ $$(L4DIR)/tool/imagebuilder/$1 && \ $(if $(2),true,$(call link_unless_same,$(call TARGET_IMAGE,$1,$$$${e},$(PLATFORM_TYPE_INFIX)),\ $(call TARGET_IMAGE,$1))) && \ $(if $(2),true,$(or $(call POST_IMAGE_CMD, $(call TARGET_IMAGE,$1)), true)) && \ $(if $(filter efiimage,$1), \ $(call link_unless_same,$(call TARGET_IMAGE,$1,$$$${e}),\ $(IMAGES_DIR)/$(EFI_IMAGE_STANDARD_NAME-$(ARCH))),:) endef # touches images dir CHECK_FOR_ARCH_efiimage = x86 amd64 arm64 $(foreach g,efiimage elfimage rawimage uimage,$(eval $(call imagebuilder_goal,$g))) # does not touch images dir CHECK_FOR_ARCH_fvp = arm arm64 $(foreach g,qemu fvp,$(eval $(call imagebuilder_goal,$g,y))) .PHONY: itb itb: check_and_adjust_ram_base $(call genimage,BOOTSTRAP_DO_ITB=y) $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.itb)) .PHONY: fastboot fastboot_rawimage fastboot fastboot_rawimage: rawimage $(VERBOSE)$(FASTBOOT_BOOT_CMD) \ $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.raw) .PHONY: fastboot_uimage fastboot_uimage: uimage $(VERBOSE)$(FASTBOOT_BOOT_CMD) \ $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.uimage) .PHONY: vbox vbox: $(if $(VBOX_ISOTARGET),$(VBOX_ISOTARGET),grub2iso) $(call check_for_arch,x86 amd64) $(VERBOSE)if [ -z "$(VBOX_VM)" ]; then \ echo "Need to set name of configured VirtualBox VM im 'VBOX_VM'."; \ exit 1; \ fi $(VERBOSE)VirtualBox \ --startvm $(VBOX_VM) \ --cdrom $(IMAGES_DIR)/.current.iso \ --boot d \ $(VBOX_OPTIONS) .PHONY: kexec kexec: $(VERBOSE)$(entryselection); \ $(tool_envvars) $(common_envvars) \ $(L4DIR)/tool/bin/kexec-launch $$ml "$$e" GRUB_TIMEOUT ?= 0 ISONAME_SUFFIX ?= .iso EFIISONAME_SUFFIX ?= .efi.iso define geniso $(call check_for_arch,x86 amd64) $(VERBOSE)$(entryselection); \ $(MKDIR) $(IMAGES_DIR); \ ISONAME=$(IMAGES_DIR)/$$(echo $$e | tr '[ A-Z]' '[_a-z]')$(ISONAME_SUFFIX); \ $(tool_envvars) $(common_envvars) \ $(L4DIR)/tool/bin/gengrub$(1)iso --timeout=$(GRUB_TIMEOUT) $$ml \ $$ISONAME "$$e" \ && $(LN) -f $$ISONAME $(IMAGES_DIR)/.current.iso endef .PHONY: grub1iso grub1iso: $(call geniso,1) .PHONY: grub2iso grub2iso: $(call geniso,2) .PHONY: grub2efiiso grub2efiiso: efiimage $(call check_for_arch,x86 amd64) $(VERBOSE)$(entryselection); \ ISONAME=$(IMAGES_DIR)/$$(echo $$e | tr '[ A-Z]' '[_a-z]')$(EFIISONAME_SUFFIX); \ EFINAME=$(IMAGES_DIR)/bootstrap_$$(echo $$e | tr '[ ]' '[_]').efi; \ $(tool_envvars) $(common_envvars) \ $(L4DIR)/tool/bin/gengrub2efiiso --timeout=$(GRUB_TIMEOUT) \ $$EFINAME $$ISONAME "$$e" \ && $(LN) -f $$ISONAME $(IMAGES_DIR)/.current.iso .PHONY: exportpack exportpack: $(if $(filter $(ARCH),x86 amd64),,$(QEMU_KERNEL_TYPE)) $(if $(EXPORTPACKTARGETDIR),, \ @echo Need to specific target directory as EXPORTPACKTARGETDIR=dir; exit 1) $(VERBOSE)$(entryselection); \ TARGETDIR=$(EXPORTPACKTARGETDIR); \ qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH))); \ QEMU=$$qemu L4DIR=$(L4DIR) QEMU_OPTIONS="$(QEMU_OPTIONS)" \ OUTPUT_DIR="$(BOOTSTRAP_OUTPUT_DIR)" \ IMAGE_FILE="$(QEMU_KERNEL_FILE)" \ $(tool_envvars) $(common_envvars) \ $(L4DIR)/tool/bin/genexportpack --timeout=$(GRUB_TIMEOUT) \ --grubpathprefix="$(GRUB_PATHPREFIX)" \ --grubentrytitle="$(GRUB_ENTRY_TITLE)" \ $$ml $$TARGETDIR $$e; .PHONY: help help:: @echo @echo "Image generation targets:" @echo " efiimage - Generate an EFI image, containing all modules." @echo " elfimage - Generate an ELF image, containing all modules." @echo " rawimage - Generate a raw image (memory dump), containing all modules." @echo " uimage - Generate a uimage for u-boot, containing all modules." @echo " itb - Generate a FIT image for u-boot, containing all modules." @echo " grub1iso - Generate an ISO using GRUB1 in images/.iso [x86, amd64]" @echo " grub2iso - Generate an ISO using GRUB2 in images/.iso [x86, amd64]" @echo " grub2efiiso - Generate an ISO for EFI using GRUB2 in images/.efi.iso [x86, amd64]" @echo " qemu - Use Qemu to run 'name'." @echo " fvp - Use Arm FVP to run 'name'. [arm, arm64]" @echo " exportpack - Export binaries with launch support." @echo " vbox - Use VirtualBox to run 'name'." @echo " fastboot - Call fastboot with the created rawimage." @echo " fastboot_rawimage - Call fastboot with the created rawimage." @echo " fastboot_uimage - Call fastboot with the created uimage." @echo " kexec - Issue a kexec call to start the entry." @echo " Add 'E=name' to directly select the entry without using the menu." @echo " Modules are defined in conf/modules.list." .PHONY: listplatforms listplatforms: $(KCONFIG_FILE).platforms.list $(VERBOSE)sed -nE "s/^\[$(BUILD_ARCH)\](.*)/\1/p" $(KCONFIG_FILE).platforms.list | sort -b .PHONY: listexternals listexternals: @printf "%s\n" $(file <$(OBJ_BASE)/.Package.deps.ext_pkgs) .PHONY: switch_ram_base switch_ram_base: $(VERBOSE)$(call switch_ram_base_func,$(RAM_BASE)) .PHONY: check_base_dir check_base_dir: @if [ -z "$(CHECK_BASE_DIR)" ]; then \ echo "Need to set CHECK_BASE_DIR variable"; \ exit 1; \ fi BID_CHECKBUILD_LOG_REDIR_f = $(if $(BID_CHECKBUILD_LOG), 1>>$(BID_CHECKBUILD_LOG).$(strip $(1)).log) \ $(if $(BID_CHECKBUILD_LOG), 2>&1) #>$(BID_CHECKBUILD_LOG).$(strip $(1)).log) .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.kconfig .PRECIOUS: $(CHECK_BASE_DIR)/config.%/.config.all .PHONY: FORCE checkbuild_prepare.%: $(if $(CHECK_INCREMENTAL),,rm -rf $(CHECK_BASE_DIR)/$(patsubst checkbuild_prepare.%,config.%,$@)) $(CHECK_BASE_DIR)/config.%/.kconfig: $(TEMPLDIR)/config.% checkbuild_prepare.% Makefile mkdir -p $(@D) cp $< $@ $(if $(CHECK_CI_BUILDCHECK),tool/kconfig/scripts/config --file $@ -d BID_DEBUG_INFO,:) $(CHECK_BASE_DIR)/config.%/.config.all: $(CHECK_BASE_DIR)/config.%/.kconfig FORCE rm -rf $(@D)/pc $(MAKE) O=$(@D) olddefconfig $(call BID_CHECKBUILD_LOG_REDIR_f, $*) checkbuild.%: $(CHECK_BASE_DIR)/config.%/.config.all $(CHECK_BASE_DIR)/config.%/.kconfig check_base_dir $(VERBOSE)touch $(&1) $(call ver_fun_var,LD) $(call ver_funs,perl) $(call ver_funs,python python2 python3,-V) $(call ver_funs,svn git doxygen,--version) @echo "Shell is:" @ls -la /bin/sh || true @echo @echo "uname -a: "; uname -a @echo @echo "Distribution" @if [ -e "/etc/debian_version" ]; then \ if grep -qi ubuntu /etc/issue; then \ echo -n "Ubuntu: "; \ cat /etc/issue; \ else \ echo -n "Debian: "; \ fi; \ cat /etc/debian_version; \ elif [ -e /etc/gentoo-release ]; then \ echo -n "Gentoo: "; \ cat /etc/gentoo-release; \ elif [ -e /etc/SuSE-release ]; then \ echo -n "SuSE: "; \ cat /etc/SuSE-release; \ elif [ -e /etc/fedora-release ]; then \ echo -n "Fedora: "; \ cat /etc/fedora-release; \ elif [ -e /etc/redhat-release ]; then \ echo -n "Redhat: "; \ cat /etc/redhat-release; \ if [ -e /etc/redhat_version ]; then \ echo " Version: `cat /etc/redhat_version`"; \ fi; \ elif [ -e /etc/slackware-release ]; then \ echo -n "Slackware: "; \ cat /etc/slackware-release; \ if [ -e /etc/slackware-version ]; then \ echo " Version: `cat /etc/slackware-version`"; \ fi; \ elif [ -e /etc/mandrake-release ]; then \ echo -n "Mandrake: "; \ cat /etc/mandrake-release; \ elif [ -e /etc/os-release ]; then \ cat /etc/os-release; \ elif [ -e /etc/lsb-release ]; then \ cat /etc/lsb-release; \ else \ echo "Unknown distribution"; \ fi @lsb_release -a || true @echo @echo "Running as PID / User" @id || true @echo @echo Locale info: @locale @echo @echo "Archive information:" @echo "SVN:" @svn info || true @echo "Git:" @git describe || true @echo @echo "CC = $(CC) $(CARCHFLAGS) $(CCXX_FLAGS)" @echo "CXX = $(CXX) $(CARCHFLAGS) $(CCXX_FLAGS)" @echo "HOST_CC = $(HOST_CC)" @echo "HOST_CXX = $(HOST_CXX)" @echo "LD = $(LD)" @echo "Paths" @echo "Current: $$(pwd)" @echo "L4DIR: $(L4DIR)" @echo "L4DIR_ABS: $(L4DIR_ABS)" @echo "OBJ_BASE: $(OBJ_BASE)" @echo "OBJ_DIR: $(OBJ_DIR)" @echo @echo "BUILDDIR_SEARCHPATH:" @sed -e 's/:/\n/g' -e 's/^/ - /mg' <<< "$(BUILDDIR_SEARCHPATH)" @echo @echo Configuration: @for i in $(OBJ_DIR)/.config.all $(OBJ_DIR)/.kconfig \ $(OBJ_DIR)/Makeconf.local \ $(L4DIR_ABS)/Makeconf.local \ $(OBJ_DIR)/conf/Makeconf.boot \ $(L4DIR_ABS)/conf/Makeconf.boot; do \ if [ -e "$$i" ]; then \ echo "______start_______________________________:";\ echo "$$i:"; \ cat $$i; \ echo "____________________________end___________"; \ else \ echo "$$i not found"; \ fi \ done @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP) @echo -e $(EMPHSTART)" Note, this report might disclose private information"$(EMPHSTOP) @echo -e $(EMPHSTART)" Please review (and edit) before making it public"$(EMPHSTOP) @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP) help:: @echo @echo "Miscellaneous targets:" @echo " switch_ram_base RAM_BASE=0xaddr" @echo " - Switch physical RAM base of build to 'addr'." @echo " cont - Continue building after fixing a build error." @echo " clean - Call 'clean' target recursively." @echo " cleanfast - Delete all directories created during build." @echo " mrproper - cleanfast + delete configuration." ifneq ($(BID_COLLECT_DIAGNOSTICS),) @echo " diag - show collected compiler diagnostics." @echo " (using format $(BID_COLLECT_DIAGNOSTICS))" endif @echo " doc - Generate documentation." @echo " The default behavior is building HTML with" @echo " graphics. To change the default behavior," @echo " set DOC_VARIANT to one of the following values:" @echo " * DOC_VARIANT=fast: Build HTML without graphics." @echo " * DOC_VARIANT=full: Build HTML and a PDF with graphics." @echo " The PDF is named doc/source/l4re/latex/refman.pdf." @echo " * DOC_VARIANT=release: Build everything like 'full'" @echo " excluding internal information." @echo " report - Print out host configuration information." @echo " help - Print this help text." @echo " test - Run user-land tests and optionally also kernel tests." @echo " In order to run kernel tests, TEST_KUNIT_DIR must be set to" @echo " the directory containing test binaries (usually 'utest' in" @echo " the kernel build directory)." @echo " Use make's -jX parameter to run tests in parallel." @echo " listplatforms - List available platforms." @echo " listexternals - List all registered external packages." MAKE_J = $(patsubst -j%,%,$(filter -j%,$(MAKEFLAGS))) TESTS := bid-tests/ $(if $(TEST_KUNIT_DIR),kunit-tests/) .PHONY: test test: $(VERBOSE)taparchive="$(TAPARCHIVE)"; \ if [ -n "$${taparchive%%/*}" ]; then \ echo "ERROR: TAPARCHIVE must be an absolute path."; \ exit 1; \ fi $(VERBOSE)if [ -z "$(TEST_KUNIT_DIR)" ]; then \ echo "INFO: TEST_KUNIT_DIR not provided. No kernel tests."; \ fi $(VERBOSE)test_tmp_dir=$$(mktemp -d); \ \ ln -fs "$(OBJ_BASE)/test/t/$(ARCH)_$(CPU)/$(BUILD_ABI)" \ "$${test_tmp_dir}/bid-tests"; \ \ $(if $(TEST_KUNIT_DIR),\ $(L4DIR)/tool/bin/gen_kunit_test --ddir=$${test_tmp_dir}/kunit-tests \ --sdir=$(TEST_KUNIT_DIR) --obj-base=$(OBJ_BASE);) \ \ (cd $${test_tmp_dir} && \ prove $(if $(TAPARCHIVE),-a $(TAPARCHIVE)) $(if $(VERBOSE),,-v) \ $(if $(MAKE_J),-j $(MAKE_J)) \ -m -r \ $(filter bid-tests/% kunit-tests/%,$(TESTS)) \ $(addprefix bid-tests/,$(filter-out bid-tests/% kunit-tests/%,$(TESTS))) \ ); \ rm -fr "$${test_tmp_dir}" endif