如何配置/破解 cmake 以构建使用 add_executable() 添加的特定可执行文件但不安装它?
可执行文件是一个单元测试,最终将使用 add_test 处理,但现在我只想从版本中剥离测试二进制文件,尽可能少地接触。
谢谢
如何配置/破解 cmake 以构建使用 add_executable() 添加的特定可执行文件但不安装它?
可执行文件是一个单元测试,最终将使用 add_test 处理,但现在我只想从版本中剥离测试二进制文件,尽可能少地接触。
谢谢
由于 EXCLUDE_FROM_ALL与 INSTALL 结合使用时具有未定义的行为(cmake 会尝试警告您,是否设置了 OPTIONAL 无关紧要),保证工作的解决方案更加复杂。
你应该:
删除“安装”目标对“全部”目标的依赖(一次,在主 CMakeLists.txt 中):
set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true)
将 OPTIONAL 添加到测试库中的 INSTALL 语句。请注意我在此处报告的 CMake 可能存在的错误
根据正在构建的整个项目,分别收集要包含在自定义“all_but_tests”CMake add_custom_target 中的所有目标 (最困难的步骤)
创建一个自定义 all_but_tests 目标:
add_custom_target(all_but_tests DEPENDS <<list of targets>>)
将目标安装的依赖项添加到 all_but_tests
add_dependency(install all_but_tests)
(对不起,这个我没试过,欢迎反馈)
创建自定义测试目标:
add_custom_target(my_tests DEPENDS <<list of tests>>)
然后(假设您使用的是 make,但也适用于忍者):
您可以调用make install
,它会触发make all_but_tests
,并在构建完成后安装。
您可以调用make my_tests
, 然后make install
, 在这种情况下它将安装所有内容。您可以像这样连接命令
make my_tests && make install
或者,因为在这种情况下没有区别:
make [all] && make install
我被这个问题所吸引是因为我最近不得不面对一个类似的问题:Installing only one target and its dependencies
编辑:
add_dependency(install all_but_tests)
可能行不通。
因此,要么使用适当的解决方法,要么调用
make all_but_tests && make install
每次你想安装“all_but_tests”
如果您将函数应用到它,CMake 只会安装一个可执行目标install
,即:
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin")
要防止安装ExecutableTest
forRelease
构建,请添加CONFIGURATIONS
限制:
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" CONFIGURATIONS Debug)
或者,您可以创建ExecutableTest
一个默认不构建的可选目标:
add_executable(ExecutableTest EXCLUDE_FROM_ALL ${ExecutableTestFiles})
然后可选地仅安装ExecutableTest
它是否已明确构建:
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" OPTIONAL)
所有可选的测试目标都可以集中在一个超级目标中,以便一步构建它们:
add_custom_target(MyTests DEPENDS ExecutableTest ExecutableTest2 ExecutableTest3)