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