]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
cmake: `Libs.private` improvements
authorViktor Szakats <commit@vsz.me>
Fri, 23 Aug 2024 15:42:08 +0000 (17:42 +0200)
committerViktor Szakats <commit@vsz.me>
Mon, 26 Aug 2024 14:31:47 +0000 (16:31 +0200)
- 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

CMakeLists.txt

index 407395963cf330b6167f4610e07f4d011ca7521f..0bde116665a12737d459481a9dd24aa37bb7c802 100644 (file)
@@ -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