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 编译器,一些项目可能会无条件启用该目标属性。策略 CMP0069 提供了与此类项目兼容的机制。

此策略在启用 IPO 属性时生效。OLD 行为只为 Linux 上的 Intel 编译器添加 IPO 标志。此策略的 NEW 行为是为当前编译器添加 IPO 标志,或者在 CMake 未知标志时报错。

此策略在 CMake 版本 3.9 中引入。它可以由 cmake_policy()cmake_minimum_required() 设置。如果未设置,CMake 会发出警告并使用 OLD 行为。

注意

策略的 OLD 行为 根据定义已被弃用,并可能在未来的 CMake 版本中被移除。

示例

表现得像 CMake 3.8 一样,不应用任何 IPO 标志,除非是 Linux 上的 Intel 编译器

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)