CheckIPOSupported¶
版本 3.9 中添加。
此模块提供了一个命令,用于检查编译器是否支持过程间优化 (IPO/LTO)。
在 CMake 项目中加载此模块,使用
include(CheckIPOSupported)
过程间优化是一种编译器技术,它在翻译单元之间(即跨源文件)执行优化,允许编译器作为一个整体而不是逐个文件来分析和优化整个程序。这可以通过更积极的内联和死代码消除来提高性能。当这些优化在链接时应用时,该过程通常被称为链接时优化 (LTO),这是 IPO 的一种常见形式。
在 CMake 中,可以使用 INTERPROCEDURAL_OPTIMIZATION 目标属性在每个目标的基础上启用过程间优化,或者使用 CMAKE_INTERPROCEDURAL_OPTIMIZATION 变量在当前范围内为所有目标启用。
在目标上启用过程间优化之前使用此模块,以确保编译器支持 IPO/LTO。
命令¶
此模块提供以下命令
- check_ipo_supported¶
检查编译器是否支持过程间优化 (IPO/LTO)
check_ipo_supported( [RESULT <result-var>] [OUTPUT <output-var>] [LANGUAGES <lang>...] )
选项有
RESULT <result-var>如果编译器支持 IPO,则将
<result-var>变量设置为YES,否则设置为NO。如果未提供此选项,则在不支持 IPO 时,命令将发出致命错误。OUTPUT <output-var>使用有关任何错误的详细信息设置
<output-var>变量。LANGUAGES <lang>...指定要检查的编译器语言。
支持的语言如下
CCXXCUDA在 3.25 版本中新增。
Fortran
如果未提供此选项,则默认语言将从当前
ENABLED_LANGUAGES全局属性中选取。
注意
要使用
check_ipo_supported(),策略CMP0069必须设置为NEW;否则,将发生致命错误。3.13 版本新增: 支持 Visual Studio 生成器。
3.24 版本新增: 该检查使用调用者的
CMAKE_<LANG>_FLAGS和CMAKE_<LANG>_FLAGS_<CONFIG>值。请参阅策略CMP0138。
示例¶
检查编译器是否支持 IPO 并发出不支持的致命错误
include(CheckIPOSupported)
check_ipo_supported() # fatal error if IPO is not supported
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
以下示例演示了如何使用此模块在编译器支持的情况下为目标启用 IPO,并在不支持时发出警告。此外,项目可能希望提供一个配置选项来控制何时启用 IPO。例如
option(FOO_ENABLE_IPO "Enable IPO/LTO")
if(FOO_ENABLE_IPO)
include(CheckIPOSupported)
check_ipo_supported(RESULT result OUTPUT output)
if(result)
set_property(TARGET foo PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(WARNING "IPO is not supported: ${output}")
endif()
endif()