CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. option(USE_STATIC_MBEDTLS_LIBRARY "Build mbed TLS static library." ON)
  2. option(USE_SHARED_MBEDTLS_LIBRARY "Build mbed TLS shared library." OFF)
  3. option(LINK_WITH_PTHREAD "Explicitly link mbed TLS library to pthread." OFF)
  4. option(LINK_WITH_TRUSTED_STORAGE "Explicitly link mbed TLS library to trusted_storage." OFF)
  5. # Set the project root directory if it's not already defined, as may happen if
  6. # the library folder is included directly by a parent project, without
  7. # including the top level CMakeLists.txt.
  8. if(NOT DEFINED MBEDTLS_DIR)
  9. set(MBEDTLS_DIR ${CMAKE_SOURCE_DIR})
  10. endif()
  11. set(src_crypto
  12. aes.c
  13. aesni.c
  14. aesce.c
  15. aria.c
  16. asn1parse.c
  17. asn1write.c
  18. base64.c
  19. bignum.c
  20. bignum_core.c
  21. bignum_mod.c
  22. bignum_mod_raw.c
  23. camellia.c
  24. ccm.c
  25. chacha20.c
  26. chachapoly.c
  27. cipher.c
  28. cipher_wrap.c
  29. constant_time.c
  30. cmac.c
  31. ctr_drbg.c
  32. des.c
  33. dhm.c
  34. ecdh.c
  35. ecdsa.c
  36. ecjpake.c
  37. ecp.c
  38. ecp_curves.c
  39. entropy.c
  40. entropy_poll.c
  41. error.c
  42. gcm.c
  43. hash_info.c
  44. hkdf.c
  45. hmac_drbg.c
  46. lmots.c
  47. lms.c
  48. md.c
  49. md5.c
  50. memory_buffer_alloc.c
  51. nist_kw.c
  52. oid.c
  53. padlock.c
  54. pem.c
  55. pk.c
  56. pk_wrap.c
  57. pkcs12.c
  58. pkcs5.c
  59. pkparse.c
  60. pkwrite.c
  61. platform.c
  62. platform_util.c
  63. poly1305.c
  64. psa_crypto.c
  65. psa_crypto_aead.c
  66. psa_crypto_cipher.c
  67. psa_crypto_client.c
  68. psa_crypto_driver_wrappers.c
  69. psa_crypto_ecp.c
  70. psa_crypto_hash.c
  71. psa_crypto_mac.c
  72. psa_crypto_pake.c
  73. psa_crypto_rsa.c
  74. psa_crypto_se.c
  75. psa_crypto_slot_management.c
  76. psa_crypto_storage.c
  77. psa_its_file.c
  78. psa_util.c
  79. ripemd160.c
  80. rsa.c
  81. rsa_alt_helpers.c
  82. sha1.c
  83. sha256.c
  84. sha512.c
  85. threading.c
  86. timing.c
  87. version.c
  88. version_features.c
  89. )
  90. set(src_x509
  91. pkcs7.c
  92. x509.c
  93. x509_create.c
  94. x509_crl.c
  95. x509_crt.c
  96. x509_csr.c
  97. x509write_crt.c
  98. x509write_csr.c
  99. )
  100. set(src_tls
  101. debug.c
  102. mps_reader.c
  103. mps_trace.c
  104. net_sockets.c
  105. ssl_cache.c
  106. ssl_ciphersuites.c
  107. ssl_client.c
  108. ssl_cookie.c
  109. ssl_debug_helpers_generated.c
  110. ssl_msg.c
  111. ssl_ticket.c
  112. ssl_tls.c
  113. ssl_tls12_client.c
  114. ssl_tls12_server.c
  115. ssl_tls13_keys.c
  116. ssl_tls13_server.c
  117. ssl_tls13_client.c
  118. ssl_tls13_generic.c
  119. )
  120. if(GEN_FILES)
  121. find_package(Perl REQUIRED)
  122. file(GLOB error_headers ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls/*.h)
  123. add_custom_command(
  124. OUTPUT
  125. ${CMAKE_CURRENT_BINARY_DIR}/error.c
  126. COMMAND
  127. ${PERL_EXECUTABLE}
  128. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_errors.pl
  129. ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls
  130. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files
  131. ${CMAKE_CURRENT_BINARY_DIR}/error.c
  132. DEPENDS
  133. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_errors.pl
  134. ${error_headers}
  135. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/error.fmt
  136. )
  137. add_custom_command(
  138. OUTPUT
  139. ${CMAKE_CURRENT_BINARY_DIR}/version_features.c
  140. COMMAND
  141. ${PERL_EXECUTABLE}
  142. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_features.pl
  143. ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls
  144. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files
  145. ${CMAKE_CURRENT_BINARY_DIR}/version_features.c
  146. DEPENDS
  147. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_features.pl
  148. ${CMAKE_CURRENT_SOURCE_DIR}/../include/mbedtls/mbedtls_config.h
  149. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/version_features.fmt
  150. )
  151. add_custom_command(
  152. OUTPUT
  153. ${CMAKE_CURRENT_BINARY_DIR}/ssl_debug_helpers_generated.c
  154. COMMAND
  155. ${MBEDTLS_PYTHON_EXECUTABLE}
  156. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_ssl_debug_helpers.py
  157. --mbedtls-root ${CMAKE_CURRENT_SOURCE_DIR}/..
  158. ${CMAKE_CURRENT_BINARY_DIR}
  159. DEPENDS
  160. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_ssl_debug_helpers.py
  161. ${error_headers}
  162. )
  163. add_custom_command(
  164. OUTPUT
  165. ${CMAKE_CURRENT_BINARY_DIR}/psa_crypto_driver_wrappers.c
  166. COMMAND
  167. ${MBEDTLS_PYTHON_EXECUTABLE}
  168. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_driver_wrappers.py
  169. ${CMAKE_CURRENT_BINARY_DIR}
  170. DEPENDS
  171. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/generate_driver_wrappers.py
  172. ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/data_files/driver_templates/psa_crypto_driver_wrappers.c.jinja
  173. )
  174. else()
  175. link_to_source(error.c)
  176. link_to_source(version_features.c)
  177. link_to_source(ssl_debug_helpers_generated.c)
  178. link_to_source(psa_crypto_driver_wrappers.c)
  179. endif()
  180. if(CMAKE_COMPILER_IS_GNUCC)
  181. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes")
  182. endif(CMAKE_COMPILER_IS_GNUCC)
  183. if(CMAKE_COMPILER_IS_CLANG)
  184. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code")
  185. endif(CMAKE_COMPILER_IS_CLANG)
  186. if(CMAKE_COMPILER_IS_MSVC)
  187. option(MSVC_STATIC_RUNTIME "Build the libraries with /MT compiler flag" OFF)
  188. if(MSVC_STATIC_RUNTIME)
  189. foreach(flag_var
  190. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  191. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
  192. CMAKE_C_FLAGS_CHECK)
  193. string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  194. endforeach(flag_var)
  195. endif()
  196. endif()
  197. if(WIN32)
  198. set(libs ${libs} ws2_32)
  199. endif(WIN32)
  200. if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
  201. SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
  202. SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
  203. SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
  204. SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
  205. endif()
  206. if(HAIKU)
  207. set(libs ${libs} network)
  208. endif(HAIKU)
  209. if(LINK_WITH_PTHREAD)
  210. set(libs ${libs} pthread)
  211. endif()
  212. if(LINK_WITH_TRUSTED_STORAGE)
  213. set(libs ${libs} trusted_storage)
  214. endif()
  215. if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)
  216. message(FATAL_ERROR "Need to choose static or shared mbedtls build!")
  217. endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)
  218. set(mbedtls_target "${MBEDTLS_TARGET_PREFIX}mbedtls")
  219. set(mbedx509_target "${MBEDTLS_TARGET_PREFIX}mbedx509")
  220. set(mbedcrypto_target "${MBEDTLS_TARGET_PREFIX}mbedcrypto")
  221. set(mbedtls_target ${mbedtls_target} PARENT_SCOPE)
  222. set(mbedx509_target ${mbedx509_target} PARENT_SCOPE)
  223. set(mbedcrypto_target ${mbedcrypto_target} PARENT_SCOPE)
  224. if (USE_STATIC_MBEDTLS_LIBRARY)
  225. set(mbedtls_static_target ${mbedtls_target})
  226. set(mbedx509_static_target ${mbedx509_target})
  227. set(mbedcrypto_static_target ${mbedcrypto_target})
  228. endif()
  229. set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target})
  230. if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
  231. string(APPEND mbedtls_static_target "_static")
  232. string(APPEND mbedx509_static_target "_static")
  233. string(APPEND mbedcrypto_static_target "_static")
  234. list(APPEND target_libraries
  235. ${mbedcrypto_static_target}
  236. ${mbedx509_static_target}
  237. ${mbedtls_static_target})
  238. endif()
  239. if(USE_STATIC_MBEDTLS_LIBRARY)
  240. add_library(${mbedcrypto_static_target} STATIC ${src_crypto})
  241. set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto)
  242. target_link_libraries(${mbedcrypto_static_target} PUBLIC ${libs})
  243. if(TARGET everest)
  244. target_link_libraries(${mbedcrypto_static_target} PUBLIC everest)
  245. endif()
  246. add_library(${mbedx509_static_target} STATIC ${src_x509})
  247. set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509)
  248. target_link_libraries(${mbedx509_static_target} PUBLIC ${libs} ${mbedcrypto_static_target})
  249. add_library(${mbedtls_static_target} STATIC ${src_tls})
  250. set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls)
  251. target_link_libraries(${mbedtls_static_target} PUBLIC ${libs} ${mbedx509_static_target})
  252. endif(USE_STATIC_MBEDTLS_LIBRARY)
  253. if(USE_SHARED_MBEDTLS_LIBRARY)
  254. set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR})
  255. add_library(${mbedcrypto_target} SHARED ${src_crypto})
  256. set_target_properties(${mbedcrypto_target} PROPERTIES VERSION 3.4.0 SOVERSION 14)
  257. target_link_libraries(${mbedcrypto_target} PUBLIC ${libs})
  258. if(TARGET everest)
  259. target_link_libraries(${mbedcrypto_target} PUBLIC everest)
  260. endif()
  261. add_library(${mbedx509_target} SHARED ${src_x509})
  262. set_target_properties(${mbedx509_target} PROPERTIES VERSION 3.4.0 SOVERSION 5)
  263. target_link_libraries(${mbedx509_target} PUBLIC ${libs} ${mbedcrypto_target})
  264. add_library(${mbedtls_target} SHARED ${src_tls})
  265. set_target_properties(${mbedtls_target} PROPERTIES VERSION 3.4.0 SOVERSION 19)
  266. target_link_libraries(${mbedtls_target} PUBLIC ${libs} ${mbedx509_target})
  267. endif(USE_SHARED_MBEDTLS_LIBRARY)
  268. foreach(target IN LISTS target_libraries)
  269. add_library(MbedTLS::${target} ALIAS ${target}) # add_subdirectory support
  270. # Include public header files from /include and other directories
  271. # declared by /3rdparty/**/CMakeLists.txt. Include private header files
  272. # from /library and others declared by /3rdparty/**/CMakeLists.txt.
  273. # /library needs to be listed explicitly when building .c files outside
  274. # of /library (which currently means: under /3rdparty).
  275. target_include_directories(${target}
  276. PUBLIC $<BUILD_INTERFACE:${MBEDTLS_DIR}/include/>
  277. $<INSTALL_INTERFACE:include/>
  278. PRIVATE ${MBEDTLS_DIR}/library/)
  279. install(
  280. TARGETS ${target}
  281. EXPORT MbedTLSTargets
  282. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  283. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  284. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  285. PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
  286. endforeach(target)
  287. set(lib_target "${MBEDTLS_TARGET_PREFIX}lib")
  288. add_custom_target(${lib_target} DEPENDS ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target})
  289. if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)
  290. add_dependencies(${lib_target} ${mbedcrypto_static_target} ${mbedx509_static_target} ${mbedtls_static_target})
  291. endif()