.\" Man page generated from reStructuredText.
.
.TH "CMAKE-BUILDSYSTEM" "7" "Apr 12, 2022" "3.23.1" "CMake"
.SH NAME
cmake-buildsystem \- CMake Buildsystem Reference
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH INTRODUCTION
.sp
A CMake\-based buildsystem is organized as a set of high\-level logical
targets.  Each target corresponds to an executable or library, or
is a custom target containing custom commands.  Dependencies between the
targets are expressed in the buildsystem to determine the build order
and the rules for regeneration in response to change.
.SH BINARY TARGETS
.sp
Executables and libraries are defined using the \fBadd_executable()\fP
and \fBadd_library()\fP commands.  The resulting binary files have
appropriate \fBPREFIX\fP, \fBSUFFIX\fP and extensions for the
platform targeted. Dependencies between binary targets are expressed using
the \fBtarget_link_libraries()\fP command:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive archive.cpp zip.cpp lzma.cpp)
add_executable(zipapp zipapp.cpp)
target_link_libraries(zipapp archive)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
\fBarchive\fP is defined as a \fBSTATIC\fP library \-\- an archive containing objects
compiled from \fBarchive.cpp\fP, \fBzip.cpp\fP, and \fBlzma.cpp\fP\&.  \fBzipapp\fP
is defined as an executable formed by compiling and linking \fBzipapp.cpp\fP\&.
When linking the \fBzipapp\fP executable, the \fBarchive\fP static library is
linked in.
.SS Binary Executables
.sp
The \fBadd_executable()\fP command defines an executable target:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_executable(mytool mytool.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Commands such as \fBadd_custom_command()\fP, which generates rules to be
run at build time can transparently use an \fBEXECUTABLE\fP
target as a \fBCOMMAND\fP executable.  The buildsystem rules will ensure that
the executable is built before attempting to run the command.
.SS Binary Library Types
.SS Normal Libraries
.sp
By default, the \fBadd_library()\fP command defines a \fBSTATIC\fP library,
unless a type is specified.  A type may be specified when using the command:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The \fBBUILD_SHARED_LIBS\fP variable may be enabled to change the
behavior of \fBadd_library()\fP to build shared libraries by default.
.sp
In the context of the buildsystem definition as a whole, it is largely
irrelevant whether particular libraries are \fBSHARED\fP or \fBSTATIC\fP \-\-
the commands, dependency specifications and other APIs work similarly
regardless of the library type.  The \fBMODULE\fP library type is
dissimilar in that it is generally not linked to \-\- it is not used in
the right\-hand\-side of the \fBtarget_link_libraries()\fP command.
It is a type which is loaded as a plugin using runtime techniques.
If the library does not export any unmanaged symbols (e.g. Windows
resource DLL, C++/CLI DLL), it is required that the library not be a
\fBSHARED\fP library because CMake expects \fBSHARED\fP libraries to export
at least one symbol.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive MODULE 7z.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.SS Apple Frameworks
.sp
A \fBSHARED\fP library may be marked with the \fBFRAMEWORK\fP
target property to create an macOS or iOS Framework Bundle.
A library with the \fBFRAMEWORK\fP target property should also set the
\fBFRAMEWORK_VERSION\fP target property.  This property is typically
set to the value of "A" by macOS conventions.
The \fBMACOSX_FRAMEWORK_IDENTIFIER\fP sets \fBCFBundleIdentifier\fP key
and it uniquely identifies the bundle.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(MyFramework SHARED MyFramework.cpp)
set_target_properties(MyFramework PROPERTIES
  FRAMEWORK TRUE
  FRAMEWORK_VERSION A # Version "A" is macOS convention
  MACOSX_FRAMEWORK_IDENTIFIER org.cmake.MyFramework
)
.ft P
.fi
.UNINDENT
.UNINDENT
.SS Object Libraries
.sp
The \fBOBJECT\fP library type defines a non\-archival collection of object files
resulting from compiling the given source files.  The object files collection
may be used as source inputs to other targets by using the syntax
\fB$<TARGET_OBJECTS:name>\fP\&.  This is a
\fBgenerator expression\fP that can be
used to supply the \fBOBJECT\fP library content to other targets:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)

add_library(archiveExtras STATIC $<TARGET_OBJECTS:archive> extras.cpp)

add_executable(test_exe $<TARGET_OBJECTS:archive> test.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The link (or archiving) step of those other targets will use the object
files collection in addition to those from their own sources.
.sp
Alternatively, object libraries may be linked into other targets:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive OBJECT archive.cpp zip.cpp lzma.cpp)

add_library(archiveExtras STATIC extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)

