• Introducción
  • Usar paquetes

    • Paquetes de archivos de configuración
    • Paquetes de módulos de búsqueda
  • Disposición del paquete

    • Archivo de configuración del paquete
    • Archivo de versión de paquete
  • Crear paquetes

    • Creación de un archivo de configuración de paquete

      • Creación de un archivo de configuración de paquetes para el árbol de compilación
    • Creación de paquetes reubicables
  • Registro de paquetes

    • Registro de paquete de usuario
    • Registro de paquetes del sistema
    • Deshabilitar el registro de paquetes
    • Ejemplo de registro de paquete
    • Propiedad del registro del paquete

Introducción

Los paquetes proporcionan información de dependencia a los sistemas de compilación basados ​​en CMake. Los paquetes se encuentran con el find_package() mando. El resultado de usar find_package() es un conjunto de IMPORTED objetivos, o un conjunto de variables correspondientes a información relevante para la construcción.

Usar paquetes

CMake proporciona soporte directo para dos formas de paquetes, Paquetes de archivos de configuración y Paquetes de módulos de búsqueda. Soporte indirecto para pkg-config Los paquetes también se proporcionan a través del FindPkgConfig módulo. En todos los casos, la forma básica de find_package() llamadas es lo mismo:

find_package(Qt4 4.7.0 REQUIRED) # CMake provides a Qt4 find-module
find_package(Qt5Core 5.1.0 REQUIRED) # Qt provides a Qt5 package config file.
find_package(LibXml2 REQUIRED) # Use pkg-config via the LibXml2 find-module

En los casos en los que se sabe que un archivo de configuración de paquete es proporcionado por el flujo ascendente, y solo ese debe usarse, el CONFIG la palabra clave se puede pasar a find_package():

find_package(Qt5Core 5.1.0 CONFIG REQUIRED)
find_package(Qt5Gui 5.1.0 CONFIG)

Del mismo modo, el MODULE palabra clave dice usar solo un módulo de búsqueda:

find_package(Qt4 4.7.0 MODULE REQUIRED)

La especificación del tipo de paquete mejora explícitamente el mensaje de error que se muestra al usuario si no se encuentra.

Ambos tipos de paquetes también admiten la especificación de componentes de un paquete, ya sea después de la REQUIRED palabra clave:

find_package(Qt5 5.1.0 CONFIG REQUIRED Widgets Xml Sql)

o como un separado COMPONENTS lista:

find_package(Qt5 5.1.0 COMPONENTS Widgets Xml Sql)

o como un separado OPTIONAL_COMPONENTS lista:

find_package(Qt5 5.1.0 COMPONENTS Widgets
                       OPTIONAL_COMPONENTS Xml Sql
)

Manejo de COMPONENTS y OPTIONAL_COMPONENTS está definido por el paquete.

Al establecer el“title =” CMAKE_DISABLE_FIND_PACKAGE_“>CMAKE_DISABLE_FIND_PACKAGE_ variable a TRUE, los El paquete no se buscará y siempre se NOTFOUND.

Paquetes de archivos de configuración

Un paquete de archivos de configuración es un conjunto de archivos proporcionados por las aguas arriba para que los utilicen las aguas abajo. CMake busca en varias ubicaciones archivos de configuración de paquetes, como se describe en la find_package() documentación. La forma más sencilla para que un usuario de CMake lo diga cmake(1) buscar en un prefijo no estándar para un paquete es establecer el CMAKE_PREFIX_PATH variable de caché.

Los paquetes de archivos de configuración los proporcionan los proveedores ascendentes como parte de los paquetes de desarrollo, es decir, pertenecen a los archivos de encabezado y cualquier otro archivo proporcionado para ayudar a los usuarios descendentes a utilizar el paquete.

Un conjunto de variables que proporcionan información sobre el estado del paquete también se configura automáticamente cuando se usa un paquete de archivos de configuración. los _FOUND La variable se establece en verdadero o falso, dependiendo de si se encontró el paquete. los _DIR La variable de caché se establece en la ubicación del archivo de configuración del paquete.

Paquetes de módulos de búsqueda

