我试图修改某个目录下所有目录的编译器标志(即递归所有当前目录子目录及其所有子目录).所以我发现这里有两种方式:
add_directory(dir1)
# ...
add_directory(dirN)
add_compile_options(flag1 flag2 ...)
# or for CMake versions < 3.0 to do something more like:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} flag1 flag2 ...")
Run Code Online (Sandbox Code Playgroud)
手册页add_compile_options非常清楚地表明效果将是"当前目录及以下"(这是我想要的)但是set(CMAKE_CXX_FLAGS ...)我不太确定.
Cmake是否设置变量递归?
Flo*_*ian 11
简短的回答是,每个子目录都有自己的变量范围,并在add_subdirectory()调用时使用当前变量值的副本进行初始化.
对于长期答案,请参阅设置和使用变量的CMake语法是什么?
目录和目标属性vs(全局)变量
CMake 如何处理add_compile_options()和CMAKE_CXX_FLAGS处理之间存在差异:
您指定的所有内容都将add_compile_options()附加到COMPILE_OPTIONS目录属性.然后"使用或COMPILE_OPTIONS创建目标时,此属性用于初始化目标属性" .add_library()add_executable()
当解析器进入add_subdirectory()调用时,目录属性的当前状态用于初始化子目录属性.
这CMAKE_CXX_FLAGS是一个全局缓存变量.您可以通过定义本地目录作用域变量(隐藏全局缓存的变量)来扩展/覆盖它.
这些变量的上下文被复制到子目录范围内add_subdirectory()(传播到子目录).
并且CMake 在每个文件的末尾查看其值并将其CMakeLists.txt应用于相同的所有目标CMakeLists.txt(允许延迟声明,另请参阅下面的完整公式和测试代码).
因此,对于CMake的版本<3.0相当于add_compile_options()是add_definitions().功能仍然存在,但将定义与编译选项混合是很奇怪的.所以add_compile_options()被发明.
完整的编译器标志生成器公式
它在CMake的代码中(参见cmCommonTargetGenerator::GetFlags(),cmLocalGenerator::AddCompileOptions()和cmLocalGenerator::AddLanguageFlags()).
这个例子显示了一个DEBUG没有出口的构建配置库,没有考虑到像基于特征的标志或东西CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES或CMAKE_QUOTE_INCLUDE_PATHS:
CMAKE_CXX_FLAGS // as set at the end of target's CMakeLists.txt
+ CMAKE_CXX_FLAGS_DEBUG
+ Include Directories // pefixed with CMAKE_INCLUDE_FLAG_CXX/CMAKE_INCLUDE_SYSTEM_FLAG_CXX
(CMAKE_INCLUDE_CURRENT_DIR) ?
+ CMAKE_CURRENT_SOURCE_DIR + CMAKE_CURRENT_BINARY_DIR
+ CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES
+ Target[INCLUDE_DIRECTORIES]
+ DependingTargets[INTERFACE_INCLUDE_DIRECTORIES]
+ Define Flags // compiler flags given with add_definitions()
+ Target[COMPILE_FLAGS] // deprecated
- Filtered by CMAKE_CXX_FLAG_REGEX
+ Target[COMPILE_OPTIONS]
+ DependingTargets[INTERFACE_COMPILE_OPTIONS]
Run Code Online (Sandbox Code Playgroud)
测试代码
为了更好地理解这里是我的代码,用于测试编译器选项和我得到的结果:
注意:通常我会使用add_definitions()而target_compile_definitions()不是add_compile_options()和target_compile_options()来设置编译器定义,但是为了演示编译器选项I(mis-)使用-D标志的传播.
的CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(CxxFlagsTest)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCXX_FLAG")
add_compile_options("-DCOMPILE_OPTION")
add_subdirectory(lib)
file(WRITE main.cpp "int main() { return 0; }")
add_executable(main main.cpp)
target_link_libraries(main lib)
target_compile_options(main PRIVATE "-DMAIN_COMPILE_OPTION")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLATE_CXX_FLAG")
get_target_property(_main_compile_options main COMPILE_OPTIONS)
message(STATUS "main COMPILE_OPTIONS: ${_main_compile_options}")
get_directory_property(_root_compile_options COMPILE_OPTIONS)
message(STATUS "root COMPILE_OPTIONS: ${_root_compile_options}")
message(STATUS "root CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
LIB /的CMakeLists.txt
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSUB_CXX_FLAG")
add_compile_options("-DSUB_COMPILE_OPTION")
file(WRITE lib.cpp "")
add_library(lib lib.cpp)
target_compile_options(lib PUBLIC "-DLIB_COMPILE_OPTION")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLATE_SUB_CXX_FLAG")
get_target_property(_lib_compile_options lib COMPILE_OPTIONS)
message(STATUS "lib COMPILE_OPTIONS: ${_lib_compile_options}")
get_directory_property(_sub_compile_options COMPILE_OPTIONS)
message(STATUS "sub COMPILE_OPTIONS: ${_sub_compile_options}")
message(STATUS "sub CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
会导致以下消息:
-- lib COMPILE_OPTIONS: -DCOMPILE_OPTION;-DSUB_COMPILE_OPTION;-DLIB_COMPILE_OPTION
-- sub COMPILE_OPTIONS: -DCOMPILE_OPTION;-DSUB_COMPILE_OPTION
-- sub CMAKE_CXX_FLAGS: ... -DCXX_FLAG -DSUB_CXX_FLAG -DLATE_SUB_CXX_FLAG
-- main COMPILE_OPTIONS: -DCOMPILE_OPTION;-DMAIN_COMPILE_OPTION
-- root COMPILE_OPTIONS: -DCOMPILE_OPTION
-- root CMAKE_CXX_FLAGS: ... -DCXX_FLAG -DLATE_CXX_FLAG
Run Code Online (Sandbox Code Playgroud)
并设置了以下预处理器定义:
LIB
Run Code Online (Sandbox Code Playgroud)CXX_FLAG SUB_CXX_FLAG LATE_SUB_CXX_FLAG COMPILE_OPTION SUB_COMPILE_OPTION LIB_COMPILE_OPTION
主要
Run Code Online (Sandbox Code Playgroud)CXX_FLAG LATE_CXX_FLAG COMPILE_OPTION MAIN_COMPILE_OPTION LIB_COMPILE_OPTION
这里有趣的部分是LATECXX标志和LIB传播链接库的编译选项.
参考
| 归档时间: |
|
| 查看次数: |
2907 次 |
| 最近记录: |