Help: Link from usage requirement commands to detailed explanation

Augment vague mentions of "Transitive Usage Requirements" with links to
a detailed explanation.

Fixes: #23799
This commit is contained in:
Hinell
2022-09-07 17:53:30 +03:00
committed by Brad King
parent cabba23ab2
commit 3d31f99b74
10 changed files with 42 additions and 33 deletions

View File

@@ -15,9 +15,9 @@ named ``<target>`` must have been created by a command such as
:ref:`ALIAS target <Alias Targets>`. :ref:`ALIAS target <Alias Targets>`.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
items will populate the :prop_tgt:`COMPILE_DEFINITIONS` property of ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`COMPILE_DEFINITIONS`
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_COMPILE_DEFINITIONS` property of ``<target>``. :prop_tgt:`INTERFACE_COMPILE_DEFINITIONS` property of ``<target>``.
The following arguments specify compile definitions. Repeated calls for the The following arguments specify compile definitions. Repeated calls for the
same ``<target>`` append items in the order called. same ``<target>`` append items in the order called.

View File

@@ -22,9 +22,9 @@ If ``BEFORE`` is specified, the content will be prepended to the property
instead of being appended. instead of being appended.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
items will populate the :prop_tgt:`COMPILE_OPTIONS` property of ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`COMPILE_OPTIONS`
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_COMPILE_OPTIONS` property of ``<target>``. :prop_tgt:`INTERFACE_COMPILE_OPTIONS` property of ``<target>``.
The following arguments specify compile options. Repeated calls for the same The following arguments specify compile options. Repeated calls for the same
``<target>`` append items in the order called. ``<target>`` append items in the order called.

View File

@@ -18,9 +18,9 @@ By using ``AFTER`` or ``BEFORE`` explicitly, you can select between appending
and prepending, independent of the default. and prepending, independent of the default.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to specify The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to specify
the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` items will the :ref:`scope <Target Usage Requirements>` of the following arguments.
populate the :prop_tgt:`INCLUDE_DIRECTORIES` property of ``<target>``. ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`INCLUDE_DIRECTORIES`
``PUBLIC`` and ``INTERFACE`` items will populate the property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` property of ``<target>``. :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` property of ``<target>``.
The following arguments specify include directories. The following arguments specify include directories.

View File

@@ -21,11 +21,12 @@ The named ``<target>`` must have been created by a command such as
:ref:`ALIAS target <Alias Targets>`. :ref:`ALIAS target <Alias Targets>`.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the items that follow them. ``PRIVATE`` and specify the :ref:`scope <Target Usage Requirements>` of the items that follow
``PUBLIC`` items will populate the :prop_tgt:`LINK_DIRECTORIES` property them. ``PRIVATE`` and ``PUBLIC`` items will populate the
of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the :prop_tgt:`LINK_DIRECTORIES` property of ``<target>``. ``PUBLIC`` and
:prop_tgt:`INTERFACE_LINK_DIRECTORIES` property of ``<target>`` ``INTERFACE`` items will populate the :prop_tgt:`INTERFACE_LINK_DIRECTORIES`
(:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items). property of ``<target>`` (:ref:`IMPORTED targets <Imported Targets>` only
support ``INTERFACE`` items).
Each item specifies a link directory and will be converted to an absolute Each item specifies a link directory and will be converted to an absolute
path if necessary before adding it to the relevant property. Repeated path if necessary before adding it to the relevant property. Repeated
calls for the same ``<target>`` append items in the order called. calls for the same ``<target>`` append items in the order called.

View File

@@ -146,8 +146,10 @@ Libraries for a Target and/or its Dependents
<PRIVATE|PUBLIC|INTERFACE> <item>... <PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...) [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE`` keywords can be used to The ``PUBLIC``, ``PRIVATE`` and ``INTERFACE``
:ref:`scope <Target Usage Requirements>` keywords can be used to
specify both the link dependencies and the link interface in one command. specify both the link dependencies and the link interface in one command.
Libraries and targets following ``PUBLIC`` are linked to, and are made Libraries and targets following ``PUBLIC`` are linked to, and are made
part of the link interface. Libraries and targets following ``PRIVATE`` part of the link interface. Libraries and targets following ``PRIVATE``
are linked to, but are not made part of the link interface. Libraries are linked to, but are not made part of the link interface. Libraries

View File

@@ -32,9 +32,9 @@ If ``BEFORE`` is specified, the content will be prepended to the property
instead of being appended. instead of being appended.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
items will populate the :prop_tgt:`LINK_OPTIONS` property of ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`LINK_OPTIONS`
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_LINK_OPTIONS` property of ``<target>``. :prop_tgt:`INTERFACE_LINK_OPTIONS` property of ``<target>``.
The following arguments specify link options. Repeated calls for the same The following arguments specify link options. Repeated calls for the same
``<target>`` append items in the order called. ``<target>`` append items in the order called.

View File

