| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270 | 
							- .. cmake-manual-description: CMake Generator Expressions
 
- cmake-generator-expressions(7)
 
- ******************************
 
- .. only:: html
 
-    .. contents::
 
- Introduction
 
- ============
 
- Generator expressions are evaluated during build system generation to produce
 
- information specific to each build configuration.
 
- Generator expressions are allowed in the context of many target properties,
 
- such as :prop_tgt:`LINK_LIBRARIES`, :prop_tgt:`INCLUDE_DIRECTORIES`,
 
- :prop_tgt:`COMPILE_DEFINITIONS` and others.  They may also be used when using
 
- commands to populate those properties, such as :command:`target_link_libraries`,
 
- :command:`target_include_directories`, :command:`target_compile_definitions`
 
- and others.
 
- They enable conditional linking, conditional definitions used when compiling,
 
- conditional include directories, and more.  The conditions may be based on
 
- the build configuration, target properties, platform information or any other
 
- queryable information.
 
- Generator expressions have the form ``$<...>``.  To avoid confusion, this page
 
- deviates from most of the CMake documentation in that it omits angular brackets
 
- ``<...>`` around placeholders like ``condition``, ``string``, ``target``,
 
- among others.
 
- Generator expressions can be nested, as shown in most of the examples below.
 
- .. _`Boolean Generator Expressions`:
 
- Boolean Generator Expressions
 
- =============================
 
- Boolean expressions evaluate to either ``0`` or ``1``.
 
- They are typically used to construct the condition in a :ref:`conditional
 
- generator expression<Conditional Generator Expressions>`.
 
- Available boolean expressions are:
 
- Logical Operators
 
- -----------------
 
- .. genex:: $<BOOL:string>
 
-   Converts ``string`` to ``0`` or ``1``. Evaluates to ``0`` if any of the
 
-   following is true:
 
-   * ``string`` is empty,
 
-   * ``string`` is a case-insensitive equal of
 
-     ``0``, ``FALSE``, ``OFF``, ``N``, ``NO``, ``IGNORE``, or ``NOTFOUND``, or
 
-   * ``string`` ends in the suffix ``-NOTFOUND`` (case-sensitive).
 
-   Otherwise evaluates to ``1``.
 
- .. genex:: $<AND:conditions>
 
-   where ``conditions`` is a comma-separated list of boolean expressions.
 
-   Evaluates to ``1`` if all conditions are ``1``.
 
-   Otherwise evaluates to ``0``.
 
- .. genex:: $<OR:conditions>
 
-   where ``conditions`` is a comma-separated list of boolean expressions.
 
-   Evaluates to ``1`` if at least one of the conditions is ``1``.
 
-   Otherwise evaluates to ``0``.
 
- .. genex:: $<NOT:condition>
 
-   ``0`` if ``condition`` is ``1``, else ``1``.
 
- String Comparisons
 
- ------------------
 
- .. genex:: $<STREQUAL:string1,string2>
 
-   ``1`` if ``string1`` and ``string2`` are equal, else ``0``.
 
-   The comparison is case-sensitive.  For a case-insensitive comparison,
 
-   combine with a :ref:`string transforming generator expression
 
-   <String Transforming Generator Expressions>`,
 
-   .. code-block:: cmake
 
-     $<STREQUAL:$<UPPER_CASE:${foo}>,"BAR"> # "1" if ${foo} is any of "BAR", "Bar", "bar", ...
 
- .. genex:: $<EQUAL:value1,value2>
 
-   ``1`` if ``value1`` and ``value2`` are numerically equal, else ``0``.
 
- .. genex:: $<IN_LIST:string,list>
 
-   .. versionadded:: 3.12
 
-   ``1`` if ``string`` is member of the semicolon-separated ``list``, else ``0``.
 
-   Uses case-sensitive comparisons.
 
- .. genex:: $<VERSION_LESS:v1,v2>
 
-   ``1`` if ``v1`` is a version less than ``v2``, else ``0``.
 
- .. genex:: $<VERSION_GREATER:v1,v2>
 
-   ``1`` if ``v1`` is a version greater than ``v2``, else ``0``.
 
- .. genex:: $<VERSION_EQUAL:v1,v2>
 
-   ``1`` if ``v1`` is the same version as ``v2``, else ``0``.
 
- .. genex:: $<VERSION_LESS_EQUAL:v1,v2>
 
-   .. versionadded:: 3.7
 
-   ``1`` if ``v1`` is a version less than or equal to ``v2``, else ``0``.
 
- .. genex:: $<VERSION_GREATER_EQUAL:v1,v2>
 
-   .. versionadded:: 3.7
 
-   ``1`` if ``v1`` is a version greater than or equal to ``v2``, else ``0``.
 
