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 属性启用时生效。该策略的 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 模块检测当前编译器、环境和 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)