2016-12-16 242 views
2

之一,我有以下CMake的文件:禁用-Werror爲的CMakeLists.txt

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。

+1

所有變量目錄屬性被複制到子目錄的上下文中現在你調用'add_subdirectory()'。在此調用之前修改'CMAKE_CXX_FLAGS'或使用['add_compile_options()'](https://cmake.org/cmake/help/latest/command/add_compile_options.html)並修改['COMPILE_OPTIONS'](https://這個調用後的cmake.org/cmake/help/latest/prop_dir/COMPILE_OPTIONS.html)子目錄屬性。 – Florian

+0

@Florian不完全是我會說的重複。這個問題的答案包含在這個問題中,而不是其答案之一。 – Antonio

+0

@Antonio 所以我需要在這個問題中的例子:stackoverflow.com/questions/33828855/...? –

回答

2

談到我的意見爲答案

所有變量和目錄屬性在你打電話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) 

刪除,但你可以 - 在矛盾我第一條評論 - 更改標記僅在目標級別COMPILE_OPTIONS屬性中添加add_compile_options(),而不是完整目錄。創建目標時,該屬性按照原樣從目錄複製到目標,稍後更改目錄屬性不會自動更新目標的屬性。

如果您有支持SOURCE_DIR目標屬性則還可以通過一些瘋狂的發電機表達去一個新的CMake版本:

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

參考