CMP0128¶
3.22 版本新增。
当此策略设置为 NEW 时
<LANG>_EXTENSIONS初始化为CMAKE_<LANG>_EXTENSIONS(如果已设置),否则回退到CMAKE_<LANG>_EXTENSIONS_DEFAULT。如果
<LANG>_STANDARD未设置或已由默认值满足,则扩展功能会被正确启用/禁用。除非为了达到指定模式必须添加,否则不会添加影响标准模式的标志。
OLD 行为
将
<LANG>_EXTENSIONS初始化为CMAKE_<LANG>_EXTENSIONS(如果已设置),否则回退到ON。如果设置了
<LANG>_STANDARD且<LANG>_STANDARD_REQUIRED为OFF,则总是添加一个标志。如果
<LANG>_STANDARD未设置即使
<LANG>_EXTENSIONS为OFF,也不会禁用扩展。除
IAR编译器外,如果<LANG>_EXTENSIONS为ON,则无法启用扩展。
在以下情况下,可能需要针对 NEW 行为更新代码:
如果某个标准模式标志以前被 CMake 覆盖,并且在编译器检测期间未使用,但现在由于 CMake 不再将其作为默认检测值添加(因为检测到的值是合适的)而生效。
此类代码应转换为:
使用
<LANG>_STANDARD和<LANG>_EXTENSIONS代替手动添加标志。或者确保手动指定的标志在编译器检测期间被使用。
如果是在未设置
<LANG>_STANDARD的情况下禁用了扩展,CMake 以前并不会真正禁用扩展。此类代码应更新为在需要时明确不禁用扩展。
如果在
<LANG>_STANDARD被编译器默认值满足时启用了/禁用了扩展,CMake 以前并不会真正启用/禁用扩展。此类代码应更新为设置正确的扩展模式。
如果在编译器检测期间使用了影响标准模式的编译器标志(例如在 工具链文件 中使用 CMAKE_<LANG>_FLAGS_INIT),则它们会影响检测到的默认 标准 和 扩展。
此策略是在 CMake 3.22 版本中引入的。它可以通过 cmake_policy() 或 cmake_minimum_required() 进行设置。如果未设置,CMake 默认不发出警告,并使用 OLD 行为。
请参阅 CMAKE_POLICY_WARNING_CMP0128 变量的文档以控制此警告。
注意
策略的 OLD 行为根据定义已被弃用,并可能在未来版本的 CMake 中被移除。