]> git.armaanb.net Git - opendoas.git/blob - configure
Fix typos and configure pledge detection
[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         $XCC "_$func.c" -o "_$func" 2>/dev/null
89         ret=$?
90         rm -f "_$func.c" "_$func"
91         if [ $ret -eq 0 ]; then
92                 printf 'yes.\n'
93                 upperfunc="$(printf '%s\n' "$func" | tr '[[:lower:]]' '[[:upper:]]')"
94                 printf 'CFLAGS   +=     -DHAVE_%s\n' "$upperfunc" >>$CONFIG_MK
95                 return 0
96         else
97                 printf 'no.\n'
98                 return 1
99         fi
100 }
101
102 src='
103 #include <string.h>
104 int main(void) {
105         explicit_bzero(NULL, 0);
106         return 0;
107 }'
108 check_func "explicit_bzero" "$src" || {
109         printf 'OPENBSD  +=     explicit_bzero.c\n' >>$CONFIG_MK
110 }
111
112
113 #
114 # Check for strlcat().
115 #
116 src='
117 #include <string.h>
118 int main(void) {
119         const char s1[] = "foo";
120         char s2[10];
121         strlcat(s2, s1, sizeof(s2));
122         return 0;
123 }'
124 check_func "strlcat" "$src" || {
125         printf 'OPENBSD  +=     strlcat.c\n' >>$CONFIG_MK
126 }
127
128 #
129 # Check for strlcpy().
130 #
131 src='
132 #include <string.h>
133 int main(void) {
134         const char s1[] = "foo";
135         char s2[10];
136         strlcpy(s2, s1, sizeof(s2));
137         return 0;
138 }'
139 check_func "strlcpy" "$src" || {
140         printf 'OPENBSD  +=     strlcpy.c\n' >>$CONFIG_MK
141 }
142
143 #
144 # Check for errc().
145 #
146 src='
147 #include <err.h>
148 int main(void) {
149         errc(0, 0, "");
150         return 0;
151 }'
152 check_func "errc" "$src" || {
153         printf 'OPENBSD  +=     errc.c\n' >>$CONFIG_MK
154 }
155
156 #
157 # Check for verrc().
158 #
159 src='
160 #include <err.h>
161 int main(void) {
162         verrc(0, 0, "");
163         return 0;
164 }'
165 check_func "verrc" "$src" || {
166         printf 'OPENBSD  +=     verrc.c\n' >>$CONFIG_MK
167 }
168
169 #
170 # Check for setprogname().
171 #
172 src='
173 #include <stdlib.h>
174 int main(void) {
175         setprogname("");
176         return 0;
177 }'
178 check_func "setprogname" "$src" || {
179         printf 'OPENBSD  +=     progname.c\n' >>$CONFIG_MK
180 }
181
182 #
183 # Check for readpassphrase().
184 #
185 src='
186 #include <readpassphrase.h>
187 int main(void) {
188         char buf[12];
189         readpassphrase("", buf, sizeof(buf), 0);
190         return 0;
191 }'
192 check_func "readpassphrase" "$src" || {
193         printf 'OPENBSD  +=     readpassphrase.c\n' >>$CONFIG_MK
194 }
195
196 #
197 # Check for strtonum().
198 #
199 src='
200 #include <stdlib.h>
201 int main(void) {
202         const char *errstr;
203         strtonum("", 1, 64, &errstr);
204         return 0;
205 }'
206 check_func "strtonum" "$src" || {
207         printf 'OPENBSD  +=     strtonum.c\n' >>$CONFIG_MK
208 }
209
210 #
211 # Check for reallocarray().
212 #
213 src='
214 #include <stdlib.h>
215 int main(void) {
216         reallocarray(NULL, 0, 0);
217         return 0;
218 }'
219 check_func "reallocarray" "$src" || {
220         printf 'OPENBSD  +=     reallocarray.c\n' >>$CONFIG_MK
221 }
222
223 #
224 # Check for bsd_auth.h.
225 #
226 src='
227 #include <bsd_auth.h>
228 int main(void) {
229         return 0;
230 }'
231 check_func "bsd_auth_h" "$src" || {
232         printf 'OPENBSD  +=     auth_userokay.c\n' >>$CONFIG_MK
233 }
234
235 #
236 # Check for login_cap.h.
237 #
238 src='
239 #include <login_cap.h>
240 int main(void) {
241         return 0;
242 }'
243 check_func "login_cap_h" "$src" || {
244         printf 'OPENBSD  +=     setusercontext.c\n' >>$CONFIG_MK
245 }
246
247 #
248 # Check for execvpe().
249 #
250 src='
251 #include <unistd.h>
252 int main(void) {
253         const char *p = { "", NULL };
254         execvpe("", p, p);
255         return 0;
256 }'
257 check_func "execvpe" "$src" || {
258         printf 'OPENBSD  +=     execvpe.c\n' >>$CONFIG_MK
259 }
260
261 #
262 # Check for setresuid().
263 #
264 src='
265 #include <unistd.h>
266 int main(void) {
267         setresuid(0, 0, 0);
268         return 0;
269 }'
270 check_func "setresuid" "$src" || {
271         printf 'OPENBSD  +=     setresuid.c\n' >>$CONFIG_MK
272 }
273
274 #
275 # Check for pledge().
276 #
277 src='
278 #include <unistd.h>
279 int main(void) {
280         pledge("", NULL);
281         return 0;
282 }'
283 check_func "pledge" "$src" && {
284         have_pledge=1
285 }
286
287 #
288 # Check for seccomp.h
289 #
290 src='
291 #include <linux/seccomp.h>
292 #include <sys/prctl.h>
293 #include <unistd.h>
294 int main(void) {
295         prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, NULL);
296         return 0;
297 }'
298 [ -z "$have_pledge" -a -n "$BUILD_SECCOMP" ] && \
299         check_func "seccomp_h" "$src" && \
300         {
301                 have_pledge=1
302                 printf 'OPENBSD  +=     pledge-seccomp.c\n' >>$CONFIG_MK
303         }
304
305 [ -z "$have_pledge" ] && \
306         printf 'OPENBSD  +=     pledge-noop.c\n' >>$CONFIG_MK