t_integration.sh revision 1.65 1 # $NetBSD: t_integration.sh,v 1.65 2021/06/29 09:19:17 rillig Exp $
2 #
3 # Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 # POSSIBILITY OF SUCH DAMAGE.
26 #
27
28 lint1=/usr/libexec/lint1
29
30 : "${machine_arch:="$(sysctl -n hw.machine_arch)"}"
31
32
33 configure_test_case()
34 {
35 local awk
36
37 # shellcheck disable=SC2016
38 awk='
39 function is_ilp32() {
40 return match(machine_arch, /^(arm|coldfire|hppa|i386|m68000|m68k|mips|mips64|or1k|powerpc|riscv32|sh3|sparc|vax)$/)
41 }
42
43 function is_lp64() {
44 return match(machine_arch, /^(aarch64|alpha|ia64|mipsn64|powerpc64|riscv64|sparc64|x86_64)$/)
45 }
46
47 BEGIN {
48 machine_arch = "'"$machine_arch"'"
49 flags = "-g -S -w"
50 seen_only_on_arch = 0
51 match_only_on_arch = 0
52 skip = 0
53 }
54 $1 == "/*" && $2 ~ /^lint1-/ && $NF == "*/" {
55 if ($2 == "lint1-flags:" || $2 == "lint1-extra-flags:") {
56 if ($2 == "lint1-flags:")
57 flags = ""
58 for (i = 3; i < NF; i++)
59 flags = flags " " $i
60 }
61 if ($2 == "lint1-only-on-arch") {
62 seen_only_on_arch = 1
63 if ($3 == machine_arch)
64 match_only_on_arch = 1
65 }
66 if ($2 == "lint1-not-on-arch" && $3 == machine_arch)
67 skip = 1
68 if ($2 == "lint1-only-on-ilp32" && !is_ilp32())
69 skip = 1
70 if ($2 == "lint1-only-on-lp64" && !is_lp64())
71 skip = 1
72 }
73
74 END {
75 if (seen_only_on_arch && !match_only_on_arch)
76 skip = 1
77
78 printf("flags='\''%s'\''\n", flags)
79 printf("skip=%s\n", skip ? "yes" : "no")
80 }
81 '
82
83 eval "$(awk "$awk" "$1")"
84 }
85
86 # shellcheck disable=SC2155
87 check_lint1()
88 {
89 local src="$(atf_get_srcdir)/$1"
90 local exp="${src%.c}.exp"
91 local exp_ln="${src%.c}.exp-ln"
92 local wrk_ln="${1%.c}.ln"
93 local flags=""
94 local skip=""
95
96 if [ ! -f "$exp_ln" ]; then
97 exp_ln='/dev/null'
98 wrk_ln='/dev/null'
99 fi
100
101 configure_test_case "$src"
102
103 if [ "$skip" = "yes" ]; then
104 atf_check -o 'ignore' echo 'skipped'
105 return
106 fi
107
108 if [ -f "$exp" ]; then
109 # shellcheck disable=SC2086
110 atf_check -s not-exit:0 -o "file:$exp" -e empty \
111 "$lint1" $flags "$src" "$wrk_ln"
112 else
113 # shellcheck disable=SC2086
114 atf_check -s exit:0 \
115 "$lint1" $flags "$src" "$wrk_ln"
116 fi
117
118 if [ "$exp_ln" != '/dev/null' ]; then
119 atf_check -o "file:$exp_ln" cat "$wrk_ln"
120 fi
121 }
122
123 atf_init_test_cases()
124 {
125 local src name
126
127 for src in "$(atf_get_srcdir)"/*.c; do
128 src=${src##*/}
129 name=${src%.c}
130
131 atf_test_case "$name"
132 eval "${name}_head() {
133 atf_set 'require.progs' '$lint1'
134 }"
135 eval "${name}_body() {
136 check_lint1 '$name.c'
137 }"
138 atf_add_test_case "$name"
139 done
140 }
141