如何配置/ hack 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中的所有目标
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,但也适用于 ninja):
您可以调用make install,它会make all_but_tests在构建完成后触发并安装。
您可以调用make my_tests,然后make install,在这种情况下,它将安装所有内容。您可以像这样连接命令
make my_tests && make install
或者,因为在这种情况下没有区别:
make [all] && make install
我被这个问题吸引了,因为我最近不得不面对一个类似的问题:只安装一个目标及其依赖项
编辑:
add_dependency(install all_but_tests)可能不会工作。
因此,要么使用适当的解决方法,要么调用
make all_but_tests && make install
每次你想安装“all_but_tests”
CMake仅在将install功能应用到可执行目标后才安装该可执行目标,即:
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin")
Run Code Online (Sandbox Code Playgroud)
为了防止在安装ExecutableTest了Release构建,增加CONFIGURATIONS限制:
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" CONFIGURATIONS Debug)
Run Code Online (Sandbox Code Playgroud)
另外,您可以创建ExecutableTest一个可选目标,默认情况下未构建该目标:
add_executable(ExecutableTest EXCLUDE_FROM_ALL ${ExecutableTestFiles})
Run Code Online (Sandbox Code Playgroud)
然后选择是否仅安装(ExecutableTest如果已明确构建):
install(TARGETS ExecutableTest RUNTIME DESTINATION "bin" OPTIONAL)
Run Code Online (Sandbox Code Playgroud)
可以将所有可选的测试目标合并到一个超级目标中,以允许一步构建它们:
add_custom_target(MyTests DEPENDS ExecutableTest ExecutableTest2 ExecutableTest3)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3591 次 |
| 最近记录: |