Un módulo de búsqueda es un archivo con un conjunto de reglas para encontrar las partes requeridas de una dependencia, principalmente archivos de encabezado y bibliotecas. Por lo general, se necesita un módulo de búsqueda cuando el upstream no está construido con CMake, o no es lo suficientemente consciente de CMake como para proporcionar un archivo de configuración de paquete. A diferencia de un archivo de configuración de paquete, no se envía con el flujo ascendente, pero el flujo descendente lo utiliza para encontrar los archivos adivinando las ubicaciones de los archivos con sugerencias específicas de la plataforma.

A diferencia del caso de un archivo de configuración de paquete proporcionado en sentido ascendente, ningún punto de referencia único identifica el paquete como encontrado, por lo que el _FOUND variable no se establece automáticamente por el find_package() mando. Sin embargo, aún se puede esperar que se establezca por convención y debe ser establecido por el autor del módulo Find. Del mismo modo, no hay _DIR variable, pero cada uno de los artefactos, como las ubicaciones de las bibliotecas y las ubicaciones de los archivos de encabezado, proporcionan una variable de caché separada.

Ver el cmake-developer(7) manual para obtener más información sobre la creación de archivos de módulo de búsqueda.

Disposición del paquete

Un paquete de archivo de configuración consta de un archivo de configuración de paquete y, opcionalmente, un archivo de versión de paquete que se proporciona con la distribución del proyecto.

Archivo de configuración del paquete

Considere un proyecto Foo que instala los siguientes archivos:

/include/foo-1.2/foo.h
/lib/foo-1.2/libfoo.a

También puede proporcionar un archivo de configuración de paquete CMake:

/lib/cmake/foo-1.2/FooConfig.cmake

con contenido que define IMPORTED objetivos, o definir variables, como:

# ...
# (compute PREFIX relative to file location)
# ...
set(Foo_INCLUDE_DIRS $PREFIX/include/foo-1.2)
set(Foo_LIBRARIES $PREFIX/lib/foo-1.2/libfoo.a)

Si otro proyecto desea utilizar Foo solo necesita ubicar el FooConfig.cmake y cárguelo para obtener toda la información que necesita sobre las ubicaciones del contenido del paquete. Dado que el archivo de configuración del paquete lo proporciona la instalación del paquete, ya conoce todas las ubicaciones de los archivos.

los find_package() El comando puede usarse para buscar el archivo de configuración del paquete. Este comando construye un conjunto de prefijos de instalación y busca bajo cada prefijo en varias ubicaciones. Dado el nombre Foo, busca un archivo llamado FooConfig.cmake o foo-config.cmake. El conjunto completo de ubicaciones se especifica en el find_package() documentación de comandos. Un lugar donde se ve es:

/lib/cmake/Foo*/

dónde Foo* es una expresión globbing que no distingue entre mayúsculas y minúsculas. En nuestro ejemplo, la expresión globular coincidirá

/lib/cmake/foo-1.2 and the package configuration file will be found.

Once found, a package configuration file is immediately loaded. It, together with a package version file, contains all the information the project needs to use the package.

Package Version File

When the find_package() command finds a candidate package configuration file it looks next to it for a version file. The version file is loaded to test whether the package version is an acceptable match for the version requested. If the version file claims compatibility the configuration file is accepted. Otherwise it is ignored.

The name of the package version file must match that of the package configuration file but has either -version or Version appended to the name before the .cmake extension. For example, the files:

/lib/cmake/foo-1.3/foo-config.cmake
/lib/cmake/foo-1.3/foo-config-version.cmake

y:

/lib/cmake/bar-4.2/BarConfig.cmake
/lib/cmake/bar-4.2/BarConfigVersion.cmake

son pares de archivos de configuración del paquete y los archivos de versión del paquete correspondientes.

Cuando el find_package() comando carga un archivo de versión, primero establece las siguientes variables:

PACKAGE_FIND_NAME

los

PACKAGE_FIND_VERSION

Cadena de versión completa solicitada

PACKAGE_FIND_VERSION_MAJOR

Versión principal si se solicita, de lo contrario 0

PACKAGE_FIND_VERSION_MINOR

