CMake的:目标“测试”不建立测试,目标“所有”

时间:2018-09-26 19:02:29

标签: unit-testing testing build cmake target

我创建了一个基于命令行的,基于脚本的便携式工业化不可知论构建系统,该系统可用于快速构建多个相关项目,而不必依赖特定的IDE或构建工厂。它是不可知的,因为它不是基于单个构建引擎。我使用cmake创建了第一个版本,因为我的项目主要是C ++,但是会不断发展(例如包含gradle或其他内容)。就是说,我并没有以CMake为中心,它仅仅是实现目标,易于移植的C ++项目构建的工具。我以前曾想过BJam,如果有更多文档,我会保留下来。

但是,结果是,我非常依赖CMake来执行构建和单元测试。从今天起,我意识到测试是在“全部”目标下构建的,并在“测试”目标下运行。

使用CMake 2-(例如,此处为Unix Makefiles生成器):

make all  # Build project AND tests
make test # Run tests

使用CMake 3+和任何生成器:

cmake --build . --target all  # Build project AND tests
cmake --build . --target test # Run tests

我想知道是否有人会知道一种将“构建项目”阶段与“构建测试”阶段分开的方法(也是因为在我的构建系统中加入测试构建和运行测试比在自然环境中感觉更自然)相反)。

重要的精度:我不想用一个或另一个视觉引导项目(通过翻转BUILD_TESTING)。这个想法将有3个阶段,例如:

cmake --build . --target <project>     # 1. Build project only
cmake --build . --target <build_tests> # 2. Build tests
cmake --build . --target <run_tests>   # 3. Run tests

如果我选择不运行测试,则可以从上面的第1阶段直接进行安装,但是运行第3阶段将触发以前的相关阶段。

有任何线索吗? (如果没有,我怀疑我将不得不直接问CMake开发人员...)

先谢谢了。问候。

1 个答案:

答案 0 :(得分:1)

假设您选择build_tests目标用于构建测试的可执行文件,并选择run_tests目标用于运行它们:

  1. 定义目标:

    add_custom_target(build_tests)
    # 'run_tests' triggers 'ctest'.
    add_custom_target(run_tests COMMAND ${CMAKE_CTEST_COMMAND})
    # 'run_tests' implies 'build_tests'
    add_dependencies(run_tests build_tests)
    
  2. 正在创建测试的可执行文件,因此默认情况下不会以build_tests为目标来构建它们。

    # Do not build 'test1' by default
    add_executable(test1 EXCLUDE_FROM_ALL ...)
    # 'build_tests' implies (among other things) building 'test1'
    add_dependencies(build_tests test1)