cmake_find_package_multi
Warning
This is an experimental feature subject to breaking changes in future releases.
This is the reference page for cmake_find_package_multi
generator.
Go to Integrations/CMake if you want to learn how to integrate your project or recipes with CMake.
Generated files
For each conan package in your graph, it will generate 2 files and 1 more per different build_type
.
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_multi"]
if specified:
NAME |
CONTENTS |
---|---|
<PKG-NAME>Config.cmake |
It includes the <PKG-NAME>Targets.cmake and call find_dependency for each dep |
<PKG-NAME>ConfigVersion.cmake |
Package version file for each dep |
<PKG-NAME>Targets.cmake |
It includes the files <PKG-NAME>Targets-<BUILD-TYPE>.cmake |
<PKG-NAME>Targets-debug.cmake |
Specific information for the Debug configuration |
<PKG-NAME>Targets-release.cmake |
Specific information for the Release configuration |
<PKG-NAME>Targets-relwithdebinfo.cmake |
Specific information for the RelWithDebInfo configuration |
<PKG-NAME>Targets-minsizerel.cmake |
Specific information for the MinSizeRel configuration |
Targets
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.INTERFACE_COMPILE_OPTIONS
: Compile options of the library.
The targets contains multi-configuration properties, for example, the compile options property is declared like this:
set_property(TARGET <PKG-NAME>::<PKG-NAME>
PROPERTY INTERFACE_COMPILE_OPTIONS
$<$<CONFIG:Release>:${{<PKG-NAME>_COMPILE_OPTIONS_RELEASE_LIST}}>
$<$<CONFIG:RelWithDebInfo>:${{<PKG-NAME>_COMPILE_OPTIONS_RELWITHDEBINFO_LIST}}>
$<$<CONFIG:MinSizeRel>:${{<PKG-NAME>_COMPILE_OPTIONS_MINSIZEREL_LIST}}>
$<$<CONFIG:Debug>:${{<PKG-NAME>_COMPILE_OPTIONS_DEBUG_LIST}}>)
The targets are also 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 CONFIG)
and find_package(B CONFIG)
.
Important
Add the CONFIG
option to find_package
so that module mode is explicitly skipped by CMake.
This helps to solve issues when there is for example a Find<PKG-NAME>.cmake
file in CMake’s default modules directory
that could be loaded instead of the <PKG-NAME>Config.cmake
generated by Conan.
You also need to adjust CMAKE_PREFIX_PATH and
CMAKE_MODULE_PATH so CMake can locate all
the <PKG-NAME>Config.cmake
files: The CMAKE_PREFIX_PATH
is used by the find_package
and the CMAKE_MODULE_PATH
is used by the
find_dependency
calls that locates the transitive dependencies.
The <PKG-NAME>Targets-.cmake files use <PKG-NAME>_BUILD_MODULES_<BUILD-TYPE> 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.
Components
If a recipe uses components, the targets generated will be <PKG-NAME>::<COMP-NAME>
with the following properties adjusted. Being
<COMP-NAME>
the dictionary key used to declare the component or the one declared in cpp_info.name
or the alternative name declared in
cpp_info.components["comp_name"].names["cmake_find_package_multi"]
if specified:
INTERFACE_INCLUDE_DIRECTORIES
: Containing all the include 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 the list of targets for all the components in the package.