Versión menor si se solicita, de lo contrario 0

PACKAGE_FIND_VERSION_PATCH

Versión del parche si se solicita, de lo contrario 0

PACKAGE_FIND_VERSION_TWEAK

Modifique la versión si se solicita, de lo contrario 0

PACKAGE_FIND_VERSION_COUNT

Número de componentes de la versión, 0 a 4

El archivo de versión debe usar estas variables para verificar si es compatible o una coincidencia exacta para la versión solicitada y establecer las siguientes variables con resultados:

PACKAGE_VERSION

Cadena de versión completa proporcionada

PACKAGE_VERSION_EXACT

Verdadero si la versión coincide exactamente

PACKAGE_VERSION_COMPATIBLE

Verdadero si la versión es compatible

PACKAGE_VERSION_UNSUITABLE

Verdadero si no es adecuado para cualquier versión

Los archivos de versión se cargan en un ámbito anidado para que puedan establecer las variables que deseen como parte de su cálculo. El comando find_package borra el alcance cuando el archivo de versión se ha completado y ha verificado las variables de salida. Cuando el archivo de versión afirma ser una coincidencia aceptable para la versión solicitada, el comando find_package establece las siguientes variables para que las use el proyecto:

_VERSION

Cadena de versión completa proporcionada

_VERSION_MAJOR

Versión principal si se proporciona, de lo contrario 0

_VERSION_MINOR

Versión menor si se proporciona, de lo contrario 0

_VERSION_PATCH

Versión de parche si se proporciona, de lo contrario 0

_VERSION_TWEAK

Modifique la versión si se proporciona, de lo contrario 0

_VERSION_COUNT

Número de componentes de la versión, 0 a 4

Las variables informan la versión del paquete que se encontró realmente. los parte de su nombre coincide con el argumento dado a la find_package() mando.

Crear paquetes

Por lo general, el flujo ascendente depende del propio CMake y puede usar algunas funciones de CMake para crear los archivos del paquete. Considere un upstream que proporcione una sola biblioteca compartida:

project(UpstreamLib)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)

set(Upstream_VERSION 3.4.1)

include(GenerateExportHeader)

add_library(ClimbingStats SHARED climbingstats.cpp)
generate_export_header(ClimbingStats)
set_property(TARGET ClimbingStats PROPERTY VERSION $Upstream_VERSION)
set_property(TARGET ClimbingStats PROPERTY SOVERSION 3)
set_property(TARGET ClimbingStats PROPERTY
  INTERFACE_ClimbingStats_MAJOR_VERSION 3)
set_property(TARGET ClimbingStats APPEND PROPERTY
  COMPATIBLE_INTERFACE_STRING ClimbingStats_MAJOR_VERSION
)

install(TARGETS ClimbingStats EXPORT ClimbingStatsTargets
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)
install(
  FILES
    climbingstats.h
    "$CMAKE_CURRENT_BINARY_DIR/climbingstats_export.h"
  DESTINATION
    include
  COMPONENT
    Devel
)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  "$CMAKE_CURRENT_BINARY_DIR/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  VERSION $Upstream_VERSION
  COMPATIBILITY AnyNewerVersion
)

export(EXPORT ClimbingStatsTargets
  FILE "$CMAKE_CURRENT_BINARY_DIR/ClimbingStats/ClimbingStatsTargets.cmake"
  NAMESPACE Upstream::
)
configure_file(cmake/ClimbingStatsConfig.cmake
  "$CMAKE_CURRENT_BINARY_DIR/ClimbingStats/ClimbingStatsConfig.cmake"
  COPYONLY
)

set(ConfigPackageLocation lib/cmake/ClimbingStats)
install(EXPORT ClimbingStatsTargets
  FILE
    ClimbingStatsTargets.cmake
  NAMESPACE
    Upstream::
  DESTINATION
    $ConfigPackageLocation
)
install(
  FILES
    cmake/ClimbingStatsConfig.cmake
    "$CMAKE_CURRENT_BINARY_DIR/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  DESTINATION
    $ConfigPackageLocation
  COMPONENT
    Devel
)

