OSDN Git Service

kernel.mk: fix several issues in Android 10
authorChih-Wei Huang <cwhuang@linux.org.tw>
Thu, 3 Oct 2019 09:37:02 +0000 (17:37 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Tue, 15 Oct 2019 15:18:50 +0000 (23:18 +0800)
Android 10 has started restricting the external host tools usable inside
the build. The external tools can only be used with absolute path.

To avoid using host gcc, we build kernel host tools by AOSP's clang.
Note the kernel's makefile has a small issue to be fixed.

build/tasks/kernel.mk

index 47449b8..30a6ed5 100644 (file)
@@ -25,9 +25,10 @@ TARGET_KERNEL_CONFIG ?= goldfish_defconfig
 KERNEL_CONFIG_DIR := arch/arm/configs
 endif
 
+KERNEL_CLANG_CLAGS := HOSTCC=$(abspath $(LLVM_PREBUILTS_PATH)/clang)
 ifeq ($(BUILD_KERNEL_WITH_CLANG),true)
 CROSS_COMPILE := x86_64-linux-androidkernel-
-KERNEL_CLANG_CLAGS := CC=clang HOSTCC=clang CLANG_TRIPLE=x86_64-linux-gnu- PATH=$(abspath $(LLVM_PREBUILTS_BASE)/$(BUILD_OS)-x86/$(LLVM_PREBUILTS_VERSION)/bin):$$PATH
+KERNEL_CLANG_CLAGS += CC=$(abspath $(LLVM_PREBUILTS_PATH)/clang) CLANG_TRIPLE=x86_64-linux-gnu-
 else
 ifeq ($(TARGET_KERNEL_ARCH),x86_64)
 ifeq ($(HOST_OS),darwin)
@@ -41,7 +42,13 @@ endif
 endif
 
 KBUILD_OUTPUT := $(TARGET_OUT_INTERMEDIATES)/kernel
-mk_kernel := + $(hide) $(MAKE) $(if $(filter darwin,$(HOST_OS)),-j$$(sysctl -n hw.ncpu) -l$$(($$(sysctl -n hw.ncpu)+2)),-j$$(nproc) -l$$(($$(nproc)+2))) \
+ifeq ($(HOST_OS),darwin)
+KBUILD_JOBS := $(shell /usr/sbin/sysctl -n hw.ncpu)
+else
+KBUILD_JOBS := $(shell echo $$((1-(`cat /sys/devices/system/cpu/present`))))
+endif
+
+mk_kernel := + $(hide) prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/make -j$(KBUILD_JOBS) -l$$(($(KBUILD_JOBS)+2)) \
        -C $(KERNEL_DIR) O=$(abspath $(KBUILD_OUTPUT)) ARCH=$(TARGET_ARCH) CROSS_COMPILE="$(abspath $(CC_WRAPPER)) $(CROSS_COMPILE)" $(if $(SHOW_COMMANDS),V=1) \
        YACC=$(abspath $(BISON)) LEX=$(abspath $(LEX)) \
        $(KERNEL_CLANG_CLAGS)
@@ -63,11 +70,16 @@ endif
 $(KERNEL_DOTCONFIG_FILE): $(KERNEL_CONFIG_FILE) $(wildcard $(TARGET_KERNEL_DIFFCONFIG)) $(KERNEL_ARCH_CHANGED)
        $(hide) mkdir -p $(@D) && cat $(wildcard $^) > $@
        $(hide) ln -sf ../../../../../../prebuilts $(@D)
-       $(mk_kernel) olddefconfig
        $(hide) rm -f $(KERNEL_ARCH_CHANGED)
 
 BUILT_KERNEL_TARGET := $(KBUILD_OUTPUT)/arch/$(TARGET_ARCH)/boot/$(KERNEL_TARGET)
 $(BUILT_KERNEL_TARGET): $(KERNEL_DOTCONFIG_FILE)
+       # A dirty hack to use ar & ld
+       $(hide) mkdir -p $(OUT_DIR)/.path; ln -sf ../../$(LLVM_PREBUILTS_PATH)/llvm-ar $(OUT_DIR)/.path/ar; ln -sf ../../$(LLVM_PREBUILTS_PATH)/ld.lld $(OUT_DIR)/.path/ld
+ifeq ($(BUILD_KERNEL_WITH_CLANG),true)
+       $(hide) cd $(OUT_DIR)/.path; ln -sf ../../$(dir $(TARGET_TOOLS_PREFIX))x86_64-linux-androidkernel-* .; ln -sf x86_64-linux-androidkernel-as x86_64-linux-gnu-as
+endif
+       $(mk_kernel) olddefconfig
        $(mk_kernel) $(KERNEL_TARGET) $(if $(MOD_ENABLED),modules)
        $(if $(FIRMWARE_ENABLED),$(mk_kernel) INSTALL_MOD_PATH=$(abspath $(TARGET_OUT)) firmware_install)