CMP0069¶
从第 3.9 版开始。
INTERPROCEDURAL_OPTIMIZATION
在启用时强制执行。
当 INTERPROCEDURAL_OPTIMIZATION
目标属性启用时,CMake 3.9 及更高版本更喜欢添加 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
模块检测 IPO 是否受当前编译器、环境和 CMake 版本支持。如果不可用,则生成致命错误
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)