CMake,多个目标(asan tsan ..),无需重新编译所有内容

moe*_*ryn 3 cmake target

目标 我想定义几个目标:

  • make msan:用clang和内存清理程序编译代码
  • make tsan:使用线程清理程序使用clang编译代码
  • make:使用gcc编译代码

并能够轻松地在它们之间切换.例如,我不希望每次切换重建我的所有对象,(我将不得不在第一次这样做,但后来如果我修改文件,我做了然后制作asan它应该只重新编译这个文件对于每个目标)

到目前为止我做了什么

我已经设法从根目录创建这些目标,但每次我必须做一个make clean并重新编译.

option(CLANG_MSAN "Enable Clang memory sanitizer" OFF)
if (CLANG_MSAN)
    set (CMAKE_CXX_FLAGS "-g -fsanitize=address -fno-omit-frame-pointer")
endif()

add_custom_target(asan
    COMMAND ${CMAKE_COMMAND}
    -DCLANG_MSAN=ON
    -DCMAKE_CXX_COMPILER=clang++
    -DCMAKE_C_COMPILER=clang)
Run Code Online (Sandbox Code Playgroud)

是否有可能用CMake做这样的事情?

usr*_*567 6

是的,但使用多个构建目录:

  • 根据配置创建构建目录.
  • 使用所需的参数在构建目录中配置项目.例如cmake -DCMAKE_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=thread" ..,你问题中的东西.
  • 如果切换构建目录,则更改了设置.

这意味着源外构建,无论如何都会受到CMake的鼓励.

  • @moeryn CMake强调源外构建.这对于避免使用可能发现自己意外添加到源代码管理的临时文件和输出文件来污染源目录非常有用.它也允许这一点,并行存在单独的构建配置. (3认同)