如何在执行 populate_sdk 时使用 yocto 在本机 sysroot 中安装文件?

How to install files in the native sysroot with yocto when doing populate_sdk?

我正在使用 Yocto (THUD) 为 imx6 处理器构建自定义图像。使用图像,我创建了一个 QT 应用程序的配方和一个使用 cmake 构建的 c++ 库的配方。

我正在研究为该图像构建 SDK。我希望 SDK 允许交叉编译,但也要编译 QT 应用程序,以便它可以在主机 (SDKMACHINE) 上 运行。交叉编译部分就像一个魅力。这是关于在我遇到问题的主机上将 QT 应用程序构建到 运行 的部分。

首先,这是库的配方:

SRC_URI = "file://LibName"

inherit cmake

S = "${WORKDIR}"

FILES_${PN} += "${includedir}/*.h ${includedir}/"

BBCLASSEXTEND = "native nativesdk"

do_configure() {
    cmake  ../LibName/src
}

do_install() {
    install -d ${D}${libdir}
    install -m 0755 ${S}/build/libLibName.so ${D}${libdir}/libLibName.so.0
    ln -s libLibName.so.0 ${D}${libdir}/libLibName.so
    install -m 0755 ${S}/build/libLibName.a ${D}${libdir}

    install -d ${D}${includedir}/LibName/
    cp -r ${S}/LibName/includes ${D}${includedir}/LibName/
    install -d ${D}${includedir}/LibName/src
    rsync -a --include='*.h' --include='*/' --exclude='*' ${S}/LibName/src/ ${D}${includedir}/LibName/src
}

在我的图像配方文件中,我添加了:

TOOLCHAIN_HOST_TASK += "nativesdk-lib-name"

然后我使用以下方法构建 SDK:

bitbake -c populate_sdk custom-iamge-recipe

我的问题是生成的 SDK 没有我期望在本机 sysroot 中包含的文件。我期待我的本机 sysroot (/opt/fslc-x11/2.6.2/sysroots/x86_64-fslcsdk-linux/usr/include) 将包含 c++ 库包含文件,就像目标 sysroot (/opt/fslc-x11/2.6.2/sysroots/armv7at2hf-neon-fslc-linux-gnueabi).

我不明白的另一件事是本机 sysroot 包含库 (libLibName.so.0),但不包含符号 link (libLibName.so)。我期待符号 link 出现就像它在目标 sysroot 中一样。

这是我现在拥有的:

/opt/fslc-x11/2.6.2/sysroots
├── armv7at2hf-neon-fslc-linux-gnueabi/usr
│   ├── include
│   │   └── LibName
│   │       └── include files
│   └── lib
│       ├── libLibName.so.0
│       └── libLibName.so 
└── x86_64-fslcsdk-linux/usr
    └── lib
        └── libLibName.so.0

这是我想要的:

/opt/fslc-x11/2.6.2/sysroots
├── armv7at2hf-neon-fslc-linux-gnueabi/usr
│   ├── include
│   │   └── LibName
│   │       └── include files
│   └── lib
│       ├── libLibName.so.0
│       └── libLibName.so 
└── x86_64-fslcsdk-linux/usr
    ├── include
    │   └── LibName
    │       └── include files
    └── lib
        ├── libLibName.so.0
        └── libLibName.so 

在此先感谢您的帮助,不胜感激!

PACKAGES 变量定义 here 为:

PACKAGES = "${PN}-src ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}"

因此,当 Yocto 从配方中打包文件时,它以 PACKAGES 顺序包含它们,在这种情况下,headers 个文件先包含在 ${PN}-dev 中,然后才能包含在 ${PN}:

FILES_${PN}-dev = "${includedir} ..."

要将 headers 添加到您的 SDK,您可以添加 -dev 包:

TOOLCHAIN_HOST_TASK += "nativesdk-lib-name nativesdk-lib-name-dev"

请注意,您也可以这样重新定义 PACKAGES 变量:

PACKAGES = "${PN}"

让您的线路正常工作:FILES_${PN} += "${includedir}/*.h ${includedir}/"