未在CMake中填充COMPILE_OPTIONS属性

时间:2018-12-19 00:25:19

标签: c++ cmake

我正在尝试从目标中检索当前的编译标志(这是来自CMAKE_CXX_FLAGS_RELWITHDEBINFO的默认标志),以打印它们,然后替换这些标志之一,并设置已更改的标志列表通过target_compile_options。然而,这篇文章只是关于编译选项的第一部分。我已经在下面的代码中在注释中添加了问题/问题:

cmake_minimum_required(VERSION 3.13.2)
project(hello)
add_executable(hello WIN32 hello.cpp)

# target_compile_options(hello PUBLIC "$<$<CONFIG:RELWITHDEBINFO>:/Od>")
# (see below comment for this)

get_property(HELLO_GLOBAL_COMPILE_OPTIONS GLOBAL PROPERTY COMPILE_OPTIONS) # both GLOBAL and DIRECTORY return an empty variable
message(${HELLO_GLOBAL_COMPILE_OPTIONS})
# 1) => This returns an empty variable. Shouldn't this have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO?

get_target_property(HELLO_COMPILE_OPTIONS hello COMPILE_OPTIONS)
get_target_property(HELLO_COMPILE_OPTIONS_INTERFACE hello INTERFACE_COMPILE_OPTIONS)
message(${HELLO_COMPILE_OPTIONS})
message(${HELLO_COMPILE_OPTIONS_INTERFACE})
# 2) => These both print HELLO_COMPILE_OPTIONS-NOTFOUND. Shouldn't they have been populated with the contents of CMAKE_CXX_FLAGS_RELWITHDEBINFO at this stage?

message(${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
# This prints as expected, "/MD /Zi /O2 /Ob1 /DNDEBUG" (for MSVC).

3)如果我在第5行取消注释target_compile_options,则HELLO_COMPILE_OPTIONS返回$<$<CONFIG:RELWITHDEBINFO>:/Od>。但是它是否还应该从CMAKE_CXX_FLAGS_RELWITHDEBINFO返回“全局”标志吗? 因为hello可执行文件是用 both 和全局标记以及附加到hello目标的标记进行编译的。

4)可能相关:prop_tgt:COMPILE_OPTIONS documentation“此属性在创建目标时由COMPILE_OPTIONS目录属性初始化,并且供生成器用来设置编译器的选项。” prop_dir:COMPILE_OPTIONS documentation“创建目标时,此属性用于初始化COMPILE_OPTIONS目标属性,生成器使用该属性来设置编译器的选项。” 。 / p>

所以我要做的是以下内容。我想获取RELWITHDEBINFO配置的cmake-default编译标志。然后,对于一个特定的目标,我想将/O2替换为/Od(默认值),并将该目标的编译选项设置为这些修改的目标。

在不修改全局标志(非常不好的做法)或向目标两次添加编译选项的情况下,我似乎找不到解决方法。

1 个答案:

答案 0 :(得分:0)

1)不,COMPILE_OPTIONS是目标属性。没有全局版本,也找不到。

2)否,在定义目标之前,这些文件会通过add_compile_options使用directory属性进行初始化。那不在脚本中,根本不使用CMAKE_CXX_FLAGS_RELWITHDEBINFO。因此,没有定义目标属性。

3)不,因为CMAKE_CXX_FLAGS_RELWITHDEBINFO是变量而不是属性,并且没有文档说明属性由任何变量初始化。

4)这就是为什么答案为“否”且在初始化属性时未提及变量的原因。

5)您可以执行此操作,但这是必需的。当生成器收集所有不同的编译选项时,它既来自变量又来自属性。因此,您要做的只是添加冗余选项和新选项。它不会取代旧的。

这个问题似乎与昨天提出的问题有关。 How to override optimization level flag in modern CMake