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

时间:2015-11-19 09:27:59

标签: 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)

是否可以使用CMake做这样的事情?

2 个答案:

答案 0 :(得分:6)

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

  • 按配置创建构建目录。
  • 使用您需要的参数在构建目录中配置项目。例如。 cmake -DCMAKE_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=thread" ..或您问题中的内容。
  • 如果您切换构建目录,则更改了设置。

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

答案 1 :(得分:1)

我相信你应该能够通过ExternalProject模块实现这一目标。您可以添加三个外部项目,一个用于msan,一个用于tsan,另一个用于基本GCC构建。两个杀菌剂构建将标记为EXCLUDE_FROM_ALL 1

他们三人的CMakeLists可以通过include()分享公共部分。

这样的事情:

Root CMakeLists.txt

ExternalProject_Add(msan
  EXCLUDE_FROM_ALL 1
  SOURCE_DIR msan
  CMAKE_GENERATOR ...
)

ExternalProject_Add(tsan
  EXCLUDE_FROM_ALL 1
  SOURCE_DIR tsan
  CMAKE_GENERATOR ...
)

ExternalProject_Add(normal
  SOURCE_DIR src
  CMAKE_GENERATOR ...
)

<强>的src /的CMakeLists.txt

include(common.cmake)

<强>的src / common.cmake

# Normal CMake code for your project
add_library(...)

<强> MSAN /的CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer")

include(../src/common.cmake)