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 未知 IPO 标志时产生错误。

此策略在 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)