cmake-packages.7.rst 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. .. cmake-manual-description: CMake Packages Reference
  2. cmake-packages(7)
  3. *****************
  4. .. only:: html
  5. .. contents::
  6. Introduction
  7. ============
  8. Packages provide dependency information to CMake based buildsystems. Packages
  9. are found with the :command:`find_package` command. The result of
  10. using ``find_package`` is either a set of :prop_tgt:`IMPORTED` targets, or
  11. a set of variables corresponding to build-relevant information.
  12. Using Packages
  13. ==============
  14. CMake provides direct support for two forms of packages,
  15. `Config-file Packages`_ and `Find-module Packages`_.
  16. Indirect support for ``pkg-config`` packages is also provided via
  17. the :module:`FindPkgConfig` module. In all cases, the basic form
  18. of :command:`find_package` calls is the same:
  19. .. code-block:: cmake
  20. find_package(Qt4 4.7.0 REQUIRED) # CMake provides a Qt4 find-module
  21. find_package(Qt5Core 5.1.0 REQUIRED) # Qt provides a Qt5 package config file.
  22. find_package(LibXml2 REQUIRED) # Use pkg-config via the LibXml2 find-module
  23. In cases where it is known that a package configuration file is provided by
  24. upstream, and only that should be used, the ``CONFIG`` keyword may be passed
  25. to :command:`find_package`:
  26. .. code-block:: cmake
  27. find_package(Qt5Core 5.1.0 CONFIG REQUIRED)
  28. find_package(Qt5Gui 5.1.0 CONFIG)
  29. Similarly, the ``MODULE`` keyword says to use only a find-module:
  30. .. code-block:: cmake
  31. find_package(Qt4 4.7.0 MODULE REQUIRED)
  32. Specifying the type of package explicitly improves the error message shown to
  33. the user if it is not found.
  34. Both types of packages also support specifying components of a package,
  35. either after the ``REQUIRED`` keyword:
  36. .. code-block:: cmake
  37. find_package(Qt5 5.1.0 CONFIG REQUIRED Widgets Xml Sql)
  38. or as a separate ``COMPONENTS`` list:
  39. .. code-block:: cmake
  40. find_package(Qt5 5.1.0 COMPONENTS Widgets Xml Sql)
  41. or as a separate ``OPTIONAL_COMPONENTS`` list:
  42. .. code-block:: cmake
  43. find_package(Qt5 5.1.0 COMPONENTS Widgets
  44. OPTIONAL_COMPONENTS Xml Sql
  45. )
  46. Handling of ``COMPONENTS`` and ``OPTIONAL_COMPONENTS`` is defined by the
  47. package.
  48. By setting the :variable:`CMAKE_DISABLE_FIND_PACKAGE_<PackageName>` variable to
  49. ``TRUE``, the ``PackageName`` package will not be searched, and will always
  50. be ``NOTFOUND``.
  51. .. _`Config File Packages`:
  52. Config-file Packages
  53. --------------------
  54. A config-file package is a set of files provided by upstreams for downstreams
  55. to use. CMake searches in a number of locations for package configuration files, as
  56. described in the :command:`find_package` documentation. The most simple way for
  57. a CMake user to tell :manual:`cmake(1)` to search in a non-standard prefix for
  58. a package is to set the ``CMAKE_PREFIX_PATH`` cache variable.
  59. Config-file packages are provided by upstream vendors as part of development
  60. packages, that is, they belong with the header files and any other files
  61. provided to assist downstreams in using the package.
  62. A set of variables which provide package status information are also set
  63. automatically when using a config-file package. The ``<Package>_FOUND``
  64. variable is set to true or false, depending on whether the package was
  65. found. The ``<Package>_DIR`` cache variable is set to the location of the
  66. package configuration file.
  67. Find-module Packages
  68. --------------------
  69. A find module is a file with a set of rules for finding the required pieces of
  70. a dependency, primarily header files and libraries. Typically, a find module
  71. is needed when the upstream is not built with CMake, or is not CMake-aware
  72. enough to otherwise provide a package configuration file. Unlike a package configuration
  73. file, it is not shipped with upstream, but is used by downstream to find the
  74. files by guessing locations of files with platform-specific hints.
  75. Unlike the case of an upstream-provided package configuration file, no single point
  76. of reference identifies the package as being found, so the ``<Package>_FOUND``
  77. variable is not automatically set by the :command:`find_package` command. It
  78. can still be expected to be set by convention however and should be set by
  79. the author of the Find-module. Similarly there is no ``<Package>_DIR`` variable,
  80. but each of the artifacts such as library locations and header file locations
  81. provide a separate cache variable.
  82. See the :manual:`cmake-developer(7)` manual for more information about creating
  83. Find-module files.
  84. Package Layout
  85. ==============
  86. A config-file package consists of a `Package Configuration File`_ and
  87. optionally a `Package Version File`_ provided with the project distribution.
  88. Package Configuration File
  89. --------------------------
  90. Consider a project ``Foo`` that installs the following files::
  91. <prefix>/include/foo-1.2/foo.h
  92. <prefix>/lib/foo-1.2/libfoo.a
  93. It may also provide a CMake package configuration file::
  94. <prefix>/lib/cmake/foo-1.2/FooConfig.cmake
  95. with content defining :prop_tgt:`IMPORTED` targets, or defining variables, such
  96. as:
  97. .. code-block:: cmake
  98. # ...
  99. # (compute PREFIX relative to file location)
  100. # ...
  101. set(Foo_INCLUDE_DIRS ${PREFIX}/include/foo-1.2)
  102. set(Foo_LIBRARIES ${PREFIX}/lib/foo-1.2/libfoo.a)
  103. If another project wishes to use ``Foo`` it need only to locate the ``FooConfig.cmake``
  104. file and load it to get all the information it needs about package content
  105. locations. Since the package configuration file is provided by the package
  106. installation it already knows all the file locations.
  107. The :command:`find_package` command may be used to search for the package
  108. configuration file. This command constructs a set of installation prefixes
  109. and searches under each prefix in several locations. Given the name ``Foo``,
  110. it looks for a file called ``FooConfig.cmake`` or ``foo-config.cmake``.
  111. The full set of locations is specified in the :command:`find_package` command
  112. documentation. One place it looks is::
  113. <prefix>/lib/cmake/Foo*/
  114. where ``Foo*`` is a case-insensitive globbing expression. In our example the
  115. globbing expression will match ``<prefix>/lib/cmake/foo-1.2`` and the package
  116. configuration file will be found.
  117. Once found, a package configuration file is immediately loaded. It, together
  118. with a package version file, contains all the information the project needs to
  119. use the package.
  120. Package Version File
  121. --------------------
  122. When the :command:`find_package` command finds a candidate package configuration
  123. file it looks next to it for a version file. The version file is loaded to test
  124. whether the package version is an acceptable match for the version requested.
  125. If the version file claims compatibility the configuration file is accepted.
  126. Otherwise it is ignored.
  127. The name of the package version file must match that of the package configuration
  128. file but has either ``-version`` or ``Version`` appended to the name before
  129. the ``.cmake`` extension. For example, the files::
  130. <prefix>/lib/cmake/foo-1.3/foo-config.cmake
  131. <prefix>/lib/cmake/foo-1.3/foo-config-version.cmake
  132. and::
  133. <prefix>/lib/cmake/bar-4.2/BarConfig.cmake
  134. <prefix>/lib/cmake/bar-4.2/BarConfigVersion.cmake
  135. are each pairs of package configuration files and corresponding package version
  136. files.
  137. When the :command:`find_package` command loads a version file it first sets the
  138. following variables:
  139. ``PACKAGE_FIND_NAME``
  140. The <package> name
  141. ``PACKAGE_FIND_VERSION``
  142. Full requested version string
  143. ``PACKAGE_FIND_VERSION_MAJOR``
  144. Major version if requested, else 0
  145. ``PACKAGE_FIND_VERSION_MINOR``
  146. Minor version if requested, else 0
  147. ``PACKAGE_FIND_VERSION_PATCH``
  148. Patch version if requested, else 0
  149. ``PACKAGE_FIND_VERSION_TWEAK``
  150. Tweak version if requested, else 0
  151. ``PACKAGE_FIND_VERSION_COUNT``
  152. Number of version components, 0 to 4
  153. The version file must use these variables to check whether it is compatible or
  154. an exact match for the requested version and set the following variables with
  155. results:
  156. ``PACKAGE_VERSION``
  157. Full provided version string
  158. ``PACKAGE_VERSION_EXACT``
  159. True if version is exact match
  160. ``PACKAGE_VERSION_COMPATIBLE``
  161. True if version is compatible
  162. ``PACKAGE_VERSION_UNSUITABLE``
  163. True if unsuitable as any version
  164. Version files are loaded in a nested scope so they are free to set any variables
  165. they wish as part of their computation. The find_package command wipes out the
  166. scope when the version file has completed and it has checked the output
  167. variables. When the version file claims to be an acceptable match for the
  168. requested version the find_package command sets the following variables for
  169. use by the project:
  170. ``<package>_VERSION``
  171. Full provided version string
  172. ``<package>_VERSION_MAJOR``
  173. Major version if provided, else 0
  174. ``<package>_VERSION_MINOR``
  175. Minor version if provided, else 0
  176. ``<package>_VERSION_PATCH``
  177. Patch version if provided, else 0
  178. ``<package>_VERSION_TWEAK``
  179. Tweak version if provided, else 0
  180. ``<package>_VERSION_COUNT``
  181. Number of version components, 0 to 4
  182. The variables report the version of the package that was actually found.
  183. The ``<package>`` part of their name matches the argument given to the
  184. :command:`find_package` command.
  185. .. _`Creating Packages`:
  186. Creating Packages
  187. =================
  188. Usually, the upstream depends on CMake itself and can use some CMake facilities
  189. for creating the package files. Consider an upstream which provides a single
  190. shared library:
  191. .. code-block:: cmake
  192. project(UpstreamLib)
  193. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  194. set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
  195. set(Upstream_VERSION 3.4.1)
  196. include(GenerateExportHeader)
  197. add_library(ClimbingStats SHARED climbingstats.cpp)
  198. generate_export_header(ClimbingStats)
  199. set_property(TARGET ClimbingStats PROPERTY VERSION ${Upstream_VERSION})
  200. set_property(TARGET ClimbingStats PROPERTY SOVERSION 3)
  201. set_property(TARGET ClimbingStats PROPERTY
  202. INTERFACE_ClimbingStats_MAJOR_VERSION 3)
  203. set_property(TARGET ClimbingStats APPEND PROPERTY
  204. COMPATIBLE_INTERFACE_STRING ClimbingStats_MAJOR_VERSION
  205. )
  206. install(TARGETS ClimbingStats EXPORT ClimbingStatsTargets
  207. LIBRARY DESTINATION lib
  208. ARCHIVE DESTINATION lib
  209. RUNTIME DESTINATION bin
  210. INCLUDES DESTINATION include
  211. )
  212. install(
  213. FILES
  214. climbingstats.h
  215. "${CMAKE_CURRENT_BINARY_DIR}/climbingstats_export.h"
  216. DESTINATION
  217. include
  218. COMPONENT
  219. Devel
  220. )
  221. include(CMakePackageConfigHelpers)
  222. write_basic_package_version_file(
  223. "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  224. VERSION ${Upstream_VERSION}
  225. COMPATIBILITY AnyNewerVersion
  226. )
  227. export(EXPORT ClimbingStatsTargets
  228. FILE "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsTargets.cmake"
  229. NAMESPACE Upstream::
  230. )
  231. configure_file(cmake/ClimbingStatsConfig.cmake
  232. "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfig.cmake"
  233. COPYONLY
  234. )
  235. set(ConfigPackageLocation lib/cmake/ClimbingStats)
  236. install(EXPORT ClimbingStatsTargets
  237. FILE
  238. ClimbingStatsTargets.cmake
  239. NAMESPACE
  240. Upstream::
  241. DESTINATION
  242. ${ConfigPackageLocation}
  243. )
  244. install(
  245. FILES
  246. cmake/ClimbingStatsConfig.cmake
  247. "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  248. DESTINATION
  249. ${ConfigPackageLocation}
  250. COMPONENT
  251. Devel
  252. )
  253. The :module:`CMakePackageConfigHelpers` module provides a macro for creating
  254. a simple ``ConfigVersion.cmake`` file. This file sets the version of the
  255. package. It is read by CMake when :command:`find_package` is called to
  256. determine the compatibility with the requested version, and to set some
  257. version-specific variables ``<Package>_VERSION``, ``<Package>_VERSION_MAJOR``,
  258. ``<Package>_VERSION_MINOR`` etc. The :command:`install(EXPORT)` command is
  259. used to export the targets in the ``ClimbingStatsTargets`` export-set, defined
  260. previously by the :command:`install(TARGETS)` command. This command generates
  261. the ``ClimbingStatsTargets.cmake`` file to contain :prop_tgt:`IMPORTED`
  262. targets, suitable for use by downstreams and arranges to install it to
  263. ``lib/cmake/ClimbingStats``. The generated ``ClimbingStatsConfigVersion.cmake``
  264. and a ``cmake/ClimbingStatsConfig.cmake`` are installed to the same location,
  265. completing the package.
  266. The generated :prop_tgt:`IMPORTED` targets have appropriate properties set
  267. to define their :ref:`usage requirements <Target Usage Requirements>`, such as
  268. :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES`,
  269. :prop_tgt:`INTERFACE_COMPILE_DEFINITIONS` and other relevant built-in
  270. ``INTERFACE_`` properties. The ``INTERFACE`` variant of user-defined
  271. properties listed in :prop_tgt:`COMPATIBLE_INTERFACE_STRING` and
  272. other :ref:`Compatible Interface Properties` are also propagated to the
  273. generated :prop_tgt:`IMPORTED` targets. In the above case,
  274. ``ClimbingStats_MAJOR_VERSION`` is defined as a string which must be
  275. compatible among the dependencies of any depender. By setting this custom
  276. defined user property in this version and in the next version of
  277. ``ClimbingStats``, :manual:`cmake(1)` will issue a diagnostic if there is an
  278. attempt to use version 3 together with version 4. Packages can choose to
  279. employ such a pattern if different major versions of the package are designed
  280. to be incompatible.
  281. A ``NAMESPACE`` with double-colons is specified when exporting the targets
  282. for installation. This convention of double-colons gives CMake a hint that
  283. the name is an :prop_tgt:`IMPORTED` target when it is used by downstreams
  284. with the :command:`target_link_libraries` command. This way, CMake can
  285. issue a diagnostic if the package providing it has not yet been found.
  286. In this case, when using :command:`install(TARGETS)` the ``INCLUDES DESTINATION``
  287. was specified. This causes the ``IMPORTED`` targets to have their
  288. :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` populated with the ``include``
  289. directory in the :variable:`CMAKE_INSTALL_PREFIX`. When the ``IMPORTED``
  290. target is used by downstream, it automatically consumes the entries from
  291. that property.
  292. Creating a Package Configuration File
  293. -------------------------------------
  294. In this case, the ``ClimbingStatsConfig.cmake`` file could be as simple as:
  295. .. code-block:: cmake
  296. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
  297. As this allows downstreams to use the ``IMPORTED`` targets. If any macros
  298. should be provided by the ``ClimbingStats`` package, they should
  299. be in a separate file which is installed to the same location as the
  300. ``ClimbingStatsConfig.cmake`` file, and included from there.
  301. This can also be extended to cover dependencies:
  302. .. code-block:: cmake
  303. # ...
  304. add_library(ClimbingStats SHARED climbingstats.cpp)
  305. generate_export_header(ClimbingStats)
  306. find_package(Stats 2.6.4 REQUIRED)
  307. target_link_libraries(ClimbingStats PUBLIC Stats::Types)
  308. As the ``Stats::Types`` target is a ``PUBLIC`` dependency of ``ClimbingStats``,
  309. downstreams must also find the ``Stats`` package and link to the ``Stats::Types``
  310. library. The ``Stats`` package should be found in the ``ClimbingStatsConfig.cmake``
  311. file to ensure this. The ``find_dependency`` macro from the
  312. :module:`CMakeFindDependencyMacro` helps with this by propagating
  313. whether the package is ``REQUIRED``, or ``QUIET`` etc. All ``REQUIRED``
  314. dependencies of a package should be found in the ``Config.cmake`` file:
  315. .. code-block:: cmake
  316. include(CMakeFindDependencyMacro)
  317. find_dependency(Stats 2.6.4)
  318. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
  319. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsMacros.cmake")
  320. The ``find_dependency`` macro also sets ``ClimbingStats_FOUND`` to ``False`` if
  321. the dependency is not found, along with a diagnostic that the ``ClimbingStats``
  322. package can not be used without the ``Stats`` package.
  323. If ``COMPONENTS`` are specified when the downstream uses :command:`find_package`,
  324. they are listed in the ``<Package>_FIND_COMPONENTS`` variable. If a particular
  325. component is non-optional, then the ``<Package>_FIND_REQUIRED_<comp>`` will
  326. be true. This can be tested with logic in the package configuration file:
  327. .. code-block:: cmake
  328. include(CMakeFindDependencyMacro)
  329. find_dependency(Stats 2.6.4)
  330. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
  331. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsMacros.cmake")
  332. set(_supported_components Plot Table)
  333. foreach(_comp ${ClimbingStats_FIND_COMPONENTS})
  334. if (NOT ";${_supported_components};" MATCHES _comp)
  335. set(ClimbingStats_FOUND False)
  336. set(ClimbingStats_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}")
  337. endif()
  338. include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStats${_comp}Targets.cmake")
  339. endforeach()
  340. Here, the ``ClimbingStats_NOT_FOUND_MESSAGE`` is set to a diagnosis that the package
  341. could not be found because an invalid component was specified. This message
  342. variable can be set for any case where the ``_FOUND`` variable is set to ``False``,
  343. and will be displayed to the user.
  344. Creating a Package Configuration File for the Build Tree
  345. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  346. The :command:`export(EXPORT)` command creates an :prop_tgt:`IMPORTED` targets
  347. definition file which is specific to the build-tree, and is not relocatable.
  348. This can similarly be used with a suitable package configuration file and
  349. package version file to define a package for the build tree which may be used
  350. without installation. Consumers of the build tree can simply ensure that the
  351. :variable:`CMAKE_PREFIX_PATH` contains the build directory, or set the
  352. ``ClimbingStats_DIR`` to ``<build_dir>/ClimbingStats`` in the cache.
  353. .. _`Creating Relocatable Packages`:
  354. Creating Relocatable Packages
  355. -----------------------------
  356. A relocatable package must not reference absolute paths of files on
  357. the machine where the package is built that will not exist on the
  358. machines where the package may be installed.
  359. Packages created by :command:`install(EXPORT)` are designed to be relocatable,
  360. using paths relative to the location of the package itself. When defining
  361. the interface of a target for ``EXPORT``, keep in mind that the include
  362. directories should be specified as relative paths which are relative to the
  363. :variable:`CMAKE_INSTALL_PREFIX`:
  364. .. code-block:: cmake
  365. target_include_directories(tgt INTERFACE
  366. # Wrong, not relocatable:
  367. $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include/TgtName>
  368. )
  369. target_include_directories(tgt INTERFACE
  370. # Ok, relocatable:
  371. $<INSTALL_INTERFACE:include/TgtName>
  372. )
  373. The ``$<INSTALL_PREFIX>``
  374. :manual:`generator expression <cmake-generator-expressions(7)>` may be used as
  375. a placeholder for the install prefix without resulting in a non-relocatable
  376. package. This is necessary if complex generator expressions are used:
  377. .. code-block:: cmake
  378. target_include_directories(tgt INTERFACE
  379. # Ok, relocatable:
  380. $<INSTALL_INTERFACE:$<$<CONFIG:Debug>:$<INSTALL_PREFIX>/include/TgtName>>
  381. )
  382. This also applies to paths referencing external dependencies.
  383. It is not advisable to populate any properties which may contain
  384. paths, such as :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` and
  385. :prop_tgt:`INTERFACE_LINK_LIBRARIES`, with paths relevant to dependencies.
  386. For example, this code may not work well for a relocatable package:
  387. .. code-block:: cmake
  388. target_link_libraries(ClimbingStats INTERFACE
  389. ${Foo_LIBRARIES} ${Bar_LIBRARIES}
  390. )
  391. target_include_directories(ClimbingStats INTERFACE
  392. "$<INSTALL_INTERFACE:${Foo_INCLUDE_DIRS};${Bar_INCLUDE_DIRS}>"
  393. )
  394. The referenced variables may contain the absolute paths to libraries
  395. and include directories **as found on the machine the package was made on**.
  396. This would create a package with hard-coded paths to dependencies and not
  397. suitable for relocation.
  398. Ideally such dependencies should be used through their own
  399. :ref:`IMPORTED targets <Imported Targets>` that have their own
  400. :prop_tgt:`IMPORTED_LOCATION` and usage requirement properties
  401. such as :prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` populated
  402. appropriately. Those imported targets may then be used with
  403. the :command:`target_link_libraries` command for ``ClimbingStats``:
  404. .. code-block:: cmake
  405. target_link_libraries(ClimbingStats INTERFACE Foo::Foo Bar::Bar)
  406. With this approach the package references its external dependencies
  407. only through the names of :ref:`IMPORTED targets <Imported Targets>`.
  408. When a consumer uses the installed package, the consumer will run the
  409. appropriate :command:`find_package` commands (via the ``find_dependency``
  410. macro described above) to find the dependencies and populate the
  411. imported targets with appropriate paths on their own machine.
  412. Unfortunately many :manual:`modules <cmake-modules(7)>` shipped with
  413. CMake do not yet provide :ref:`IMPORTED targets <Imported Targets>`
  414. because their development pre-dated this approach. This may improve
  415. incrementally over time. Workarounds to create relocatable packages
  416. using such modules include:
  417. * When building the package, specify each ``Foo_LIBRARY`` cache
  418. entry as just a library name, e.g. ``-DFoo_LIBRARY=foo``. This
  419. tells the corresponding find module to populate the ``Foo_LIBRARIES``
  420. with just ``foo`` to ask the linker to search for the library
  421. instead of hard-coding a path.
  422. * Or, after installing the package content but before creating the
  423. package installation binary for redistribution, manually replace
  424. the absolute paths with placeholders for substitution by the
  425. installation tool when the package is installed.
  426. .. _`Package Registry`:
  427. Package Registry
  428. ================
  429. CMake provides two central locations to register packages that have
  430. been built or installed anywhere on a system:
  431. * `User Package Registry`_
  432. * `System Package Registry`_
  433. The registries are especially useful to help projects find packages in
  434. non-standard install locations or directly in their own build trees.
  435. A project may populate either the user or system registry (using its own
  436. means, see below) to refer to its location.
  437. In either case the package should store at the registered location a
  438. `Package Configuration File`_ (``<package>Config.cmake``) and optionally a
  439. `Package Version File`_ (``<package>ConfigVersion.cmake``).
  440. The :command:`find_package` command searches the two package registries
  441. as two of the search steps specified in its documentation. If it has
  442. sufficient permissions it also removes stale package registry entries
  443. that refer to directories that do not exist or do not contain a matching
  444. package configuration file.
  445. .. _`User Package Registry`:
  446. User Package Registry
  447. ---------------------
  448. The User Package Registry is stored in a per-user location.
  449. The :command:`export(PACKAGE)` command may be used to register a project
  450. build tree in the user package registry. CMake currently provides no
  451. interface to add install trees to the user package registry. Installers
  452. must be manually taught to register their packages if desired.
  453. On Windows the user package registry is stored in the Windows registry
  454. under a key in ``HKEY_CURRENT_USER``.
  455. A ``<package>`` may appear under registry key::
  456. HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\<package>
  457. as a ``REG_SZ`` value, with arbitrary name, that specifies the directory
  458. containing the package configuration file.
  459. On UNIX platforms the user package registry is stored in the user home
  460. directory under ``~/.cmake/packages``. A ``<package>`` may appear under
  461. the directory::
  462. ~/.cmake/packages/<package>
  463. as a file, with arbitrary name, whose content specifies the directory
  464. containing the package configuration file.
  465. .. _`System Package Registry`:
  466. System Package Registry
  467. -----------------------
  468. The System Package Registry is stored in a system-wide location.
  469. CMake currently provides no interface to add to the system package registry.
  470. Installers must be manually taught to register their packages if desired.
  471. On Windows the system package registry is stored in the Windows registry
  472. under a key in ``HKEY_LOCAL_MACHINE``. A ``<package>`` may appear under
  473. registry key::
  474. HKEY_LOCAL_MACHINE\Software\Kitware\CMake\Packages\<package>
  475. as a ``REG_SZ`` value, with arbitrary name, that specifies the directory
  476. containing the package configuration file.
  477. There is no system package registry on non-Windows platforms.
  478. .. _`Disabling the Package Registry`:
  479. Disabling the Package Registry
  480. ------------------------------
  481. In some cases using the Package Registries is not desirable. CMake
  482. allows one to disable them using the following variables:
  483. * :variable:`CMAKE_EXPORT_NO_PACKAGE_REGISTRY` disables the
  484. :command:`export(PACKAGE)` command.
  485. * :variable:`CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY` disables the
  486. User Package Registry in all the :command:`find_package` calls.
  487. * :variable:`CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY` disables
  488. the System Package Registry in all the :command:`find_package` calls.
  489. Package Registry Example
  490. ------------------------
  491. A simple convention for naming package registry entries is to use content
  492. hashes. They are deterministic and unlikely to collide
  493. (:command:`export(PACKAGE)` uses this approach).
  494. The name of an entry referencing a specific directory is simply the content
  495. hash of the directory path itself.
  496. If a project arranges for package registry entries to exist, such as::
  497. > reg query HKCU\Software\Kitware\CMake\Packages\MyPackage
  498. HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\MyPackage
  499. 45e7d55f13b87179bb12f907c8de6fc4 REG_SZ c:/Users/Me/Work/lib/cmake/MyPackage
  500. 7b4a9844f681c80ce93190d4e3185db9 REG_SZ c:/Users/Me/Work/MyPackage-build
  501. or::
  502. $ cat ~/.cmake/packages/MyPackage/7d1fb77e07ce59a81bed093bbee945bd
  503. /home/me/work/lib/cmake/MyPackage
  504. $ cat ~/.cmake/packages/MyPackage/f92c1db873a1937f3100706657c63e07
  505. /home/me/work/MyPackage-build
  506. then the ``CMakeLists.txt`` code:
  507. .. code-block:: cmake
  508. find_package(MyPackage)
  509. will search the registered locations for package configuration files
  510. (``MyPackageConfig.cmake``). The search order among package registry
  511. entries for a single package is unspecified and the entry names
  512. (hashes in this example) have no meaning. Registered locations may
  513. contain package version files (``MyPackageConfigVersion.cmake``) to
  514. tell :command:`find_package` whether a specific location is suitable
  515. for the version requested.
  516. Package Registry Ownership
  517. --------------------------
  518. Package registry entries are individually owned by the project installations
  519. that they reference. A package installer is responsible for adding its own
  520. entry and the corresponding uninstaller is responsible for removing it.
  521. The :command:`export(PACKAGE)` command populates the user package registry
  522. with the location of a project build tree. Build trees tend to be deleted by
  523. developers and have no "uninstall" event that could trigger removal of their
  524. entries. In order to keep the registries clean the :command:`find_package`
  525. command automatically removes stale entries it encounters if it has sufficient
  526. permissions. CMake provides no interface to remove an entry referencing an
  527. existing build tree once :command:`export(PACKAGE)` has been invoked.
  528. However, if the project removes its package configuration file from the build
  529. tree then the entry referencing the location will be considered stale.