mirror of
https://github.com/curl/curl.git
synced 2026-01-18 17:21:26 +01:00
Rework the way curl's custom Find modules advertise their properties.
Before this patch, Find modules returned detected dependency properties
(header dirs, libs, libdirs, C flags, etc.) via global variables. curl's
main `CMakeLists.txt` copied their values into global lists, which it
later applied to targets. This solution worked internally, but it was
unsuited for the public, distributed `CURLConfig.cmake` and publishing
curl's Find modules with it, due to polluting the namespace of consumer
projects. It's also impractical to apply the many individual variables
to every targets depending on libcurl.
To allow using Find modules in consumer projects, this patch makes them
define as imported interface targets, named `CURL::<dependency>`. Then
store dependency information as target properties. It avoids namespace
pollution and makes the dependency information apply automatically
to all targets using `CURL::libcurl_static`.
Find modules continue to return `*_FOUND` and `*_VERSION` variables.
For dependencies detected via `pkg-config`, CMake 3.16+ is recommended.
Older CMake versions have a varying degree of support for
propagating/handling library directories. This may cause issues in envs
where dependencies reside in non-system locations and detected via
`pkg-config` (e.g. macOS + Homebrew). Use `CURL_USE_PKGCONFIG=OFF`
to fix these issues. Or upgrade to newer CMake, or link libcurl
dynamically.
Also:
- re-enable `pkg-config` for old cmake `find_library()` integration
tests.
- make `curlinfo` build after these changes.
- distribute local Find modules.
- export the raw list of lib dependencies via `CURL_LIBRARIES_PRIVATE`.
- `CURLconfig.cmake`: use curl's Find modules to detect dependencies in
the consumer env.
- add custom property to target property debug function.
- the curl build process no longer modifies `CMAKE_C_FLAGS`.
Follow-up to e86542038d #17047
Ref: #14930
Ref: https://github.com/libssh2/libssh2/pull/1535
Ref: https://github.com/libssh2/libssh2/pull/1571
Ref: https://github.com/libssh2/libssh2/pull/1581
Ref: https://github.com/libssh2/libssh2/pull/1623
Closes #16973
83 lines
3.1 KiB
CMake
83 lines
3.1 KiB
CMake
#***************************************************************************
|
|
# _ _ ____ _
|
|
# Project ___| | | | _ \| |
|
|
# / __| | | | |_) | |
|
|
# | (__| |_| | _ <| |___
|
|
# \___|\___/|_| \_\_____|
|
|
#
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
#
|
|
# This software is licensed as described in the file COPYING, which
|
|
# you should have received as part of this distribution. The terms
|
|
# are also available at https://curl.se/docs/copyright.html.
|
|
#
|
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
# copies of the Software, and permit persons to whom the Software is
|
|
# furnished to do so, under the terms of the COPYING file.
|
|
#
|
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
# KIND, either express or implied.
|
|
#
|
|
# SPDX-License-Identifier: curl
|
|
#
|
|
###########################################################################
|
|
# File containing various utilities
|
|
|
|
# Return number of arguments that evaluate to true
|
|
function(curl_count_true _output_count_var)
|
|
set(_list_len 0)
|
|
foreach(_option_var IN LISTS ARGN)
|
|
if(${_option_var})
|
|
math(EXPR _list_len "${_list_len} + 1")
|
|
endif()
|
|
endforeach()
|
|
set(${_output_count_var} ${_list_len} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Dump all defined variables with their values
|
|
function(curl_dumpvars)
|
|
message("::group::CMake Variable Dump")
|
|
get_cmake_property(_vars VARIABLES)
|
|
foreach(_var IN ITEMS ${_vars})
|
|
get_property(_var_type CACHE ${_var} PROPERTY TYPE)
|
|
get_property(_var_advanced CACHE ${_var} PROPERTY ADVANCED)
|
|
if(_var_type)
|
|
set(_var_type ":${_var_type}")
|
|
endif()
|
|
if(_var_advanced)
|
|
set(_var_advanced " [adv]")
|
|
endif()
|
|
message("${_var}${_var_type}${_var_advanced} = '${${_var}}'")
|
|
endforeach()
|
|
message("::endgroup::")
|
|
endfunction()
|
|
|
|
# Dump all target properties
|
|
function(curl_dumptargetprops _target)
|
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19 AND TARGET "${_target}")
|
|
execute_process(COMMAND "${CMAKE_COMMAND}" "--help-property-list" OUTPUT_VARIABLE _cmake_property_list)
|
|
string(REPLACE "\n" ";" _cmake_property_list "${_cmake_property_list}")
|
|
list(REMOVE_DUPLICATES _cmake_property_list)
|
|
list(REMOVE_ITEM _cmake_property_list "")
|
|
list(APPEND _cmake_property_list "INTERFACE_LIBCURL_PC_MODULES")
|
|
foreach(_prop IN LISTS _cmake_property_list)
|
|
if(_prop MATCHES "<CONFIG>")
|
|
foreach(_config IN ITEMS "DEBUG" "RELEASE" "MINSIZEREL" "RELWITHDEBINFO")
|
|
string(REPLACE "<CONFIG>" "${_config}" _propconfig "${_prop}")
|
|
get_property(_is_set TARGET "${_target}" PROPERTY "${_propconfig}" SET)
|
|
if(_is_set)
|
|
get_target_property(_val "${_target}" "${_propconfig}")
|
|
message("${_target}.${_propconfig} = '${_val}'")
|
|
endif()
|
|
endforeach()
|
|
else()
|
|
get_property(_is_set TARGET "${_target}" PROPERTY "${_prop}" SET)
|
|
if(_is_set)
|
|
get_target_property(_val "${_target}" "${_prop}")
|
|
message("${_target}.${_prop} = '${_val}'")
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
endfunction()
|