1*62c56f98SSadaf Ebrahimi# 2*62c56f98SSadaf Ebrahimi# CMake build system design considerations: 3*62c56f98SSadaf Ebrahimi# 4*62c56f98SSadaf Ebrahimi# - Include directories: 5*62c56f98SSadaf Ebrahimi# + Do not define include directories globally using the include_directories 6*62c56f98SSadaf Ebrahimi# command but rather at the target level using the 7*62c56f98SSadaf Ebrahimi# target_include_directories command. That way, it is easier to guarantee 8*62c56f98SSadaf Ebrahimi# that targets are built using the proper list of include directories. 9*62c56f98SSadaf Ebrahimi# + Use the PUBLIC and PRIVATE keywords to specify the scope of include 10*62c56f98SSadaf Ebrahimi# directories. That way, a target linking to a library (using the 11*62c56f98SSadaf Ebrahimi# target_link_libraries command) inherits from the library PUBLIC include 12*62c56f98SSadaf Ebrahimi# directories and not from the PRIVATE ones. 13*62c56f98SSadaf Ebrahimi# - MBEDTLS_TARGET_PREFIX: CMake targets are designed to be alterable by calling 14*62c56f98SSadaf Ebrahimi# CMake in order to avoid target name clashes, via the use of 15*62c56f98SSadaf Ebrahimi# MBEDTLS_TARGET_PREFIX. The value of this variable is prefixed to the 16*62c56f98SSadaf Ebrahimi# mbedtls, mbedx509, mbedcrypto and apidoc targets. 17*62c56f98SSadaf Ebrahimi# 18*62c56f98SSadaf Ebrahimi 19*62c56f98SSadaf Ebrahimi# We specify a minimum requirement of 3.10.2, but for now use 3.5.1 here 20*62c56f98SSadaf Ebrahimi# until our infrastructure catches up. 21*62c56f98SSadaf Ebrahimicmake_minimum_required(VERSION 3.5.1) 22*62c56f98SSadaf Ebrahimi 23*62c56f98SSadaf Ebrahimiinclude(CMakePackageConfigHelpers) 24*62c56f98SSadaf Ebrahimi 25*62c56f98SSadaf Ebrahimi# https://cmake.org/cmake/help/latest/policy/CMP0011.html 26*62c56f98SSadaf Ebrahimi# Setting this policy is required in CMake >= 3.18.0, otherwise a warning is generated. The OLD 27*62c56f98SSadaf Ebrahimi# policy setting is deprecated, and will be removed in future versions. 28*62c56f98SSadaf Ebrahimicmake_policy(SET CMP0011 NEW) 29*62c56f98SSadaf Ebrahimi# https://cmake.org/cmake/help/latest/policy/CMP0012.html 30*62c56f98SSadaf Ebrahimi# Setting the CMP0012 policy to NEW is required for FindPython3 to work with CMake 3.18.2 31*62c56f98SSadaf Ebrahimi# (there is a bug in this particular version), otherwise, setting the CMP0012 policy is required 32*62c56f98SSadaf Ebrahimi# for CMake versions >= 3.18.3 otherwise a deprecated warning is generated. The OLD policy setting 33*62c56f98SSadaf Ebrahimi# is deprecated and will be removed in future versions. 34*62c56f98SSadaf Ebrahimicmake_policy(SET CMP0012 NEW) 35*62c56f98SSadaf Ebrahimi 36*62c56f98SSadaf Ebrahimiif(TEST_CPP) 37*62c56f98SSadaf Ebrahimi project("Mbed TLS" LANGUAGES C CXX) 38*62c56f98SSadaf Ebrahimielse() 39*62c56f98SSadaf Ebrahimi project("Mbed TLS" LANGUAGES C) 40*62c56f98SSadaf Ebrahimiendif() 41*62c56f98SSadaf Ebrahimi 42*62c56f98SSadaf Ebrahimiinclude(GNUInstallDirs) 43*62c56f98SSadaf Ebrahimi 44*62c56f98SSadaf Ebrahimi# Determine if Mbed TLS is being built as a subproject using add_subdirectory() 45*62c56f98SSadaf Ebrahimiif(NOT DEFINED MBEDTLS_AS_SUBPROJECT) 46*62c56f98SSadaf Ebrahimi set(MBEDTLS_AS_SUBPROJECT ON) 47*62c56f98SSadaf Ebrahimi if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) 48*62c56f98SSadaf Ebrahimi set(MBEDTLS_AS_SUBPROJECT OFF) 49*62c56f98SSadaf Ebrahimi endif() 50*62c56f98SSadaf Ebrahimiendif() 51*62c56f98SSadaf Ebrahimi 52*62c56f98SSadaf Ebrahimi# Set the project root directory. 53*62c56f98SSadaf Ebrahimiset(MBEDTLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 54*62c56f98SSadaf Ebrahimi 55*62c56f98SSadaf Ebrahimioption(ENABLE_PROGRAMS "Build Mbed TLS programs." ON) 56*62c56f98SSadaf Ebrahimi 57*62c56f98SSadaf Ebrahimioption(UNSAFE_BUILD "Allow unsafe builds. These builds ARE NOT SECURE." OFF) 58*62c56f98SSadaf Ebrahimioption(MBEDTLS_FATAL_WARNINGS "Compiler warnings treated as errors" ON) 59*62c56f98SSadaf Ebrahimiif(CMAKE_HOST_WIN32) 60*62c56f98SSadaf Ebrahimi # N.B. The comment on the next line is significant! If you change it, 61*62c56f98SSadaf Ebrahimi # edit the sed command in prepare_release.sh that modifies 62*62c56f98SSadaf Ebrahimi # CMakeLists.txt. 63*62c56f98SSadaf Ebrahimi option(GEN_FILES "Generate the auto-generated files as needed" OFF) # off in development 64*62c56f98SSadaf Ebrahimielse() 65*62c56f98SSadaf Ebrahimi option(GEN_FILES "Generate the auto-generated files as needed" OFF) 66*62c56f98SSadaf Ebrahimiendif() 67*62c56f98SSadaf Ebrahimi 68*62c56f98SSadaf Ebrahimioption(DISABLE_PACKAGE_CONFIG_AND_INSTALL "Disable package configuration, target export and installation" ${MBEDTLS_AS_SUBPROJECT}) 69*62c56f98SSadaf Ebrahimi 70*62c56f98SSadaf Ebrahimistring(REGEX MATCH "Clang" CMAKE_COMPILER_IS_CLANG "${CMAKE_C_COMPILER_ID}") 71*62c56f98SSadaf Ebrahimistring(REGEX MATCH "GNU" CMAKE_COMPILER_IS_GNU "${CMAKE_C_COMPILER_ID}") 72*62c56f98SSadaf Ebrahimistring(REGEX MATCH "IAR" CMAKE_COMPILER_IS_IAR "${CMAKE_C_COMPILER_ID}") 73*62c56f98SSadaf Ebrahimistring(REGEX MATCH "MSVC" CMAKE_COMPILER_IS_MSVC "${CMAKE_C_COMPILER_ID}") 74*62c56f98SSadaf Ebrahimi 75*62c56f98SSadaf Ebrahimi# the test suites currently have compile errors with MSVC 76*62c56f98SSadaf Ebrahimiif(CMAKE_COMPILER_IS_MSVC) 77*62c56f98SSadaf Ebrahimi option(ENABLE_TESTING "Build Mbed TLS tests." OFF) 78*62c56f98SSadaf Ebrahimielse() 79*62c56f98SSadaf Ebrahimi option(ENABLE_TESTING "Build Mbed TLS tests." ON) 80*62c56f98SSadaf Ebrahimiendif() 81*62c56f98SSadaf Ebrahimi 82*62c56f98SSadaf Ebrahimi# Warning string - created as a list for compatibility with CMake 2.8 83*62c56f98SSadaf Ebrahimiset(CTR_DRBG_128_BIT_KEY_WARN_L1 "**** WARNING! MBEDTLS_CTR_DRBG_USE_128_BIT_KEY defined!\n") 84*62c56f98SSadaf Ebrahimiset(CTR_DRBG_128_BIT_KEY_WARN_L2 "**** Using 128-bit keys for CTR_DRBG limits the security of generated\n") 85*62c56f98SSadaf Ebrahimiset(CTR_DRBG_128_BIT_KEY_WARN_L3 "**** keys and operations that use random values generated to 128-bit security\n") 86*62c56f98SSadaf Ebrahimi 87*62c56f98SSadaf Ebrahimiset(CTR_DRBG_128_BIT_KEY_WARNING "${WARNING_BORDER}" 88*62c56f98SSadaf Ebrahimi "${CTR_DRBG_128_BIT_KEY_WARN_L1}" 89*62c56f98SSadaf Ebrahimi "${CTR_DRBG_128_BIT_KEY_WARN_L2}" 90*62c56f98SSadaf Ebrahimi "${CTR_DRBG_128_BIT_KEY_WARN_L3}" 91*62c56f98SSadaf Ebrahimi "${WARNING_BORDER}") 92*62c56f98SSadaf Ebrahimi 93*62c56f98SSadaf Ebrahimi# Python 3 is only needed here to check for configuration warnings. 94*62c56f98SSadaf Ebrahimiif(NOT CMAKE_VERSION VERSION_LESS 3.15.0) 95*62c56f98SSadaf Ebrahimi set(Python3_FIND_STRATEGY LOCATION) 96*62c56f98SSadaf Ebrahimi find_package(Python3 COMPONENTS Interpreter) 97*62c56f98SSadaf Ebrahimi if(Python3_Interpreter_FOUND) 98*62c56f98SSadaf Ebrahimi set(MBEDTLS_PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) 99*62c56f98SSadaf Ebrahimi endif() 100*62c56f98SSadaf Ebrahimielse() 101*62c56f98SSadaf Ebrahimi find_package(PythonInterp 3) 102*62c56f98SSadaf Ebrahimi if(PYTHONINTERP_FOUND) 103*62c56f98SSadaf Ebrahimi set(MBEDTLS_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) 104*62c56f98SSadaf Ebrahimi endif() 105*62c56f98SSadaf Ebrahimiendif() 106*62c56f98SSadaf Ebrahimiif(MBEDTLS_PYTHON_EXECUTABLE) 107*62c56f98SSadaf Ebrahimi 108*62c56f98SSadaf Ebrahimi # If 128-bit keys are configured for CTR_DRBG, display an appropriate warning 109*62c56f98SSadaf Ebrahimi execute_process(COMMAND ${MBEDTLS_PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/config.py -f ${CMAKE_CURRENT_SOURCE_DIR}/include/mbedtls/mbedtls_config.h get MBEDTLS_CTR_DRBG_USE_128_BIT_KEY 110*62c56f98SSadaf Ebrahimi RESULT_VARIABLE result) 111*62c56f98SSadaf Ebrahimi if(${result} EQUAL 0) 112*62c56f98SSadaf Ebrahimi message(WARNING ${CTR_DRBG_128_BIT_KEY_WARNING}) 113*62c56f98SSadaf Ebrahimi endif() 114*62c56f98SSadaf Ebrahimi 115*62c56f98SSadaf Ebrahimiendif() 116*62c56f98SSadaf Ebrahimi 117*62c56f98SSadaf Ebrahimi# If this is the root project add longer list of available CMAKE_BUILD_TYPE values 118*62c56f98SSadaf Ebrahimiif(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) 119*62c56f98SSadaf Ebrahimi set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} 120*62c56f98SSadaf Ebrahimi CACHE STRING "Choose the type of build: None Debug Release Coverage ASan ASanDbg MemSan MemSanDbg Check CheckFull" 121*62c56f98SSadaf Ebrahimi FORCE) 122*62c56f98SSadaf Ebrahimiendif() 123*62c56f98SSadaf Ebrahimi 124*62c56f98SSadaf Ebrahimi# Make MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE into PATHs 125*62c56f98SSadaf Ebrahimiset(MBEDTLS_CONFIG_FILE "" CACHE FILEPATH "Mbed TLS config file (overrides default).") 126*62c56f98SSadaf Ebrahimiset(MBEDTLS_USER_CONFIG_FILE "" CACHE FILEPATH "Mbed TLS user config file (appended to default).") 127*62c56f98SSadaf Ebrahimi 128*62c56f98SSadaf Ebrahimi# Create a symbolic link from ${base_name} in the binary directory 129*62c56f98SSadaf Ebrahimi# to the corresponding path in the source directory. 130*62c56f98SSadaf Ebrahimi# Note: Copies the file(s) on Windows. 131*62c56f98SSadaf Ebrahimifunction(link_to_source base_name) 132*62c56f98SSadaf Ebrahimi set(link "${CMAKE_CURRENT_BINARY_DIR}/${base_name}") 133*62c56f98SSadaf Ebrahimi set(target "${CMAKE_CURRENT_SOURCE_DIR}/${base_name}") 134*62c56f98SSadaf Ebrahimi 135*62c56f98SSadaf Ebrahimi # Linking to non-existent file is not desirable. At best you will have a 136*62c56f98SSadaf Ebrahimi # dangling link, but when building in tree, this can create a symbolic link 137*62c56f98SSadaf Ebrahimi # to itself. 138*62c56f98SSadaf Ebrahimi if (EXISTS ${target} AND NOT EXISTS ${link}) 139*62c56f98SSadaf Ebrahimi if (CMAKE_HOST_UNIX) 140*62c56f98SSadaf Ebrahimi execute_process(COMMAND ln -s ${target} ${link} 141*62c56f98SSadaf Ebrahimi RESULT_VARIABLE result 142*62c56f98SSadaf Ebrahimi ERROR_VARIABLE output) 143*62c56f98SSadaf Ebrahimi 144*62c56f98SSadaf Ebrahimi if (NOT ${result} EQUAL 0) 145*62c56f98SSadaf Ebrahimi message(FATAL_ERROR "Could not create symbolic link for: ${target} --> ${output}") 146*62c56f98SSadaf Ebrahimi endif() 147*62c56f98SSadaf Ebrahimi else() 148*62c56f98SSadaf Ebrahimi if (IS_DIRECTORY ${target}) 149*62c56f98SSadaf Ebrahimi file(GLOB_RECURSE files FOLLOW_SYMLINKS LIST_DIRECTORIES false RELATIVE ${target} "${target}/*") 150*62c56f98SSadaf Ebrahimi foreach(file IN LISTS files) 151*62c56f98SSadaf Ebrahimi configure_file("${target}/${file}" "${link}/${file}" COPYONLY) 152*62c56f98SSadaf Ebrahimi endforeach(file) 153*62c56f98SSadaf Ebrahimi else() 154*62c56f98SSadaf Ebrahimi configure_file(${target} ${link} COPYONLY) 155*62c56f98SSadaf Ebrahimi endif() 156*62c56f98SSadaf Ebrahimi endif() 157*62c56f98SSadaf Ebrahimi endif() 158*62c56f98SSadaf Ebrahimiendfunction(link_to_source) 159*62c56f98SSadaf Ebrahimi 160*62c56f98SSadaf Ebrahimi# Get the filename without the final extension (i.e. convert "a.b.c" to "a.b") 161*62c56f98SSadaf Ebrahimifunction(get_name_without_last_ext dest_var full_name) 162*62c56f98SSadaf Ebrahimi # Split into a list on '.' (but a cmake list is just a ';'-separated string) 163*62c56f98SSadaf Ebrahimi string(REPLACE "." ";" ext_parts "${full_name}") 164*62c56f98SSadaf Ebrahimi # Remove the last item if there are more than one 165*62c56f98SSadaf Ebrahimi list(LENGTH ext_parts ext_parts_len) 166*62c56f98SSadaf Ebrahimi if (${ext_parts_len} GREATER "1") 167*62c56f98SSadaf Ebrahimi math(EXPR ext_parts_last_item "${ext_parts_len} - 1") 168*62c56f98SSadaf Ebrahimi list(REMOVE_AT ext_parts ${ext_parts_last_item}) 169*62c56f98SSadaf Ebrahimi endif() 170*62c56f98SSadaf Ebrahimi # Convert back to a string by replacing separators with '.' 171*62c56f98SSadaf Ebrahimi string(REPLACE ";" "." no_ext_name "${ext_parts}") 172*62c56f98SSadaf Ebrahimi # Copy into the desired variable 173*62c56f98SSadaf Ebrahimi set(${dest_var} ${no_ext_name} PARENT_SCOPE) 174*62c56f98SSadaf Ebrahimiendfunction(get_name_without_last_ext) 175*62c56f98SSadaf Ebrahimi 176*62c56f98SSadaf Ebrahimistring(REGEX MATCH "Clang" CMAKE_COMPILER_IS_CLANG "${CMAKE_C_COMPILER_ID}") 177*62c56f98SSadaf Ebrahimi 178*62c56f98SSadaf Ebrahimiinclude(CheckCCompilerFlag) 179*62c56f98SSadaf Ebrahimi 180*62c56f98SSadaf Ebrahimiset(CMAKE_C_EXTENSIONS OFF) 181*62c56f98SSadaf Ebrahimiset(CMAKE_C_STANDARD 99) 182*62c56f98SSadaf Ebrahimi 183*62c56f98SSadaf Ebrahimiif(CMAKE_COMPILER_IS_GNU) 184*62c56f98SSadaf Ebrahimi # some warnings we want are not available with old GCC versions 185*62c56f98SSadaf Ebrahimi # note: starting with CMake 2.8 we could use CMAKE_C_COMPILER_VERSION 186*62c56f98SSadaf Ebrahimi execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion 187*62c56f98SSadaf Ebrahimi OUTPUT_VARIABLE GCC_VERSION) 188*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wwrite-strings") 189*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 3.0 OR GCC_VERSION VERSION_EQUAL 3.0) 190*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat=2 -Wno-format-nonliteral") 191*62c56f98SSadaf Ebrahimi endif() 192*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 4.3 OR GCC_VERSION VERSION_EQUAL 4.3) 193*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wvla") 194*62c56f98SSadaf Ebrahimi endif() 195*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 4.5 OR GCC_VERSION VERSION_EQUAL 4.5) 196*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wlogical-op") 197*62c56f98SSadaf Ebrahimi endif() 198*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8) 199*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") 200*62c56f98SSadaf Ebrahimi endif() 201*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 5.0) 202*62c56f98SSadaf Ebrahimi CHECK_C_COMPILER_FLAG("-Wformat-signedness" C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS) 203*62c56f98SSadaf Ebrahimi if(C_COMPILER_SUPPORTS_WFORMAT_SIGNEDNESS) 204*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-signedness") 205*62c56f98SSadaf Ebrahimi endif() 206*62c56f98SSadaf Ebrahimi endif() 207*62c56f98SSadaf Ebrahimi if (GCC_VERSION VERSION_GREATER 7.0 OR GCC_VERSION VERSION_EQUAL 7.0) 208*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat-overflow=2 -Wformat-truncation") 209*62c56f98SSadaf Ebrahimi endif() 210*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_RELEASE "-O2") 211*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") 212*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_COVERAGE "-O0 -g3 --coverage") 213*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASAN "-fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O3") 214*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASANDBG "-fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls") 215*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_CHECK "-Os") 216*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_CHECKFULL "${CMAKE_C_FLAGS_CHECK} -Wcast-qual") 217*62c56f98SSadaf Ebrahimiendif(CMAKE_COMPILER_IS_GNU) 218*62c56f98SSadaf Ebrahimi 219*62c56f98SSadaf Ebrahimiif(CMAKE_COMPILER_IS_CLANG) 220*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wwrite-strings -Wpointer-arith -Wimplicit-fallthrough -Wshadow -Wvla -Wformat=2 -Wno-format-nonliteral") 221*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_RELEASE "-O2") 222*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") 223*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_COVERAGE "-O0 -g3 --coverage") 224*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASAN "-fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O3") 225*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASANDBG "-fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls") 226*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_MEMSAN "-fsanitize=memory -O3") 227*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_MEMSANDBG "-fsanitize=memory -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2") 228*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_CHECK "-Os") 229*62c56f98SSadaf Ebrahimiendif(CMAKE_COMPILER_IS_CLANG) 230*62c56f98SSadaf Ebrahimi 231*62c56f98SSadaf Ebrahimiif(CMAKE_COMPILER_IS_IAR) 232*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --warn_about_c_style_casts") 233*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_RELEASE "-Ohz") 234*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_DEBUG "--debug -On") 235*62c56f98SSadaf Ebrahimiendif(CMAKE_COMPILER_IS_IAR) 236*62c56f98SSadaf Ebrahimi 237*62c56f98SSadaf Ebrahimiif(CMAKE_COMPILER_IS_MSVC) 238*62c56f98SSadaf Ebrahimi # Strictest warnings, UTF-8 source and execution charset 239*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /utf-8") 240*62c56f98SSadaf Ebrahimiendif(CMAKE_COMPILER_IS_MSVC) 241*62c56f98SSadaf Ebrahimi 242*62c56f98SSadaf Ebrahimiif(MBEDTLS_FATAL_WARNINGS) 243*62c56f98SSadaf Ebrahimi if(CMAKE_COMPILER_IS_MSVC) 244*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX") 245*62c56f98SSadaf Ebrahimi endif(CMAKE_COMPILER_IS_MSVC) 246*62c56f98SSadaf Ebrahimi 247*62c56f98SSadaf Ebrahimi if(CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNU) 248*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") 249*62c56f98SSadaf Ebrahimi if(UNSAFE_BUILD) 250*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-error=cpp") 251*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_ASAN} -Wno-error=cpp") 252*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS_ASANDBG "${CMAKE_C_FLAGS_ASANDBG} -Wno-error=cpp") 253*62c56f98SSadaf Ebrahimi endif(UNSAFE_BUILD) 254*62c56f98SSadaf Ebrahimi endif(CMAKE_COMPILER_IS_CLANG OR CMAKE_COMPILER_IS_GNU) 255*62c56f98SSadaf Ebrahimi 256*62c56f98SSadaf Ebrahimi if (CMAKE_COMPILER_IS_IAR) 257*62c56f98SSadaf Ebrahimi set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --warnings_are_errors") 258*62c56f98SSadaf Ebrahimi endif(CMAKE_COMPILER_IS_IAR) 259*62c56f98SSadaf Ebrahimiendif(MBEDTLS_FATAL_WARNINGS) 260*62c56f98SSadaf Ebrahimi 261*62c56f98SSadaf Ebrahimiif(CMAKE_BUILD_TYPE STREQUAL "Coverage") 262*62c56f98SSadaf Ebrahimi if(CMAKE_COMPILER_IS_GNU OR CMAKE_COMPILER_IS_CLANG) 263*62c56f98SSadaf Ebrahimi set(CMAKE_SHARED_LINKER_FLAGS "--coverage") 264*62c56f98SSadaf Ebrahimi endif(CMAKE_COMPILER_IS_GNU OR CMAKE_COMPILER_IS_CLANG) 265*62c56f98SSadaf Ebrahimiendif(CMAKE_BUILD_TYPE STREQUAL "Coverage") 266*62c56f98SSadaf Ebrahimi 267*62c56f98SSadaf Ebrahimiif(LIB_INSTALL_DIR) 268*62c56f98SSadaf Ebrahimi set(CMAKE_INSTALL_LIBDIR "${LIB_INSTALL_DIR}") 269*62c56f98SSadaf Ebrahimiendif() 270*62c56f98SSadaf Ebrahimi 271*62c56f98SSadaf Ebrahimiadd_subdirectory(include) 272*62c56f98SSadaf Ebrahimi 273*62c56f98SSadaf Ebrahimiadd_subdirectory(3rdparty) 274*62c56f98SSadaf Ebrahimi 275*62c56f98SSadaf Ebrahimiadd_subdirectory(library) 276*62c56f98SSadaf Ebrahimi 277*62c56f98SSadaf Ebrahimi# 278*62c56f98SSadaf Ebrahimi# The C files in tests/src directory contain test code shared among test suites 279*62c56f98SSadaf Ebrahimi# and programs. This shared test code is compiled and linked to test suites and 280*62c56f98SSadaf Ebrahimi# programs objects as a set of compiled objects. The compiled objects are NOT 281*62c56f98SSadaf Ebrahimi# built into a library that the test suite and program objects would link 282*62c56f98SSadaf Ebrahimi# against as they link against the mbedcrypto, mbedx509 and mbedtls libraries. 283*62c56f98SSadaf Ebrahimi# The reason is that such library is expected to have mutual dependencies with 284*62c56f98SSadaf Ebrahimi# the aforementioned libraries and that there is as of today no portable way of 285*62c56f98SSadaf Ebrahimi# handling such dependencies (only toolchain specific solutions). 286*62c56f98SSadaf Ebrahimi# 287*62c56f98SSadaf Ebrahimi# Thus the below definition of the `mbedtls_test` CMake library of objects 288*62c56f98SSadaf Ebrahimi# target. This library of objects is used by tests and programs CMake files 289*62c56f98SSadaf Ebrahimi# to define the test executables. 290*62c56f98SSadaf Ebrahimi# 291*62c56f98SSadaf Ebrahimiif(ENABLE_TESTING OR ENABLE_PROGRAMS) 292*62c56f98SSadaf Ebrahimi file(GLOB MBEDTLS_TEST_FILES 293*62c56f98SSadaf Ebrahimi ${CMAKE_CURRENT_SOURCE_DIR}/tests/src/*.c 294*62c56f98SSadaf Ebrahimi ${CMAKE_CURRENT_SOURCE_DIR}/tests/src/drivers/*.c) 295*62c56f98SSadaf Ebrahimi add_library(mbedtls_test OBJECT ${MBEDTLS_TEST_FILES}) 296*62c56f98SSadaf Ebrahimi target_include_directories(mbedtls_test 297*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests/include 298*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include 299*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/library) 300*62c56f98SSadaf Ebrahimi 301*62c56f98SSadaf Ebrahimi file(GLOB MBEDTLS_TEST_HELPER_FILES 302*62c56f98SSadaf Ebrahimi ${CMAKE_CURRENT_SOURCE_DIR}/tests/src/test_helpers/*.c) 303*62c56f98SSadaf Ebrahimi add_library(mbedtls_test_helpers OBJECT ${MBEDTLS_TEST_HELPER_FILES}) 304*62c56f98SSadaf Ebrahimi target_include_directories(mbedtls_test_helpers 305*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests/include 306*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include 307*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/library 308*62c56f98SSadaf Ebrahimi PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/everest/include) 309*62c56f98SSadaf Ebrahimi 310*62c56f98SSadaf Ebrahimi # Pass-through MBEDTLS_CONFIG_FILE and MBEDTLS_USER_CONFIG_FILE 311*62c56f98SSadaf Ebrahimi if(MBEDTLS_CONFIG_FILE) 312*62c56f98SSadaf Ebrahimi target_compile_definitions(mbedtls_test 313*62c56f98SSadaf Ebrahimi PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}") 314*62c56f98SSadaf Ebrahimi target_compile_definitions(mbedtls_test_helpers 315*62c56f98SSadaf Ebrahimi PUBLIC MBEDTLS_CONFIG_FILE="${MBEDTLS_CONFIG_FILE}") 316*62c56f98SSadaf Ebrahimi endif() 317*62c56f98SSadaf Ebrahimi if(MBEDTLS_USER_CONFIG_FILE) 318*62c56f98SSadaf Ebrahimi target_compile_definitions(mbedtls_test 319*62c56f98SSadaf Ebrahimi PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}") 320*62c56f98SSadaf Ebrahimi target_compile_definitions(mbedtls_test_helpers 321*62c56f98SSadaf Ebrahimi PUBLIC MBEDTLS_USER_CONFIG_FILE="${MBEDTLS_USER_CONFIG_FILE}") 322*62c56f98SSadaf Ebrahimi endif() 323*62c56f98SSadaf Ebrahimiendif() 324*62c56f98SSadaf Ebrahimi 325*62c56f98SSadaf Ebrahimiif(ENABLE_PROGRAMS) 326*62c56f98SSadaf Ebrahimi add_subdirectory(programs) 327*62c56f98SSadaf Ebrahimiendif() 328*62c56f98SSadaf Ebrahimi 329*62c56f98SSadaf EbrahimiADD_CUSTOM_TARGET(${MBEDTLS_TARGET_PREFIX}apidoc 330*62c56f98SSadaf Ebrahimi COMMAND doxygen mbedtls.doxyfile 331*62c56f98SSadaf Ebrahimi WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen) 332*62c56f98SSadaf Ebrahimi 333*62c56f98SSadaf Ebrahimiif(ENABLE_TESTING) 334*62c56f98SSadaf Ebrahimi enable_testing() 335*62c56f98SSadaf Ebrahimi 336*62c56f98SSadaf Ebrahimi add_subdirectory(tests) 337*62c56f98SSadaf Ebrahimi 338*62c56f98SSadaf Ebrahimi # additional convenience targets for Unix only 339*62c56f98SSadaf Ebrahimi if(UNIX) 340*62c56f98SSadaf Ebrahimi 341*62c56f98SSadaf Ebrahimi # For coverage testing: 342*62c56f98SSadaf Ebrahimi # 1. Build with: 343*62c56f98SSadaf Ebrahimi # cmake -D CMAKE_BUILD_TYPE=Coverage /path/to/source && make 344*62c56f98SSadaf Ebrahimi # 2. Run the relevant tests for the part of the code you're interested in. 345*62c56f98SSadaf Ebrahimi # For the reference coverage measurement, see 346*62c56f98SSadaf Ebrahimi # tests/scripts/basic-build-test.sh 347*62c56f98SSadaf Ebrahimi # 3. Run scripts/lcov.sh to generate an HTML report. 348*62c56f98SSadaf Ebrahimi ADD_CUSTOM_TARGET(lcov 349*62c56f98SSadaf Ebrahimi COMMAND scripts/lcov.sh 350*62c56f98SSadaf Ebrahimi ) 351*62c56f98SSadaf Ebrahimi 352*62c56f98SSadaf Ebrahimi ADD_CUSTOM_TARGET(memcheck 353*62c56f98SSadaf Ebrahimi COMMAND sed -i.bak s+/usr/bin/valgrind+`which valgrind`+ DartConfiguration.tcl 354*62c56f98SSadaf Ebrahimi COMMAND ctest -O memcheck.log -D ExperimentalMemCheck 355*62c56f98SSadaf Ebrahimi COMMAND tail -n1 memcheck.log | grep 'Memory checking results:' > /dev/null 356*62c56f98SSadaf Ebrahimi COMMAND rm -f memcheck.log 357*62c56f98SSadaf Ebrahimi COMMAND mv DartConfiguration.tcl.bak DartConfiguration.tcl 358*62c56f98SSadaf Ebrahimi ) 359*62c56f98SSadaf Ebrahimi endif(UNIX) 360*62c56f98SSadaf Ebrahimi 361*62c56f98SSadaf Ebrahimi # Make scripts needed for testing available in an out-of-source build. 362*62c56f98SSadaf Ebrahimi if (NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) 363*62c56f98SSadaf Ebrahimi link_to_source(scripts) 364*62c56f98SSadaf Ebrahimi # Copy (don't link) DartConfiguration.tcl, needed for memcheck, to 365*62c56f98SSadaf Ebrahimi # keep things simple with the sed commands in the memcheck target. 366*62c56f98SSadaf Ebrahimi configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DartConfiguration.tcl 367*62c56f98SSadaf Ebrahimi ${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl COPYONLY) 368*62c56f98SSadaf Ebrahimi endif() 369*62c56f98SSadaf Ebrahimiendif() 370*62c56f98SSadaf Ebrahimi 371*62c56f98SSadaf Ebrahimiif(NOT DISABLE_PACKAGE_CONFIG_AND_INSTALL) 372*62c56f98SSadaf Ebrahimi configure_package_config_file( 373*62c56f98SSadaf Ebrahimi "cmake/MbedTLSConfig.cmake.in" 374*62c56f98SSadaf Ebrahimi "cmake/MbedTLSConfig.cmake" 375*62c56f98SSadaf Ebrahimi INSTALL_DESTINATION "cmake") 376*62c56f98SSadaf Ebrahimi 377*62c56f98SSadaf Ebrahimi write_basic_package_version_file( 378*62c56f98SSadaf Ebrahimi "cmake/MbedTLSConfigVersion.cmake" 379*62c56f98SSadaf Ebrahimi COMPATIBILITY SameMajorVersion 380*62c56f98SSadaf Ebrahimi VERSION 3.5.2) 381*62c56f98SSadaf Ebrahimi 382*62c56f98SSadaf Ebrahimi install( 383*62c56f98SSadaf Ebrahimi FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/MbedTLSConfig.cmake" 384*62c56f98SSadaf Ebrahimi "${CMAKE_CURRENT_BINARY_DIR}/cmake/MbedTLSConfigVersion.cmake" 385*62c56f98SSadaf Ebrahimi DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MbedTLS") 386*62c56f98SSadaf Ebrahimi 387*62c56f98SSadaf Ebrahimi export( 388*62c56f98SSadaf Ebrahimi EXPORT MbedTLSTargets 389*62c56f98SSadaf Ebrahimi NAMESPACE MbedTLS:: 390*62c56f98SSadaf Ebrahimi FILE "cmake/MbedTLSTargets.cmake") 391*62c56f98SSadaf Ebrahimi 392*62c56f98SSadaf Ebrahimi install( 393*62c56f98SSadaf Ebrahimi EXPORT MbedTLSTargets 394*62c56f98SSadaf Ebrahimi NAMESPACE MbedTLS:: 395*62c56f98SSadaf Ebrahimi DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MbedTLS" 396*62c56f98SSadaf Ebrahimi FILE "MbedTLSTargets.cmake") 397*62c56f98SSadaf Ebrahimi 398*62c56f98SSadaf Ebrahimi if(CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15) 399*62c56f98SSadaf Ebrahimi # Do not export the package by default 400*62c56f98SSadaf Ebrahimi cmake_policy(SET CMP0090 NEW) 401*62c56f98SSadaf Ebrahimi 402*62c56f98SSadaf Ebrahimi # Make this package visible to the system 403*62c56f98SSadaf Ebrahimi export(PACKAGE MbedTLS) 404*62c56f98SSadaf Ebrahimi endif() 405*62c56f98SSadaf Ebrahimiendif() 406