From f15c371403fb010de5111b5c2fc5731193e796dd Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Fri, 10 Nov 2017 01:00:18 +0100 Subject: [PATCH] lineage: build: kernel: Rework kernel module logic The existing kernel module logic does not detect failed kernel module builds. This is because the module build logic is a long shell chain that invokes make macros which are not intended to be used in this way. The essense of the issue is that we get a shell chain that looks like: cmd && cmd && var=value; cmd && var=value; cmd; The shell breaks this into three separate commands. The first builds the modules. The other two are the macro invocations. So the result of the command is the result of the last macro invocation, which will always succeed even if the modules fail to build. The issue is made worse by the existing build rule conflating the built kernel modules and the installed kernel modules. Fix this by reducing the built kernel module command to a single shell command and creating a separate target INSTALLED_KERNEL_MODULES. Any kernel module build failure will show up properly. The commands for INSTALLED_KERNEL_MODULES do not invoke any macros and should avoid the issue described above. Finally, this also removes the fake target no-external-modules and unifies the install logic for in-tree and out-of-tree modules. Change-Id: I3d13056e217e1e937c8c3a345032682ffc394bca --- build/tasks/kernel.mk | 59 +++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 55357392..5a150fb0 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -235,30 +235,13 @@ endif KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)" ccache = -define mv-modules - mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ - if [ "$$mdpath" != "" ];then\ - mpath=`dirname $$mdpath`;\ - ko=`find $$mpath/kernel -type f -name *.ko`;\ - for i in $$ko; do $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$i;\ - mv $$i $(KERNEL_MODULES_OUT)/; done;\ - fi -endef - -define clean-module-folder - mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\ - if [ "$$mdpath" != "" ];then\ - mpath=`dirname $$mdpath`; rm -rf $$mpath;\ - fi -endef - ifeq ($(HOST_OS),darwin) MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/libelf:/usr/local/opt/openssl/include MAKE_FLAGS += LIBRARY_PATH=/usr/local/opt/openssl/lib endif ifeq ($(TARGET_KERNEL_MODULES),) - TARGET_KERNEL_MODULES := no-external-modules + TARGET_KERNEL_MODULES := INSTALLED_KERNEL_MODULES endif $(KERNEL_OUT_STAMP): @@ -290,24 +273,28 @@ $(KERNEL_CONFIG): $(KERNEL_OUT_STAMP) $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONA TARGET_KERNEL_BINARIES: $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL_STAMP) @echo "Building Kernel" $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(BOARD_KERNEL_IMAGE_NAME) - $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \ - then \ - echo "Building DTBs" ; \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \ - else \ - echo "DTBs not enabled" ; \ - fi ; - $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \ - then \ - echo "Building Kernel Modules" ; \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \ - $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \ - $(mv-modules) && \ - $(clean-module-folder) ; \ - else \ - echo "Kernel Modules not enabled" ; \ - fi ; - + $(hide) if grep -q '^CONFIG_OF=y' $(KERNEL_CONFIG); then \ + echo "Building DTBs"; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs; \ + fi + $(hide) if grep -q '^CONFIG_MODULES=y' $(KERNEL_CONFIG); then \ + echo "Building Kernel Modules"; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules; \ + fi + +.PHONY: INSTALLED_KERNEL_MODULES +INSTALLED_KERNEL_MODULES: + $(hide) if grep -q '^CONFIG_MODULES=y' $(KERNEL_CONFIG); then \ + echo "Installing Kernel Modules"; \ + $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) modules_install && \ + mofile=$$(find $(KERNEL_MODULES_OUT) -type f -name modules.order) && \ + mpath=$$(dirname $$mofile) && \ + for f in $$(find $$mpath/kernel -type f -name '*.ko'); do \ + $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$f; \ + mv $$f $(KERNEL_MODULES_OUT); \ + done && \ + rm -rf $$mpath; \ + fi $(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES