CMakeToolchain: Building your project using CMakePresets
In this example we are going to see how to use CMakeToolchain
, predefined layouts like cmake_layout
and the CMakePresets
CMake feature.
Let’s create a basic project based on the template cmake_exe
as an example of a C++ project:
$ conan new cmake_exe -d name=foo -d version=1.0
Generating the toolchain
The recipe from our project declares the generator “CMakeToolchain”.
We can call conan install to install both Release
and Debug
configurations. Conan will generate a conan_toolchain.cmake
at the corresponding generators folder:
$ conan install .
$ conan install . -s build_type=Debug
Building the project using CMakePresets
A CMakeUserPresets.json
file is generated in the same folder of your CMakeLists.txt
file, so you can use the --preset
argument from cmake >= 3.23
or use an IDE that supports it.
The CMakeUserPresets.json
is including the CMakePresets.json
files located at the corresponding generators folder.
The CMakePresets.json
contain information about the conan_toolchain.cmake
location and even the binaryDir
set with the output directory.
Note
We use CMake presets in this example. This requires CMake >= 3.23 because the “include” from CMakeUserPresets.json
to CMakePresets.json
is only supported since that version. If you prefer not to use presets you can use something like:
cmake <path> -G <CMake generator> -DCMAKE_TOOLCHAIN_FILE=<path to
conan_toolchain.cmake> -DCMAKE_BUILD_TYPE=Release
Conan will show the exact CMake command everytime you run conan install
in case you can’t use the presets feature.
If you are using a multi-configuration generator:
$ cmake --preset conan-default
$ cmake --build --preset conan-debug
$ build\Debug\foo.exe
foo/1.0: Hello World Release!
$ cmake --build --preset conan-release
$ build\Release\foo.exe
foo/1.0: Hello World Release!
If you are using a single-configuration generator:
$ cmake --preset conan-debug
$ cmake --build --preset conan-debug
$ ./build/Debug/foo
foo/1.0: Hello World Debug!
$ cmake --preset conan-release
$ cmake --build --preset conan-release
$ ./build/Release/foo
foo/1.0: Hello World Release!
Note that we didn’t need to create the build/Release
or build/Debug
folders, as we did in the tutorial. The output directory is declared by the cmake_layout()
and automatically managed by the CMake Presets feature.
This behavior is also managed automatically by Conan (with CMake >= 3.15) when you build a package in the Conan cache (with conan create command). The CMake >= 3.23 is not required.
Read More:
cmake_layout()
referenceConanfile layout() method reference
Package layout tutorial tutorial
Understanding Conan package layouts