# 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()