-
Notifications
You must be signed in to change notification settings - Fork 28
/
build.nsconfig
469 lines (356 loc) · 17.9 KB
/
build.nsconfig
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
# MIT License
#
# Copyright (c) 2021 Agenium Scale
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
package_name nsimd-3.0
## ----------------------------------------------------------------------------
## Get OS/Compiler specific file extensions
set o = @obj_ext
set exe = @exe_ext
set s = @asm_ext
set so = @shared_lib_ext
set lib = @shared_link_ext
set root = @source_dir
set make = @make_command
set build = @build_dir
set root = @source_dir
set ccomp = @ccomp_name
set cppcomp = @cppcomp_name
## ----------------------------------------------------------------------------
## Some defaults
ifnot_set "SIMD extension to use" simd = cpu
ifnot_set "CUDA target arch flag(s) for tests" cuda_arch_flags = ""
ifnot_set "Compile the libstdc++ statically" static_libstdcpp = true
ifnot_set "Enable C++20 tests" cpp20_tests = ""
## ----------------------------------------------------------------------------
## Targets for compilation
set o_for_ = fp16$o memory$o ufp$o api_cpu$o rempitab$o \
sleefsp$o sleefdp$o gpu$o
set o_for_cpu = $o_for_
set o_for_cuda = $o_for_
set o_for_rocm = $o_for_
set o_for_oneapi = $o_for_
set o_for_sse2 = $o_for_cpu api_sse2$o sleef_sse2_f32$o \
sleef_sse2_f64$o
set o_for_sse42 = $o_for_sse2 api_sse42$o sleef_sse42_f32$o \
sleef_sse42_f64$o
set o_for_avx = $o_for_sse42 api_avx$o sleef_avx_f32$o \
sleef_avx_f64$o
set o_for_avx2 = $o_for_avx api_avx2$o sleef_avx2_f32$o \
sleef_avx2_f64$o
set o_for_avx512_knl = $o_for_avx2 api_avx512_knl$o \
sleef_avx512_knl_f32$o sleef_avx512_knl_f64$o
set o_for_avx512_skylake = $o_for_avx2 api_avx512_skylake$o \
sleef_avx512_skylake_f32$o \
sleef_avx512_skylake_f64$o
set o_for_neon128 = $o_for_cpu api_neon128$o sleef_neon128_f32$o \
sleef_neon128_f64$o
set o_for_aarch64 = $o_for_cpu api_aarch64$o sleef_aarch64_f32$o \
sleef_aarch64_f64$o
set o_for_sve = $o_for_aarch64 api_sve$o sleef_sve_f32$o \
sleef_sve_f64$o
set o_for_sve128 = $o_for_aarch64 api_sve128$o sleef_sve128_f32$o \
sleef_sve128_f64$o
set o_for_sve256 = $o_for_aarch64 api_sve256$o sleef_sve256_f32$o \
sleef_sve256_f64$o
set o_for_sve512 = $o_for_aarch64 api_sve512$o sleef_sve512_f32$o \
sleef_sve512_f64$o
set o_for_sve1024 = $o_for_aarch64 api_sve1024$o sleef_sve1024_f32$o \
sleef_sve1024_f64$o
set o_for_sve2048 = $o_for_aarch64 api_sve2048$o sleef_sve2048_f32$o \
sleef_sve2048_f64$o
set o_for_vmx = $o_for_cpu api_vmx$o sleef_vmx_f32$o sleef_vmx_f64$o
set o_for_vsx = $o_for_vmx api_vsx$o sleef_vsx_f32$o sleef_vsx_f64$o
## ----------------------------------------------------------------------------
## SIMD compiler flags
lambda cflags_for_generic_* = -DCPU
set cflags_for_generic_cuda = -DCUDA
set cflags_for_generic_rocm = -DROCM
set cflags_for_generic_oneapi = -DONEAPI
set cflags_for_ = ${cflags_for_generic_$simd$}
set cflags_for_cpu = $cflags_for_
set cflags_for_cuda = -DCUDA
set cflags_for_rocm = -DROCM
set cflags_for_oneapi = -DONEAPI
set cflags_for_sse2 = -DSSE2 -msse2
set cflags_for_sse42 = -DSSE42 -msse42
set cflags_for_avx = -DAVX -mavx
set cflags_for_avx2 = -DAVX2 -mavx2 -DFMA -mfma -DFP16 -mfp16
set cflags_for_avx512_knl = -DAVX512_KNL -mavx512_knl -mfma -DFP16 -mfp16
set cflags_for_avx512_skylake = -DAVX512_SKYLAKE -mavx512_skylake -mfma \
-DFP16 -mfp16
set cflags_for_neon128 = -DNEON128 -mneon128
set cflags_for_aarch64 = -DAARCH64 -maarch64
set cflags_for_sve = -DSVE -msve
set cflags_for_sve128 = -DSVE128 -msve128
set cflags_for_sve256 = -DSVE256 -msve256
set cflags_for_sve512 = -DSVE512 -msve512
set cflags_for_sve1024 = -DSVE1024 -msve1024
set cflags_for_sve2048 = -DSVE2048 -msve2048
set cflags_for_vmx = -DVMX -mvmx
set cflags_for_vsx = -DVSX -mvsx
## ----------------------------------------------------------------------------
## std default flag
lambda std_flag_for_* = -std=c++98
set std_flag_for_rocm = -std=c++11
set std_flag_for_oneapi = -std=c++17
## ----------------------------------------------------------------------------
## libstdc++ linking mode
set libstdcpp_static_link_true = -static-libstdc++
set libstdcpp_static_link_false =
## ----------------------------------------------------------------------------
## Some defaults
set flags = -Wall -fPIC -O2 -I$root$/include -DNDEBUG
set cflags = ${std_flag_for_$simd$} $flags \
${libstdcpp_static_link_$static_libstdcpp$}
set sleef_cflags = -fPIC -O2 -I$root$/src -DNDEBUG -DDORENAME=1
## ----------------------------------------------------------------------------
## Default building rules
phony all deps libnsimd_$simd$$so$
build_file libnsimd_$simd$$so deps ${o_for_$simd$}
c++ -fPIC -shared @in -o @out
set ldflags = -fPIC -L. -lnsimd_$simd
## ----------------------------------------------------------------------------
## Generic (emulation) rules for building
build_file gpu$o autodeps $root$/src/gpu.cpp
c++ $cflags$ $cflags_for_cpu @in -c -o @out
build_file ufp$o autodeps $root$/src/ufp.cpp
c++ $cflags$ $cflags_for_cpu @in -c -o @out
build_file fp16$o autodeps $root$/src/fp16.cpp
c++ $cflags$ $cflags_for_cpu @in -c -o @out
build_file memory$o autodeps $root$/src/memory.cpp
c++ $cflags$ $cflags_for_cpu @in -c -o @out
build_file rempitab$o autodeps $root$/src/rempitab.c
cc $sleef_cflags$ -c @in -o @out
build_file sleefsp$o autodeps $root$/src/sleefsp.c
cc $sleef_cflags$ -c @in -o @out
build_file sleefdp$o autodeps $root$/src/sleefdp.c
cc $sleef_cflags$ -c @in -o @out
build_file api_cpu$o autodeps $root$/src/api_cpu.cpp
c++ $cflags$ $cflags_for_cpu -c @in -o @out
## ----------------------------------------------------------------------------
## Intel rules for building
build_file api_sse2$o autodeps $root$/src/api_sse2.cpp
c++ $cflags$ -c $cflags_for_sse2 @in -o @out
build_file sleef_sse2_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msse2 -DNSIMD_SSE2 -DENABLE_SSE2=1 @in -o @out
build_file sleef_sse2_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msse2 -DNSIMD_SSE2 -DENABLE_SSE2=1 @in -o @out
build_file api_sse42$o autodeps $root$/src/api_sse42.cpp
c++ $cflags$ -c $cflags_for_sse42 @in -o @out
build_file sleef_sse42_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msse42 -DNSIMD_SSE42 -DENABLE_SSE4=1 @in -o @out
build_file sleef_sse42_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msse42 -DNSIMD_SSE42 -DENABLE_SSE4=1 @in -o @out
build_file api_avx$o autodeps $root$/src/api_avx.cpp
c++ $cflags$ -c $cflags_for_avx @in -o @out
build_file sleef_avx_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mavx -DNSIMD_AVX -DENABLE_AVX=1 @in -o @out
build_file sleef_avx_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -mavx -DNSIMD_AVX -DENABLE_AVX=1 @in -o @out
build_file api_avx2$o autodeps $root$/src/api_avx2.cpp
c++ $cflags$ -c $cflags_for_avx2 @in -o @out
build_file sleef_avx2_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mavx2 -mfma -DNSIMD_AVX2 -DENABLE_AVX2=1 \
@in -o @out
build_file sleef_avx2_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -mavx2 -mfma -DNSIMD_AVX2 -DENABLE_AVX2=1 \
@in -o @out
build_file api_avx512_knl$o autodeps $root$/src/api_avx512_knl.cpp
c++ $cflags$ -c $cflags_for_avx512_knl @in -o @out
build_file sleef_avx512_knl_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mavx512_knl -DNSIMD_AVX512_KNL \
-DENABLE_AVX512F=1 @in -o @out
build_file sleef_avx512_knl_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -mavx512_knl -DNSIMD_AVX512_KNL \
-DENABLE_AVX512F=1 @in -o @out
build_file api_avx512_skylake$o autodeps $root$/src/api_avx512_skylake.cpp
c++ $cflags$ -c $cflags_for_avx512_skylake @in -o @out
build_file sleef_avx512_skylake_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mavx512_knl -DNSIMD_AVX512_SKYLAKE \
-DENABLE_AVX512F=1 @in -o @out
build_file sleef_avx512_skylake_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -mavx512_knl -DNSIMD_AVX512_SKYLAKE \
-DENABLE_AVX512F=1 @in -o @out
## ----------------------------------------------------------------------------
## ARM 32 bits rules for building
build_file api_neon128$o autodeps $root$/src/api_neon128.cpp
c++ $cflags$ -c $cflags_for_neon128 @in -o @out
build_file sleef_neon128_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mneon128 -DNSIMD_NEON128 \
-DENABLE_NEON32=1 @in -o @out
build_file sleef_neon128_f64$o autodeps $root$/src/sleefsimddp_emulation.c
cc $sleef_cflags$ -c -mneon128 -DNSIMD_NEON128 -DENABLE_NEON32=1 \
-I$root$/include @in -o @out
## ----------------------------------------------------------------------------
## ARM 64 bits rules for building
build_file api_aarch64$o autodeps $root$/src/api_aarch64.cpp
c++ $cflags$ -c $cflags_for_aarch64 @in -o @out
build_file sleef_aarch64_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -maarch64 -DNSIMD_AARCH64 \
-DENABLE_ADVSIMD=1 @in -o @out
build_file sleef_aarch64_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -maarch64 -DNSIMD_AARCH64 \
-DENABLE_ADVSIMD=1 @in -o @out
build_file api_sve$o autodeps $root$/src/api_sve.cpp
c++ $cflags$ -c $cflags_for_sve @in -o @out
build_file sleef_sve_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve -DNSIMD_SVE -DENABLE_SVE=1 @in -o @out
build_file sleef_sve_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve -DNSIMD_SVE -DENABLE_SVE=1 @in -o @out
build_file api_sve128$o autodeps $root$/src/api_sve128.cpp
c++ $cflags$ -c $cflags_for_sve128 @in -o @out
build_file sleef_sve128_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve128 -DNSIMD_SVE128 -DENABLE_SVE=1 @in -o @out
build_file sleef_sve128_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve128 -DNSIMD_SVE128 -DENABLE_SVE=1 @in -o @out
build_file api_sve256$o autodeps $root$/src/api_sve256.cpp
c++ $cflags$ -c $cflags_for_sve256 @in -o @out
build_file sleef_sve256_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve256 -DNSIMD_SVE256 -DENABLE_SVE=1 @in -o @out
build_file sleef_sve256_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve256 -DNSIMD_SVE256 -DENABLE_SVE=1 @in -o @out
build_file api_sve512$o autodeps $root$/src/api_sve512.cpp
c++ $cflags$ -c $cflags_for_sve512 @in -o @out
build_file sleef_sve512_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve512 -DNSIMD_SVE512 -DENABLE_SVE=1 @in -o @out
build_file sleef_sve512_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve512 -DNSIMD_SVE512 -DENABLE_SVE=1 @in -o @out
build_file api_sve1024$o autodeps $root$/src/api_sve1024.cpp
c++ $cflags$ -c $cflags_for_sve1024 @in -o @out
build_file sleef_sve1024_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve1024 -DNSIMD_SVE1024 -DENABLE_SVE=1 \
@in -o @out
build_file sleef_sve1024_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve1024 -DNSIMD_SVE1024 -DENABLE_SVE=1 \
@in -o @out
build_file api_sve2048$o autodeps $root$/src/api_sve2048.cpp
c++ $cflags$ -c $cflags_for_sve2048 @in -o @out
build_file sleef_sve2048_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -msve2048 -DNSIMD_SVE2048 -DENABLE_SVE=1 \
@in -o @out
build_file sleef_sve2048_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -msve2048 -DNSIMD_SVE2048 -DENABLE_SVE=1 \
@in -o @out
## ----------------------------------------------------------------------------
## POWERPC rules for building
build_file api_vmx$o autodeps $root$/src/api_vmx.cpp
c++ $cflags$ -c $cflags_for_vmx @in -o @out
build_file sleef_vmx_f32$o autodeps $root$/src/sleefsimdsp_emulation.c
cc $sleef_cflags$ -c -mvmx -DNSIMD_VMX -DENABLE_VSX=1 \
-I$root$/include @in -o @out
build_file sleef_vmx_f64$o autodeps $root$/src/sleefsimddp_emulation.c
cc $sleef_cflags$ -c -mvmx -DNSIMD_VMX -DENABLE_VSX=1 \
-I$root$/include @in -o @out
build_file api_vsx$o autodeps $root$/src/api_vsx.cpp
c++ $cflags$ -c $cflags_for_vsx @in -o @out
build_file sleef_vsx_f32$o autodeps $root$/src/sleefsimdsp.c
cc $sleef_cflags$ -c -mvsx -DNSIMD_VSX -DENABLE_VSX=1 @in -o @out
build_file sleef_vsx_f64$o autodeps $root$/src/sleefsimddp.c
cc $sleef_cflags$ -c -mvsx -DNSIMD_VSX -DENABLE_VSX=1 @in -o @out
## ----------------------------------------------------------------------------
## Installation and packaging
install_file libnsimd_${simd}$so lib
[W] install_file libnsimd_${simd}$lib lib
install_dir $root$/include/nsimd include
install_dir $root$/doc/html doc
## ----------------------------------------------------------------------------
## Tests
# Lambda arguments: suite, compiler, std, simd_ext
# By default all tests will be considered
lambda tests_*_*_* = ok
# Now disable some possibilities on certain compilers
set tests_clang_c89_vmx = ""
set tests_clang_c89_vsx = ""
set tests_clang_c89_sve = ""
lambda tests_*_c89_cuda = ""
lambda tests_*_c99_cuda = ""
lambda tests_*_c11_cuda = ""
lambda tests_*_cpp17_cuda = ""
lambda tests_*_c89_rocm = ""
lambda tests_*_c99_rocm = ""
lambda tests_*_c11_rocm = ""
lambda tests_*_cpp98_rocm = ""
lambda tests_*_cpp17_rocm = ""
lambda tests_*_c89_oneapi = ""
lambda tests_*_c99_oneapi = ""
lambda tests_*_c11_oneapi = ""
lambda tests_dpcpp_cpp98_* = ""
lambda tests_dpcpp_cpp11_* = ""
set c89_enabled = ${tests_$ccomp$_c89_$simd$}
set c89.files = ""
set c99_enabled = ${tests_$ccomp$_c99_$simd$}
set c99.files = ""
set c11_enabled = ${tests_$ccomp$_c11_$simd$}
set c11.files = ""
set cpp98_enabled = ${tests_$cppcomp$_cpp98_$simd$}
set cpp98.files = ""
set cpp11_enabled = ${tests_$cppcomp$_cpp11_$simd$}
set cpp11.files = ""
set cpp17_enabled = ${tests_$cppcomp$_cpp17_$simd$}
set cpp17.files = ""
set cpp20.files = ""
set tests_flags = $cuda_arch_flags $flags ${cflags_for_$simd$} -lm $ldflags
echo Test compilation flags: $tests_flags$
[$c89_enabled$] build_files c89 foreach glob:$root$/tests/*.prec11.c \
as tests.%r.c89$exe \
autodeps @item libnsimd_$simd$$so$
[$c89_enabled$] cc -std=c89 @item $tests_flags -o @out
[$c89_enabled$] phony tests.c89 deps $c89.files
[$c99_enabled$] build_files c99 foreach glob:$root$/tests/*.prec11.c \
as tests.%r.c99$exe \
autodeps @item libnsimd_$simd$$so$
[$c99_enabled$] cc -std=c99 @item $tests_flags -o @out
[$c99_enabled$] phony tests.c99 deps $c99.files
[$c11_enabled$] build_files c11 foreach glob:$root$/tests/*.c \
as tests.%r.c11$exe \
autodeps @item libnsimd_$simd$$so$
[$c11_enabled$] cc -std=c11 @item $tests_flags -o @out
[$c11_enabled$] phony tests.c11 deps $c11.files
[$cpp98_enabled$] build_files cpp98 foreach glob:$root$/tests/*.cpp \
as tests.%r.cpp98$exe \
autodeps @item libnsimd_$simd$$so$
[$cpp98_enabled$] c++ -std=c++98 @item $tests_flags -o @out
[$cpp98_enabled$] phony tests.cpp98 deps $cpp98.files
[$cpp11_enabled$] build_files cpp11 foreach glob:$root$/tests/*.cpp \
as tests.%r.cpp11$exe \
autodeps @item libnsimd_$simd$$so$
[$cpp11_enabled$] c++ -std=c++11 @item $tests_flags -o @out
[$cpp11_enabled$] phony tests.cpp11 deps $cpp11.files
[$cpp17_enabled$] build_files cpp17 foreach glob:$root$/tests/*.cpp \
as tests.%r.cpp17$exe \
autodeps @item libnsimd_$simd$$so$
[$cpp17_enabled$] c++ -std=c++17 @item $tests_flags -o @out
[$cpp17_enabled$] phony tests.cpp17 deps $cpp17.files
[$cpp20_tests$] build_files cpp20 foreach glob:$root$/tests/*.cpp \
as tests.%r.cpp20$exe \
autodeps @item libnsimd_$simd$$so$
[$cpp20_tests$] c++ -std=c++20 @item $tests_flags -o @out
[$cpp20_tests$] phony tests.cpp20 deps $cpp20.files
# Phony target for tests
phony tests deps $c89.files $c99.files $c11.files $cpp98.files $cpp11.files \
$cpp17.files $cpp20.files
## ----------------------------------------------------------------------------
## Examples
build_files examples_cpp98 foreach glob:$root$/examples/*.cpp \
as examples.%r.cpp98$exe \
autodeps @item libnsimd_$simd$$so$
c++ -std=c++98 @item $tests_flags -o @out
phony examples.cpp98 deps $examples_cpp98.files