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>...

指定要检查其编译器的语言。

支持以下语言

  • C

  • CXX

  • CUDA

    在 3.25 版本中新增。

  • Fortran

如果未给出此选项,则从当前的 ENABLED_LANGUAGES 全局属性中选择默认语言。

注意

要使用 check_ipo_supported(),策略 CMP0069 必须设置为 NEW;否则,将发生致命错误。

在 3.13 版本中添加: 支持 Visual Studio 生成器

在 3.24 版本中添加: 检查使用调用者的 CMAKE_<LANG>_FLAGSCMAKE_<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()