summaryrefslogtreecommitdiffstats
path: root/Help/policy/CMP0128.rst
blob: b894ce1fd7f243b40108ced4a7130f2aade48dfe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
CMP0128
-------

.. versionadded:: 3.22

When this policy is set to ``NEW``:

* :prop_tgt:`<LANG>_EXTENSIONS` is initialized to
  :variable:`CMAKE_<LANG>_EXTENSIONS` if set, otherwise falling back to
  :variable:`CMAKE_<LANG>_EXTENSIONS_DEFAULT`.

* Extensions are correctly disabled/enabled if :prop_tgt:`<LANG>_STANDARD` is
  unset.

* Standard mode-affecting flags aren't added unless necessary to achieve the
  specified mode.

The ``OLD`` behavior:

* Initializes :prop_tgt:`<LANG>_EXTENSIONS` to
  :variable:`CMAKE_<LANG>_EXTENSIONS` if set, otherwise falling back to ``ON``.

* Always adds a flag if :prop_tgt:`<LANG>_STANDARD` is set and
  :prop_tgt:`<LANG>_STANDARD_REQUIRED` is ``OFF``.

* If :prop_tgt:`<LANG>_STANDARD` is unset:

  * Doesn't disable extensions even if :prop_tgt:`<LANG>_EXTENSIONS` is
    ``OFF``.

  * Fails to enable extensions if :prop_tgt:`<LANG>_EXTENSIONS` is ``ON``
    except for the ``IAR`` compiler.

Code may need to be updated for the ``NEW`` behavior in the following cases:

* If :prop_tgt:`<LANG>_EXTENSIONS` matches
  :variable:`CMAKE_<LANG>_EXTENSIONS_DEFAULT` or is unset and the compiler's
  default satisfies :prop_tgt:`<LANG>_STANDARD` but the compiled code requires
  the exact standard specified.
  Such code should set :prop_tgt:`<LANG>_STANDARD_REQUIRED` to ``ON``.

  For example:

  .. code-block:: cmake

    cmake_minimum_required(VERSION |release|)
    project(example C)

    add_executable(exe main.c)
    set_property(TARGET exe PROPERTY C_STANDARD 99)

  If the compiler defaults to C11 then the standard specification for C99 is
  satisfied and CMake will pass no flags. ``main.c`` will no longer compile if
  it is incompatible with C11.

* If a standard mode flag previously overridden by CMake's and not used during
  compiler detection now takes effect due to CMake no longer adding one as the
  default detected is appropriate.

  Such code should be converted to either:

  * Use :prop_tgt:`<LANG>_STANDARD` and :prop_tgt:`<LANG>_EXTENSIONS` instead
    of manually adding flags.

  * Or ensure the manually-specified flags are used during compiler detection.

If compiler flags affecting the standard mode are used during compiler
detection (for example in :manual:`a toolchain file <cmake-toolchains(7)>`
using :variable:`CMAKE_<LANG>_FLAGS_INIT`) then they will affect the detected
default :variable:`standard <CMAKE_<LANG>_STANDARD_DEFAULT>` and
:variable:`extensions <CMAKE_<LANG>_EXTENSIONS_DEFAULT>`.

Unlike many policies, CMake version |release| does *not* warn when the policy
is not set and simply uses the ``OLD`` behavior. Use the
:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
See documentation of the
:variable:`CMAKE_POLICY_WARNING_CMP0128 <CMAKE_POLICY_WARNING_CMP<NNNN>>`
variable to control the warning.

.. include:: DEPRECATED.txt