CMP0069

从第 3.9 版开始。

INTERPROCEDURAL_OPTIMIZATION 在启用时强制执行。

INTERPROCEDURAL_OPTIMIZATION 目标属性启用时,CMake 3.9 及更高版本更喜欢添加 IPO 标志,并且如果 CMake 未知当前编译器的标志,则会产生错误。由于给定编译器可能无法在使用它的所有环境中支持 IPO 标志,现在由项目负责在启用 INTERPROCEDURAL_OPTIMIZATION 目标属性之前先使用 CheckIPOSupported 模块来检查是否支持。这种方法允许项目在支持时有条件地激活 IPO。它还允许最终用户在已知支持 IPO 的环境中设置 CMAKE_INTERPROCEDURAL_OPTIMIZATION 变量,即使项目未启用该属性。

由于 CMake 3.8 及更低版本仅针对 Linux 上的 Intel 编译器支持 INTERPROCEDURAL_OPTIMIZATION,因此一些项目可能会无条件地启用目标属性。策略 CMP0069 为此类项目提供了兼容性。

每当启用 IPO 属性时,此策略就会生效。此策略的 OLD 行为是仅为 Linux 上的 Intel 编译器添加 IPO 标志。此策略的 NEW 行为是为当前编译器添加 IPO 标志,或者如果 CMake 不知道这些标志,则会产生错误。

该策略在 CMake 3.9 版本中引入。可通过 cmake_policy()cmake_minimum_required() 设置。如果未进行设置,CMake 将发出警告并使用 OLD 行为。

备注

策略的 OLD 行为 默认情况下 已弃用,并且可能会在未来版本的 CMake 中移除。

示例

表现如 CMake 3.8 并仅对 Linux 上的 Intel 编译器应用 IPO 标志

cmake_minimum_required(VERSION 3.8)
project(foo)

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

使用 CheckIPOSupported 模块检测 IPO 是否受当前编译器、环境和 CMake 版本支持。如果不可用,则生成致命错误

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

include(CheckIPOSupported)
check_ipo_supported()

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

仅在编译器支持时应用 IPO 标志

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

include(CheckIPOSupported)

# ...

check_ipo_supported(RESULT result)
if(result)
  set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
endif()

不执行任何检查,便应用 IPO 标志。如果 IPO 不受当前环境中的编译器支持,这可能会导致生成错误。如果 CMake 不了解当前编译器的 IPO 标志,则生成错误

cmake_minimum_required(VERSION 3.9) # CMP0069 NEW
project(foo)

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)