Redesign the cmake dune_add_library function
Summary
The cmake function dune_add_library
is used to create new library targets that can be installed alongside the other targets and are collected in the same export-set. This MR redesigns the implementation of that function while preserving the old functionality.
There are three different signatures to that function, following the cmake function add_library
:
Creating regular library targets
dune_add_library(<basename> [STATIC|SHARED|MODULE]
[SOURCES <sources...>]
[LINK_LIBRARIES <targets>...]
[COMPILE_OPTIONS "<flags>;..."]
[OUTPUT_NAME <libname>]
[EXPORT_NAME <exportname>]
[NO_EXPORT]
[NO_MODULE_LIBRARY]
)
This creates a new library target with <basename>
for the library name. On Unix
this created lib<libname>.so
or lib<libname>.a
. The target properties
are automatically filled with the given (optional) arguments.
A dune library is (by default) exported into the <export-set>
given by the
global name ${ProjectName}-targets
if the parameter NO_EXPORT
is not
given. This <export-set>
is automatically installed and exported in the
dune_finalize_project()
function.
The following options can be passed to this dune_add_library
function:
-
SOURCES
: The source files from which to build the library. -
LINK_LIBRARIES
: A list of dependency the libraries is explicitly linked against -
COMPILE_OPTIONS
: Any additional compile flags for building the library. -
OUTPUT_NAME
: Name of the library file, e.g.lib<libname>.so
orlib<libname>.a
. -
EXPORT_NAME
: Name of the exported target to be used when linking against the library -
NO_EXPORT
: If omitted the library is exported for usage in other modules. -
NO_MODULE_LIBRARY
: If omitted the library is added to the global property<module>_LIBRARIES
Note, there are old options that still exist but are not advised anymore. We follow in the options names the classical cmake target property names. All additional properties are set as PUBLIC
properties.
Creating interface targets
dune_add_library(<basename> INTERFACE
[LINK_LIBRARIES <targets>...]
[COMPILE_OPTIONS "<flags>;..."]
[EXPORT_NAME <exportname>]
[NO_EXPORT]
[NO_MODULE_LIBRARY]
)
This creates an interface library target with <basename>
for the library name.
An interface target does not contain any sources but my contain flags and dependencies.
-
LINK_LIBRARIES
: A list of dependency the libraries is explicitly linked against. -
COMPILE_OPTIONS
: Any additional compile flags for building the library. -
EXPORT_NAME
: Name of the exported target to be used when linking against the library. -
NO_EXPORT
: If omitted the library is exported for usage in other modules. -
NO_MODULE_LIBRARY
: If omitted the library is added to the global property<module>_LIBRARIES
.
Creating object libraries (deprecated)
dune_add_library(<basename> OBJECT
[SOURCES <sources...>]
[LINK_LIBRARIES <targets>...]
[COMPILE_OPTIONS "<flags>;..."]
)
This creates a global placeholder variable _DUNE_TARGET_OBJECTS:<basename>_
to collect multiple sources
to be added to a library target later. Note, this utility is deprecated.
Create a regular library target in a parent scope and add the sources
directly using target_sources(<target> PRIVATE <sources>...)
instead, or use standard cmake
object library targets.
-
SOURCES
: The source files from which to build the library. -
LINK_LIBRARIES
: A list of dependency the libraries is explicitly linked against. -
COMPILE_OPTIONS
: Any additional compile flags for building the library.