Build CMake-本机编译和交叉编译相同的代码
我们正在为嵌入式ARM/Linux设备编写一个应用程序。开发是在Windows PC上执行的,使用交叉编译器、Eclipse和Ninja。CMake目前可以创建适合预期用途的构建脚本 一旦项目(通过Git)推送到服务器上,我们就可以在连接到网络的嵌入式设备上运行单元测试 我们正在尝试在设备上进行单元测试之前,先在PC上进行单元测试。这意味着使用mingwgcc进行本地构建——当然,我们不能在PC上启动ARM Linux可执行文件 即使我们切换工具链,启动CMake为Ninja重建规则集,或者创建两个构建目录,一个用于PC,一个用于ARM,问题仍然是CMake将尝试运行测试可执行文件,稍后在构建期间,将在ARM构建上尝试单元测试Build CMake-本机编译和交叉编译相同的代码,build,cmake,cross-compiling,ninja,Build,Cmake,Cross Compiling,Ninja,我们正在为嵌入式ARM/Linux设备编写一个应用程序。开发是在Windows PC上执行的,使用交叉编译器、Eclipse和Ninja。CMake目前可以创建适合预期用途的构建脚本 一旦项目(通过Git)推送到服务器上,我们就可以在连接到网络的嵌入式设备上运行单元测试 我们正在尝试在设备上进行单元测试之前,先在PC上进行单元测试。这意味着使用mingwgcc进行本地构建——当然,我们不能在PC上启动ARM Linux可执行文件 即使我们切换工具链,启动CMake为Ninja重建规则集,或者创建
我们如何配置构建(通过CMake)来创建二者,而不尝试在PC上运行交叉编译的构建?我的项目中有类似的设置(从相同的源构建模拟器、单元测试和目标二进制文件),您可以检查以区分两个用例。只是放
if (NOT CMAKE_CROSSCOMPILING)
....
endif()
围绕着特定的命令应该做到这一点
您需要有两个二进制输出目录。CMake不允许在一个目录中混合使用工具链
但是您不需要有两个IDE项目。在我的项目中:
- 我已将所有源代码(包括“仅交叉编译”文件)添加到库/可执行目标中
- 我将它们标记为仅适用于PC的变体的“排除在构建之外”
- 因此,所有源都将显示在一个IDE项目中(例如,用于搜索代码)
- 我已将交叉编译调用添加为自定义目标
- 我已经从默认版本中删除了它,但是您可以从IDE显式地启动它
- 在我的例子中,它是一个外部脚本,但您也可以直接在
命令中传递必要的调用
- 您甚至可以使用另一个
包含您自己的项目进行交叉编译ExternalProject\u 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()
参考资料
add_custom_命令(目标…后期构建…
和/或使用add_test()
?我认为在这两种情况下,只要在这个特定命令周围加一个if(而不是CMAKE\u交叉编译)
endif()
就可以了。@Florian:在顶级的CMakeLists.txt中,只有ADD\u子目录(UnitTests)
。然后在目录中有ExternalProject\u Add(GMockDownload GIT\u REPOSITORY)https://github.com/google/googletest.git“…
由谁来完成其余的工作。是,如果(不是CMAKE_交叉编译)
在这方面很有帮助。两个独立的构建目录和两次启动cmake似乎是最好的选择。这不是最佳选择,因为我得到了两个Eclipse项目,而不仅仅是两个构建配置。