From 9b9ed6ad600bd3b268bd355a0a741ba5640b266c Mon Sep 17 00:00:00 2001 From: Eugene Shalygin Date: Sun, 11 Nov 2018 21:23:19 +0100 Subject: [PATCH] cmake: strip directories and library prefixes for pkg-config Replace full library names with -L commands and -llib-name pairs. This way it resembles what autotools produce and additionally -l can not be used with GNU linker and full paths (as it prepends "lib" to such arguments). --- cmake/Modules/GeneratePkgConfig.cmake | 3 -- .../generate-pkg-config.cmake.in | 32 ++++++++++++++++++- .../target-compile-settings.cmake.in | 1 + 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/GeneratePkgConfig.cmake b/cmake/Modules/GeneratePkgConfig.cmake index 2bb76a0ef..f7250e12b 100644 --- a/cmake/Modules/GeneratePkgConfig.cmake +++ b/cmake/Modules/GeneratePkgConfig.cmake @@ -147,9 +147,6 @@ function(generate_and_install_pkg_config_file _target) set(_output_name "${_target}") endif() - # TODO make it robust - set(_output_name "lib${_output_name}") - # remove standard include directories foreach(d IN LISTS CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES) list(REMOVE_ITEM _interface_include_dirs "${d}") diff --git a/cmake/Modules/GeneratePkgConfig/generate-pkg-config.cmake.in b/cmake/Modules/GeneratePkgConfig/generate-pkg-config.cmake.in index 807876f10..2bd230d12 100644 --- a/cmake/Modules/GeneratePkgConfig/generate-pkg-config.cmake.in +++ b/cmake/Modules/GeneratePkgConfig/generate-pkg-config.cmake.in @@ -12,7 +12,37 @@ function (cmake_list_to_pkg_config _result _list _prefix) set(${_result} "${_tmp_list}" PARENT_SCOPE) endfunction() -cmake_list_to_pkg_config(_interface_link_libraries "${_TARGET_INTERFACE_LINK_LIBRARIES}" "-l") +# Helper function for splitting full library paths into [dir, name] and merging repetitive dir entries +function(split_library_dirs _libraries _base_library_dir _library_dirs_var _library_names_var) + set(libdirs "${_base_library_dir}") + set(libs "") + foreach (l IN LISTS _libraries) + get_filename_component(lDir "${l}" DIRECTORY) + if (lDir) + get_filename_component(lDir "${lDir}" REALPATH) + endif() + get_filename_component(lFile "${l}" NAME_WE) + string(REGEX REPLACE "${_SHARED_LIBRARY_PREFIX}" "" lFile "${lFile}") + list(APPEND libdirs "${lDir}") + list(APPEND libs "${lFile}") + endforeach() + list(REMOVE_DUPLICATES libdirs) + list(REMOVE_AT libdirs 0) # as it is the base libdir and will be handled separately + + set(${_library_dirs_var} "${libdirs}" PARENT_SCOPE) + set(${_library_names_var} "${libs}" PARENT_SCOPE) +endfunction() + +split_library_dirs("${_TARGET_INTERFACE_LINK_LIBRARIES}" "${CMAKE_INSTALL_PREFIX}/${_INSTALL_LIBDIR}" _lib_dirs _library_names) +cmake_list_to_pkg_config(_libs "${_library_names}" "-l") +list(LENGTH _lib_dirs _additional_libdirs_count) +if (_additional_libdirs_count GREATER 0) + cmake_list_to_pkg_config(_additional_libdirs "${_lib_dirs}" "-L") + set(_interface_link_libraries "${_additional_libdirs} ${_libs}") +else() + set(_interface_link_libraries "${_libs}") +endif() + cmake_list_to_pkg_config(_interface_definitions "${_TARGET_INTERFACE_DEFINITIONS}" "-D") cmake_list_to_pkg_config(_interface_include_dirs "${_TARGET_INTERFACE_INCLUDE_DIRS}" "-I") set(_interface_compile_options "${_TARGET_INTERFACE_COMPILE_OPTIONS}") diff --git a/cmake/Modules/GeneratePkgConfig/target-compile-settings.cmake.in b/cmake/Modules/GeneratePkgConfig/target-compile-settings.cmake.in index e5090e3b8..e16d7bcb0 100644 --- a/cmake/Modules/GeneratePkgConfig/target-compile-settings.cmake.in +++ b/cmake/Modules/GeneratePkgConfig/target-compile-settings.cmake.in @@ -6,6 +6,7 @@ set(_TARGET_OUTPUT_NAME "@_output_name@") set(_INSTALL_LIBDIR "@CMAKE_INSTALL_LIBDIR@") set(_INSTALL_INCLUDEDIR "@CMAKE_INSTALL_INCLUDEDIR@") +set(_SHARED_LIBRARY_PREFIX "@CMAKE_SHARED_LIBRARY_PREFIX@") set(_PROJECT_NAME "@PROJECT_NAME@") set(_PROJECT_DESCRIPTION "@PROJECT_DESCRIPTION@")