目标 我想定义几个目标:
能够轻松地在它们之间切换。 例如,我不希望每次切换重建我的所有对象时,(我必须在第一次这样做时,但是后来如果我修改了一个文件并且我做了然后制作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做这样的事情?
答案 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)