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