目标
我想定义几个目标:

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

    并且能够在它们之间轻松切换。
    例如,我不希望每次切换时都重建我的所有对象,(当然,我必须第一次这样做,但是稍后如果我修改了一个文件并且我做了 make 然后 make 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 做这样的事情吗?

    最佳答案

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

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

  • 这意味着外源构建,无论如何 CMake 都鼓励这种构建。

    关于CMake,多个目标(asan tsan ..)而无需重新编译所有内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33799831/

    10-10 21:20
    查看更多