From 9dfdc6ff42ba045ec48056bb6d2072f2fcac2e9d Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 10 Aug 2024 09:33:18 +0200 Subject: [PATCH] cmake: allow `pkg-config` in more envs Before this patch, `pkg-config` was used for `UNIX` builds only (with a few exceptions like wolfSSL, libssh, gsasl, libuv). This patch extends `pkg-config` use to all envs except: `MSVC` without vcpkg. Meaning MSVC with vcpkg will now use it. Also mingw on Windows. Also apply the new condition to options where `pkg-config` was used unconditionally (= for all targets). These are: `-DCURL_USE_WOLFSSL=ON`, `-DCURL_USE_LIBSSH=ON`, `-DCURL_USE_GSASL=ON` and `-DCURL_USE_LIBUV=ON` This patch may still cause regressions for cross-builds (e.g. mingw cross-build from Unix) and potentially other cases. If that happens, we recommend using some of these methods to explicitly disable `pkg-config` when using CMake: - CMake option: `-DPKG_CONFIG_EXECUTABLE=` (or `-DPKG_CONFIG_EXECUTABLE=nonexistent` or similar) This is similar to the (curl-specific) `PKG_CONFIG` env for autotools. - export env: `PKG_CONFIG_LIBDIR=` (or `PKG_CONFIG_PATH`, `PKG_CONFIG_SYSROOT_DIR`, or the CMake-specific `PKG_CONFIG`) We may improve control over this in a future patch, also allowing opting in MSVC (without vcpkg). Ref: #14405 Ref: #14408 Ref: #14140 Closes #14483 --- CMake/FindGSS.cmake | 5 +++-- CMake/FindMSH3.cmake | 2 +- CMake/FindNGHTTP2.cmake | 2 +- CMake/FindNGHTTP3.cmake | 2 +- CMake/FindNGTCP2.cmake | 4 ++-- CMake/FindNettle.cmake | 2 +- CMake/FindQUICHE.cmake | 2 +- CMake/FindWolfSSL.cmake | 6 ++++-- CMake/FindZstd.cmake | 2 +- CMakeLists.txt | 24 ++++++++++++++++-------- 10 files changed, 31 insertions(+), 20 deletions(-) diff --git a/CMake/FindGSS.cmake b/CMake/FindGSS.cmake index 35687ab9d2..07e4fd0444 100644 --- a/CMake/FindGSS.cmake +++ b/CMake/FindGSS.cmake @@ -53,11 +53,12 @@ set(_gss_root_hints # Try to find library using system pkg-config if user did not specify root dir if(NOT GSS_ROOT_DIR AND NOT "$ENV{GSS_ROOT_DIR}") - if(UNIX) + if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(_GSS ${_mit_modname} ${_heimdal_modname}) list(APPEND _gss_root_hints "${_GSS_PREFIX}") - elseif(WIN32) + endif() + if(WIN32) list(APPEND _gss_root_hints "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MIT\\Kerberos;InstallDir]") endif() endif() diff --git a/CMake/FindMSH3.cmake b/CMake/FindMSH3.cmake index 146887d07f..59e8c31dbb 100644 --- a/CMake/FindMSH3.cmake +++ b/CMake/FindMSH3.cmake @@ -29,7 +29,7 @@ # MSH3_INCLUDE_DIRS The msh3 include directories # MSH3_LIBRARIES The libraries needed to use msh3 -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_MSH3 "libmsh3") endif() diff --git a/CMake/FindNGHTTP2.cmake b/CMake/FindNGHTTP2.cmake index a15785348f..deb81bdadb 100644 --- a/CMake/FindNGHTTP2.cmake +++ b/CMake/FindNGHTTP2.cmake @@ -30,7 +30,7 @@ # NGHTTP2_LIBRARIES The libraries needed to use nghttp2 # NGHTTP2_VERSION Version of nghttp2 -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_NGHTTP2 "libnghttp2") endif() diff --git a/CMake/FindNGHTTP3.cmake b/CMake/FindNGHTTP3.cmake index ea25eb63a1..cf210e1795 100644 --- a/CMake/FindNGHTTP3.cmake +++ b/CMake/FindNGHTTP3.cmake @@ -30,7 +30,7 @@ # NGHTTP3_LIBRARIES The libraries needed to use nghttp3 # NGHTTP3_VERSION Version of nghttp3 -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_NGHTTP3 "libnghttp3") endif() diff --git a/CMake/FindNGTCP2.cmake b/CMake/FindNGTCP2.cmake index 1d4fb38c1d..3ebf3b91b4 100644 --- a/CMake/FindNGTCP2.cmake +++ b/CMake/FindNGTCP2.cmake @@ -38,7 +38,7 @@ # NGTCP2_LIBRARIES The libraries needed to use ngtcp2 # NGTCP2_VERSION Version of ngtcp2 -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_NGTCP2 "libngtcp2") endif() @@ -72,7 +72,7 @@ if(NGTCP2_FIND_COMPONENTS) if(NGTCP2_CRYPTO_BACKEND) string(TOLOWER "ngtcp2_crypto_${NGTCP2_CRYPTO_BACKEND}" _crypto_library) - if(UNIX) + if(NOT MSVC OR VCPKG_TOOLCHAIN) pkg_search_module(PC_${_crypto_library} "lib${_crypto_library}") endif() find_library(${_crypto_library}_LIBRARY diff --git a/CMake/FindNettle.cmake b/CMake/FindNettle.cmake index 8dcdecfe9f..02ae13f331 100644 --- a/CMake/FindNettle.cmake +++ b/CMake/FindNettle.cmake @@ -30,7 +30,7 @@ # NETTLE_LIBRARIES The nettle library names # NETTLE_VERSION Version of nettle -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(NETTLE "nettle") endif() diff --git a/CMake/FindQUICHE.cmake b/CMake/FindQUICHE.cmake index 59d3136f2c..bcd54e942d 100644 --- a/CMake/FindQUICHE.cmake +++ b/CMake/FindQUICHE.cmake @@ -29,7 +29,7 @@ # QUICHE_INCLUDE_DIRS The quiche include directories # QUICHE_LIBRARIES The libraries needed to use quiche -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_QUICHE "quiche") endif() diff --git a/CMake/FindWolfSSL.cmake b/CMake/FindWolfSSL.cmake index dd87c9ec60..1e9437ffba 100644 --- a/CMake/FindWolfSSL.cmake +++ b/CMake/FindWolfSSL.cmake @@ -30,8 +30,10 @@ # WolfSSL_LIBRARIES The wolfssl library names # WolfSSL_VERSION Version of wolfssl -find_package(PkgConfig QUIET) -pkg_search_module(PC_WOLFSSL QUIET "wolfssl") +if(NOT MSVC OR VCPKG_TOOLCHAIN) + find_package(PkgConfig QUIET) + pkg_search_module(PC_WOLFSSL QUIET "wolfssl") +endif() find_path(WolfSSL_INCLUDE_DIR NAMES "wolfssl/ssl.h" diff --git a/CMake/FindZstd.cmake b/CMake/FindZstd.cmake index 836396b862..6574d0896c 100644 --- a/CMake/FindZstd.cmake +++ b/CMake/FindZstd.cmake @@ -30,7 +30,7 @@ # Zstd_LIBRARIES The libraries needed to use zstd # Zstd_VERSION Version of zstd -if(UNIX) +if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(PC_Zstd "libzstd") endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index dbeb1c30db..bccd01e9fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -959,7 +959,7 @@ if(USE_LIBIDN2) check_include_file_concat("idn2.h" HAVE_IDN2_H) endif() if(NOT HAVE_LIBIDN2 OR NOT HAVE_IDN2_H) - if(UNIX) + if(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(LIBIDN2 "libidn2") endif() @@ -1038,7 +1038,7 @@ if(NOT USE_LIBSSH2 AND CURL_USE_LIBSSH) find_package(libssh CONFIG QUIET) if(libssh_FOUND) message(STATUS "Found libssh ${libssh_VERSION}") - else() + elseif(NOT MSVC OR VCPKG_TOOLCHAIN) find_package(PkgConfig QUIET) pkg_search_module(LIBSSH "libssh") if(LIBSSH_FOUND) @@ -1058,10 +1058,16 @@ endif() option(CURL_USE_GSASL "Use GSASL implementation" OFF) mark_as_advanced(CURL_USE_GSASL) if(CURL_USE_GSASL) - find_package(PkgConfig REQUIRED) - pkg_search_module(GSASL REQUIRED "libgsasl") - list(APPEND CURL_LIBS ${GSASL_LINK_LIBRARIES}) - set(USE_GSASL ON) + if(NOT MSVC OR VCPKG_TOOLCHAIN) + find_package(PkgConfig REQUIRED) + pkg_search_module(GSASL REQUIRED "libgsasl") + else() + message(WARNING "GSASL has been requested but requires a platform with pkg-config support. Skipping.") + endif() + if(GSASL_FOUND) + list(APPEND CURL_LIBS ${GSASL_LINK_LIBRARIES}) + set(USE_GSASL ON) + endif() endif() option(CURL_USE_GSSAPI "Use GSSAPI implementation (right now only Heimdal is supported with CMake build)" OFF) @@ -1133,8 +1139,10 @@ if(CURL_USE_LIBUV) if(NOT ENABLE_DEBUG) message(FATAL_ERROR "Using libuv without debug support enabled is useless") endif() - find_package(PkgConfig QUIET) - pkg_check_modules(LIBUV "libuv") + if(NOT MSVC OR VCPKG_TOOLCHAIN) + find_package(PkgConfig QUIET) + pkg_check_modules(LIBUV "libuv") + endif() if(LIBUV_FOUND) list(APPEND CURL_LIBS ${LIBUV_LINK_LIBRARIES}) list(APPEND LIBCURL_PC_REQUIRES_PRIVATE "libuv") -- 2.47.3