add_executable(test_exe test.cpp)
target_link_libraries(test_exe archive)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The link (or archiving) step of those other targets will use the object
files from \fBOBJECT\fP libraries that are \fIdirectly\fP linked.  Additionally,
usage requirements of the \fBOBJECT\fP libraries will be honored when compiling
sources in those other targets.  Furthermore, those usage requirements
will propagate transitively to dependents of those other targets.
.sp
Object libraries may not be used as the \fBTARGET\fP in a use of the
\fBadd_custom_command(TARGET)\fP command signature.  However,
the list of objects can be used by \fBadd_custom_command(OUTPUT)\fP
or \fBfile(GENERATE)\fP by using \fB$<TARGET_OBJECTS:objlib>\fP\&.
.SH BUILD SPECIFICATION AND USAGE REQUIREMENTS
.sp
The \fBtarget_include_directories()\fP, \fBtarget_compile_definitions()\fP
and \fBtarget_compile_options()\fP commands specify the build specifications
and the usage requirements of binary targets.  The commands populate the
\fBINCLUDE_DIRECTORIES\fP, \fBCOMPILE_DEFINITIONS\fP and
\fBCOMPILE_OPTIONS\fP target properties respectively, and/or the
\fBINTERFACE_INCLUDE_DIRECTORIES\fP, \fBINTERFACE_COMPILE_DEFINITIONS\fP
and \fBINTERFACE_COMPILE_OPTIONS\fP target properties.
.sp
Each of the commands has a \fBPRIVATE\fP, \fBPUBLIC\fP and \fBINTERFACE\fP mode.  The
\fBPRIVATE\fP mode populates only the non\-\fBINTERFACE_\fP variant of the target
property and the \fBINTERFACE\fP mode populates only the \fBINTERFACE_\fP variants.
The \fBPUBLIC\fP mode populates both variants of the respective target property.
Each command may be invoked with multiple uses of each keyword:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
target_compile_definitions(archive
  PRIVATE BUILDING_WITH_LZMA
  INTERFACE USING_ARCHIVE_LIB
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Note that usage requirements are not designed as a way to make downstreams
use particular \fBCOMPILE_OPTIONS\fP or
\fBCOMPILE_DEFINITIONS\fP etc for convenience only.  The contents of
the properties must be \fBrequirements\fP, not merely recommendations or
convenience.
.sp
See the Creating Relocatable Packages section of the
\fBcmake\-packages(7)\fP manual for discussion of additional care
that must be taken when specifying usage requirements while creating
packages for redistribution.
.SS Target Properties
.sp
The contents of the \fBINCLUDE_DIRECTORIES\fP,
\fBCOMPILE_DEFINITIONS\fP and \fBCOMPILE_OPTIONS\fP target
properties are used appropriately when compiling the source files of a
binary target.
.sp
Entries in the \fBINCLUDE_DIRECTORIES\fP are added to the compile line
with \fB\-I\fP or \fB\-isystem\fP prefixes and in the order of appearance in the
property value.
.sp
Entries in the \fBCOMPILE_DEFINITIONS\fP are prefixed with \fB\-D\fP or
\fB/D\fP and added to the compile line in an unspecified order.  The
\fBDEFINE_SYMBOL\fP target property is also added as a compile
definition as a special convenience case for \fBSHARED\fP and \fBMODULE\fP
library targets.
.sp
Entries in the \fBCOMPILE_OPTIONS\fP are escaped for the shell and added
in the order of appearance in the property value.  Several compile options have
special separate handling, such as \fBPOSITION_INDEPENDENT_CODE\fP\&.
.sp
The contents of the \fBINTERFACE_INCLUDE_DIRECTORIES\fP,
\fBINTERFACE_COMPILE_DEFINITIONS\fP and
\fBINTERFACE_COMPILE_OPTIONS\fP target properties are
\fIUsage Requirements\fP \-\- they specify content which consumers
must use to correctly compile and link with the target they appear on.
For any binary target, the contents of each \fBINTERFACE_\fP property on
each target specified in a \fBtarget_link_libraries()\fP command is
consumed:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
set(srcs archive.cpp zip.cpp)
if (LZMA_FOUND)
  list(APPEND srcs lzma.cpp)
endif()
add_library(archive SHARED ${srcs})
if (LZMA_FOUND)
  # The archive library sources are compiled with \-DBUILDING_WITH_LZMA
  target_compile_definitions(archive PRIVATE BUILDING_WITH_LZMA)
endif()
target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)

add_executable(consumer)
# Link consumer to archive and consume its usage requirements. The consumer
# executable sources are compiled with \-DUSING_ARCHIVE_LIB.
target_link_libraries(consumer archive)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Because it is common to require that the source directory and corresponding
build directory are added to the \fBINCLUDE_DIRECTORIES\fP, the
\fBCMAKE_INCLUDE_CURRENT_DIR\fP variable can be enabled to conveniently
add the corresponding directories to the \fBINCLUDE_DIRECTORIES\fP of
all targets.  The variable \fBCMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE\fP
can be enabled to add the corresponding directories to the
\fBINTERFACE_INCLUDE_DIRECTORIES\fP of all targets.  This makes use of
targets in multiple different directories convenient through use of the
\fBtarget_link_libraries()\fP command.
.SS Transitive Usage Requirements
.sp
The usage requirements of a target can transitively propagate to dependents.
The \fBtarget_link_libraries()\fP command has \fBPRIVATE\fP,
\fBINTERFACE\fP and \fBPUBLIC\fP keywords to control the propagation.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(archive archive.cpp)
target_compile_definitions(archive INTERFACE USING_ARCHIVE_LIB)

add_library(serialization serialization.cpp)
target_compile_definitions(serialization INTERFACE USING_SERIALIZATION_LIB)

add_library(archiveExtras extras.cpp)
target_link_libraries(archiveExtras PUBLIC archive)
target_link_libraries(archiveExtras PRIVATE serialization)
# archiveExtras is compiled with \-DUSING_ARCHIVE_LIB
# and \-DUSING_SERIALIZATION_LIB

