CMake wrapper for the Conan C and C++ package manager.
This cmake module allows to launch conan install
from cmake.
The branches in this repo are:
- develop: PR are merged to this branch. Latest state of development
- master: Latest release
- tagged releases: https://github.com/conan-io/cmake-conan/releases.
You probably want to use a tagged release to ensure controlled upgrades.
You can just clone or grab the conan.cmake file and put in in your project.
Or it can be used in this way. Note the v0.12
tag in the URL, change it to point to your desired release:
cmake_minimum_required(VERSION 2.8)
project(myproject CXX)
# Download automatically, you can also just copy the conan.cmake file
if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.12/conan.cmake"
"${CMAKE_BINARY_DIR}/conan.cmake")
endif()
include(${CMAKE_BINARY_DIR}/conan.cmake)
conan_cmake_run(REQUIRES Hello/0.1@memsharded/testing
BASIC_SETUP
BUILD missing)
add_executable(main main.cpp)
target_link_libraries(main ${CONAN_LIBS})
If you want to use targets, you could do:
include(conan.cmake)
conan_cmake_run(REQUIRES Hello/0.1@memsharded/testing
BASIC_SETUP CMAKE_TARGETS
BUILD missing)
add_executable(main main.cpp)
target_link_libraries(main CONAN_PKG::Hello)
This will do a conan_basic_setup(TARGETS)
for modern CMake targets definition
If you want to use your own conanfile.txt
or conanfile.py
instead of generating a temporary one, you could do:
include(conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt # or relative build/conanfile.txt
BASIC_SETUP CMAKE_TARGETS
BUILD missing)
The resolution of the path will be relative to the root CMakeLists.txt
file.
include(conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt
BASIC_SETUP KEEP_RPATHS)
include(conan.cmake)
conan_cmake_run(CONANFILE conanfile.txt
BASIC_SETUP NO_OUTPUT_DIRS)
Pass to conan_basic_setup(NO_OUTPUT_DIRS)
so conanbuildinfo.cmake does not change the output directories (lib, bin)
include(conan.cmake)
conan_cmake_run(ARCH armv7)
Use it to override the architecture detection and force to call conan with the provided one. The architecture should exist in settings.yml
include(conan.cmake)
conan_cmake_run(BUILD_TYPE "None")
Use it to override the build_type detection and force to call conan with the provided one. The build type should exist in settings.yml
include(conan.cmake)
conan_cmake_run(PROFILE default)
Use it to use the default conan profile rather than inferring settings from CMake.
To use the cmake_multi generator you just need to make sure CMAKE_BUILD_TYPE
is empty and use a CMake generator that supports multi-configuration.
include(conan.cmake)
conan_cmake_run(...
SETTINGS arch=armv6
SETTINGS cppstd=14)
Provide the conan install --install-folder=[folder]
argument:
include(conan.cmake)
conan_cmake_run(...
INSTALL_FOLDER myfolder
)
Add additional generators. May useful to add the virtualrunenv-generator:
include(conan.cmake)
conan_cmake_run(...
GENERATORS virtualrunenv)
Checks conan availability in PATH Arguments REQUIRED and VERSION are optional
Example usage:
conan_check(VERSION 1.0.0 REQUIRED)
Adds a remote Arguments URL and NAME are required, INDEX is optional.
Example usage:
conan_add_remote(NAME bincrafters INDEX 1
URL https://api.bintray.com/conan/bincrafters/public-conan)
This cmake wrapper launchs conan, installing dependencies, and injecting a conan_basic_setup()
call. So it is for end-users only, but not necessary at all for creating packages, because conan already downloaded and installed dependencies the moment that a package needs to be built. So if you are using the same CMakeLists.txt for both consuming and creating packages, consider doing something like:
if(CONAN_EXPORTED) # in conan local cache
# standard conan installation, deps will be defined in conanfile.py
# and not necessary to call conan again, conan is already running
include(${CMAKE_BINAR_DIR}/conanbuildinfo.cmake)
conan_basic_setup()
else() # in user space
include(conan.cmake)
# Make sure to use conanfile.py to define dependencies, to stay consistent
conan_cmake_run(CONANFILE conanfile.py
BASIC_SETUP)
endif()
Please check the source code for other options and arguments.
There are some tests, you can run in python, with nosetests, for example:
$ nosetests . --nocapture