首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake,多目标(asan .)而不必重新编译所有

CMake,多目标(asan .)而不必重新编译所有
EN

Stack Overflow用户
提问于 2015-11-19 09:27:59
回答 2查看 3.6K关注 0票数 3

目标我想定义几个目标:

  • msan:用内存清除器用clang编译代码
  • make :用线程杀菌剂clang编译代码
  • make :用gcc编译代码

并能很容易地在他们之间切换。例如,我不希望每次切换都重建我的所有对象,(当然,我必须在第一次这样做,但是以后如果我修改了一个文件,并且我做了,然后做了,因为它应该只对每个目标重新编译这个文件)

我到目前为止所做的一切

我已经成功地从根目录创建了这些目标,但是每次我都必须做一个make干净并重新编译。

代码语言:javascript
复制
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可以做这样的事情吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-19 09:33:09

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

  • 根据配置创建一个生成目录。
  • 使用所需参数配置生成目录中的项目。例如cmake -DCMAKE_COMPILER=clang -DCMAKE_C_FLAGS="-fsanitize=thread" ..或你问题中的内容。
  • 如果切换生成目录,则更改设置。

这意味着源代码外的构建,无论如何都是由CMake鼓励的。

票数 6
EN

Stack Overflow用户

发布于 2015-11-19 09:41:28

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

所有三个人的CMakeLists都可以通过include()共享公共部分。

就像这样:

根CMakeLists.txt

代码语言:javascript
复制
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

代码语言:javascript
复制
include(common.cmake)

src/common.cmake

代码语言:javascript
复制
# Normal CMake code for your project
add_library(...)

msan/CMakeLists.txt

代码语言:javascript
复制
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -fno-omit-frame-pointer")

include(../src/common.cmake)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33799831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档