- Variable Queries
 
- ----------------
 
- .. genex:: $<TARGET_EXISTS:target>
 
-   .. versionadded:: 3.12
 
-   ``1`` if ``target`` exists, else ``0``.
 
- .. genex:: $<CONFIG:cfgs>
 
-   ``1`` if config is any one of the entries in comma-separated list
 
-   ``cfgs``, else ``0``. This is a case-insensitive comparison. The mapping in
 
-   :prop_tgt:`MAP_IMPORTED_CONFIG_<CONFIG>` is also considered by this
 
-   expression when it is evaluated on a property on an :prop_tgt:`IMPORTED`
 
-   target.
 
- .. genex:: $<PLATFORM_ID:platform_ids>
 
-   where ``platform_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's platform id matches any one of the entries in
 
-   ``platform_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_SYSTEM_NAME` variable.
 
- .. genex:: $<C_COMPILER_ID:compiler_ids>
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the C compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<CXX_COMPILER_ID:compiler_ids>
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the CXX compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<CUDA_COMPILER_ID:compiler_ids>
 
-   .. versionadded:: 3.15
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the CUDA compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<OBJC_COMPILER_ID:compiler_ids>
 
-   .. versionadded:: 3.16
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the Objective-C compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<OBJCXX_COMPILER_ID:compiler_ids>
 
-   .. versionadded:: 3.16
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the Objective-C++ compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<Fortran_COMPILER_ID:compiler_ids>
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the Fortran compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<HIP_COMPILER_ID:compiler_ids>
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the HIP compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<ISPC_COMPILER_ID:compiler_ids>
 
-   .. versionadded:: 3.19
 
-   where ``compiler_ids`` is a comma-separated list.
 
-   ``1`` if the CMake's compiler id of the ISPC compiler matches any one
 
-   of the entries in ``compiler_ids``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<C_COMPILER_VERSION:version>
 
-   ``1`` if the version of the C compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<CXX_COMPILER_VERSION:version>
 
-   ``1`` if the version of the CXX compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<CUDA_COMPILER_VERSION:version>
 
-   .. versionadded:: 3.15
 
-   ``1`` if the version of the CXX compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<OBJC_COMPILER_VERSION:version>
 
-   .. versionadded:: 3.16
 
-   ``1`` if the version of the OBJC compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<OBJCXX_COMPILER_VERSION:version>
 
-   .. versionadded:: 3.16
 
-   ``1`` if the version of the OBJCXX compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<Fortran_COMPILER_VERSION:version>
 
-   ``1`` if the version of the Fortran compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<HIP_COMPILER_VERSION:version>
 
-   ``1`` if the version of the HIP compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<ISPC_COMPILER_VERSION:version>
 
-   .. versionadded:: 3.19
 
-   ``1`` if the version of the ISPC compiler matches ``version``, otherwise ``0``.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<TARGET_POLICY:policy>
 
-   ``1`` if the ``policy`` was NEW when the 'head' target was created,
 
-   else ``0``.  If the ``policy`` was not set, the warning message for the policy
 
-   will be emitted. This generator expression only works for a subset of
 
-   policies.
 
- .. genex:: $<COMPILE_FEATURES:features>
 
-   .. versionadded:: 3.1
 
-   where ``features`` is a comma-spearated list.
 
-   Evaluates to ``1`` if all of the ``features`` are available for the 'head'
 
-   target, and ``0`` otherwise. If this expression is used while evaluating
 
-   the link implementation of a target and if any dependency transitively
 
-   increases the required :prop_tgt:`C_STANDARD` or :prop_tgt:`CXX_STANDARD`
 
-   for the 'head' target, an error is reported.  See the
 
-   :manual:`cmake-compile-features(7)` manual for information on
 
-   compile features and a list of supported compilers.
 
- .. _`Boolean COMPILE_LANGUAGE Generator Expression`:
 
- .. genex:: $<COMPILE_LANG_AND_ID:language,compiler_ids>
 
-   .. versionadded:: 3.15
 
-   ``1`` when the language used for compilation unit matches ``language`` and
 
-   the CMake's compiler id of the language compiler matches any one of the
 
-   entries in ``compiler_ids``, otherwise ``0``. This expression is a short form
 
-   for the combination of ``$<COMPILE_LANGUAGE:language>`` and
 
-   ``$<LANG_COMPILER_ID:compiler_ids>``. This expression may be used to specify
 
-   compile options, compile definitions, and include directories for source files of a
 
-   particular language and compiler combination in a target. For example:
 
-   .. code-block:: cmake
 
-     add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
 
-     target_compile_definitions(myapp
 
-       PRIVATE $<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:COMPILING_CXX_WITH_CLANG>
 
-               $<$<COMPILE_LANG_AND_ID:CXX,Intel>:COMPILING_CXX_WITH_INTEL>
 
-               $<$<COMPILE_LANG_AND_ID:C,Clang>:COMPILING_C_WITH_CLANG>
 
-     )
 
-   This specifies the use of different compile definitions based on both
 
-   the compiler id and compilation language. This example will have a
 
-   ``COMPILING_CXX_WITH_CLANG`` compile definition when Clang is the CXX
 
-   compiler, and ``COMPILING_CXX_WITH_INTEL`` when Intel is the CXX compiler.
 
-   Likewise when the C compiler is Clang it will only see the  ``COMPILING_C_WITH_CLANG``
 
-   definition.
 
-   Without the ``COMPILE_LANG_AND_ID`` generator expression the same logic
 
-   would be expressed as:
 
-   .. code-block:: cmake
 
-     target_compile_definitions(myapp
 
-       PRIVATE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:AppleClang,Clang>>:COMPILING_CXX_WITH_CLANG>
 
-               $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:Intel>>:COMPILING_CXX_WITH_INTEL>
 
-               $<$<AND:$<COMPILE_LANGUAGE:C>,$<C_COMPILER_ID:Clang>>:COMPILING_C_WITH_CLANG>
 
-     )
 
- .. genex:: $<COMPILE_LANGUAGE:languages>
 
-   .. versionadded:: 3.3
 
-   ``1`` when the language used for compilation unit matches any of the entries
 
-   in ``languages``, otherwise ``0``.  This expression may be used to specify
 
-   compile options, compile definitions, and include directories for source files of a
 
-   particular language in a target. For example:
 
-   .. code-block:: cmake
 
-     add_executable(myapp main.cpp foo.c bar.cpp zot.cu)
 
-     target_compile_options(myapp
 
-       PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-fno-exceptions>
 
-     )
 
-     target_compile_definitions(myapp
 
-       PRIVATE $<$<COMPILE_LANGUAGE:CXX>:COMPILING_CXX>
 
-               $<$<COMPILE_LANGUAGE:CUDA>:COMPILING_CUDA>
 
-     )
 
-     target_include_directories(myapp
 
-       PRIVATE $<$<COMPILE_LANGUAGE:CXX,CUDA>:/opt/foo/headers>
 
-     )
 
-   This specifies the use of the ``-fno-exceptions`` compile option,
 
-   ``COMPILING_CXX`` compile definition, and ``cxx_headers`` include
 
-   directory for C++ only (compiler id checks elided).  It also specifies
 
-   a ``COMPILING_CUDA`` compile definition for CUDA.
 
-   Note that with :ref:`Visual Studio Generators` and :generator:`Xcode` there
 
-   is no way to represent target-wide compile definitions or include directories
 
-   separately for ``C`` and ``CXX`` languages.
 
-   Also, with :ref:`Visual Studio Generators` there is no way to represent
 
-   target-wide flags separately for ``C`` and ``CXX`` languages.  Under these
 
-   generators, expressions for both C and C++ sources will be evaluated
 
-   using ``CXX`` if there are any C++ sources and otherwise using ``C``.
 
-   A workaround is to create separate libraries for each source file language
 
-   instead:
 
-   .. code-block:: cmake
 
-     add_library(myapp_c foo.c)
 
-     add_library(myapp_cxx bar.cpp)
 
-     target_compile_options(myapp_cxx PUBLIC -fno-exceptions)
 
-     add_executable(myapp main.cpp)
 
-     target_link_libraries(myapp myapp_c myapp_cxx)
 
- .. _`Boolean LINK_LANGUAGE Generator Expression`:
 
- .. genex:: $<LINK_LANG_AND_ID:language,compiler_ids>
 
-   .. versionadded:: 3.18
 
-   ``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.
 
- .. genex:: $<LINK_LANGUAGE:languages>
 
-   .. versionadded:: 3.18
 
-   ``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.
 
- .. genex:: $<DEVICE_LINK:list>
 
-   .. versionadded:: 3.18
 
-   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 and
 
-   policy :policy:`CMP0105`. This expression can only be used to specify link
 
-   options.
 
- .. genex:: $<HOST_LINK:list>
 
-   .. versionadded:: 3.18
 
-   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
 
- ===================================
 
- These expressions expand to some string.
 
- For example,
 
- .. code-block:: cmake
 
-   include_directories(/usr/include/$<CXX_COMPILER_ID>/)
 
- expands to ``/usr/include/GNU/`` or ``/usr/include/Clang/`` etc, depending on
 
- the compiler identifier.
 
- String-valued expressions may also be combined with other expressions.
 
- Here an example for a string-valued expression within a boolean expressions
 
- within a conditional expression:
 
- .. code-block:: cmake
 
-   $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER>
 
- expands to ``OLD_COMPILER`` if the
 
- :variable:`CMAKE_CXX_COMPILER_VERSION <CMAKE_<LANG>_COMPILER_VERSION>` is less
 
- than 4.2.0.
 
- And here two nested string-valued expressions:
 
- .. code-block:: cmake
 
-   -I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>
 
- generates a string of the entries in the :prop_tgt:`INCLUDE_DIRECTORIES` target
 
- property with each entry preceded by ``-I``.
 
- Expanding on the previous example, if one first wants to check if the
 
- ``INCLUDE_DIRECTORIES`` property is non-empty, then it is advisable to
 
- introduce a helper variable to keep the code readable:
 
- .. code-block:: cmake
 
-   set(prop "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>") # helper variable
 
-   $<$<BOOL:${prop}>:-I$<JOIN:${prop}, -I>>
 
- The following string-valued generator expressions are available:
 
- Escaped Characters
 
- ------------------
 
- String literals to escape the special meaning a character would otherwise have:
 
- .. genex:: $<ANGLE-R>
 
-   A literal ``>``. Used for example to compare strings that contain a ``>``.
 
- .. genex:: $<COMMA>
 
-   A literal ``,``. Used for example to compare strings which contain a ``,``.
 
- .. genex:: $<SEMICOLON>
 
-   A literal ``;``. Used to prevent list expansion on an argument with ``;``.
 
- .. _`Conditional Generator Expressions`:
 
- Conditional Expressions
 
- -----------------------
 
- Conditional generator expressions depend on a boolean condition
 
- that must be ``0`` or ``1``.
 
- .. genex:: $<condition:true_string>
 
-   Evaluates to ``true_string`` if ``condition`` is ``1``.
 
-   Otherwise evaluates to the empty string.
 
- .. genex:: $<IF:condition,true_string,false_string>
 
-   .. versionadded:: 3.8
 
-   Evaluates to ``true_string`` if ``condition`` is ``1``.
 
-   Otherwise evaluates to ``false_string``.
 
- Typically, the ``condition`` is a :ref:`boolean generator expression
 
