首页 > 解决方案 > 无法使用 CMake 为 Yocto 安装常规文件

问题描述

我已经使用 autotools 几年了,现在我正在为新项目学习 CMake。

这是我所拥有的:

myfirstrecipe.bb:

inherit pkgconfig cmake
...
do_install() {
    install -d ${D}${datadir}/folder1/folder2
    install -m 0755 ${S}/files/file.txt ${D}${datadir}/folder1/folder2
}

mysecondrecipe.bb:

...
DEPENDS = "myfirstrecipe"
...

这工作正常。第二个recipe可以找到第一个recipe安装的file.txt,我看到它安装在secondrecipe sysroot中:

build/tmp/work/armv7ahf-vfp-os-linux-musleabi/mysecondrecipe/510-r0/mysecondrecipe-sysroot/usr/share/folder1/folder2/file.txt

但是我希望 CMake 安装文件。所以当我尝试这个时:

myfirstrecipe.bb:

inherit pkgconfig cmake
...
OECMAKE_TARGET_INSTALL = "file-install"

CMakeLists.txt:

add_custom_target(file-install)
add_custom_command(TARGET file-install POST_BUILD 
                COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_INSTALL_DATADIR}/folder1/folder2
                COMMAND ${CMAKE_COMMAND} -E copy_if_different
                ${CMAKE_SOURCE_DIR}/files/file.txt
                ${CMAKE_INSTALL_DATADIR}/folder1/folder2/)

然后我从 mysecondrecipe.bb 收到一个构建错误,说它找不到该文件,因为它没有安装。我看到它安装在这里:

build/tmp/work/armv7ahf-vfp-os-linux-musleabi/myfirstrecipe/1.0-r0/myfirstrecipe-1.0/share/folder1/folder2/file.txt

但不在上面的路径中。任何人都可以看到我错过了什么?如果我要使用 Autotools,我可以很容易地使用它:

Automake.am:

file-install: $(shell find files/ -type f -name '*.txt')
    mkdir -p ${DESTDIR}${datadir}/folder1/folder2
    cp -u $^ -t ${DESTDIR}${datadir}/folder1/folder2

标签: cmakeyocto

解决方案


基本上你不使用安装文件的标准方式。CMake 有一个install指令install,这是常用且功能强大的。

这样做会带来很好的情况,即在myfirstrecipe.bb中不需要自己的do_install任务。您已经继承的cmake.bbclass正在添加一个do_install任务并依赖于CMakeLists.txt中的install指令

您可以查看 cmake.bbclass 以了解它是如何实现的。它位于 poky/meta/classes/cmake.bbclass

我想切换到安装会让生活更轻松


推荐阅读