]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/Makefile
fiasco: bootstrap: Use standard address 0x2d0000 to load the image.
[l4.git] / l4 / Makefile
index f8ce99a73219fac4e3adc8dc53b82f19dff65bc5..f42ff3afecd9d06e9c16201c8dc20e17f8cd003c 100644 (file)
@@ -4,14 +4,17 @@
 
 L4DIR          ?= .
 
-BUILD_DIRS    = tool pkg
-install-dirs  = tool pkg
-clean-dirs    = tool pkg doc
-cleanall-dirs = tool pkg doc
+PRJ_SUBDIRS   := pkg $(wildcard l4linux)
+BUILD_DIRS    := tool
+install-dirs  := tool pkg
+clean-dirs    := tool pkg doc
+cleanall-dirs := tool pkg doc
 
 BUILD_TOOLS    = gawk gcc g++ ld perl pkg-config
 
-CMDS_WITHOUT_OBJDIR := help checkbuild up update check_build_tools
+CMDS_WITHOUT_OBJDIR := help checkbuild checkbuild.% up update check_build_tools
+CMDS_NO_PROJECT_MK  := $(CMDS_WITHOUT_OBJDIR) \
+                       listplatforms listentries
 
 # our default target is all::
 all::
@@ -54,7 +57,7 @@ IGNORE_MAKECONF_INCLUDE=1
 endif
 
 ifeq ($(IGNORE_MAKECONF_INCLUDE),)
-ifneq ($(filter help config oldconfig,$(MAKECMDGOALS)),)
+ifneq ($(filter help config oldconfig silentoldconfig,$(MAKECMDGOALS)),)
 # tweek $(L4DIR)/mk/Makeconf to use the intermediate file
 export BID_IGN_ROOT_CONF=y
 BID_ROOT_CONF=$(DROPSCONF_CONFIG_MK)
@@ -62,11 +65,27 @@ endif
 
 # $(L4DIR)/mk/Makeconf shouln't include Makeconf.local twice
 MAKECONFLOCAL          = /dev/null
-include $(L4DIR)/mk/Makeconf
+
+
+# Use project.mk if we use the default goal (MAKECMDGOALS is empty)
+# or if any our goals are not CMDS_NO_PROJECT_MK goals.
+# If all goals are CMDS_NO_PROJECT_MK use 'Makeconf', that saves us
+# from running the time consuming project.mk find operations.
+ifeq ($(MAKECMDGOALS),)
+  include $(L4DIR)/mk/project.mk
+else
+  ifeq ($(filter-out $(CMDS_NO_PROJECT_MK),$(MAKECMDGOALS)),)
+    include $(L4DIR)/mk/Makeconf
+  else
+    include $(L4DIR)/mk/project.mk
+  endif
+endif
+
+PKGDEPS_IGNORE_MISSING :=
 export DROPS_STDDIR
 
 # after having absfilename, we can export BID_ROOT_CONF
-ifneq ($(filter config oldconfig gconfig nconfig xconfig, $(MAKECMDGOALS)),)
+ifneq ($(filter config oldconfig silentoldconfig gconfig nconfig xconfig, $(MAKECMDGOALS)),)
 export BID_ROOT_CONF=$(call absfilename,$(OBJ_BASE))/.config.all
 endif
 endif
@@ -90,15 +109,28 @@ all:: check_build_tools
        @echo "done."
 else
 
-all:: l4defs
+all:: $(BUILD_DIRS) $(if $(S),,l4defs)
 
 endif
 
 
+#
+# The following targets do work without explicit subdirs
+# ('S=...') only.
+#
+ifeq ($(S),)
+
+# some special cases for dependencies follow:
+# L4Linux depends on the availability of the l4defs
+l4linux: l4defs
+l4linux/l4-build: l4defs
+
+# hack for examples, they virtually depend on anything else
+pkg/examples: $(filter-out pkg/examples,$(BUILD_SUBDIRS))
 
 # some more dependencies
 tool: $(DROPSCONF_CONFIG_MK)
