]> git.armaanb.net Git - opendoas.git/blob - configure
bump version 0.3
[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-static        prepare for static build
26
27   --help, -h             display this help and exit
28 EOF
29         exit 0
30 }
31
32 for x; do
33         opt=${x%%=*}
34         var=${x#*=}
35         case "$opt" in
36         --prefix) PREFIX=$var;;
37         --exec-prefix) EPREFIX=$var;;
38         --bindir) BINDIR=$var;;
39         --datadir) SHAREDIR=$var;;
40         --mandir) MANDIR=$var;;
41         --sysconfdir) SYSCONFDIR=$var;;
42         --pamdir) PAMDIR=$var;;
43         --build) BUILD=$var;;
44         --host) HOST=$var;;
45         --target) TARGET=$var;;
46         --enable-debug) DEBUG=yes;;
47         --enable-static) BUILD_STATIC=yes;;
48         --without-pam) WITHOUT_PAM=yes;;
49         --help|-h) usage;;
50         *) die "Error: unknown option $opt";;
51         esac
52 done
53
54 CONFIG_MK=config.mk
55 rm -f "$CONFIG_MK"
56
57 # : ${VERSION:="$(git describe --dirty --tags --long --always)"}
58 : ${VERSION:="0.3"}
59
60 cat <<EOF >>$CONFIG_MK
61 PREFIX   ?=     ${PREFIX:="/usr"}
62 EPREFIX  ?=     ${EPREFIX:="${PREFIX}"}
63 BINDIR   ?=     ${BINDIR:="${PREFIX}/bin"}
64 SHAREDIR ?=     ${SHAREDIR:="${PREFIX}/share"}
65 MANDIR   ?=     ${MANDIR:="${SHAREDIR}/man"}
66 SYSCONFDIR?=    ${SYSCONFDIR:="/etc"}
67 PAMDIR   ?=     ${PAMDIR:="${SYSCONFDIR}/pam.d"}
68 CFLAGS   +=     -DVERSION="\"${VERSION}\""
69 EOF
70
71 if [ -z "$BUILD" ]; then
72         BUILD="$(uname -m)-unknown-$(uname -s | tr '[:upper:]' '[:lower:]')"
73 fi
74 if [ -z "$HOST" ]; then
75         [ -z "$TARGET" ] && TARGET=$BUILD
76         HOST=$TARGET
77 fi
78 if [ -z "$TARGET" ]; then
79         [ -z "$HOST" ] && HOST=$BUILD
80         TARGET=$HOST
81 fi
82
83 if [ -z "$OS" ]; then
84         # Derive OS from cpu-manufacturer-os-kernel
85         CPU=${TARGET%%-*}
86         REST=${TARGET#*-}
87         MANU=${REST%%-*}
88         REST=${REST#*-}
89         OS=${REST%%-*}
90         REST=${REST#*-}
91         KERNEL=${REST%%-*}
92 fi
93
94 OS_CFLAGS="-D__${OS}__"
95
96 case "$OS" in
97         linux)
98                 OS_CFLAGS="$OS_CFLAGS -D_DEFAULT_SOURCE -D_GNU_SOURCE -DUID_MAX=60000 -DGID_MAX=60000"
99                 printf 'CURDIR   :=     .\n' >>$CONFIG_MK
100                 [ -z "$WITHOUT_PAM" ] && \
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 sys/tree.h.
271 #
272 src='
273 #include <sys/tree.h>
274 int main(void) {
275         return 0;
276 }'
277 check_func "sys_tree_h" "$src"
278
279 #
280 # Check for pam_appl.h.
281 #
282 src='
283 #include <security/pam_appl.h>
284 int main(void) {
285         return 0;
286 }'
287 [ -z "$WITHOUT_PAM" -a -z "$have_bsd_auth_h" ] && \
288         check_func "pam_appl_h" "$src" && {
289                 printf 'SRCS     +=     pam.c\n' >>$CONFIG_MK
290                 printf 'LDFLAGS  +=     -lpam\n' >>$CONFIG_MK
291         }
292
293 #
294 # Check for shadow.h.
295 #
296 src='
297 #include <shadow.h>
298 int main(void) {
299         return 0;
300 }'
301 [ -z "$WITHOUT_PAM" -a -z "$have_bsd_auth_h" ] || \
302         check_func "shadow_h" "$src" && {
303                 printf 'LDFLAGS  +=     -lcrypt\n' >>$CONFIG_MK
304         }
305
306 #
307 # Check for execvpe().
308 #
309 src='
310 #include <unistd.h>
311 int main(void) {
312         const char *p = { "", NULL };
313         execvpe("", p, p);
314         return 0;
315 }'
316 check_func "execvpe" "$src" || {
317         printf 'OPENBSD  +=     execvpe.o\n' >>$CONFIG_MK
318 }
319
320 #
321 # Check for setresuid().
322 #
323 src='
324 #include <unistd.h>
325 int main(void) {
326         setresuid(0, 0, 0);
327         return 0;
328 }'
329 check_func "setresuid" "$src" || {
330         printf 'OPENBSD  +=     setresuid.o\n' >>$CONFIG_MK
331 }
332
333 #
334 # Check for pledge().
335 #
336 src='
337 #include <unistd.h>
338 int main(void) {
339         pledge("", NULL);
340         return 0;
341 }'
342 check_func "pledge" "$src" || {
343         printf 'OPENBSD  +=     pledge-noop.o\n' >>$CONFIG_MK
344 }