xref: /aosp_15_r20/external/mbedtls/CMakeLists.txt (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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