|
|
@@ -259,6 +259,121 @@ Variable Queries
|
|
|
add_executable(myapp main.cpp)
|
|
|
target_link_libraries(myapp myapp_c myapp_cxx)
|
|
|
|
|
|
+.. _`Boolean LINK_LANGUAGE Generator Expression`:
|
|
|
+
|
|
|
+``$<LINK_LANG_AND_ID:language,compiler_ids>``
|
|
|
+ ``1`` when the language used for link step matches ``language`` and the
|
|
|
+ CMake's compiler id of the language linker matches any one of the entries
|
|
|
+ in ``compiler_ids``, otherwise ``0``. This expression is a short form for the
|
|
|
+ combination of ``$<LINK_LANGUAGE:language>`` and
|
|
|
+ ``$<LANG_COMPILER_ID:compiler_ids>``. This expression may be used to specify
|
|
|
+ link libraries, link options, link directories and link dependencies of a
|
|
|
+ particular language and linker combination in a target. For example:
|
|
|
+
|
|
|
+ .. code-block:: cmake
|
|
|
+
|
|
|
+ add_library(libC_Clang ...)
|
|
|
+ add_library(libCXX_Clang ...)
|
|
|
+ add_library(libC_Intel ...)
|
|
|
+ add_library(libCXX_Intel ...)
|
|
|
+
|
|
|
+ add_executable(myapp main.c)
|
|
|
+ if (CXX_CONFIG)
|
|
|
+ target_sources(myapp PRIVATE file.cxx)
|
|
|
+ endif()
|
|
|
+ target_link_libraries(myapp
|
|
|
+ PRIVATE $<$<LINK_LANG_AND_ID:CXX,Clang,AppleClang>:libCXX_Clang>
|
|
|
+ $<$<LINK_LANG_AND_ID:C,Clang,AppleClang>:libC_Clang>
|
|
|
+ $<$<LINK_LANG_AND_ID:CXX,Intel>:libCXX_Intel>
|
|
|
+ $<$<LINK_LANG_AND_ID:C,Intel>:libC_Intel>)
|
|
|
+
|
|
|
+ This specifies the use of different link libraries based on both the
|
|
|
+ compiler id and link language. This example will have target ``libCXX_Clang``
|
|
|
+ as link dependency when ``Clang`` or ``AppleClang`` is the ``CXX``
|
|
|
+ linker, and ``libCXX_Intel`` when ``Intel`` is the ``CXX`` linker.
|
|
|
+ Likewise when the ``C`` linker is ``Clang`` or ``AppleClang``, target
|
|
|
+ ``libC_Clang`` will be added as link dependency and ``libC_Intel`` when
|
|
|
+ ``Intel`` is the ``C`` linker.
|
|
|
+
|
|
|
+ See :ref:`the note related to
|
|
|
+ <Constraints LINK_LANGUAGE Generator Expression>`
|
|
|
+ ``$<LINK_LANGUAGE:language>`` for constraints about the usage of this
|
|
|
+ generator expression.
|
|
|
+
|
|
|
+``$<LINK_LANGUAGE:languages>``
|
|
|
+ ``1`` when the language used for link step matches any of the entries
|
|
|
+ in ``languages``, otherwise ``0``. This expression may be used to specify
|
|
|
+ link libraries, link options, link directories and link dependencies of a
|
|
|
+ particular language in a target. For example:
|
|
|
+
|
|
|
+ .. code-block:: cmake
|
|
|
+
|
|
|
+ add_library(api_C ...)
|
|
|
+ add_library(api_CXX ...)
|
|
|
+ add_library(api INTERFACE)
|
|
|
+ target_link_options(api INTERFACE $<$<LINK_LANGUAGE:C>:-opt_c>
|
|
|
+ $<$<LINK_LANGUAGE:CXX>:-opt_cxx>)
|
|
|
+ target_link_libraries(api INTERFACE $<$<LINK_LANGUAGE:C>:api_C>
|
|
|
+ $<$<LINK_LANGUAGE:CXX>:api_CXX>)
|
|
|
+
|
|
|
+ add_executable(myapp1 main.c)
|
|
|
+ target_link_options(myapp1 PRIVATE api)
|
|
|
+
|
|
|
+ add_executable(myapp2 main.cpp)
|
|
|
+ target_link_options(myapp2 PRIVATE api)
|
|
|
+
|
|
|
+ This specifies to use the ``api`` target for linking targets ``myapp1`` and
|
|
|
+ ``myapp2``. In practice, ``myapp1`` will link with target ``api_C`` and
|
|
|
+ option ``-opt_c`` because it will use ``C`` as link language. And ``myapp2``
|
|
|
+ will link with ``api_CXX`` and option ``-opt_cxx`` because ``CXX`` will be
|
|
|
+ the link language.
|
|
|
+
|
|
|
+ .. _`Constraints LINK_LANGUAGE Generator Expression`:
|
|
|
+
|
|
|
+ .. note::
|
|
|
+
|
|
|
+ To determine the link language of a target, it is required to collect,
|
|
|
+ transitively, all the targets which will be linked to it. So, for link
|
|
|
+ libraries properties, a double evaluation will be done. During the first
|
|
|
+ evaluation, ``$<LINK_LANGUAGE:..>`` expressions will always return ``0``.
|
|
|
+ The link language computed after this first pass will be used to do the
|
|
|
+ second pass. To avoid inconsistency, it is required that the second pass
|
|
|
+ do not change the link language. Moreover, to avoid unexpected
|
|
|
+ side-effects, it is required to specify complete entities as part of the
|
|
|
+ ``$<LINK_LANGUAGE:..>`` expression. For example:
|
|
|
+
|
|
|
+ .. code-block:: cmake
|
|
|
+
|
|
|
+ add_library(lib STATIC file.cxx)
|
|
|
+ add_library(libother STATIC file.c)
|
|
|
+
|
|
|
+ # bad usage
|
|
|
+ add_executable(myapp1 main.c)
|
|
|
+ target_link_libraries(myapp1 PRIVATE lib$<$<LINK_LANGUAGE:C>:other>)
|
|
|
+
|
|
|
+ # correct usage
|
|
|
+ add_executable(myapp2 main.c)
|
|
|
+ target_link_libraries(myapp2 PRIVATE $<$<LINK_LANGUAGE:C>:libother>)
|
|
|
+
|
|
|
+ In this example, for ``myapp1``, the first pass will, unexpectedly,
|
|
|
+ determine that the link language is ``CXX`` because the evaluation of the
|
|
|
+ generator expression will be an empty string so ``myapp1`` will depends on
|
|
|
+ target ``lib`` which is ``C++``. On the contrary, for ``myapp2``, the first
|
|
|
+ evaluation will give ``C`` as link language, so the second pass will
|
|
|
+ correctly add target ``libother`` as link dependency.
|
|
|
+
|
|
|
+``$<DEVICE_LINK:list>``
|
|
|
+ Returns the list if it is the device link step, an empty list otherwise.
|
|
|
+ The device link step is controlled by :prop_tgt:`CUDA_SEPARABLE_COMPILATION`
|
|
|
+ and :prop_tgt:`CUDA_RESOLVE_DEVICE_SYMBOLS` properties. This expression can
|
|
|
+ only be used to specify link options.
|
|
|
+
|
|
|
+``$<HOST_LINK:list>``
|
|
|
+ Returns the list if it is the normal link step, an empty list otherwise.
|
|
|
+ This expression is mainly useful when a device link step is also involved
|
|
|
+ (see ``$<DEVICE_LINK:list>`` generator expression). This expression can only
|
|
|
+ be used to specify link options.
|
|
|
+
|
|
|
String-Valued Generator Expressions
|
|
|
===================================
|
|
|
|
|
|
@@ -450,22 +565,41 @@ Variable Queries
|
|
|
<Boolean COMPILE_LANGUAGE Generator Expression>`
|
|
|
``$<COMPILE_LANGUAGE:language>``
|
|
|
for notes about the portability of this generator expression.
|
|
|
+``$<LINK_LANGUAGE>``
|
|
|
+ The link language of target when evaluating link options.
|
|
|
+ See :ref:`the related boolean expression
|
|
|
+ <Boolean LINK_LANGUAGE Generator Expression>` ``$<LINK_LANGUAGE:language>``
|
|
|
+ for notes about the portability of this generator expression.
|
|
|
+
|
|
|
+ .. note::
|
|
|
+
|
|
|
+ This generator expression is not supported by the link libraries
|
|
|
+ properties to avoid side-effects due to the double evaluation of
|
|
|
+ these properties.
|
|
|
|
|
|
Target-Dependent Queries
|
|
|
------------------------
|
|
|
|
|
|
+These queries refer to a target ``tgt``. This can be any runtime artifact,
|
|
|
+namely:
|
|
|
+
|
|
|
+* an executable target created by :command:`add_executable`
|
|
|
+* a shared library target (``.so``, ``.dll`` but not their ``.lib`` import library)
|
|
|
+ created by :command:`add_library`
|
|
|
+* a static library target created by :command:`add_library`
|
|
|
+
|
|
|
+In the following, "the ``tgt`` filename" means the name of the ``tgt``
|
|
|
+binary file. This has to be distinguished from "the target name",
|
|
|
+which is just the string ``tgt``.
|
|
|
+
|
|
|
``$<TARGET_NAME_IF_EXISTS:tgt>``
|
|
|
- Expands to the ``tgt`` if the given target exists, an empty string
|
|
|
- otherwise.
|
|
|
+ The target name ``tgt`` if the target exists, an empty string otherwise.
|
|
|
``$<TARGET_FILE:tgt>``
|
|
|
- Full path to main file (.exe, .so.1.2, .a) where ``tgt`` is the name of a
|
|
|
- target.
|
|
|
+ Full path to the ``tgt`` binary file.
|
|
|
``$<TARGET_FILE_BASE_NAME:tgt>``
|
|
|
- Base name of main file where ``tgt`` is the name of a target.
|
|
|
-
|
|
|
- The base name corresponds to the target file name (see
|
|
|
- ``$<TARGET_FILE_NAME:tgt>``) without prefix and suffix. For example, if
|
|
|
- target file name is ``libbase.so``, the base name is ``base``.
|
|
|
+ Base name of ``tgt``, i.e. ``$<TARGET_FILE_NAME:tgt>`` without prefix and
|
|
|
+ suffix.
|
|
|
+ For example, if the ``tgt`` filename is ``libbase.so``, the base name is ``base``.
|
|
|
|
|
|
See also the :prop_tgt:`OUTPUT_NAME`, :prop_tgt:`ARCHIVE_OUTPUT_NAME`,
|
|
|
:prop_tgt:`LIBRARY_OUTPUT_NAME` and :prop_tgt:`RUNTIME_OUTPUT_NAME`
|
|
|
@@ -480,32 +614,31 @@ Target-Dependent Queries
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_FILE_PREFIX:tgt>``
|
|
|
- Prefix of main file where ``tgt`` is the name of a target.
|
|
|
+ Prefix of the ``tgt`` filename (such as ``lib``).
|
|
|
|
|
|
See also the :prop_tgt:`PREFIX` target property.
|
|
|
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_FILE_SUFFIX:tgt>``
|
|
|
- Suffix of main file where ``tgt`` is the name of a target.
|
|
|
-
|
|
|
- The suffix corresponds to the file extension (such as ".so" or ".exe").
|
|
|
+ Suffix of the ``tgt`` filename (extension such as ``.so`` or ``.exe``).
|
|
|
|
|
|
See also the :prop_tgt:`SUFFIX` target property.
|
|
|
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_FILE_NAME:tgt>``
|
|
|
- Name of main file (.exe, .so.1.2, .a).
|
|
|
+ The ``tgt`` filename.
|
|
|
``$<TARGET_FILE_DIR:tgt>``
|
|
|
- Directory of main file (.exe, .so.1.2, .a).
|
|
|
+ Directory of the ``tgt`` binary file.
|
|
|
``$<TARGET_LINKER_FILE:tgt>``
|
|
|
- File used to link (.a, .lib, .so) where ``tgt`` is the name of a target.
|
|
|
+ File used when linking to the ``tgt`` target. This will usually
|
|
|
+ be the library that ``tgt`` represents (``.a``, ``.lib``, ``.so``),
|
|
|
+ but for a shared library on DLL platforms, it would be the ``.lib``
|
|
|
+ import library associated with the DLL.
|
|
|
``$<TARGET_LINKER_FILE_BASE_NAME:tgt>``
|
|
|
- Base name of file used to link where ``tgt`` is the name of a target.
|
|
|
-
|
|
|
- The base name corresponds to the target linker file name (see
|
|
|
- ``$<TARGET_LINKER_FILE_NAME:tgt>``) without prefix and suffix. For example,
|
|
|
+ Base name of file used to link the target ``tgt``, i.e.
|
|
|
+ ``$<TARGET_LINKER_FILE_NAME:tgt>`` without prefix and suffix. For example,
|
|
|
if target file name is ``libbase.a``, the base name is ``base``.
|
|
|
|
|
|
See also the :prop_tgt:`OUTPUT_NAME`, :prop_tgt:`ARCHIVE_OUTPUT_NAME`,
|
|
|
@@ -520,7 +653,7 @@ Target-Dependent Queries
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_LINKER_FILE_PREFIX:tgt>``
|
|
|
- Prefix of file used to link where ``tgt`` is the name of a target.
|
|
|
+ Prefix of file used to link target ``tgt``.
|
|
|
|
|
|
See also the :prop_tgt:`PREFIX` and :prop_tgt:`IMPORT_PREFIX` target
|
|
|
properties.
|
|
|
@@ -538,15 +671,15 @@ Target-Dependent Queries
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_LINKER_FILE_NAME:tgt>``
|
|
|
- Name of file used to link (.a, .lib, .so).
|
|
|
+ Name of file used to link target ``tgt``.
|
|
|
``$<TARGET_LINKER_FILE_DIR:tgt>``
|
|
|
- Directory of file used to link (.a, .lib, .so).
|
|
|
+ Directory of file used to link target ``tgt``.
|
|
|
``$<TARGET_SONAME_FILE:tgt>``
|
|
|
- File with soname (.so.3) where ``tgt`` is the name of a target.
|
|
|
+ File with soname (``.so.3``) where ``tgt`` is the name of a target.
|
|
|
``$<TARGET_SONAME_FILE_NAME:tgt>``
|
|
|
- Name of file with soname (.so.3).
|
|
|
+ Name of file with soname (``.so.3``).
|
|
|
``$<TARGET_SONAME_FILE_DIR:tgt>``
|
|
|
- Directory of with soname (.so.3).
|
|
|
+ Directory of with soname (``.so.3``).
|
|
|
``$<TARGET_PDB_FILE:tgt>``
|
|
|
Full path to the linker generated program database file (.pdb)
|
|
|
where ``tgt`` is the name of a target.
|
|
|
@@ -589,11 +722,10 @@ Target-Dependent Queries
|
|
|
Note that ``tgt`` is not added as a dependency of the target this
|
|
|
expression is evaluated on.
|
|
|
``$<TARGET_PROPERTY:prop>``
|
|
|
- Value of the property ``prop`` on the target on which the generator
|
|
|
- expression is evaluated. Note that for generator expressions in
|
|
|
- :ref:`Target Usage Requirements` this is the value of the property
|
|
|
- on the consuming target rather than the target specifying the
|
|
|
- requirement.
|
|
|
+ Value of the property ``prop`` on the target for which the expression
|
|
|
+ is being evaluated. Note that for generator expressions in
|
|
|
+ :ref:`Target Usage Requirements` this is the consuming target rather
|
|
|
+ than the target specifying the requirement.
|
|
|
``$<INSTALL_PREFIX>``
|
|
|
Content of the install prefix when the target is exported via
|
|
|
:command:`install(EXPORT)`, or when evaluated in
|