【问题标题】:Unit-tests for preprocessor macros for cross-compilation and CMake用于交叉编译和 CMake 的预处理器宏的单元测试
【发布时间】: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


【解决方案1】:

我会用#warning 宏来做,然后用 bash 来检查编译输出。然后您可以为这些文件设置Werror 并获得编译时检查。或者干脆使用#error(感谢KamilCuk)

另一种方法是深入检查有助于查看工具链是否具有线程或其他内容的检查二进制文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多