FindMbedTLS.cmake 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # Once done these will be defined:
  2. #
  3. # * MBEDTLS_FOUND
  4. # * MBEDTLS_INCLUDE_DIRS
  5. # * MBEDTLS_LIBRARIES
  6. #
  7. find_package(PkgConfig QUIET)
  8. if(PKG_CONFIG_FOUND)
  9. pkg_check_modules(_MBEDTLS QUIET mbedtls)
  10. endif()
  11. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  12. set(_lib_suffix 64)
  13. else()
  14. set(_lib_suffix 32)
  15. endif()
  16. # If we're on MacOS or Linux, please try to statically-link mbedtls.
  17. if(ENABLE_STATIC_MBEDTLS AND (APPLE OR UNIX))
  18. set(_MBEDTLS_LIBRARIES libmbedtls.a)
  19. set(_MBEDCRYPTO_LIBRARIES libmbedcrypto.a)
  20. set(_MBEDX509_LIBRARIES libmbedx509.a)
  21. endif()
  22. find_path(
  23. MBEDTLS_INCLUDE_DIR
  24. NAMES mbedtls/ssl.h
  25. HINTS ENV MBEDTLS_PATH ${MBEDTLS_PATH} ${CMAKE_SOURCE_DIR}/${MBEDTLS_PATH} ${_MBEDTLS_INCLUDE_DIRS}
  26. PATHS /usr/include /usr/local/include /opt/local/include /sw/include
  27. PATH_SUFFIXES include)
  28. find_library(
  29. MBEDTLS_LIB
  30. NAMES ${_MBEDTLS_LIBRARIES} mbedtls libmbedtls
  31. HINTS ENV MBEDTLS_PATH ${MBEDTLS_PATH} ${CMAKE_SOURCE_DIR}/${MBEDTLS_PATH} ${_MBEDTLS_LIBRARY_DIRS}
  32. PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  33. PATH_SUFFIXES
  34. lib${_lib_suffix}
  35. lib
  36. libs${_lib_suffix}
  37. libs
  38. bin${_lib_suffix}
  39. bin
  40. ../lib${_lib_suffix}
  41. ../lib
  42. ../libs${_lib_suffix}
  43. ../libs
  44. ../bin${_lib_suffix}
  45. ../bin)
  46. find_library(
  47. MBEDCRYPTO_LIB
  48. NAMES ${_MBEDCRYPTO_LIBRARIES} mbedcrypto libmbedcrypto
  49. HINTS ENV MBEDCRYPTO_PATH ${MBEDCRYPTO_PATH} ${CMAKE_SOURCE_DIR}/${MBEDCRYPTO_PATH} ${_MBEDCRYPTO_LIBRARY_DIRS}
  50. PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  51. PATH_SUFFIXES
  52. lib${_lib_suffix}
  53. lib
  54. libs${_lib_suffix}
  55. libs
  56. bin${_lib_suffix}
  57. bin
  58. ../lib${_lib_suffix}
  59. ../lib
  60. ../libs${_lib_suffix}
  61. ../libs
  62. ../bin${_lib_suffix}
  63. ../bin)
  64. find_library(
  65. MBEDX509_LIB
  66. NAMES ${_MBEDX509_LIBRARIES} mbedx509 libmbedx509
  67. HINTS ENV MBEDX509_PATH ${MBEDX509_PATH} ${CMAKE_SOURCE_DIR}/${MBEDX509_PATH} ${_MBEDX509_LIBRARY_DIRS}
  68. PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  69. PATH_SUFFIXES
  70. lib${_lib_suffix}
  71. lib
  72. libs${_lib_suffix}
  73. libs
  74. bin${_lib_suffix}
  75. bin
  76. ../lib${_lib_suffix}
  77. ../lib
  78. ../libs${_lib_suffix}
  79. ../libs
  80. ../bin${_lib_suffix}
  81. ../bin)
  82. # Sometimes mbedtls is split between three libs, and sometimes it isn't. If it isn't, let's check if the symbols we need
  83. # are all in MBEDTLS_LIB.
  84. if(MBEDTLS_LIB
  85. AND NOT MBEDCRYPTO_LIB
  86. AND NOT MBEDX509_LIB)
  87. set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIB})
  88. set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIR})
  89. include(CheckSymbolExists)
  90. check_symbol_exists(mbedtls_x509_crt_init "mbedtls/x509_crt.h" MBEDTLS_INCLUDES_X509)
  91. check_symbol_exists(mbedtls_sha256_init "mbedtls/sha256.h" MBEDTLS_INCLUDES_CRYPTO)
  92. unset(CMAKE_REQUIRED_INCLUDES)
  93. unset(CMAKE_REQUIRED_LIBRARIES)
  94. endif()
  95. # If we find all three libraries, then go ahead.
  96. if(MBEDTLS_LIB
  97. AND MBEDCRYPTO_LIB
  98. AND MBEDX509_LIB)
  99. set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
  100. set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB} ${MBEDCRYPTO_LIB} ${MBEDX509_LIB})
  101. foreach(component TLS CRYPTO X509)
  102. if(NOT TARGET Mbedtls::${component} AND MBED${component}_LIB)
  103. if(IS_ABSOLUTE "${MBED${component}_LIB}")
  104. add_library(Mbedtls::${component} UNKNOWN IMPORTED)
  105. set_target_properties(Mbedtls::${component} PROPERTIES IMPORTED_LOCATION "${MBED${component}_LIB}")
  106. else()
  107. add_library(Mbedtls::${component} INTERFACE IMPORTED)
  108. set_target_properties(Mbedtls::${component} PROPERTIES IMPORTED_LIBNAME "${MBED${component}_LIB}")
  109. endif()
  110. set_target_properties(Mbedtls::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES
  111. "${MBED${component}_INCLUDE_DIR}")
  112. endif()
  113. endforeach()
  114. if(NOT TARGET Mbedtls::Mbedtls)
  115. add_library(Mbedtls::Mbedtls INTERFACE IMPORTED)
  116. target_link_libraries(Mbedtls::Mbedtls INTERFACE Mbedtls::TLS Mbedtls::CRYPTO Mbedtls::X509)
  117. endif()
  118. # Otherwise, if we find MBEDTLS_LIB, and it has both CRYPTO and x509 within the single lib (i.e. a windows build
  119. # environment), then also feel free to go ahead.
  120. elseif(
  121. MBEDTLS_LIB
  122. AND MBEDTLS_INCLUDES_CRYPTO
  123. AND MBEDTLS_INCLUDES_X509)
  124. set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
  125. set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB})
  126. if(NOT TARGET Mbedtls::Mbedtls)
  127. if(IS_ABSOLUTE "${MBED${component}_LIB}")
  128. add_library(Mbedtls::${component} UNKNOWN IMPORTED)
  129. set_target_properties(Mbedtls::${component} PROPERTIES IMPORTED_LOCATION "${MBEDTLS_LIBRARIES}")
  130. else()
  131. add_library(Mbedtls::${component} INTERFACE IMPORTED)
  132. set_target_properties(Mbedtls::${component} PROPERTIES IMPORTED_LIBNAME "${MBEDTLS_LIBRARIES}")
  133. endif()
  134. set_target_properties(Mbedtls::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MBEDTLS_INCLUDE_DIRS}")
  135. endif()
  136. endif()
  137. # Now we've accounted for the 3-vs-1 library case:
  138. include(FindPackageHandleStandardArgs)
  139. find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS)
  140. mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIB MBEDCRYPTO_LIB MBEDX509_LIB)