# vim:set ft=make: # # User definable variables for bootstrap: # - BOOTSTRAP_CHECK_MD5 set this if you want MD5 checks for modules # - BOOTSTRAP_SEARCH_PATH # - BOOTSTRAP_ELF_NAME # - BOOTSTRAP_MODULES_LIST # - BOOTSTRAP_DO_RAW_IMAGE # - BOOTSTRAP_DO_UIMAGE # - BOOTSTRAP_DO_UEFI if set an image which is bootable by UEFI is built # - BOOTSTRAP_NO_STRIP if set no stripping of image # - BOOTSTRAP_UIMAGE_COMPRESSION: set to none, gzip, or bzip2 # - BOOTSTRAP_CMDLINE: compiled-in command line, only used if no cmdline # given # - BOOTSTRAP_OUTPUT_DIR: Optional alternative output directory for all # images (and generated files), preferable some # tmpfs directory INTERNAL_CRT0 := y # the defualt is to use our internal crt0 DEFAULT_RELOC_arm := 0x01000000 DEFAULT_RELOC_x86 := 0x002d0000 DEFAULT_RELOC_amd64 := 0x002d0000 DEFAULT_RELOC_ppc32 := 0x002d0000 DEFAULT_RELOC_sparc := 0x00800000 RELOC_PHYS := y LDFLAGS = -nostdlib -static -Bstatic EXTRA_GENERAL_D_DEP += .redo-change-tracker $(BID_RAM_BASE_DEP) \ $(wildcard $(L4DIR)/conf/Makeconf.boot $(OBJ_BASE)/conf/Makeconf.boot) \ $(SRC_DIR)/build.pl $(BOOTSTRAP_MODULES_LIST) INCLUDE_MAKE_RULES = $(SRC_DIR)/*/Make.rules BOOTSTRAP_LD_dep := $(SRC_DIR)/ldscript.inc ifneq ($(BOOTSTRAP_CHECK_MD5),) REQUIRES_LIBS += libbsd-lite DEFINES += -DDO_CHECK_MD5 endif include $(L4DIR)/mk/Makeconf -include $(OBJ_DIR)/Makeconf.local -include $(L4DIR)/conf/Makeconf.boot -include $(OBJ_BASE)/conf/Makeconf.boot SRC_CC_IS_CXX11 := y # Checks added Nov 2010: ifneq ($(wildcard $(L4DIR)/conf/Makeconf.bootstrap),) $(error $(L4DIR)/conf/Makeconf.bootstrap not used anymore. Please use $(L4DIR)/conf/Makeconf.boot now) endif ifneq ($(wildcard $(OBJ_BASE)/Makeconf.bootstrap),) $(error $(OBJ_BASE)/Makeconf.bootstrap not used anymore. Please use $(OBJ_BASE)/conf/Makeconf.boot now) endif ifeq ($(BOOTSTRAP_DO_UEFI),y) # link to 0x0 DEFAULT_RELOC_x86 := 0x0 DEFAULT_RELOC_amd64 := 0x0 BUILD_PIE := 1 # lib gnu-efi requirements REQUIRES_LIBS += gnu-efi EFI_ARCH-amd64 := x86_64 EFI_ARCH-x86 := ia32 EFI_ARCH := $(EFI_ARCH-$(ARCH)) EFI_BIN_FMT := efi-app-$(EFI_ARCH) CRTN_dyn_bin := CRTEND_dyn_bin := INTERNAL_CRT0 := n CRT0 = $(OBJ_BASE)/lib/$(SYSTEM)/crt0-efi-$(EFI_ARCH).o EXTRA_LIBS = -L$(OBJ_BASE)/lib/$(SYSTEM) -lefi -lgnuefi CXXFLAGS += -fshort-wchar CFLAGS += -fshort-wchar endif BOOTSTRAP_SEARCH_PATH ?= $(OBJ_DIR) BOOTSTRAP_MODULES_LIST ?= $(SRC_DIR)/modules.list BOOTSTRAP_MODULE_PATH_BINLIB ?= $(OBJ_BASE)/bin/$(SYSTEM)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(SYSTEM)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(SYSTEM) BOOTSTRAP_ELF_NAME ?= bootstrap.elf MKIMAGE ?= mkimage BOOTSTRAP_UIMAGE_COMPRESSION ?= none ifeq ($(BUILD_ARCH),$(filter $(BUILD_ARCH),arm ppc32 sparc)) # ARM/PPC/SPARC always uses single image mode # when no entry is given we build the useless auto-build target ifeq ($(E)$(ENTRY),) BOOTSTRAP_ELF_NAME := bootstrap.auto-build-useless.elf endif ENTRY := auto-build-entry endif od := $(if $(BOOTSTRAP_OUTPUT_DIR),$(if $(wildcard $(BOOTSTRAP_OUTPUT_DIR)),,$(shell mkdir $(BOOTSTRAP_OUTPUT_DIR)))) od := $(if $(BOOTSTRAP_OUTPUT_DIR),$(BOOTSTRAP_OUTPUT_DIR)/) PRIVATE_INCDIR = $(SRC_DIR) $(SRC_DIR)/ARCH-$(ARCH) TARGET := $(od)$(BOOTSTRAP_ELF_NAME) TARGET_BIN = $(od)$(BOOTSTRAP_ELF_NAME) MODE = lib include $(SRC_DIR)/Makefile.platform ifneq ($(DEFAULT_RELOC_arm-$(PLATFORM_TYPE)),) DEFAULT_RELOC_arm := $(DEFAULT_RELOC_arm-$(PLATFORM_TYPE)) endif INTERNAL_CRT0 := $(strip $(INTERNAL_CRT0)) CXXFLAGS_amd64 += -mno-sse CXXFLAGS_x86 += -mno-sse CFLAGS_amd64 += -mno-sse CFLAGS_x86 += -mno-sse SRC_C += exec.c module.c SRC_CC += region.cc startup.cc init_kip_f.cc \ libc_support+.cc patch.cc koptions.cc \ platform_common.cc memory.cc boot_modules.cc SRC_CC_x86 += ARCH-x86/reboot.cc SRC_CC_amd64 += ARCH-x86/reboot.cc SRC_C_x86 += base_critical.c SRC_C_amd64 += base_critical.c SRC_CC_arm += ARCH-arm/reboot.cc ARCH-arm/head.cc SRC_CC_ppc32 += ARCH-ppc32/init_kip_v2-arch.cc \ ARCH-ppc32/reboot.cc ARCH-ppc32/head.cc SRC_CC_sparc += ARCH-sparc/reboot.cc ARCH-sparc/head.cc SRC_CC += $(SUPPORT_CC_$(ARCH)-$(PLATFORM_TYPE)) SRC_S-$(INTERNAL_CRT0) += ARCH-$(ARCH)/crt0.S OPTS = -g -Os $(CARCHFLAGS_$(ARCH)) $(CARCHFLAGS_$(ARCH)_$(CPU)) \ $(GCCNOFPU_$(ARCH)) DEFINES += -DRAM_BASE=$(RAM_BASE) -DL4_MINIMAL_LIBC=1 DEFINES += -DCMDLINE="\"$(BOOTSTRAP_CMDLINE)\"" DEFINES += -DPLATFORM_TYPE=\"$(PLATFORM_TYPE)\" DEFINES += -DPLATFORM_TYPE_$(PLATFORM_TYPE) DEFINES += -DPLATFORM_UART_NR=$(PLATFORM_UART_NR) MOD_ADDR = 0x02000000 SRC_S += $(SRC_S-y) CPPFLAGS += $(CPPFLAGS_$(ARCH)-$(PLATFORM_TYPE)) CPPFLAGS += $(BID_PKG_CONFIG_CFLAGS) ifeq ($(filter clean cleanall,$(MAKECMDGOALS)),) ifeq ($(SUPPORT_CC_$(ARCH)-$(PLATFORM_TYPE)),) $(info ERROR: PLATFORM_TYPE=$(PLATFORM_TYPE) has no assigned platform support file) $(info ERROR: A proper PLATFORM_TYPE must be set for a build) $(error .) endif endif BOOTSTRAP_L4_LIBS := -lcxx_base -lcxx_io -luc_c_minimal DRV_LIBS-ppc32 = -ldrivers_of DRV_LIBS = -ldrivers_uart $(DRV_LIBS-$(ARCH)) ifeq ($(INTERNAL_CRT0),y) CRT0 = endif LDSCRIPT = bootstrap.ld LDNMAGIC = vpath bootstrap.ld.in $(SRC_DIR)/ARCH-$(ARCH) # can be overwritten by Makeconf.local COMPRESS ?= 0 REALMODE_LOADING ?= 0 RML ?= 0 BUILD_PIE ?= 0 SPARSE_ELF ?= n ifeq ($(BUILD_PIE),1) DRV_LIBS := $(patsubst -l%,-l%.p,$(DRV_LIBS)) BOOTSTRAP_L4_LIBS := $(patsubst -l%,-l%.p,$(BOOTSTRAP_L4_LIBS)) CFLAGS += -fpie CXXFLAGS += -fpie DEFINES += -D__PIC__ LDFLAGS = -znocombreloc -nostdlib -pie -Bsymbolic endif ifneq ($(REALMODE_LOADING)$(RML),00) REALMODE_LOADING := 1 #$(error Info: Default reloc needs to be 0x00100000) # And if you have done so you probably need to relink sigma0 and/or moe endif ifeq ($(ARCH),arm) CPPFLAGS += -DSINGLE_SECTION endif # convenience ifneq ($(E),) ENTRY := $(E) endif ENTRY_FN := $(shell echo "$(ENTRY)" | tr '[ ]' '[_]' ) ifneq ($(ENTRY),) ifeq ($(filter clean cleanall,$(MAKECMDGOALS)),) BUILD_MOD_CMD = ( SEARCHPATH="$(BOOTSTRAP_SEARCH_PATH):$(BOOTSTRAP_MODULE_PATH_BINLIB)" \ CC="$(CC)" LD="$(LD)" CROSS_COMPILE=$(CROSS_COMPILE) \ MAKE_INC_FILE=$(PWD)/mod.make.inc \ FLAGS_CC="$(CCXX_FLAGS) -I$(SRC_DIR)" \ OUTPUT_DIR="$(BOOTSTRAP_OUTPUT_DIR)" \ OPT_ARCH=$(ARCH) OPT_COMPRESS=$(COMPRESS) L4DIR=$(L4DIR) \ $(SRC_DIR)/build.pl $(1) $(BOOTSTRAP_MODULES_LIST) "$(ENTRY)" || \ (echo "processing-of-module-list-failed"; exit 1)) endif endif # we need to re-do if some things change .redo-change-tracker: FORCE $(VERBOSE)echo "$(ENTRY) '$(COMPRESS)' '$(BOOTSTRAP_CMDLINE)' '$(BOOTSTRAP_SEARCH_PATH):$(BOOTSTRAP_MODULE_PATH_BINLIB)' '$(RAM_SIZE_MB)' '$(PLATFORM_TYPE)' '$(PLATFORM_UART_NR)' '$(od)' '$(OPT_STRIP)'" > $@.tmp $(if $(BUILD_MOD_CMD),$(VERBOSE)$(call BUILD_MOD_CMD,dump) >> $@.tmp) $(call move_if_changed,$@,$@.tmp) ifneq ($(ENTRY),) INSTALL_FILES = $(BOOTSTRAP_ELF_NAME) bootstrap_$(ENTRY_FN) bootstrap_$(ENTRY_FN).elf ifeq ($(ARCH)$(BOOTSTRAP_DO_UEFI),amd64) INSTALL_FILES += bootstrap32.elf BOOTSTRAP_LINK_SOURCE = bootstrap32.elf else BOOTSTRAP_LINK_SOURCE = $(BOOTSTRAP_ELF_NAME) endif ifeq ($(BOOTSTRAP_DO_UEFI),y) INSTALL_FILES += bootstrap_$(ENTRY_FN).efi bootstrap.efi endif $(od)bootstrap_$(ENTRY_FN): $(od)$(BOOTSTRAP_LINK_SOURCE) $(VERBOSE)$(LN) -f $< $@ $(od)bootstrap_$(ENTRY_FN).elf: $(od)$(BOOTSTRAP_LINK_SOURCE) $(VERBOSE)$(LN) -f $< $@ $(od)bootstrap_$(ENTRY_FN).%: $(od)bootstrap.% $(VERBOSE)$(LN) -f $< $@ ifeq ($(ARCH),$(filter $(ARCH),arm ppc32)) BID_POST_PROG_LINK_MSG_$(od)$(BOOTSTRAP_ELF_NAME) = echo -e " ==> Post-processing $@" BID_POST_PROG_LINK_$(od)$(BOOTSTRAP_ELF_NAME) = \ $(VERBOSE)LANG=C $(NM) -C $@ | \ LANG=C $(GREP) -E ' D __PLATFORMS_(BEGIN|END)$$' | \ (read a i; read b i; \ if [ "$$a" = "$$b" ]; then \ echo -e "\nERROR: Missing at least one platform instantiation.\n"; \ $(RM) $@; \ exit 1; \ fi ) || exit 1; \ $(if $(BOOTSTRAP_NO_STRIP),,$(STRIP) $@) ifneq ($(BOOTSTRAP_DO_RAW_IMAGE)$(BOOTSTRAP_DO_UIMAGE),) BOOTSTRAP_RAW := $(od)bootstrap.raw INSTALL_FILES += bootstrap.raw bootstrap_$(ENTRY_FN).raw ifneq ($(BOOTSTRAP_DO_UIMAGE),) ifneq ($(shell command -v $(MKIMAGE)),) BOOTSTRAP_UIMAGE := $(od)bootstrap.uimage INSTALL_FILES += bootstrap.uimage bootstrap_$(ENTRY_FN).uimage else $(error mkimage($(MKIMAGE)) host tool missing, cannot build bootstrap.uimage) endif endif endif endif ifneq ($(ENTRY),auto-build-entry) all:: $(addprefix $(IMAGES_DIR)/,$(INSTALL_FILES)) $(VERBOSE)echo " Image size(s) in bytes:" $(VERBOSE)for f in $(filter bootstrap_$(ENTRY_FN).elf bootstrap.raw bootstrap.uimage, $(INSTALL_FILES)); do \ find $(if $(od),$(od),.) -name $$f -printf " %30f: %s\n"; \ done $(if $(LDFLAGS_bootstrap.elf),$(VERBOSE)echo " Start address: $(patsubst --defsym=__executable_start=%,%,$(LDFLAGS_bootstrap.elf))") $(VERBOSE)echo " --> Build-Nr: $$(cat .build_nr)" # install images into easy to reach directory in build dir $(IMAGES_DIR)/%: $(od)% $(VERBOSE)echo " ==> Installing $< in image directory" $(VERBOSE)(cd $(dir $@) && $(LN) -sf $(if $(od),,$(PWD)/)$<) endif # !auto-build-entry else INSTALL_FILES = bootstrap endif # ENTRY ifneq ($(REALMODE_LOADING),0) CPPFLAGS += -DREALMODE_LOADING -DSINGLE_SECTION # don't install bootstrap_$(ENTRY_FN).elf INSTALL_FILES = bootstrap.load MOD_ADDR = 0x00150000 endif ifneq ($(COMPRESS),0) SRC_C += uncompress.c gunzip.c CFLAGS_gunzip.c := -fno-strict-aliasing CPPFLAGS += -DCOMPRESS SPARSE_ELF := n endif ifeq ($(SPARSE_ELF),y) CPPFLAGS += -DPLACE_MODULES_AT_MODADDR endif ifneq ($(RAM_SIZE_MB),) CPPFLAGS += -DRAM_SIZE_MB=$(RAM_SIZE_MB) endif CXXFLAGS += -fno-rtti -fno-exceptions CXXFLAGS += $(call checkcxx,-fno-threadsafe-statics) ifneq ($(BUILD_MOD_CMD),) ifeq ($(filter clean cleanall,$(MAKECMDGOALS)),) processing-of-module-list-failed: @echo @echo " Processing of $(BOOTSTRAP_MODULES_LIST) failed!" @echo @exit 1 mod.make.inc $(od)mbi_modules.bin: $(GENERAL_D_LOC) $(shell $(call BUILD_MOD_CMD,list)) @echo Building entry \""$(ENTRY)"\". $(VERBOSE)$(call BUILD_MOD_CMD,build) -include mod.make.inc BOOTSTRAP_LD_dep += mod.make.inc STARTUP_C_dep := mod.make.inc OBJS_$(od)$(BOOTSTRAP_ELF_NAME) += $(MODULE_OBJECT_FILES) endif CPPFLAGS += -DIMAGE_MODE endif CPPFLAGS += -DMODADDR=$(MOD_ADDR) LIBS = L4_LIBS = $(DRV_LIBS) $(BOOTSTRAP_L4_LIBS) L4_LIBS += $(GCCLIB) $(EXTRA_LIBS) all:: $(BOOTSTRAP_RAW) # image for use with pxelinux bootstrap.load: $(TARGET_BIN) bootsect.o.img setup.o.img @$(GEN_MESSAGE) $(VERBOSE)objcopy -O binary -R .note -R .comment -S $< $<.load.bin $(VERBOSE)cat bootsect.o.img setup.o.img $<.load.bin > $@ bootsect.o.img: ARCH-x86/bootsect.S $(SRC_DIR)/Makefile $(SRC_DIR)/Make.rules @$(GEN_MESSAGE) $(VERBOSE)$(CC) -traditional -nostdinc -nostdlib -c $< $(VERBOSE)$(LD) -m elf_i386 -Ttext 0x0 -o $@ -s --oformat binary \ bootsect.o $(VERBOSE)chmod -x $@ setup.o.img: ARCH-x86/setup.S $(SRC_DIR)/Makefile $(SRC_DIR)/Make.rules @$(GEN_MESSAGE) $(VERBOSE)$(CC) -traditional -nostdinc -nostdlib -DARCH_$(ARCH) -c $< $(VERBOSE)$(LD) -m elf_i386 -Ttext 0x0 -o $@ -s --oformat binary \ -e begtext setup.o $(VERBOSE)dd if=/dev/zero bs=1 count=$$((3072 - `wc -c < setup.o.img`)) >> setup.o.img 2> /dev/null $(VERBOSE)chmod -x $@ # raw version without ELF, primarily useful for ARM $(BOOTSTRAP_RAW): $(TARGET_BIN) @$(GEN_MESSAGE) $(VERBOSE)cp $< $@.tmp $(VERBOSE)$(OBJCOPY) -O binary $@.tmp $@ $(VERBOSE)chmod -x $@ $(VERBOSE)$(RM) $@.tmp %.gzip: % gzip -c9 $^ > $@ %.bzip2: % bzip2 -c9 $^ > $@ %.none: % ln -sf $^ $@ MKIMAGE_ARCH = $(if $(filter ppc32,$(ARCH)),ppc,$(ARCH)) # u-boot image, based on raw-version $(BOOTSTRAP_UIMAGE): $(BOOTSTRAP_RAW).$(BOOTSTRAP_UIMAGE_COMPRESSION) @$(GEN_MESSAGE) @# mkimage writes the same file which does not play well with hardlinks $(VERBOSE)$(RM) -f $@ $(VERBOSE)$(MKIMAGE) -e $(call default_reloc,$(ARCH)) \ -a $(call default_reloc,$(ARCH)) -A $(MKIMAGE_ARCH) \ -C $(BOOTSTRAP_UIMAGE_COMPRESSION) \ -n "L4 Image #$$(cat .build_nr)" \ -d $^ $@ $(TARGET): $(LDSCRIPT) $(OBJS_$(TARGET)) increment_build_nr = \ $(shell if [ -e .build_nr ]; then \ nr=$$(($$(cat .build_nr) + 1)); \ else \ nr=1; \ fi; \ echo $$nr > .build_nr; echo $$nr) startup.o: $(STARTUP_C_dep) startup.o: CPPFLAGS += -DBUILD_DATE="\"$(shell date)\"" -DBUILD_NR=\"$(call increment_build_nr)\" $(LDSCRIPT): $(LDSCRIPT).in $(GENERAL_D_LOC) $(BOOTSTRAP_LD_dep) @$(GEN_MESSAGE) $(VERBOSE)$(CROSS_COMPILE)cpp -P $(CPPFLAGS) -DLINKADDR=$(strip $(call default_reloc,$(ARCH))) $< $@; clean:: $(VERBOSE)$(RM) mod.make.inc mod*.bin mbi_modules.bin $(LDSCRIPT) $(VERBOSE)$(RM) setup.o.img bootsect.o.img $(VERBOSE)$(RM) mod*.bin $(VERBOSE)$(RM) $(SRC32_C:.c=.o32) $(SRC32_S:.S=.o32) $(VERBOSE)$(RM) .redo-change-tracker cleanall:: $(VERBOSE)$(RM) $(od)bootstrap_* $(od)bootstrap.* bootstrap.efi: bootstrap.elf $(OBJCOPY) -S -j .text -j .rodata -j .reloc -j .dynsym -j .dynstr -j .rel.dyn \ -j .data \ -j .data.module_info -j .dynamic -j .rela.dyn -j .rela.plt -j .reloc \ -j .bss -j .module_data \ --target=$(EFI_BIN_FMT) $< $@ ifeq ($(ARCH),amd64) vpath %.c $(SRC_DIR)/ARCH-amd64 vpath %.S $(SRC_DIR)/ARCH-amd64 vpath %.c $(SRC_DIR)/ARCH-amd64/boot32 vpath %.S $(SRC_DIR)/ARCH-amd64/boot32 vpath bootstrap.ld.in $(SRC_DIR)/ARCH-x86 SRC32_C = boot_cpu.c boot_kernel.c load_elf.c minilibc_support.c SRC32_S = boot.S boot_idt.S OBJ32 = $(SRC32_S:.S=.o32) $(SRC32_C:.c=.o32) CC32 = $(filter-out -m64, $(CC)) -m32 CFLAGS32 = $(filter-out -m64, $(CFLAGS) $(CFLAGS_$(ARCH))) -m32 $(GCCNOSTACKPROTOPT) $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a: FORCE $(VERBOSE)$(MAKE) O=$(OBJ_BASE) -C $(SRC_DIR)/ARCH-amd64/libc32 bootstrap32.elf: $(OBJ32) bootstrap32.bin $(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld $(OBJ_DIR)/ARCH-amd64/libc32/OBJ-$(ARCH)_$(CPU)/libc32.a @$(LINK_MESSAGE) $(VERBOSE)$(CC32) -o $@ -nostdlib -static \ -Wl,-T,$(SRC_DIR)/ARCH-amd64/boot32/bootstrap32.ld,--gc-sections $^ -lgcc $(VERBOSE)chmod 755 $@ bootstrap: bootstrap32.elf $(VERBOSE)$(LN) -f $^ $@ bootstrap32.bin: $(BOOTSTRAP_ELF_NAME) @$(GEN_MESSAGE) $(VERBOSE)$(OBJCOPY) -S $< bootstrap64.bin $(VERBOSE)chmod -x bootstrap64.bin $(VERBOSE)$(OBJCOPY) -B i386 -I binary -O elf32-i386 bootstrap64.bin $@ %.o32: %.c $(SRC_DIR)/Makefile $(SRC_DIR)/Make.rules @$(COMP_MESSAGE) $(VERBOSE)$(CC32) -o $@ -c $(DEPEND_FLAG) \ $(CPPFLAGS) $(CFLAGS32) $(call absfilename,$<) %.o32: %.S $(SRC_DIR)/Makefile $(SRC_DIR)/Make.rules @$(COMP_MESSAGE) $(VERBOSE)$(CC32) -o $@ -c $(DEPEND_FLAG) \ $(CPPFLAGS) $(CFLAGS32) $(call absfilename,$<) clean cleanall:: $(VERBOSE)PWD=$(call absfilename,$(SRC_DIR)/ARCH-amd64/libc32) \ $(MAKE) -C $(SRC_DIR)/ARCH-amd64/libc32 $@ else bootstrap: $(BOOTSTRAP_ELF_NAME) $(VERBOSE)$(LN) -f $^ $@ endif INSTALL_TARGET := $(if $(od),,$(INSTALL_FILES))