【发布时间】:2020-07-09 08:39:32
【问题描述】:
我们的项目在多个平台上使用 CMake 构建,包括 Windows、Linux 和在某些嵌入式操作系统上的交叉编译,并使用自定义 CMake 工具链文件进行描述。
在交叉编译的情况下,我们必须维护一组预处理器宏。
它以下列方式反映在CMakeLists.txt中。
文件embedded_os1.toolchain.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
set(CMAKE_C_COMPILER /path/to/cross-compiler)
# blah-blah-blah
set(embedded_OS1 TRUE)
...我们有其他嵌入式操作系统的类似文件。
文件CMakeLists.txt
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
if(embedded_OS1)
add_definitions(-Dmacro1 -Dmacro2)
elseif(embedded_OS2)
add_definitions(-Dmacro3 -Dmacro4)
elseif(embedded_OS3)
add_definitions(-Dmacro1 -Dmacro4)
endif()
我想执行某种自动检查所有预处理器宏是否设置正确。
我可以通过 Windows 和 Linux 上的单元测试轻松做到这一点。
但是不可能在嵌入式操作系统上编译和运行可执行文件,我只能编译静态库,然后对其进行签名,放入固件映像等等等。除了库之外,我在 PC 上只有带有编译器调用的 JSON 文件,由 EXPORT_COMPILE_COMMANDS 生成。
你有什么建议?
【问题讨论】:
-
is no possibility to compile on embedded OSes?肯定有编译的可能,否则一切都将毫无意义。通常每个操作系统都会定义一些可以在代码中使用的宏,如__WIN__或__LINUX__或__ZEPHYR__,通常不需要放在cmake中。 -
我的意思是“轻松编译和运行可执行文件”。只有静态库。然后必须对其进行签名,放入固件映像等......我不知道所有细节。此外,PC 并不总是有连接的设备。
-
Only static library但你肯定可以编译。如果是这样#if defined embedded_OS1 && ( ! defined macro1 || ! defined macro2 ) #error "You have to define macro1 and macro2 for embeddedOS1"你可以编写预处理器宏。
标签: c++ unit-testing cmake c-preprocessor