如何在执行 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}/"
我正在使用 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}/"