CMP0069

在 3.9 版本加入.

INTERPROCEDURAL_OPTIMIZATION 在启用时强制执行。

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

由于 CMake 3.8 及更低版本仅支持 Linux 上的 Intel 编译器的 INTERPROCEDURAL_OPTIMIZATION,因此某些项目可能会无条件启用目标属性。政策“CMP0069”提供与此类项目的兼容性。

只要启用 IPO 属性,此策略就会生效。此策略的“旧”行为是仅为 Linux 上的英特尔编译器添加 IPO 标志。此策略的“新”行为是为当前编译器添加 IPO 标志,或者如果 CMake 不知道这些标志则产生错误。

此策略是在 CMake 版本 3.9 中引入的。 CMake 版本 |发布|当未设置策略并使用“旧”行为时发出警告。使用 cmake_policy() 命令将其显式设置为 OLDNEW

备注

策略的“旧”行为是 :manual:根据定义 <cmake-policies(7)> 已弃用,并且可能会在未来版本的 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)