cmake_paths
generator
This generator is especially useful if you are using CMake
based only on the find_package
feature to locate the dependencies.
The cmake_paths
generator creates a file named conan_paths.cmake
declaring:
CMAKE_MODULE_PATH
with the folders of the required packages, to allow CMake to locate the included cmake scripts andFindXXX.cmake
files. The folder containing the conan_paths.cmake (self.install_folder when used in a recipe) is also included, so any custom file will be located too. Check cmake_find_package generator generator.CMAKE_PREFIX_PATH
used byfind_library()
to locate library files (.a, .lib, .so, .dll) in your packages andfind_dependency()
to locate the transitive dependencies.
[requires]
zlib/1.2.11
...
[generators]
cmake_paths
cmake_minimum_required(VERSION 3.0)
project(helloworld)
add_executable(helloworld hello.c)
find_package(Zlib)
if(ZLIB_FOUND)
include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries (helloworld ${ZLIB_LIBRARIES})
endif()
In the example above, the zlib/1.2.11
package is not packaging a custom FindZLIB.cmake
file, but the FindZLIB.cmake
included in the CMake installation directory (/Modules) will locate the zlib library from the Conan package because of the
CMAKE_PREFIX_PATH
used by the find_library()
.
If the zlib/1.2.11
would have included a custom FindZLIB.cmake
in the package root folder or any declared
self.cpp_info.builddirs, it would have been located because of the CMAKE_MODULE_PATH
variable.
Included as a toolchain
You can use the conan_paths.cmake as a toolchain without modifying your CMakeLists.txt file:
$ mkdir build && cd build
$ conan install ..
$ cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_paths.cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
Included using the CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
With CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
you can specify a file to be included by the project()
command.
If you already have a toolchain file you can use this variable to include the conan_paths.cmake
and insert your toolchain with the
CMAKE_TOOLCHAIN_FILE
.
$ mkdir build && cd build
$ conan install ..
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PROJECT_helloworld_INCLUDE=build/conan_paths.cmake
$ cmake --build .
Included in your CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(helloworld)
include(${CMAKE_BINARY_DIR}/conan_paths.cmake)
add_executable(helloworld hello.c)
find_package(zlib)
if(ZLIB_FOUND)
include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries (helloworld ${ZLIB_LIBRARIES})
endif()
$ mkdir build && cd build
$ conan install ..
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
See also
Check the section cmake_paths to read more about this generator.
Note
The CMAKE_MODULE_PATH
and CMAKE_PREFIX_PATH
contain the paths to the builddirs
of every required package. By default the
root package folder is the only declared builddirs
directory. Check cpp_info.