los CMakePackageConfigHelpers El módulo proporciona una macro para crear un ConfigVersion.cmake expediente. Este archivo establece la versión del paquete. CMake lo lee cuando find_package() se llama para determinar la compatibilidad con la versión solicitada y para establecer algunas variables específicas de la versión _VERSION, _VERSION_MAJOR, _VERSION_MINOR etc. El install(EXPORT) El comando se utiliza para exportar los destinos en el ClimbingStatsTargets export-set, definido previamente por el install(TARGETS) mando. Este comando genera el ClimbingStatsTargets.cmake archivo para contener IMPORTED objetivos, adecuado para su uso por aguas abajo y se las arregla para instalarlo en lib/cmake/ClimbingStats. El generado ClimbingStatsConfigVersion.cmake y un cmake/ClimbingStatsConfig.cmake están instalados en la misma ubicación, completando el paquete.

El generado IMPORTED Los objetivos tienen propiedades adecuadas establecidas para definir su requisitos de uso, tal como INTERFACE_INCLUDE_DIRECTORIES, INTERFACE_COMPILE_DEFINITIONS y otras incorporadas relevantes INTERFACE_ propiedades. los INTERFACE variante de propiedades definidas por el usuario enumeradas en COMPATIBLE_INTERFACE_STRING y otra Propiedades de interfaz compatibles también se propagan a los generados IMPORTED objetivos. En el caso anterior, ClimbingStats_MAJOR_VERSION se define como una cadena que debe ser compatible entre las dependencias de cualquier dependiente. Al establecer esta propiedad de usuario definida personalizada en esta versión y en la próxima versión de ClimbingStats, cmake(1) emitirá un diagnóstico si hay un intento de usar la versión 3 junto con la versión 4. Los paquetes pueden optar por emplear dicho patrón si diferentes versiones principales del paquete están diseñadas para ser incompatibles.

A NAMESPACE con dos puntos dobles se especifica al exportar los destinos para la instalación. Esta convención de dos puntos dobles le da a CMake una pista de que el nombre es un IMPORTED objetivo cuando es utilizado por aguas abajo con el target_link_libraries() mando. De esta forma, CMake puede emitir un diagnóstico si aún no se ha encontrado el paquete que lo proporciona.

En este caso, al usar install(TARGETS) los INCLUDES DESTINATION fue especificado. Esto hace que el IMPORTED objetivos para tener su INTERFACE_INCLUDE_DIRECTORIES poblado con el include directorio en el CMAKE_INSTALL_PREFIX. Cuando el IMPORTED target es usado por downstream, automáticamente consume las entradas de esa propiedad.

Creación de un archivo de configuración de paquete

En este caso, el ClimbingStatsConfig.cmake archivo podría ser tan simple como:

include("$CMAKE_CURRENT_LIST_DIR/ClimbingStatsTargets.cmake")

Como esto permite que las aguas abajo utilicen el IMPORTED objetivos. Si alguna macros debe ser proporcionada por el ClimbingStats paquete, deben estar en un archivo separado que se instala en la misma ubicación que el ClimbingStatsConfig.cmake archivo, e incluido desde allí.

Esto también se puede ampliar para cubrir dependencias:

# ...
add_library(ClimbingStats SHARED climbingstats.cpp)
generate_export_header(ClimbingStats)

find_package(Stats 2.6.4 REQUIRED)
target_link_libraries(ClimbingStats PUBLIC Stats::Types)

Como el Stats::Types el objetivo es un PUBLIC dependencia de ClimbingStats, aguas abajo también deben encontrar el Stats paquete y enlace al Stats::Types Biblioteca. los Stats El paquete debe encontrarse en el ClimbingStatsConfig.cmake archivo para garantizar esto. los find_dependency macro de la CMakeFindDependencyMacro ayuda con esto propagando si el paquete es REQUIRED, o QUIET etc. Todo REQUIRED las dependencias de un paquete deben encontrarse en el Config.cmake expediente:

include(CMakeFindDependencyMacro)
find_dependency(Stats 2.6.4)

include("$CMAKE_CURRENT_LIST_DIR/ClimbingStatsTargets.cmake")
include("$CMAKE_CURRENT_LIST_DIR/ClimbingStatsMacros.cmake")

