Find Packages
If a FindXXX.cmake file for the library you are packaging is already available, it should work automatically.
Variables CMAKE_INCLUDE_PATH and CMAKE_LIBRARY_PATH are set with the right requirements paths. CMake find_library function will be able to locate the libraries in the package’s folders.
So, you can use find_package normally:
project(MyHello)
cmake_minimum_required(VERSION 2.8.12)
include(conanbuildinfo.cmake)
conan_basic_setup()
find_package("ZLIB")
if(ZLIB_FOUND)
add_executable(enough enough.c)
include_directories(${ZLIB_INCLUDE_DIRS})
target_link_libraries(enough ${ZLIB_LIBRARIES})
else()
message(FATAL_ERROR "Zlib not found")
endif()
In addition to automatic find_package support, CMAKE_MODULE_PATH variable is set with your requirements root package paths. You can override the default behavior of any find_package() by creating a findXXX.cmake
file in your package.
Creating a custom FindXXX.cmake file
Sometimes the “official” CMake FindXXX.cmake scripts are not ready to find our libraries (not supported library names for specific settings, fixed installation directories like C:\OpenSSL… etc) Or maybe there is no “official” CMake script for our library.
So in these cases we can provide a custom FindXXX.cmake file in our conan packages.
1. Create a file named FindXXX.cmake and save it in your conan package root folder. Where XXX is the name of the library that we will use in the find_package CMake function.
For example, we create a FindZLIB.cmake
and use find_package(ZLIB)
.
We recommend to copy the original FindXXX.cmake file from Kitware (folder Modules/FindXXX.cmake), if available, and modify it to help finding our library files, but it depends a lot, maybe you are interested in creating a new one.
If it’s not provided you can create a basic one, take a look at this example with the ZLIB library:
FindZLIB.cmake
find_path(ZLIB_INCLUDE_DIR NAMES zlib.h PATHS ${CONAN_INCLUDE_DIRS_ZLIB})
find_library(ZLIB_LIBRARY NAMES ${CONAN_LIBS_ZLIB} PATHS ${CONAN_LIB_DIRS_ZLIB})
set(ZLIB_FOUND TRUE)
set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
mark_as_advanced(ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
In the first line we are finding the path where our headers should be found, we suggest the CONAN_INCLUDE_DIRS_XXX. Then the same for the library names with CONAN_LIBS_XXX and the paths where the libs are CONAN_LIB_DIRS_XXX.
In your conanfile.py file add the
FindXXX.cmake
to theexports_sources
field:
class HelloConan(ConanFile):
name = "Hello"
version = "0.1"
...
exports_sources = ["FindXXX.cmake"]
In the package method, copy the
FindXXX.cmake
file to the root:
class HelloConan(ConanFile):
name = "Hello"
version = "0.1"
...
exports_sources = ["FindXXX.cmake"]
def package(self):
...
self.copy("FindXXX.cmake", ".", ".")