add_executable(consumer consumer.cpp)
# consumer is compiled with \-DUSING_ARCHIVE_LIB
target_link_libraries(consumer archiveExtras)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Because \fBarchive\fP is a \fBPUBLIC\fP dependency of \fBarchiveExtras\fP, the
usage requirements of it are propagated to \fBconsumer\fP too.  Because
\fBserialization\fP is a \fBPRIVATE\fP dependency of \fBarchiveExtras\fP, the usage
requirements of it are not propagated to \fBconsumer\fP\&.
.sp
Generally, a dependency should be specified in a use of
\fBtarget_link_libraries()\fP with the \fBPRIVATE\fP keyword if it is used by
only the implementation of a library, and not in the header files.  If a
dependency is additionally used in the header files of a library (e.g. for
class inheritance), then it should be specified as a \fBPUBLIC\fP dependency.
A dependency which is not used by the implementation of a library, but only by
its headers should be specified as an \fBINTERFACE\fP dependency.  The
\fBtarget_link_libraries()\fP command may be invoked with multiple uses of
each keyword:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
target_link_libraries(archiveExtras
  PUBLIC archive
  PRIVATE serialization
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Usage requirements are propagated by reading the \fBINTERFACE_\fP variants
of target properties from dependencies and appending the values to the
non\-\fBINTERFACE_\fP variants of the operand.  For example, the
\fBINTERFACE_INCLUDE_DIRECTORIES\fP of dependencies is read and
appended to the \fBINCLUDE_DIRECTORIES\fP of the operand.  In cases
where order is relevant and maintained, and the order resulting from the
\fBtarget_link_libraries()\fP calls does not allow correct compilation,
use of an appropriate command to set the property directly may update the
order.
.sp
For example, if the linked libraries for a target must be specified
in the order \fBlib1\fP \fBlib2\fP \fBlib3\fP , but the include directories must
be specified in the order \fBlib3\fP \fBlib1\fP \fBlib2\fP:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
target_link_libraries(myExe lib1 lib2 lib3)
target_include_directories(myExe
  PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Note that care must be taken when specifying usage requirements for targets
which will be exported for installation using the \fBinstall(EXPORT)\fP
command.  See Creating Packages for more.
.SS Compatible Interface Properties
.sp
Some target properties are required to be compatible between a target and
the interface of each dependency.  For example, the
\fBPOSITION_INDEPENDENT_CODE\fP target property may specify a
boolean value of whether a target should be compiled as
position\-independent\-code, which has platform\-specific consequences.
A target may also specify the usage requirement
\fBINTERFACE_POSITION_INDEPENDENT_CODE\fP to communicate that
consumers must be compiled as position\-independent\-code.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_executable(exe1 exe1.cpp)
set_property(TARGET exe1 PROPERTY POSITION_INDEPENDENT_CODE ON)

add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_executable(exe2 exe2.cpp)
target_link_libraries(exe2 lib1)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Here, both \fBexe1\fP and \fBexe2\fP will be compiled as position\-independent\-code.
\fBlib1\fP will also be compiled as position\-independent\-code because that is the
default setting for \fBSHARED\fP libraries.  If dependencies have conflicting,
non\-compatible requirements \fBcmake(1)\fP issues a diagnostic:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_library(lib2 SHARED lib2.cpp)
set_property(TARGET lib2 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1)
set_property(TARGET exe1 PROPERTY POSITION_INDEPENDENT_CODE OFF)

add_executable(exe2 exe2.cpp)
target_link_libraries(exe2 lib1 lib2)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The \fBlib1\fP requirement \fBINTERFACE_POSITION_INDEPENDENT_CODE\fP is not
"compatible" with the \fBPOSITION_INDEPENDENT_CODE\fP property of
the \fBexe1\fP target.  The library requires that consumers are built as
position\-independent\-code, while the executable specifies to not built as
position\-independent\-code, so a diagnostic is issued.
.sp
The \fBlib1\fP and \fBlib2\fP requirements are not "compatible".  One of them
requires that consumers are built as position\-independent\-code, while
the other requires that consumers are not built as position\-independent\-code.
Because \fBexe2\fP links to both and they are in conflict, a CMake error message
is issued:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
CMake Error: The INTERFACE_POSITION_INDEPENDENT_CODE property of "lib2" does
not agree with the value of POSITION_INDEPENDENT_CODE already determined
for "exe2".
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
To be "compatible", the \fBPOSITION_INDEPENDENT_CODE\fP property,
if set must be either the same, in a boolean sense, as the
\fBINTERFACE_POSITION_INDEPENDENT_CODE\fP property of all transitively
specified dependencies on which that property is set.
.sp
This property of "compatible interface requirement" may be extended to other
properties by specifying the property in the content of the
\fBCOMPATIBLE_INTERFACE_BOOL\fP target property.  Each specified property
must be compatible between the consuming target and the corresponding property
with an \fBINTERFACE_\fP prefix from each dependency:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1Version2 SHARED lib1_v2.cpp)
set_property(TARGET lib1Version2 PROPERTY INTERFACE_CUSTOM_PROP ON)
set_property(TARGET lib1Version2 APPEND PROPERTY
  COMPATIBLE_INTERFACE_BOOL CUSTOM_PROP
)

add_library(lib1Version3 SHARED lib1_v3.cpp)
set_property(TARGET lib1Version3 PROPERTY INTERFACE_CUSTOM_PROP OFF)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1Version2) # CUSTOM_PROP will be ON

