如何在 CMake 中为外部 INTERFACE_SOURCES 设置编译标志?
How to set compile flags for external INTERFACE_SOURCES in CMake?
我在 cmake 中使用了一个外部包,它使用 INTERFACE_SOURCES。这意味着当我 link 导入库到我的目标时,接口源文件会自动添加到我的目标。当我编译我的目标时,那些外部文件也被编译了。
这给我带来了麻烦,因为外部文件会导致编译警告。我想在编译外部文件时通过设置较低的警告级别来删除警告。但是我不知道该怎么做。
这是我目前得到的。
# reduce the warning level for some files over which we have no control.
macro( remove_warning_flags_for_some_external_files myTarget )
# blacklist of files that throw warnings
set( blackListedExternalFiles
static_qt_plugins.cpp
)
get_target_property( linkedLibraries ${myTarget} LINK_LIBRARIES )
foreach(library ${linkedLibraries})
get_property( sources TARGET ${library} PROPERTY INTERFACE_SOURCES )
foreach(source ${sources})
get_filename_component(shortName ${source} NAME)
if( ${shortName} IN_LIST blackListedExternalFiles)
# everything works until here
# does not work
get_source_file_property( flags1 ${source} COMPILE_FLAGS)
# does not work
get_property(flags2 SOURCE ${source} PROPERTY COMPILE_FLAGS)
# exchange flags in list, this I can do
# set flags to source file, do not know how to
endif()
endforeach()
endforeach()
endmacro()
这就是它应该做的
- 浏览所有 linked 库并获取外部 INTERFACE_SOURCES 源文件。
- 检查每个外部源文件是否出现在黑名单中。如果是这样,将其编译标志更改为较低级别。
我遇到的问题是获取和设置那些 INTERFACE_SOURCES 的编译标志。 get_source_file_property() 和 get_property() 什么都不调用 return。
如何为这些似乎不属于我的目标但同时编译的文件获取和设置标志?
The get_source_file_property() and get_property() calls return nothing
COMPILE_FLAGS property of source file is not modified by "target" commands like target_compile_options。最后一组标志是全局+目标特定+源特定的混合。据我了解,无法关闭 "inheriting" 全局或目标标志。
作为解决方法,您可以通过添加 -w
选项来禁用警告:
get_source_file_property(flags "${external_source}" COMPILE_FLAGS)
if(NOT flags)
set(flags "") # convert "NOTFOUND" to "" if needed
endif()
set_source_files_properties(
"${external_source}"
PROPERTIES
COMPILE_FLAGS "-w ${flags}"
)
仅供参考:How to set warning level in CMake?。
备案:最初来自 issue #408。
我在 cmake 中使用了一个外部包,它使用 INTERFACE_SOURCES。这意味着当我 link 导入库到我的目标时,接口源文件会自动添加到我的目标。当我编译我的目标时,那些外部文件也被编译了。
这给我带来了麻烦,因为外部文件会导致编译警告。我想在编译外部文件时通过设置较低的警告级别来删除警告。但是我不知道该怎么做。
这是我目前得到的。
# reduce the warning level for some files over which we have no control.
macro( remove_warning_flags_for_some_external_files myTarget )
# blacklist of files that throw warnings
set( blackListedExternalFiles
static_qt_plugins.cpp
)
get_target_property( linkedLibraries ${myTarget} LINK_LIBRARIES )
foreach(library ${linkedLibraries})
get_property( sources TARGET ${library} PROPERTY INTERFACE_SOURCES )
foreach(source ${sources})
get_filename_component(shortName ${source} NAME)
if( ${shortName} IN_LIST blackListedExternalFiles)
# everything works until here
# does not work
get_source_file_property( flags1 ${source} COMPILE_FLAGS)
# does not work
get_property(flags2 SOURCE ${source} PROPERTY COMPILE_FLAGS)
# exchange flags in list, this I can do
# set flags to source file, do not know how to
endif()
endforeach()
endforeach()
endmacro()
这就是它应该做的
- 浏览所有 linked 库并获取外部 INTERFACE_SOURCES 源文件。
- 检查每个外部源文件是否出现在黑名单中。如果是这样,将其编译标志更改为较低级别。
我遇到的问题是获取和设置那些 INTERFACE_SOURCES 的编译标志。 get_source_file_property() 和 get_property() 什么都不调用 return。
如何为这些似乎不属于我的目标但同时编译的文件获取和设置标志?
The get_source_file_property() and get_property() calls return nothing
COMPILE_FLAGS property of source file is not modified by "target" commands like target_compile_options。最后一组标志是全局+目标特定+源特定的混合。据我了解,无法关闭 "inheriting" 全局或目标标志。
作为解决方法,您可以通过添加 -w
选项来禁用警告:
get_source_file_property(flags "${external_source}" COMPILE_FLAGS)
if(NOT flags)
set(flags "") # convert "NOTFOUND" to "" if needed
endif()
set_source_files_properties(
"${external_source}"
PROPERTIES
COMPILE_FLAGS "-w ${flags}"
)
仅供参考:How to set warning level in CMake?。
备案:最初来自 issue #408。