带有 cmake 工具链文件的 Yocto SDK

Posted

技术标签:

【中文标题】带有 cmake 工具链文件的 Yocto SDK【英文标题】:Yocto SDK with cmake toolchain file 【发布时间】:2017-06-17 07:42:32 【问题描述】:

我提供了一个 Yocto SDK 来为嵌入式目标交叉构建应用程序。应用程序本身是使用 CMake 构建的。 SDK 设置脚本提供了许多必要的环境变量(如交叉编译器的位置、sysroot 等),到目前为止已经足够构建应用程序了。

然而,最近应用程序依赖于 Boost 库(通过 CMakeLists.txt 中的命令 find_package(Boost REQUIRED))。现在 CMake 抱怨它找不到库,即使它安装在 SDK sysroot 中。但是如果我直接在 Yocto 中构建应用程序,它就可以正常工作。

经过一番研究,发现 Yocto 生成了一个 toolchain.cmake 文件,该文件被添加到 cmake 调用中。在这个文件中,设置了变量CMAKE_FIND_ROOT_PATH,CMake需要它来查找库。使用这样的工具链文件,我也可以使用 SDK 进行构建。

现在我想知道 Yocto 是否提供任何机制来使用 SDK 导出此类工具链文件。或者,如果 SDK 提供脚本或其他东西来直接在 SDK 构建主机上自动创建工具链文件。

或者我应该告诉 SDK 的用户手动创建一个工具链文件并将其添加到他们的 cmake 调用中?

【问题讨论】:

【参考方案1】:

假设您使用的是基于图像的 SDK,即使用bitbake <image> -c populate_sdk 构建它,将以下内容添加到image.bb 应该可以解决它:

TOOLCHAIN_HOST_TASK += "nativesdk-cmake"

这应该会在 SDK 中为您提供一个 OEToolchainConfig.cmake 文件。获取 SDK 环境文件后,cmake 将成为cmake -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake 的别名,以进一步帮助您的开发人员。

【讨论】:

还有一个问题 - 使用bitbake meta-ide-support 构建时是否也可以创建此文件?我试图创建一个文件meta-ide-support.bbappend 来设置TOOLCHAIN_HOST_TASK,但它似乎没有做任何事情。 从未尝试过meta-ide-support。它是否甚至构建了一个工具链Otherwise, TOOLCHAIN_HOST_TASK` 将不起作用。为什么不将它添加到您的 SDK 构建而不是 meta-ide-support 在大多数情况下,应用程序构建在同一台机器上,在这台机器上可以使用完整的 Yocto 构建。在这些情况下,使用位于 Yocto 构建目录中的工具链和 sysroot 会更容易,而不是并行安装完整的 SDK。 meta-ide-support 创建一个脚本,我可以从 Yocto 构建目录外部获取该脚本来进行交叉编译。如果该脚本还设置了OEToolchainConfig.cmakecmake 别名的路径,那就太好了。 好吧,我个人认为使用 SDK 是个好主意,但您的实际情况可能会有所不同。您可能需要稍微破解系统才能实现您想要的。附带说明一下,一旦更新到 Pyro 或更高版本(pyro 将于今年春天发布),您很有可能必须更改工作流程。在 Pyro 中,不会有全局 sysroot,因为已经添加了特定于配方的 sysroot。 /usr/share/cmake 对我来说不存在,而 /usr/share/cmake-3.10 存在。我能做些什么?我使用 TOOLCHAIN_HOST_TASK 在图像中添加了 nativesdk-cmake。【参考方案2】:

我想补充一下 Anders 的回答,虽然以这种方式添加 nativesdk-cmake 对我来说效果很好,但当我尝试添加 nativesdk-python3-numpy 时它不起作用。经过一番谷歌搜索,我找到了this,这表明必须使用_append 而不是+= 来扩展TOOLCHAIN_HOST_TASK

【讨论】:

以上是关于带有 cmake 工具链文件的 Yocto SDK的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Yocto 生成适用于 Windows 的 SDK

cmake:ESP32交叉编译工具链定义

cmake/ASR1603:交叉编译工具链定义

在 Yocto 树中使用预构建的工具链

如何在 yocto 中使用外部工具链

在 Yocto 中使用 armhf 作为辅助工具链