add_executable(exe2 exe2.cpp)
target_link_libraries(exe2 lib1Version2 lib1Version3) # Diagnostic
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Non\-boolean properties may also participate in "compatible interface"
computations.  Properties specified in the
\fBCOMPATIBLE_INTERFACE_STRING\fP
property must be either unspecified or compare to the same string among
all transitively specified dependencies. This can be useful to ensure
that multiple incompatible versions of a library are not linked together
through transitive requirements of a target:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1Version2 SHARED lib1_v2.cpp)
set_property(TARGET lib1Version2 PROPERTY INTERFACE_LIB_VERSION 2)
set_property(TARGET lib1Version2 APPEND PROPERTY
  COMPATIBLE_INTERFACE_STRING LIB_VERSION
)

add_library(lib1Version3 SHARED lib1_v3.cpp)
set_property(TARGET lib1Version3 PROPERTY INTERFACE_LIB_VERSION 3)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1Version2) # LIB_VERSION will be "2"

add_executable(exe2 exe2.cpp)
target_link_libraries(exe2 lib1Version2 lib1Version3) # Diagnostic
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The \fBCOMPATIBLE_INTERFACE_NUMBER_MAX\fP target property specifies
that content will be evaluated numerically and the maximum number among all
specified will be calculated:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1Version2 SHARED lib1_v2.cpp)
set_property(TARGET lib1Version2 PROPERTY INTERFACE_CONTAINER_SIZE_REQUIRED 200)
set_property(TARGET lib1Version2 APPEND PROPERTY
  COMPATIBLE_INTERFACE_NUMBER_MAX CONTAINER_SIZE_REQUIRED
)

add_library(lib1Version3 SHARED lib1_v3.cpp)
set_property(TARGET lib1Version3 PROPERTY INTERFACE_CONTAINER_SIZE_REQUIRED 1000)

add_executable(exe1 exe1.cpp)
# CONTAINER_SIZE_REQUIRED will be "200"
target_link_libraries(exe1 lib1Version2)

add_executable(exe2 exe2.cpp)
# CONTAINER_SIZE_REQUIRED will be "1000"
target_link_libraries(exe2 lib1Version2 lib1Version3)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Similarly, the \fBCOMPATIBLE_INTERFACE_NUMBER_MIN\fP may be used to
calculate the numeric minimum value for a property from dependencies.
.sp
Each calculated "compatible" property value may be read in the consumer at
generate\-time using generator expressions.
.sp
Note that for each dependee, the set of properties specified in each
compatible interface property must not intersect with the set specified in
any of the other properties.
.SS Property Origin Debugging
.sp
Because build specifications can be determined by dependencies, the lack of
locality of code which creates a target and code which is responsible for
setting build specifications may make the code more difficult to reason about.
\fBcmake(1)\fP provides a debugging facility to print the origin of the
contents of properties which may be determined by dependencies.  The properties
which can be debugged are listed in the
\fBCMAKE_DEBUG_TARGET_PROPERTIES\fP variable documentation:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
set(CMAKE_DEBUG_TARGET_PROPERTIES
  INCLUDE_DIRECTORIES
  COMPILE_DEFINITIONS
  POSITION_INDEPENDENT_CODE
  CONTAINER_SIZE_REQUIRED
  LIB_VERSION
)
add_executable(exe1 exe1.cpp)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In the case of properties listed in \fBCOMPATIBLE_INTERFACE_BOOL\fP or
\fBCOMPATIBLE_INTERFACE_STRING\fP, the debug output shows which target
was responsible for setting the property, and which other dependencies also
defined the property.  In the case of
\fBCOMPATIBLE_INTERFACE_NUMBER_MAX\fP and
\fBCOMPATIBLE_INTERFACE_NUMBER_MIN\fP, the debug output shows the
value of the property from each dependency, and whether the value determines
the new extreme.
.SS Build Specification with Generator Expressions
.sp
Build specifications may use
\fBgenerator expressions\fP containing
content which may be conditional or known only at generate\-time.  For example,
the calculated "compatible" value of a property may be read with the
\fBTARGET_PROPERTY\fP expression:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1Version2 SHARED lib1_v2.cpp)
set_property(TARGET lib1Version2 PROPERTY
  INTERFACE_CONTAINER_SIZE_REQUIRED 200)
set_property(TARGET lib1Version2 APPEND PROPERTY
  COMPATIBLE_INTERFACE_NUMBER_MAX CONTAINER_SIZE_REQUIRED
)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1Version2)
target_compile_definitions(exe1 PRIVATE
    CONTAINER_SIZE=$<TARGET_PROPERTY:CONTAINER_SIZE_REQUIRED>
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In this case, the \fBexe1\fP source files will be compiled with
\fB\-DCONTAINER_SIZE=200\fP\&.
.sp
The unary \fBTARGET_PROPERTY\fP generator expression and the \fBTARGET_POLICY\fP
generator expression are evaluated with the consuming target context.  This
means that a usage requirement specification may be evaluated differently based
on the consumer:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1 lib1.cpp)
target_compile_definitions(lib1 INTERFACE
  $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:LIB1_WITH_EXE>
  $<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:LIB1_WITH_SHARED_LIB>
  $<$<TARGET_POLICY:CMP0041>:CONSUMER_CMP0041_NEW>
)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1)

cmake_policy(SET CMP0041 NEW)

