diff options
author | Patrick Steinhardt <ps@pks.im> | 2018-04-27 10:38:49 +0100 |
---|---|---|
committer | Patrick Steinhardt <ps@pks.im> | 2018-05-09 13:50:42 +0200 |
commit | 0f62e4c7393366acd8ab0887c069d9929c358d07 (patch) | |
tree | 3d39a197b259bc27cbc48856cd9cf4022f74d6ac /cmake | |
parent | 86353a7260404e501153fe1781fbd194a5925f1a (diff) | |
download | libgit2-0f62e4c7393366acd8ab0887c069d9929c358d07.tar.gz |
cmake: resolve libraries found by pkg-config
Libraries found by CMake modules are usually handled with their full
path. This makes linking against those libraries a lot more robust when
it comes to libraries in non-standard locations, as otherwise we might
mix up libraries from different locations when link directories are
given.
One excemption are libraries found by PKG_CHECK_MODULES. Instead of
returning libraries with their complete path, it will return the
variable names as well as a set of link directories. In case where
multiple sets of the same library are installed in different locations,
this can lead the compiler to link against the wrong libraries in the
end, when link directories of other dependencies are added.
To fix this shortcoming, we need to manually resolve library paths
returned by CMake against their respective library directories. This is
an easy task to do with `FIND_LIBRARY`.
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/Modules/FindPkgLibraries.cmake | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/cmake/Modules/FindPkgLibraries.cmake b/cmake/Modules/FindPkgLibraries.cmake new file mode 100644 index 000000000..49311c382 --- /dev/null +++ b/cmake/Modules/FindPkgLibraries.cmake @@ -0,0 +1,28 @@ +INCLUDE(FindPkgConfig) + +# This function will find and set up a pkg-config based module. +# If a pc-file was found, it will resolve library paths to +# absolute paths. Furthermore, the function will automatically +# fall back to use static libraries in case no dynamic libraries +# were found. +FUNCTION(FIND_PKGLIBRARIES prefix package) + PKG_CHECK_MODULES(${prefix} ${package}) + IF(NOT ${prefix}_FOUND) + RETURN() + ENDIF() + + FOREACH(LIBRARY ${${prefix}_LIBRARIES}) + FIND_LIBRARY(${LIBRARY}_RESOLVED ${LIBRARY} PATHS ${${prefix}_LIBRARY_DIRS}) + IF(${${LIBRARY}_RESOLVED} STREQUAL "${LIBRARY}_RESOLVED-NOTFOUND") + MESSAGE(FATAL_ERROR "could not resolve ${LIBRARY}") + ENDIF() + LIST(APPEND RESOLVED_LIBRARIES ${${LIBRARY}_RESOLVED}) + ENDFOREACH(LIBRARY) + + SET(${prefix}_FOUND 1 PARENT_SCOPE) + SET(${prefix}_LIBRARIES ${RESOLVED_LIBRARIES} PARENT_SCOPE) + SET(${prefix}_INCLUDE_DIRS ${${prefix}_INCLUDE_DIRS} PARENT_SCOPE) + SET(${prefix}_LDFLAGS ${${prefix}_LDFLAGS} PARENT_SCOPE) + + MESSAGE(STATUS " Resolved libraries: ${RESOLVED_LIBRARIES}") +ENDFUNCTION() |