From 3c597ced16e1f3aa7bfe08609add0feaf5c8d90d Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sun, 17 May 2026 14:04:49 +0200 Subject: [PATCH] cmake: fix three issues generating lib options in config files - drop duplicate libs lists next to each other in `libcurl.pc`. Logic copied from libssh2. Fixing (seen in a local build): ```diff -Libs.private: -lssh2 -lz -lz -lldap -llber -lssl -lcrypto -lcrypto -lz -lbrotlidec -lbrotlicommon -lzstd -lnghttp2 -licucore -liconv -lpsl -lbacktrace +Libs.private: -lssh2 -lz -lldap -llber -lssl -lcrypto -lz -lbrotlidec -lbrotlicommon -lzstd -lnghttp2 -licucore -liconv -lpsl -lbacktrace ``` Refs: https://github.com/libssh2/libssh2/commit/e1da7b2cb89063fc253bf94570c1ccfb3f1c2e81 https://github.com/libssh2/libssh2/pull/1621 https://github.com/libssh2/libssh2/commit/6464301820a9ca4a56c5f02717430bbd4150c7b2 https://github.com/libssh2/libssh2/pull/1131 - handle `$` references. Fixing (seen in a local build using libssh2 v1.11.2-DEV): ```diff -Libs.private: -lssh2 -l$ -lz -lldap -llber [...] +Libs.private: -lssh2 -lcrypto -lz -lldap -llber [...] ``` - fix `-l-pthread` sneaking into `libcurl.pc`. Fixing (seen with Android): ```diff -Libs.private: -lz -l-pthread +Libs.private: -pthread -lz ``` Refs: https://github.com/microsoft/vcpkg/blob/2b65c20fc66eda893aa15a15a453c3cf09500b19/ports/curl/dependencies.patch#L631-L634 https://github.com/microsoft/vcpkg/commit/70b941a5d2443e79eeab62507acb41bd22201277#diff-7f2c3b2f93cd3478671a603cbd5ef818c7c403a11dc25e1d3539e9b03495a5d3 Upstream-patch-by: Kai Pastor Closes #21654 --- CMake/Macros.cmake | 4 ++++ CMakeLists.txt | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CMake/Macros.cmake b/CMake/Macros.cmake index 5e26c38469..f0968736b0 100644 --- a/CMake/Macros.cmake +++ b/CMake/Macros.cmake @@ -267,6 +267,10 @@ macro(curl_collect_target_link_options _target) get_target_property(_val ${_target} INTERFACE_LINK_LIBRARIES) if(_val) foreach(_lib IN LISTS _val) + # E.g. via libssh2: "$" + if(_lib MATCHES "LINK_ONLY:") + string(REGEX MATCH "([A-Za-z0-9_-]+::[A-Za-z0-9_-]+)" _lib "${_lib}") # Extract imported target name + endif() if(TARGET "${_lib}") curl_collect_target_link_options(${_lib}) else() diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c4c137add..331c22dc4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2211,6 +2211,9 @@ if(NOT CURL_DISABLE_INSTALL) list(APPEND LIBCURL_PC_LIBS_PRIVATE "${_lib}") list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}") endif() + elseif(_lib MATCHES "^-") # '-option' + list(APPEND _ldflags "${_lib}") + list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}") else() list(APPEND LIBCURL_PC_LIBS_PRIVATE "-l${_lib}") list(APPEND LIBCURL_PC_LIBS_PRIVATE_LIST "${_lib}") @@ -2241,6 +2244,17 @@ if(NOT CURL_DISABLE_INSTALL) string(REPLACE ";" "," LIBCURL_PC_REQUIRES_PRIVATE "${LIBCURL_PC_REQUIRES_PRIVATE}") endif() if(LIBCURL_PC_LIBS_PRIVATE) + # Remove duplicates listed next to each other + set(_libs "") + set(_prev "") + foreach(_lib IN LISTS LIBCURL_PC_LIBS_PRIVATE) + if(NOT _prev STREQUAL _lib) + list(APPEND _libs "${_lib}") + set(_prev "${_lib}") + endif() + endforeach() + set(LIBCURL_PC_LIBS_PRIVATE "${_libs}") + string(REPLACE ";" " " LIBCURL_PC_LIBS_PRIVATE "${LIBCURL_PC_LIBS_PRIVATE}") endif() if(_ldflags)