add_library(shared_lib shared_lib.cpp)
target_link_libraries(shared_lib lib1)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The \fBexe1\fP executable will be compiled with \fB\-DLIB1_WITH_EXE\fP, while the
\fBshared_lib\fP shared library will be compiled with \fB\-DLIB1_WITH_SHARED_LIB\fP
and \fB\-DCONSUMER_CMP0041_NEW\fP, because policy \fBCMP0041\fP is
\fBNEW\fP at the point where the \fBshared_lib\fP target is created.
.sp
The \fBBUILD_INTERFACE\fP expression wraps requirements which are only used when
consumed from a target in the same buildsystem, or when consumed from a target
exported to the build directory using the \fBexport()\fP command.  The
\fBINSTALL_INTERFACE\fP expression wraps requirements which are only used when
consumed from a target which has been installed and exported with the
\fBinstall(EXPORT)\fP command:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(ClimbingStats climbingstats.cpp)
target_compile_definitions(ClimbingStats INTERFACE
  $<BUILD_INTERFACE:ClimbingStats_FROM_BUILD_LOCATION>
  $<INSTALL_INTERFACE:ClimbingStats_FROM_INSTALLED_LOCATION>
)
install(TARGETS ClimbingStats EXPORT libExport ${InstallArgs})
install(EXPORT libExport NAMESPACE Upstream::
        DESTINATION lib/cmake/ClimbingStats)
export(EXPORT libExport NAMESPACE Upstream::)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 ClimbingStats)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In this case, the \fBexe1\fP executable will be compiled with
\fB\-DClimbingStats_FROM_BUILD_LOCATION\fP\&.  The exporting commands generate
\fBIMPORTED\fP targets with either the \fBINSTALL_INTERFACE\fP or the
\fBBUILD_INTERFACE\fP omitted, and the \fB*_INTERFACE\fP marker stripped away.
A separate project consuming the \fBClimbingStats\fP package would contain:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
find_package(ClimbingStats REQUIRED)

