基于 cmake 的 bitbake 配方:缺少 sysroot?
cmake based bitbake recipe : sysroot missing?
我觉得我一定是在做一些根本性的错误。我基于 cmake 项目创建了一个食谱。使用创建的工具链 yocto 编译项目非常简单 运行 cmake 然后 make 但是它无法使用配方编译:
SUMMARY = "Opendnp3 is the de facto reference implementation of IEEE-1815 (DNP3)"
DESCRIPTION = "Opendnp3 is a portable, scalable, and rigorously tested implementation of the DNP3 (www.dnp.org) protocol stack written in C++11. The library is designed for high-performance applications like many concurrent TCP sessions or huge device simulations. It also embeds very nicely on Linux."
HOMEPAGE = "https://www.automatak.com/opendnp3"
SECTION = "libs"
DEPENDS = "asio"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://NOTICE;md5=9788d3abe6c9401d72fdb3717de33e6a"
SRCREV = "e00ff31b837821064e5208c15866a9d46f8777b1"
SRC_URI = "git://github.com/automatak/dnp3;branch=2.0.x"
S = "${WORKDIR}/git"
inherit cmake
EXTRA_OECMAKE += ""
问题是我认为用于 g++ 的 CXXFLAGS 似乎与工具链环境定义的 CXXFLAGS 不一致。主要是缺少 --sysroot 并且 g++ 无法找到标准的 c++ headers(例如:cstdint)。
我通过删除 -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake[=34 从 cmake.bbclas 覆盖 do_configure 部分解决了这个问题=].事实上,CXXFLAGS 由 toolchain.cmake 定义为:
-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0=/usr/src/debug/dnp3/2.2.0-r0 -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot-native= -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot= -fvisibility-inlines-hidden -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
所以 sysroot 定义(实际上是两次)为:
/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
但不会出现在由 cmake 生成的 Makefile 中,所以我猜 toolchain.cmake 中的某些内容会使项目的 cmake 配置出错。
原来是项目本身的cmake问题。在其中一个包含的 .cmake 配置文件中,C 和 CXX 标志之间有一个有趣的 mix-up。我将向维护者提交拉取请求。 CXXFLAGS 在 SDK(直接包含在 CXX 命令中)和 bitbake 之间的处理方式不同,解释了为什么它与 SDK 一起工作(仍然不太确定为什么它在没有 toolchain.cmake 的情况下工作)。
谢谢。
--sysroot
从 CXXFLAGS
中丢失,因为 yocto 将它填充在 CXX
变量本身中。请注意,在 sysroots
目录旁边,yocto 将有一个 environment-setup-XXX
文件,您应该获取该文件。这就是所有 sysroot 的来源。
我觉得我一定是在做一些根本性的错误。我基于 cmake 项目创建了一个食谱。使用创建的工具链 yocto 编译项目非常简单 运行 cmake 然后 make 但是它无法使用配方编译:
SUMMARY = "Opendnp3 is the de facto reference implementation of IEEE-1815 (DNP3)"
DESCRIPTION = "Opendnp3 is a portable, scalable, and rigorously tested implementation of the DNP3 (www.dnp.org) protocol stack written in C++11. The library is designed for high-performance applications like many concurrent TCP sessions or huge device simulations. It also embeds very nicely on Linux."
HOMEPAGE = "https://www.automatak.com/opendnp3"
SECTION = "libs"
DEPENDS = "asio"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://NOTICE;md5=9788d3abe6c9401d72fdb3717de33e6a"
SRCREV = "e00ff31b837821064e5208c15866a9d46f8777b1"
SRC_URI = "git://github.com/automatak/dnp3;branch=2.0.x"
S = "${WORKDIR}/git"
inherit cmake
EXTRA_OECMAKE += ""
问题是我认为用于 g++ 的 CXXFLAGS 似乎与工具链环境定义的 CXXFLAGS 不一致。主要是缺少 --sysroot 并且 g++ 无法找到标准的 c++ headers(例如:cstdint)。
我通过删除 -DCMAKE_TOOLCHAIN_FILE=${WORKDIR}/toolchain.cmake[=34 从 cmake.bbclas 覆盖 do_configure 部分解决了这个问题=].事实上,CXXFLAGS 由 toolchain.cmake 定义为:
-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0=/usr/src/debug/dnp3/2.2.0-r0 -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot-native= -fdebug-prefix-map=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot= -fvisibility-inlines-hidden -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a8 --sysroot=/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
所以 sysroot 定义(实际上是两次)为:
/home/star/moxa-build/tmp/work/cortexa8hf-neon-poky-linux-gnueabi/dnp3/2.2.0-r0/recipe-sysroot
但不会出现在由 cmake 生成的 Makefile 中,所以我猜 toolchain.cmake 中的某些内容会使项目的 cmake 配置出错。
原来是项目本身的cmake问题。在其中一个包含的 .cmake 配置文件中,C 和 CXX 标志之间有一个有趣的 mix-up。我将向维护者提交拉取请求。 CXXFLAGS 在 SDK(直接包含在 CXX 命令中)和 bitbake 之间的处理方式不同,解释了为什么它与 SDK 一起工作(仍然不太确定为什么它在没有 toolchain.cmake 的情况下工作)。
谢谢。
--sysroot
从 CXXFLAGS
中丢失,因为 yocto 将它填充在 CXX
变量本身中。请注意,在 sysroots
目录旁边,yocto 将有一个 environment-setup-XXX
文件,您应该获取该文件。这就是所有 sysroot 的来源。