los find_dependency macro también conjuntos ClimbingStats_FOUND para False si no se encuentra la dependencia, junto con un diagnóstico de que la ClimbingStats El paquete no se puede utilizar sin el Stats paquete.

Si COMPONENTS se especifican cuando el downstream utiliza find_package(), se enumeran en el _FIND_COMPONENTS variable. Si un componente en particular no es opcional, entonces el _FIND_REQUIRED_ será verdad. Esto se puede probar con la lógica en el archivo de configuración del paquete:

include(CMakeFindDependencyMacro)
find_dependency(Stats 2.6.4)

include("$CMAKE_CURRENT_LIST_DIR/ClimbingStatsTargets.cmake")
include("$CMAKE_CURRENT_LIST_DIR/ClimbingStatsMacros.cmake")

set(_supported_components Plot Table)

foreach(_comp $ClimbingStats_FIND_COMPONENTS)
  if (NOT ";$_supported_components;" MATCHES _comp)
    set(ClimbingStats_FOUND False)
    set(ClimbingStats_NOT_FOUND_MESSAGE "Unsupported component: $_comp")
  endif()
  include("$CMAKE_CURRENT_LIST_DIR/ClimbingStats$_compTargets.cmake")
endforeach()

Aquí el ClimbingStats_NOT_FOUND_MESSAGE se establece en un diagnóstico de que no se pudo encontrar el paquete porque se especificó un componente no válido. Esta variable de mensaje se puede establecer para cualquier caso donde el _FOUND la variable está establecida en Falsey se mostrará al usuario.

Creación de un archivo de configuración de paquetes para el árbol de compilación

los export(EXPORT) comando crea un IMPORTED archivo de definición de objetivos que es específico del árbol de compilación y no es reubicable. Esto se puede usar de manera similar con un archivo de configuración de paquete adecuado y un archivo de versión de paquete para definir un paquete para el árbol de compilación que se puede usar sin instalación. Los consumidores del árbol de compilación pueden simplemente asegurarse de que CMAKE_PREFIX_PATH contiene el directorio de compilación, o establece el ClimbingStats_DIR para /ClimbingStats en el caché.

Creación de paquetes reubicables

Un paquete reubicable no debe hacer referencia a rutas absolutas de archivos en la máquina donde se construyó el paquete que no existirán en las máquinas donde se puede instalar el paquete.

Paquetes creados por install(EXPORT) están diseñados para ser reubicables, utilizando rutas relativas a la ubicación del paquete en sí. Al definir la interfaz de un objetivo para EXPORT, tenga en cuenta que los directorios de inclusión deben especificarse como rutas relativas que son relativas a la CMAKE_INSTALL_PREFIX:

target_include_directories(tgt INTERFACE
  # Wrong, not relocatable:
  $
)

target_include_directories(tgt INTERFACE
  # Ok, relocatable:
  $
)

los $generator expression se puede utilizar como marcador de posición para el prefijo de instalación sin que resulte en un paquete no reubicable. Esto es necesario si se utilizan expresiones generadoras complejas:

target_include_directories(tgt INTERFACE
  # Ok, relocatable:
  $:$/include/TgtName>>
)

Esto también se aplica a las rutas que hacen referencia a dependencias externas. No es aconsejable completar ninguna propiedad que pueda contener rutas, como INTERFACE_INCLUDE_DIRECTORIES y INTERFACE_LINK_LIBRARIES, con rutas relevantes para las dependencias. Por ejemplo, es posible que este código no funcione bien para un paquete reubicable:

target_link_libraries(ClimbingStats INTERFACE
  $Foo_LIBRARIES $Bar_LIBRARIES
  )
target_include_directories(ClimbingStats INTERFACE
  "$"
  )

Las variables a las que se hace referencia pueden contener las rutas absolutas a las bibliotecas e incluir directorios como se encuentra en la máquina, el paquete se hizo en. Esto crearía un paquete con rutas codificadas de forma rígida a las dependencias y no sería adecuado para la reubicación.

