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 -Wmissing-prototypes") 201endif(CMAKE_COMPILER_IS_GNUCC) 202 203if(CMAKE_COMPILER_IS_CLANG) 204 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -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_SYSTEM_NAME} MATCHES "Darwin") 224 SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 225 SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 226 SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 227 SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 228endif() 229 230if(HAIKU) 231 set(libs ${libs} network) 232endif(HAIKU) 233 234if(LINK_WITH_PTHREAD) 235 set(libs ${libs} ${CMAKE_THREAD_LIBS_INIT}) 236endif() 237 238if(LINK_WITH_TRUSTED_STORAGE) 239 set(libs ${libs} trusted_storage) 240endif() 241 242if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) 243 message(FATAL_ERROR "Need to choose static or shared mbedtls build!") 244endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) 245 246set(mbedtls_target "${MBEDTLS_TARGET_PREFIX}mbedtls") 247set(mbedx509_target "${MBEDTLS_TARGET_PREFIX}mbedx509") 248set(mbedcrypto_target "${MBEDTLS_TARGET_PREFIX}mbedcrypto") 249 250set(mbedtls_target ${mbedtls_target} PARENT_SCOPE) 251set(mbedx509_target ${mbedx509_target} PARENT_SCOPE) 252set(mbedcrypto_target ${mbedcrypto_target} PARENT_SCOPE) 253 254if (USE_STATIC_MBEDTLS_LIBRARY) 255 set(mbedtls_static_target ${mbedtls_target}) 256 set(mbedx509_static_target ${mbedx509_target}) 257 set(mbedcrypto_static_target ${mbedcrypto_target}) 258endif() 259 260set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) 261 262if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) 263 string(APPEND mbedtls_static_target "_static") 264 string(APPEND mbedx509_static_target "_static") 265 string(APPEND mbedcrypto_static_target "_static") 266 267 list(APPEND target_libraries 268 ${mbedcrypto_static_target} 269 ${mbedx509_static_target} 270 ${mbedtls_static_target}) 271endif() 272 273set(p256m_target "${MBEDTLS_TARGET_PREFIX}p256m") 274set(everest_target "${MBEDTLS_TARGET_PREFIX}everest") 275 276if(USE_STATIC_MBEDTLS_LIBRARY) 277 add_library(${mbedcrypto_static_target} STATIC ${src_crypto}) 278 set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto) 279 target_link_libraries(${mbedcrypto_static_target} PUBLIC ${libs}) 280 281 if(TARGET ${everest_target}) 282 target_link_libraries(${mbedcrypto_static_target} PUBLIC ${everest_target}) 283 endif() 284 285 if(TARGET ${p256m_target}) 286 target_link_libraries(${mbedcrypto_static_target} PUBLIC ${p256m_target}) 287 endif() 288 289 add_library(${mbedx509_static_target} STATIC ${src_x509}) 290 set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509) 291 target_link_libraries(${mbedx509_static_target} PUBLIC ${libs} ${mbedcrypto_static_target}) 292 293 add_library(${mbedtls_static_target} STATIC ${src_tls}) 294 set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls) 295 target_link_libraries(${mbedtls_static_target} PUBLIC ${libs} ${mbedx509_static_target}) 296endif(USE_STATIC_MBEDTLS_LIBRARY) 297 298if(USE_SHARED_MBEDTLS_LIBRARY) 299 set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR}) 300 add_library(${mbedcrypto_target} SHARED ${src_crypto}) 301 set_target_properties(${mbedcrypto_target} PROPERTIES VERSION 3.6.0 SOVERSION 16) 302 target_link_libraries(${mbedcrypto_target} PUBLIC ${libs}) 303 304 if(TARGET ${everest_target}) 305 target_link_libraries(${mbedcrypto_target} PUBLIC ${everest_target}) 306 endif() 307 308 if(TARGET ${p256m_target}) 309 target_link_libraries(${mbedcrypto_target} PUBLIC ${p256m_target}) 310 endif() 311 312 add_library(${mbedx509_target} SHARED ${src_x509}) 313 set_target_properties(${mbedx509_target} PROPERTIES VERSION 3.6.0 SOVERSION 7) 314 target_link_libraries(${mbedx509_target} PUBLIC ${libs} ${mbedcrypto_target}) 315 316 add_library(${mbedtls_target} SHARED ${src_tls}) 317 set_target_properties(${mbedtls_target} PROPERTIES VERSION 3.6.0 SOVERSION 21) 318 target_link_libraries(${mbedtls_target} PUBLIC ${libs} ${mbedx509_target}) 319endif(USE_SHARED_MBEDTLS_LIBRARY) 320 321foreach(target IN LISTS target_libraries) 322 add_library(MbedTLS::${target} ALIAS ${target}) # add_subdirectory support 323 # Include public header files from /include and other directories 324 # declared by /3rdparty/**/CMakeLists.txt. Include private header files 325 # from /library and others declared by /3rdparty/**/CMakeLists.txt. 326 # /library needs to be listed explicitly when building .c files outside 327 # of /library (which currently means: under /3rdparty). 328 target_include_directories(${target} 329 PUBLIC $<BUILD_INTERFACE:${MBEDTLS_DIR}/include/> 330 $<INSTALL_INTERFACE:include/> 331 PRIVATE ${MBEDTLS_DIR}/library/ 332 # Needed to include psa_crypto_driver_wrappers.h 333 ${CMAKE_CURRENT_BINARY_DIR}) 334 # Pass-through MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE 335 if(MBEDTLS_CONFIG_FILE) 336 target_compile_definitions(${target} 337 PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}") 338 endif() 339 if(MBEDTLS_USER_CONFIG_FILE) 340 target_compile_definitions(${target} 341 PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}") 342 endif() 343 install( 344 TARGETS ${target} 345 EXPORT MbedTLSTargets 346 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 347 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 348 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 349 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) 350endforeach(target) 351 352set(lib_target "${MBEDTLS_TARGET_PREFIX}lib") 353 354add_custom_target(${lib_target} DEPENDS ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) 355if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) 356 add_dependencies(${lib_target} ${mbedcrypto_static_target} ${mbedx509_static_target} ${mbedtls_static_target}) 357endif() 358