From: Viktor Szakats Date: Fri, 23 Aug 2024 15:42:08 +0000 (+0200) Subject: cmake: `Libs.private` improvements X-Git-Tag: curl-8_10_0~113 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c96551cea9614e07e81244ed6c028709d3b075d4;p=thirdparty%2Fcurl.git cmake: `Libs.private` improvements - skip adding pkg-config libdirs if they are system locations. - replace custom regexes with `get_filename_component()`. - collect `-L` and `-framework` separately. It means these will appear before libs in the `Libs.private` entry, syncing it with `./configure`. - collect in a list variable (was: string). - use `list(REMOVE_DUPLICATES)` to deduplicate libdirs. - rename internal variable that is now solely used for system libdirs. Follow-up to 7c0b6eb3bd1680e43e0688677c41b11a39b41962 #14652 Closes #14668 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 407395963c..0bde116665 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1951,14 +1951,11 @@ if(NOT CURL_DISABLE_INSTALL) # "a" (Linux) or "lib" (Windows) string(REPLACE "." "" libext "${CMAKE_STATIC_LIBRARY_SUFFIX}") + set(_ldflags "") set(LIBCURL_PC_LIBS_PRIVATE "") - # For processing full path libraries into -L and -l ld options, - # the directories that go with the -L option are cached, so they - # only get added once per such directory. - unset(_libcurl_libs_dirs) - # To avoid getting unnecessary -L options for known system directories, - # _libcurl_libs_dirs is seeded with them. + # Avoid getting unnecessary -L options for known system directories. + unset(_sys_libdirs) foreach(_libdir IN LISTS CMAKE_SYSTEM_PREFIX_PATH) if(_libdir MATCHES "/$") set(_libdir "${_libdir}lib") @@ -1966,18 +1963,21 @@ if(NOT CURL_DISABLE_INSTALL) set(_libdir "${_libdir}/lib") endif() if(IS_DIRECTORY "${_libdir}") - list(APPEND _libcurl_libs_dirs "${_libdir}") + list(APPEND _sys_libdirs "${_libdir}") endif() if(DEFINED CMAKE_LIBRARY_ARCHITECTURE) set(_libdir "${_libdir}/${CMAKE_LIBRARY_ARCHITECTURE}") if(IS_DIRECTORY "${_libdir}") - list(APPEND _libcurl_libs_dirs "${_libdir}") + list(APPEND _sys_libdirs "${_libdir}") endif() endif() endforeach() - foreach(_lib IN LISTS CURL_LIBDIRS) - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} -L${_lib}") + foreach(_libdir IN LISTS CURL_LIBDIRS) + list(FIND _sys_libdirs "${_libdir}" _libdir_index) + if(_libdir_index LESS 0) + list(APPEND _ldflags "-L${_libdir}") + endif() endforeach() foreach(_lib IN LISTS CMAKE_C_IMPLICIT_LINK_LIBRARIES CURL_LIBS) @@ -1995,32 +1995,40 @@ if(NOT CURL_DISABLE_INSTALL) continue() endif() endif() - if(_lib MATCHES "^-") - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} ${_lib}") + if(_lib MATCHES "^-") # '-framework ' + list(APPEND _ldflags "${_lib}") elseif(_lib MATCHES ".*/.*") # This gets a bit more complex, because we want to specify the # directory separately, and only once per directory - string(REGEX REPLACE "^(.*)/[^/]*$" "\\1" _libdir "${_lib}") - string(REGEX REPLACE "^.*/([^/.]*).*$" "\\1" _libname "${_lib}") + get_filename_component(_libdir ${_lib} DIRECTORY) + get_filename_component(_libname ${_lib} NAME_WE) if(_libname MATCHES "^lib") - list(FIND _libcurl_libs_dirs "${_libdir}" _libdir_index) + list(FIND _sys_libdirs "${_libdir}" _libdir_index) if(_libdir_index LESS 0) - list(APPEND _libcurl_libs_dirs "${_libdir}") - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} -L${_libdir}") + list(APPEND _ldflags "-L${_libdir}") endif() string(REGEX REPLACE "^lib" "" _libname "${_libname}") - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} -l${_libname}") + list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_libname}") else() - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} ${_lib}") + list(APPEND LIBCURL_PC_LIBS_PRIVATE "${_lib}") endif() else() - set(LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE} -l${_lib}") + list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_lib}") endif() endforeach() if(LIBCURL_PC_REQUIRES_PRIVATE) string(REPLACE ";" "," LIBCURL_PC_REQUIRES_PRIVATE "${LIBCURL_PC_REQUIRES_PRIVATE}") endif() + if(LIBCURL_PC_LIBS_PRIVATE) + string(REPLACE ";" " " LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE}") + endif() + if(_ldflags) + list(REMOVE_DUPLICATES _ldflags) + string(REPLACE ";" " " _ldflags "${_ldflags}") + set(LIBCURL_PC_LIBS_PRIVATE "${_ldflags} ${LIBCURL_PC_LIBS_PRIVATE}") + string(STRIP "${LIBCURL_PC_LIBS_PRIVATE}" LIBCURL_PC_LIBS_PRIVATE) + endif() set(LIBCURL_PC_CFLAGS_PRIVATE "-DCURL_STATICLIB") # Merge pkg-config private fields into public ones when static-only