summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Scott <craig.scott@crascit.com>2022-12-17 20:42:04 +1100
committerCraig Scott <craig.scott@crascit.com>2022-12-17 20:51:25 +1100
commitdfab263825d29f132454f2af7d79aa8ba43fb77f (patch)
treed78c0743bdfba07a09ce21c8a4ee927e3cb81ee4
parent94131d632fc9b7b73d480ff4be349a66d67978b2 (diff)
downloadcmake-dfab263825d29f132454f2af7d79aa8ba43fb77f.tar.gz
Help: Clarify and update SYSTEM-related docs
-rw-r--r--Help/command/add_subdirectory.rst20
-rw-r--r--Help/manual/cmake-buildsystem.7.rst16
-rw-r--r--Help/prop_tgt/EXPORT_NO_SYSTEM.rst6
-rw-r--r--Help/prop_tgt/IMPORTED_NO_SYSTEM.rst28
-rw-r--r--Help/prop_tgt/INTERFACE_SYSTEM_INCLUDE_DIRECTORIES.rst14
-rw-r--r--Help/prop_tgt/NO_SYSTEM_FROM_IMPORTED.rst26
-rw-r--r--Help/prop_tgt/SYSTEM.rst12
-rw-r--r--Help/release/3.25.rst7
-rw-r--r--Modules/FetchContent.cmake17
9 files changed, 82 insertions, 64 deletions
diff --git a/Help/command/add_subdirectory.rst b/Help/command/add_subdirectory.rst
index fe17b5646c..ae063e6d60 100644
--- a/Help/command/add_subdirectory.rst
+++ b/Help/command/add_subdirectory.rst
@@ -7,16 +7,16 @@ Add a subdirectory to the build.
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])
-Adds a subdirectory to the build. The source_dir specifies the
-directory in which the source CMakeLists.txt and code files are
-located. If it is a relative path it will be evaluated with respect
+Adds a subdirectory to the build. The ``source_dir`` specifies the
+directory in which the source ``CMakeLists.txt`` and code files are
+located. If it is a relative path, it will be evaluated with respect
to the current directory (the typical usage), but it may also be an
absolute path. The ``binary_dir`` specifies the directory in which to
-place the output files. If it is a relative path it will be evaluated
+place the output files. If it is a relative path, it will be evaluated
with respect to the current output directory, but it may also be an
absolute path. If ``binary_dir`` is not specified, the value of
``source_dir``, before expanding any relative path, will be used (the
-typical usage). The CMakeLists.txt file in the specified source
+typical usage). The ``CMakeLists.txt`` file in the specified source
directory will be processed immediately by CMake before processing in
the current input file continues beyond this command.
@@ -28,9 +28,9 @@ meant for use when the subdirectory contains a separate part of the
project that is useful but not necessary, such as a set of examples.
Typically the subdirectory should contain its own :command:`project`
command invocation so that a full build system will be generated in the
-subdirectory (such as a VS IDE solution file). Note that inter-target
-dependencies supersede this exclusion. If a target built by the
-parent project depends on a target in the subdirectory, the dependee
+subdirectory (such as a Visual Studio IDE solution file). Note that
+inter-target dependencies supersede this exclusion. If a target built by
+the parent project depends on a target in the subdirectory, the dependee
target will be included in the parent project build system to satisfy
the dependency.
@@ -38,6 +38,4 @@ the dependency.
If the ``SYSTEM`` argument is provided, the :prop_dir:`SYSTEM` directory
property of the subdirectory will be set to true. This property is
used to initialize the :prop_tgt:`SYSTEM` property of each non-imported
- target created in that subdirectory. The include directories of targets
- with :prop_tgt:`SYSTEM` set to true will be treated as ``SYSTEM`` when
- compiling consumers.
+ target created in that subdirectory.
diff --git a/Help/manual/cmake-buildsystem.7.rst b/Help/manual/cmake-buildsystem.7.rst
index b14160c3c6..b4a7733e88 100644
--- a/Help/manual/cmake-buildsystem.7.rst
+++ b/Help/manual/cmake-buildsystem.7.rst
@@ -672,14 +672,14 @@ This is equivalent to appending ``${CMAKE_INSTALL_PREFIX}/include`` to the
When the :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` of an
:ref:`imported target <Imported targets>` is consumed, the entries in the
-property are treated as ``SYSTEM`` include directories, as if they were
-listed in the :prop_tgt:`INTERFACE_SYSTEM_INCLUDE_DIRECTORIES` of the
-dependency. This can result in omission of compiler warnings for headers
-found in those directories. This behavior for :ref:`imported targets` may
-be controlled by setting the :prop_tgt:`NO_SYSTEM_FROM_IMPORTED` target
-property on the *consumers* of imported targets, or by setting the
-:prop_tgt:`IMPORTED_NO_SYSTEM` target property on the imported targets
-themselves.
+property may be treated as system include directories. The effects of that
+are toolchain-dependent, but one common effect is to omit compiler warnings
+for headers found in those directories. The :prop_tgt:`SYSTEM` property of
+the installed target determines this behavior (see the
+:prop_tgt:`EXPORT_NO_SYSTEM` property for how to modify the installed value
+for a target). It is also possible to change how consumers interpret the
+system behavior of consumed imported targets by setting the
+:prop_tgt:`NO_SYSTEM_FROM_IMPORTED` target property on the *consumer*.
If a binary target is linked transitively to a macOS :prop_tgt:`FRAMEWORK`, the
``Headers`` directory of the framework is also treated as a usage requirement.
diff --git a/Help/prop_tgt/EXPORT_NO_SYSTEM.rst b/Help/prop_tgt/EXPORT_NO_SYSTEM.rst
index 61f0a8da14..f86abd3c64 100644
--- a/Help/prop_tgt/EXPORT_NO_SYSTEM.rst
+++ b/Help/prop_tgt/EXPORT_NO_SYSTEM.rst
@@ -3,8 +3,10 @@ EXPORT_NO_SYSTEM
.. versionadded:: 3.25
-Specifies that :command:`install(EXPORT)` and :command:`export` commands will
-generate an imported target with :prop_tgt:`SYSTEM` property `OFF`.
+This property affects the behavior of the :command:`install(EXPORT)` and
+:command:`export` commands when they install or export the target respectively.
+When ``EXPORT_NO_SYSTEM`` is set to true, those commands generate an imported
+target with :prop_tgt:`SYSTEM` property set to false.
See the :prop_tgt:`NO_SYSTEM_FROM_IMPORTED` target property to set this
behavior on the target *consuming* the include directories rather than the
diff --git a/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst b/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst
index 913d9f2f9f..c8ec8b5c48 100644
--- a/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst
+++ b/Help/prop_tgt/IMPORTED_NO_SYSTEM.rst
@@ -5,27 +5,31 @@ IMPORTED_NO_SYSTEM
.. deprecated:: 3.25
- ``IMPORTED_NO_SYSTEM`` is deprecated. Set :prop_tgt:`SYSTEM` to `OFF`
- instead if you don't want target's include directories to be ``SYSTEM``
- when compiling consumers. Set :prop_tgt:`EXPORT_NO_SYSTEM` to `ON` instead
- if you don't want the include directories of the imported target generated
- by :command:`install(EXPORT)` and :command:`export` commands to be
- ``SYSTEM`` when compiling consumers.
+ ``IMPORTED_NO_SYSTEM`` is deprecated. Please use the following alternatives
+ instead:
-Specifies that an :ref:`Imported Target <Imported Targets>` is not
-a ``SYSTEM`` library. This has the following effects:
+ * Set :prop_tgt:`SYSTEM` to false if you don't want a target's include
+ directories to be treated as system directories when compiling consumers.
+ * Set :prop_tgt:`EXPORT_NO_SYSTEM` to true if you don't want the include
+ directories of the imported target generated by :command:`install(EXPORT)`
+ and :command:`export` commands to be treated as system directories when
+ compiling consumers.
+
+Setting ``IMPORTED_NO_SYSTEM`` to true on an
+:ref:`imported target <Imported Targets>` specifies that it is not a
+system target. This has the following effects:
* Entries of :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` are not treated
- as ``SYSTEM`` include directories when compiling consumers (regardless of
+ as system include directories when compiling consumers (regardless of
the value of the consumed target's :prop_tgt:`SYSTEM` property), as they
would be by default. Entries of
:prop_tgt:`INTERFACE_SYSTEM_INCLUDE_DIRECTORIES` are not affected,
- and will always be treated as ``SYSTEM`` include directories.
+ and will always be treated as system include directories.
This property can also be enabled on a non-imported target. Doing so does
not affect the build system, but does tell the :command:`install(EXPORT)` and
:command:`export` commands to enable it on the imported targets they generate.
See the :prop_tgt:`NO_SYSTEM_FROM_IMPORTED` target property to set this
-behavior on the target consuming the include directories rather than
-providing them.
+behavior on the target *consuming* the include directories rather than
+the one *providing* them.
diff --git a/Help/prop_tgt/INTERFACE_SYSTEM_INCLUDE_DIRECTORIES.rst b/Help/prop_tgt/INTERFACE_SYSTEM_INCLUDE_DIRECTORIES.rst
index b37bb0cc3e..2ded46f156 100644
--- a/Help/prop_tgt/INTERFACE_SYSTEM_INCLUDE_DIRECTORIES.rst
+++ b/Help/prop_tgt/INTERFACE_SYSTEM_INCLUDE_DIRECTORIES.rst
@@ -8,17 +8,17 @@ which contain system headers, and therefore should not result in
compiler warnings. Additionally, system include directories are searched
after normal include directories regardless of the order specified.
-The :command:`target_include_directories(SYSTEM)` command signature
-populates this property with values given to the ``PUBLIC`` and
-``INTERFACE`` keywords.
+When the :command:`target_include_directories` command is given the
+``SYSTEM`` keyword, it populates this property with values provided after the
+``PUBLIC`` and ``INTERFACE`` keywords.
Projects may also get and set the property directly, but must be aware that
adding directories to this property does not make those directories used
during compilation. Adding directories to this property marks directories
-as ``SYSTEM`` which otherwise would be used in a non-``SYSTEM`` manner. This
-can appear similar to 'duplication', so prefer the
-high-level :command:`target_include_directories(SYSTEM)` command and avoid
-setting the property by low-level means.
+as system directories which otherwise would be used in a non-system manner.
+This can appear similar to duplication, so prefer the high-level
+:command:`target_include_directories` command with the ``SYSTEM`` keyword
+and avoid setting the property directly.
When target dependencies are specified using :command:`target_link_libraries`,
CMake will read this property from all target dependencies to mark the
diff --git a/Help/prop_tgt/NO_SYSTEM_FROM_IMPORTED.rst b/Help/prop_tgt/NO_SYSTEM_FROM_IMPORTED.rst
index 39a13eec11..a4c9b9fddc 100644
--- a/Help/prop_tgt/NO_SYSTEM_FROM_IMPORTED.rst
+++ b/Help/prop_tgt/NO_SYSTEM_FROM_IMPORTED.rst
@@ -2,19 +2,27 @@ NO_SYSTEM_FROM_IMPORTED
-----------------------
Do not treat include directories from the interfaces of consumed
-:ref:`imported targets` as ``SYSTEM``.
+:ref:`imported targets` as system directories.
The contents of the :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` target property
-of imported targets are treated as ``SYSTEM`` includes by default. If this
-property is enabled on a target, compilation of sources in that target will
-not treat the contents of the ``INTERFACE_INCLUDE_DIRECTORIES`` of consumed
-imported targets as system includes. Either way, entries of
-:prop_tgt:`INTERFACE_SYSTEM_INCLUDE_DIRECTORIES` are not affected,
-and will always be treated as ``SYSTEM`` include directories.
+are treated as system includes when the consumed target's :prop_tgt:`SYSTEM`
+property is set to true. By default, :prop_tgt:`SYSTEM` is true for imported
+targets and false for other target types. If the ``NO_SYSTEM_FROM_IMPORTED``
+property is set to true on a *consuming* target, compilation of sources in that
+consuming target will not treat the contents of the
+:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` of consumed imported targets as
+system includes, even if that imported target's :prop_tgt:`SYSTEM` property
+is false.
+
+Directories listed in the :prop_tgt:`INTERFACE_SYSTEM_INCLUDE_DIRECTORIES`
+property of consumed targets are not affected by ``NO_SYSTEM_FROM_IMPORTED``.
+Those directories will always be treated as system include directories by
+consumers.
This property is initialized by the value of the
:variable:`CMAKE_NO_SYSTEM_FROM_IMPORTED` variable if it is set when a target
is created.
-See the :prop_tgt:`IMPORTED_NO_SYSTEM` target property to set this behavior
-on the target providing the include directories rather than consuming them.
+See the :prop_tgt:`EXPORT_NO_SYSTEM` target property to set this behavior
+on the target providing the include directories rather than the target
+consuming them.
diff --git a/Help/prop_tgt/SYSTEM.rst b/Help/prop_tgt/SYSTEM.rst
index 6399d247d5..c7ae27e819 100644
--- a/Help/prop_tgt/SYSTEM.rst
+++ b/Help/prop_tgt/SYSTEM.rst
@@ -3,20 +3,20 @@ SYSTEM
.. versionadded:: 3.25
-Specifies that a target is a ``SYSTEM`` library. This has the following
+Specifies that a target is a system target. This has the following
effects:
* Entries of :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` are treated as
- ``SYSTEM`` include directories when compiling consumers.
+ system include directories when compiling consumers.
Entries of :prop_tgt:`INTERFACE_SYSTEM_INCLUDE_DIRECTORIES` are not
- affected, and will always be treated as ``SYSTEM`` include directories.
+ affected, and will always be treated as system include directories.
For imported targets, this property defaults to true, which means
that their :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` are treated
-as ``SYSTEM`` by default. If their ``SYSTEM`` property is false,
+as system directories by default. If their ``SYSTEM`` property is false,
then their :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` will not be
-treated as ``SYSTEM``, regardless of the value of the
-:prop_tgt:`IMPORTED_NO_SYSTEM` property.
+treated as system. Use the :prop_tgt:`EXPORT_NO_SYSTEM` property to change
+how a target's ``SYSTEM`` property is set when it is installed.
For non-imported targets, this target property is initialized from
the :prop_dir:`SYSTEM` directory property when the target is created.
diff --git a/Help/release/3.25.rst b/Help/release/3.25.rst
index e76a308e03..dea8de8c0d 100644
--- a/Help/release/3.25.rst
+++ b/Help/release/3.25.rst
@@ -159,9 +159,10 @@ Properties
Modules
-------
-* The :module:`FetchContent` module :command:`FetchContent_Declare`
- command gained a ``SYSTEM`` option to enable the :prop_dir:`SYSTEM`
- directory property in the subdirectory.
+* The :module:`FetchContent` module's :command:`FetchContent_Declare`
+ command gained a ``SYSTEM`` option which sets the :prop_dir:`SYSTEM`
+ directory property on subdirectories created by
+ :command:`FetchContent_MakeAvailable`.
* The :module:`FindCUDAToolkit` module now provides a target for
:ref:`nvtx3 <cuda_toolkit_nvtx3>` for CUDA 10.0+, which supersedes
diff --git a/Modules/FetchContent.cmake b/Modules/FetchContent.cmake
index 25b0683d36..047603cbdc 100644
--- a/Modules/FetchContent.cmake
+++ b/Modules/FetchContent.cmake
@@ -233,12 +233,12 @@ Commands
.. versionadded:: 3.25
``SYSTEM``
- If the ``SYSTEM`` argument is provided, targets created by
- the dependency will have their :prop_tgt:`SYSTEM` property
- set to true when populated by :command:`FetchContent_MakeAvailable`.
- The entries in their :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES`
- will be treated as ``SYSTEM`` include directories when
- compiling consumers.
+ If the ``SYSTEM`` argument is provided, the :prop_dir:`SYSTEM` directory
+ property of a subdirectory added by
+ :command:`FetchContent_MakeAvailable` will be set to true. This will
+ affect non-imported targets created as part of that command.
+ See the :prop_tgt:`SYSTEM` target property documentation for a more
+ detailed discussion of the effects.
.. command:: FetchContent_MakeAvailable
@@ -353,6 +353,11 @@ Commands
adding a project that contains a ``CMakeLists.txt`` file in its top
directory.
+ .. versionadded:: 3.25
+ If the ``SYSTEM`` keyword was included in the call to
+ :command:`FetchContent_Declare`, the ``SYSTEM`` keyword will be
+ added to the :command:`add_subdirectory` command as well.
+
Projects should aim to declare the details of all dependencies they might
use before they call ``FetchContent_MakeAvailable()`` for any of them.
This ensures that if any of the dependencies are also sub-dependencies of