- <Boolean Generator Expressions>`.  For instance,
 
- .. code-block:: cmake
 
-   $<$<CONFIG:Debug>:DEBUG_MODE>
 
- expands to ``DEBUG_MODE`` when the ``Debug`` configuration is used, and
 
- otherwise expands to the empty string.
 
- .. _`String Transforming Generator Expressions`:
 
- String Transformations
 
- ----------------------
 
- .. genex:: $<JOIN:list,string>
 
-   Joins the list with the content of ``string``.
 
- .. genex:: $<REMOVE_DUPLICATES:list>
 
-   .. versionadded:: 3.15
 
-   Removes duplicated items in the given ``list``.
 
- .. genex:: $<FILTER:list,INCLUDE|EXCLUDE,regex>
 
-   .. versionadded:: 3.15
 
-   Includes or removes items from ``list`` that match the regular expression ``regex``.
 
- .. genex:: $<LOWER_CASE:string>
 
-   Content of ``string`` converted to lower case.
 
- .. genex:: $<UPPER_CASE:string>
 
-   Content of ``string`` converted to upper case.
 
- .. genex:: $<GENEX_EVAL:expr>
 
-   .. versionadded:: 3.12
 
-   Content of ``expr`` evaluated as a generator expression in the current
 
-   context. This enables consumption of generator expressions whose
 
-   evaluation results itself in generator expressions.
 
- .. genex:: $<TARGET_GENEX_EVAL:tgt,expr>
 
-   .. versionadded:: 3.12
 
-   Content of ``expr`` evaluated as a generator expression in the context of
 
-   ``tgt`` target. This enables consumption of custom target properties that
 
-   themselves contain generator expressions.
 
-   Having the capability to evaluate generator expressions is very useful when
 
-   you want to manage custom properties supporting generator expressions.
 
-   For example:
 
-   .. code-block:: cmake
 
-     add_library(foo ...)
 
-     set_property(TARGET foo PROPERTY
 
-       CUSTOM_KEYS $<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>
 
-     )
 
-     add_custom_target(printFooKeys
 
-       COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_PROPERTY:foo,CUSTOM_KEYS>
 
-     )
 
-   This naive implementation of the ``printFooKeys`` custom command is wrong
 
-   because ``CUSTOM_KEYS`` target property is not evaluated and the content
 
-   is passed as is (i.e. ``$<$<CONFIG:DEBUG>:FOO_EXTRA_THINGS>``).
 
-   To have the expected result (i.e. ``FOO_EXTRA_THINGS`` if config is
 
-   ``Debug``), it is required to evaluate the output of
 
-   ``$<TARGET_PROPERTY:foo,CUSTOM_KEYS>``:
 
-   .. code-block:: cmake
 
-     add_custom_target(printFooKeys
 
-       COMMAND ${CMAKE_COMMAND} -E
 
-         echo $<TARGET_GENEX_EVAL:foo,$<TARGET_PROPERTY:foo,CUSTOM_KEYS>>
 
-     )
 
- Variable Queries
 
- ----------------
 
- .. genex:: $<CONFIG>
 
-   Configuration name.
 
- .. genex:: $<CONFIGURATION>
 
-   Configuration name. Deprecated since CMake 3.0. Use ``CONFIG`` instead.
 
- .. genex:: $<PLATFORM_ID>
 
-   The current system's CMake platform id.
 
-   See also the :variable:`CMAKE_SYSTEM_NAME` variable.
 
- .. genex:: $<C_COMPILER_ID>
 
-   The CMake's compiler id of the C compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<CXX_COMPILER_ID>
 
-   The CMake's compiler id of the CXX compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<CUDA_COMPILER_ID>
 
-   The CMake's compiler id of the CUDA compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<OBJC_COMPILER_ID>
 
-   .. versionadded:: 3.16
 
-   The CMake's compiler id of the OBJC compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<OBJCXX_COMPILER_ID>
 
-   .. versionadded:: 3.16
 
-   The CMake's compiler id of the OBJCXX compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<Fortran_COMPILER_ID>
 
-   The CMake's compiler id of the Fortran compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<HIP_COMPILER_ID>
 
-   The CMake's compiler id of the HIP compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<ISPC_COMPILER_ID>
 
-   .. versionadded:: 3.19
 
-   The CMake's compiler id of the ISPC compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_ID` variable.
 
