| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- cmake_pkg_config
- ----------------
- .. versionadded:: 3.31
- .. only:: html
- .. contents::
- Process pkg-config format package files.
- Synopsis
- ^^^^^^^^
- .. parsed-literal::
- cmake_pkg_config(`EXTRACT`_ <package> [<version>] [...])
- cmake_pkg_config(`POPULATE`_ <package> [<version>] [...])
- cmake_pkg_config(`IMPORT`_ <package> [<version>] [...])
- Introduction
- ^^^^^^^^^^^^
- This command generates CMake variables and targets from pkg-config format
- package files natively, without needing to invoke or even require the presence
- of a pkg-config implementation. A ``<package>`` is either an absolute path to a
- package file, or a package name to be searched for using the typical pkg-config
- search patterns. The optional ``<version>`` string has the same format and
- semantics as a pkg-config style version specifier, with the exception that if
- no comparison operator is specified ``=`` is assumed.
- PkgConfig Targets
- ^^^^^^^^^^^^^^^^^
- ``cmake_pkg_config`` may recursively generate target-like names in the global
- scope in order to resolve a package ``IMPORT`` or ``POPULATE`` command. These
- names take the form of ``@foreign_pkgcfg::[<prefix>_]<package>`` and are exposed
- via the :prop_tgt:`INTERFACE_LINK_LIBRARIES` target property of an
- ``IMPORT``-generated target.
- It is not possible to modify or address these pkg-config native targets via
- normal target-based commands. Limited control over their generation is possible
- via the ``POPULATE`` command, but modification should generally be performed
- inside the corresponding package file, not downstream in CMake.
- Pkg-config targets are reused across commands. Once a given package name has
- been resolved via ``POPULATE`` or ``IMPORT`` (but not ``EXTRACT``), all future
- requests for the corresponding package name by those commands will resolve to
- the previously generated pkg-config target.
- ``EXTRACT`` always performs the complete package name lookup in order to allow
- searches for multiple installations of the same package in custom dependency
- management schemes.
- Common Options
- ^^^^^^^^^^^^^^
- There are multiple signatures for this command, and some of the options are
- common between them. They are:
- ``EXACT`` / ``QUIET`` / ``REQUIRED``
- The ``EXACT`` option requests that the version string be matched exactly
- (including empty string, if no version is provided), overriding the typical
- pkg-config version comparison algorithm. This will ignore any comparison
- operator attached to the version string.
- The ``QUIET`` option disables informational messages, including those
- indicating that the package cannot be found if it is not ``REQUIRED``. The
- ``REQUIRED`` option stops processing with an error message if the package
- cannot be found.
- ``STRICTNESS <mode>``
- Specify how strictly the contents of the package files will be verified during
- parsing and resolution. An invalid file, under the provided strictness mode,
- will cause the command to fail. Possible modes are:
- * ``STRICT``: Closely mirrors the behavior of the original FDO pkg-config.
- Variables and keywords must be unique. Variables must be defined before
- they are used. The Name, Description, and Version keywords must be present.
- The overall structure of the file must be valid and parsable.
- * ``PERMISSIVE``: Closely mirrors the behavior of the pkgconf implementation.
- Duplicate variables are overridden. Duplicate keywords are appended.
- Undefined variables resolve to empty strings. The Name, Description, and
- Version keywords must be present. The overall structure of the file must be
- valid and parsable.
- * ``BEST_EFFORT``: Same behavior as ``PERMISSIVE`` with regards to duplicate
- or uninitialized variables and keywords, but will not fail under any
- conditions. Package files which require BEST_EFFORT will fail validation
- under all other major implementations and should be fixed.
- The default strictness is ``PERMISSIVE``.
- ``ENV_MODE``
- Specifies which environment variables will be queried when running a given
- command. Possible modes are:
- * ``FDO``: Queries only the original set of ``PKG_CONFIG_*`` environment
- variables used by the freedesktop.org ``pkg-config`` implementation.
- * ``PKGCONF``: Queries the more extensive set of environment variables used
- by the ``pkgconf`` implementation.
- * ``IGNORE``: Ignores the presence, absence, and value of environment
- variables entirely. In all cases an environment variable would be queried
- its treated as defined, but with a value of empty string for the purpose
- of the operation. This does not modify the current environment. For boolean
- environment variables, such as ``PKG_CONFIG_ALLOW_*``, this means they are
- evaluated as truthy.
- ``PKG_CONFIG_SYSROOT_PATH`` is a minor exception. When ``ENV_MODE IGNORE``
- is used, no root path prepending will occur by default and ``pc_sysrootdir``
- remains defaulted to ``/``.
- Target-generating subcommands always ignore flag-filtering environment
- variables. The default environment mode is ``PKGCONF``.
- ``PC_LIBDIR <path>...``
- Overrides the default search location for package files; also used to derive
- the ``pc_path`` package variable.
- When this option is not provided, the default library directory is the first
- available of the following values:
- #. ``CMAKE_PKG_CONFIG_PC_LIB_DIRS``
- #. The ``PKG_CONFIG_LIBDIR`` environment variable
- #. The output of ``pkg-config --variable pc_path pkg-config``
- #. A platform-dependent default value
- ``PC_PATH <path>...``
- Overrides the supplemental package file directories which will be prepended
- to the search path; also used to derive the ``pc_path`` package variable.
- When this option is not provided, the default paths are the first available of
- the following values:
- #. ``CMAKE_PKG_CONFIG_PC_PATH``
- #. The ``PKG_CONFIG_PATH`` environment variable
- #. Empty list
- ``DISABLE_UNINSTALLED <bool>``
- Overrides the search behavior for "uninstalled" package files. These are
- package files with an "-uninstalled" suffix which describe packages integrated
- directly from a build tree.
- Normally such package files have higher priority than "installed" packages.
- When ``DISABLE_UNINSTALLED`` is true, searching for "uninstalled" packages
- is disabled.
- When this option is not provided, the default search behavior is determined
- by the first available of the following values:
- #. ``CMAKE_PKG_CONFIG_DISABLE_UNINSTALLED``
- #. If the ``PKG_CONFIG_DISABLE_UNINSTALLED`` environment variable is defined
- the search is disabled, otherwise it is enabled.
- ``PC_SYSROOT_DIR <path>``
- Overrides the root path which will be prepended to paths specified by ``-I``
- compile flags and ``-L`` library search locations; also used to derive the
- ``pc_sysrootdir`` package variable.
- When this option is not provided, the default root path is provided by the
- first available of the following values:
- #. ``CMAKE_PKG_CONFIG_SYSROOT_DIR``
- #. The ``PKG_CONFIG_SYSROOT_DIR`` environment variable
- #. If no root path is available, nothing will be prepended to include or
- library directory paths and ``pc_sysrootdir`` will be set to ``/``
- ``TOP_BUILD_DIR <path>``
- Overrides the top build directory path used to derive the ``pc_top_builddir``
- package variable.
- When this option is not provided, the default top build directory path is
- the first available of the following values:
- #. ``CMAKE_PKG_CONFIG_TOP_BUILD_DIR``
- #. The ``PKG_CONFIG_TOP_BUILD_DIR`` environment variable
- #. If no top build directory path is available, the ``pc_top_builddir``
- package variable is not set
- ``PREFIX <name>``
- Specifying a prefix creates an independent collection of pkg-config targets
- separate from previously populated targets. This enables multiple version of
- a given package to co-exist, for example packages from different sysroots.
- The default prefix is an empty string.
- ``BIND_PC_REQUIRES <<name>=<target>>...``
- A list of ``<name>=<target>`` pairs, the ``name`` is a package name as it
- appears in the ``Requires`` list of a pkg-config file and the ``target`` is a
- CMake-native target name (not a pkg-config target).
- When a given package name appears in the ``Requires`` list of a package, it
- will be fulfilled with the associated CMake target. This behavior applies to
- all dependencies in the pkg-config graph that have not been previously
- populated.
- Signatures
- ^^^^^^^^^^
- .. signature::
- cmake_pkg_config(EXTRACT <package> [<version>] [...])
- .. versionadded:: 3.31
- Extract the contents of the package into variables.
- .. code-block:: cmake
- cmake_pkg_config(EXTRACT <package> [<version>]
- [REQUIRED] [EXACT] [QUIET]
- [SYSTEM_INCLUDE_DIRS <path>...]
- [SYSTEM_LIBRARY_DIRS <path>...]
- [ALLOW_SYSTEM_INCLUDES <bool>]
- [ALLOW_SYSTEM_LIBS <bool>]
- [STRICTNESS <mode>]
- [ENV_MODE <mode>]
- [PC_LIBDIR <path>...]
- [PC_PATH <path>...]
- [DISABLE_UNINSTALLED <bool>]
- [PC_SYSROOT_DIR <path>]
- [TOP_BUILD_DIR <path>])
- The following variables will be populated from the contents of package file:
- ==================================== ====== ========================================================================================
- Variable Type Definition
- ==================================== ====== ========================================================================================
- ``CMAKE_PKG_CONFIG_NAME`` String Value of the ``Name`` keyword
- ``CMAKE_PKG_CONFIG_DESCRIPTION`` String Value of the ``Description`` keyword
- ``CMAKE_PKG_CONFIG_VERSION`` String Value of the ``Version`` keyword
- ``CMAKE_PKG_CONFIG_PROVIDES`` List Value of the ``Provides`` keyword
- ``CMAKE_PKG_CONFIG_REQUIRES`` List Value of the ``Requires`` keyword
- ``CMAKE_PKG_CONFIG_CONFLICTS`` List Value of the ``Conflicts`` keyword
- ``CMAKE_PKG_CONFIG_CFLAGS`` String Value of the ``CFlags`` / ``Cflags`` keyword
- ``CMAKE_PKG_CONFIG_INCLUDES`` List All ``-I`` prefixed flags from ``CMAKE_PKG_CONFIG_CFLAGS``
- ``CMAKE_PKG_CONFIG_COMPILE_OPTIONS`` List All flags not prefixed with ``-I`` from ``CMAKE_PKG_CONFIG_CFLAGS``
- ``CMAKE_PKG_CONFIG_LIBS`` String Value of the ``Libs`` keyword
- ``CMAKE_PKG_CONFIG_LIBDIRS`` List All ``-L`` prefixed flags from ``CMAKE_PKG_CONFIG_LIBS``
- ``CMAKE_PKG_CONFIG_LIBNAMES`` List All ``-l`` prefixed flags from ``CMAKE_PKG_CONFIG_LIBS``
- ``CMAKE_PKG_CONFIG_LINK_OPTIONS`` List All flags not prefixed with ``-L`` or ``-l`` from ``CMAKE_PKG_CONFIG_LIBS``
- ``CMAKE_PKG_CONFIG_*_PRIVATE`` \* ``CFLAGS`` / ``LIBS`` / ``REQUIRES`` and derived, but in their ``.private`` suffix forms
- ==================================== ====== ========================================================================================
- ``SYSTEM_INCLUDE_DIRS``
- Overrides the "system" directories for the purpose of flag mangling include
- directories in ``CMAKE_PKG_CONFIG_CFLAGS`` and derived variables.
- When this option is not provided, the default directories are provided by the
- first available of the following values:
- #. ``CMAKE_PKG_CONFIG_SYS_INCLUDE_DIRS``
- #. The ``PKG_CONFIG_SYSTEM_INCLUDE_PATH`` environment variable
- #. The output of ``pkgconf --variable pc_system_includedirs pkg-config``
- #. A platform-dependent default value
- Additionally, when the ``ENV_MODE`` is ``PKGCONF`` the
- ``CMAKE_PKG_CONFIG_PKGCONF_INCLUDES`` variable will be concatenated to the
- list if available. If it is not available, the following environment variables
- will be queried and concatenated:
- * ``CPATH``
- * ``C_INCLUDE_PATH``
- * ``CPLUS_INCLUDE_PATH``
- * ``OBJC_INCLUDE_PATH``
- * ``INCLUDE`` (Windows Only)
- ``SYSTEM_LIBRARY_DIRS``
- Overrides the "system" directories for the purpose of flag mangling library
- directories in ``CMAKE_PKG_CONFIG_LIBS`` and derived variables.
- When this option is not provided, the default directories are provided by the
- first available of the following values:
- #. ``CMAKE_PKG_CONFIG_SYS_LIB_DIRS``
- #. The ``PKG_CONFIG_SYSTEM_LIBRARY_PATH`` environment variable
- #. The output of ``pkgconf --variable pc_system_libdirs pkg-config``
- #. A platform-dependent default value
- Additionally, when the ``ENV_MODE`` is ``PKGCONF`` the
- ``CMAKE_PKG_CONFIG_PKGCONF_LIB_DIRS`` variable will be concatenated to the
- list if available. If it is not available, the ``LIBRARY_PATH`` environment
- variable will be queried and concatenated.
- ``ALLOW_SYSTEM_INCLUDES``
- Preserves "system" directories during flag mangling of include directories
- in ``CMAKE_PKG_CONFIG_CFLAGS`` and derived variables.
- When this option is not provided, the default value is determined by the first
- available of the following values:
- #. ``CMAKE_PKG_CONFIG_ALLOW_SYS_INCLUDES``
- #. If the ``PKG_CONFIG_ALLOW_SYSTEM_CFLAGS`` environment variable is defined
- the flags are preserved, otherwise they are filtered during flag mangling.
- ``ALLOW_SYSTEM_LIBS``
- Preserves "system" directories during flag mangling of library directories
- in ``CMAKE_PKG_CONFIG_LIBS`` and derived variables.
- When this option is not provided, the default value is determined by the first
- available of the following values:
- #. ``CMAKE_PKG_CONFIG_ALLOW_SYS_LIBS``
- #. If the ``PKG_CONFIG_ALLOW_SYSTEM_LIBS`` environment variable is defined
- the flags are preserved, otherwise they are filtered during flag mangling.
- .. signature::
- cmake_pkg_config(POPULATE <package> [<version>] [...])
- .. versionadded:: 4.1
- Populate a package in the pkg-config target namespace
- .. code-block:: cmake
- cmake_pkg_config(POPULATE <package> [<version>]
- [REQUIRED] [EXACT] [QUIET]
- [PREFIX <prefix>]
- [BIND_PC_REQUIRES <<name>=<target>>...]
- [STRICTNESS <mode>]
- [ENV_MODE <mode>]
- [PC_LIBDIR <path>...]
- [PC_PATH <path>...]
- [DISABLE_UNINSTALLED <bool>]
- [PC_SYSROOT_DIR <path>]
- [TOP_BUILD_DIR <path>])
- ``POPULATE`` enables manual control of resolution of a given package's
- ``Requires`` list without importing onto a native CMake target. Once populated,
- a package and its dependencies will be used for resolution of all future
- ``POPULATE`` and ``IMPORT`` commands.
- A ``PKGCONFIG_<package>_FOUND`` variable will be set to indicate whether the
- package was found.
- .. signature::
- cmake_pkg_config(IMPORT <package> [<version>] [...])
- .. versionadded:: 4.1
- Import a pkg-config target as a CMake :prop_tgt:`IMPORTED` target
- .. code-block:: cmake
- cmake_pkg_config(IMPORT <package> [<version>]
- [REQUIRED] [EXACT] [QUIET]
- [NAME <name>]
- [PREFIX <prefix>]
- [BIND_PC_REQUIRES <<name>=<target>>...]
- [STRICTNESS <mode>]
- [ENV_MODE <mode>]
- [PC_LIBDIR <path>...]
- [PC_PATH <path>...]
- [DISABLE_UNINSTALLED <bool>]
- [PC_SYSROOT_DIR <path>]
- [TOP_BUILD_DIR <path>])
- Creates a native CMake ``IMPORTED`` target that can be linked to via
- :command:`target_link_libraries`. This new target is named
- ``PkgConfig::<package>`` by default.
- A ``PKGCONFIG_<package>_FOUND`` variable will be set to indicate whether the
- package was found.
- ``NAME``
- Overrides the name of the created CMake target to ``PkgConfig::<name>``. This
- *does not* affect the ``PKGCONFIG_<package>_FOUND`` variable.
|