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 7c0b6eb3bd #14652
Closes #14668
This commit is contained in:
parent
2c9331be46
commit
c96551cea9
@ -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 <name>'
|
||||
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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user