- .. genex:: $<C_COMPILER_VERSION>
 
-   The version of the C compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<CXX_COMPILER_VERSION>
 
-   The version of the CXX compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<CUDA_COMPILER_VERSION>
 
-   The version of the CUDA compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<OBJC_COMPILER_VERSION>
 
-   .. versionadded:: 3.16
 
-   The version of the OBJC compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<OBJCXX_COMPILER_VERSION>
 
-   .. versionadded:: 3.16
 
-   The version of the OBJCXX compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<Fortran_COMPILER_VERSION>
 
-   The version of the Fortran compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<HIP_COMPILER_VERSION>
 
-   The version of the HIP compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<ISPC_COMPILER_VERSION>
 
-   .. versionadded:: 3.19
 
-   The version of the ISPC compiler used.
 
-   See also the :variable:`CMAKE_<LANG>_COMPILER_VERSION` variable.
 
- .. genex:: $<COMPILE_LANGUAGE>
 
-   .. versionadded:: 3.3
 
-   The compile language of source files when evaluating compile options.
 
-   See :ref:`the related boolean expression
 
-   <Boolean COMPILE_LANGUAGE Generator Expression>`
 
-   ``$<COMPILE_LANGUAGE:language>``
 
-   for notes about the portability of this generator expression.
 
