向 AOSP 配置添加新符号时,silentoldconfig 无法构建

Posted

技术标签:

【中文标题】向 AOSP 配置添加新符号时,silentoldconfig 无法构建【英文标题】:silentoldconfig fails to build when adding new symbol to AOSP config 【发布时间】:2018-09-05 18:12:22 【问题描述】:

我正在尝试将 linux 内核驱动程序添加到 android 源代码中。

我将它添加到要构建的配置文件中(kernel/msm-4.9/arch/arm64/config/sdm845_defconfig)。

CONFIG_LEDS_QPNP_WLED=y
# CONFIG_LEDS_QPNP_HAPTICS is not set
CONFIG_HAPTICS_MISC=y

kernel/msm-4.9/drivers/misc/ 中的 makefile 和 Kconfig 文件也更新为包含驱动程序。

生成文件:

haptics-misc-objs := haptics-misc.o hatpics-misc-tables.o
obj-$(CONFIG_HAPTICS_MISC)   += haptics-misc.o

Kconfig:

config HAPTICS_MISC
        tristate "Haptics driver"
        depends on I2C && SYSFS && NEW_LEDS
        help
          Boosted Haptics Driver

我尝试通过以下步骤构建内核:

 $ source build/envsetup.sh
 $ lunch 41
    ============================================
    PLATFORM_VERSION_CODENAME=REL
    PLATFORM_VERSION=8.1.0
    TARGET_PRODUCT=sdm845
    TARGET_BUILD_VARIANT=userdebug
    TARGET_BUILD_TYPE=release
    TARGET_PLATFORM_VERSION=OPM1
    TARGET_BUILD_APPS=
    TARGET_ARCH=arm64
    TARGET_ARCH_VARIANT=armv8-a
    TARGET_CPU_VARIANT=kryo300
    TARGET_2ND_ARCH=arm
    TARGET_2ND_ARCH_VARIANT=armv7-a-neon
    TARGET_2ND_CPU_VARIANT=cortex-a9
    HOST_ARCH=x86_64
    HOST_2ND_ARCH=x86
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-4.15.0-24-generic-x86_64-with-Ubuntu-16.04-xenial
    HOST_CROSS_OS=windows
    HOST_CROSS_ARCH=x86
    HOST_CROSS_2ND_ARCH=x86_64
    HOST_BUILD_TYPE=release
    BUILD_ID=OPM1.171019.026
    OUT_DIR=out
    AUX_OS_VARIANT_LIST=

   $ make -j12 

构建失败并出现以下错误:

Haptics driver (HAPTICS_MISC) [N/m/y/?] (NEW) aborted!

Console input/output is redirected. Run 'make oldconfig' to update configuration.

/media/ftreven/quarter-b/Open-Q_845_Android-O_v1.0/Source_Package/SDA845_Open-Q_845_Android-O_v1.0/kernel/msm-4.9/scripts/kconfig/Makefile:37: recipe for target 'silentoldconfig' failed
make[3]: *** [silentoldconfig] Error 1
/media/ftreven/quarter-b/Open-Q_845_Android-O_v1.0/Source_Package/SDA845_Open-Q_845_Android-O_v1.0/kernel/msm-4.9/Makefile:550: recipe for target 'silentoldconfig' failed
make[2]: *** [silentoldconfig] Error 2
make[1]: *** No rule to make target 'include/config/auto.conf', needed by 'include/config/kernel.release'.  Stop.
make[1]: Leaving directory '/media/ftreven/quarter-b/Open-Q_845_Android-O_v1.0/Source_Package/SDA845_Open-Q_845_Android-O_v1.0/out/target/product/sdm845/obj/kernel/msm-4.9'
Makefile:150: recipe for target 'sub-make' failed
make: *** [sub-make] Error 2

从错误消息看来,命令失败仅仅是因为符号是新的。它建议制作 oldconfig 但这也失败了:

$ make oldconfig
ninja: error: unknown target 'oldconfig', did you mean 'fmconfig'?
13:08:18 ninja failed with: exit status 1

#### failed to build some targets (38 seconds) ####

我不确定“fmconfig”是什么,但我尝试按照建议构建它并且它成功了。但是,由于与上述相同的原因,尝试构建整个内核会失败。知道是什么原因造成的吗?它在添加新符号之前已成功构建。

【问题讨论】:

make oldconfig => ninja: error: ... - 什么? ninja 与构建 Linux 内核有什么关系?您确定在这种情况下您从正确的目录运行 make 吗? 是的,我在添加驱动之前已经多次构建成功了。 我不是要构建内核,我是要使用make oldconfig 配置它。 make 的输出包含“ninja”是相当奇怪的 - ninja 是另一个构建系统,据我所知,内核构建过程不使用它。 它不仅在构建内核,还构建了android空间。 好吧,我明白你的意思了,我切换到了android目录里面的kernel目录,并且从那里构建成功了。 【参考方案1】:

我发现在 Linux 内核版本 4.9 发布后,android 框架不再允许内置驱动程序。为了解决这个问题,我不得不将驱动程序构建为动态可加载内核模块。为此,我在 vendor/ 下创建了一个名为 dlkm/ 的目录,其中放置了所有源代码和 configs/Makefile。

完成后,我可以成功构建源代码。

$ source build/envsetup.sh
$ lunch 41
$ make -j12


#### build completed successfully (03:38 (mm:ss)) ###

在android框架的实际内核部分中不能引用驱动程序,否则构建将失败。例外情况是设备树(.dtsi、.dts 文件)仍将在内核中构建。

【讨论】:

以上是关于向 AOSP 配置添加新符号时,silentoldconfig 无法构建的主要内容,如果未能解决你的问题,请参考以下文章

AOSP 构建错误:未定义符号

AOSP 构建错误:未定义符号

如何查看android aosp同步完成

WSO2 IS:向用户配置文件添加类型复选框的新声明(字段)

Android:通过 AOSP 源代码创建新的系统权限。

R(插入符号)-在循环中训练“mlpML”模型时出错