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,也不会禁用扩展。如果
<LANG>_EXTENSIONS为ON,除了IAR编译器之外,无法启用扩展。
在以下情况下,代码可能需要更新以适应 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 的未来版本中移除。