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 RELEASE=no
23 usage()
24 {
25 echo "usage: $0 [--help] [--prefix=prefix] [OPTION=VALUE...]" >&2
26 exit 1
27 }
29 if command -v yacc 2>/dev/null >&2; then
30 YACC=yacc
31 elif command -v bison 2>/dev/null >&2; then
32 YACC=bison
33 else
34 # assume yacc by default. Make will fail building parse.y if
35 # not from a release tarball, but at least it'll have a decent
36 # error message.
37 YACC=yacc
38 fi
40 if command -v pkg-config 2>/dev/null >&2; then
41 pkgconfig=pkg-config
42 else
43 pkgconfig=
44 fi
46 conf=
47 user=
48 sock=
49 while [ $# -gt 0 ]; do
50 key="${1%%=*}"
51 val="${1#*=}"
53 if [ "$key" = --help ]; then
54 usage
55 fi
57 if [ "$key" = --prefix ]; then
58 key=PREFIX
59 if [ "$1" = --prefix ]; then # no =, look at next arg
60 if !shift 2>&1 >/dev/null; then
61 echo "$0: missing value for --prefix" >&2
62 exit 1
63 fi
64 val="$1"
65 fi
66 fi
68 if [ "$1" = "$key" ]; then
69 echo "$0: invalid key-value: $1" >&2
70 exit 1
71 fi
73 case "$key" in
74 CC)
75 CC="$val" ;;
76 CFLAGS)
77 CFLAGS="$val" ;;
78 CONF)
79 conf="$val" ;;
80 LDADD)
81 LDADD="$val" ;;
82 LDADD_IMSG)
83 LDADD_IMSG="$val" ;;
84 LDADD_LIBEVENT)
85 LDADD_LIBEVENT="$val" ;;
86 LDADD_LIBSOCKET)
87 LDADD_LIBSOCKET="$val" ;;
88 PKG_CONFIG)
89 pkgconfig="$val" ;;
90 SOCK)
91 sock="$sock" ;;
92 USER)
93 user="$val" ;;
94 YACC)
95 YACC="$val" ;;
96 esac
98 shift
99 done
101 CDIAGFLAGS=
102 CDIAGFLAGS="${CDIAGFLAGS} -Wall -Wextra -Wpointer-arith -Wuninitialized"
103 CDIAGFLAGS="${CDIAGFLAGS} -Wstrict-prototypes -Wmissing-prototypes -Wunused"
104 CDIAGFLAGS="${CDIAGFLAGS} -Wsign-compare -Wshadow -Wno-unused-parameter"
105 CDIAGFLAGS="${CDIAGFLAGS} -Wno-missing-field-initializers"
106 CDIAGFLAGS="${CDIAGFLAGS} -Wno-pointer-sign"
108 # don't ship releases with -Werror
109 test "$RELEASE" = no && CDIAGFLAGS="${CDIAGFLAGS} -Werror"
111 CFLAGS="${CFLAGS:--O2 -pipe} ${CDIAGFLAGS}"
112 CC="${CC:-cc}"
113 LIBS="${LIBS:-}"
114 LDFLAGS="${LDFLAGS:-}"
116 HOSTCC="${HOSTCC:-${CC}}"
117 HOSTCFLAGS="${HOSTCFLAGS:-${CFLAGS}}"
119 echo "running configure for \`template':" >&2
120 (cd ./template && ./configure CC="$HOSTCC" CFLAGS="$HOSTCFLAGS" YACC="$YACC")
121 echo "returning to the configure for \`galileo':" >&2
123 CFLAGS="${CFLAGS} -I. -Itemplate"
124 test -n "$conf" && CFLAGS="${CFLAGS} -DGALILEO_CONF=\"\\\"$conf\\\"\""
125 test -n "$user" && CFLAGS="${CFLAGS} -DGALILEO_USER=\"\\\"$user\\\"\""
126 test -n "$sock" && CFLAGS="${CFLAGS} -DGALILEO_SOCK=\"\\\"$conf\\\"\""
128 [ -w config.log ] && mv config.log config.log.old
130 exec 3> config.log
131 echo "config.log: writing..."
133 COMPATS=
135 HAVE_ACCEPT4=
136 HAVE_ASR_RUN=
137 HAVE_BUFFEREVENT_READ_PRESSURE_CB=
138 HAVE_ENDIAN=0
139 HAVE_ERR=
140 HAVE_EVENT_ASR_RUN=
141 HAVE_FREEZERO=
142 HAVE_GETDTABLECOUNT=
143 HAVE_GETDTABLESIZE=
144 HAVE_GETEXECNAME=
145 HAVE_GETPROGNAME=
146 HAVE_IMSG=
147 HAVE_LIBEVENT=
148 HAVE_LIBEVENT2=
149 HAVE_MACHINE_ENDIAN=0
150 HAVE_PLEDGE=
151 HAVE_REALLOCARRAY=
152 HAVE_RECALLOCARRAY=
153 HAVE_SETGROUPS=
154 HAVE_SETPROCTITLE=
155 HAVE_SETRESGID=
156 HAVE_SETRESUID=
157 HAVE_STRLCAT=
158 HAVE_STRLCPY=
159 HAVE_STRTONUM=
160 HAVE_SYS_ENDIAN=0
161 HAVE_SYS_QUEUE=
162 HAVE_SYS_TREE=
163 HAVE_UNVEIL=
164 HAVE_VASPRINTF=
165 HAVE_WAIT_ANY=
166 HAVE___PROGNAME=
168 # singletest name var extra-cflags extra-libs msg
169 singletest() {
170 msg="$5"
171 if [ -z "$msg" ]; then
172 if [ -n "$3" ]; then
173 msg=" ($3)"
174 elif [ -n "$4" ]; then
175 msg=" ($4)"
176 fi
177 elif [ "$msg" = no ]; then
178 msg=""
179 fi
181 cat >&3 <<EOF
182 ${1}: testing...
183 $CC tests/${1}.c -Werror $3 -o test-$1 $LDFLAGS $4
184 EOF
185 if $CC tests/${1}.c -Werror $3 -o test-$1 $LDFLAGS $4 >&3 2>&3; then
186 rm -f test-${1} test-${1}.d
188 echo "${1}: $CC$msg succeeded" >&3
189 echo "${1}$msg: yes"
190 echo >&3
192 return 0
193 fi
195 echo "${1}: $CC$msg failed with $?" >&3
196 echo "${1}$msg: no"
197 echo >&3
199 return 1
202 # deptest name var
203 deptest() {
204 if singletest "$1" "$2" "${CFLAGS}" "${LIBS}" no; then
205 eval HAVE_${2}=1
206 return 0
207 fi
209 if [ -f compat/${1}.c ]; then
210 COMPATS="compat/${1}.c $COMPATS"
211 fi
213 eval HAVE_${2}=0
214 return 1
217 # runtest name var extra-cflags extra-libs pkgconfig-name
218 runtest() {
219 if singletest "$1" "$2" "" ""; then
220 eval HAVE_${2}=1
221 return 0
222 fi
224 if [ -n "$3" -o -n "$4" ]; then
225 echo "retrying with ${3+$3 }$4" >&3
226 if singletest "$1" "$2" "$3" "$4"; then
227 if [ -n "$3" ]; then
228 CFLAGS="$CFLAGS $3"
229 fi
230 if [ -n "${4}" ]; then
231 LIBS="$LIBS $4"
232 fi
233 eval HAVE_${2}=1
234 return 0
235 fi
236 fi
238 if [ -n "$5" -a -n "$pkgconfig" ]; then
239 if $pkgconfig "$5"; then
240 cflags="$($pkgconfig --cflags "$5")"
241 ldflags="$($pkgconfig --libs "$5")"
242 echo "retrying with pkg-config" >&3
243 if singletest "$1" "$2" "$3" "$cflags" "$ldflags"; then
244 CFLAGS="$CFLAGS $cflags"
245 LIBS="$LIBS $ldflags"
246 eval HAVE_${2}=1
247 return 0
248 fi
249 fi
250 fi
252 if [ -f compat/${1}.c ]; then
253 COMPATS="compat/${1}.c $COMPATS"
254 fi
256 eval HAVE_${2}=0
257 return 1
260 if singletest MMD _MMD -MMD >/dev/null; then
261 CFLAGS="${CFLAGS} -MMD"
262 echo "adding -MMD to CFLAGS" >&2
263 echo "adding -MMD to CFLAGS" >&3
264 fi
266 if ! singletest WAIT_ANY WAIT_ANY; then
267 CFLAGS="${CFLAGS} -DWAIT_ANY=-1"
268 fi
270 runtest endian ENDIAN || \
271 runtest machine_endian MACHINE_ENDIAN || \
272 runtest sys_endian SYS_ENDIAN || true
274 if [ "${HAVE_ENDIAN}" -eq 0 -a \
275 "${HAVE_SYS_ENDIAN}" -eq 0 -a \
276 "${HAVE_MACHINE_ENDIAN}" -eq 0 ]; then
277 echo "FATAL: no endian header found" 1>&2
278 echo "FATAL: no endian header found" 1>&3
279 exit 1
280 fi
282 runtest accept4 ACCEPT4 -D_GNU_SOURCE || true
283 runtest asr_run ASR_RUN "" "-lasr" || true
284 runtest err ERR || true
285 runtest freezero FREEZERO || true
286 runtest getdtablecount GETDTABLECOUNT || true
287 runtest getdtablesize GETDTABLESIZE || true
288 runtest getexecname GETEXECNAME || true
289 runtest getprogname GETPROGNAME || true
290 runtest imsg IMSG "" "-lutil" libimsg || true
291 runtest libevent LIBEVENT "" "-levent" libevent_core || true
292 runtest libtls LIBTLS "" "-ltls" libtls || true
293 runtest pledge PLEDGE || true
294 runtest reallocarray REALLOCARRAY -D_OPENBSD_SOURCE || true
295 runtest recallocarray RECALLOCARRAY -D_OPENBSD_SOURCE || true
296 runtest setgroups SETGROUPS -D_BSD_SOURCE || true
297 runtest setproctitle SETPROCTITLE || true
298 runtest setresgid SETRESGID -D_GNU_SOURCE || true
299 runtest setresuid SETRESUID -D_GNU_SOURCE || true
300 runtest strlcat STRLCAT || true
301 runtest strlcpy STRLCPY || true
302 runtest strtonum STRTONUM || true
303 runtest sys_queue SYS_QUEUE || true
304 runtest sys_tree SYS_TREE || true
305 runtest unveil UNVEIL || true
306 runtest vasprintf VASPRINTF -D_GNU_SOURCE || true
307 runtest __progname __PROGNAME || true
309 deptest bufferevent_read_pressure_cb BEV_READ_PRESSURE || true
310 deptest event_asr_run EVENT_ASR_RUN || true
311 deptest libevent2 LIBEVENT2 || true
313 # mandatory things:
315 if [ "${HAVE_ACCEPT4}" -eq 0 ]; then
316 echo "Fatal: missing accept4(2)" >&2
317 echo "Fatal: missing accept4(2)" >&3
318 exit 1
319 fi
321 if [ "${HAVE_ASR_RUN}" -eq 0 ]; then
322 echo "Fatal: missing libasr" >&2
323 echo "Fatal: missing libasr" >&3
324 exit 1
325 fi
327 if [ "${HAVE_LIBEVENT}" -eq 0 ]; then
328 echo "Fatal: missing libevent" >&2
329 echo "Fatal: missing libevent" >&3
330 exit 1
331 fi
333 if [ "${HAVE_LIBTLS}" -eq 0 ]; then
334 echo "Fatal: missing libtls" >&2
335 echo "Fatal: missing libtls" >&3
336 exit 1
337 fi
339 if [ "${HAVE_SETGROUPS}" -eq 0 ]; then
340 echo "Fatal: missing setgroups(2)" >&2
341 echo "Fatal: missing setgroups(2)" >&3
342 exit 1
343 fi
345 # things we can provide by ourselves:
347 if [ "${HAVE_ENDIAN}" -eq 0 ]; then
348 CFLAGS="-I compat/endian ${CFLAGS}"
349 fi
351 if [ "${HAVE_IMSG}" -eq 0 ]; then
352 CFLAGS="-I compat/imsg ${CFLAGS}"
353 COMPATS="compat/imsg/imsg.c compat/imsg/imsg-buffer.c ${COMPATS}"
354 fi
356 if [ "${HAVE_SYS_QUEUE}" -eq 0 -o "${HAVE_SYS_TREE}" -eq 0 ]; then
357 CFLAGS="-I compat/sys ${CFLAGS}"
358 fi
360 if [ -n "${COMPATS}" ]; then
361 CFLAGS="-I compat/ ${CFLAGS}"
362 fi
364 exec > config.h
365 echo "config.h: writing..." >&2
367 cat <<EOF
368 #ifndef CONFIG_H
369 #define CONFIG_H
371 #ifdef __cplusplus
372 # error "Do not use C++: this is a C application."
373 #endif
375 #define HAVE_ACCEPT4 ${HAVE_ACCEPT4}
376 #define HAVE_ASR_RUN ${HAVE_ASR_RUN}
377 #define HAVE_BUFFEREVENT_READ_PRESSURE_CB ${HAVE_BUFFEREVENT_READ_PRESSURE_CB}
378 #define HAVE_ENDIAN ${HAVE_ENDIAN}
379 #define HAVE_ERR ${HAVE_ERR}
380 #define HAVE_EVENT_ASR_RUN ${HAVE_EVENT_ASR_RUN}
381 #define HAVE_FREEZERO ${HAVE_FREEZERO}
382 #define HAVE_GETDTABLECOUNT ${HAVE_GETDTABLECOUNT}
383 #define HAVE_GETDTABLESIZE ${HAVE_GETDTABLESIZE}
384 #define HAVE_GETEXECNAME ${HAVE_GETEXECNAME}
385 #define HAVE_GETPROGNAME ${HAVE_GETPROGNAME}
386 #define HAVE_IMSG ${HAVE_IMSG}
387 #define HAVE_LIBEVENT ${HAVE_LIBEVENT}
388 #define HAVE_LIBEVENT2 ${HAVE_LIBEVENT2}
389 #define HAVE_MACHINE_ENDIAN ${HAVE_MACHINE_ENDIAN}
390 #define HAVE_PLEDGE ${HAVE_PLEDGE}
391 #define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY}
392 #define HAVE_RECALLOCARRAY ${HAVE_RECALLOCARRAY}
393 #define HAVE_SETGROUPS ${HAVE_SETGROUPS}
394 #define HAVE_SETPROCTITLE ${HAVE_SETPROCTITLE}
395 #define HAVE_SETRESGID ${HAVE_SETRESGID}
396 #define HAVE_SETRESUID ${HAVE_SETRESUID}
397 #define HAVE_STRLCAT ${HAVE_STRLCAT}
398 #define HAVE_STRLCPY ${HAVE_STRLCPY}
399 #define HAVE_STRTONUM ${HAVE_STRTONUM}
400 #define HAVE_SYS_ENDIAN ${HAVE_SYS_ENDIAN}
401 #define HAVE_SYS_QUEUE ${HAVE_SYS_QUEUE}
402 #define HAVE_SYS_TREE ${HAVE_SYS_TREE}
403 #define HAVE_UNVEIL ${HAVE_UNVEIL}
404 #define HAVE_VASPRINTF ${HAVE_VASPRINTF}
405 #define HAVE___PROGNAME ${HAVE___PROGNAME}
407 #endif
408 EOF
410 exec > config.mk
411 echo "config.mk: writing..." >&2
413 cat <<EOF
414 CC= ${CC}
415 CFLAGS= ${CFLAGS}
416 LIBS= ${LIBS}
417 LDFLAGS= ${LDFLAGS}
418 YACC= ${YACC}
420 COMPATS= ${COMPATS}
422 INSTALL= install
423 INSTALL_PROGRAM=\${INSTALL} -m 0555
424 INSTALL_LIB= \${INSTALL} -m 0444
425 INSTALL_MAN= \${INSTALL} -m 0444
426 INSTALL_DATA= \${INSTALL} -m 0444
428 EOF
430 echo "done!" >&2
432 echo >&2
433 echo "Now run \`make' to compile." >&2
434 echo >&2