]> git.armaanb.net Git - opendoas.git/blob - configure
configure: tune up a little bit
[opendoas.git] / configure
1 #!/bin/sh
2
3 die() {
4         printf "$1\n" >&2
5         exit 1
6 }
7
8 usage() {
9         cat <<EOF
10 usage: configure [options] [settings]
11
12   --prefix=PREFIX        installation prefix [/usr]
13   --exec-prefix=EPREFIX  installation prefix for executable files [PREFIX]
14   --bindir=DIR           user executables [PREFIX/bin]
15   --datadir=DIR          architecture-independent data files [PREFIX/share]
16   --mandir=DIR           manual pages [DATADIR/man]
17   --sysconfdir=DIR       directory for configuration files [/etc]
18   --pamdir=DIR           PAM directory [SYSCONFDIR/pam.d]
19
20   --build=build-alias    a cpu-vendor-opsys for the system where the application will be built
21   --host=host-alias      a cpu-vendor-opsys for the system where the application will run
22   --target=target-alias  the machine that CC will produce code for
23
24   --enable-debug         enable debugging
25   --enable-seccomp       enable seccomp
26   --enable-static        prepare for static build
27
28   --help, -h             display this help and exit
29 EOF
30         exit 0
31 }
32
33 for x; do
34         opt=${x%%=*}
35         var=${x#*=}
36         case "$opt" in
37         --prefix) PREFIX=$var;;
38         --exec-prefix) EPREFIX=$var;;
39         --bindir) BINDIR=$var;;
40         --datadir) SHAREDIR=$var;;
41         --mandir) MANDIR=$var;;
42         --sysconfdir) SYSCONFDIR=$var;;
43         --pamdir) PAMDIR=$var;;
44         --build) BUILD=$var;;
45         --host) HOST=$var;;
46         --target) TARGET=$var;;
47         --enable-debug) DEBUG=yes;;
48         --enable-seccomp) BUILD_SECCOMP=yes;;
49         --enable-static) BUILD_STATIC=yes;;
50         --help|-h) usage;;
51         *) die "Error: unknown option $opt";;
52         esac
53 done
54
55 CONFIG_MK=config.mk
56 rm -f "$CONFIG_MK"
57
58 cat <<EOF >>$CONFIG_MK
59 DESTDIR  ?=     /
60 PREFIX   ?=     ${PREFIX:="/usr"}
61 EPREFIX  ?=     ${EPREFIX:="${PREFIX}"}
62 BINDIR   ?=     ${BINDIR:="${PREFIX}/bin"}
63 SHAREDIR ?=     ${SHAREDIR:="${PREFIX}/share"}
64 MANDIR   ?=     ${MANDIR:="${SHAREDIR}/man"}
65 SYSCONFDIR?=    ${SYSCONFDIR:="/etc"}
66 PAMDIR   ?=     ${PAMDIR:="${SYSCONFDIR}/pam.d"}
67 EOF
68
69 if [ -z "$BUILD" ]; then
70         BUILD="$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]')"
71 fi
72 if [ -z "$HOST" ]; then
73         [ -z "$TARGET" ] && TARGET=$BUILD
74         HOST=$TARGET
75 fi
76 if [ -z "$TARGET" ]; then
77         [ -z "$HOST" ] && HOST=$BUILD
78         TARGET=$HOST
79 fi
80
81 if [ -z "$OS" ]; then
82         # Derive OS from cpu-manufacturer-os-kernel
83         CPU=${TARGET%%-*}
84         REST=${TARGET#*-}
85         MANU=${REST%%-*}
86         REST=${REST#*-}
87         OS=${REST%%-*}
88         REST=${REST#*-}
89         KERNEL=${REST%%-*}
90 fi
91
92 case "$OS" in
93         linux)
94                 OS_CFLAGS="-D_DEFAULT_SOURCE -D_GNU_SOURCE -DUID_MAX=60000 -DGID_MAX=60000"
95                 printf 'CURDIR   :=     .\n' >>$CONFIG_MK
96                 printf 'PAM_DOAS  =     pam.d__doas__linux\n' >>$CONFIG_MK
97                 ;;
98 esac
99
100 [ -n "$OS_CFLAGS" ] && \
101         printf 'CFLAGS   +=     %s\n' "$OS_CFLAGS" >>$CONFIG_MK
102
103 [ -n "$DEBUG" ] && \
104         printf 'CFLAGS   +=     -O0 -g\n' >>$CONFIG_MK
105
106 [ -n "$BUILD_STATIC" ] && \
107         printf 'CFLAGS   +=     -static\n' >>$CONFIG_MK
108
109 # Add CPPFLAGS/CFLAGS/LDFLAGS to CC for testing features
110 XCC="${CC:=clang} $CFLAGS $OS_CFLAGS $CPPFLAGS $LDFLAGS"
111 # Make sure to disable --as-needed for CC tests.
112 XCC="$XCC -Wl,--no-as-needed"
113
114 check_func() {
115         func="$1"; src="$2"; shift 2
116         printf 'Checking for %-14s\t\t' "$func ..."
117         printf '%s\n' "$src" >"_$func.c"
118         $XCC "_$func.c" -o "_$func" 2>/dev/null
119         ret=$?
120         rm -f "_$func.c" "_$func"
121         if [ $ret -eq 0 ]; then
122                 printf 'yes.\n'
123                 upperfunc="$(printf '%s\n' "$func" | tr '[[:lower:]]' '[[:upper:]]')"
124                 printf 'CFLAGS   +=     -DHAVE_%s\n' "$upperfunc" >>$CONFIG_MK
125                 return 0
126         else
127                 printf 'no.\n'
128                 return 1
129         fi
130 }
131
132 src='
133 #include <string.h>
134 int main(void) {
135         explicit_bzero(NULL, 0);
136         return 0;
137 }'
138 check_func "explicit_bzero" "$src" || {
139         printf 'OPENBSD  +=     explicit_bzero.c\n' >>$CONFIG_MK
140 }
141
142
143 #
144 # Check for strlcat().
145 #
146 src='
147 #include <string.h>
148 int main(void) {
149         const char s1[] = "foo";
150         char s2[10];
151         strlcat(s2, s1, sizeof(s2));
152         return 0;
153 }'
154 check_func "strlcat" "$src" || {
155         printf 'OPENBSD  +=     strlcat.c\n' >>$CONFIG_MK
156 }
157
158 #
159 # Check for strlcpy().
160 #
161 src='
162 #include <string.h>
163 int main(void) {
164         const char s1[] = "foo";
165         char s2[10];
166         strlcpy(s2, s1, sizeof(s2));
167         return 0;
168 }'
169 check_func "strlcpy" "$src" || {
170         printf 'OPENBSD  +=     strlcpy.c\n' >>$CONFIG_MK
171 }
172
173 #
174 # Check for errc().
175 #
176 src='
177 #include <err.h>
178 int main(void) {
179         errc(0, 0, "");
180         return 0;
181 }'
182 check_func "errc" "$src" || {
183         printf 'OPENBSD  +=     errc.c\n' >>$CONFIG_MK
184 }
185
186 #
187 # Check for verrc().
188 #
189 src='
190 #include <err.h>
191 int main(void) {
192         verrc(0, 0, "");
193         return 0;
194 }'
195 check_func "verrc" "$src" || {
196         printf 'OPENBSD  +=     verrc.c\n' >>$CONFIG_MK
197 }
198
199 #
200 # Check for setprogname().
201 #
202 src='
203 #include <stdlib.h>
204 int main(void) {
205         setprogname("");
206         return 0;
207 }'
208 check_func "setprogname" "$src" || {
209         printf 'OPENBSD  +=     progname.c\n' >>$CONFIG_MK
210 }
211
212 #
213 # Check for readpassphrase().
214 #
215 src='
216 #include <readpassphrase.h>
217 int main(void) {
218         char buf[12];
219         readpassphrase("", buf, sizeof(buf), 0);
220         return 0;
221 }'
222 check_func "readpassphrase" "$src" || {
223         printf 'OPENBSD  +=     readpassphrase.c\n' >>$CONFIG_MK
224 }
225
226 #
227 # Check for strtonum().
228 #
229 src='
230 #include <stdlib.h>
231 int main(void) {
232         const char *errstr;
233         strtonum("", 1, 64, &errstr);
234         return 0;
235 }'
236 check_func "strtonum" "$src" || {
237         printf 'OPENBSD  +=     strtonum.c\n' >>$CONFIG_MK
238 }
239
240 #
241 # Check for reallocarray().
242 #
243 src='
244 #include <stdlib.h>
245 int main(void) {
246         reallocarray(NULL, 0, 0);
247         return 0;
248 }'
249 check_func "reallocarray" "$src" || {
250         printf 'OPENBSD  +=     reallocarray.c\n' >>$CONFIG_MK
251 }
252
253 #
254 # Check for bsd_auth.h.
255 #
256 src='
257 #include <bsd_auth.h>
258 int main(void) {
259         return 0;
260 }'
261 check_func "bsd_auth_h" "$src" && \
262         have_bsd_auth_h=1
263
264 #
265 # Check for pam_appl.h.
266 #
267 src='
268 #include <security/pam_appl.h>
269 int main(void) {
270         return 0;
271 }'
272 [ -z "$have_bsd_auth_h" ] && \
273         check_func "pam_appl_h" "$src" && {
274                 printf 'SRCS     +=     doas_pam.c\n' >>$CONFIG_MK
275         }
276
277 #
278 # Check for login_cap.h.
279 #
280 src='
281 #include <login_cap.h>
282 int main(void) {
283         return 0;
284 }'
285 check_func "login_cap_h" "$src" || {
286         printf 'OPENBSD  +=     setusercontext.c\n' >>$CONFIG_MK
287 }
288
289 #
290 # Check for execvpe().
291 #
292 src='
293 #include <unistd.h>
294 int main(void) {
295         const char *p = { "", NULL };
296         execvpe("", p, p);
297         return 0;
298 }'
299 check_func "execvpe" "$src" || {
300         printf 'OPENBSD  +=     execvpe.c\n' >>$CONFIG_MK
301 }
302
303 #
304 # Check for setresuid().
305 #
306 src='
307 #include <unistd.h>
308 int main(void) {
309         setresuid(0, 0, 0);
310         return 0;
311 }'
312 check_func "setresuid" "$src" || {
313         printf 'OPENBSD  +=     setresuid.c\n' >>$CONFIG_MK
314 }
315
316 #
317 # Check for pledge().
318 #
319 src='
320 #include <unistd.h>
321 int main(void) {
322         pledge("", NULL);
323         return 0;
324 }'
325 check_func "pledge" "$src" && {
326         have_pledge=1
327 }
328
329 #
330 # Check for seccomp.h
331 #
332 src='
333 #include <linux/seccomp.h>
334 #include <sys/prctl.h>
335 #include <unistd.h>
336 int main(void) {
337         prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL);
338         return 0;
339 }'
340 [ -z "$have_pledge" -a -n "$BUILD_SECCOMP" ] && \
341         check_func "seccomp_h" "$src" && \
342         {
343                 have_pledge=1
344                 printf 'OPENBSD  +=     pledge-seccomp.c\n' >>$CONFIG_MK
345         }
346
347 [ -z "$have_pledge" ] && \
348         printf 'OPENBSD  +=     pledge-noop.c\n' >>$CONFIG_MK