-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
225 lines (197 loc) · 7.37 KB
/
CMakeLists.txt
File metadata and controls
225 lines (197 loc) · 7.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
cmake_minimum_required(VERSION 3.20)
project(crypto_cpp_demos LANGUAGES C CXX)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(BUILD_OUTPUT_ROOT ${CMAKE_SOURCE_DIR}/build)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BUILD_OUTPUT_ROOT}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BUILD_OUTPUT_ROOT}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BUILD_OUTPUT_ROOT}/lib)
if(CMAKE_CONFIGURATION_TYPES)
foreach(config ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${config} CONFIG_UPPER)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${BUILD_OUTPUT_ROOT}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${BUILD_OUTPUT_ROOT}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG_UPPER} ${BUILD_OUTPUT_ROOT}/lib)
endforeach()
endif()
include(CheckIncludeFile)
include(CheckSymbolExists)
find_package(PkgConfig QUIET)
find_package(OpenSSL QUIET)
find_package(GnuTLS QUIET)
find_package(JNI QUIET)
if(PkgConfig_FOUND)
pkg_check_modules(LIBSODIUM QUIET libsodium)
pkg_check_modules(MBEDTLS QUIET mbedtls mbedcrypto mbedx509)
pkg_check_modules(NSS QUIET nss)
pkg_check_modules(WOLFSSL QUIET wolfssl)
endif()
check_include_file("linux/if_alg.h" HAVE_LINUX_IF_ALG_H)
check_include_file("crypto/cryptodev.h" HAVE_CRYPTO_CRYPTODEV_H)
check_include_file("openssl/base.h" HAVE_BORINGSSL_BASE_H)
if(HAVE_LINUX_IF_ALG_H)
check_symbol_exists(ALG_SET_PUBKEY "linux/if_alg.h" HAVE_ALG_SET_PUBKEY)
else()
set(HAVE_ALG_SET_PUBKEY FALSE)
endif()
if(GnuTLS_FOUND)
check_symbol_exists(gnutls_priority_get_kx "gnutls/gnutls.h" HAVE_GNUTLS_PRIORITY_GET_KX)
check_symbol_exists(gnutls_priority_get_sig "gnutls/gnutls.h" HAVE_GNUTLS_PRIORITY_GET_SIG)
else()
set(HAVE_GNUTLS_PRIORITY_GET_KX FALSE)
set(HAVE_GNUTLS_PRIORITY_GET_SIG FALSE)
endif()
file(GLOB_RECURSE DEMO_SOURCES
RELATIVE ${CMAKE_SOURCE_DIR}
tests/*.c
tests/*.cc
tests/*.cpp
)
set(SKIPPED_DEMOS "")
function(register_demo SOURCE)
set(local_skipped "${SKIPPED_DEMOS}")
set(can_build TRUE)
set(skip_reason "")
set(target_libs "")
set(target_includes "")
set(target_cflags "")
set(build_kind EXECUTABLE)
if(SOURCE MATCHES "tests/ApiCall/openssl/" OR
SOURCE MATCHES "tests/ApiCall/boringSSL/" OR
SOURCE MATCHES "tests/ApiCall/JavaJniBridge/protocol/" OR
SOURCE MATCHES "tests/ApiCall/JavaJniBridge/symmetric/")
if(OpenSSL_FOUND)
list(APPEND target_libs OpenSSL::SSL OpenSSL::Crypto)
else()
set(can_build FALSE)
set(skip_reason "requires OpenSSL development files")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/JavaJniBridge/symmetric/java_jni_bridge_symmetric_java_native_s_s_l.c")
if(NOT JNI_FOUND)
set(can_build FALSE)
set(skip_reason "requires JNI headers/libraries")
else()
list(APPEND target_includes ${JNI_INCLUDE_DIRS})
list(APPEND target_libs ${JNI_LIBRARIES})
endif()
set(build_kind SHARED_LIBRARY)
endif()
if(SOURCE MATCHES "tests/ApiCall/GnuTLS/")
if(GnuTLS_FOUND)
list(APPEND target_libs GnuTLS::GnuTLS)
else()
set(can_build FALSE)
set(skip_reason "requires GnuTLS (libgnutls)")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/GnuTLS/protocol/")
if(NOT HAVE_GNUTLS_PRIORITY_GET_KX OR NOT HAVE_GNUTLS_PRIORITY_GET_SIG)
set(can_build FALSE)
set(skip_reason "requires gnutls_priority_get_kx and gnutls_priority_get_sig")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/boringSSL/")
if(NOT HAVE_BORINGSSL_BASE_H)
set(can_build FALSE)
set(skip_reason "requires BoringSSL headers (openssl/base.h)")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/NSS/")
if(NOT NSS_FOUND)
set(can_build FALSE)
set(skip_reason "requires NSS (pkg-config nss)")
else()
list(APPEND target_libs ${NSS_LIBRARIES})
list(APPEND target_includes ${NSS_INCLUDE_DIRS})
list(APPEND target_cflags ${NSS_CFLAGS_OTHER})
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/libsodium/")
if(NOT LIBSODIUM_FOUND)
set(can_build FALSE)
set(skip_reason "requires libsodium")
else()
list(APPEND target_libs ${LIBSODIUM_LIBRARIES})
list(APPEND target_includes ${LIBSODIUM_INCLUDE_DIRS})
list(APPEND target_cflags ${LIBSODIUM_CFLAGS_OTHER})
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/mbedTLS/")
if(NOT MBEDTLS_FOUND)
set(can_build FALSE)
set(skip_reason "requires mbedTLS (pkg-config mbedtls mbedcrypto mbedx509)")
else()
list(APPEND target_libs ${MBEDTLS_LIBRARIES})
list(APPEND target_includes ${MBEDTLS_INCLUDE_DIRS})
list(APPEND target_cflags ${MBEDTLS_CFLAGS_OTHER})
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/wolfSSL/")
if(NOT WOLFSSL_FOUND)
set(can_build FALSE)
set(skip_reason "requires wolfSSL")
else()
list(APPEND target_libs ${WOLFSSL_LIBRARIES})
list(APPEND target_includes ${WOLFSSL_INCLUDE_DIRS})
list(APPEND target_cflags ${WOLFSSL_CFLAGS_OTHER})
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/AfAlg/")
if(NOT HAVE_LINUX_IF_ALG_H)
set(can_build FALSE)
set(skip_reason "requires <linux/if_alg.h>")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/AfAlg/signature/")
if(NOT HAVE_ALG_SET_PUBKEY)
set(can_build FALSE)
set(skip_reason "requires ALG_SET_PUBKEY support in <linux/if_alg.h>")
endif()
endif()
if(SOURCE MATCHES "tests/ApiCall/cryptodev/")
if(NOT HAVE_CRYPTO_CRYPTODEV_H)
set(can_build FALSE)
set(skip_reason "requires <crypto/cryptodev.h>")
endif()
endif()
if(SOURCE MATCHES "tests/NeedGuiInput/")
set(can_build FALSE)
set(skip_reason "GUI demos are Python-based")
endif()
if(can_build)
get_filename_component(target_name ${SOURCE} NAME_WE)
if(build_kind STREQUAL "SHARED_LIBRARY")
add_library(${target_name} SHARED ${SOURCE})
else()
add_executable(${target_name} ${SOURCE})
endif()
if(target_includes)
list(REMOVE_DUPLICATES target_includes)
target_include_directories(${target_name} PRIVATE ${target_includes})
endif()
if(target_libs)
list(REMOVE_DUPLICATES target_libs)
target_link_libraries(${target_name} PRIVATE ${target_libs})
endif()
if(target_cflags)
list(REMOVE_DUPLICATES target_cflags)
target_compile_options(${target_name} PRIVATE ${target_cflags})
endif()
else()
if(skip_reason STREQUAL "")
set(skip_reason "dependency not available")
endif()
string(APPEND local_skipped "\n ${SOURCE} (${skip_reason})")
set(SKIPPED_DEMOS "${local_skipped}" PARENT_SCOPE)
endif()
endfunction()
foreach(src IN LISTS DEMO_SOURCES)
register_demo(${src})
endforeach()
if(SKIPPED_DEMOS)
message(STATUS "Skipped demo targets:${SKIPPED_DEMOS}")
endif()