我有以下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)

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

最佳答案

把我的评论变成答案

在调用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")

或使用“旧方法”,即可以使用add_definitions()给出编译器标志,并使用remove_definitions()删除编译器标志
add_definitions(-std=c++11 -Wall -Werror)
...
remove_definitions(-Werror)
add_subdirectory(test_app1)
add_definitions(-Werror)

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

如果您具有支持SOURCE_DIR target属性的较新的CMake版本,则可以选择使用一些疯狂的生成器表达式:
add_compile_options(
    -std=c++11
    -Wall
    $<$<NOT:$<STREQUAL:$<TARGET_PROPERTY:SOURCE_DIR>,${CMAKE_SOURCE_DIR}/test_app1>>:-Werror>
)

引用
  • Is Cmake set variable recursive?
  • 关于cmake - 为CMakeLists.txt之一禁用-Werror,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41182827/

    10-10 15:34