add_executable(Downstream main.cpp)
target_link_libraries(Downstream Upstream::ClimbingStats)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Depending on whether the \fBClimbingStats\fP package was used from the build
location or the install location, the \fBDownstream\fP target would be compiled
with either \fB\-DClimbingStats_FROM_BUILD_LOCATION\fP or
\fB\-DClimbingStats_FROM_INSTALL_LOCATION\fP\&.  For more about packages and
exporting see the \fBcmake\-packages(7)\fP manual.
.SS Include Directories and Usage Requirements
.sp
Include directories require some special consideration when specified as usage
requirements and when used with generator expressions.  The
\fBtarget_include_directories()\fP command accepts both relative and
absolute include directories:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1 lib1.cpp)
target_include_directories(lib1 PRIVATE
  /absolute/path
  relative/path
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Relative paths are interpreted relative to the source directory where the
command appears.  Relative paths are not allowed in the
\fBINTERFACE_INCLUDE_DIRECTORIES\fP of \fBIMPORTED\fP targets.
.sp
In cases where a non\-trivial generator expression is used, the
\fBINSTALL_PREFIX\fP expression may be used within the argument of an
\fBINSTALL_INTERFACE\fP expression.  It is a replacement marker which
expands to the installation prefix when imported by a consuming project.
.sp
Include directories usage requirements commonly differ between the build\-tree
and the install\-tree.  The \fBBUILD_INTERFACE\fP and \fBINSTALL_INTERFACE\fP
generator expressions can be used to describe separate usage requirements
based on the usage location.  Relative paths are allowed within the
\fBINSTALL_INTERFACE\fP expression and are interpreted relative to the
installation prefix.  For example:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(ClimbingStats climbingstats.cpp)
target_include_directories(ClimbingStats INTERFACE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated>
  $<INSTALL_INTERFACE:/absolute/path>
  $<INSTALL_INTERFACE:relative/path>
  $<INSTALL_INTERFACE:$<INSTALL_PREFIX>/$<CONFIG>/generated>
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Two convenience APIs are provided relating to include directories usage
requirements.  The \fBCMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE\fP variable
may be enabled, with an equivalent effect to:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
set_property(TARGET tgt APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_BINARY_DIR}>
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
for each target affected.  The convenience for installed targets is
an \fBINCLUDES DESTINATION\fP component with the \fBinstall(TARGETS)\fP
command:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
install(TARGETS foo bar bat EXPORT tgts ${dest_args}
  INCLUDES DESTINATION include
)
install(EXPORT tgts ${other_args})
install(FILES ${headers} DESTINATION include)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
This is equivalent to appending \fB${CMAKE_INSTALL_PREFIX}/include\fP to the
\fBINTERFACE_INCLUDE_DIRECTORIES\fP of each of the installed
\fBIMPORTED\fP targets when generated by \fBinstall(EXPORT)\fP\&.
.sp
When the \fBINTERFACE_INCLUDE_DIRECTORIES\fP of an
\fI\%imported target\fP is consumed, the entries in the
property are treated as \fBSYSTEM\fP include directories, as if they were
listed in the \fBINTERFACE_SYSTEM_INCLUDE_DIRECTORIES\fP of the
dependency. This can result in omission of compiler warnings for headers
found in those directories.  This behavior for \fI\%Imported Targets\fP may
be controlled by setting the \fBNO_SYSTEM_FROM_IMPORTED\fP target
property on the \fIconsumers\fP of imported targets, or by setting the
\fBIMPORTED_NO_SYSTEM\fP target property on the imported targets
themselves.
.sp
If a binary target is linked transitively to a macOS \fBFRAMEWORK\fP, the
\fBHeaders\fP directory of the framework is also treated as a usage requirement.
This has the same effect as passing the framework directory as an include
directory.
.SS Link Libraries and Generator Expressions
.sp
Like build specifications, \fBlink libraries\fP may be
specified with generator expression conditions.  However, as consumption of
usage requirements is based on collection from linked dependencies, there is
an additional limitation that the link dependencies must form a "directed
acyclic graph".  That is, if linking to a target is dependent on the value of
a target property, that target property may not be dependent on the linked
dependencies:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1 lib1.cpp)
add_library(lib2 lib2.cpp)
target_link_libraries(lib1 PUBLIC
  $<$<TARGET_PROPERTY:POSITION_INDEPENDENT_CODE>:lib2>
)
add_library(lib3 lib3.cpp)
set_property(TARGET lib3 PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 lib1 lib3)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
As the value of the \fBPOSITION_INDEPENDENT_CODE\fP property of
the \fBexe1\fP target is dependent on the linked libraries (\fBlib3\fP), and the
edge of linking \fBexe1\fP is determined by the same
\fBPOSITION_INDEPENDENT_CODE\fP property, the dependency graph above
contains a cycle.  \fBcmake(1)\fP issues an error message.
.SS Output Artifacts
.sp
The buildsystem targets created by the \fBadd_library()\fP and
\fBadd_executable()\fP commands create rules to create binary outputs.
The exact output location of the binaries can only be determined at
generate\-time because it can depend on the build\-configuration and the
link\-language of linked dependencies etc.  \fBTARGET_FILE\fP,
\fBTARGET_LINKER_FILE\fP and related expressions can be used to access the
name and location of generated binaries.  These expressions do not work
for \fBOBJECT\fP libraries however, as there is no single file generated
by such libraries which is relevant to the expressions.
.sp
There are three kinds of output artifacts that may be build by targets
as detailed in the following sections.  Their classification differs
between DLL platforms and non\-DLL platforms.  All Windows\-based
systems including Cygwin are DLL platforms.
.SS Runtime Output Artifacts
.sp
A \fIruntime\fP output artifact of a buildsystem target may be:
.INDENT 0.0
.IP \(bu 2
The executable file (e.g. \fB\&.exe\fP) of an executable target
created by the \fBadd_executable()\fP command.
.IP \(bu 2
On DLL platforms: the executable file (e.g. \fB\&.dll\fP) of a shared
library target created by the \fBadd_library()\fP command
with the \fBSHARED\fP option.
.UNINDENT
.sp
The \fBRUNTIME_OUTPUT_DIRECTORY\fP and \fBRUNTIME_OUTPUT_NAME\fP
target properties may be used to control runtime output artifact locations
and names in the build tree.
.SS Library Output Artifacts
.sp
A \fIlibrary\fP output artifact of a buildsystem target may be:
.INDENT 0.0
.IP \(bu 2
The loadable module file (e.g. \fB\&.dll\fP or \fB\&.so\fP) of a module
library target created by the \fBadd_library()\fP command
with the \fBMODULE\fP option.
.IP \(bu 2
On non\-DLL platforms: the shared library file (e.g. \fB\&.so\fP or \fB\&.dylib\fP)
of a shared library target created by the \fBadd_library()\fP
command with the \fBSHARED\fP option.
.UNINDENT
.sp
The \fBLIBRARY_OUTPUT_DIRECTORY\fP and \fBLIBRARY_OUTPUT_NAME\fP
target properties may be used to control library output artifact locations
and names in the build tree.
.SS Archive Output Artifacts
.sp
An \fIarchive\fP output artifact of a buildsystem target may be:
.INDENT 0.0
.IP \(bu 2
The static library file (e.g. \fB\&.lib\fP or \fB\&.a\fP) of a static
library target created by the \fBadd_library()\fP command
with the \fBSTATIC\fP option.
.IP \(bu 2
On DLL platforms: the import library file (e.g. \fB\&.lib\fP) of a shared
library target created by the \fBadd_library()\fP command
with the \fBSHARED\fP option.  This file is only guaranteed to exist if
the library exports at least one unmanaged symbol.
.IP \(bu 2
On DLL platforms: the import library file (e.g. \fB\&.lib\fP) of an
executable target created by the \fBadd_executable()\fP command
when its \fBENABLE_EXPORTS\fP target property is set.
.IP \(bu 2
On AIX: the linker import file (e.g. \fB\&.imp\fP) of an executable target
created by the \fBadd_executable()\fP command when its
\fBENABLE_EXPORTS\fP target property is set.
.UNINDENT
.sp
The \fBARCHIVE_OUTPUT_DIRECTORY\fP and \fBARCHIVE_OUTPUT_NAME\fP
target properties may be used to control archive output artifact locations
and names in the build tree.
.SS Directory\-Scoped Commands
.sp
The \fBtarget_include_directories()\fP,
\fBtarget_compile_definitions()\fP and
\fBtarget_compile_options()\fP commands have an effect on only one
target at a time.  The commands \fBadd_compile_definitions()\fP,
\fBadd_compile_options()\fP and \fBinclude_directories()\fP have
a similar function, but operate at directory scope instead of target
scope for convenience.
.SH BUILD CONFIGURATIONS
.sp
Configurations determine specifications for a certain type of build, such
as \fBRelease\fP or \fBDebug\fP\&.  The way this is specified depends on the type
of \fBgenerator\fP being used.  For single
configuration generators like  Makefile Generators and
\fBNinja\fP, the configuration is specified at configure time by the
\fBCMAKE_BUILD_TYPE\fP variable. For multi\-configuration generators
like Visual Studio, \fBXcode\fP, and
\fBNinja Multi\-Config\fP, the configuration is chosen by the user at
build time and \fBCMAKE_BUILD_TYPE\fP is ignored.  In the
multi\-configuration case, the set of \fIavailable\fP configurations is specified
at configure time by the \fBCMAKE_CONFIGURATION_TYPES\fP variable,
but the actual configuration used cannot be known until the build stage.
This difference is often misunderstood, leading to problematic code like the
following:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
# WARNING: This is wrong for multi\-config generators because they don\(aqt use
#          and typically don\(aqt even set CMAKE_BUILD_TYPE
string(TOLOWER ${CMAKE_BUILD_TYPE} build_type)
if (build_type STREQUAL debug)
  target_compile_definitions(exe1 PRIVATE DEBUG_BUILD)
endif()
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
\fBGenerator expressions\fP should be
used instead to handle configuration\-specific logic correctly, regardless of
the generator used.  For example:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
# Works correctly for both single and multi\-config generators
target_compile_definitions(exe1 PRIVATE
  $<$<CONFIG:Debug>:DEBUG_BUILD>
)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In the presence of \fBIMPORTED\fP targets, the content of
\fBMAP_IMPORTED_CONFIG_DEBUG\fP is also
accounted for by the above \fB$<CONFIG:Debug>\fP expression.
.SS Case Sensitivity
.sp
\fBCMAKE_BUILD_TYPE\fP and \fBCMAKE_CONFIGURATION_TYPES\fP are
just like other variables in that any string comparisons made with their
values will be case\-sensitive.  The \fB$<CONFIG>\fP generator expression also
preserves the casing of the configuration as set by the user or CMake defaults.
For example:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
# NOTE: Don\(aqt use these patterns, they are for illustration purposes only.

set(CMAKE_BUILD_TYPE Debug)
if(CMAKE_BUILD_TYPE STREQUAL DEBUG)
  # ... will never get here, "Debug" != "DEBUG"
endif()
add_custom_target(print_config ALL
  # Prints "Config is Debug" in this single\-config case
  COMMAND ${CMAKE_COMMAND} \-E echo "Config is $<CONFIG>"
  VERBATIM
)

set(CMAKE_CONFIGURATION_TYPES Debug Release)
if(DEBUG IN_LIST CMAKE_CONFIGURATION_TYPES)
  # ... will never get here, "Debug" != "DEBUG"
endif()
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In contrast, CMake treats the configuration type case\-insensitively when
using it internally in places that modify behavior based on the configuration.
For example, the \fB$<CONFIG:Debug>\fP generator expression will evaluate to 1
for a configuration of not only \fBDebug\fP, but also \fBDEBUG\fP, \fBdebug\fP or
even \fBDeBuG\fP\&.  Therefore, you can specify configuration types in
\fBCMAKE_BUILD_TYPE\fP and \fBCMAKE_CONFIGURATION_TYPES\fP with
any mixture of upper and lowercase, although there are strong conventions
(see the next section).  If you must test the value in string comparisons,
always convert the value to upper or lowercase first and adjust the test
accordingly.
.SS Default And Custom Configurations
.sp
By default, CMake defines a number of standard configurations:
.INDENT 0.0
.IP \(bu 2
\fBDebug\fP
.IP \(bu 2
\fBRelease\fP
.IP \(bu 2
\fBRelWithDebInfo\fP
.IP \(bu 2
\fBMinSizeRel\fP
.UNINDENT
.sp
In multi\-config generators, the \fBCMAKE_CONFIGURATION_TYPES\fP variable
will be populated with (potentially a subset of) the above list by default,
unless overridden by the project or user.  The actual configuration used is
selected by the user at build time.
.sp
For single\-config generators, the configuration is specified with the
\fBCMAKE_BUILD_TYPE\fP variable at configure time and cannot be changed
at build time.  The default value will often be none of the above standard
configurations and will instead be an empty string.  A common misunderstanding
is that this is the same as \fBDebug\fP, but that is not the case.  Users should
always explicitly specify the build type instead to avoid this common problem.
.sp
The above standard configuration types provide reasonable behavior on most
platforms, but they can be extended to provide other types.  Each configuration
defines a set of compiler and linker flag variables for the language in use.
These variables follow the convention \fBCMAKE_<LANG>_FLAGS_<CONFIG>\fP,
where \fB<CONFIG>\fP is always the uppercase configuration name.  When defining
a custom configuration type, make sure these variables are set appropriately,
typically as cache variables.
.SH PSEUDO TARGETS
.sp
Some target types do not represent outputs of the buildsystem, but only inputs
such as external dependencies, aliases or other non\-build artifacts.  Pseudo
targets are not represented in the generated buildsystem.
.SS Imported Targets
.sp
An \fBIMPORTED\fP target represents a pre\-existing dependency.  Usually
such targets are defined by an upstream package and should be treated as
immutable. After declaring an \fBIMPORTED\fP target one can adjust its
target properties by using the customary commands such as
\fBtarget_compile_definitions()\fP, \fBtarget_include_directories()\fP,
\fBtarget_compile_options()\fP or \fBtarget_link_libraries()\fP just like
with any other regular target.
.sp
\fBIMPORTED\fP targets may have the same usage requirement properties
populated as binary targets, such as
\fBINTERFACE_INCLUDE_DIRECTORIES\fP,
\fBINTERFACE_COMPILE_DEFINITIONS\fP,
\fBINTERFACE_COMPILE_OPTIONS\fP,
\fBINTERFACE_LINK_LIBRARIES\fP, and
\fBINTERFACE_POSITION_INDEPENDENT_CODE\fP\&.
.sp
The \fBLOCATION\fP may also be read from an IMPORTED target, though there
is rarely reason to do so.  Commands such as \fBadd_custom_command()\fP can
transparently use an \fBIMPORTED\fP \fBEXECUTABLE\fP target
as a \fBCOMMAND\fP executable.
.sp
The scope of the definition of an \fBIMPORTED\fP target is the directory
where it was defined.  It may be accessed and used from subdirectories, but
not from parent directories or sibling directories.  The scope is similar to
the scope of a cmake variable.
.sp
It is also possible to define a \fBGLOBAL\fP \fBIMPORTED\fP target which is
accessible globally in the buildsystem.
.sp
See the \fBcmake\-packages(7)\fP manual for more on creating packages
with \fBIMPORTED\fP targets.
.SS Alias Targets
.sp
An \fBALIAS\fP target is a name which may be used interchangeably with
a binary target name in read\-only contexts.  A primary use\-case for \fBALIAS\fP
targets is for example or unit test executables accompanying a library, which
may be part of the same buildsystem or built separately based on user
configuration.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(lib1 lib1.cpp)
install(TARGETS lib1 EXPORT lib1Export ${dest_args})
install(EXPORT lib1Export NAMESPACE Upstream:: ${other_args})

add_library(Upstream::lib1 ALIAS lib1)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In another directory, we can link unconditionally to the \fBUpstream::lib1\fP
target, which may be an \fBIMPORTED\fP target from a package, or an
\fBALIAS\fP target if built as part of the same buildsystem.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
if (NOT TARGET Upstream::lib1)
  find_package(lib1 REQUIRED)
endif()
add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 Upstream::lib1)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
\fBALIAS\fP targets are not mutable, installable or exportable.  They are
entirely local to the buildsystem description.  A name can be tested for
whether it is an \fBALIAS\fP name by reading the \fBALIASED_TARGET\fP
property from it:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
get_target_property(_aliased Upstream::lib1 ALIASED_TARGET)
if(_aliased)
  message(STATUS "The name Upstream::lib1 is an ALIAS for ${_aliased}.")
endif()
.ft P
.fi
.UNINDENT
.UNINDENT
.SS Interface Libraries
.sp
An \fBINTERFACE\fP library target does not compile sources and does not
produce a library artifact on disk, so it has no \fBLOCATION\fP\&.
.sp
It may specify usage requirements such as
\fBINTERFACE_INCLUDE_DIRECTORIES\fP,
\fBINTERFACE_COMPILE_DEFINITIONS\fP,
\fBINTERFACE_COMPILE_OPTIONS\fP,
\fBINTERFACE_LINK_LIBRARIES\fP,
\fBINTERFACE_SOURCES\fP,
and \fBINTERFACE_POSITION_INDEPENDENT_CODE\fP\&.
Only the \fBINTERFACE\fP modes of the \fBtarget_include_directories()\fP,
\fBtarget_compile_definitions()\fP, \fBtarget_compile_options()\fP,
\fBtarget_sources()\fP, and \fBtarget_link_libraries()\fP commands
may be used with \fBINTERFACE\fP libraries.
.sp
Since CMake 3.19, an \fBINTERFACE\fP library target may optionally contain
source files.  An interface library that contains source files will be
included as a build target in the generated buildsystem.  It does not
compile sources, but may contain custom commands to generate other sources.
Additionally, IDEs will show the source files as part of the target for
interactive reading and editing.
.sp
A primary use\-case for \fBINTERFACE\fP libraries is header\-only libraries.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(Eigen INTERFACE
  src/eigen.h
  src/vector.h
  src/matrix.h
  )
target_include_directories(Eigen INTERFACE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
  $<INSTALL_INTERFACE:include/Eigen>
)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 Eigen)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Here, the usage requirements from the \fBEigen\fP target are consumed and used
when compiling, but it has no effect on linking.
.sp
Another use\-case is to employ an entirely target\-focussed design for usage
requirements:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
add_library(pic_on INTERFACE)
set_property(TARGET pic_on PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE ON)
add_library(pic_off INTERFACE)
set_property(TARGET pic_off PROPERTY INTERFACE_POSITION_INDEPENDENT_CODE OFF)

add_library(enable_rtti INTERFACE)
target_compile_options(enable_rtti INTERFACE
  $<$<OR:$<COMPILER_ID:GNU>,$<COMPILER_ID:Clang>>:\-rtti>
)

add_executable(exe1 exe1.cpp)
target_link_libraries(exe1 pic_on enable_rtti)
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
This way, the build specification of \fBexe1\fP is expressed entirely as linked
targets, and the complexity of compiler\-specific flags is encapsulated in an
\fBINTERFACE\fP library target.
.sp
\fBINTERFACE\fP libraries may be installed and exported.  Any content they refer
to must be installed separately:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
set(Eigen_headers
  src/eigen.h
  src/vector.h
  src/matrix.h
  )
add_library(Eigen INTERFACE ${Eigen_headers})
target_include_directories(Eigen INTERFACE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
  $<INSTALL_INTERFACE:include/Eigen>
)

install(TARGETS Eigen EXPORT eigenExport)
install(EXPORT eigenExport NAMESPACE Upstream::
  DESTINATION lib/cmake/Eigen
)
install(FILES ${Eigen_headers}
  DESTINATION include/Eigen
)
.ft P
.fi
.UNINDENT
.UNINDENT
.SH COPYRIGHT
2000-2022 Kitware, Inc. and Contributors
.\" Generated by docutils manpage writer.
.
