Skip to content

Latest commit

 

History

History
89 lines (66 loc) · 6.76 KB

cmake_find_package.rst

File metadata and controls

89 lines (66 loc) · 6.76 KB

cmake_find_package

This is the reference page for cmake_find_package generator. Go to Integrations/CMake<cmake> if you want to learn how to integrate your project or recipes with CMake.

The cmake_find_package generator creates a file for each requirement specified in the conanfile.

The name of the files follow the pattern Find<PKG-NAME>.cmake. So for the asio/1.14.0 package, a Findasio.cmake file will be generated.

Variables in Find<PKG-NAME>.cmake

Being <PKG-NAME> the package name used in the reference (by default) or the one declared in cpp_info.name or in cpp_info.names["cmake_find_package"] if specified:

NAME VALUE
<PKG-NAME>_FOUND Set to 1
<PKG-NAME>_VERSION Package version
<PKG-NAME>_INCLUDE_DIRS Containing all the include directories of the package
<PKG-NAME>_INCLUDES Same as the XXX_INCLUDE_DIRS
<PKG-NAME>_DEFINITIONS Definitions of the library
<PKG-NAME>_LIBS Library paths to link
<PKG-NAME>_LIBRARIES Same as <PKG-NAME>_LIBS
<PKG-NAME>_BUILD_MODULES List of CMake module files with functionalities for consumers
<PKG-NAME>_SYSTEM_LIBS System libraries to link
<PKG-NAME>_FRAMEWORKS Framework names to do a find_library()
<PKG-NAME>_FRAMEWORKS_FOUND Found frameworks to link with after find_library()
<PKG-NAME>_FRAMEWORK_DIRS Framework directories to perform the find_library() of <PKG-NAME>_FRAMEWORKS

This file uses <PKG-NAME>_BUILD_MODULES values to include the files using the include(...) CMake directive. This makes functions or utilities exported by the package available for consumers just by setting find_package(<PKG-NAME>) in the CMakeLists.txt.

Moreover, this also adjusts CMAKE_MODULE_PATH and CMAKE_PREFIX_PATH to the values declared by the package in cpp_info.buildirs, so modules in those directories can be found.

Targets in Find<PKG-NAME>.cmake

A target named <PKG-NAME>::<PKG-NAME> target is generated with the following properties adjusted:

  • INTERFACE_INCLUDE_DIRECTORIES: Containing all the include directories of the package.
  • INTERFACE_LINK_LIBRARIES: Library paths to link.
  • INTERFACE_COMPILE_DEFINITIONS: Definitions of the library.

The targets are transitive. So, if your project depends on a packages A and B, and at the same time A depends on C, the A target will contain automatically the properties of the C dependency, so in your CMakeLists.txt file you only need to find_package(A) and find_package(B).

Components

If a recipe uses components, the targets generated will be <PKG-NAME>::<COMP-NAME> with the following properties adjusted:

  • INTERFACE_INCLUDE_DIRECTORIES: Containing all the include directories of the component.
  • INTERFACE_LINK_DIRECTORIES: Containing all the lib directories of the component.
  • INTERFACE_LINK_LIBRARIES: Containing the targets to link the component to (includes component's libraries and dependencies).
  • INTERFACE_COMPILE_DEFINITIONS: Containing the definitions of the component.
  • INTERFACE_COMPILE_OPTIONS: Containing the compile options of the component.

Moreover, a global target <PKG-NAME>::<PKG-NAME> will be declared with the following properties adjusted:

  • INTERFACE_LINK_LIBRARIES: Containing all the component targets to link the global target to (includes package's components only).

Important

If there is a global target shared by different packages, then the global target will be linked to all the components targets across the different packages. This means that the global target will include different components targets across different packages.