- .. genex:: $<LINK_LANGUAGE>
 
-   .. versionadded:: 3.18
 
-   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`:
 
- 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``.
 
- .. genex:: $<TARGET_NAME_IF_EXISTS:tgt>
 
-   .. versionadded:: 3.12
 
-   The target name ``tgt`` if the target exists, an empty string otherwise.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_FILE:tgt>
 
-   Full path to the ``tgt`` binary file.
 
- .. genex:: $<TARGET_FILE_BASE_NAME:tgt>
 
-   .. versionadded:: 3.15
 
-   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`
 
-   target properties and their configuration specific variants
 
-   :prop_tgt:`OUTPUT_NAME_<CONFIG>`, :prop_tgt:`ARCHIVE_OUTPUT_NAME_<CONFIG>`,
 
-   :prop_tgt:`LIBRARY_OUTPUT_NAME_<CONFIG>` and
 
-   :prop_tgt:`RUNTIME_OUTPUT_NAME_<CONFIG>`.
 
-   The :prop_tgt:`<CONFIG>_POSTFIX` and :prop_tgt:`DEBUG_POSTFIX` target
 
-   properties can also be considered.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_FILE_PREFIX:tgt>
 
-   .. versionadded:: 3.15
 
-   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.
 
- .. genex:: $<TARGET_FILE_SUFFIX:tgt>
 
-   .. versionadded:: 3.15
 
-   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.
 
- .. genex:: $<TARGET_FILE_NAME:tgt>
 
-   The ``tgt`` filename.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_FILE_DIR:tgt>
 
-   Directory of the ``tgt`` binary file.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_LINKER_FILE:tgt>
 
-   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.
 
