|
|
|
@ -10,18 +10,39 @@ Add a library to the project using the specified source files.
|
|
|
|
|
Normal Libraries
|
|
|
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...)
|
|
|
|
|
:target: normal
|
|
|
|
|
|
|
|
|
|
Add a library target called ``<name>`` to be built from the source files
|
|
|
|
|
listed in the command invocation.
|
|
|
|
|
|
|
|
|
|
The optional ``<type>`` specifies the type of library to be created:
|
|
|
|
|
|
|
|
|
|
``STATIC``
|
|
|
|
|
An archive of object files for use when linking other targets.
|
|
|
|
|
|
|
|
|
|
``SHARED``
|
|
|
|
|
A dynamic library that may be linked by other targets and loaded
|
|
|
|
|
at runtime.
|
|
|
|
|
|
|
|
|
|
``MODULE``
|
|
|
|
|
A plugin that may not be linked by other targets, but may be
|
|
|
|
|
dynamically loaded at runtime using dlopen-like functionality.
|
|
|
|
|
|
|
|
|
|
If no ``<type>`` is given the default is ``STATIC`` or ``SHARED``
|
|
|
|
|
based on the value of the :variable:`BUILD_SHARED_LIBS` variable.
|
|
|
|
|
|
|
|
|
|
add_library(<name> [STATIC | SHARED | MODULE]
|
|
|
|
|
[EXCLUDE_FROM_ALL]
|
|
|
|
|
[<source>...])
|
|
|
|
|
The options are:
|
|
|
|
|
|
|
|
|
|
Adds a library target called ``<name>`` to be built from the source files
|
|
|
|
|
listed in the command invocation. The ``<name>``
|
|
|
|
|
corresponds to the logical target name and must be globally unique within
|
|
|
|
|
a project. The actual file name of the library built is constructed based
|
|
|
|
|
on conventions of the native platform (such as ``lib<name>.a`` or
|
|
|
|
|
``<name>.lib``).
|
|
|
|
|
``EXCLUDE_FROM_ALL``
|
|
|
|
|
Set the :prop_tgt:`EXCLUDE_FROM_ALL` target property automatically.
|
|
|
|
|
See documentation of that target property for details.
|
|
|
|
|
|
|
|
|
|
The ``<name>`` corresponds to the logical target name and must be globally
|
|
|
|
|
unique within a project. The actual file name of the library built is
|
|
|
|
|
constructed based on conventions of the native platform (such as
|
|
|
|
|
``lib<name>.a`` or ``<name>.lib``).
|
|
|
|
|
|
|
|
|
|
.. versionadded:: 3.1
|
|
|
|
|
Source arguments to ``add_library`` may use "generator expressions" with
|
|
|
|
@ -32,15 +53,8 @@ on conventions of the native platform (such as ``lib<name>.a`` or
|
|
|
|
|
The source files can be omitted if they are added later using
|
|
|
|
|
:command:`target_sources`.
|
|
|
|
|
|
|
|
|
|
``STATIC``, ``SHARED``, or ``MODULE`` may be given to specify the type of
|
|
|
|
|
library to be created. ``STATIC`` libraries are archives of object files
|
|
|
|
|
for use when linking other targets. ``SHARED`` libraries are linked
|
|
|
|
|
dynamically and loaded at runtime. ``MODULE`` libraries are plugins that
|
|
|
|
|
are not linked into other targets but may be loaded dynamically at runtime
|
|
|
|
|
using dlopen-like functionality. If no type is given explicitly the
|
|
|
|
|
type is ``STATIC`` or ``SHARED`` based on whether the current value of the
|
|
|
|
|
variable :variable:`BUILD_SHARED_LIBS` is ``ON``. For ``SHARED`` and
|
|
|
|
|
``MODULE`` libraries the :prop_tgt:`POSITION_INDEPENDENT_CODE` target
|
|
|
|
|
For ``SHARED`` and ``MODULE`` libraries the
|
|
|
|
|
:prop_tgt:`POSITION_INDEPENDENT_CODE` target
|
|
|
|
|
property is set to ``ON`` automatically.
|
|
|
|
|
A ``SHARED`` library may be marked with the :prop_tgt:`FRAMEWORK`
|
|
|
|
|
target property to create an macOS Framework.
|
|
|
|
@ -63,10 +77,6 @@ invoked. See documentation of the :prop_tgt:`ARCHIVE_OUTPUT_DIRECTORY`,
|
|
|
|
|
location. See documentation of the :prop_tgt:`OUTPUT_NAME` target
|
|
|
|
|
property to change the ``<name>`` part of the final file name.
|
|
|
|
|
|
|
|
|
|
If ``EXCLUDE_FROM_ALL`` is given the corresponding property will be set on
|
|
|
|
|
the created target. See documentation of the :prop_tgt:`EXCLUDE_FROM_ALL`
|
|
|
|
|
target property for details.
|
|
|
|
|
|
|
|
|
|
See the :manual:`cmake-buildsystem(7)` manual for more on defining
|
|
|
|
|
buildsystem properties.
|
|
|
|
|
|
|
|
|
@ -77,14 +87,15 @@ within IDE.
|
|
|
|
|
Object Libraries
|
|
|
|
|
^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> OBJECT <sources>...)
|
|
|
|
|
:target: OBJECT
|
|
|
|
|
|
|
|
|
|
add_library(<name> OBJECT [<source>...])
|
|
|
|
|
Add an :ref:`Object Library <Object Libraries>` to compile source files
|
|
|
|
|
without archiving or linking their object files into a library.
|
|
|
|
|
|
|
|
|
|
Creates an :ref:`Object Library <Object Libraries>`. An object library
|
|
|
|
|
compiles source files but does not archive or link their object files into a
|
|
|
|
|
library. Instead other targets created by ``add_library`` or
|
|
|
|
|
:command:`add_executable` may reference the objects using an expression of the
|
|
|
|
|
Other targets created by ``add_library`` or :command:`add_executable`
|
|
|
|
|
may reference the objects using an expression of the
|
|
|
|
|
form :genex:`$\<TARGET_OBJECTS:objlib\> <TARGET_OBJECTS>` as a source, where
|
|
|
|
|
``objlib`` is the object library name. For example:
|
|
|
|
|
|
|
|
|
@ -109,46 +120,48 @@ consider adding at least one real source file to any target that references
|
|
|
|
|
Interface Libraries
|
|
|
|
|
^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> INTERFACE)
|
|
|
|
|
|
|
|
|
|
Creates an :ref:`Interface Library <Interface Libraries>`.
|
|
|
|
|
An ``INTERFACE`` library target does not compile sources and does
|
|
|
|
|
not produce a library artifact on disk. However, it may have
|
|
|
|
|
properties set on it and it may be installed and exported.
|
|
|
|
|
Typically, ``INTERFACE_*`` properties are populated on an interface
|
|
|
|
|
target using the commands:
|
|
|
|
|
|
|
|
|
|
* :command:`set_property`,
|
|
|
|
|
* :command:`target_link_libraries(INTERFACE)`,
|
|
|
|
|
* :command:`target_link_options(INTERFACE)`,
|
|
|
|
|
* :command:`target_include_directories(INTERFACE)`,
|
|
|
|
|
* :command:`target_compile_options(INTERFACE)`,
|
|
|
|
|
* :command:`target_compile_definitions(INTERFACE)`, and
|
|
|
|
|
* :command:`target_sources(INTERFACE)`,
|
|
|
|
|
|
|
|
|
|
and then it is used as an argument to :command:`target_link_libraries`
|
|
|
|
|
like any other target.
|
|
|
|
|
|
|
|
|
|
An interface library created with the above signature has no source files
|
|
|
|
|
itself and is not included as a target in the generated buildsystem.
|
|
|
|
|
|
|
|
|
|
.. versionadded:: 3.15
|
|
|
|
|
:target: INTERFACE
|
|
|
|
|
|
|
|
|
|
Add an :ref:`Interface Library <Interface Libraries>` target that may
|
|
|
|
|
specify usage requirements for dependents but does not compile sources
|
|
|
|
|
and does not produce a library artifact on disk.
|
|
|
|
|
|
|
|
|
|
An interface library with no source files is not included as a target
|
|
|
|
|
in the generated buildsystem. However, it may have
|
|
|
|
|
properties set on it and it may be installed and exported.
|
|
|
|
|
Typically, ``INTERFACE_*`` properties are populated on an interface
|
|
|
|
|
target using the commands:
|
|
|
|
|
|
|
|
|
|
* :command:`set_property`,
|
|
|
|
|
* :command:`target_link_libraries(INTERFACE)`,
|
|
|
|
|
* :command:`target_link_options(INTERFACE)`,
|
|
|
|
|
* :command:`target_include_directories(INTERFACE)`,
|
|
|
|
|
* :command:`target_compile_options(INTERFACE)`,
|
|
|
|
|
* :command:`target_compile_definitions(INTERFACE)`, and
|
|
|
|
|
* :command:`target_sources(INTERFACE)`,
|
|
|
|
|
|
|
|
|
|
and then it is used as an argument to :command:`target_link_libraries`
|
|
|
|
|
like any other target.
|
|
|
|
|
|
|
|
|
|
.. versionadded:: 3.15
|
|
|
|
|
An interface library can have :prop_tgt:`PUBLIC_HEADER` and
|
|
|
|
|
:prop_tgt:`PRIVATE_HEADER` properties. The headers specified by those
|
|
|
|
|
properties can be installed using the :command:`install(TARGETS)` command.
|
|
|
|
|
|
|
|
|
|
.. versionadded:: 3.19
|
|
|
|
|
An interface library target may be created with source files:
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> INTERFACE [EXCLUDE_FROM_ALL] <sources>...)
|
|
|
|
|
:target: INTERFACE-with-sources
|
|
|
|
|
|
|
|
|
|
add_library(<name> INTERFACE [<source>...] [EXCLUDE_FROM_ALL])
|
|
|
|
|
.. versionadded:: 3.19
|
|
|
|
|
|
|
|
|
|
Source files may be listed directly in the ``add_library`` call or added
|
|
|
|
|
later by calls to :command:`target_sources` with the ``PRIVATE`` or
|
|
|
|
|
``PUBLIC`` keywords.
|
|
|
|
|
Add an :ref:`Interface Library <Interface Libraries>` target with
|
|
|
|
|
source files (in addition to usage requirements and properties as
|
|
|
|
|
documented by the :command:`above signature <add_library(INTERFACE)>`).
|
|
|
|
|
Source files may be listed directly in the ``add_library`` call
|
|
|
|
|
or added later by calls to :command:`target_sources` with the
|
|
|
|
|
``PRIVATE`` or ``PUBLIC`` keywords.
|
|
|
|
|
|
|
|
|
|
If an interface library has source files (i.e. the :prop_tgt:`SOURCES`
|
|
|
|
|
target property is set), or header sets (i.e. the :prop_tgt:`HEADER_SETS`
|
|
|
|
@ -158,7 +171,13 @@ itself and is not included as a target in the generated buildsystem.
|
|
|
|
|
but does contain build rules for custom commands created by the
|
|
|
|
|
:command:`add_custom_command` command.
|
|
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
The options are:
|
|
|
|
|
|
|
|
|
|
``EXCLUDE_FROM_ALL``
|
|
|
|
|
Set the :prop_tgt:`EXCLUDE_FROM_ALL` target property automatically.
|
|
|
|
|
See documentation of that target property for details.
|
|
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
In most command signatures where the ``INTERFACE`` keyword appears,
|
|
|
|
|
the items listed after it only become part of that target's usage
|
|
|
|
|
requirements and are not part of the target's own settings. However,
|
|
|
|
@ -172,23 +191,18 @@ itself and is not included as a target in the generated buildsystem.
|
|
|
|
|
Imported Libraries
|
|
|
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> <type> IMPORTED [GLOBAL])
|
|
|
|
|
:target: IMPORTED
|
|
|
|
|
|
|
|
|
|
Creates an :ref:`IMPORTED library target <Imported Targets>` called ``<name>``.
|
|
|
|
|
No rules are generated to build it, and the :prop_tgt:`IMPORTED` target
|
|
|
|
|
property is ``True``. The target name has scope in the directory in which
|
|
|
|
|
it is created and below, but the ``GLOBAL`` option extends visibility.
|
|
|
|
|
It may be referenced like any target built within the project.
|
|
|
|
|
``IMPORTED`` libraries are useful for convenient reference from commands
|
|
|
|
|
like :command:`target_link_libraries`. Details about the imported library
|
|
|
|
|
are specified by setting properties whose names begin in ``IMPORTED_`` and
|
|
|
|
|
``INTERFACE_``.
|
|
|
|
|
Add an :ref:`IMPORTED library target <Imported Targets>` called ``<name>``.
|
|
|
|
|
The target name may be referenced like any target built within the project,
|
|
|
|
|
except that by default it is visible only in the directory in which it is
|
|
|
|
|
created, and below.
|
|
|
|
|
|
|
|
|
|
The ``<type>`` must be one of:
|
|
|
|
|
The ``<type>`` must be one of:
|
|
|
|
|
|
|
|
|
|
``STATIC``, ``SHARED``, ``MODULE``, ``UNKNOWN``
|
|
|
|
|
``STATIC``, ``SHARED``, ``MODULE``, ``UNKNOWN``
|
|
|
|
|
References a library file located outside the project. The
|
|
|
|
|
:prop_tgt:`IMPORTED_LOCATION` target property (or its per-configuration
|
|
|
|
|
variant :prop_tgt:`IMPORTED_LOCATION_<CONFIG>`) specifies the
|
|
|
|
@ -211,39 +225,52 @@ The ``<type>`` must be one of:
|
|
|
|
|
library (and is optional, but needed by the :genex:`TARGET_RUNTIME_DLLS`
|
|
|
|
|
generator expression).
|
|
|
|
|
|
|
|
|
|
Additional usage requirements may be specified in ``INTERFACE_*`` properties.
|
|
|
|
|
Additional usage requirements may be specified in ``INTERFACE_*``
|
|
|
|
|
properties.
|
|
|
|
|
|
|
|
|
|
An ``UNKNOWN`` library type is typically only used in the implementation of
|
|
|
|
|
:ref:`Find Modules`. It allows the path to an imported library (often found
|
|
|
|
|
using the :command:`find_library` command) to be used without having to know
|
|
|
|
|
what type of library it is. This is especially useful on Windows where a
|
|
|
|
|
static library and a DLL's import library both have the same file extension.
|
|
|
|
|
An ``UNKNOWN`` library type is typically only used in the implementation
|
|
|
|
|
of :ref:`Find Modules`. It allows the path to an imported library
|
|
|
|
|
(often found using the :command:`find_library` command) to be used
|
|
|
|
|
without having to know what type of library it is. This is especially
|
|
|
|
|
useful on Windows where a static library and a DLL's import library
|
|
|
|
|
both have the same file extension.
|
|
|
|
|
|
|
|
|
|
``OBJECT``
|
|
|
|
|
``OBJECT``
|
|
|
|
|
References a set of object files located outside the project.
|
|
|
|
|
The :prop_tgt:`IMPORTED_OBJECTS` target property (or its per-configuration
|
|
|
|
|
variant :prop_tgt:`IMPORTED_OBJECTS_<CONFIG>`) specifies the locations of
|
|
|
|
|
object files on disk.
|
|
|
|
|
Additional usage requirements may be specified in ``INTERFACE_*`` properties.
|
|
|
|
|
Additional usage requirements may be specified in ``INTERFACE_*``
|
|
|
|
|
properties.
|
|
|
|
|
|
|
|
|
|
``INTERFACE``
|
|
|
|
|
``INTERFACE``
|
|
|
|
|
Does not reference any library or object files on disk, but may
|
|
|
|
|
specify usage requirements in ``INTERFACE_*`` properties.
|
|
|
|
|
|
|
|
|
|
See documentation of the ``IMPORTED_*`` and ``INTERFACE_*`` properties
|
|
|
|
|
for more information.
|
|
|
|
|
The options are:
|
|
|
|
|
|
|
|
|
|
``GLOBAL``
|
|
|
|
|
Make the target name globally visible.
|
|
|
|
|
|
|
|
|
|
No rules are generated to build imported targets, and the :prop_tgt:`IMPORTED`
|
|
|
|
|
target property is ``True``. Imported libraries are useful for convenient
|
|
|
|
|
reference from commands like :command:`target_link_libraries`.
|
|
|
|
|
|
|
|
|
|
Details about the imported library are specified by setting properties whose
|
|
|
|
|
names begin in ``IMPORTED_`` and ``INTERFACE_``. See documentation of
|
|
|
|
|
such properties for more information.
|
|
|
|
|
|
|
|
|
|
Alias Libraries
|
|
|
|
|
^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
.. code-block:: cmake
|
|
|
|
|
|
|
|
|
|
.. signature::
|
|
|
|
|
add_library(<name> ALIAS <target>)
|
|
|
|
|
:target: ALIAS
|
|
|
|
|
|
|
|
|
|
Creates an :ref:`Alias Target <Alias Targets>`, such that ``<name>`` can be
|
|
|
|
|
used to refer to ``<target>`` in subsequent commands. The ``<name>`` does
|
|
|
|
|
not appear in the generated buildsystem as a make target. The ``<target>``
|
|
|
|
|
may not be an ``ALIAS``.
|
|
|
|
|
Creates an :ref:`Alias Target <Alias Targets>`, such that ``<name>`` can be
|
|
|
|
|
used to refer to ``<target>`` in subsequent commands. The ``<name>`` does
|
|
|
|
|
not appear in the generated buildsystem as a make target. The ``<target>``
|
|
|
|
|
may not be an ``ALIAS``.
|
|
|
|
|
|
|
|
|
|
.. versionadded:: 3.11
|
|
|
|
|
An ``ALIAS`` can target a ``GLOBAL`` :ref:`Imported Target <Imported Targets>`
|
|
|
|
|