CMake中如何为测试程序配置生成文件的运行时依赖?
优化CMake测试程序的运行时依赖配置
你的问题很典型——add_dependencies(MyTest GenerateFile)确实会强制编译阶段就等待生成文件完成,但实际上你的测试程序只在运行时需要那个文件,完全没必要拖慢编译速度。下面给你两种针对性的解决方案,根据你的测试运行方式选择:
方案1:用CTest管理测试(推荐)
如果你的测试是通过add_test注册到CTest的,直接给测试用例设置运行依赖即可,不需要让编译目标绑定生成文件:
# 保留你的自定义命令和目标 add_custom_command( OUTPUT output.txt COMMAND your-generator-script-or-executable COMMENT "Generating required runtime file" ) add_custom_target(GenerateFile DEPENDS output.txt) # 编译测试程序,这里不再加add_dependencies! add_executable(MyTest test.cpp) # 注册测试,并设置测试运行前必须完成GenerateFile add_test(NAME RunMyTest COMMAND MyTest) set_tests_properties(RunMyTest PROPERTIES DEPENDS GenerateFile)
这样配置后:
- 编译
MyTest的时候,CMake不会等待GenerateFile完成,两者可以并行构建(如果你的构建系统支持并行) - 当你执行
ctest或者通过IDE运行测试时,CTest会自动先确保GenerateFile完成,再启动MyTest
方案2:自定义运行目标(直接执行二进制文件时用)
如果习惯直接通过构建目标运行测试(比如make RunMyTest),可以创建一个专门的运行目标,把GenerateFile作为这个目标的依赖,而不是绑定到MyTest的编译阶段:
# 同样保留自定义命令和目标 add_custom_command( OUTPUT output.txt COMMAND your-generator-script-or-executable COMMENT "Generating required runtime file" ) add_custom_target(GenerateFile DEPENDS output.txt) # 编译测试程序,无额外依赖 add_executable(MyTest test.cpp) # 创建专门的运行目标,依赖MyTest和GenerateFile add_custom_target(RunMyTest COMMAND MyTest DEPENDS MyTest GenerateFile COMMENT "Running MyTest with required runtime file" )
这种方式下:
- 单独编译
MyTest时(比如make MyTest),完全不会触发GenerateFile的构建 - 只有执行
make RunMyTest时,才会先确保MyTest编译完成、GenerateFile生成完毕,再启动测试程序
为什么原来的方式不好?
add_dependencies(A B)的作用是告诉CMake:构建目标A的所有步骤(编译、链接)必须在目标B构建完成后才能开始。而你的场景中,MyTest的编译完全不需要那个生成的文件,所以这个依赖是过度约束,白白浪费了并行构建的时间。我们要做的就是把约束从「编译阶段」移到「运行阶段」。
内容的提问来源于stack exchange,提问作者user1083696
相关产品推荐
相关产品推荐

