From 4901ccd89c10f1f9a324a60cd6771bd22f2fed89 Mon Sep 17 00:00:00 2001 From: Trammell Hudson Date: Wed, 29 Mar 2017 16:58:45 -0400 Subject: [PATCH] major rearranging of Makefile, bin, library and busybox installation --- Makefile | 128 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/Makefile b/Makefile index b4c9534f..a29407af 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,14 @@ build := $(pwd)/build config := $(pwd)/build INSTALL := $(pwd)/install log_dir := $(build)/log +initrd_lib_dir := initrd/lib +initrd_bin_dir := initrd/bin + +# Controls how many parallel jobs are invoked in subshells MAKE_JOBS ?= -j8 --max-load 24 # Create the log directory if it doesn't already exist -BUILD_LOG := $(shell [ -d "$(log_dir)" ] || mkdir "$(log_dir)") +BUILD_LOG := $(shell [ -d "$(log_dir)" ] || mkdir -p "$(log_dir)") # If V is set in the environment, do not redirect the tee # command to /dev/null. @@ -52,16 +56,24 @@ heads_cc := $(INSTALL)/bin/musl-gcc \ CROSS := $(build)/../crossgcc/x86_64-linux-musl/bin/x86_64-musl-linux- -#heads_cc := $(HOME)/install/x86_64-linux-musl/x86_64-linux-musl/bin/gcc all: $(BOARD).rom # Disable all built in rules .SUFFIXES: +FORCE: # Timestamps should be in ISO format DATE=`date --rfc-3339=seconds` +# Make helpers to operate on lists of things +define prefix = +$(foreach _, $2, $1$_) +endef +define map = +$(foreach _,$2,$(eval $(call $1,$_))) +endef + # Bring in all of the module definitions; # these are the external pieces that will be downloaded and built # as part of creating the Heads firmware image. @@ -71,10 +83,6 @@ include modules/* # This increases the build time, so it is commented out for now #all: $(foreach m,$(modules),$m.intermediate) -define prefix = -$(foreach _, $2, $1$_) -endef - define bins = $(foreach m,$1,$(call prefix,$(build)/$($m_dir)/,$($m_output))) endef @@ -106,14 +114,14 @@ define define_module = ( cd $(build)/$($1_dir) ; patch -p1 ) \ < patches/$1.patch; \ fi - touch "$$@" + @touch "$$@" else # Fetch and verify the source tar file $(packages)/$($1_tar): wget -O "$$@" $($1_url) $(packages)/.$1_verify: $(packages)/$($1_tar) echo "$($1_hash) $$^" | sha256sum --check - - touch "$$@" + @touch "$$@" # Unpack the tar file and touch the canary so that we know # that the files are all present @@ -123,24 +131,24 @@ define define_module = ( cd $(build)/$($1_dir) ; patch -p1 ) \ < patches/$1-$($1_version).patch; \ fi - touch "$$@" + @touch "$$@" endif ifeq "$($1_config)" "" # There is no official .config file $(build)/$($1_dir)/.config: $(build)/$($1_dir)/.canary - touch "$$@" + @touch "$$@" else # Copy the stored config file into the unpacked directory $(build)/$($1_dir)/.config: config/$($1_config) $(build)/$($1_dir)/.canary - cp -a "$$<" "$$@" + $(call do,COPY,"$$<",cp -a "$$<" "$$@") endif # Use the module's configure variable to build itself $(build)/$($1_dir)/.configured: \ $(build)/$($1_dir)/.canary \ $(build)/$($1_dir)/.config - @echo "$(DATE) Configuring $1" + @echo "$(DATE) CONFIG $1" @( \ cd "$(build)/$($1_dir)" ; \ echo "$($1_configure)"; \ @@ -150,7 +158,7 @@ define define_module = 2>&1 \ | tee "$(log_dir)/$1.configure.log" \ $(VERBOSE_REDIRECT) - touch "$$@" + @touch "$$@" # All of the outputs should result from building the intermediate target $(call outputs,$1): $1.intermediate @@ -190,16 +198,15 @@ define define_module = .INTERMEDIATE: $1.intermediate endef -$(foreach _, $(modules), $(eval $(call define_module,$_))) +$(call map, define_module, $(modules)) -initrd_lib_dir := initrd/lib -initrd_bin_dir := initrd/bin # # Install a file into the initrd, if it changed from # the destination file. # define install = + @-mkdir -p "$(dir $2)" $(call do,INSTALL,$2,cp "$1" "$2") endef @@ -209,18 +216,16 @@ endef # define initrd_bin_add = $(initrd_bin_dir)/$(notdir $1): $1 - @if [ ! -d "$(initrd_bin_dir)" ]; \ - then mkdir -p "$(initrd_bin_dir)"; \ - fi - $(call install,$$<,$$@) + $(call do,INSTALL-BIN,$$<,cp -a "$$<" "$$@") + @$(CROSS)strip "$$@" 2>&-; true initrd_bins += $(initrd_bin_dir)/$(notdir $1) endef define initrd_lib_add = $(initrd_lib_dir)/$(notdir $1): $1 - @mkdir -p "$(initrd_lib_dir)" - $(call do,INSTALL-STRIP,$1,$(CROSS)strip -o "$$@" "$$<") + @-mkdir -p "$(dir $$@)" + $(call do,INSTALL-LIB,$$@,$(CROSS)strip -o "$$@" "$$<") initrd_libs += $(initrd_lib_dir)/$(notdir $1) endef @@ -231,29 +236,30 @@ $(foreach _, $(call bins,gpg), $(eval $(call initrd_bin_add,$_))) $(foreach _, $(call bins,lvm2), $(eval $(call initrd_bin_add,$_))) # Install the libraries for every module that we have built -$(foreach m, $(modules), \ - $(foreach _, $(call libs,$m), $(eval $(call initrd_lib_add,$_))) \ -) +$(foreach m, $(modules), $(call map,initrd_lib_add,$(call libs,$m))) #$(foreach _, $(call outputs,xen), $(eval $(call initrd_bin,$_))) # hack to install busybox into the initrd -initrd_bins += initrd/bin/busybox +initrd.cpio: busybox.intermediate +initrd_bins += $(initrd_bin_dir)/busybox -initrd/bin/busybox: $(build)/$(busybox_dir)/busybox - cmp --quiet "$@" "$^" || \ - $(MAKE) \ +$(initrd_bin_dir)/busybox: $(build)/$(busybox_dir)/busybox + $(do,SYMLINK,$@,$(MAKE) \ -C $(build)/$(busybox_dir) \ CC="$(heads_cc)" \ CONFIG_PREFIX="$(pwd)/initrd" \ - $(MAKE_JOBS) \ - install + install \ + ) +# # hack to build cbmem from coreboot -# this must be built *AFTER* musl -initrd_bins += initrd/bin/cbmem -initrd/bin/cbmem: $(build)/$(coreboot_dir)/util/cbmem/cbmem - cp "$^" "$@" +# this must be built *AFTER* musl, but since coreboot depends on other things +# that depend on musl it should be ok. +# +initrd_bins += $(initrd_bin_dir)/cbmem +$(initrd_bin_dir)/cbmem: $(build)/$(coreboot_dir)/util/cbmem/cbmem + $(call install,$<,$@) $(build)/$(coreboot_dir)/util/cbmem/cbmem: \ $(build)/$(coreboot_dir)/.canary \ musl.intermediate @@ -261,6 +267,22 @@ $(build)/$(coreboot_dir)/util/cbmem/cbmem: \ $(MAKE) -C "$(dir $@)" CC="$(heads_cc)" \ ) +# +# Linux kernel module installation +# +# This is special cases since we have to do a special strip operation on +# the kernel modules to make them fit into the ROM image. +# +define linux_module = +$(build)/$(linux_dir)/$1: linux.intermediate +initrd.cpio: $(initrd_lib_dir)/modules/$(notdir $1) +$(initrd_lib_dir)/modules/$(notdir $1): $(build)/$(linux_dir)/$1 + @-mkdir -p "$(initrd_lib_dir)/modules" + $(call do,INSTALL-MODULE,$$@,$(CROSS)strip --strip-debug -o "$$@" "$$<") +endef +$(call map,linux_module,$(linux_modules)) + + # # initrd image creation @@ -276,7 +298,7 @@ $(build)/$(coreboot_dir)/util/cbmem/cbmem: \ # unlikely that their device file has a different major/minor) # # -initrd.cpio: $(initrd_bins) $(initrd_libs) linux_modules +initrd.cpio: $(initrd_bins) $(initrd_libs) dev.cpio FORCE $(call do,CPIO,$@, \ cd ./initrd ; \ find . \ @@ -287,24 +309,11 @@ initrd.cpio: $(initrd_bins) $(initrd_libs) linux_modules initrd.intermediate: initrd.cpio -linux_modules: linux.intermediate - @-mkdir -p initrd/lib/modules -define linux_module = -$(build)/$(linux_dir)/$1: linux.intermediate -initrd.cpio: initrd/lib/modules/$(notdir $1) -initrd/lib/modules/$(notdir $1): $(build)/$(linux_dir)/$1 - $(call do,INSTALL-STRIP,$$@,$(CROSS)strip --strip-debug -o "$$@" "$$<") -endef -define map = -$(foreach _,$2,$(eval $(call $1,$_))) -endef -$(call map,linux_module,$(linux_modules)) - - -# populate the coreboot initrd image from the one we built. -# 4.4 doesn't allow this, but building from head does. -#$(call outputs,linux): initrd.cpio +# +# Compress the initrd into a xz file that can be included by coreboot. +# The extra options are necessary to let the Linux kernel decompress it. +# coreboot.intermediate: $(build)/$(coreboot_dir)/initrd.cpio.xz $(build)/$(coreboot_dir)/initrd.cpio.xz: initrd.cpio $(call do,COMPRESS,$<,\ @@ -323,11 +332,8 @@ $(build)/$(coreboot_dir)/bzImage: $(build)/$(linux_dir)/arch/x86/boot/bzImage coreboot.intermediate: $(build)/$(coreboot_dir)/bzImage -# The coreboot gcc won't work for us since it doesn't have libc -#XGCC := $(build)/$(coreboot_dir)/util/crossgcc/xgcc/ -#export CC := $(XGCC)/bin/x86_64-elf-gcc -#export LDFLAGS := -L/lib/x86_64-linux-gnu - +# Each board output has its own fixup required to turn the coreboot.rom +# into a flashable image. x230.rom: $(build)/$(coreboot_dir)/x230/coreboot.rom "$(build)/$(coreboot_dir)/$(BOARD)/cbfstool" "$<" print $(call do,EXTRACT,$@,dd if="$<" of="$@" bs=1M skip=8) @@ -340,7 +346,7 @@ qemu.rom: $(build)/$(coreboot_dir)/qemu/coreboot.rom @sha256sum "$@" -clean-modules: +modules.clean: for dir in \ $(busybox_dir) \ $(cryptsetup_dir) \ @@ -371,14 +377,14 @@ all: # How to download and build the correct version of make $(HEADS_MAKE): $(build)/$(make_dir)/Makefile - make -C "`dirname $@`" $(MAKE_JOBS) \ + make -C "$(dir $@)" $(MAKE_JOBS) \ 2>&1 \ | tee "$(log_dir)/make.log" \ $(VERBOSE_REDIRECT) $(build)/$(make_dir)/Makefile: $(packages)/$(make_tar) tar xf "$<" -C build/ - cd "`dirname $@`" ; ./configure \ + cd "$(dir $@)" ; ./configure \ 2>&1 \ | tee "$(log_dir)/make.configure.log" \ $(VERBOSE_REDIRECT)