configure
1#!/bin/sh
2
3# This configure script written by Brian Callahan <bcallah@openbsd.org>
4# and released into the Public Domain.
5
6Makefile() {
7 if [ $strip -ne 0 ] ; then
8 stripopt="-s"
9 fi
10
11 if [ -z "$cc" ] ; then
12 cc=$CC
13 fi
14cat << EOF > Makefile
15# This Makefile automatically generated by configure.
16
17CC = $cc
18CFLAGS = $cflags
19EOF
20
21if [ ! -z "$ldflags" ] ; then
22cat << EOF >> Makefile
23LDFLAGS = $ldflags
24EOF
25fi
26
27if [ ! -z "$vpath" ] ; then
28cat << EOF >> Makefile
29
30VPATH = $vpath
31EOF
32fi
33
34cat << EOF >> Makefile
35
36PREFIX = $prefix
37BINDIR = $bindir
38MANDIR = $mandir
39
40PROG = $instprog
41OBJS = alloc.o asprintf.o c_ksh.o c_sh.o c_test.o c_ulimit.o edit.o \\
42 emacs.o eval.o exec.o expr.o history.o io.o jobs.o lex.o mail.o \\
43 main.o misc.o path.o shf.o syn.o table.o trap.o tree.o tty.o var.o \\
44 version.o vi.o confstr.o reallocarray.o siglist.o signame.o \\
45 strlcat.o strlcpy.o strtonum.o unvis.o vis.o issetugid.o
46
47all: \${PROG}
48
49\${PROG}: \${OBJS}
50EOF
51
52if [ $compileonly -eq 0 ] ; then
53cat << EOF >> Makefile
54 \${CC} \${LDFLAGS} -o \${PROG} \${OBJS} $libs \${LIBS}
55EOF
56fi
57
58cat << EOF >> Makefile
59
60install:
61 install -d \${DESTDIR}\${BINDIR}
62 install -d \${DESTDIR}\${MANDIR}/man1
63 install -c $stripopt -m 755 \${PROG} \${DESTDIR}\${BINDIR}
64 install -c -m 644 \${PROG}.1 \${DESTDIR}\${MANDIR}/man1
65EOF
66
67if [ $instsh -ne 0 ] ; then
68cat << EOF >> Makefile
69 install -d \${DESTDIR}\${BINDIR}
70 install -d \${DESTDIR}\${MANDIR}/man1
71 install -c $stripopt -m 755 \${PROG} \${DESTDIR}\${BINDIR}/sh
72 install -c -m 644 sh.1 \${DESTDIR}\${MANDIR}/man1
73EOF
74fi
75
76cat << EOF >> Makefile
77 @echo "Please add $bindir/$instprog to /etc/shells"
78EOF
79
80if [ $instsh -ne 0 ] ; then
81cat << EOF >> Makefile
82 @echo "Please add $bindir/sh to /etc/shells"
83EOF
84fi
85
86cat << EOF >> Makefile
87
88uninstall:
89 rm -f \${DESTDIR}\${BINDIR}/\${PROG}
90 rm -f \${DESTDIR}\${MANDIR}/man1/\${PROG}.1
91EOF
92
93if [ $instsh -ne 0 ] ; then
94cat << EOF >> Makefile
95 rm -f \${DESTDIR}\${BINDIR}/sh
96 rm -f \${DESTDIR}\${MANDIR}/man1/sh.1
97EOF
98fi
99
100cat << EOF >> Makefile
101
102test:
103 echo "No tests"
104
105clean:
106 rm -f \${PROG} \${OBJS}
107
108distclean: clean
109 rm -f Makefile pconfig.h *.core
110EOF
111}
112
113asprintfcheck() {
114 cat << EOF > conftest.c
115#include <stdio.h>
116int main(void){asprintf(NULL,NULL);return 0;}
117EOF
118 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
119 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
120 if [ $? -eq 0 ] ; then
121 rm -f conftest conftest.o conftest.c
122 return 0
123 else
124 rm -f conftest conftest.o conftest.c
125 return 1
126 fi
127}
128
129c99check() {
130 cat << EOF > conftest.c
131#include <stdio.h>
132int main(void){long long l;for (int i=0;i<1;i++)printf("%s",__func__);return 0;}
133EOF
134 $cc $cflags -std=c99 -o conftest.o -c conftest.c > /dev/null 2>&1
135 if [ $? -eq 0 ] ; then
136 rm -f conftest conftest.o conftest.c
137 return 0
138 else
139 rm -f conftest conftest.o conftest.c
140 return 1
141 fi
142}
143
144cccheck() {
145 if [ ! -z "$CC" ] ; then
146cat << EOF > conftest.c
147int main(void){return 0;}
148EOF
149 $CC $cflags -o conftest.o -c conftest.c
150 $CC $ldflags -o conftest conftest.o
151 if [ $? -eq 0 ] ; then
152 ./conftest
153 if [ $? -eq 0 ] ; then
154 rm -f conftest conftest.o conftest.c
155 cc="$CC"
156 return 0
157 else
158 echo "could not build working executables"
159 echo "Please ensure your C compiler is a native compiler"
160 exit 1
161 fi
162 else
163 rm -f conftest conftest.o conftest.c
164 fi
165 fi
166
167 for compiler in cc clang pcc tcc lacc cparser ccomp xlc gcc ; do
168cat << EOF > conftest.c
169int main(void){return 0;}
170EOF
171
172 $compiler $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
173 $compiler $ldflags -o conftest conftest.o > /dev/null 2>&1
174
175 if [ $? -eq 0 ] ; then
176 ./conftest
177 if [ $? -eq 0 ] ; then
178 rm -f conftest conftest.o conftest.c
179 cc="$compiler"
180 return 0
181 else
182 echo "could not build working executables"
183 echo "Please ensure your C compiler is a native compiler"
184 exit 1
185 fi
186 else
187 rm -f conftest conftest.o conftest.c
188 fi
189 done
190 return 1
191}
192
193clockgettimecheck() {
194 cat << EOF > conftest.c
195#include <stdio.h>
196#include <time.h>
197int main(void){clock_gettime(0,NULL);return 0;}
198EOF
199 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
200 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
201 if [ $? -eq 0 ] ; then
202 rm -f conftest conftest.o conftest.c
203 return 0
204 else
205 rm -f conftest conftest.o conftest.c
206 return 1
207 fi
208}
209
210clockgettimemacoscheck() {
211 cat << EOF > conftest.c
212int main(void) {
213#if defined(__APPLE__) && defined(__MACH__) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200
214return 0;
215#else
216return 1;
217#endif
218}
219EOF
220 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
221 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
222 if [ $? -eq 0 ] ; then
223 rm -f conftest conftest.o conftest.c
224 return 0
225 else
226 rm -f conftest conftest.o conftest.c
227 return 1
228 fi
229}
230
231clockgettimertcheck() {
232 cat << EOF > conftest.c
233#include <stdio.h>
234#include <time.h>
235int main(void){clock_gettime(0,NULL);return 0;}
236EOF
237 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
238 $cc $ldflags -o conftest conftest.o -lrt > /dev/null 2>&1
239 if [ $? -eq 0 ] ; then
240 rm -f conftest conftest.o conftest.c
241 return 0
242 else
243 rm -f conftest conftest.o conftest.c
244 return 1
245 fi
246}
247
248confstrcheck() {
249 cat << EOF > conftest.c
250#include <unistd.h>
251int main(void){confstr(0,NULL,0);return 0;}
252EOF
253 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
254 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
255 if [ $? -eq 0 ] ; then
256 rm -f conftest conftest.o conftest.c
257 return 0
258 else
259 rm -f conftest conftest.o conftest.c
260 return 1
261 fi
262}
263
264cursescheck() {
265 cat << EOF > conftest.c
266#include <term.h>
267#include <curses.h>
268int main(void){setupterm(NULL, 0, NULL);return 0;}
269EOF
270 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
271 $cc $ldflags -o conftest conftest.o -lcurses > /dev/null 2>&1
272 if [ $? -eq 0 ] ; then
273 rm -f conftest conftest.o conftest.c
274 return 0
275 else
276 rm -f conftest conftest.o conftest.c
277 return 1
278 fi
279}
280
281deadcheck() {
282 cat << EOF > conftest.c
283#include <stdlib.h>
284__dead void usage(void){exit(1);}int main(void){usage();return 0;}
285EOF
286 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
287 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
288 if [ $? -eq 0 ] ; then
289 rm -f conftest conftest.o conftest.c
290 return 0
291 else
292 rm -f conftest conftest.o conftest.c
293 return 1
294 fi
295}
296
297dead2check() {
298 cat << EOF > conftest.c
299#include <stdlib.h>
300__dead2 void usage(void){exit(1);}int main(void){usage();return 0;}
301EOF
302 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
303 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
304 if [ $? -eq 0 ] ; then
305 rm -f conftest conftest.o conftest.c
306 return 0
307 else
308 rm -f conftest conftest.o conftest.c
309 return 1
310 fi
311}
312
313defaultcflagscheck() {
314 cat << EOF > conftest.c
315int main(void){return 0;}
316EOF
317 $cc $cflags -g -O2 -o conftest.o -c conftest.c > /dev/null 2>&1
318 if [ $? -eq 0 ] ; then
319 rm -f conftest conftest.o conftest.c
320 return 1
321 else
322 rm -f conftest conftest.o conftest.c
323 return 0
324 fi
325}
326
327getauxvalcheck() {
328 cat << EOF > conftest.c
329#include <sys/auxv.h>
330int main(void){getauxval(AT_SECURE);return 0;}
331EOF
332 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
333 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
334 if [ $? -eq 0 ] ; then
335 rm -f conftest conftest.o conftest.c
336 return 0
337 else
338 rm -f conftest conftest.o conftest.c
339 return 1
340 fi
341}
342
343gnu99check() {
344 cat << EOF > conftest.c
345#include <stdio.h>
346int main(void){long long l;for (int i=0;i<1;i++)printf("%s",__func__);return 0;}
347EOF
348 $cc $cflags -std=gnu99 -o conftest.o -c conftest.c > /dev/null 2>&1
349 if [ $? -eq 0 ] ; then
350 rm -f conftest conftest.o conftest.c
351 return 0
352 else
353 rm -f conftest conftest.o conftest.c
354 return 1
355 fi
356}
357
358issetugidcheck() {
359 cat << EOF > conftest.c
360#include <unistd.h>
361int main(void){issetugid();return 0;}
362EOF
363 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
364 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
365 if [ $? -eq 0 ] ; then
366 rm -f conftest conftest.o conftest.c
367 return 0
368 else
369 rm -f conftest conftest.o conftest.c
370 return 1
371 fi
372}
373
374ltoflagcheck() {
375 cat << EOF > conftest.c
376int main(void){return 0;}
377EOF
378 $cc $cflags -flto -o conftest.o -c conftest.c > /dev/null 2>&1
379 $cc $ldflags -flto -o conftest conftest.o > /dev/null 2>&1
380 if [ $? -eq 0 ] ; then
381 rm -f conftest conftest.o conftest.c
382 return 1
383 else
384 rm -f conftest conftest.o conftest.c
385 return 0
386 fi
387}
388
389ncursescheck() {
390 cat << EOF > conftest.c
391#include <term.h>
392#include <ncurses.h>
393int main(void){setupterm(NULL, 0, NULL);return 0;}
394EOF
395 $cc $cflags -o conftest.o -c conftest.c -lncurses > /dev/null 2>&1
396 $cc $ldflags -o conftest conftest.o -lncurses > /dev/null 2>&1
397 if [ $? -eq 0 ] ; then
398 rm -f conftest conftest.o conftest.c
399 return 0
400 else
401 rm -f conftest conftest.o conftest.c
402 return 1
403 fi
404}
405
406ncursesncursescheck() {
407 cat << EOF > conftest.c
408#include <ncurses/term.h>
409#include <ncurses/ncurses.h>
410int main(void){setupterm(NULL, 0, NULL);return 0;}
411EOF
412 $cc $cflags -o conftest.o -c conftest.c -lncurses > /dev/null 2>&1
413 $cc $ldflags -o conftest conftest.o -lncurses > /dev/null 2>&1
414 if [ $? -eq 0 ] ; then
415 rm -f conftest conftest.o conftest.c
416 return 0
417 else
418 rm -f conftest conftest.o conftest.c
419 return 1
420 fi
421}
422
423noc99check() {
424 cat << EOF > conftest.c
425#include <stdio.h>
426int main(void){long long l;for (int i=0;i<1;i++)printf("%s",__func__);return 0;}
427EOF
428 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
429 if [ $? -eq 0 ] ; then
430 rm -f conftest conftest.o conftest.c
431 return 0
432 else
433 rm -f conftest conftest.o conftest.c
434 return 1
435 fi
436}
437
438noreturncheck() {
439 cat << EOF > conftest.c
440#include <stdlib.h>
441__attribute__((__noreturn__)) void usage(void){exit(1);}int main(void){usage();return 0;}
442EOF
443 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
444 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
445 if [ $? -eq 0 ] ; then
446 rm -f conftest conftest.o conftest.c
447 return 0
448 else
449 rm -f conftest conftest.o conftest.c
450 return 1
451 fi
452}
453
454pledgecheck() {
455 cat << EOF > conftest.c
456#include <unistd.h>
457int main(void){pledge(NULL,NULL);return 0;}
458EOF
459 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
460 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
461 if [ $? -eq 0 ] ; then
462 rm -f conftest conftest.o conftest.c
463 return 0
464 else
465 rm -f conftest conftest.o conftest.c
466 return 1
467 fi
468}
469
470# Intentionally fail on Android.
471# Avoids header/library mismatches as found on
472# (at least) Termux. Doesn't hurt to use the
473# portable reallocarray in this repo.
474reallocarraycheck() {
475 cat << EOF > conftest.c
476#include <stdlib.h>
477#ifdef __ANDROID__
47800ThisWillDefinitelyFail00
479#endif
480int main(void){reallocarray(NULL, 0, 0);return 0;}
481EOF
482 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
483 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
484 if [ $? -eq 0 ] ; then
485 rm -f conftest conftest.o conftest.c
486 return 0
487 else
488 rm -f conftest conftest.o conftest.c
489 return 1
490 fi
491}
492
493setresgidcheck() {
494 cat << EOF > conftest.c
495#include <sys/types.h>
496#include <unistd.h>
497int main(void){setresgid(0, 0, 0);return 0;}
498EOF
499 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
500 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
501 if [ $? -eq 0 ] ; then
502 rm -f conftest conftest.o conftest.c
503 return 0
504 else
505 rm -f conftest conftest.o conftest.c
506 return 1
507 fi
508}
509
510setresuidcheck() {
511 cat << EOF > conftest.c
512#include <sys/types.h>
513#include <unistd.h>
514int main(void){setresuid(0, 0, 0);return 0;}
515EOF
516 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
517 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
518 if [ $? -eq 0 ] ; then
519 rm -f conftest conftest.o conftest.c
520 return 0
521 else
522 rm -f conftest conftest.o conftest.c
523 return 1
524 fi
525}
526
527siglistcheck() {
528 cat << EOF > conftest.c
529#include <signal.h>
530#include <stdio.h>
531#include <unistd.h>
532int main(void){printf("%s",sys_siglist[0]);return 0;}
533EOF
534 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
535 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
536 if [ $? -eq 0 ] ; then
537 rm -f conftest conftest.o conftest.c
538 return 0
539 else
540 rm -f conftest conftest.o conftest.c
541 return 1
542 fi
543}
544
545signamecheck() {
546 cat << EOF > conftest.c
547#include <signal.h>
548#include <stdio.h>
549#include <unistd.h>
550int main(void){printf("%s",sys_signame[0]);return 0;}
551EOF
552 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
553 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
554 if [ $? -eq 0 ] ; then
555 rm -f conftest conftest.o conftest.c
556 return 0
557 else
558 rm -f conftest conftest.o conftest.c
559 return 1
560 fi
561}
562
563sig_tcheck() {
564 cat << EOF > conftest.c
565#include <signal.h>
566int main(void){sig_t s;return 0;}
567EOF
568 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
569 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
570 if [ $? -eq 0 ] ; then
571 rm -f conftest conftest.o conftest.c
572 return 0
573 else
574 rm -f conftest conftest.o conftest.c
575 return 1
576 fi
577}
578
579sranddeterministiccheck() {
580 cat << EOF > conftest.c
581#include <stdlib.h>
582int main(void){srand_deterministic(0);return 0;}
583EOF
584 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
585 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
586 if [ $? -eq 0 ] ; then
587 rm -f conftest conftest.o conftest.c
588 return 0
589 else
590 rm -f conftest conftest.o conftest.c
591 return 1
592 fi
593}
594
595st_mtimcheck() {
596 cat << EOF > conftest.c
597#include <sys/stat.h>
598int main(void){struct stat s;s.st_mtim.tv_sec=0;return 0;}
599EOF
600 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
601 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
602 if [ $? -eq 0 ] ; then
603 rm -f conftest conftest.o conftest.c
604 return 0
605 else
606 rm -f conftest conftest.o conftest.c
607 return 1
608 fi
609}
610
611st_mtimespeccheck() {
612 cat << EOF > conftest.c
613#include <sys/stat.h>
614int main(void){struct stat s;s.st_mtimespec.tv_sec=0;return 0;}
615EOF
616 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
617 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
618 if [ $? -eq 0 ] ; then
619 rm -f conftest conftest.o conftest.c
620 return 0
621 else
622 rm -f conftest conftest.o conftest.c
623 return 1
624 fi
625}
626
627stravischeck() {
628 cat << EOF > conftest.c
629#include <stdlib.h>
630#include <vis.h>
631int main(void){stravis(NULL, NULL, 0);return 0;}
632EOF
633 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
634 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
635 if [ $? -eq 0 ] ; then
636 rm -f conftest conftest.o conftest.c
637 return 0
638 else
639 rm -f conftest conftest.o conftest.c
640 return 1
641 fi
642}
643
644strlcatcheck() {
645 cat << EOF > conftest.c
646#include <string.h>
647int main(void){strlcat(NULL,NULL,0);return 0;}
648EOF
649 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
650 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
651 if [ $? -eq 0 ] ; then
652 rm -f conftest conftest.o conftest.c
653 return 0
654 else
655 rm -f conftest conftest.o conftest.c
656 return 1
657 fi
658}
659
660strlcpycheck() {
661 cat << EOF > conftest.c
662#include <string.h>
663int main(void){strlcpy(NULL,NULL,0);return 0;}
664EOF
665 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
666 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
667 if [ $? -eq 0 ] ; then
668 rm -f conftest conftest.o conftest.c
669 return 0
670 else
671 rm -f conftest conftest.o conftest.c
672 return 1
673 fi
674}
675
676strtonumcheck() {
677 cat << EOF > conftest.c
678#include <stdlib.h>
679int main(void){strtonum(NULL, 0, 0, NULL);return 0;}
680EOF
681 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
682 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
683 if [ $? -eq 0 ] ; then
684 rm -f conftest conftest.o conftest.c
685 return 0
686 else
687 rm -f conftest conftest.o conftest.c
688 return 1
689 fi
690}
691
692strunvischeck() {
693 cat << EOF > conftest.c
694#include <stdlib.h>
695#include <vis.h>
696int main(void){strunvis(NULL, NULL);return 0;}
697EOF
698 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
699 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
700 if [ $? -eq 0 ] ; then
701 rm -f conftest conftest.o conftest.c
702 return 0
703 else
704 rm -f conftest conftest.o conftest.c
705 return 1
706 fi
707}
708
709timeraddcheck() {
710 cat << EOF > conftest.c
711#include <sys/time.h>
712int main(void){struct timeval a, b, res;timeradd(&a, &b, &res);return 0;}
713EOF
714 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
715 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
716 if [ $? -eq 0 ] ; then
717 rm -f conftest conftest.o conftest.c
718 return 0
719 else
720 rm -f conftest conftest.o conftest.c
721 return 1
722 fi
723}
724
725timerclearcheck() {
726 cat << EOF > conftest.c
727#include <sys/time.h>
728int main(void){struct timeval a;timerclear(&a);return 0;}
729EOF
730 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
731 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
732 if [ $? -eq 0 ] ; then
733 rm -f conftest conftest.o conftest.c
734 return 0
735 else
736 rm -f conftest conftest.o conftest.c
737 return 1
738 fi
739}
740
741timersubcheck() {
742 cat << EOF > conftest.c
743#include <sys/time.h>
744int main(void){struct timeval a, b, res;timersub(&a, &b, &res);return 0;}
745EOF
746 $cc $cflags -o conftest.o -c conftest.c > /dev/null 2>&1
747 $cc $ldflags -o conftest conftest.o > /dev/null 2>&1
748 if [ $? -eq 0 ] ; then
749 rm -f conftest conftest.o conftest.c
750 return 0
751 else
752 rm -f conftest conftest.o conftest.c
753 return 1
754 fi
755}
756
757wflagcheck() {
758 if [ "x$cc" = "xkefir" ] ; then
759 return 0
760 fi
761 cat << EOF > conftest.c
762int main(void){return 0;}
763EOF
764 $cc $cflags -w -o conftest.o -c conftest.c > /dev/null 2>&1
765 if [ $? -eq 0 ] ; then
766 rm -f conftest conftest.o conftest.c
767 return 1
768 else
769 rm -f conftest conftest.o conftest.c
770 return 0
771 fi
772}
773
774# Option variables
775if [ ! -z "$PREFIX" ] ; then
776 prefix="$PREFIX"
777else
778 prefix="/usr"
779fi
780
781doconfigure=1
782compileonly=0
783bindirset=0
784mandirset=0
785bindir="$prefix/bin"
786mandir="$prefix/share/man"
787
788instprog="ksh"
789libs=""
790curses=1
791instsh=0
792static=0
793lto=0
794small=0
795strip=1
796
797# Options
798for opt
799do
800 case "$opt" in
801 --prefix=*)
802 prefix=${opt#*=}
803 if [ $bindirset -eq 0 ] ; then
804 bindir="$prefix/bin"
805 fi
806 if [ $mandirset -eq 0 ] ; then
807 mandir="$prefix/share/man"
808 fi
809 ;;
810 --bindir=*)
811 bindir=${opt#*=}
812 bindirset=1
813 ;;
814 --mandir=*)
815 mandir=${opt#*=}
816 mandirset=1
817 ;;
818 --cc=*)
819 CC=${opt#*=}
820 ;;
821 --cflags=*)
822 CFLAGS=${opt#*=}
823 ;;
824 --disable-curses|--enable-curses)
825 if [ "x$opt" = "x--disable-curses" ] ; then
826 curses=0
827 else
828 curses=1
829 fi
830 ;;
831 --disable-sh|--enable-sh)
832 if [ "x$opt" = "x--enable-sh" ] ; then
833 instsh=1
834 else
835 instsh=0
836 fi
837 ;;
838 --disable-small|--enable-small)
839 if [ "x$opt" = "x--enable-small" ] ; then
840 small=1
841 curses=0
842 else
843 small=0
844 fi
845 ;;
846 --disable-static|--enable-static)
847 if [ "x$opt" = "x--enable-static" ] ; then
848 static=1
849 else
850 static=0
851 fi
852 ;;
853 --disable-lto|--enable-lto)
854 if [ "x$opt" = "x--enable-lto" ] ; then
855 lto=1
856 else
857 lto=0
858 fi
859 ;;
860 --no-thanks)
861 doconfigure=0
862 ;;
863 --no-link)
864 compileonly=1
865 ;;
866 --no-strip)
867 strip=0
868 ;;
869 --help|-h)
870 echo "Usage: configure [options]"
871 echo ""
872 echo "Options:"
873 printf " --help or -h "
874 echo "Display this help message"
875 printf " --prefix=PREFIX "
876 echo "Top level install directory is PREFIX [$prefix]"
877 printf " --bindir=BINDIR "
878 echo "Install executable to BINDIR [$bindir]"
879 printf " --mandir=MANDIR "
880 echo "Install manual pages to MANDIR [$mandir]"
881 printf " --cc=CC "
882 echo "Use specified C compiler [default=cc]"
883 printf " --cflags=CFLAGS "
884 echo "Use specified CFLAGS [default=\"-g -O2\"]"
885 printf " --enable-curses "
886 echo "Use curses library for screen clear [default=yes]"
887 printf " --enable-lto "
888 echo "Enable link-time optimization [default=no]"
889 printf " --enable-sh "
890 echo "Install additional sh executable [default=no]"
891 printf " --enable-small "
892 echo "Disable curses and extended history [default=no]"
893 printf " --enable-static "
894 echo "Statically link executables [default=no]"
895 printf " --no-thanks "
896 echo "Skip all configure checks"
897 printf " --no-link "
898 echo "Compile only, do not link (requires --no-thanks)"
899 printf " --no-strip "
900 echo "Do not strip executables at install [default=strip]"
901 exit 1
902 ;;
903 *)
904 ;;
905 esac
906done
907
908if [ ! -z "$CFLAGS" ] ; then
909 cflags="$CFLAGS -DEMACS -DVI"
910else
911 cflags="-DEMACS -DVI"
912fi
913
914if [ ! -z "$LDFLAGS" ] ; then
915 ldflags="$LDFLAGS"
916else
917 ldflags=""
918fi
919
920if [ $static -ne 0 ] ; then
921 ldflags="$ldflags -static"
922fi
923
924if [ $compileonly -eq 1 ] ; then
925 if [ $doconfigure -eq 1 ] ; then
926 echo "ERROR: --no-link requires --no-thanks"
927 exit 1
928 fi
929fi
930
931if [ $doconfigure -eq 0 ] ; then
932 if [ -z "$CC" ] ; then
933 CC=gcc
934 fi
935 cflags="$cflags -std=gnu99"
936 echo "OK, I trust you."
937 echo "I'll assume you have gcc/clang and little else."
938 echo "Edit Makefile and pconfig.h if needed."
939 echo "Good luck!"
940 cat << EOF > pconfig.h
941/* This file automatically generated by configure. */
942
943#ifndef __dead
944#define __dead __attribute__((__noreturn__))
945#endif
946
947/* #define __attribute__(x) */
948
949/* #define HAVE_ASPRINTF */
950/* #define HAVE_CONFSTR */
951#define NO_CURSES
952/* #define HAVE_ISSETUGID */
953/* #define HAVE_GETAUXVAL */
954/* #define HAVE_PLEDGE */
955/* #define HAVE_REALLOCARRAY */
956/* #define HAVE_SETRESGID */
957/* #define HAVE_SETRESUID */
958/* #define HAVE_SIG_T */
959/* #define HAVE_SRAND_DETERMINISTIC */
960#define HAVE_ST_MTIM
961/* #define HAVE_ST_MTIMESPEC */
962/* #define HAVE_STRAVIS */
963/* #define HAVE_STRLCAT */
964/* #define HAVE_STRLCPY */
965/* #define HAVE_STRTONUM */
966/* #define HAVE_STRUNVIS */
967/* #define HAVE_SIGLIST */
968/* #define HAVE_SIGNAME */
969/* #define HAVE_TIMERADD */
970/* #define HAVE_TIMERCLEAR */
971/* #define HAVE_TIMERSUB */
972EOF
973 Makefile
974
975 exit 0
976fi
977
978printf "checking for C compiler... "
979cccheck
980if [ $? -ne 0 ] ; then
981 echo "not found"
982 echo "Please install a C compiler and re-run configure."
983 exit 1
984else
985 echo "$cc"
986fi
987
988if [ "x$cc" = "xvc" ] ; then
989 echo "using vbcc, setting CFLAGS to -g -O=990"
990 cflags="-g -O=990 -DEMACS -DVI"
991fi
992
993if [ "x$cc" = "xkefir" ] ; then
994 echo "using kefir, setting CFLAGS to -O2"
995 cflags="-O2 -DEMACS -DVI"
996fi
997
998if [ "x$cflags" = "x-DEMACS -DVI" ] ; then
999 printf "checking if the compiler accepts -g -O2... "
1000 defaultcflagscheck
1001 if [ $? -eq 0 ] ; then
1002 echo "no"
1003 else
1004 cflags="-g -O2 $cflags"
1005 echo "yes"
1006 fi
1007fi
1008
1009printf "checking if the compiler can compile C99 without -std=c99... "
1010noc99check
1011if [ $? -ne 0 ] ; then
1012 echo "no"
1013 printf "checking if the compiler can compile C99 with -std=c99... "
1014 cflags="$cflags"
1015 c99check
1016 if [ $? -ne 0 ] ; then
1017 echo "no"
1018 printf "checking if the compiler can compile C99 with -std=gnu99... "
1019 gnu99check
1020 if [ $? -ne 0 ] ; then
1021 echo "no"
1022 echo "You must have a C99 compiler to build ksh!"
1023 exit 1
1024 else
1025 cflags="$cflags -std=gnu99"
1026 echo "yes"
1027 fi
1028 else
1029 cflags="$cflags -std=c99"
1030 echo "yes"
1031 fi
1032else
1033 echo "yes"
1034fi
1035
1036printf "checking for -w compiler flag... "
1037wflagcheck
1038if [ $? -eq 0 ] ; then
1039 echo "no"
1040else
1041 cflags="$cflags -w"
1042 echo "yes"
1043fi
1044
1045printf "checking for OS... "
1046os=`uname -s`
1047echo "$os"
1048
1049case "x$os" in
1050 "xLinux"|"xCYGWIN"*)
1051 cflags="$cflags -D_GNU_SOURCE"
1052 ;;
1053 "xNetBSD")
1054 cflags="$cflags -D_OPENBSD_SOURCE"
1055 ;;
1056 "xOpenBSD")
1057 case "x$cc" in
1058 "xccomp")
1059 cflags="$cflags -D_ANSI_LIBRARY"
1060 ldflags="$ldflags -Wl,-nopie"
1061 ;;
1062 "xchibicc")
1063 cflags="$cflags -D_ANSI_LIBRARY"
1064 ;;
1065 "xkefir")
1066 cflags="$cflags -D_ANSI_LIBRARY"
1067 ;;
1068 "xnwcc")
1069 ldflags="$ldflags -Wl,-nopie"
1070 ;;
1071 "xvc")
1072 cflags="$cflags -D_ANSI_LIBRARY"
1073 ;;
1074 esac
1075 ;;
1076 "xAIX"|"xOS400")
1077 cflags="$cflags -D_ALL_SOURCE"
1078 ldflags="-lbsd"
1079 ;;
1080esac
1081
1082printf "checking for -flto compiler flag... "
1083if [ $lto -eq 0 ] ; then
1084 echo "not enabled"
1085else
1086 ltoflagcheck
1087 if [ $lto -eq 0 ] ; then
1088 echo "no"
1089 else
1090 cflags="$cflags -flto"
1091 ldflags="$ldflags -flto -Wl,-O3"
1092 echo "yes"
1093 fi
1094fi
1095
1096if [ $small -ne 0 ] ; then
1097 cflags="$cflags -DSMALL"
1098fi
1099
1100cat << EOF > pconfig.h
1101/* This file automatically generated by configure. */
1102
1103EOF
1104
1105printf "checking for __dead... "
1106deadcheck
1107if [ $? -eq 0 ] ; then
1108 echo "yes"
1109else
1110 echo "no"
1111 printf "checking for __dead2... "
1112 dead2check
1113 if [ $? -eq 0 ] ; then
1114 echo "#define __dead __dead2" >> pconfig.h
1115 echo "yes"
1116 else
1117 echo "no"
1118 printf "checking for __attribute__((__noreturn__))... "
1119 noreturncheck
1120 if [ $? -eq 0 ] ; then
1121 echo "#define __dead __attribute__((__noreturn__))" >> pconfig.h
1122 echo "yes"
1123 else
1124 echo "#define __attribute__(x)" >> pconfig.h
1125 echo "#define __dead" >> pconfig.h
1126 echo "no"
1127 fi
1128 fi
1129fi
1130
1131printf "checking for asprintf... "
1132asprintfcheck
1133if [ $? -eq 0 ] ; then
1134 echo "#define HAVE_ASPRINTF" >> pconfig.h
1135 echo "yes"
1136else
1137 echo "no"
1138fi
1139
1140printf "checking for clock_gettime in libc... "
1141clockgettimecheck
1142if [ $? -eq 0 ] ; then
1143 echo "yes"
1144else
1145 echo "no"
1146 printf "checking for clock_gettime in librt... "
1147 clockgettimertcheck
1148 if [ $? -eq 0 ] ; then
1149 libs="$libs -lrt"
1150 echo "yes"
1151 else
1152 echo "no"
1153 printf "checking if we are Mac OS X 10.11 or older... "
1154 clockgettimemacoscheck
1155 if [ $? -eq 0 ] ; then
1156 echo "yes"
1157 else
1158 echo "Error: ksh requires clock_gettime()"
1159 exit 1
1160 fi
1161 fi
1162fi
1163
1164printf "checking for confstr... "
1165confstrcheck
1166if [ $? -eq 0 ] ; then
1167 echo "#define HAVE_CONFSTR" >> pconfig.h
1168 echo "yes"
1169else
1170 echo "no"
1171fi
1172
1173printf "checking for curses library... "
1174if [ $curses -eq 1 ] ; then
1175 cursescheck
1176 if [ $? -eq 0 ] ; then
1177 libs="$libs -lcurses"
1178 echo "#define HAVE_CURSES" >> pconfig.h
1179 echo "curses.h"
1180 else
1181 ncursescheck
1182 if [ $? -eq 0 ] ; then
1183 libs="$libs -lncurses"
1184 echo "#define HAVE_NCURSES" >> pconfig.h
1185 echo "ncurses.h"
1186 else
1187 ncursesncursescheck
1188 if [ $? -eq 0 ] ; then
1189 libs="$libs -lncurses"
1190 echo "#define HAVE_NCURSESNCURSES" >> pconfig.h
1191 echo "ncurses/ncurses.h"
1192 else
1193 echo "#define NO_CURSES" >> pconfig.h
1194 echo "not found"
1195 echo "ksh will be built without screen clearing support"
1196 fi
1197 fi
1198 fi
1199else
1200 echo "#define NO_CURSES" >> pconfig.h
1201 echo "disabled by user"
1202 echo "ksh will be built without screen clearing support"
1203fi
1204
1205printf "checking for issetugid... "
1206issetugidcheck
1207if [ $? -eq 0 ] ; then
1208 echo "#define HAVE_ISSETUGID" >> pconfig.h
1209 echo "yes"
1210else
1211 echo "no"
1212 printf "checking for getauxval(AT_SECURE)... "
1213 getauxvalcheck
1214 if [ $? -eq 0 ] ; then
1215 echo "#define HAVE_GETAUXVAL" >> pconfig.h
1216 echo "yes"
1217 else
1218 echo "no"
1219 fi
1220fi
1221
1222printf "checking for pledge... "
1223pledgecheck
1224if [ $? -eq 0 ] ; then
1225 echo "#define HAVE_PLEDGE" >> pconfig.h
1226 echo "yes"
1227else
1228 echo "no"
1229fi
1230
1231printf "checking for reallocarray... "
1232reallocarraycheck
1233if [ $? -eq 0 ] ; then
1234 echo "#define HAVE_REALLOCARRAY" >> pconfig.h
1235 echo "yes"
1236else
1237 echo "no"
1238fi
1239
1240printf "checking for setresgid... "
1241setresgidcheck
1242if [ $? -eq 0 ] ; then
1243 echo "#define HAVE_SETRESGID" >> pconfig.h
1244 echo "yes"
1245else
1246 echo "no"
1247fi
1248
1249printf "checking for setresuid... "
1250setresuidcheck
1251if [ $? -eq 0 ] ; then
1252 echo "#define HAVE_SETRESUID" >> pconfig.h
1253 echo "yes"
1254else
1255 echo "no"
1256fi
1257
1258printf "checking for sig_t... "
1259sig_tcheck
1260if [ $? -eq 0 ] ; then
1261 echo "#define HAVE_SIG_T" >> pconfig.h
1262 echo "yes"
1263else
1264 echo "no"
1265fi
1266
1267printf "checking for srand_deterministic... "
1268sranddeterministiccheck
1269if [ $? -eq 0 ] ; then
1270 echo "#define HAVE_SRAND_DETERMINISTIC" >> pconfig.h
1271 echo "yes"
1272else
1273 echo "no"
1274fi
1275
1276printf "checking for st_mtim... "
1277st_mtimcheck
1278if [ $? -eq 0 ] ; then
1279 echo "#define HAVE_ST_MTIM" >> pconfig.h
1280 echo "yes"
1281else
1282 echo "no"
1283fi
1284
1285printf "checking for st_mtimespec... "
1286st_mtimespeccheck
1287if [ $? -eq 0 ] ; then
1288 echo "#define HAVE_ST_MTIMESPEC" >> pconfig.h
1289 echo "yes"
1290else
1291 echo "no"
1292fi
1293
1294printf "checking for stravis... "
1295stravischeck
1296if [ $? -eq 0 ] ; then
1297 echo "#define HAVE_STRAVIS" >> pconfig.h
1298 echo "yes"
1299else
1300 echo "no"
1301fi
1302
1303printf "checking for strlcat... "
1304strlcatcheck
1305if [ $? -eq 0 ] ; then
1306 echo "#define HAVE_STRLCAT" >> pconfig.h
1307 echo "yes"
1308else
1309 echo "no"
1310fi
1311
1312printf "checking for strlcpy... "
1313strlcpycheck
1314if [ $? -eq 0 ] ; then
1315 echo "#define HAVE_STRLCPY" >> pconfig.h
1316 echo "yes"
1317else
1318 echo "no"
1319fi
1320
1321printf "checking for strtonum... "
1322strtonumcheck
1323if [ $? -eq 0 ] ; then
1324 echo "#define HAVE_STRTONUM" >> pconfig.h
1325 echo "yes"
1326else
1327 echo "no"
1328fi
1329
1330printf "checking for strunvis... "
1331strunvischeck
1332if [ $? -eq 0 ] ; then
1333 echo "#define HAVE_STRUNVIS" >> pconfig.h
1334 echo "yes"
1335else
1336 echo "no"
1337fi
1338
1339printf "checking for sys_siglist... "
1340siglistcheck
1341if [ $? -eq 0 ] ; then
1342 echo "#define HAVE_SIGLIST" >> pconfig.h
1343 echo "yes"
1344else
1345 echo "no"
1346fi
1347
1348printf "checking for sys_signame... "
1349signamecheck
1350if [ $? -eq 0 ] ; then
1351 echo "#define HAVE_SIGNAME" >> pconfig.h
1352 echo "yes"
1353else
1354 echo "no"
1355fi
1356
1357printf "checking for timeradd... "
1358timeraddcheck
1359if [ $? -eq 0 ] ; then
1360 echo "#define HAVE_TIMERADD" >> pconfig.h
1361 echo "yes"
1362else
1363 echo "no"
1364fi
1365
1366printf "checking for timerclear... "
1367timerclearcheck
1368if [ $? -eq 0 ] ; then
1369 echo "#define HAVE_TIMERCLEAR" >> pconfig.h
1370 echo "yes"
1371else
1372 echo "no"
1373fi
1374
1375printf "checking for timersub... "
1376timersubcheck
1377if [ $? -eq 0 ] ; then
1378 echo "#define HAVE_TIMERSUB" >> pconfig.h
1379 echo "yes"
1380else
1381 echo "no"
1382fi
1383
1384printf "checking for out-of-tree build... "
1385if [ "x$(dirname $0)" = "x." ] ; then
1386 echo "no"
1387elif [ "x$(dirname $0)" = "x$(pwd)" ] ; then
1388 echo "no"
1389else
1390 echo "yes"
1391 vpath="$(dirname $0)"
1392 cflags="$cflags -I$(pwd)"
1393fi
1394
1395if [ ! -z "$cflags" ] ; then
1396 cflags="${cflags## }"
1397fi
1398
1399if [ ! -z "$ldflags" ] ; then
1400 ldflags="${ldflags## }"
1401fi
1402
1403printf "creating Makefile... "
1404Makefile
1405echo "done"