3

我们正在为嵌入式 ARM/Linux 设备编写应用程序。使用交叉编译器、Eclipse 和 Ninja 在 Windows PC 上进行开发。CMake 目前可以创建适合预期目的的构建脚本。

一旦项目被推送(通过 Git)到服务器,我们就会在连接到网络的嵌入式设备上运行单元测试。

在我们在设备上尝试之前,我们正在尝试实现可以​​在 PC 上运行的单元测试。这意味着使用 MinGW GCC 本地构建——当然我们不能在 PC 上启动 ARM Linux 可执行文件。

即使我们切换工具链,启动 CMake 为 Ninja 重建规则集,或者创建两个构建目录,一个用于 PC,一个用于 ARM,问题仍然是 CMake 将尝试运行测试可执行文件,然后在构建期间进行单元测试将在 ARM 版本上尝试。

我们如何配置构建(通过 CMake)来创建两者 - 而不是尝试在 PC 上运行交叉编译的构建?

4

1 回答 1

2

我的项目中有类似的设置(从相同的源构建模拟器、单元测试和目标二进制文件),您可以检查CMAKE_CROSSCOMPILING以区分您的两个用例。只是放

if (NOT CMAKE_CROSSCOMPILING)
    ....
endif()

围绕特定命令应该可以解决问题。

你需要有两个二进制输出目录。CMake 不允许在一个目录中混合工具链。

但是您不需要有两个 IDE 项目。在我的项目中:

  • 我已经添加了所有来源 - 包括。“仅交叉编译”文件 - 进入库/可执行目标
    • 对于仅限 PC 的变体,我将它们标记为“从构建中排除”
    • 所以所有的资源都将显示在一个 IDE 项目中(例如,用于搜索代码)
  • 我已将交叉编译调用添加为自定义目标
    • 我已将其从默认构建中删除,但您可以从 IDE 显式启动它
    • 在我的情况下,它是一个外部脚本,但您也可以直接在COMMAND参数中传递必要的调用
    • 您甚至可以使用另一个ExternalProject_Add()来包含您自己的项目以进行交叉编译

以下是这种方法的一些代码片段:

if (NOT CMAKE_CROSSCOMPILING)
    set(PC "ON" CACHE INTERNAL "hw-platform PC")
    unset(MCU CACHE)
else()
    set(MCU "ON" CACHE INTERNAL "hw-platform MCU")
    unset(PC CACHE)
endif()

...

if (PC)
    # Exclude files that only compile/work on MCU
    set_source_files_properties(... PROPERTIES HEADER_FILE_ONLY 1)
endif()

...

if (PC)
    add_test(...)
endif()

...

if (PC AND EXISTS "${CMAKE_SOURCE_DIR}/buildMcu.cmd")
    add_custom_target(
        BUILD_MCU
        COMMAND buildMcu.cmd
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    )
    set_target_properties(BUILD_MCU PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1)
endif()

参考

于 2016-05-25T11:40:54.733 回答