FindMbedTLS.cmake 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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(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(MBEDTLS_INCLUDE_DIR
  23. NAMES mbedtls/ssl.h
  24. HINTS
  25. ENV mbedtlsPath${_lib_suffix}
  26. ENV mbedtlsPath
  27. ENV DepsPath${_lib_suffix}
  28. ENV DepsPath
  29. ${mbedtlsPath${_lib_suffix}}
  30. ${mbedtlsPath}
  31. ${DepsPath${_lib_suffix}}
  32. ${DepsPath}
  33. ${_MBEDTLS_INCLUDE_DIRS}
  34. PATHS
  35. /usr/include /usr/local/include /opt/local/include /sw/include
  36. PATH_SUFFIXES
  37. include)
  38. find_library(MBEDTLS_LIB
  39. NAMES ${_MBEDTLS_LIBRARIES} mbedtls libmbedtls
  40. HINTS
  41. ENV mbedtlsPath${_lib_suffix}
  42. ENV mbedtlsPath
  43. ENV DepsPath${_lib_suffix}
  44. ENV DepsPath
  45. ${mbedtlsPath${_lib_suffix}}
  46. ${mbedtlsPath}
  47. ${DepsPath${_lib_suffix}}
  48. ${DepsPath}
  49. ${_MBEDTLS_LIBRARY_DIRS}
  50. PATHS
  51. /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  52. PATH_SUFFIXES
  53. lib${_lib_suffix} lib
  54. libs${_lib_suffix} libs
  55. bin${_lib_suffix} bin
  56. ../lib${_lib_suffix} ../lib
  57. ../libs${_lib_suffix} ../libs
  58. ../bin${_lib_suffix} ../bin)
  59. find_library(MBEDCRYPTO_LIB
  60. NAMES ${_MBEDCRYPTO_LIBRARIES} mbedcrypto libmbedcrypto
  61. HINTS
  62. ENV mbedcryptoPath${_lib_suffix}
  63. ENV mbedcryptoPath
  64. ENV DepsPath${_lib_suffix}
  65. ENV DepsPath
  66. ${mbedcryptoPath${_lib_suffix}}
  67. ${mbedcryptoPath}
  68. ${DepsPath${_lib_suffix}}
  69. ${DepsPath}
  70. ${_MBEDCRYPTO_LIBRARY_DIRS}
  71. PATHS
  72. /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  73. PATH_SUFFIXES
  74. lib${_lib_suffix} lib
  75. libs${_lib_suffix} libs
  76. bin${_lib_suffix} bin
  77. ../lib${_lib_suffix} ../lib
  78. ../libs${_lib_suffix} ../libs
  79. ../bin${_lib_suffix} ../bin)
  80. find_library(MBEDX509_LIB
  81. NAMES ${_MBEDX509_LIBRARIES} mbedx509 libmbedx509
  82. HINTS
  83. ENV mbedx509Path${_lib_suffix}
  84. ENV mbedx509Path
  85. ENV DepsPath${_lib_suffix}
  86. ENV DepsPath
  87. ${mbedx509Path${_lib_suffix}}
  88. ${mbedx509Path}
  89. ${DepsPath${_lib_suffix}}
  90. ${DepsPath}
  91. ${_MBEDX509_LIBRARY_DIRS}
  92. PATHS
  93. /usr/lib /usr/local/lib /opt/local/lib /sw/lib
  94. PATH_SUFFIXES
  95. lib${_lib_suffix} lib
  96. libs${_lib_suffix} libs
  97. bin${_lib_suffix} bin
  98. ../lib${_lib_suffix} ../lib
  99. ../libs${_lib_suffix} ../libs
  100. ../bin${_lib_suffix} ../bin)
  101. # Sometimes mbedtls is split between three libs, and sometimes it isn't.
  102. # If it isn't, let's check if the symbols we need are all in MBEDTLS_LIB.
  103. if(MBEDTLS_LIB AND NOT MBEDCRYPTO_LIB AND NOT MBEDX509_LIB)
  104. set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIB})
  105. set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIR})
  106. check_symbol_exists(mbedtls_x509_crt_init "mbedtls/x509_crt.h" MBEDTLS_INCLUDES_X509)
  107. check_symbol_exists(mbedtls_sha256_init "mbedtls/sha256.h" MBEDTLS_INCLUDES_CRYPTO)
  108. unset(CMAKE_REQUIRED_INCLUDES)
  109. unset(CMAKE_REQUIRED_LIBRARIES)
  110. endif()
  111. # If we find all three libraries, then go ahead.
  112. if(MBEDTLS_LIB AND MBEDCRYPTO_LIB AND MBEDX509_LIB)
  113. set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
  114. set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB} ${MBEDCRYPTO_LIB} ${MBEDX509_LIB})
  115. # Otherwise, if we find MBEDTLS_LIB, and it has both CRYPTO and x509
  116. # within the single lib (i.e. a windows build environment), then also
  117. # feel free to go ahead.
  118. elseif(MBEDTLS_LIB AND MBEDTLS_INCLUDES_CRYPTO AND MBEDTLS_INCLUDES_X509)
  119. set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR})
  120. set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB})
  121. endif()
  122. # Now we've accounted for the 3-vs-1 library case:
  123. include(FindPackageHandleStandardArgs)
  124. find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS)
  125. mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIB MBEDCRYPTO_LIB MBEDX509_LIB)