1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

CheckLinkerFlag: Update documentation

- Added intro code block showing how to include this module.
- Added a list of variables that can affect the check. The
  CMAKE_REQUIRED_LINK_OPTIONS is skipped as it is currently internally
  overridden by the module's check command.
- Added examples section.
- Described command arguments as a list.
- Added included section describing the `LINKER:` (and `SHELL:`) prefix.
- Added link to the module in target_link_options() docs.
This commit is contained in:
Peter Kokot
2025-05-20 22:02:32 +02:00
parent 27f375d514
commit 4b0bce12c8
2 changed files with 128 additions and 18 deletions

View File

@@ -66,3 +66,6 @@ See Also
* :variable:`CMAKE_<LANG>_FLAGS` and :variable:`CMAKE_<LANG>_FLAGS_<CONFIG>`
add language-wide flags passed to all invocations of the compiler.
This includes invocations that drive compiling and those that drive linking.
* The :module:`CheckLinkerFlag` module to check whether a linker flag is
supported by the compiler.

View File

@@ -7,34 +7,141 @@ CheckLinkerFlag
.. versionadded:: 3.18
Check whether the compiler supports a given link flag.
This module provides a command to check whether a given link flag is
supported by the compiler.
Load this module in a CMake project with:
.. code-block:: cmake
include(CheckLinkerFlag)
Commands
^^^^^^^^
This module provides the following command:
.. command:: check_linker_flag
Checks once whether the compiler supports a given link flag:
.. code-block:: cmake
check_linker_flag(<lang> <flag> <var>)
check_linker_flag(<lang> <flag> <variable>)
Check that the link ``<flag>`` is accepted by the ``<lang>`` compiler without
a diagnostic. Stores the result in an internal cache entry named ``<var>``.
This command checks once whether the linker flag ``<flag>`` is accepted
by the ``<lang>`` compiler without producing a diagnostic message.
This command temporarily sets the ``CMAKE_REQUIRED_LINK_OPTIONS`` variable
and calls the :command:`check_source_compiles` command from the
:module:`CheckSourceCompiles` module. See that module's documentation
for a listing of variables that can otherwise modify the build.
The arguments are:
The underlying implementation relies on the :prop_tgt:`LINK_OPTIONS` property
to check the specified flag. The ``LINKER:`` prefix, as described in the
:command:`target_link_options` command, can be used as well.
``<lang>``
The language of the compiler used for the check. Supported languages are
``C``, ``CXX``, ``CUDA``, ``Fortran``, ``HIP``, ``OBJC``, ``OBJCXX``,
and ``Swift``.
A positive result from this check indicates only that the compiler did not
issue a diagnostic message when given the link flag. Whether the flag has any
effect or even a specific one is beyond the scope of this module.
.. versionadded:: 3.19
Support for ``CUDA`` language.
.. note::
Since the :command:`try_compile` command forwards flags from variables
like :variable:`CMAKE_<LANG>_FLAGS`, unknown flags in such variables may
cause a false negative for this check.
.. versionadded:: 3.21
Support for ``HIP`` language.
.. versionadded:: 3.26
Support for ``Swift`` language.
``<flag>``
Linker flag(s) to check. Multiple flags can be specified in one
argument as a string using a :ref:`semicolon-separated list
<CMake Language Lists>`.
The underlying implementation uses the :prop_tgt:`LINK_OPTIONS` target
property to test the specified flag. The ``LINKER:`` (and ``SHELL:``)
prefixes may be used, as described in the
`Handling Compiler Driver Differences`_ section.
``<variable>``
The name of the variable to store the check result. This variable will
be created as an internal cache variable.
This command temporarily sets the ``CMAKE_REQUIRED_LINK_OPTIONS`` variable
and calls the :command:`check_source_compiles` command from the
:module:`CheckSourceCompiles` module.
A successful result only indicates that the compiler did not report an
error when given the link flag. Whether the flag has any effect, or the
intended one, is outside the scope of this module.
.. note::
Since the underlying :command:`try_compile` command also uses flags from
variables like :variable:`CMAKE_<LANG>_FLAGS`, unknown or unsupported
flags in those variables may result in a false negative for this check.
.. rubric:: Variables Affecting the Check
The following variables may be set before calling this command to modify
the way the check is run:
.. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst
.. include:: /module/include/CMAKE_REQUIRED_DEFINITIONS.rst
.. include:: /module/include/CMAKE_REQUIRED_INCLUDES.rst
.. include:: /module/include/CMAKE_REQUIRED_LIBRARIES.rst
.. include:: /module/include/CMAKE_REQUIRED_LINK_DIRECTORIES.rst
.. include:: /module/include/CMAKE_REQUIRED_QUIET.rst
.. include:: /command/include/LINK_OPTIONS_LINKER.rst
Examples
^^^^^^^^
Example: Checking Linker Flag
"""""""""""""""""""""""""""""
The following example shows how to use this module to check the ``-z relro``
linker flag, which is supported on many Unix-like systems to enable read-only
relocations for improved binary security. If the flag is supported by the
linker, it is conditionally added to the executable target using the
:command:`target_link_options`. The ``LINKER:`` prefix is used to pass the
flag to the linker in a portable and compiler-independent way.
.. code-block:: cmake
include(CheckLinkerFlag)
check_linker_flag(C "LINKER:-z,relro" HAVE_Z_RELRO)
add_executable(example main.c)
if(HAVE_Z_RELRO)
target_link_options(example PRIVATE "LINKER:-z,relro")
endif()
Example: Checking Multiple Flags
""""""""""""""""""""""""""""""""
In the following example, multiple linker flags are checked simultaneously:
.. code-block:: cmake
include(CheckLinkerFlag)
check_linker_flag(C "LINKER:-z,relro;LINKER:-z,now" HAVE_FLAGS)
add_executable(example main.c)
if(HAVE_FLAGS)
target_link_options(example PRIVATE LINKER:-z,relro LINKER:-z,now)
endif()
See Also
^^^^^^^^
* The :variable:`CMAKE_LINKER_TYPE` variable to specify the linker, which
will be used also by this module.
#]=======================================================================]
include_guard(GLOBAL)