- .. genex:: $<TARGET_LINKER_FILE_BASE_NAME:tgt>
 
-   .. versionadded:: 3.15
 
-   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`,
 
-   and :prop_tgt:`LIBRARY_OUTPUT_NAME` target properties and their configuration
 
-   specific variants :prop_tgt:`OUTPUT_NAME_<CONFIG>`,
 
-   :prop_tgt:`ARCHIVE_OUTPUT_NAME_<CONFIG>` and
 
-   :prop_tgt:`LIBRARY_OUTPUT_NAME_<CONFIG>`.
 
-   The :prop_tgt:`<CONFIG>_POSTFIX` and :prop_tgt:`DEBUG_POSTFIX` target
 
-   properties can also be considered.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_LINKER_FILE_PREFIX:tgt>
 
-   .. versionadded:: 3.15
 
-   Prefix of file used to link target ``tgt``.
 
-   See also the :prop_tgt:`PREFIX` and :prop_tgt:`IMPORT_PREFIX` target
 
-   properties.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_LINKER_FILE_SUFFIX:tgt>
 
-   .. versionadded:: 3.15
 
-   Suffix of file used to link where ``tgt`` is the name of a target.
 
-   The suffix corresponds to the file extension (such as ".so" or ".lib").
 
-   See also the :prop_tgt:`SUFFIX` and :prop_tgt:`IMPORT_SUFFIX` target
 
-   properties.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_LINKER_FILE_NAME:tgt>
 
-   Name of file used to link target ``tgt``.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_LINKER_FILE_DIR:tgt>
 
-   Directory of file used to link target ``tgt``.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_SONAME_FILE:tgt>
 
-   File with soname (``.so.3``) where ``tgt`` is the name of a target.
 
- .. genex:: $<TARGET_SONAME_FILE_NAME:tgt>
 
-   Name of file with soname (``.so.3``).
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_SONAME_FILE_DIR:tgt>
 
-   Directory of with soname (``.so.3``).
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_PDB_FILE:tgt>
 
-   .. versionadded:: 3.1
 
-   Full path to the linker generated program database file (.pdb)
 
-   where ``tgt`` is the name of a target.
 
-   See also the :prop_tgt:`PDB_NAME` and :prop_tgt:`PDB_OUTPUT_DIRECTORY`
 
-   target properties and their configuration specific variants
 
-   :prop_tgt:`PDB_NAME_<CONFIG>` and :prop_tgt:`PDB_OUTPUT_DIRECTORY_<CONFIG>`.
 
- .. genex:: $<TARGET_PDB_FILE_BASE_NAME:tgt>
 
-   .. versionadded:: 3.15
 
-   Base name of the linker generated program database file (.pdb)
 
-   where ``tgt`` is the name of a target.
 
-   The base name corresponds to the target PDB file name (see
 
-   ``$<TARGET_PDB_FILE_NAME:tgt>``) without prefix and suffix. For example,
 
-   if target file name is ``base.pdb``, the base name is ``base``.
 
-   See also the :prop_tgt:`PDB_NAME` target property and its configuration
 
-   specific variant :prop_tgt:`PDB_NAME_<CONFIG>`.
 
-   The :prop_tgt:`<CONFIG>_POSTFIX` and :prop_tgt:`DEBUG_POSTFIX` target
 
-   properties can also be considered.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_PDB_FILE_NAME:tgt>
 
-   .. versionadded:: 3.1
 
-   Name of the linker generated program database file (.pdb).
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_PDB_FILE_DIR:tgt>
 
-   .. versionadded:: 3.1
 
-   Directory of the linker generated program database file (.pdb).
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_BUNDLE_DIR:tgt>
 
-   .. versionadded:: 3.9
 
-   Full path to the bundle directory (``my.app``, ``my.framework``, or
 
-   ``my.bundle``) where ``tgt`` is the name of a target.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_BUNDLE_CONTENT_DIR:tgt>
 
-   .. versionadded:: 3.9
 
-   Full path to the bundle content directory where ``tgt`` is the name of a
 
-   target. For the macOS SDK it leads to ``my.app/Contents``, ``my.framework``,
 
-   or ``my.bundle/Contents``. For all other SDKs (e.g. iOS) it leads to
 
-   ``my.app``, ``my.framework``, or ``my.bundle`` due to the flat bundle
 
-   structure.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on (see policy :policy:`CMP0112`).
 
- .. genex:: $<TARGET_PROPERTY:tgt,prop>
 
-   Value of the property ``prop`` on the target ``tgt``.
 
-   Note that ``tgt`` is not added as a dependency of the target this
 
-   expression is evaluated on.
 
- .. genex:: $<TARGET_PROPERTY:prop>
 
-   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.
 
- .. genex:: $<TARGET_RUNTIME_DLLS:tgt>
 
-   .. versionadded:: 3.21
 
-   List of DLLs that the target depends on at runtime. This is determined by
 
-   the locations of all the ``SHARED`` and ``MODULE`` targets in the target's
 
-   transitive dependencies. Using this generator expression on targets other
 
-   than executables, ``SHARED`` libraries, and ``MODULE`` libraries is an error.
 
-   On non-DLL platforms, it evaluates to an empty string.
 
-   This generator expression can be used to copy all of the DLLs that a target
 
-   depends on into its output directory in a ``POST_BUILD`` custom command. For
 
-   example:
 
-   .. code-block:: cmake
 
-     find_package(foo CONFIG REQUIRED) # package generated by install(EXPORT)
 
-     add_executable(exe main.c)
 
-     target_link_libraries(exe PRIVATE foo::foo foo::bar)
 
-     add_custom_command(TARGET exe POST_BUILD
 
-       COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
 
-       COMMAND_EXPAND_LISTS
 
-       )
 
-   .. note::
 
-     :ref:`Imported Targets` are supported only if they know the location
 
-     of their ``.dll`` files.  An imported ``SHARED`` or ``MODULE`` library
 
-     must have :prop_tgt:`IMPORTED_LOCATION` set to its ``.dll`` file.  See
 
-     the :ref:`add_library imported libraries <add_library imported libraries>`
 
-     section for details.  Many :ref:`Find Modules` produce imported targets
 
-     with the ``UNKNOWN`` type and therefore will be ignored.
 
- .. genex:: $<INSTALL_PREFIX>
 
-   Content of the install prefix when the target is exported via
 
-   :command:`install(EXPORT)`, or when evaluated in the
 
-   :prop_tgt:`INSTALL_NAME_DIR` property or the ``INSTALL_NAME_DIR`` argument of
 
-   :command:`install(RUNTIME_DEPENDENCY_SET)`, and empty otherwise.
 
- Output-Related Expressions
 
- --------------------------
 
- .. genex:: $<TARGET_NAME:...>
 
-   Marks ``...`` as being the name of a target.  This is required if exporting
 
-   targets to multiple dependent export sets.  The ``...`` must be a literal
 
-   name of a target- it may not contain generator expressions.
 
- .. genex:: $<LINK_ONLY:...>
 
-   .. versionadded:: 3.1
 
-   Content of ``...`` except when evaluated in a link interface while
 
-   propagating :ref:`Target Usage Requirements`, in which case it is the
 
-   empty string.
 
-   Intended for use only in an :prop_tgt:`INTERFACE_LINK_LIBRARIES` target
 
-   property, perhaps via the :command:`target_link_libraries` command,
 
-   to specify private link dependencies without other usage requirements.
 
- .. genex:: $<LINK_LIBRARY:feature,library-list>
 
-   .. versionadded:: 3.24
 
-   Manage how libraries are specified during the link step.
 
-   This expression may be used to specify how to link libraries in a target.
 
-   For example:
 
-   .. code-block:: cmake
 
-     add_library(lib1 STATIC ...)
 
-     add_library(lib2 ...)
 
-     target_link_libraries(lib2 PRIVATE $<LINK_LIBRARY:whole_archive,lib1>)
 
-   This specify to use the ``lib1`` target with feature ``whole_archive`` for
 
-   linking target ``lib2``. The feature must have be defined by
 
-   :variable:`CMAKE_<LANG>_LINK_USING_<FEATURE>` variable or, if
 
-   :variable:`CMAKE_<LANG>_LINK_USING_<FEATURE>_SUPPORTED` is false,
 
-   by :variable:`CMAKE_LINK_USING_<FEATURE>` variable.
 
-   .. note::
 
-     The evaluation of this generator expression will use, for the following
 
-     variables, the values defined at the level of the creation of the target:
 
-     * :variable:`CMAKE_<LANG>_LINK_USING_<FEATURE>_SUPPORTED`
 
-     * :variable:`CMAKE_<LANG>_LINK_USING_<FEATURE>`
 
-     * :variable:`CMAKE_LINK_USING_<FEATURE>_SUPPORTED`
 
-     * :variable:`CMAKE_LINK_USING_<FEATURE>`
 
-   This expression can only be used to specify link libraries (i.e. part of
 
-   :command:`link_libraries` or :command:`target_link_libraries` commands and
 
-   :prop_tgt:`LINK_LIBRARIES` or :prop_tgt:`INTERFACE_LINK_LIBRARIES` target
 
-   properties).
 
-   .. note::
 
-     If this expression appears in the :prop_tgt:`INTERFACE_LINK_LIBRARIES`
 
-     property of a target, it will be included in the imported target generated
 
-     by :command:`install(EXPORT)` command. It is the responsibility of the
 
-     environment consuming this import to define the link feature used by this
 
-     expression.
 
-   The ``library-list`` argument can hold CMake targets or external libraries.
 
-   Any ``CMake`` target of type :ref:`OBJECT <Object Libraries>` or
 
-   :ref:`INTERFACE <Interface Libraries>` will be ignored by this expression and
 
-   will be handled in the standard way.
 
-   Each target or external library involved in the link step must have only one
 
-   kind of feature (the absence of feature is also incompatible with any
 
-   feature). For example:
 
-   .. code-block:: cmake
 
-     add_library(lib1 ...)
 
-     add_library(lib2 ...)
 
-     target_link_libraries(lib2 PUBLIC $<LINK_LIBRARY:feature1,lib1>)
 
-     add_library(lib3 ...)
 
-     target_link_libraries(lib3 PRIVATE lib1 lib2)
 
-     # an error will be raised here because lib1 has two different features
 
-   To resolve such incompatibilities, the :prop_tgt:`LINK_LIBRARY_OVERRIDE`
 
-   and  :prop_tgt:`LINK_LIBRARY_OVERRIDE_<LIBRARY>` target properties can be
 
-   used.
 
-   .. note::
 
-     This expression does not guarantee that the list of specified libraries
 
-     will be kept grouped. So, constructs like ``start-group`` and
 
-     ``end-group``, as supported by ``GNU ld``, cannot be used.
 
-   ``CMake`` pre-defines some features of general interest:
 
-   .. include:: ../variable/LINK_LIBRARY_PREDEFINED_FEATURES.txt
 
- .. genex:: $<INSTALL_INTERFACE:...>
 
-   Content of ``...`` when the property is exported using :command:`install(EXPORT)`,
 
-   and empty otherwise.
 
- .. genex:: $<BUILD_INTERFACE:...>
 
-   Content of ``...`` when the property is exported using :command:`export`, or
 
-   when the target is used by another target in the same buildsystem. Expands to
 
-   the empty string otherwise.
 
- .. genex:: $<MAKE_C_IDENTIFIER:...>
 
-   Content of ``...`` converted to a C identifier.  The conversion follows the
 
-   same behavior as :command:`string(MAKE_C_IDENTIFIER)`.
 
- .. genex:: $<TARGET_OBJECTS:objLib>
 
-   .. versionadded:: 3.1
 
-   List of objects resulting from build of ``objLib``.
 
- .. genex:: $<SHELL_PATH:...>
 
-   .. versionadded:: 3.4
 
-   Content of ``...`` converted to shell path style. For example, slashes are
 
-   converted to backslashes in Windows shells and drive letters are converted
 
-   to posix paths in MSYS shells. The ``...`` must be an absolute path.
 
-   .. versionadded:: 3.14
 
-     The ``...`` may be a :ref:`semicolon-separated list <CMake Language Lists>`
 
-     of paths, in which case each path is converted individually and a result
 
-     list is generated using the shell path separator (``:`` on POSIX and
 
-     ``;`` on Windows).  Be sure to enclose the argument containing this genex
 
-     in double quotes in CMake source code so that ``;`` does not split arguments.
 
- .. genex:: $<OUTPUT_CONFIG:...>
 
-   .. versionadded:: 3.20
 
-   Only valid in :command:`add_custom_command` and :command:`add_custom_target`
 
-   as the outer-most generator expression in an argument.
 
-   With the :generator:`Ninja Multi-Config` generator, generator expressions
 
-   in ``...`` are evaluated using the custom command's "output config".
 
-   With other generators, the content of ``...`` is evaluated normally.
 
- .. genex:: $<COMMAND_CONFIG:...>
 
-   .. versionadded:: 3.20
 
-   Only valid in :command:`add_custom_command` and :command:`add_custom_target`
 
-   as the outer-most generator expression in an argument.
 
-   With the :generator:`Ninja Multi-Config` generator, generator expressions
 
-   in ``...`` are evaluated using the custom command's "command config".
 
-   With other generators, the content of ``...`` is evaluated normally.
 
- Debugging
 
- =========
 
- Since generator expressions are evaluated during generation of the buildsystem,
 
- and not during processing of ``CMakeLists.txt`` files, it is not possible to
 
- inspect their result with the :command:`message()` command.
 
- One possible way to generate debug messages is to add a custom target,
 
- .. code-block:: cmake
 
-   add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
 
- The shell command ``make genexdebug`` (invoked after execution of ``cmake``)
 
- would then print the result of ``$<...>``.
 
- Another way is to write debug messages to a file:
 
- .. code-block:: cmake
 
-   file(GENERATE OUTPUT filename CONTENT "$<...>")
 
 
  |