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 版本中被移除。