]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - release.sh
Update to version 3.2.0
[FreeBSD/FreeBSD.git] / release.sh
1 #! /bin/sh
2 #
3 # SPDX-License-Identifier: BSD-2-Clause
4 #
5 # Copyright (c) 2018-2020 Gavin D. Howard and contributors.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are met:
9 #
10 # * Redistributions of source code must retain the above copyright notice, this
11 #   list of conditions and the following disclaimer.
12 #
13 # * Redistributions in binary form must reproduce the above copyright notice,
14 #   this list of conditions and the following disclaimer in the documentation
15 #   and/or other materials provided with the distribution.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
28 #
29
30 usage() {
31         printf 'usage: %s [run_tests] [generate_tests] [test_with_clang] [test_with_gcc] \n' "$script"
32         printf '          [run_sanitizers] [run_valgrind] [run_64_bit] [run_gen_script]\n'
33         exit 1
34 }
35
36 header() {
37
38         _header_msg="$1"
39         shift
40
41         printf '\n'
42         printf '*******************\n'
43         printf "$_header_msg"
44         printf '\n'
45         printf '*******************\n'
46         printf '\n'
47 }
48
49 do_make() {
50         make -j4 "$@"
51 }
52
53 configure() {
54
55         _configure_CFLAGS="$1"
56         shift
57
58         _configure_CC="$1"
59         shift
60
61         _configure_configure_flags="$1"
62         shift
63
64         _configure_GEN_HOST="$1"
65         shift
66
67         _configure_LONG_BIT="$1"
68         shift
69
70         if [ "$gen_tests" -eq 0 ]; then
71                 _configure_configure_flags="-G $_configure_configure_flags"
72         fi
73
74         if [ "$_configure_CC" = "clang" ]; then
75                 _configure_CFLAGS="$clang_flags $_configure_CFLAGS"
76         elif [ "$_configure_CC" = "gcc" ]; then
77                 _configure_CFLAGS="$gcc_flags $_configure_CFLAGS"
78         fi
79
80         _configure_header=$(printf 'Running ./configure.sh %s ...' "$_configure_configure_flags")
81         _configure_header=$(printf "$_configure_header\n    CC=\"%s\"\n" "$_configure_CC")
82         _configure_header=$(printf "$_configure_header\n    CFLAGS=\"%s\"\n" "$_configure_CFLAGS")
83         _configure_header=$(printf "$_configure_header\n    LONG_BIT=%s" "$_configure_LONG_BIT")
84         _configure_header=$(printf "$_configure_header\n    GEN_HOST=%s" "$_configure_GEN_HOST")
85
86         header "$_configure_header"
87         CFLAGS="$_configure_CFLAGS" CC="$_configure_CC" GEN_HOST="$_configure_GEN_HOST" \
88                 LONG_BIT="$_configure_LONG_BIT" ./configure.sh $_configure_configure_flags > /dev/null
89 }
90
91 build() {
92
93         _build_CFLAGS="$1"
94         shift
95
96         _build_CC="$1"
97         shift
98
99         _build_configure_flags="$1"
100         shift
101
102         _build_GEN_HOST="$1"
103         shift
104
105         _build_LONG_BIT="$1"
106         shift
107
108         configure "$_build_CFLAGS" "$_build_CC" "$_build_configure_flags" "$_build_GEN_HOST" "$_build_LONG_BIT"
109
110         _build_header=$(printf 'Building...\n    CC=%s' "$_build_CC")
111         _build_header=$(printf "$_build_header\n    CFLAGS=\"%s\"" "$_build_CFLAGS")
112         _build_header=$(printf "$_build_header\n    LONG_BIT=%s" "$_build_LONG_BIT")
113         _build_header=$(printf "$_build_header\n    GEN_HOST=%s" "$_build_GEN_HOST")
114
115         header "$_build_header"
116
117         do_make > /dev/null 2> "$scriptdir/.test.txt"
118
119         if [ -s "$scriptdir/.test.txt" ]; then
120                 printf '%s generated warning(s):\n' "$_build_CC"
121                 printf '\n'
122                 cat "$scriptdir/.test.txt"
123                 exit 1
124         fi
125 }
126
127 runtest() {
128
129         header "Running tests"
130
131         if [ "$#" -gt 0 ]; then
132                 do_make "$@"
133         else
134                 do_make test
135         fi
136 }
137
138 runconfigtests() {
139
140         _runconfigtests_CFLAGS="$1"
141         shift
142
143         _runconfigtests_CC="$1"
144         shift
145
146         _runconfigtests_configure_flags="$1"
147         shift
148
149         _runconfigtests_GEN_HOST="$1"
150         shift
151
152         _runconfigtests_LONG_BIT="$1"
153         shift
154
155         _runconfigtests_run_tests="$1"
156         shift
157
158         if [ "$_runconfigtests_run_tests" -ne 0 ]; then
159                 _runconfigtests_header=$(printf 'Running tests with configure flags')
160         else
161                 _runconfigtests_header=$(printf 'Building with configure flags')
162         fi
163
164         _runconfigtests_header=$(printf "$_runconfigtests_header \"%s\" ...\n" "$_runconfigtests_configure_flags")
165         _runconfigtests_header=$(printf "$_runconfigtests_header\n    CC=%s\n" "$_runconfigseries_CC")
166         _runconfigtests_header=$(printf "$_runconfigtests_header\n    CFLAGS=\"%s\"" "$_runconfigseries_CFLAGS")
167         _runconfigtests_header=$(printf "$_runconfigtests_header\n    LONG_BIT=%s" "$_runconfigtests_LONG_BIT")
168         _runconfigtests_header=$(printf "$_runconfigtests_header\n    GEN_HOST=%s" "$_runconfigtests_GEN_HOST")
169
170         header "$_runconfigtests_header"
171
172         build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
173                 "$_runconfigtests_configure_flags" "$_runconfigtests_GEN_HOST" \
174                 "$_runconfigtests_LONG_BIT"
175
176         if [ "$_runconfigtests_run_tests" -ne 0 ]; then
177                 runtest
178         fi
179
180         do_make clean
181
182         build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
183                 "$_runconfigtests_configure_flags -b" "$_runconfigtests_GEN_HOST" \
184                 "$_runconfigtests_LONG_BIT"
185
186         if [ "$_runconfigtests_run_tests" -ne 0 ]; then
187                 runtest
188         fi
189
190         do_make clean
191
192         build "$_runconfigtests_CFLAGS" "$_runconfigtests_CC" \
193                 "$_runconfigtests_configure_flags -d" "$_runconfigtests_GEN_HOST" \
194                 "$_runconfigtests_LONG_BIT"
195
196         if [ "$_runconfigtests_run_tests" -ne 0 ]; then
197                 runtest
198         fi
199
200         do_make clean
201 }
202
203 runconfigseries() {
204
205         _runconfigseries_CFLAGS="$1"
206         shift
207
208         _runconfigseries_CC="$1"
209         shift
210
211         _runconfigseries_configure_flags="$1"
212         shift
213
214         _runconfigseries_run_tests="$1"
215         shift
216
217         if [ "$run_64_bit" -ne 0 ]; then
218
219                 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
220                         "$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
221
222                 if [ "$run_gen_script" -ne 0 ]; then
223                         runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
224                                 "$_runconfigseries_configure_flags" 0 64 "$_runconfigseries_run_tests"
225                 fi
226
227                 runconfigtests "$_runconfigseries_CFLAGS -DBC_RAND_BUILTIN=0" "$_runconfigseries_CC" \
228                         "$_runconfigseries_configure_flags" 1 64 "$_runconfigseries_run_tests"
229
230         fi
231
232         runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
233                 "$_runconfigseries_configure_flags" 1 32 "$_runconfigseries_run_tests"
234
235         if [ "$run_gen_script" -ne 0 ]; then
236                 runconfigtests "$_runconfigseries_CFLAGS" "$_runconfigseries_CC" \
237                         "$_runconfigseries_configure_flags" 0 32 "$_runconfigseries_run_tests"
238         fi
239 }
240
241 runtestseries() {
242
243         _runtestseries_CFLAGS="$1"
244         shift
245
246         _runtestseries_CC="$1"
247         shift
248
249         _runtestseries_configure_flags="$1"
250         shift
251
252         _runtestseries_run_tests="$1"
253         shift
254
255         _runtestseries_flags="E H N P EH EN EP HN HP NP EHN EHP ENP HNP EHNP"
256
257         runconfigseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
258                 "$_runtestseries_configure_flags" "$_runtestseries_run_tests"
259
260         for f in $_runtestseries_flags; do
261                 runconfigseries "$_runtestseries_CFLAGS" "$_runtestseries_CC" \
262                         "$_runtestseries_configure_flags -$f" "$_runtestseries_run_tests"
263         done
264 }
265
266 runlibtests() {
267
268         _runlibtests_CFLAGS="$1"
269         shift
270
271         _runlibtests_CC="$1"
272         shift
273
274         _runlibtests_configure_flags="$1"
275         shift
276
277         _runlibtests_run_tests="$1"
278         shift
279
280         _runlibtests_configure_flags="$_runlibtests_configure_flags -a"
281
282         build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 64
283
284         if [ "$_runlibtests_run_tests" -ne 0 ]; then
285                 runtest
286         fi
287
288         build "$_runlibtests_CFLAGS" "$_runlibtests_CC" "$_runlibtests_configure_flags" 1 32
289
290         if [ "$_runlibtests_run_tests" -ne 0 ]; then
291                 runtest
292         fi
293 }
294
295 runtests() {
296
297         _runtests_CFLAGS="$1"
298         shift
299
300         _runtests_CC="$1"
301         shift
302
303         _runtests_configure_flags="$1"
304         shift
305
306         _runtests_run_tests="$1"
307         shift
308
309         runtestseries "-std=c99 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
310         runtestseries "-std=c11 $_runtests_CFLAGS" "$_runtests_CC" "$_runtests_configure_flags" "$_runtests_run_tests"
311 }
312
313 karatsuba() {
314
315         header "Running Karatsuba tests"
316         do_make karatsuba_test
317 }
318
319 vg() {
320
321         header "Running valgrind"
322
323         if [ "$run_64_bit" -ne 0 ]; then
324                 _vg_bits=64
325         else
326                 _vg_bits=32
327         fi
328
329         build "$debug" "gcc" "-O0 -g" "1" "$_vg_bits"
330         runtest valgrind
331
332         do_make clean_config
333
334         build "$debug" "gcc" "-O0 -gb" "1" "$_vg_bits"
335         runtest valgrind
336
337         do_make clean_config
338
339         build "$debug" "gcc" "-O0 -gd" "1" "$_vg_bits"
340         runtest valgrind
341
342         do_make clean_config
343 }
344
345 debug() {
346
347         _debug_CC="$1"
348         shift
349
350         _debug_run_tests="$1"
351         shift
352
353         runtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
354
355         if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
356                 runtests "$debug -fsanitize=undefined" "$_debug_CC" "-g" "$_debug_run_tests"
357         fi
358
359         runlibtests "$debug" "$_debug_CC" "-g" "$_debug_run_tests"
360
361         if [ "$_debug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
362                 runlibtests "$debug -fsanitize=undefined" "$_debug_CC" "-g" "$_debug_run_tests"
363         fi
364 }
365
366 release() {
367
368         _release_CC="$1"
369         shift
370
371         _release_run_tests="$1"
372         shift
373
374         runtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
375
376         runlibtests "$release" "$_release_CC" "-O3" "$_release_run_tests"
377 }
378
379 reldebug() {
380
381         _reldebug_CC="$1"
382         shift
383
384         _reldebug_run_tests="$1"
385         shift
386
387         runtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
388
389         if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
390                 runtests "$debug -fsanitize=address" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
391                 runtests "$debug -fsanitize=memory" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
392         fi
393
394         runlibtests "$debug" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
395
396         if [ "$_reldebug_CC" = "clang" -a "$run_sanitizers" -ne 0 ]; then
397                 runlibtests "$debug -fsanitize=address" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
398                 runlibtests "$debug -fsanitize=memory" "$_reldebug_CC" "-gO3" "$_reldebug_run_tests"
399         fi
400 }
401
402 minsize() {
403
404         _minsize_CC="$1"
405         shift
406
407         _minsize_run_tests="$1"
408         shift
409
410         runtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
411
412         runlibtests "$release" "$_minsize_CC" "-Os" "$_minsize_run_tests"
413 }
414
415 build_set() {
416
417         _build_set_CC="$1"
418         shift
419
420         _build_set_run_tests="$1"
421         shift
422
423         debug "$_build_set_CC" "$_build_set_run_tests"
424         release "$_build_set_CC" "$_build_set_run_tests"
425         reldebug "$_build_set_CC" "$_build_set_run_tests"
426         minsize "$_build_set_CC" "$_build_set_run_tests"
427 }
428
429 clang_flags="-Weverything -Wno-padded -Wno-switch-enum -Wno-format-nonliteral"
430 clang_flags="$clang_flags -Wno-cast-align -Wno-missing-noreturn -Wno-disabled-macro-expansion"
431 clang_flags="$clang_flags -Wno-unreachable-code -Wno-unreachable-code-return"
432 clang_flags="$clang_flags -Wno-implicit-fallthrough"
433 gcc_flags="-Wno-maybe-uninitialized -Wno-clobbered"
434
435 cflags="-Wall -Wextra -Werror -pedantic -Wno-conditional-uninitialized"
436
437 debug="$cflags -fno-omit-frame-pointer"
438 release="$cflags -DNDEBUG"
439
440 set -e
441
442 script="$0"
443 scriptdir=$(dirname "$script")
444
445 if [ "$#" -gt 0 ]; then
446         run_tests="$1"
447         shift
448 else
449         run_tests=1
450 fi
451
452 if [ "$#" -gt 0 ]; then
453         gen_tests="$1"
454         shift
455 else
456         gen_tests=1
457 fi
458
459 if [ "$#" -gt 0 ]; then
460         test_with_clang="$1"
461         shift
462 else
463         test_with_clang=1
464 fi
465
466 if [ "$#" -gt 0 ]; then
467         test_with_gcc="$1"
468         shift
469 else
470         test_with_gcc=1
471 fi
472
473 if [ "$#" -gt 0 ]; then
474         run_sanitizers="$1"
475         shift
476 else
477         run_sanitizers=1
478 fi
479
480 if [ "$#" -gt 0 ]; then
481         run_valgrind="$1"
482         shift
483 else
484         run_valgrind=1
485 fi
486
487 if [ "$#" -gt 0 ]; then
488         run_64_bit="$1"
489         shift
490 else
491         run_64_bit=1
492 fi
493
494 if [ "$#" -gt 0 ]; then
495         run_gen_script="$1"
496         shift
497 else
498         run_gen_script=0
499 fi
500
501 if [ "$run_64_bit" -ne 0 ]; then
502         bits=64
503 else
504         bits=32
505 fi
506
507 cd "$scriptdir"
508
509 if [ "$test_with_clang" -ne 0 ]; then
510         defcc="clang"
511 elif [ "$test_with_gcc" -ne 0 ]; then
512         defcc="gcc"
513 else
514         defcc="c99"
515 fi
516
517 export ASAN_OPTIONS="abort_on_error=1"
518 export UBSAN_OPTIONS="print_stack_trace=1,silence_unsigned_overflow=1"
519
520 build "$debug" "$defcc" "-g" "1" "$bits"
521
522 header "Running math library under --standard"
523
524 printf 'quit\n' | bin/bc -ls
525
526 version=$(make version)
527
528 do_make clean_tests
529
530 if [ "$test_with_clang" -ne 0 ]; then
531         build_set "clang" "$run_tests"
532 fi
533
534 if [ "$test_with_gcc" -ne 0 ]; then
535         build_set "gcc" "$run_tests"
536 fi
537
538 if [ "$run_tests" -ne 0 ]; then
539
540         build "$release" "$defcc" "-O3" "1" "$bits"
541
542         karatsuba
543
544         if [ "$run_valgrind" -ne 0 -a "$test_with_gcc" -ne 0 ]; then
545                 vg
546         fi
547
548         printf '\n'
549         printf 'Tests successful.\n'
550
551         set +e
552
553         command -v afl-gcc > /dev/null 2>&1
554         err="$?"
555
556         set -e
557
558         if [ "$err" -eq 0 ]; then
559
560                 header "Configuring for afl-gcc..."
561
562                 configure "$debug $gcc_flags -DBC_ENABLE_RAND=0" "afl-gcc" "-HNP -gO3" "1" "$bits"
563
564                 printf '\n'
565                 printf 'Run make\n'
566                 printf '\n'
567                 printf 'Then run %s/tests/randmath.py and the fuzzer.\n' "$scriptdir"
568                 printf '\n'
569                 printf 'Then run ASan on the fuzzer test cases with the following build:\n'
570                 printf '\n'
571                 printf '    CFLAGS="-fsanitize=address -fno-omit-frame-pointer -DBC_ENABLE_RAND=0" ./configure.sh -gO3 -HNPS\n'
572                 printf '    make\n'
573                 printf '\n'
574                 printf 'Then run the GitHub release script as follows:\n'
575                 printf '\n'
576                 printf '    <github_release> %s .travis.yml codecov.yml release.sh \\\n' "$version"
577                 printf '    RELEASE.md tests/afl.py tests/radamsa.sh tests/radamsa.txt tests/randmath.py \\\n'
578                 printf '    tests/bc/scripts/timeconst.bc\n'
579
580         fi
581
582 fi