Idealmente, tales dependencias deberían usarse a través de sus propias Objetivos IMPORTADOS que tienen los suyos IMPORTED_LOCATION y propiedades de requisitos de uso como INTERFACE_INCLUDE_DIRECTORIES poblado adecuadamente. Esos objetivos importados se pueden utilizar con el target_link_libraries() comando para ClimbingStats:

target_link_libraries(ClimbingStats INTERFACE Foo::Foo Bar::Bar)

Con este enfoque, el paquete hace referencia a sus dependencias externas solo a través de los nombres de Objetivos IMPORTADOS. Cuando un consumidor usa el paquete instalado, el consumidor ejecutará el find_package() comandos (a través del find_dependency macro descrita anteriormente) para encontrar las dependencias y completar los destinos importados con las rutas adecuadas en su propia máquina.

Desafortunadamente muchos modules enviado con CMake aún no proporciona Objetivos IMPORTADOS porque su desarrollo es anterior a este enfoque. Esto puede mejorar gradualmente con el tiempo. Las soluciones alternativas para crear paquetes reubicables con dichos módulos incluyen:

  • Al construir el paquete, especifique cada Foo_LIBRARY entrada de caché como solo un nombre de biblioteca, p. ej. -DFoo_LIBRARY=foo. Esto le dice al módulo de búsqueda correspondiente que complete el Foo_LIBRARIES con tan solo foo para pedirle al enlazador que busque la biblioteca en lugar de codificar una ruta.
  • O, después de instalar el contenido del paquete, pero antes de crear el binario de instalación del paquete para su redistribución, reemplace manualmente las rutas absolutas con marcadores de posición para la sustitución por la herramienta de instalación cuando se instala el paquete.

Registro de paquetes

CMake proporciona dos ubicaciones centrales para registrar paquetes que se han creado o instalado en cualquier lugar de un sistema:

  • Registro de paquete de usuario
  • Registro de paquetes del sistema

Los registros son especialmente útiles para ayudar a los proyectos a encontrar paquetes en ubicaciones de instalación no estándar o directamente en sus propios árboles de construcción. Un proyecto puede poblar el registro del usuario o del sistema (usando sus propios medios, ver más abajo) para referirse a su ubicación. En cualquier caso, el paquete debe almacenar en la ubicación registrada un archivo de configuración del paquete (Config.cmake) y, opcionalmente, un archivo de versión de paquete (ConfigVersion.cmake).

los find_package() El comando busca en los dos registros de paquetes como dos de los pasos de búsqueda especificados en su documentación. Si tiene permisos suficientes, también elimina las entradas de registro de paquetes obsoletos que hacen referencia a directorios que no existen o que no contienen un archivo de configuración de paquete coincidente.

Registro de paquete de usuario

El Registro de paquetes de usuarios se almacena en una ubicación por usuario. los export(PACKAGE) El comando puede usarse para registrar un árbol de construcción de proyectos en el registro de paquetes de usuario. CMake actualmente no proporciona una interfaz para agregar árboles de instalación al registro de paquetes de usuario. A los instaladores se les debe enseñar manualmente a registrar sus paquetes si así lo desean.

En Windows, el registro del paquete de usuario se almacena en el registro de Windows con una clave en HKEY_CURRENT_USER.

A puede aparecer bajo la clave de registro:

HKEY_CURRENT_USERSoftwareKitwareCMakePackages

como un REG_SZ valor, con nombre arbitrario, que especifica el directorio que contiene el archivo de configuración del paquete.

En las plataformas UNIX, el registro del paquete de usuario se almacena en el directorio de inicio del usuario en ~/.cmake/packages. A puede aparecer en el directorio:

~/.cmake/packages/

como un archivo, con nombre arbitrario, cuyo contenido especifica el directorio que contiene el archivo de configuración del paquete.

Registro de paquetes del sistema

El Registro de paquetes del sistema se almacena en una ubicación para todo el sistema. CMake actualmente no proporciona una interfaz para agregar al registro de paquetes del sistema. A los instaladores se les debe enseñar manualmente a registrar sus paquetes si así lo desean.

