]> git.armaanb.net Git - opendoas.git/blob - configure
bump version to 0.2
[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]
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 # : ${VERSION:="$(git describe --dirty --tags --long --always)"}
59 : ${VERSION:="0.2"}
60
61 cat <<EOF >>$CONFIG_MK
62 PREFIX   ?=     ${PREFIX:="/usr"}
63 EPREFIX  ?=     ${EPREFIX:="${PREFIX}"}
64 BINDIR   ?=     ${BINDIR:="${PREFIX}/bin"}
65 SHAREDIR ?=     ${SHAREDIR:="${PREFIX}/share"}
66 MANDIR   ?=     ${MANDIR:="${SHAREDIR}/man"}
67 SYSCONFDIR?=    ${SYSCONFDIR:="/etc"}
68 PAMDIR   ?=     ${PAMDIR:="${SYSCONFDIR}/pam.d"}
69 CFLAGS   +=     -DVERSION="\"${VERSION}\""
70 EOF
71
72 if [ -z "$BUILD" ]; then
73         BUILD="$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]')"
74 fi
75 if [ -z "$HOST" ]; then
76         [ -z "$TARGET" ] && TARGET=$BUILD
77         HOST=$TARGET
78 fi
79 if [ -z "$TARGET" ]; then
80         [ -z "$HOST" ] && HOST=$BUILD
81         TARGET=$HOST
82 fi
83
84 if [ -z "$OS" ]; then
85         # Derive OS from cpu-manufacturer-os-kernel
86         CPU=${TARGET%%-*}
87         REST=${TARGET#*-}
88         MANU=${REST%%-*}
89         REST=${REST#*-}
90         OS=${REST%%-*}
91         REST=${REST#*-}
92         KERNEL=${REST%%-*}
93 fi
94
95 OS_CFLAGS="-D__${OS}__"
96
97 case "$OS" in
98         linux)
99                 OS_CFLAGS="$OS_CFLAGS -D_DEFAULT_SOURCE -D_GNU_SOURCE -DUID_MAX=60000 -DGID_MAX=60000"
100                 printf 'CURDIR   :=     .\n' >>$CONFIG_MK
101                 printf 'PAM_DOAS  =     pam.d__doas__linux\n' >>$CONFIG_MK
102                 ;;
103 esac
104
105 [ -n "$OS_CFLAGS" ] && \
106         printf 'CFLAGS   +=     %s\n' "$OS_CFLAGS" >>$CONFIG_MK
107
108 [ -n "$DEBUG" ] && \
109         printf 'CFLAGS   +=     -O0 -g\n' >>$CONFIG_MK
110
111 [ -n "$BUILD_STATIC" ] && \
112         printf 'CFLAGS   +=     -static\n' >>$CONFIG_MK
113
114 # Add CPPFLAGS/CFLAGS/LDFLAGS to CC for testing features
115 XCC="${CC:=clang} $CFLAGS $OS_CFLAGS $CPPFLAGS $LDFLAGS"
116 # Make sure to disable --as-needed for CC tests.
117 XCC="$XCC -Wl,--no-as-needed"
118
119 check_func() {
120         func="$1"; src="$2"; shift 2
121         printf 'Checking for %-14s\t\t' "$func ..."
122         printf '%s\n' "$src" >"_$func.c"
123         $XCC "_$func.c" -o "_$func" 2>/dev/null
124         ret=$?
125         rm -f "_$func.c" "_$func"
126         if [ $ret -eq 0 ]; then
127                 printf 'yes.\n'
128                 upperfunc="$(printf '%s\n' "$func" | tr '[[:lower:]]' '[[:upper:]]')"
129                 printf 'CFLAGS   +=     -DHAVE_%s\n' "$upperfunc" >>$CONFIG_MK
130                 return 0
131         else
132                 printf 'no.\n'
133                 return 1
134         fi
135 }
136
137 src='
138 #include <string.h>
139 int main(void) {
140         explicit_bzero(NULL, 0);
141         return 0;
142 }'
143 check_func "explicit_bzero" "$src" || {
144         printf 'OPENBSD  +=     explicit_bzero.o\n' >>$CONFIG_MK
145 }
146
147
148 #
149 # Check for strlcat().
150 #
151 src='
152 #include <string.h>
153 int main(void) {
154         const char s1[] = "foo";
155         char s2[10];
156         strlcat(s2, s1, sizeof(s2));
157         return 0;
158 }'
159 check_func "strlcat" "$src" || {
160         printf 'OPENBSD  +=     strlcat.o\n' >>$CONFIG_MK
161 }
162
163 #
164 # Check for strlcpy().
165 #
166 src='
167 #include <string.h>
168 int main(void) {
169         const char s1[] = "foo";
170         char s2[10];
171         strlcpy(s2, s1, sizeof(s2));
172         return 0;
173 }'
174 check_func "strlcpy" "$src" || {
175         printf 'OPENBSD  +=     strlcpy.o\n' >>$CONFIG_MK
176 }
177
178 #
179 # Check for errc().
180 #
181 src='
182 #include <err.h>
183 int main(void) {
184         errc(0, 0, "");
185         return 0;
186 }'
187 check_func "errc" "$src" || {
188         printf 'OPENBSD  +=     errc.o\n' >>$CONFIG_MK
189 }
190
191 #
192 # Check for verrc().
193 #
194 src='
195 #include <err.h>
196 int main(void) {
197         verrc(0, 0, "");
198         return 0;
199 }'
200 check_func "verrc" "$src" || {
201         printf 'OPENBSD  +=     verrc.o\n' >>$CONFIG_MK
202 }
203
204 #
205 # Check for setprogname().
206 #
207 src='
208 #include <stdlib.h>
209 int main(void) {
210         setprogname("");
211         return 0;
212 }'
213 check_func "setprogname" "$src" || {
214         printf 'OPENBSD  +=     progname.o\n' >>$CONFIG_MK
215 }
216
217 #
218 # Check for readpassphrase().
219 #
220 src='
221 #include <readpassphrase.h>
222 int main(void) {
223         char buf[12];
224         readpassphrase("", buf, sizeof(buf), 0);
225         return 0;
226 }'
227 check_func "readpassphrase" "$src" || {
228         printf 'OPENBSD  +=     readpassphrase.o\n' >>$CONFIG_MK
229 }
230
231 #
232 # Check for strtonum().
233 #
234 src='
235 #include <stdlib.h>
236 int main(void) {
237         const char *errstr;
238         strtonum("", 1, 64, &errstr);
239         return 0;
240 }'
241 check_func "strtonum" "$src" || {
242         printf 'OPENBSD  +=     strtonum.o\n' >>$CONFIG_MK
243 }
244
245 #
246 # Check for reallocarray().
247 #
248 src='
249 #include <stdlib.h>
250 int main(void) {
251         reallocarray(NULL, 0, 0);
252         return 0;
253 }'
254 check_func "reallocarray" "$src" || {
255         printf 'OPENBSD  +=     reallocarray.o\n' >>$CONFIG_MK
256 }
257
258 #
259 # Check for bsd_auth.h.
260 #
261 src='
262 #include <bsd_auth.h>
263 int main(void) {
264         return 0;
265 }'
266 check_func "bsd_auth_h" "$src" && \
267         have_bsd_auth_h=1
268
269 #
270 # Check for pam_appl.h.
271 #
272 src='
273 #include <security/pam_appl.h>
274 int main(void) {
275         return 0;
276 }'
277 [ -z "$have_bsd_auth_h" ] && \
278         check_func "pam_appl_h" "$src" && {
279                 printf 'SRCS     +=     doas_pam.c\n' >>$CONFIG_MK
280                 printf 'LDFLAGS  +=     -lpam\n' >>$CONFIG_MK
281         }
282
283 #
284 # Check for login_cap.h.
285 #
286 src='
287 #include <login_cap.h>
288 int main(void) {
289         return 0;
290 }'
291 check_func "login_cap_h" "$src" || {
292         printf 'OPENBSD  +=     setusercontext.o\n' >>$CONFIG_MK
293 }
294
295 #
296 # Check for execvpe().
297 #
298 src='
299 #include <unistd.h>
300 int main(void) {
301         const char *p = { "", NULL };
302         execvpe("", p, p);
303         return 0;
304 }'
305 check_func "execvpe" "$src" || {
306         printf 'OPENBSD  +=     execvpe.o\n' >>$CONFIG_MK
307 }
308
309 #
310 # Check for setresuid().
311 #
312 src='
313 #include <unistd.h>
314 int main(void) {
315         setresuid(0, 0, 0);
316         return 0;
317 }'
318 check_func "setresuid" "$src" || {
319         printf 'OPENBSD  +=     setresuid.o\n' >>$CONFIG_MK
320 }
321
322 #
323 # Check for pledge().
324 #
325 src='
326 #include <unistd.h>
327 int main(void) {
328         pledge("", NULL);
329         return 0;
330 }'
331 check_func "pledge" "$src" && {
332         have_pledge=1
333 }
334
335 #
336 # Check for seccomp.h
337 #
338 src='
339 #include <linux/seccomp.h>
340 #include <sys/prctl.h>
341 #include <unistd.h>
342 int main(void) {
343         prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL);
344         return 0;
345 }'
346 [ -z "$have_pledge" -a -n "$BUILD_SECCOMP" ] && \
347         check_func "seccomp_h" "$src" && \
348         {
349                 have_pledge=1
350                 printf 'OPENBSD  +=     pledge-seccomp.o\n' >>$CONFIG_MK
351         }
352
353 [ -z "$have_pledge" ] && \
354         printf 'OPENBSD  +=     pledge-noop.o\n' >>$CONFIG_MK