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 arc4.c 17 aria.c 18 asn1parse.c 19 asn1write.c 20 base64.c 21 bignum.c 22 blowfish.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 havege.c 44 hkdf.c 45 hmac_drbg.c 46 md.c 47 md2.c 48 md4.c 49 md5.c 50 memory_buffer_alloc.c 51 mps_reader.c 52 mps_trace.c 53 nist_kw.c 54 oid.c 55 padlock.c 56 pem.c 57 pk.c 58 pk_wrap.c 59 pkcs12.c 60 pkcs5.c 61 pkparse.c 62 pkwrite.c 63 platform.c 64 platform_util.c 65 poly1305.c 66 psa_crypto.c 67 psa_crypto_aead.c 68 psa_crypto_cipher.c 69 psa_crypto_client.c 70 psa_crypto_driver_wrappers.c 71 psa_crypto_ecp.c 72 psa_crypto_hash.c 73 psa_crypto_mac.c 74 psa_crypto_rsa.c 75 psa_crypto_se.c 76 psa_crypto_slot_management.c 77 psa_crypto_storage.c 78 psa_its_file.c 79 ripemd160.c 80 rsa.c 81 rsa_internal.c 82 sha1.c 83 sha256.c 84 sha512.c 85 threading.c 86 timing.c 87 version.c 88 version_features.c 89 xtea.c 90) 91 92list(APPEND src_crypto ${thirdparty_src}) 93 94set(src_x509 95 certs.c 96 pkcs11.c 97 x509.c 98 x509_create.c 99 x509_crl.c 100 x509_crt.c 101 x509_csr.c 102 x509write_crt.c 103 x509write_csr.c 104) 105 106set(src_tls 107 debug.c 108 net_sockets.c 109 ssl_cache.c 110 ssl_ciphersuites.c 111 ssl_cli.c 112 ssl_cookie.c 113 ssl_msg.c 114 ssl_srv.c 115 ssl_ticket.c 116 ssl_tls.c 117 ssl_tls13_keys.c 118) 119 120if(CMAKE_COMPILER_IS_GNUCC) 121 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes") 122endif(CMAKE_COMPILER_IS_GNUCC) 123 124if(CMAKE_COMPILER_IS_CLANG) 125 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code") 126endif(CMAKE_COMPILER_IS_CLANG) 127 128if(WIN32) 129 set(libs ${libs} ws2_32) 130endif(WIN32) 131 132if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 133 SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 134 SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 135 SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 136 SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 137endif() 138 139if(HAIKU) 140 set(libs ${libs} network) 141endif(HAIKU) 142 143if(USE_PKCS11_HELPER_LIBRARY) 144 set(libs ${libs} pkcs11-helper) 145endif(USE_PKCS11_HELPER_LIBRARY) 146 147if(ENABLE_ZLIB_SUPPORT) 148 set(libs ${libs} ${ZLIB_LIBRARIES}) 149endif(ENABLE_ZLIB_SUPPORT) 150 151if(LINK_WITH_PTHREAD) 152 set(libs ${libs} pthread) 153endif() 154 155if(LINK_WITH_TRUSTED_STORAGE) 156 set(libs ${libs} trusted_storage) 157endif() 158 159if (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) 160 message(FATAL_ERROR "Need to choose static or shared mbedtls build!") 161endif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY) 162 163set(mbedtls_target "${MBEDTLS_TARGET_PREFIX}mbedtls") 164set(mbedx509_target "${MBEDTLS_TARGET_PREFIX}mbedx509") 165set(mbedcrypto_target "${MBEDTLS_TARGET_PREFIX}mbedcrypto") 166 167set(mbedtls_target ${mbedtls_target} PARENT_SCOPE) 168set(mbedx509_target ${mbedx509_target} PARENT_SCOPE) 169set(mbedcrypto_target ${mbedcrypto_target} PARENT_SCOPE) 170 171if (USE_STATIC_MBEDTLS_LIBRARY) 172 set(mbedtls_static_target ${mbedtls_target}) 173 set(mbedx509_static_target ${mbedx509_target}) 174 set(mbedcrypto_static_target ${mbedcrypto_target}) 175endif() 176 177set(target_libraries ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) 178 179if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) 180 string(APPEND mbedtls_static_target "_static") 181 string(APPEND mbedx509_static_target "_static") 182 string(APPEND mbedcrypto_static_target "_static") 183 184 list(APPEND target_libraries 185 ${mbedcrypto_static_target} 186 ${mbedx509_static_target} 187 ${mbedtls_static_target}) 188endif() 189 190if(USE_STATIC_MBEDTLS_LIBRARY) 191 add_library(${mbedcrypto_static_target} STATIC ${src_crypto}) 192 set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto) 193 target_link_libraries(${mbedcrypto_static_target} PUBLIC ${libs}) 194 195 add_library(${mbedx509_static_target} STATIC ${src_x509}) 196 set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509) 197 target_link_libraries(${mbedx509_static_target} PUBLIC ${libs} ${mbedcrypto_static_target}) 198 199 add_library(${mbedtls_static_target} STATIC ${src_tls}) 200 set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls) 201 target_link_libraries(${mbedtls_static_target} PUBLIC ${libs} ${mbedx509_static_target}) 202endif(USE_STATIC_MBEDTLS_LIBRARY) 203 204if(USE_SHARED_MBEDTLS_LIBRARY) 205 set(CMAKE_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR}) 206 add_library(${mbedcrypto_target} SHARED ${src_crypto}) 207 set_target_properties(${mbedcrypto_target} PROPERTIES VERSION 2.28.7 SOVERSION 7) 208 target_link_libraries(${mbedcrypto_target} PUBLIC ${libs}) 209 210 add_library(${mbedx509_target} SHARED ${src_x509}) 211 set_target_properties(${mbedx509_target} PROPERTIES VERSION 2.28.7 SOVERSION 1) 212 target_link_libraries(${mbedx509_target} PUBLIC ${libs} ${mbedcrypto_target}) 213 214 add_library(${mbedtls_target} SHARED ${src_tls}) 215 set_target_properties(${mbedtls_target} PROPERTIES VERSION 2.28.7 SOVERSION 14) 216 target_link_libraries(${mbedtls_target} PUBLIC ${libs} ${mbedx509_target}) 217endif(USE_SHARED_MBEDTLS_LIBRARY) 218 219foreach(target IN LISTS target_libraries) 220 # Include public header files from /include and other directories 221 # declared by /3rdparty/**/CMakeLists.txt. Include private header files 222 # from /library and others declared by /3rdparty/**/CMakeLists.txt. 223 # /library needs to be listed explicitly when building .c files outside 224 # of /library (which currently means: under /3rdparty). 225 target_include_directories(${target} 226 PUBLIC ${MBEDTLS_DIR}/include/ 227 PUBLIC ${thirdparty_inc_public} 228 PRIVATE ${MBEDTLS_DIR}/library/ 229 PRIVATE ${thirdparty_inc}) 230 target_compile_definitions(${target} 231 PRIVATE ${thirdparty_def}) 232 # Pass-through MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE 233 if(MBEDTLS_CONFIG_FILE) 234 target_compile_definitions(${target} 235 PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}") 236 endif() 237 if(MBEDTLS_USER_CONFIG_FILE) 238 target_compile_definitions(${target} 239 PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}") 240 endif() 241 install(TARGETS ${target} 242 DESTINATION ${LIB_INSTALL_DIR} 243 PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) 244endforeach(target) 245 246set(lib_target "${MBEDTLS_TARGET_PREFIX}lib") 247 248add_custom_target(${lib_target} DEPENDS ${mbedcrypto_target} ${mbedx509_target} ${mbedtls_target}) 249if(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY) 250 add_dependencies(${lib_target} ${mbedcrypto_static_target} ${mbedx509_static_target} ${mbedtls_static_target}) 251endif() 252