-pkg:  $(DROPSCONF_CONFIG_MK) tool
+$(BUILD_SUBDIRS):  $(DROPSCONF_CONFIG_MK) tool
 
 ifneq ($(CONFIG_BID_BUILD_DOC),)
 install-dirs += doc
@@ -110,18 +142,21 @@ up update:
        $(VERBOSE)svn up mk tool/gendep tool/kconfig tool/elf-patcher doc/source conf tool/lib tool/vim tool/bin
        $(VERBOSE)$(MAKE) -C pkg up
 
-tool pkg:
+tool:
        $(VERBOSE)if [ -r $@/Makefile ]; then PWD=$(PWD)/$@ $(MAKE) -C $@; fi
 
 doc:
        $(VERBOSE)if [ -r doc/source/Makefile ]; then PWD=$(PWD)/doc/source $(MAKE) -C doc/source; fi
 
-cont:
-       $(VERBOSE)$(MAKE) -C pkg cont
+BID_POST_CONT_HOOK := $(MAKE) regen_l4defs
 
 .PHONY: all clean cleanall install up update doc
 .PHONY: $(BUILD_DIRS) doc check_build_tools cont cleanfast
 
+cleanfast:
+       $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg doc ext-pkg pc lib test l4defs.mk.inc l4defs.sh.inc) \
+                          $(IMAGES_DIR)
+
 cleanall::
        $(VERBOSE)rm -f *~
 
@@ -130,11 +165,6 @@ clean cleanall install::
          if [ -r $$i/Makefile -o -r $$i/GNUmakefile ] ; then \
                PWD=$(PWD)/$$i $(MAKE) -C $$i $@ ; fi ; done
 
-cleanfast:
-       $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg doc ext-pkg pc lib l4defs.mk.inc l4defs.sh.inc) \
-                          $(IMAGES_DIR)
-
-
 L4DEF_FILE_MK ?= $(OBJ_BASE)/l4defs.mk.inc
 L4DEF_FILE_SH ?= $(OBJ_BASE)/l4defs.sh.inc
 
@@ -148,13 +178,16 @@ generate_l4defs_files = \
        echo "L4_BUILDDIR = $(OBJ_BASE)"                >> $$tmpdir/Makefile && \
        echo "SRC_DIR = $$tmpdir"                       >> $$tmpdir/Makefile && \
        echo "PKGDIR_ABS = $(L4DIR_ABS)/l4defs.gen.dir" >> $$tmpdir/Makefile && \
+       echo "BUILD_MESSAGE ="                          >> $$tmpdir/Makefile && \
        cat $(L4DIR)/mk/export_defs.inc                 >> $$tmpdir/Makefile && \
        PWD=$$tmpdir $(MAKE) -C $$tmpdir -f $$tmpdir/Makefile          \
          CALLED_FOR=$(1) L4DEF_FILE_MK=$(L4DEF_FILE_MK) L4DEF_FILE_SH=$(L4DEF_FILE_SH) && \
        $(RM) -r $$tmpdir
 
-$(L4DEF_FILE_MK): $(BUILD_DIRS) $(DROPSCONF_CONFIG_MK) $(L4DIR)/mk/export_defs.inc
+$(L4DEF_FILE_MK): $(OBJ_DIR)/.Package.deps pkg/l4re-core \
+                  $(DROPSCONF_CONFIG_MK) $(L4DIR)/mk/export_defs.inc
        +$(call generate_l4defs_files,static)
+       +$(call generate_l4defs_files,minimal)
        +$(call generate_l4defs_files,shared)
        +$(call generate_l4defs_files,sharedlib)
 
@@ -162,10 +195,12 @@ $(L4DEF_FILE_SH): $(L4DEF_FILE_MK)
 
 regen_l4defs:
        +$(call generate_l4defs_files,static)
+       +$(call generate_l4defs_files,minimal)
        +$(call generate_l4defs_files,shared)
        +$(call generate_l4defs_files,sharedlib)
 
 .PHONY: l4defs regen_l4defs
+endif # empty $(S)
 
 #####################
 # config-rules follow
@@ -178,6 +213,7 @@ export HOST_SYSTEM
 # 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
@@ -228,17 +264,40 @@ define create_kconfig
        done < $(2)
 endef
 
