Blob


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