cmake - find_library - custom library location

c++, cmake, windows

Solution

I saw that two people put that question to their favorites so I will try to answer the solution which works for me: Instead of using find modules I'm writing configuration files for all libraries which are installed. Those files are extremly simple and can also be used to set non-standard variables. CMake will (at least on windows) search for those configuration files in

CMAKE_PREFIX_PATH/<<package_name>>-<<version>>/<<package_name>>-config.cmake

(which can be set through an environment variable). So for example the boost configuration is in the path

CMAKE_PREFIX_PATH/boost-1_50/boost-config.cmake

In that configuration you can set variables. My config file for boost looks like that:

set(boost_INCLUDE_DIRS ${boost_DIR}/include)
set(boost_LIBRARY_DIR ${boost_DIR}/lib)
foreach(component ${boost_FIND_COMPONENTS}) 
    set(boost_LIBRARIES ${boost_LIBRARIES} debug ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-gd-1_50.lib)
    set(boost_LIBRARIES ${boost_LIBRARIES} optimized ${boost_LIBRARY_DIR}/libboost_${component}-vc110-mt-1_50.lib)
endforeach()
add_definitions( -D_WIN32_WINNT=0x0501 )

Pretty straight forward + it's possible to shrink the size of the config files even more when you write some helper functions. The only issue I have with this setup is that I havn't found a way to give config files a priority over find modules - so you need to remove the find modules.

Hope this this is helpful for other people.

Problem

I'm currently trying to get CMake running for my project (on windows). I want to use a custom location where all libraries are installed. To inform CMake about that path I tried to do that: ``` set(CMAKE_PREFIX_PATH D:/develop/cmake/libs) ``` But when I try to find the library with ``` find_library(CURL_LIBRARY NAMES curl curllib libcurl_imp curllib_static) ``` CMake can't find it. When I set my prefix path to ``` set(CMAKE_PREFIX_PATH D:/develop/cmake/libs/curl) ``` ... the library is located. So my question is: How can I configure CMake properly to work with a directory structore at a custom location which looks like that: ``` D:/develop/cmake/libs/ -> libA -> include -> lib -> libB -> include -> lib -> ... -> include -> lib ``` In "include" lie the public headers and in "lib" are the compiled libraries. edit: The current workaround for me is, to do this before i search for libraries: ``` set(CUSTOM_LIBRARY_PATH D:/develop/cmake/libs) file(GLOB sub-dir ${CUSTOM_LIBRARY_PATH}/*) foreach(dir ${sub-dir}) if(IS_DIRECTORY ${dir}) set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${dir}) endif() endforeach() ``` But that way the default module for boost wont find it until it because the directory structore of boost is a bit different. ``` boost -> include -> boost-1_50 -> *.hpp ``` When I move the content if "boost-1_50" to "include" the library can be found but that way it's not possible to handle multiple versions right?

Original source