201 lines
5.8 KiB
CMake
201 lines
5.8 KiB
CMake
# Findmbedtls.cmake
|
|
#
|
|
# Usage:
|
|
# find_package(mbedtls REQUIRED)
|
|
#
|
|
# Optional cache variables the parent project may set before calling:
|
|
# MBEDTLS_FETCHCONTENT_VERSION e.g. "v3.6.4" or "mbedtls-4.1.0"
|
|
# MBEDTLS_FETCHCONTENT_GIT_REPOSITORY
|
|
# MBEDTLS_FETCHCONTENT_GIT_TAG
|
|
# MBEDTLS_FETCHCONTENT_BASE_DIR
|
|
# MBEDTLS_BUILD_SHARED ON/OFF
|
|
#
|
|
# Provided variables:
|
|
# mbedtls_FOUND
|
|
# MBEDTLS_FOUND
|
|
# MBEDTLS_INCLUDE_DIRS
|
|
# MBEDTLS_LIBRARIES
|
|
#
|
|
# Provided imported targets:
|
|
# MbedTLS::mbedtls
|
|
# MbedTLS::mbedx509
|
|
# MbedTLS::mbedcrypto
|
|
|
|
include_guard(GLOBAL)
|
|
|
|
include(FetchContent)
|
|
include(FindPackageHandleStandardArgs)
|
|
|
|
set(_MBEDTLS_DEFAULT_REPOSITORY "https://github.com/Mbed-TLS/mbedtls.git")
|
|
set(_MBEDTLS_DEFAULT_TAG "v4.1.0")
|
|
|
|
set(MBEDTLS_FETCHCONTENT_GIT_REPOSITORY
|
|
"${_MBEDTLS_DEFAULT_REPOSITORY}"
|
|
CACHE STRING "Git repository for fetching Mbed TLS")
|
|
|
|
if(DEFINED MBEDTLS_FETCHCONTENT_VERSION AND NOT DEFINED MBEDTLS_FETCHCONTENT_GIT_TAG)
|
|
set(MBEDTLS_FETCHCONTENT_GIT_TAG
|
|
"${MBEDTLS_FETCHCONTENT_VERSION}"
|
|
CACHE STRING "Git tag/branch/commit for fetching Mbed TLS")
|
|
endif()
|
|
|
|
set(MBEDTLS_FETCHCONTENT_GIT_TAG
|
|
"${MBEDTLS_FETCHCONTENT_GIT_TAG}"
|
|
CACHE STRING "Git tag/branch/commit for fetching Mbed TLS")
|
|
|
|
if(NOT MBEDTLS_FETCHCONTENT_GIT_TAG)
|
|
set(MBEDTLS_FETCHCONTENT_GIT_TAG "${_MBEDTLS_DEFAULT_TAG}" CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
option(MBEDTLS_BUILD_SHARED "Build Mbed TLS shared libraries" OFF)
|
|
|
|
# 1) Prefer an installed package config if available.
|
|
find_package(MbedTLS CONFIG QUIET)
|
|
|
|
if(TARGET MbedTLS::mbedtls AND TARGET MbedTLS::mbedx509 AND TARGET MbedTLS::mbedcrypto)
|
|
set(mbedtls_FOUND TRUE)
|
|
set(MBEDTLS_FOUND TRUE)
|
|
set(MBEDTLS_LIBRARIES
|
|
MbedTLS::mbedtls
|
|
MbedTLS::mbedx509
|
|
MbedTLS::mbedcrypto)
|
|
set(MBEDTLS_INCLUDE_DIRS "")
|
|
return()
|
|
endif()
|
|
|
|
# 2) If upstream exported plain targets instead of namespaced ones, alias them.
|
|
if(TARGET mbedtls AND TARGET mbedx509 AND TARGET mbedcrypto)
|
|
if(NOT TARGET MbedTLS::mbedtls)
|
|
add_library(MbedTLS::mbedtls INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedtls INTERFACE mbedtls)
|
|
endif()
|
|
if(NOT TARGET MbedTLS::mbedx509)
|
|
add_library(MbedTLS::mbedx509 INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedx509 INTERFACE mbedx509)
|
|
endif()
|
|
if(NOT TARGET MbedTLS::mbedcrypto)
|
|
add_library(MbedTLS::mbedcrypto INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedcrypto INTERFACE mbedcrypto)
|
|
endif()
|
|
|
|
set(mbedtls_FOUND TRUE)
|
|
set(MBEDTLS_FOUND TRUE)
|
|
set(MBEDTLS_LIBRARIES
|
|
MbedTLS::mbedtls
|
|
MbedTLS::mbedx509
|
|
MbedTLS::mbedcrypto)
|
|
set(MBEDTLS_INCLUDE_DIRS "")
|
|
return()
|
|
endif()
|
|
|
|
# 3) Fetch and build Mbed TLS.
|
|
# Upstream options:
|
|
# - USE_STATIC_MBEDTLS_LIBRARY / USE_SHARED_MBEDTLS_LIBRARY
|
|
# - ENABLE_PROGRAMS / ENABLE_TESTING
|
|
# - MBEDTLS_AS_SUBPROJECT / DISABLE_PACKAGE_CONFIG_AND_INSTALL
|
|
# - MBEDTLS_TARGET_PREFIX
|
|
#
|
|
# These are supported by the upstream CMake build. :contentReference[oaicite:1]{index=1}
|
|
|
|
set(FETCHCONTENT_QUIET FALSE)
|
|
|
|
if(MBEDTLS_FETCHCONTENT_BASE_DIR)
|
|
set(FETCHCONTENT_BASE_DIR "${MBEDTLS_FETCHCONTENT_BASE_DIR}")
|
|
endif()
|
|
|
|
# Avoid polluting the parent build and skip extras we usually do not want.
|
|
set(ENABLE_PROGRAMS OFF CACHE BOOL "" FORCE)
|
|
set(ENABLE_TESTING OFF CACHE BOOL "" FORCE)
|
|
set(DISABLE_PACKAGE_CONFIG_AND_INSTALL ON CACHE BOOL "" FORCE)
|
|
set(MBEDTLS_AS_SUBPROJECT ON CACHE BOOL "" FORCE)
|
|
set(MBEDTLS_TARGET_PREFIX "" CACHE STRING "" FORCE)
|
|
|
|
if(MBEDTLS_BUILD_SHARED)
|
|
set(USE_SHARED_MBEDTLS_LIBRARY ON CACHE BOOL "" FORCE)
|
|
set(USE_STATIC_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
|
|
else()
|
|
set(USE_SHARED_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
|
|
set(USE_STATIC_MBEDTLS_LIBRARY ON CACHE BOOL "" FORCE)
|
|
endif()
|
|
|
|
FetchContent_Declare(
|
|
mbedtls_fc
|
|
GIT_REPOSITORY "${MBEDTLS_FETCHCONTENT_GIT_REPOSITORY}"
|
|
GIT_TAG "${MBEDTLS_FETCHCONTENT_GIT_TAG}"
|
|
GIT_SHALLOW TRUE
|
|
)
|
|
|
|
FetchContent_MakeAvailable(mbedtls_fc)
|
|
|
|
# 4) Normalize targets across upstream versions.
|
|
#
|
|
# Mbed TLS 3.x:
|
|
# mbedtls, mbedx509, mbedcrypto
|
|
#
|
|
# Mbed TLS 4.x:
|
|
# mbedtls, mbedx509, tfpsacrypto
|
|
#
|
|
# Map everything to stable namespaced targets for the consumer. :contentReference[oaicite:2]{index=2}
|
|
|
|
set(_mbedtls_tls_target "")
|
|
set(_mbedtls_x509_target "")
|
|
set(_mbedtls_crypto_target "")
|
|
|
|
if(TARGET mbedtls)
|
|
set(_mbedtls_tls_target mbedtls)
|
|
elseif(TARGET MbedTLS::mbedtls)
|
|
set(_mbedtls_tls_target MbedTLS::mbedtls)
|
|
endif()
|
|
|
|
if(TARGET mbedx509)
|
|
set(_mbedtls_x509_target mbedx509)
|
|
elseif(TARGET MbedTLS::mbedx509)
|
|
set(_mbedtls_x509_target MbedTLS::mbedx509)
|
|
endif()
|
|
|
|
if(TARGET mbedcrypto)
|
|
set(_mbedtls_crypto_target mbedcrypto)
|
|
elseif(TARGET tfpsacrypto)
|
|
set(_mbedtls_crypto_target tfpsacrypto)
|
|
elseif(TARGET MbedTLS::mbedcrypto)
|
|
set(_mbedtls_crypto_target MbedTLS::mbedcrypto)
|
|
endif()
|
|
|
|
if(_mbedtls_tls_target AND NOT TARGET MbedTLS::mbedtls)
|
|
add_library(MbedTLS::mbedtls INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedtls INTERFACE "${_mbedtls_tls_target}")
|
|
endif()
|
|
|
|
if(_mbedtls_x509_target AND NOT TARGET MbedTLS::mbedx509)
|
|
add_library(MbedTLS::mbedx509 INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedx509 INTERFACE "${_mbedtls_x509_target}")
|
|
endif()
|
|
|
|
if(_mbedtls_crypto_target AND NOT TARGET MbedTLS::mbedcrypto)
|
|
add_library(MbedTLS::mbedcrypto INTERFACE IMPORTED)
|
|
target_link_libraries(MbedTLS::mbedcrypto INTERFACE "${_mbedtls_crypto_target}")
|
|
endif()
|
|
|
|
find_package_handle_standard_args(
|
|
mbedtls
|
|
REQUIRED_VARS
|
|
_mbedtls_tls_target
|
|
_mbedtls_x509_target
|
|
_mbedtls_crypto_target
|
|
)
|
|
|
|
if(mbedtls_FOUND)
|
|
set(MBEDTLS_FOUND TRUE)
|
|
set(MBEDTLS_LIBRARIES
|
|
MbedTLS::mbedtls
|
|
MbedTLS::mbedx509
|
|
MbedTLS::mbedcrypto)
|
|
|
|
# Best-effort include directory discovery for legacy consumers.
|
|
get_target_property(_mbedtls_inc "${_mbedtls_tls_target}" INTERFACE_INCLUDE_DIRECTORIES)
|
|
if(_mbedtls_inc)
|
|
set(MBEDTLS_INCLUDE_DIRS "${_mbedtls_inc}")
|
|
else()
|
|
set(MBEDTLS_INCLUDE_DIRS "")
|
|
endif()
|
|
endif() |