En Windows, el registro del paquete del sistema se almacena en el registro de Windows con una clave en HKEY_LOCAL_MACHINE. A puede aparecer bajo la clave de registro:

HKEY_LOCAL_MACHINESoftwareKitwareCMakePackages

como un REG_SZ valor, con nombre arbitrario, que especifica el directorio que contiene el archivo de configuración del paquete.

No existe un registro de paquetes del sistema en plataformas que no son de Windows.

Deshabilitar el registro de paquetes

En algunos casos, no es aconsejable utilizar los registros de paquetes. CMake permite deshabilitarlos usando las siguientes variables:

  • los export(PACKAGE) El comando no llena el registro del paquete de usuario cuando CMP0090 se establece en NEW a menos que el CMAKE_EXPORT_PACKAGE_REGISTRY variable lo habilita explícitamente. Cuando CMP0090 es no ajustado a NEW luego export(PACKAGE) llena el registro del paquete de usuario a menos que el CMAKE_EXPORT_NO_PACKAGE_REGISTRY variable lo desactiva explícitamente.
  • CMAKE_FIND_USE_PACKAGE_REGISTRY deshabilita el registro de paquetes de usuario en todos los find_package() llamadas cuando se establece en FALSE.
  • Obsoleto CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY deshabilita el registro de paquetes de usuario en todos los find_package() llamadas cuando se establece en TRUE. Esta variable se ignora cuando CMAKE_FIND_USE_PACKAGE_REGISTRY ha sido establecido.
  • CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY deshabilita el Registro de paquetes del sistema en todos los find_package() llamadas.

Ejemplo de registro de paquete

Una convención simple para nombrar entradas de registro de paquetes es usar hash de contenido. Son deterministas y es poco probable que choquen (export(PACKAGE) utiliza este enfoque). El nombre de una entrada que hace referencia a un directorio específico es simplemente el hash de contenido de la ruta del directorio en sí.

Si un proyecto dispone que existan entradas de registro de paquetes, como:

> reg query HKCUSoftwareKitwareCMakePackagesMyPackage
HKEY_CURRENT_USERSoftwareKitwareCMakePackagesMyPackage
 45e7d55f13b87179bb12f907c8de6fc4 REG_SZ c:/Users/Me/Work/lib/cmake/MyPackage
 7b4a9844f681c80ce93190d4e3185db9 REG_SZ c:/Users/Me/Work/MyPackage-build

o:

$ cat ~/.cmake/packages/MyPackage/7d1fb77e07ce59a81bed093bbee945bd
/home/me/work/lib/cmake/MyPackage
$ cat ~/.cmake/packages/MyPackage/f92c1db873a1937f3100706657c63e07
/home/me/work/MyPackage-build

entonces el CMakeLists.txt código:

find_package(MyPackage)

buscará las ubicaciones registradas para los archivos de configuración del paquete (MyPackageConfig.cmake). El orden de búsqueda entre las entradas del registro de paquetes para un solo paquete no está especificado y los nombres de las entradas (hash en este ejemplo) no tienen significado. Las ubicaciones registradas pueden contener archivos de versión de paquete (MyPackageConfigVersion.cmake) decir find_package() si una ubicación específica es adecuada para la versión solicitada.

Propiedad del registro del paquete

Las entradas de registro de paquetes son propiedad individual de las instalaciones del proyecto a las que hacen referencia. Un instalador de paquetes es responsable de agregar su propia entrada y el desinstalador correspondiente es responsable de eliminarlo.

los export(PACKAGE) El comando completa el registro del paquete de usuario con la ubicación de un árbol de construcción del proyecto. Los desarrolladores tienden a eliminar los árboles de compilación y no tienen un evento de “desinstalación” que pueda desencadenar la eliminación de sus entradas. Para mantener limpios los registros, find_package() El comando elimina automáticamente las entradas obsoletas que encuentra si tiene suficientes permisos. CMake no proporciona una interfaz para eliminar una entrada que hace referencia a un árbol de compilación existente una vez export(PACKAGE) ha sido invocado. Sin embargo, si el proyecto elimina el archivo de configuración de su paquete del árbol de compilación, la entrada que hace referencia a la ubicación se considerará obsoleta.