Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/libecc/meson.build
34677 views
1
project('libecc', 'c',
2
meson_version: '>=1.1.0',
3
version: run_command('dunamai', 'from', 'git', '--style', 'semver', '--dirty', check: true).stdout().strip(),
4
default_options: ['c_std=gnu11', 'default_library=static', 'warning_level=3' ],
5
license: 'BSD-3-Clause OR GPL-2.0-or-later',
6
license_files: [ 'LICENSE' ],
7
)
8
9
top_dir = meson.current_source_dir()
10
11
# dunamai is used for version sync with gconf (in the same way poetry-dynamic-versioning does)
12
pymod = import('python')
13
py3 = pymod.find_installation('python3', modules: ['dunamai'])
14
15
# about libecc
16
# below file listings should be moved in successive small 'meson.build' file in each subdir, that
17
# only contains the file listing, replacing them with a lonely 'subdir('src/xxx') instead.
18
19
ecc_inc = include_directories('include')
20
subdir('include/libecc')
21
22
# module declaration, each module files listing is declare in its own directory
23
subdir('src/utils')
24
subdir('src/nn')
25
subdir('src/fp')
26
subdir('src/curves')
27
subdir('src/hash')
28
subdir('src/sig')
29
subdir('src/ecdh')
30
subdir('src/external_deps')
31
32
# detect if an external rand source implementation is passed
33
use_external_rand_opt = get_option('use_external_rand')
34
if use_external_rand_opt
35
rand_src = files(get_option('with_rand_source'))
36
else
37
rand_src = files()
38
endif
39
# detect if an external print source implementation is passed
40
use_external_print_opt = get_option('use_external_print')
41
if use_external_print_opt
42
print_src = files(get_option('with_print_source'))
43
else
44
print_src = files()
45
endif
46
# detect if an external time source implementation is passed
47
use_external_time_opt = get_option('use_external_time')
48
if use_external_time_opt
49
time_src = files(get_option('with_time_source'))
50
else
51
time_src = files()
52
endif
53
54
55
# globally used build args, TODO: to make configurable
56
build_args = [
57
'-fno-builtin',
58
'-D_FORTIFY_SOURCE=2',
59
'-fstack-protector-strong',
60
'-DUSE_WARN_UNUSED_RET',
61
'-ffreestanding'
62
]
63
64
65
# About configurable options, based on makefiles
66
67
# 1. build-relative options first
68
69
# info compilers arguments (such as m32/m64 should be cross-file related.
70
# just using a different cross-file (event for m32 on m64 arch for e.g. is enough
71
# to change the behavior
72
with_wordsize_opt = get_option('with_wordsize')
73
if with_wordsize_opt == '16'
74
build_args += '-DWORDSIZE=16'
75
elif with_wordsize_opt == '32'
76
build_args += '-DWORDSIZE=32'
77
elif with_wordsize_opt == '64'
78
build_args += '-DWORDSIZE=64'
79
endif
80
81
with_stdlib_opt = get_option('with_stdlib')
82
if with_stdlib_opt
83
build_args += '-DWITH_STDLIB'
84
endif
85
86
with_debug_opt = get_option('with_debug')
87
if with_debug_opt
88
build_args += '-DDEBUG'
89
endif
90
91
use_cryptofuzz_opt = get_option('use_cryptofuzz')
92
if use_cryptofuzz_opt
93
build_args += '-DUSE_CRYPTOFUZZ'
94
endif
95
96
assert_print_opt = get_option('assert_print')
97
if assert_print_opt
98
build_args += '-DUSE_ASSERT_PRINT'
99
endif
100
101
no_warn_unused_ret_opt = get_option('no_warn_unused_ret')
102
if not no_warn_unused_ret_opt
103
build_args += '-DUSE_WARN_UNUSED_RET'
104
endif
105
106
# 2. security relative options
107
108
with_sig_blinding_opt = get_option('with_sig_blinding')
109
if with_sig_blinding_opt
110
build_args += '-DUSE_SIG_BLINDING'
111
endif
112
113
with_complete_formulas_opt = get_option('with_complete_formulas')
114
if with_complete_formulas_opt
115
build_args += '-DNO_USE_COMPLETE_FORMULAS'
116
endif
117
118
with_double_add_opt = get_option('with_double_add')
119
if with_double_add_opt == 'true'
120
build_args += '-DUSE_DOUBLE_ADD_ALWAYS'
121
elif with_double_add_opt == 'false'
122
build_args += '-DUSE_MONTY_LADDER'
123
endif
124
125
with_monty_ladder_opt = get_option('with_monty_ladder')
126
if with_monty_ladder_opt == 'true'
127
build_args += '-DUSE_MONTY_LADDER'
128
elif with_monty_ladder_opt == 'false'
129
build_args += '-DUSE_DOUBLE_ADD_ALWAYS'
130
endif
131
132
assert(not (with_double_add_opt == 'true' and with_monty_ladder_opt == 'true'), 'with_double_add and with_monty_ladder are incompatible options!')
133
134
# 3. crypto engines relative options. It is possible to fully disable all
135
# engines and manually select which one must be built
136
137
with_override_ecc_config_opt = get_option('with_override_ecc_config')
138
if with_override_ecc_config_opt
139
build_args += '-DWITH_LIBECC_CONFIG_OVERRIDE'
140
endif
141
142
if with_override_ecc_config_opt
143
# Handle the asked curves
144
with_curves_opt = get_option('with_curves')
145
assert(with_curves_opt.length() != 0, 'You have selected a libecc configuration override with no curve: please select at least one proper curve!')
146
foreach curve : with_curves_opt
147
build_args += '-DWITH_CURVE_'+curve.to_upper()
148
endforeach
149
# Handle the asked hashes
150
with_hashes_opt = get_option('with_hashes')
151
assert(with_hashes_opt.length() != 0, 'You have selected a libecc configuration override with no hash: please select at least one proper hash!')
152
foreach hash : with_hashes_opt
153
build_args += '-DWITH_HASH_'+hash.to_upper()
154
endforeach
155
# Handle the asked algorithms
156
with_algs_opt = get_option('with_algs')
157
assert(with_algs_opt.length() != 0, 'You have selected a libecc configuration override with no algorithm: please select at least one proper algorithm!')
158
foreach alg : with_algs_opt
159
build_args += '-DWITH_'+alg.to_upper()
160
endforeach
161
endif
162
163
# Small stack handling
164
with_small_stack_opt = get_option('with_small_stack')
165
if with_small_stack_opt
166
build_args += '-DUSE_SMALL_STACK'
167
endif
168
assert(not (with_small_stack_opt and with_sig_eddsa25519_opt), 'Small stack and EdDSA are incompatible options!')
169
assert(not (with_small_stack_opt and with_sig_eddsa448_opt), 'Small stack and EdDSA are incompatible options!')
170
assert(not (with_small_stack_opt and with_x25519_opt), 'Small stack and X25519 are incompatible options!')
171
assert(not (with_small_stack_opt and with_x448_opt), 'Small stack and X448 are incompatible options!')
172
173
174
# libecc libraries declaration. For each library, the library itself and the
175
# corresponding dependency object (includedir and library to link with) is
176
# also declared
177
#
178
# INFO: defaulting to static lib only (see project declaration).
179
# to build both static and dynamic library, use -Ddefault_library=both option
180
#
181
libarith_lib = library('arith',
182
sources: [
183
fp_mod_src,
184
nn_mod_src,
185
rand_src,
186
print_src,
187
time_src,
188
utils_arith_src,
189
],
190
include_directories: ecc_inc,
191
install : true,
192
c_args: build_args,
193
)
194
libarith_dep = declare_dependency(
195
link_with: libarith_lib,
196
include_directories: ecc_inc,
197
)
198
199
libec_lib = library('ecc',
200
sources: [
201
curves_mod_src,
202
utils_ec_src,
203
fp_mod_src,
204
nn_mod_src,
205
rand_src,
206
print_src,
207
time_src,
208
utils_arith_src
209
],
210
include_directories: ecc_inc,
211
install : true,
212
c_args: build_args,
213
)
214
libec_dep = declare_dependency(
215
link_with: libec_lib,
216
include_directories: ecc_inc,
217
)
218
219
libsign_lib = library('sign',
220
sources: [
221
hash_mod_src,
222
sig_mod_src,
223
key_mod_src,
224
utils_sign_src,
225
ecdh_mod_src,
226
curves_mod_src,
227
utils_ec_src,
228
fp_mod_src,
229
nn_mod_src,
230
rand_src,
231
print_src,
232
time_src,
233
utils_arith_src
234
],
235
include_directories: ecc_inc,
236
install : true,
237
c_args: build_args,
238
)
239
libsign_dep = declare_dependency(
240
link_with: libsign_lib,
241
include_directories: ecc_inc,
242
)
243
244
# in order to build native tools that depends on libsign library, we should
245
# check if the nominal library built has been made native or cross. If
246
# cross, another build must be made natively for native tooling
247
if meson.is_cross_build()
248
native_libsign_lib = library('sign_native',
249
sources: [
250
hash_mod_src,
251
sig_mod_src,
252
key_mod_src,
253
utils_sign_src,
254
ecdh_mod_src,
255
curves_mod_src,
256
utils_ec_src,
257
fp_mod_src,
258
nn_mod_src,
259
rand_src,
260
print_src,
261
time_src,
262
utils_arith_src
263
],
264
include_directories: ecc_inc,
265
install : false,
266
c_args: build_args,
267
native: true,
268
)
269
native_libsign_dep = declare_dependency(
270
link_with: native_libsign_lib,
271
include_directories: ecc_inc,
272
)
273
else
274
native_libsign_lib = libsign_lib
275
native_libsign_dep = libsign_dep
276
endif
277
278
# About tests, see src/tests/meson.build. Enabled with -Dwith_tests=true
279
with_tests_opt = get_option('with_tests')
280
if with_tests_opt
281
subdir('src/tests')
282
endif
283
284