-$(KCONFIG_FILE): $(KCONFIG_FILE_SRC) Makefile $(wildcard $(L4DIR)/conf/platforms/*.conf $(L4DIR)/conf/platforms/*.conf)
-       +$(call create_kconfig,$@,$(KCONFIG_FILE_SRC))
+KCONFIGS_ARCH := $(wildcard $(L4DIR)/mk/arch/Kconfig.*.inc)
+
+$(KCONFIG_FILE): $(KCONFIG_FILE_SRC) Makefile $(wildcard $(L4DIR)/conf/platforms/*.conf $(L4DIR)/conf/platforms/*.conf) \
+                 $(KCONFIGS_ARCH)
+       $(VERBOSE)$(L4DIR)/tool/bin/gen_kconfig $(KCONFIG_FILE_SRC) $(KCONFIG_FILE).im $(KCONFIGS_ARCH)
+       +$(call create_kconfig,$@,$(KCONFIG_FILE).im)
 
 checkconf:
-       $(VERBOSE)if [ ! -e $(GCCDIR)/include/stddef.h ]; then \
+       $(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); \
          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); \
+         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); \
+         exit 1; \
+       fi
+
 
 # caching of some variables. Others are determined directly.
 # The contents of the variables to cache is already defined in mk/Makeconf.
@@ -250,10 +309,11 @@ LD := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-ld,
 Makeconf.bid.local-helper:
        $(VERBOSE)echo BUILD_SYSTEMS="$(strip $(ARCH)_$(CPU)            \
                       $(ARCH)_$(CPU)-$(BUILD_ABI))" >> $(DROPSCONF_CONFIG_MK)
-       $(VERBOSE)$(foreach v, GCCDIR GCCLIB_HOST GCCLIB_EH GCCLIB_S_SO \
+       $(VERBOSE)$(foreach v, BID_COMPILER_TYPE GCCDIR GCCLIB_HOST GCCLIB_EH GCCLIB_S_SO \
                        GCCVERSION GCCMAJORVERSION GCCMINORVERSION      \
-                       GCCSUBVERSION GCC_HAS_ATOMICS                   \
-                       GCCNOSTACKPROTOPT LDVERSION GCCSYSLIBDIRS       \
+                       GCCPATCHLEVEL GCC_HAS_ATOMICS                   \
+                       GCCNOSTACKPROTOPT GCCSTACKPROTOPT GCCSTACKPROTALLOPT LDVERSION \
+                       GCCSYSLIBDIRS GCCFORTRANAVAIL                                 \
                        $(if $(GCCNOFPU_$(ARCH)_f),GCCNOFPU_$(ARCH))    \
                        $(if $(GCCIS_$(ARCH)_leon_f),GCCIS_$(ARCH)_leon),   \
                        echo $(v)=$(call $(v)_f,$(ARCH))                \
@@ -264,7 +324,6 @@ Makeconf.bid.local-helper:
                        >>$(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)echo "COLOR_TERMINAL=$(shell if [ $$(tput colors || echo -1) = '-1' ]; then echo n; else echo y; fi)" >>$(DROPSCONF_CONFIG_MK)
        $(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)
        $(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
@@ -289,13 +348,15 @@ Makeconf.bid.local-helper:
 
 Makeconf.bid.local-internal-names:
 ifneq ($(CONFIG_INT_CPP_NAME_SWITCH),)
-       $(VERBOSE) set -e; X="tmp.$$$$$$RANDOM.c" ; echo 'int main(void){}'>$$X ; \
+       $(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) $(CCXX_FLAGS) -c $$X -o $$X.o; \
                test -e $$X.out; echo INT_CPP_NAME=`cat $$X.out` \
                        >>$(DROPSCONF_CONFIG_MK); \
                rm -f $$X $$X.{o,out};
-       $(VERBOSE)set -e; X="tmp.$$$$$$RANDOM.cc" ; echo 'int main(void){}'>$$X; \
+       $(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` \
@@ -380,8 +441,8 @@ endef
 define genimage
        +$(VERBOSE)$(entryselection);                                     \
        $(MKDIR) $(IMAGES_DIR);                                           \
-       PWD=$(PWD)/pkg/bootstrap/server/src $(common_envvars)             \
-           $(MAKE) -C pkg/bootstrap/server/src ENTRY="$$e"               \
+       PWD=$(PWD)/pkg/bootstrap_custom/server/src $(common_envvars)             \
+           $(MAKE) -C pkg/bootstrap_custom/server/src ENTRY="$$e"               \
                    BOOTSTRAP_MODULES_LIST=$$ml $(1)                      \
                    BOOTSTRAP_MODULE_PATH_BINLIB="$(BUILDDIR_SEARCHPATH)" \
                    BOOTSTRAP_SEARCH_PATH="$(MODULE_SEARCH_PATH)"
@@ -389,18 +450,22 @@ endef
 
 define switch_ram_base_func
        echo "  ... Regenerating RAM_BASE settings"; set -e; \
-       PWD=$(PWD)/pkg/sigma0/server/src $(MAKE) RAM_BASE=$(1) -C pkg/sigma0/server/src;                      \
-       PWD=$(PWD)/pkg/moe/server/src    $(MAKE) RAM_BASE=$(1) -C pkg/moe/server/src;                         \
        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 := $(1)"                                             >> $(OBJ_BASE)/Makeconf.ram_base; \
+       PWD=$(PWD)/l4re-core/pkg/sigma0/server/src $(MAKE) RAM_BASE=$(1) -C pkg/l4re-core/sigma0/server/src;                      \
+       PWD=$(PWD)/l4re-core/pkg/moe/server/src    $(MAKE) RAM_BASE=$(1) -C pkg/l4re-core/moe/server/src;                         \
+       echo "RAM_BASE_SWITCH_OK := yes"                                    >> $(OBJ_BASE)/Makeconf.ram_base
 endef
 
 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)
 
-QEMU_ARCH_MAP_$(ARCH) = qemu-system-$(ARCH)
-QEMU_ARCH_MAP_x86     = $(strip $(shell if qemu-system-i386 -version > /dev/null; then echo qemu-system-i386; else echo qemu; fi))
-QEMU_ARCH_MAP_amd64   = qemu-system-x86_64
-QEMU_ARCH_MAP_ppc32   = qemu-system-ppc
+QEMU_ARCH_MAP_$(ARCH) ?= qemu-system-$(ARCH)
+
+QEMU_KERNEL_TYPE          ?= elfimage
+QEMU_KERNEL_FILE-elfimage  = $(IMAGES_DIR)/bootstrap.elf
+QEMU_KERNEL_FILE-uimage    = $(IMAGES_DIR)/bootstrap.uimage
+QEMU_KERNEL_FILE-rawimage  = $(IMAGES_DIR)/bootstrap.raw
+QEMU_KERNEL_FILE          ?= $(QEMU_KERNEL_FILE-$(QEMU_KERNEL_TYPE))
 
 FASTBOOT_BOOT_CMD    ?= fastboot boot
 
@@ -409,7 +474,7 @@ check_and_adjust_ram_base:
          echo "Platform \"$(PLATFORM_TYPE)\" not known."; \
          exit 1;                                          \
        fi
-       $(VERBOSE)if [ $$(($(RAM_BASE))) != $$(($(PLATFORM_RAM_BASE))) -o -z "$(RAM_BASE)" ]; then               \
+       +$(VERBOSE)if [ $$(($(RAM_BASE))) != $$(($(PLATFORM_RAM_BASE))) -o -z "$(RAM_BASE)" -o -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
@@ -425,15 +490,27 @@ shellcodeentry:
 
 elfimage: check_and_adjust_ram_base
        $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=)
+       $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.elf))
 
 uimage: check_and_adjust_ram_base
        $(call genimage,BOOTSTRAP_DO_UIMAGE=y BOOTSTRAP_DO_RAW_IMAGE=)
+       $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.uimage))
 
 rawimage: check_and_adjust_ram_base
        $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=y)
+       $(VERBOSE)$(if $(POST_IMAGE_CMD),$(call POST_IMAGE_CMD,$(IMAGES_DIR)/bootstrap.raw))
+
+fastboot fastboot_rawimage: rawimage
+       $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
+         $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.raw)
 
-fastboot: rawimage
-       $(VERBOSE)$(FASTBOOT_BOOT_CMD) $(IMAGES_DIR)/bootstrap.raw
+fastboot_uimage: uimage
+       $(VERBOSE)$(FASTBOOT_BOOT_CMD) \
+         $(if $(FASTBOOT_IMAGE),$(FASTBOOT_IMAGE),$(IMAGES_DIR)/bootstrap.uimage)
+
+efiimage: check_and_adjust_ram_base
+       $(checkx86amd64build)
+       $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE= BOOTSTRAP_DO_UEFI=y)
 
 ifneq ($(filter $(ARCH),x86 amd64),)
 qemu:
@@ -443,11 +520,11 @@ qemu:
          $(tool_envvars) $(common_envvars)                               \
          $(L4DIR)/tool/bin/qemu-x86-launch $$ml "$$e"
 else
-qemu: elfimage
+qemu: $(QEMU_KERNEL_TYPE)
        $(VERBOSE)qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH))); \
        if [ -z "$$qemu" ]; then echo "Set QEMU_PATH!"; exit 1; fi;              \
-       echo QEmu-cmd: $$qemu -kernel $(IMAGES_DIR)/bootstrap.elf $(QEMU_OPTIONS);    \
-       $$qemu -kernel $(IMAGES_DIR)/bootstrap.elf $(QEMU_OPTIONS)
+       echo QEMU-cmd: $$qemu -kernel $(QEMU_KERNEL_FILE) $(QEMU_OPTIONS);    \
+       $$qemu -kernel $(QEMU_KERNEL_FILE) $(QEMU_OPTIONS)
 endif
 
 vbox: $(if $(VBOX_ISOTARGET),$(VBOX_ISOTARGET),grub2iso)
@@ -506,7 +583,7 @@ exportpack:
        $(VERBOSE)$(entryselection);                                      \
         TARGETDIR=$(EXPORTPACKTARGETDIR);                                \
         qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH)));   \
-        QEMU=$$qemu L4DIR=$(L4DIR)                                       \
+        QEMU=$$qemu L4DIR=$(L4DIR) QEMU_OPTIONS="$(QEMU_OPTIONS)"        \
         $(tool_envvars) $(common_envvars)                                \
          $(L4DIR)/tool/bin/genexportpack --timeout=$(GRUB_TIMEOUT)       \
                                           $$ml $$TARGETDIR $$e;
@@ -514,6 +591,7 @@ exportpack:
 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."
@@ -523,35 +601,76 @@ help::
        @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 "  ux         - Run 'name' under Fiasco/UX. [x86]" 
        @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."
 
+listplatforms:
+       $(VERBOSE)for p in $(wildcard $(L4DIR)/conf/platforms/*.conf    \
+                                     $(L4DIR)/mk/platforms/*.conf); do \
+         $(call extract_var,a,$$p,PLATFORM_ARCH);                      \
+         for ar in $$a; do                                             \
+           [ "$$ar" = "$(BUILD_ARCH)" ] && arch_hit=1;                 \
+         done;                                                         \
+         if [ -n "$$arch_hit" ]; then                                  \
+           $(call extract_var,n,$$p,PLATFORM_NAME);                    \
+           pn=$${p##*/};                                               \
+           pn=$${pn%.conf};                                            \
+           priv="";                                                    \
+           [ $${p#$(L4DIR)/conf/platforms/} != $$p -a                  \
+             -e $(L4DIR)/conf/platforms/$$pn.conf ] && priv=" [priv]"; \
+           printf "%20s -- %s\n" $$pn "$$n$$priv";                     \
+         fi;                                                           \
+         unset arch_hit;                                               \
+       done | sort -b
+
 
 .PHONY: elfimage rawimage uimage qemu vbox ux switch_ram_base \
         grub1iso grub2iso listentries shellcodeentry exportpack \
-        fastboot check_and_adjust_ram_base
+        fastboot fastboot_rawimage fastboot_uimage \
+       check_and_adjust_ram_base listplatforms
 
 switch_ram_base:
        $(VERBOSE)$(call switch_ram_base_func,$(RAM_BASE))
 
-checkbuild:
+check_base_dir:
        @if [ -z "$(CHECK_BASE_DIR)" ]; then                                  \
          echo "Need to set CHECK_BASE_DIR variable";                         \
          exit 1;                                                             \
        fi
-       set -e; for i in $(if $(USE_CONFIGS),$(addprefix mk/defconfig/config.,$(USE_CONFIGS)),mk/defconfig/config.*); do \
-         p=$(CHECK_BASE_DIR)/$$(basename $$i);                               \
-         rm -rf $$p;                                                         \
-         mkdir -p $$p;                                                       \
-         cp $$i $$p/.kconfig;                                                \
-         $(MAKE) O=$$p oldconfig;                                            \
-         $(MAKE) O=$$p report;                                               \
-         $(MAKE) O=$$p tool;                                                 \
-         $(MAKE) O=$$p USE_CCACHE=$(USE_CCACHE) $(CHECK_MAKE_ARGS);          \
-         $(if $(CHCEK_REMOVE_OBJDIR),rm -rf $$p;)                            \
-       done
+
+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: mk/defconfig/config.% checkbuild_prepare.%
+       mkdir -p $(@D)
+       cp $< $@
+
+$(CHECK_BASE_DIR)/config.%/.config.all: $(CHECK_BASE_DIR)/config.%/.kconfig FORCE
+       $(MAKE) -j 1 O=$(@D) oldconfig $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
+
+checkbuild.%: $(CHECK_BASE_DIR)/config.%/.config.all $(CHECK_BASE_DIR)/config.%/.kconfig check_base_dir
+       $(MAKE) O=$(<D) BID_CHECKBUILD=1 report $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
+       $(MAKE) O=$(<D) BID_CHECKBUILD=1 tool $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
+       $(MAKE) O=$(<D) BID_CHECKBUILD=1 USE_CCACHE=$(strip $(USE_CCACHE)) $(CHECK_MAKE_ARGS) $(call BID_CHECKBUILD_LOG_REDIR_f, $*)
+       $(VERBOSE)if [ -e $(<D)/ext-pkg ]; then \
+         echo "$(<D)/ext-pkg created. That must not happen in checkbuild."; \
+         exit 1; \
+       fi
+       $(if $(CHECK_REMOVE_OBJDIR),rm -rf $(<D))
+
+checkbuild: $(if $(USE_CONFIGS),$(addprefix checkbuild.,$(USE_CONFIGS)),$(patsubst mk/defconfig/config.%, checkbuild.%, $(wildcard mk/defconfig/config.*)))
+
 
 report:
        @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
@@ -586,6 +705,9 @@ report:
        @echo "svn --version: "
        @svn --version || true
        @echo
+       @echo "git --version: "
+       @git --version || true
+       @echo
        @echo "Shell is:"
        @ls -la /bin/sh || true
        @echo
@@ -631,7 +753,10 @@ report:
        @id -u || true
        @echo
        @echo "Archive information:"
+       @echo "SVN:"
        @svn info || true
+       @echo "Git:"
+       @git describe || true
        @echo
        @echo "CC       = $(CC) $(CCXX_FLAGS)"
        @echo "CXX      = $(CXX) $(CCXX_FLAGS)"
@@ -647,7 +772,7 @@ report:
        @echo
        @for i in pkg \
                  ../kernel/fiasco/src/kern/ia32 \
-                 ../tools/preprocess/src/preprocess; do \
+                 ../kernel/fiasco/tool/preprocess/src/preprocess; do \
          if [ -e $$i ]; then \
            echo Path $$i found ; \
          else                \
@@ -686,3 +811,8 @@ help::
        @echo "  cleanfast        - Delete all directories created during build." 
        @echo "  report           - Print out host configuration information." 
        @echo "  help             - Print this help text." 
+       @echo "  test             - Execute unit tests."
+       @echo "  listplatforms    - List available platforms."
+
+test::
+       prove -rv "$(OBJ_BASE)/test/t/$(ARCH)_$(CPU)/$(BUILD_ABI)"