Blame


1 014c66b6 2023-06-25 op #!/bin/sh
2 014c66b6 2023-06-25 op #
3 014c66b6 2023-06-25 op # Copyright (c) 2014, 2015, 2016 Ingo Schwarze <schwarze@openbsd.org>
4 014c66b6 2023-06-25 op # Copyright (c) 2017, 2018 Kristaps Dzonsons <kristaps@bsd.lv>
5 014c66b6 2023-06-25 op # Copyright (c) 2022 Omar Polo <op@omarpolo.com>
6 014c66b6 2023-06-25 op #
7 014c66b6 2023-06-25 op # Permission to use, copy, modify, and distribute this software for any
8 014c66b6 2023-06-25 op # purpose with or without fee is hereby granted, provided that the above
9 014c66b6 2023-06-25 op # copyright notice and this permission notice appear in all copies.
10 014c66b6 2023-06-25 op #
11 014c66b6 2023-06-25 op # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 014c66b6 2023-06-25 op # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 014c66b6 2023-06-25 op # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 014c66b6 2023-06-25 op # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 014c66b6 2023-06-25 op # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 014c66b6 2023-06-25 op # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 014c66b6 2023-06-25 op # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 014c66b6 2023-06-25 op
19 014c66b6 2023-06-25 op set -e
20 014c66b6 2023-06-25 op
21 014c66b6 2023-06-25 op if command -v yacc 2>/dev/null >&2; then
22 014c66b6 2023-06-25 op YACC=yacc
23 014c66b6 2023-06-25 op elif command -v bison 2>/dev/null >&2; then
24 014c66b6 2023-06-25 op YACC=bison
25 014c66b6 2023-06-25 op else
26 014c66b6 2023-06-25 op YACC=
27 014c66b6 2023-06-25 op fi
28 014c66b6 2023-06-25 op
29 014c66b6 2023-06-25 op while [ $# -gt 0 ]; do
30 014c66b6 2023-06-25 op key="${1%%=*}"
31 014c66b6 2023-06-25 op val="${1#*=}"
32 014c66b6 2023-06-25 op
33 014c66b6 2023-06-25 op if [ "$1" = "$key" ]; then
34 014c66b6 2023-06-25 op echo "$0: invalid key-value: $1" >&2
35 014c66b6 2023-06-25 op exit 1
36 014c66b6 2023-06-25 op fi
37 014c66b6 2023-06-25 op
38 014c66b6 2023-06-25 op case "$key" in
39 014c66b6 2023-06-25 op CC)
40 014c66b6 2023-06-25 op CC="$val" ;;
41 014c66b6 2023-06-25 op CFLAGS)
42 014c66b6 2023-06-25 op CFLAGS="$val" ;;
43 014c66b6 2023-06-25 op YACC)
44 014c66b6 2023-06-25 op YACC="$val" ;;
45 014c66b6 2023-06-25 op esac
46 014c66b6 2023-06-25 op
47 014c66b6 2023-06-25 op shift
48 014c66b6 2023-06-25 op done
49 014c66b6 2023-06-25 op
50 014c66b6 2023-06-25 op if [ -z "$YACC" ]; then
51 014c66b6 2023-06-25 op echo "fatal: can't find yacc or bison." >&2
52 014c66b6 2023-06-25 op exit 1
53 014c66b6 2023-06-25 op fi
54 014c66b6 2023-06-25 op
55 014c66b6 2023-06-25 op [ -w config.log ] && mv config.log config.log.old
56 014c66b6 2023-06-25 op
57 014c66b6 2023-06-25 op exec 3> config.log
58 014c66b6 2023-06-25 op echo "config.log: writing..."
59 014c66b6 2023-06-25 op
60 014c66b6 2023-06-25 op CC="${CC:-cc}"
61 014c66b6 2023-06-25 op CFLAGS="${CFLAGS:--O2 -pipe} -I."
62 014c66b6 2023-06-25 op LIBS="${LIBS:-}"
63 014c66b6 2023-06-25 op LDFLAGS="${LDFLAGS:-}"
64 014c66b6 2023-06-25 op
65 014c66b6 2023-06-25 op COMPATS=
66 014c66b6 2023-06-25 op
67 014c66b6 2023-06-25 op HAVE_ERR=
68 014c66b6 2023-06-25 op HAVE_FREEZERO=
69 014c66b6 2023-06-25 op HAVE_GETEXECNAME=
70 014c66b6 2023-06-25 op HAVE_GETPROGNAME=
71 014c66b6 2023-06-25 op HAVE_PLEDGE=
72 014c66b6 2023-06-25 op HAVE_REALLOCARRAY=
73 014c66b6 2023-06-25 op HAVE_STRLCAT=
74 014c66b6 2023-06-25 op HAVE_STRLCPY=
75 014c66b6 2023-06-25 op HAVE_STRTONUM=
76 014c66b6 2023-06-25 op HAVE_SYS_QUEUE=
77 014c66b6 2023-06-25 op HAVE_UNVEIL=
78 014c66b6 2023-06-25 op HAVE_VASPRINTF=
79 014c66b6 2023-06-25 op HAVE___PROGNAME=
80 014c66b6 2023-06-25 op
81 014c66b6 2023-06-25 op # singletest message var extra-cflags extra-libs
82 014c66b6 2023-06-25 op singletest() {
83 014c66b6 2023-06-25 op cat >&3 <<EOF
84 014c66b6 2023-06-25 op ${1}: testing...
85 014c66b6 2023-06-25 op $CC ./../tests/${1}.c -Werror $3 -o test-$1 $LDFLAGS $4
86 014c66b6 2023-06-25 op EOF
87 014c66b6 2023-06-25 op if $CC ./../tests/${1}.c -Werror $3 -o test-$1 $LDFLAGS $4 >&3 2>&3; then
88 014c66b6 2023-06-25 op rm -f test-${1} test-${1}.d
89 014c66b6 2023-06-25 op
90 014c66b6 2023-06-25 op if [ -n "$3" ]; then
91 014c66b6 2023-06-25 op echo "${1}: $CC $3 succeeded" >&3
92 014c66b6 2023-06-25 op echo "${1} ($3): yes"
93 014c66b6 2023-06-25 op elif [ -n "${4}" ]; then
94 014c66b6 2023-06-25 op echo "${1}: $CC $4 succeeded" >&3
95 014c66b6 2023-06-25 op echo "${1} ($4): yes"
96 014c66b6 2023-06-25 op else
97 014c66b6 2023-06-25 op echo "${1}: $CC succeeded" >&3
98 014c66b6 2023-06-25 op echo "${1}: yes"
99 014c66b6 2023-06-25 op fi
100 014c66b6 2023-06-25 op echo >&3
101 014c66b6 2023-06-25 op
102 014c66b6 2023-06-25 op return 0
103 014c66b6 2023-06-25 op fi
104 014c66b6 2023-06-25 op
105 014c66b6 2023-06-25 op if [ -n "$3" ]; then
106 014c66b6 2023-06-25 op echo "${1}: $CC $3 failed with $?" >&3
107 014c66b6 2023-06-25 op echo "${1} ($3): no"
108 014c66b6 2023-06-25 op elif [ -n "${4}" ]; then
109 014c66b6 2023-06-25 op echo "${1}: $CC $4 failed with $?" >&3
110 014c66b6 2023-06-25 op echo "${1} ($4): no"
111 014c66b6 2023-06-25 op else
112 014c66b6 2023-06-25 op echo "${1}: $CC failed with $?" >&3
113 014c66b6 2023-06-25 op echo "${1}: no"
114 014c66b6 2023-06-25 op fi
115 014c66b6 2023-06-25 op echo >&3
116 014c66b6 2023-06-25 op
117 014c66b6 2023-06-25 op return 1
118 014c66b6 2023-06-25 op }
119 014c66b6 2023-06-25 op
120 014c66b6 2023-06-25 op # runtest message var extra-cflags extra-libs pkgconfig-name
121 014c66b6 2023-06-25 op runtest() {
122 014c66b6 2023-06-25 op if singletest "$1" "$2" "" ""; then
123 014c66b6 2023-06-25 op eval HAVE_${2}=1
124 014c66b6 2023-06-25 op return 0
125 014c66b6 2023-06-25 op fi
126 014c66b6 2023-06-25 op
127 014c66b6 2023-06-25 op if [ -n "$3" -o -n "$4" ]; then
128 014c66b6 2023-06-25 op echo "retrying with ${3+$3 }$4" >&3
129 014c66b6 2023-06-25 op if singletest "$1" "$2" "$3" "$4"; then
130 014c66b6 2023-06-25 op if [ -n "$3" ]; then
131 014c66b6 2023-06-25 op CFLAGS="$CFLAGS $3"
132 014c66b6 2023-06-25 op fi
133 014c66b6 2023-06-25 op if [ -n "${4}" ]; then
134 014c66b6 2023-06-25 op LIBS="$LIBS $4"
135 014c66b6 2023-06-25 op fi
136 014c66b6 2023-06-25 op eval HAVE_${2}=1
137 014c66b6 2023-06-25 op return 0
138 014c66b6 2023-06-25 op fi
139 014c66b6 2023-06-25 op fi
140 014c66b6 2023-06-25 op
141 014c66b6 2023-06-25 op if [ -f ./../compat/${1}.c ]; then
142 014c66b6 2023-06-25 op COMPATS="${1}.o $COMPATS"
143 014c66b6 2023-06-25 op fi
144 014c66b6 2023-06-25 op
145 014c66b6 2023-06-25 op eval HAVE_${2}=0
146 014c66b6 2023-06-25 op return 1
147 014c66b6 2023-06-25 op }
148 014c66b6 2023-06-25 op
149 014c66b6 2023-06-25 op if runtest MMD _MMD -MMD >/dev/null; then
150 014c66b6 2023-06-25 op echo "adding -MMD to CFLAGS" >&2
151 014c66b6 2023-06-25 op echo "adding -MMD to CFLAGS" >&3
152 014c66b6 2023-06-25 op fi
153 014c66b6 2023-06-25 op
154 014c66b6 2023-06-25 op runtest err ERR || true
155 014c66b6 2023-06-25 op runtest freezero FREEZERO || true
156 014c66b6 2023-06-25 op runtest getexecname GETEXECNAME || true
157 014c66b6 2023-06-25 op runtest getprogname GETPROGNAME || true
158 014c66b6 2023-06-25 op runtest pledge PLEDGE || true
159 014c66b6 2023-06-25 op runtest reallocarray REALLOCARRAY -D_OPENBSD_SOURCE || true
160 014c66b6 2023-06-25 op runtest strlcat STRLCAT || true
161 014c66b6 2023-06-25 op runtest strlcpy STRLCPY || true
162 014c66b6 2023-06-25 op runtest strtonum STRTONUM || true
163 014c66b6 2023-06-25 op runtest sys_queue SYS_QUEUE || true
164 014c66b6 2023-06-25 op runtest unveil UNVEIL || true
165 014c66b6 2023-06-25 op runtest vasprintf VASPRINTF -D_GNU_SOURCE || true
166 014c66b6 2023-06-25 op runtest __progname __PROGNAME || true
167 014c66b6 2023-06-25 op
168 014c66b6 2023-06-25 op if [ "${HAVE_SYS_QUEUE}" -eq 0 ]; then
169 014c66b6 2023-06-25 op CFLAGS="-I ./../compat/sys ${CFLAGS}"
170 014c66b6 2023-06-25 op fi
171 014c66b6 2023-06-25 op
172 014c66b6 2023-06-25 op if [ -n "${COMPATS}" ]; then
173 014c66b6 2023-06-25 op CFLAGS="-I ./../compat/ ${CFLAGS}"
174 014c66b6 2023-06-25 op fi
175 014c66b6 2023-06-25 op
176 014c66b6 2023-06-25 op exec > config.h
177 014c66b6 2023-06-25 op echo "config.h: writing..." >&2
178 014c66b6 2023-06-25 op
179 014c66b6 2023-06-25 op cat <<EOF
180 014c66b6 2023-06-25 op #ifndef CONFIG_H
181 014c66b6 2023-06-25 op #define CONFIG_H
182 014c66b6 2023-06-25 op
183 014c66b6 2023-06-25 op #ifdef __cplusplus
184 014c66b6 2023-06-25 op # error "Do not use C++: this is a C application."
185 014c66b6 2023-06-25 op #endif
186 014c66b6 2023-06-25 op
187 014c66b6 2023-06-25 op #define HAVE_ERR ${HAVE_ERR}
188 014c66b6 2023-06-25 op #define HAVE_FREEZERO ${HAVE_FREEZERO}
189 014c66b6 2023-06-25 op #define HAVE_GETEXECNAME ${HAVE_GETEXECNAME}
190 014c66b6 2023-06-25 op #define HAVE_GETPROGNAME ${HAVE_GETPROGNAME}
191 014c66b6 2023-06-25 op #define HAVE_PLEDGE ${HAVE_PLEDGE}
192 014c66b6 2023-06-25 op #define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY}
193 014c66b6 2023-06-25 op #define HAVE_STRLCAT ${HAVE_STRLCAT}
194 014c66b6 2023-06-25 op #define HAVE_STRLCPY ${HAVE_STRLCPY}
195 014c66b6 2023-06-25 op #define HAVE_STRTONUM ${HAVE_STRTONUM}
196 014c66b6 2023-06-25 op #define HAVE_SYS_QUEUE ${HAVE_SYS_QUEUE}
197 014c66b6 2023-06-25 op #define HAVE_UNVEIL ${HAVE_UNVEIL}
198 014c66b6 2023-06-25 op #define HAVE_VASPRINTF ${HAVE_VASPRINTF}
199 014c66b6 2023-06-25 op #define HAVE___PROGNAME ${HAVE___PROGNAME}
200 014c66b6 2023-06-25 op
201 014c66b6 2023-06-25 op #endif
202 014c66b6 2023-06-25 op EOF
203 014c66b6 2023-06-25 op
204 014c66b6 2023-06-25 op exec > config.mk
205 014c66b6 2023-06-25 op echo "config.mk: writing..." >&2
206 014c66b6 2023-06-25 op
207 014c66b6 2023-06-25 op cat <<EOF
208 014c66b6 2023-06-25 op CC = ${CC}
209 014c66b6 2023-06-25 op CFLAGS = ${CFLAGS}
210 014c66b6 2023-06-25 op LIBS = ${LIBS}
211 014c66b6 2023-06-25 op LDFLAGS = ${LDFLAGS}
212 014c66b6 2023-06-25 op YACC = ${YACC}
213 014c66b6 2023-06-25 op
214 014c66b6 2023-06-25 op COBJS = ${COMPATS}
215 014c66b6 2023-06-25 op
216 014c66b6 2023-06-25 op INSTALL= install
217 014c66b6 2023-06-25 op INSTALL_PROGRAM=\${INSTALL} -m 0555
218 014c66b6 2023-06-25 op INSTALL_LIB= \${INSTALL} -m 0444
219 014c66b6 2023-06-25 op INSTALL_MAN= \${INSTALL} -m 0444
220 014c66b6 2023-06-25 op INSTALL_DATA= \${INSTALL} -m 0444
221 014c66b6 2023-06-25 op
222 014c66b6 2023-06-25 op EOF
223 014c66b6 2023-06-25 op
224 014c66b6 2023-06-25 op for c in ${COMPATS}; do
225 014c66b6 2023-06-25 op src="../compat/${c%.o}.c"
226 014c66b6 2023-06-25 op cat <<EOF
227 014c66b6 2023-06-25 op $c: $src
228 014c66b6 2023-06-25 op \${CC} \${CFLAGS} -c $src -o \$@
229 014c66b6 2023-06-25 op EOF
230 014c66b6 2023-06-25 op done
231 014c66b6 2023-06-25 op
232 014c66b6 2023-06-25 op echo "done!" >&2
233 014c66b6 2023-06-25 op echo >&2