mirror of
https://github.com/curl/curl.git
synced 2026-08-26 06:43:31 +03:00
cmake: add support for versioned symbols option
Implement the `--enable-versioned-symbols` feature available in
`./configure` for CMake.
Enable with `-DCURL_LIBCURL_VERSIONED_SYMBOLS=ON`. Customize the version
prefix with `-DCURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX=MYPREFIX_`. By
default the prefix matches what autotools uses.
When enabled, the feature is detected and a warning shown if
unavailable. (E.g. on Apple and Windows, it isn't.)
Included `HIDDEN {};` to match autotools, though I don't know if it's
necessary, useful or making any difference.
Differences from the autotools implementation:
- soversion is dynamic instead of hard-coded.
- omits referencing non-curl symbols.
- allows prefix/flavour override.
- more universal feature detection.
- doesn't rely on the in-repo `lib/libcurl.vers.in` file.
Also:
- add mbedTLS and BearSSL versioned symbol prefix support to autotools.
- enable this option in an old-linux job.
Follow-up to 7cc2e8b349
Fixes #14349
Closes #14378
This commit is contained in:
parent
573aaec3be
commit
7b14449790
3 changed files with 51 additions and 3 deletions
|
|
@ -212,18 +212,59 @@ if(BUILD_SHARED_LIBS)
|
|||
endif()
|
||||
|
||||
option(CURL_LIBCURL_SOVERSION "Enable libcurl SOVERSION" ${_soversion_default})
|
||||
option(CURL_LIBCURL_VERSIONED_SYMBOLS "Enable libcurl versioned symbols" OFF)
|
||||
|
||||
if(CURL_LIBCURL_SOVERSION)
|
||||
if(CURL_LIBCURL_SOVERSION OR CURL_LIBCURL_VERSIONED_SYMBOLS)
|
||||
# Get 'VERSIONCHANGE', 'VERSIONADD', 'VERSIONDEL', 'VERSIONINFO' variables
|
||||
transform_makefile_inc("Makefile.soname" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.soname.cmake")
|
||||
include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.soname.cmake)
|
||||
|
||||
math(EXPR _cmakesoname "${VERSIONCHANGE} - ${VERSIONDEL}")
|
||||
set(_cmakeversion "${_cmakesoname}.${VERSIONDEL}.${VERSIONADD}")
|
||||
endif()
|
||||
|
||||
if(CURL_LIBCURL_SOVERSION)
|
||||
set_target_properties(${LIB_SHARED} PROPERTIES
|
||||
VERSION "${_cmakeversion}" SOVERSION "${_cmakesoname}")
|
||||
endif()
|
||||
|
||||
## Versioned symbols
|
||||
|
||||
if(CURL_LIBCURL_VERSIONED_SYMBOLS)
|
||||
if(NOT DEFINED CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX)
|
||||
# Default to prefixes used by autotools
|
||||
if(CURL_WITH_MULTI_SSL)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "MULTISSL_")
|
||||
elseif(CURL_USE_OPENSSL)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "OPENSSL_")
|
||||
elseif(CURL_USE_MBEDTLS)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "MBEDTLS_")
|
||||
elseif(CURL_USE_BEARSSL)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "BEARSSL_")
|
||||
elseif(CURL_USE_WOLFSSL)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "WOLFSSL_")
|
||||
elseif(CURL_USE_GNUTLS)
|
||||
set(CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX "GNUTLS_")
|
||||
endif()
|
||||
endif()
|
||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libcurl.vers" "
|
||||
HIDDEN {};
|
||||
CURL_${CURL_LIBCURL_VERSIONED_SYMBOLS_PREFIX}${_cmakesoname}
|
||||
{
|
||||
global: curl_*;
|
||||
local: *;
|
||||
};")
|
||||
include(CheckCSourceCompiles)
|
||||
set(CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/libcurl.vers")
|
||||
check_c_source_compiles("int main(void) { return 0; }" HAVE_VERSIONED_SYMBOLS)
|
||||
if(HAVE_VERSIONED_SYMBOLS)
|
||||
# Superseded by LINK_OPTIONS in CMake 3.13 and later.
|
||||
set_target_properties(${LIB_SHARED} PROPERTIES LINK_FLAGS "${CMAKE_REQUIRED_LINK_OPTIONS}")
|
||||
else()
|
||||
message(WARNING "Versioned symbols requested, but not supported by the toolchain.")
|
||||
endif()
|
||||
unset(CMAKE_REQUIRED_LINK_OPTIONS)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_library(${LIB_NAME} ALIAS ${LIB_SELECTED})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue