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