CMP0069

添加于 3.9 版本。

INTERPROCEDURAL_OPTIMIZATION 在启用时强制执行。

CMake 3.9 及更高版本倾向于在启用 INTERPROCEDURAL_OPTIMIZATION 目标属性时添加 IPO 标志,并且如果 CMake 不知道当前编译器的标志,则会产生错误。由于给定的编译器可能在其使用的所有环境中都不支持 IPO 标志,因此现在项目有责任在使用 CheckIPOSupported 模块检查支持情况,然后再启用 INTERPROCEDURAL_OPTIMIZATION 目标属性。这种方法允许项目在支持时有条件地激活 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 行为根据定义是 deprecated by definition,并且可能会在未来的 CMake 版本中删除。

示例

表现得像 CMake 3.8,并且除了 Linux 上的 Intel 编译器之外,不应用任何 IPO 标志

cmake_minimum_required(VERSION 3.8)
project(foo)

# ...

set_property(TARGET ... PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)

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

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)