为 CMakeLists.txt 之一禁用 -Werror

Vol*_*iuk 7 cmake

我有以下 CMake 文件:

project(MyLib)
cmake_minimum_required(VERSION 2.8)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "release")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror")
set(ROOT_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ROOT_DIR}/bin/${CMAKE_BUILD_TYPE})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ROOT_DIR}/bin/${CMAKE_BUILD_TYPE})
set(MAIN_LIBRARY_NAME "mylib")

add_subdirectory(src)
add_subdirectory(test_app)
add_subdirectory(test_app1) <--- I want to disable -Werror flag for CMakeLists.txt in this folder.
add_subdirectory(test_app2)
Run Code Online (Sandbox Code Playgroud)

如何禁用子目录之一的 -Werror 标志?在每个子目录中,我也有 CMakeLists.txt。

Flo*_*ian 7

把我的评论变成答案

在您调用add_subdirectory(). CMAKE_CXX_FLAGS在此调用之前使用类似的内容进行修改

string(REPLACE " -Werror" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
add_subdirectory(test_app1) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
Run Code Online (Sandbox Code Playgroud)

或者使用“旧方式”编译器标志可以add_definitions()remove_definitions()

add_definitions(-std=c++11 -Wall -Werror)
...
remove_definitions(-Werror)
add_subdirectory(test_app1)
add_definitions(-Werror)
Run Code Online (Sandbox Code Playgroud)

但是您可以 - 与我的第一条评论相反 - 更改add_compile_options()仅添加到目标级别COMPILE_OPTIONS属性而不是完整目录的标志。创建目标时,属性按原样从目录复制到目标,以后更改目录属性不会自动更新目标的属性。

如果您有支持SOURCE_DIR目标属性的较新 CMake 版本,您也可以使用一些疯狂的生成器表达式:

add_compile_options(
    -std=c++11 
    -Wall 
    $<$<NOT:$<STREQUAL:$<TARGET_PROPERTY:SOURCE_DIR>,${CMAKE_SOURCE_DIR}/test_app1>>:-Werror>
)
Run Code Online (Sandbox Code Playgroud)

参考