Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / mbedtls / repo / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.6)
2 if(TEST_CPP)
3     project("mbed TLS" C CXX)
4 else()
5     project("mbed TLS" C)
6 endif()
7
8 set(MBEDTLS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
9
10 option(USE_PKCS11_HELPER_LIBRARY "Build mbed TLS with the pkcs11-helper library." OFF)
11 option(ENABLE_ZLIB_SUPPORT "Build mbed TLS with zlib library." OFF)
12
13 option(ENABLE_PROGRAMS "Build mbed TLS programs." ON)
14
15 option(UNSAFE_BUILD "Allow unsafe builds. These builds ARE NOT SECURE." OFF)
16
17 # export the submodule flag so that crypto knows it's being built as a submodule
18 set( USE_CRYPTO_SUBMODULE ON )
19
20 string(REGEX MATCH "Clang" CMAKE_COMPILER_IS_CLANG "${CMAKE_C_COMPILER_ID}")
21 string(REGEX MATCH "GNU" CMAKE_COMPILER_IS_GNU "${CMAKE_C_COMPILER_ID}")
22 string(REGEX MATCH "IAR" CMAKE_COMPILER_IS_IAR "${CMAKE_C_COMPILER_ID}")
23 string(REGEX MATCH "MSVC" CMAKE_COMPILER_IS_MSVC "${CMAKE_C_COMPILER_ID}")
24
25 # the test suites currently have compile errors with MSVC
26 if(CMAKE_COMPILER_IS_MSVC)
27     option(ENABLE_TESTING "Build mbed TLS tests." OFF)
28 else()
29     option(ENABLE_TESTING "Build mbed TLS tests." ON)
30 endif()
31
32 # Warning string - created as a list for compatibility with CMake 2.8
33 set(WARNING_BORDER "*******************************************************\n")
34 set(NULL_ENTROPY_WARN_L1 "****  WARNING!  MBEDTLS_TEST_NULL_ENTROPY defined!\n")
35 set(NULL_ENTROPY_WARN_L2 "****  THIS BUILD HAS NO DEFINED ENTROPY SOURCES\n")
36 set(NULL_ENTROPY_WARN_L3 "****  AND IS *NOT* SUITABLE FOR PRODUCTION USE\n")
37
38 set(NULL_ENTROPY_WARNING "${WARNING_BORDER}"
39                          "${NULL_ENTROPY_WARN_L1}"
40                          "${NULL_ENTROPY_WARN_L2}"
41                          "${NULL_ENTROPY_WARN_L3}"
42                          "${WARNING_BORDER}")
43
44 set(CTR_DRBG_128_BIT_KEY_WARN_L1 "****  WARNING!  MBEDTLS_CTR_DRBG_USE_128_BIT_KEY defined!\n")
45 set(CTR_DRBG_128_BIT_KEY_WARN_L2 "****  Using 128-bit keys for CTR_DRBG limits the security of generated\n")
46 set(CTR_DRBG_128_BIT_KEY_WARN_L3 "****  keys and operations that use random values generated to 128-bit security\n")
47
48 set(CTR_DRBG_128_BIT_KEY_WARNING "${WARNING_BORDER}"
49                          "${CTR_DRBG_128_BIT_KEY_WARN_L1}"
50                          "${CTR_DRBG_128_BIT_KEY_WARN_L2}"
51                          "${CTR_DRBG_128_BIT_KEY_WARN_L3}"
52                          "${WARNING_BORDER}")
53
54 find_package(PythonInterp)
55 find_package(Perl)
56 if(PERL_FOUND)
57
58     # If 128-bit keys are configured for CTR_DRBG, display an appropriate warning
59     execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/config.pl -f ${CMAKE_CURRENT_SOURCE_DIR}/include/mbedtls/config.h get MBEDTLS_CTR_DRBG_USE_128_BIT_KEY
60                         RESULT_VARIABLE result)
61     if(${result} EQUAL 0)
62         message(WARNING ${CTR_DRBG_128_BIT_KEY_WARNING})
63     endif()
64
65     # If NULL Entropy is configured, display an appropriate warning
66     execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/config.pl -f ${CMAKE_CURRENT_SOURCE_DIR}/include/mbedtls/config.h get MBEDTLS_TEST_NULL_ENTROPY
67                         RESULT_VARIABLE result)
68     if(${result} EQUAL 0)
69         message(WARNING ${NULL_ENTROPY_WARNING})
70
71         if(NOT UNSAFE_BUILD)
72             message(FATAL_ERROR "\
73 \n\
74 Warning! You have enabled MBEDTLS_TEST_NULL_ENTROPY. \
75 This option is not safe for production use and negates all security \
76 It is intended for development use only. \
77 \n\
78 To confirm you want to build with this option, re-run cmake with the \
79 option: \n\
80   cmake -DUNSAFE_BUILD=ON ")
81
82             return()
83         endif()
84     endif()
85 endif()
86
87 set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}
88     CACHE STRING "Choose the type of build: None Debug Release Coverage ASan ASanDbg MemSan MemSanDbg Check CheckFull"
89     FORCE)
90
91 # Create a symbolic link from ${base_name} in the binary directory
92 # to the corresponding path in the source directory.
93 function(link_to_source base_name)
94     # Get OS dependent path to use in `execute_process`
95     if (CMAKE_HOST_WIN32)
96         #mklink is an internal command of cmd.exe it can only work with \
97         string(REPLACE "/" "\\" link "${CMAKE_CURRENT_BINARY_DIR}/${base_name}")
98         string(REPLACE "/" "\\" target "${CMAKE_CURRENT_SOURCE_DIR}/${base_name}")
99     else()
100         set(link "${CMAKE_CURRENT_BINARY_DIR}/${base_name}")
101         set(target "${CMAKE_CURRENT_SOURCE_DIR}/${base_name}")
102     endif()
103
104     if (NOT EXISTS ${link})
105         if (CMAKE_HOST_UNIX)
106             set(command ln -s ${target} ${link})
107         else()
108             if (IS_DIRECTORY ${target})
109                 set(command cmd.exe /c mklink /j ${link} ${target})
110             else()
111                 set(command cmd.exe /c mklink /h ${link} ${target})
112             endif()
113         endif()
114
115         execute_process(COMMAND ${command}
116             RESULT_VARIABLE result
117             ERROR_VARIABLE output)
118
119         if (NOT ${result} EQUAL 0)
120             message(FATAL_ERROR "Could not create symbolic link for: ${target} --> ${output}")
121         endif()
122     endif()
123 endfunction(link_to_source)
124
125 string(REGEX MATCH "Clang" CMAKE_COMPILER_IS_CLANG "${CMAKE_C_COMPILER_ID}")
126
127 if(CMAKE_COMPILER_IS_GNU)
128     # some warnings we want are not available with old GCC versions
129     # note: starting with CMake 2.8 we could use CMAKE_C_COMPILER_VERSION
130     execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
131                     OUTPUT_VARIABLE GCC_VERSION)
132     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -W -Wdeclaration-after-statement -Wwrite-strings")
133     if (GCC_VERSION VERSION_GREATER 4.5 OR GCC_VERSION VERSION_EQUAL 4.5)
134         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wlogical-op")
135     endif()
136     if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
137         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow")
138     endif()
139     set(CMAKE_C_FLAGS_RELEASE     "-O2")
140     set(CMAKE_C_FLAGS_DEBUG       "-O0 -g3")
141     set(CMAKE_C_FLAGS_COVERAGE    "-O0 -g3 --coverage")
142     set(CMAKE_C_FLAGS_ASAN        "-Werror -fsanitize=address -fno-common -O3")
143     set(CMAKE_C_FLAGS_ASANDBG     "-Werror -fsanitize=address -fno-common -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls ")
144     set(CMAKE_C_FLAGS_CHECK       "-Werror -Os")
145     set(CMAKE_C_FLAGS_CHECKFULL   "${CMAKE_C_FLAGS_CHECK} -Wcast-qual")
146 endif(CMAKE_COMPILER_IS_GNU)
147
148 if(CMAKE_COMPILER_IS_CLANG)
149     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -W -Wdeclaration-after-statement -Wwrite-strings -Wpointer-arith -Wimplicit-fallthrough -Wshadow")
150     set(CMAKE_C_FLAGS_RELEASE     "-O2")
151     set(CMAKE_C_FLAGS_DEBUG       "-O0 -g3")
152     set(CMAKE_C_FLAGS_COVERAGE    "-O0 -g3 --coverage")
153     set(CMAKE_C_FLAGS_ASAN        "-Werror -fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O3")
154     set(CMAKE_C_FLAGS_ASANDBG     "-Werror -fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover=all -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls ")
155     set(CMAKE_C_FLAGS_MEMSAN      "-Werror -fsanitize=memory -O3")
156     set(CMAKE_C_FLAGS_MEMSANDBG   "-Werror -fsanitize=memory -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2")
157     set(CMAKE_C_FLAGS_CHECK       "-Werror -Os")
158 endif(CMAKE_COMPILER_IS_CLANG)
159
160 if(CMAKE_COMPILER_IS_IAR)
161     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --warn_about_c_style_casts --warnings_are_errors -Ohz")
162 endif(CMAKE_COMPILER_IS_IAR)
163
164 if(CMAKE_COMPILER_IS_MSVC)
165     # Strictest warnings, and treat as errors
166     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3")
167     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
168 endif(CMAKE_COMPILER_IS_MSVC)
169
170 if(CMAKE_BUILD_TYPE STREQUAL "Coverage")
171     if(CMAKE_COMPILER_IS_GNU OR CMAKE_COMPILER_IS_CLANG)
172         set(CMAKE_SHARED_LINKER_FLAGS "--coverage")
173     endif(CMAKE_COMPILER_IS_GNU OR CMAKE_COMPILER_IS_CLANG)
174 endif(CMAKE_BUILD_TYPE STREQUAL "Coverage")
175
176 if(LIB_INSTALL_DIR)
177 else()
178     set(LIB_INSTALL_DIR lib)
179 endif()
180
181 if(ENABLE_ZLIB_SUPPORT)
182     find_package(ZLIB)
183
184     if(ZLIB_FOUND)
185         include_directories(${ZLIB_INCLUDE_DIR})
186     endif(ZLIB_FOUND)
187 endif(ENABLE_ZLIB_SUPPORT)
188
189 add_subdirectory(library)
190 add_subdirectory(include)
191 add_subdirectory(crypto/library)
192 add_subdirectory(crypto/include)
193
194 if(ENABLE_PROGRAMS)
195     add_subdirectory(programs)
196 endif()
197
198 ADD_CUSTOM_TARGET(apidoc
199     COMMAND doxygen mbedtls.doxyfile
200     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen)
201
202 if(ENABLE_TESTING)
203     enable_testing()
204
205     add_subdirectory(tests)
206     add_subdirectory(crypto/tests)
207
208     # additional convenience targets for Unix only
209     if(UNIX)
210
211         ADD_CUSTOM_TARGET(covtest
212             COMMAND make test
213             COMMAND programs/test/selftest
214             COMMAND tests/compat.sh
215             COMMAND tests/ssl-opt.sh
216         )
217
218         ADD_CUSTOM_TARGET(lcov
219             COMMAND rm -rf Coverage
220             COMMAND lcov --capture --initial --directory library/CMakeFiles/mbedtls.dir -o files.info
221             COMMAND lcov --capture --directory library/CMakeFiles/mbedtls.dir -o tests.info
222             COMMAND lcov --add-tracefile files.info --add-tracefile tests.info -o all.info
223             COMMAND lcov --remove all.info -o final.info '*.h'
224             COMMAND gendesc tests/Descriptions.txt -o descriptions
225             COMMAND genhtml --title "mbed TLS" --description-file descriptions --keep-descriptions --legend --no-branch-coverage -o Coverage final.info
226             COMMAND rm -f files.info tests.info all.info final.info descriptions
227         )
228
229         ADD_CUSTOM_TARGET(memcheck
230             COMMAND sed -i.bak s+/usr/bin/valgrind+`which valgrind`+ DartConfiguration.tcl
231             COMMAND ctest -O memcheck.log -D ExperimentalMemCheck
232             COMMAND tail -n1 memcheck.log | grep 'Memory checking results:' > /dev/null
233             COMMAND rm -f memcheck.log
234             COMMAND mv DartConfiguration.tcl.bak DartConfiguration.tcl
235         )
236     endif(UNIX)
237
238     # Make scripts needed for testing available in an out-of-source build.
239     if (NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
240         link_to_source(scripts)
241         # Copy (don't link) DartConfiguration.tcl, needed for memcheck, to
242         # keep things simple with the sed commands in the memcheck target.
243         configure_file(${CMAKE_CURRENT_SOURCE_DIR}/DartConfiguration.tcl
244                     ${CMAKE_CURRENT_BINARY_DIR}/DartConfiguration.tcl COPYONLY)
245     endif()
246 endif()