@@ -25,9 +25,9 @@ The named ``<target>`` must have been created by a command such as
:ref:`ALIAS target <Alias Targets>`. :ref:`ALIAS target <Alias Targets>`.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the following arguments. ``PRIVATE`` and ``PUBLIC`` specify the :ref:`scope <Target Usage Requirements>` of the following arguments.
items will populate the :prop_tgt:`PRECOMPILE_HEADERS` property of ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`PRECOMPILE_HEADERS`
``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the property of ``<target>``. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_PRECOMPILE_HEADERS` property of ``<target>`` :prop_tgt:`INTERFACE_PRECOMPILE_HEADERS` property of ``<target>``
(:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items). (:ref:`IMPORTED targets <Imported Targets>` only support ``INTERFACE`` items).
Repeated calls for the same ``<target>`` will append items in the order called. Repeated calls for the same ``<target>`` will append items in the order called.

View File

@@ -22,10 +22,10 @@ The named ``<target>`` must have been created by a command such as
``<target>`` can be a custom target. ``<target>`` can be a custom target.
The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to The ``INTERFACE``, ``PUBLIC`` and ``PRIVATE`` keywords are required to
specify the scope of the source file paths (``<items>``) that follow specify the :ref:`scope <Target Usage Requirements>` of the source file paths
them. ``PRIVATE`` and ``PUBLIC`` items will populate the :prop_tgt:`SOURCES` (``<items>``) that follow them. ``PRIVATE`` and ``PUBLIC`` items will
property of ``<target>``, which are used when building the target itself. populate the :prop_tgt:`SOURCES` property of ``<target>``, which are used when
``PUBLIC`` and ``INTERFACE`` items will populate the building the target itself. ``PUBLIC`` and ``INTERFACE`` items will populate the
:prop_tgt:`INTERFACE_SOURCES` property of ``<target>``, which are used :prop_tgt:`INTERFACE_SOURCES` property of ``<target>``, which are used
when building dependents. A target created by :command:`add_custom_target` when building dependents. A target created by :command:`add_custom_target`
can only have ``PRIVATE`` scope. can only have ``PRIVATE`` scope.

View File

@@ -4,15 +4,20 @@ Step 3: Adding Usage Requirements for a Library
Exercise 1 - Adding Usage Requirements for a Library Exercise 1 - Adding Usage Requirements for a Library
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Usage requirements allow for far better control over a library or :ref:`Usage requirements <Target Usage Requirements>` of a target parameters
executable's link and include line while also giving more control over the allow for far better control over a library or executable's link and include
transitive property of targets inside CMake. The primary commands that line while also giving more control over the transitive property of targets
inside CMake. The primary commands that
leverage usage requirements are: leverage usage requirements are:
* :command:`target_compile_definitions` * :command:`target_compile_definitions`
* :command:`target_compile_options` * :command:`target_compile_options`
* :command:`target_include_directories` * :command:`target_include_directories`
* :command:`target_link_libraries` * :command:`target_link_directories`
* :command:`target_link_options`
* :command:`target_precompile_headers`
* :command:`target_sources`
Goal Goal
---- ----
@@ -22,7 +27,6 @@ Add usage requirements for a library.
Helpful Materials Helpful Materials
----------------- -----------------
* :command:`target_include_directories`
* :variable:`CMAKE_CURRENT_SOURCE_DIR` * :variable:`CMAKE_CURRENT_SOURCE_DIR`
Files to Edit Files to Edit

View File

@@ -257,7 +257,7 @@ targets in multiple different directories convenient through use of the
Transitive Usage Requirements Transitive Usage Requirements
----------------------------- -----------------------------
The usage requirements of a target can transitively propagate to dependents. The usage requirements of a target can transitively propagate to the dependents.
The :command:`target_link_libraries` command has ``PRIVATE``, The :command:`target_link_libraries` command has ``PRIVATE``,
``INTERFACE`` and ``PUBLIC`` keywords to control the propagation. ``INTERFACE`` and ``PUBLIC`` keywords to control the propagation.
@@ -279,8 +279,10 @@ The :command:`target_link_libraries` command has ``PRIVATE``,
# consumer is compiled with -DUSING_ARCHIVE_LIB # consumer is compiled with -DUSING_ARCHIVE_LIB
target_link_libraries(consumer archiveExtras) target_link_libraries(consumer archiveExtras)
Because ``archive`` is a ``PUBLIC`` dependency of ``archiveExtras``, the Because the ``archive`` is a ``PUBLIC`` dependency of ``archiveExtras``, the
usage requirements of it are propagated to ``consumer`` too. Because usage requirements of it are propagated to ``consumer`` too.
Because
``serialization`` is a ``PRIVATE`` dependency of ``archiveExtras``, the usage ``serialization`` is a ``PRIVATE`` dependency of ``archiveExtras``, the usage
requirements of it are not propagated to ``consumer``. requirements of it are not propagated to ``consumer``.