1# configure.ac
2
3AC_INIT([tmux], 3.5a)
4AC_PREREQ([2.60])
5
6AC_CONFIG_AUX_DIR(etc)
7AC_CONFIG_LIBOBJ_DIR(compat)
8AM_INIT_AUTOMAKE([foreign subdir-objects])
9
10AC_CANONICAL_HOST
11
12# When CFLAGS isn't set at this stage and gcc is detected by the macro below,
13# autoconf will automatically use CFLAGS="-O2 -g". Prevent that by using an
14# empty default.
15: ${CFLAGS=""}
16
17# Save user CPPFLAGS, CFLAGS and LDFLAGS. We need to change them because
18# AC_CHECK_HEADER doesn't give us any other way to update the include
19# paths. But for Makefile.am we want to use AM_CPPFLAGS and friends.
20SAVED_CFLAGS="$CFLAGS"
21SAVED_CPPFLAGS="$CPPFLAGS"
22SAVED_LDFLAGS="$LDFLAGS"
23
24# Is this oss-fuzz build?
25AC_ARG_ENABLE(
26          fuzzing,
27          AS_HELP_STRING(--enable-fuzzing, build fuzzers)
28)
29AC_ARG_VAR(
30          FUZZING_LIBS,
31          AS_HELP_STRING(libraries to link fuzzing targets with)
32)
33
34# Set up convenient fuzzing defaults before initializing compiler.
35if test "x$enable_fuzzing" = xyes; then
36          AC_DEFINE(NEED_FUZZING)
37          test "x$CC" = x && CC=clang
38          test "x$FUZZING_LIBS" = x && \
39                    FUZZING_LIBS="-fsanitize=fuzzer"
40          test "x$SAVED_CFLAGS" = x && \
41                    AM_CFLAGS="-g -fsanitize=fuzzer-no-link,address"
42fi
43
44# Set up the compiler in two different ways and say yes we may want to install.
45AC_PROG_CC
46AM_PROG_CC_C_O
47m4_version_prereq(2.70, [AC_PROG_CC], [AC_PROG_CC_C99])
48AC_PROG_CPP
49AC_PROG_EGREP
50AC_PROG_INSTALL
51AC_PROG_YACC
52PKG_PROG_PKG_CONFIG
53AC_USE_SYSTEM_EXTENSIONS
54
55# Default tmux.conf goes in /etc not ${prefix}/etc.
56test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc
57
58# Is this --enable-debug?
59AC_ARG_ENABLE(
60          debug,
61          AS_HELP_STRING(--enable-debug, enable debug build flags),
62          ,
63          [case "x$VERSION" in xnext*) enable_debug=yes;; esac]
64)
65AM_CONDITIONAL(IS_DEBUG, test "x$enable_debug" = xyes)
66
67# Is this a static build?
68AC_ARG_ENABLE(
69          static,
70          AS_HELP_STRING(--enable-static, create a static build)
71)
72if test "x$enable_static" = xyes; then
73          case "$host_os" in
74                    *darwin*)
75                              AC_MSG_ERROR([static linking is not supported on macOS])
76                              ;;
77          esac
78          test "x$PKG_CONFIG" != x && PKG_CONFIG="$PKG_CONFIG --static"
79          AM_LDFLAGS="-static $AM_LDFLAGS"
80          LDFLAGS="$AM_LDFLAGS $SAVED_LDFLAGS"
81fi
82
83# Allow default TERM to be set.
84AC_ARG_WITH(
85          TERM,
86          AS_HELP_STRING(--with-TERM, set default TERM),
87          [DEFAULT_TERM=$withval],
88          [DEFAULT_TERM=]
89)
90case "x$DEFAULT_TERM" in
91          xscreen*|xtmux*|x)
92          ;;
93          *)
94                    AC_MSG_ERROR("unsuitable TERM (must be screen* or tmux*)")
95          ;;
96esac
97
98# Do we need fuzzers?
99AM_CONDITIONAL(NEED_FUZZING, test "x$enable_fuzzing" = xyes)
100
101# Is this gcc?
102AM_CONDITIONAL(IS_GCC, test "x$GCC" = xyes -a "x$enable_fuzzing" != xyes)
103
104# Is this Sun CC?
105AC_EGREP_CPP(
106          yes,
107          [
108                    #ifdef __SUNPRO_C
109                    yes
110                    #endif
111          ],
112          found_suncc=yes,
113          found_suncc=no
114)
115AM_CONDITIONAL(IS_SUNCC, test "x$found_suncc" = xyes)
116
117# Check for various headers. Alternatives included from compat.h.
118AC_CHECK_HEADERS([ \
119          bitstring.h \
120          dirent.h \
121          fcntl.h \
122          inttypes.h \
123          libproc.h \
124          libutil.h \
125          ndir.h \
126          paths.h \
127          pty.h \
128          stdint.h \
129          sys/dir.h \
130          sys/ndir.h \
131          sys/tree.h \
132          ucred.h \
133          util.h \
134])
135
136# Look for sys_signame.
137AC_SEARCH_LIBS(sys_signame, , AC_DEFINE(HAVE_SYS_SIGNAME))
138
139# Look for fmod.
140AC_CHECK_LIB(m, fmod)
141
142# Look for library needed for flock.
143AC_SEARCH_LIBS(flock, bsd)
144
145# Check for functions that are replaced or omitted.
146AC_CHECK_FUNCS([ \
147          dirfd \
148          flock \
149          prctl \
150          proc_pidinfo \
151          getpeerucred \
152          sysconf
153])
154
155# Check for functions with a compatibility implementation.
156AC_REPLACE_FUNCS([ \
157          asprintf \
158          cfmakeraw \
159          clock_gettime \
160          closefrom \
161          explicit_bzero \
162          fgetln \
163          freezero \
164          getdtablecount \
165          getdtablesize \
166          getpeereid \
167          getline \
168          getprogname \
169          htonll \
170          memmem \
171          ntohll \
172          setenv \
173          setproctitle \
174          strcasestr \
175          strlcat \
176          strlcpy \
177          strndup \
178          strsep \
179])
180AC_FUNC_STRNLEN
181
182# Check if strtonum works.
183AC_MSG_CHECKING([for working strtonum])
184AC_RUN_IFELSE([AC_LANG_PROGRAM(
185                    [#include <stdlib.h>],
186                    [return (strtonum("0", 0, 1, NULL) == 0 ? 0 : 1);]
187          )],
188          [AC_DEFINE(HAVE_STRTONUM) AC_MSG_RESULT(yes)],
189          [AC_LIBOBJ(strtonum) AC_MSG_RESULT(no)],
190          [AC_LIBOBJ(strtonum) AC_MSG_RESULT(no)]
191)
192
193# Clang sanitizers wrap reallocarray even if it isn't available on the target
194# system. When compiled it always returns NULL and crashes the program. To
195# detect this we need a more complicated test.
196AC_MSG_CHECKING([for working reallocarray])
197AC_RUN_IFELSE([AC_LANG_PROGRAM(
198                    [#include <stdlib.h>],
199                    [return (reallocarray(NULL, 1, 1) == NULL);]
200          )],
201          AC_MSG_RESULT(yes),
202          [AC_LIBOBJ(reallocarray) AC_MSG_RESULT([no])],
203          [AC_LIBOBJ(reallocarray) AC_MSG_RESULT([no])]
204)
205AC_MSG_CHECKING([for working recallocarray])
206AC_RUN_IFELSE([AC_LANG_PROGRAM(
207                    [#include <stdlib.h>],
208                    [return (recallocarray(NULL, 1, 1, 1) == NULL);]
209          )],
210          AC_MSG_RESULT(yes),
211          [AC_LIBOBJ(recallocarray) AC_MSG_RESULT([no])],
212          [AC_LIBOBJ(recallocarray) AC_MSG_RESULT([no])]
213)
214
215# Look for clock_gettime. Must come before event_init.
216AC_SEARCH_LIBS(clock_gettime, rt)
217
218# Always use our getopt because 1) glibc's doesn't enforce argument order 2)
219# musl does not set optarg to NULL for flags without arguments (although it is
220# not required to, but it is helpful) 3) there are probably other weird
221# implementations.
222AC_LIBOBJ(getopt)
223
224# Look for libevent. Try libevent_core or libevent with pkg-config first then
225# look for the library.
226PKG_CHECK_MODULES(
227          LIBEVENT_CORE,
228          [libevent_core >= 2],
229          [
230                    AM_CPPFLAGS="$LIBEVENT_CORE_CFLAGS $AM_CPPFLAGS"
231                    CPPFLAGS="$AM_CPPFLAGS $SAVED_CPPFLAGS"
232                    LIBS="$LIBEVENT_CORE_LIBS $LIBS"
233                    found_libevent=yes
234          ],
235          found_libevent=no
236)
237if test x$found_libevent = xno; then
238          PKG_CHECK_MODULES(
239                    LIBEVENT,
240                    [libevent >= 2],
241                    [
242                              AM_CPPFLAGS="$LIBEVENT_CFLAGS $AM_CPPFLAGS"
243                              CPPFLAGS="$AM_CPPFLAGS $SAVED_CPPFLAGS"
244                              LIBS="$LIBEVENT_LIBS $LIBS"
245                              found_libevent=yes
246                    ],
247                    found_libevent=no
248          )
249fi
250if test x$found_libevent = xno; then
251          AC_SEARCH_LIBS(
252                    event_init,
253                    [event_core event event-1.4],
254                    found_libevent=yes,
255                    found_libevent=no
256          )
257fi
258AC_CHECK_HEADER(
259          event2/event.h,
260          AC_DEFINE(HAVE_EVENT2_EVENT_H),
261          [
262                    AC_CHECK_HEADER(
263                              event.h,
264                              AC_DEFINE(HAVE_EVENT_H),
265                              found_libevent=no
266                    )
267          ]
268)
269if test "x$found_libevent" = xno; then
270          AC_MSG_ERROR("libevent not found")
271fi
272
273# Look for yacc.
274AC_CHECK_PROG(found_yacc, $YACC, yes, no)
275if test "x$found_yacc" = xno; then
276          AC_MSG_ERROR("yacc not found")
277fi
278
279# Look for ncurses or curses. Try pkg-config first then directly for the
280# library.
281PKG_CHECK_MODULES(
282          LIBTINFO,
283          tinfo,
284          [
285                    AM_CPPFLAGS="$LIBTINFO_CFLAGS $AM_CPPFLAGS"
286                    CPPFLAGS="$LIBTINFO_CFLAGS $SAVED_CPPFLAGS"
287                    LIBS="$LIBTINFO_LIBS $LIBS"
288                    found_ncurses=yes
289          ],
290          found_ncurses=no
291)
292if test "x$found_ncurses" = xno; then
293          PKG_CHECK_MODULES(
294                    LIBNCURSES,
295                    ncurses,
296                    [
297                              AM_CPPFLAGS="$LIBNCURSES_CFLAGS $AM_CPPFLAGS"
298                              CPPFLAGS="$LIBNCURSES_CFLAGS $SAVED_CPPFLAGS"
299                              LIBS="$LIBNCURSES_LIBS $LIBS"
300                              found_ncurses=yes
301                    ],
302                    found_ncurses=no
303          )
304fi
305if test "x$found_ncurses" = xno; then
306          PKG_CHECK_MODULES(
307                    LIBNCURSESW,
308                    ncursesw,
309                    [
310                              AM_CPPFLAGS="$LIBNCURSESW_CFLAGS $AM_CPPFLAGS"
311                              CPPFLAGS="$LIBNCURSESW_CFLAGS $SAVED_CPPFLAGS"
312                              LIBS="$LIBNCURSESW_LIBS $LIBS"
313                              found_ncurses=yes
314                    ],
315                    found_ncurses=no
316          )
317fi
318if test "x$found_ncurses" = xno; then
319          AC_SEARCH_LIBS(
320                    setupterm,
321                    [tinfo terminfo ncurses ncursesw],
322                    found_ncurses=yes,
323                    found_ncurses=no
324          )
325          if test "x$found_ncurses" = xyes; then
326                    AC_CHECK_HEADER(
327                              ncurses.h,
328                              LIBS="$LIBS -lncurses",
329                              found_ncurses=no
330                    )
331          fi
332fi
333if test "x$found_ncurses" = xyes; then
334          CPPFLAGS="$CPPFLAGS -DHAVE_NCURSES_H"
335          AC_DEFINE(HAVE_NCURSES_H)
336else
337          AC_CHECK_LIB(
338                    curses,
339                    setupterm,
340                    found_curses=yes,
341                    found_curses=no
342          )
343          AC_CHECK_HEADER(
344                    curses.h,
345                    ,
346                    found_curses=no
347          )
348          if test "x$found_curses" = xyes; then
349                    LIBS="$LIBS -lcurses"
350                    CPPFLAGS="$CPPFLAGS -DHAVE_CURSES_H"
351                    AC_DEFINE(HAVE_CURSES_H)
352          else
353                    AC_MSG_ERROR("curses not found")
354          fi
355fi
356AC_CHECK_FUNCS([ \
357          tiparm \
358          tiparm_s \
359])
360
361# Look for utempter.
362AC_ARG_ENABLE(
363          utempter,
364          AS_HELP_STRING(--enable-utempter, use utempter if it is installed)
365)
366if test "x$enable_utempter" = xyes; then
367          AC_CHECK_HEADER(utempter.h, enable_utempter=yes, enable_utempter=no)
368          if test "x$enable_utempter" = xyes; then
369                    AC_SEARCH_LIBS(
370                              utempter_add_record,
371                              utempter,
372                              enable_utempter=yes,
373                              enable_utempter=no
374                    )
375          fi
376          if test "x$enable_utempter" = xyes; then
377                    AC_DEFINE(HAVE_UTEMPTER)
378          else
379                    AC_MSG_ERROR("utempter not found")
380          fi
381fi
382
383# Look for utf8proc.
384AC_ARG_ENABLE(
385          utf8proc,
386          AS_HELP_STRING(--enable-utf8proc, use utf8proc if it is installed)
387)
388if test "x$enable_utf8proc" = xyes; then
389          PKG_CHECK_MODULES(
390                    LIBUTF8PROC,
391                    libutf8proc,
392                    [
393                              AM_CPPFLAGS="$LIBUTF8PROC_CFLAGS $AM_CPPFLAGS"
394                              CPPFLAGS="$LIBUTF8PROC_CFLAGS $SAVED_CPPFLAGS"
395                              LIBS="$LIBUTF8PROC_LIBS $LIBS"
396                    ]
397          )
398          AC_CHECK_HEADER(utf8proc.h, enable_utf8proc=yes, enable_utf8proc=no)
399          if test "x$enable_utf8proc" = xyes; then
400                    AC_SEARCH_LIBS(
401                              utf8proc_charwidth,
402                              utf8proc,
403                              enable_utf8proc=yes,
404                              enable_utf8proc=no
405                    )
406          fi
407          if test "x$enable_utf8proc" = xyes; then
408                    AC_DEFINE(HAVE_UTF8PROC)
409          else
410                    AC_MSG_ERROR("utf8proc not found")
411          fi
412fi
413AM_CONDITIONAL(HAVE_UTF8PROC, [test "x$enable_utf8proc" = xyes])
414
415# Check for systemd support.
416AC_ARG_ENABLE(
417          systemd,
418          AS_HELP_STRING(--enable-systemd, enable systemd integration)
419)
420if test x"$enable_systemd" = xyes; then
421          PKG_CHECK_MODULES(
422                    SYSTEMD,
423                    libsystemd,
424                    [
425                              AM_CPPFLAGS="$SYSTEMD_CFLAGS $AM_CPPFLAGS"
426                              CPPFLAGS="$AM_CPPFLAGS $SAVED_CPPFLAGS"
427                              LIBS="$SYSTEMD_LIBS $LIBS"
428                              found_systemd=yes
429                    ],
430                    found_systemd=no
431          )
432          if test "x$found_systemd" = xyes; then
433                    AC_DEFINE(HAVE_SYSTEMD)
434          else
435                    AC_MSG_ERROR("systemd not found")
436          fi
437fi
438AM_CONDITIONAL(HAVE_SYSTEMD, [test "x$found_systemd" = xyes])
439AC_ARG_ENABLE(
440          cgroups,
441          AS_HELP_STRING(--disable-cgroups, disable adding panes to new cgroups with systemd)
442)
443if test "x$enable_cgroups" = x; then
444          # Default to the same as $enable_systemd.
445          enable_cgroups=$enable_systemd
446fi
447if test "x$enable_cgroups" = xyes; then
448          if test "x$found_systemd" = xyes; then
449                    AC_DEFINE(ENABLE_CGROUPS)
450          else
451                    AC_MSG_ERROR("cgroups requires systemd to be enabled")
452          fi
453fi
454
455# Enable sixel support.
456AC_ARG_ENABLE(
457          sixel,
458          AS_HELP_STRING(--enable-sixel, enable sixel images)
459)
460if test "x$enable_sixel" = xyes; then
461          AC_DEFINE(ENABLE_SIXEL)
462fi
463AM_CONDITIONAL(ENABLE_SIXEL, [test "x$enable_sixel" = xyes])
464
465# Check for b64_ntop. If we have b64_ntop, we assume b64_pton as well.
466AC_MSG_CHECKING(for b64_ntop)
467AC_LINK_IFELSE([AC_LANG_PROGRAM(
468          [
469                    #include <sys/types.h>
470                    #include <netinet/in.h>
471                    #include <resolv.h>
472          ],
473          [
474                    b64_ntop(NULL, 0, NULL, 0);
475          ])],
476          found_b64_ntop=yes,
477          found_b64_ntop=no
478)
479AC_MSG_RESULT($found_b64_ntop)
480OLD_LIBS="$LIBS"
481if test "x$found_b64_ntop" = xno; then
482          AC_MSG_CHECKING(for b64_ntop with -lresolv)
483          LIBS="$OLD_LIBS -lresolv"
484          AC_LINK_IFELSE([AC_LANG_PROGRAM(
485                    [
486                              #include <sys/types.h>
487                              #include <netinet/in.h>
488                              #include <resolv.h>
489                    ],
490                    [
491                              b64_ntop(NULL, 0, NULL, 0);
492                    ])],
493                    found_b64_ntop=yes,
494                    found_b64_ntop=no
495          )
496          AC_MSG_RESULT($found_b64_ntop)
497fi
498if test "x$found_b64_ntop" = xno; then
499          AC_MSG_CHECKING(for b64_ntop with -lnetwork)
500          LIBS="$OLD_LIBS -lnetwork"
501          AC_LINK_IFELSE([AC_LANG_PROGRAM(
502                    [
503                              #include <sys/types.h>
504                              #include <netinet/in.h>
505                              #include <resolv.h>
506                    ],
507                    [
508                              b64_ntop(NULL, 0, NULL, 0);
509                    ])],
510                    found_b64_ntop=yes,
511                    found_b64_ntop=no
512          )
513          AC_MSG_RESULT($found_b64_ntop)
514fi
515if test "x$found_b64_ntop" = xyes; then
516          AC_DEFINE(HAVE_B64_NTOP)
517else
518          LIBS="$OLD_LIBS"
519          AC_LIBOBJ(base64)
520fi
521
522# Look for networking libraries.
523AC_SEARCH_LIBS(inet_ntoa, nsl)
524AC_SEARCH_LIBS(socket, socket)
525AC_CHECK_LIB(xnet, socket)
526
527# Check if using glibc and have malloc_trim(3). The glibc free(3) is pretty bad
528# about returning memory to the kernel unless the application tells it when to
529# with malloc_trim(3).
530AC_MSG_CHECKING(if free doesn't work very well)
531AC_LINK_IFELSE([AC_LANG_SOURCE(
532          [
533                    #include <stdlib.h>
534                    #ifdef __GLIBC__
535                    #include <malloc.h>
536                    int main(void) {
537                              malloc_trim (0);
538                              exit(0);
539                    }
540                    #else
541                    no
542                    #endif
543          ])],
544          found_malloc_trim=yes,
545          found_malloc_trim=no
546)
547AC_MSG_RESULT($found_malloc_trim)
548if test "x$found_malloc_trim" = xyes; then
549          AC_DEFINE(HAVE_MALLOC_TRIM)
550fi
551
552# Build against jemalloc if requested.
553AC_ARG_ENABLE(
554          jemalloc,
555          AS_HELP_STRING(--enable-jemalloc, use jemalloc if it is installed)
556)
557if test "x$enable_jemalloc" = xyes; then
558          PKG_CHECK_MODULES(
559                    JEMALLOC,
560                    jemalloc,
561                    [
562                              AM_CPPFLAGS="$JEMALLOC_CFLAGS $AM_CPPFLAGS"
563                              CPPFLAGS="$AM_CPPFLAGS $SAVED_CPPFLAGS"
564                              LIBS="$LIBS $JEMALLOC_LIBS"
565                    ],
566                    AC_MSG_ERROR("jemalloc not found")
567          )
568fi
569
570# Check for CMSG_DATA. On some platforms like HP-UX this requires UNIX 95
571# (_XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED) (see xopen_networking(7)). On
572# others, UNIX 03 (_XOPEN_SOURCE 600, see standards(7) on Solaris).
573XOPEN_DEFINES=
574AC_MSG_CHECKING(for CMSG_DATA)
575AC_EGREP_CPP(
576          yes,
577          [
578                    #include <sys/socket.h>
579                    #ifdef CMSG_DATA
580                    yes
581                    #endif
582          ],
583          found_cmsg_data=yes,
584          found_cmsg_data=no
585)
586AC_MSG_RESULT($found_cmsg_data)
587if test "x$found_cmsg_data" = xno; then
588          AC_MSG_CHECKING(if CMSG_DATA needs _XOPEN_SOURCE_EXTENDED)
589          AC_EGREP_CPP(
590                    yes,
591                    [
592                              #define _XOPEN_SOURCE 1
593                              #define _XOPEN_SOURCE_EXTENDED 1
594                              #include <sys/socket.h>
595                              #ifdef CMSG_DATA
596                              yes
597                              #endif
598                    ],
599                    found_cmsg_data=yes,
600                    found_cmsg_data=no
601          )
602          AC_MSG_RESULT($found_cmsg_data)
603          if test "x$found_cmsg_data" = xyes; then
604                    XOPEN_DEFINES="-D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED"
605          fi
606fi
607if test "x$found_cmsg_data" = xno; then
608          AC_MSG_CHECKING(if CMSG_DATA needs _XOPEN_SOURCE 600)
609          AC_EGREP_CPP(
610                    yes,
611                    [
612                              #define _XOPEN_SOURCE 600
613                              #include <sys/socket.h>
614                              #ifdef CMSG_DATA
615                              yes
616                              #endif
617                    ],
618                    found_cmsg_data=yes,
619                    found_cmsg_data=no
620          )
621          AC_MSG_RESULT($found_cmsg_data)
622          if test "x$found_cmsg_data" = xyes; then
623                    XOPEN_DEFINES="-D_XOPEN_SOURCE=600"
624          else
625                    AC_MSG_ERROR("CMSG_DATA not found")
626          fi
627fi
628AC_SUBST(XOPEN_DEFINES)
629
630# Look for err and friends in err.h.
631AC_CHECK_FUNC(err, found_err_h=yes, found_err_h=no)
632AC_CHECK_FUNC(errx, , found_err_h=no)
633AC_CHECK_FUNC(warn, , found_err_h=no)
634AC_CHECK_FUNC(warnx, , found_err_h=no)
635if test "x$found_err_h" = xyes; then
636          AC_CHECK_HEADER(err.h, , found_err_h=no)
637else
638          AC_LIBOBJ(err)
639fi
640
641# Look for imsg_init in libutil.
642AC_SEARCH_LIBS(imsg_init, util, found_imsg_init=yes, found_imsg_init=no)
643if test "x$found_imsg_init" = xyes; then
644          AC_DEFINE(HAVE_IMSG)
645else
646          AC_LIBOBJ(imsg)
647          AC_LIBOBJ(imsg-buffer)
648fi
649
650# Look for daemon, compat/daemon.c used if missing. Solaris 10 has it in
651# libresolv, but no declaration anywhere, so check for declaration as well as
652# function.
653AC_CHECK_FUNC(daemon, found_daemon=yes, found_daemon=no)
654AC_CHECK_DECL(
655          daemon,
656          ,
657          found_daemon=no,
658          [
659                    #include <stdlib.h>
660                    #include <unistd.h>
661          ]
662)
663if test "x$found_daemon" = xyes; then
664          AC_DEFINE(HAVE_DAEMON)
665else
666          AC_LIBOBJ(daemon)
667fi
668
669# Look for stravis, compat/{vis,unvis}.c used if missing.
670AC_CHECK_FUNC(stravis, found_stravis=yes, found_stravis=no)
671if test "x$found_stravis" = xyes; then
672          AC_MSG_CHECKING(if strnvis is broken)
673          AC_EGREP_HEADER([strnvis\(char \*, const char \*, size_t, int\)],
674                              vis.h,
675                              AC_MSG_RESULT(no),
676                              [found_stravis=no])
677          if test "x$found_stravis" = xno; then
678                    AC_MSG_RESULT(yes)
679          fi
680fi
681if test "x$found_stravis" = xyes; then
682          AC_CHECK_DECL(
683                    VIS_DQ,
684                    ,
685                    found_stravis=no,
686                    [
687                              #include <stdlib.h>
688                              #include <vis.h>
689                    ]
690)
691fi
692if test "x$found_stravis" = xyes; then
693          AC_DEFINE(HAVE_VIS)
694else
695          AC_LIBOBJ(vis)
696          AC_LIBOBJ(unvis)
697fi
698
699# Look for fdforkpty and forkpty in libutil.
700AC_SEARCH_LIBS(fdforkpty, util, found_fdforkpty=yes, found_fdforkpty=no)
701if test "x$found_fdforkpty" = xyes; then
702          AC_DEFINE(HAVE_FDFORKPTY)
703else
704          AC_LIBOBJ(fdforkpty)
705fi
706AC_SEARCH_LIBS(forkpty, util, found_forkpty=yes, found_forkpty=no)
707if test "x$found_forkpty" = xyes; then
708          AC_DEFINE(HAVE_FORKPTY)
709fi
710AM_CONDITIONAL(NEED_FORKPTY, test "x$found_forkpty" = xno)
711
712# Look for kinfo_getfile in libutil.
713AC_SEARCH_LIBS(kinfo_getfile, [util util-freebsd])
714
715# Look for a suitable queue.h.
716AC_CHECK_DECL(
717          TAILQ_CONCAT,
718          found_queue_h=yes,
719          found_queue_h=no,
720          [#include <sys/queue.h>]
721)
722AC_CHECK_DECL(
723          TAILQ_PREV,
724          ,
725          found_queue_h=no,
726          [#include <sys/queue.h>]
727)
728AC_CHECK_DECL(
729          TAILQ_REPLACE,
730          ,
731          found_queue_h=no,
732          [#include <sys/queue.h>]
733)
734if test "x$found_queue_h" = xyes; then
735          AC_DEFINE(HAVE_QUEUE_H)
736fi
737
738# Look for __progname.
739AC_MSG_CHECKING(for __progname)
740AC_LINK_IFELSE([AC_LANG_SOURCE(
741          [
742                    #include <stdio.h>
743                    #include <stdlib.h>
744                    extern char *__progname;
745                    int main(void) {
746                              const char *cp = __progname;
747                              printf("%s\n", cp);
748                              exit(0);
749                    }
750          ])],
751          [AC_DEFINE(HAVE___PROGNAME) AC_MSG_RESULT(yes)],
752          AC_MSG_RESULT(no)
753)
754
755# Look for program_invocation_short_name.
756AC_MSG_CHECKING(for program_invocation_short_name)
757AC_LINK_IFELSE([AC_LANG_SOURCE(
758          [
759                    #include <errno.h>
760                    #include <stdio.h>
761                    #include <stdlib.h>
762                    int main(void) {
763                              const char *cp = program_invocation_short_name;
764                              printf("%s\n", cp);
765                              exit(0);
766                    }
767          ])],
768          [AC_DEFINE(HAVE_PROGRAM_INVOCATION_SHORT_NAME) AC_MSG_RESULT(yes)],
769          AC_MSG_RESULT(no)
770)
771
772# Look for prctl(PR_SET_NAME).
773AC_CHECK_DECL(
774          PR_SET_NAME,
775          AC_DEFINE(HAVE_PR_SET_NAME),
776          ,
777          [#include <sys/prctl.h>]
778)
779
780# Look for setsockopt(SO_PEERCRED).
781AC_CHECK_DECL(
782          SO_PEERCRED,
783          AC_DEFINE(HAVE_SO_PEERCRED),
784          ,
785          [#include <sys/socket.h>]
786)
787
788# Look for fcntl(F_CLOSEM).
789AC_CHECK_DECL(
790          F_CLOSEM,
791          AC_DEFINE(HAVE_FCNTL_CLOSEM),
792          ,
793          [#include <fcntl.h>]
794)
795
796# Look for /proc/$$.
797AC_MSG_CHECKING(for /proc/\$\$)
798if test -d /proc/$$; then
799          AC_DEFINE(HAVE_PROC_PID)
800          AC_MSG_RESULT(yes)
801else
802          AC_MSG_RESULT(no)
803fi
804
805# Try to figure out what the best value for TERM might be.
806if test "x$DEFAULT_TERM" = x; then
807          DEFAULT_TERM=screen
808          AC_MSG_CHECKING(TERM)
809          AC_RUN_IFELSE([AC_LANG_SOURCE(
810                    [
811                              #include <stdio.h>
812                              #include <stdlib.h>
813                              #if defined(HAVE_CURSES_H)
814                              #include <curses.h>
815                              #elif defined(HAVE_NCURSES_H)
816                              #include <ncurses.h>
817                              #endif
818                              #include <term.h>
819                              int main(void) {
820                                        if (setupterm("screen-256color", -1, NULL) != OK)
821                                                  exit(1);
822                                        exit(0);
823                              }
824                     ])],
825                     [DEFAULT_TERM=screen-256color],
826                     ,
827                     [DEFAULT_TERM=screen]
828          )
829          AC_RUN_IFELSE([AC_LANG_SOURCE(
830                    [
831                              #include <stdio.h>
832                              #include <stdlib.h>
833                              #if defined(HAVE_CURSES_H)
834                              #include <curses.h>
835                              #elif defined(HAVE_NCURSES_H)
836                              #include <ncurses.h>
837                              #endif
838                              #include <term.h>
839                              int main(void) {
840                                        if (setupterm("tmux", -1, NULL) != OK)
841                                                  exit(1);
842                                        exit(0);
843                              }
844                     ])],
845                     [DEFAULT_TERM=tmux],
846                     ,
847                     [DEFAULT_TERM=screen]
848          )
849          AC_RUN_IFELSE([AC_LANG_SOURCE(
850                    [
851                              #include <stdio.h>
852                              #include <stdlib.h>
853                              #if defined(HAVE_CURSES_H)
854                              #include <curses.h>
855                              #elif defined(HAVE_NCURSES_H)
856                              #include <ncurses.h>
857                              #endif
858                              #include <term.h>
859                              int main(void) {
860                                        if (setupterm("tmux-256color", -1, NULL) != OK)
861                                                  exit(1);
862                                        exit(0);
863                              }
864                     ])],
865                     [DEFAULT_TERM=tmux-256color],
866                     ,
867                     [DEFAULT_TERM=screen]
868          )
869          AC_MSG_RESULT($DEFAULT_TERM)
870fi
871AC_SUBST(DEFAULT_TERM)
872
873# Man page defaults to mdoc.
874MANFORMAT=mdoc
875AC_SUBST(MANFORMAT)
876
877# Figure out the platform.
878AC_MSG_CHECKING(platform)
879case "$host_os" in
880          *aix*)
881                    AC_MSG_RESULT(aix)
882                    PLATFORM=aix
883                    ;;
884          *darwin*)
885                    AC_MSG_RESULT(darwin)
886                    PLATFORM=darwin
887                    #
888                    # macOS uses __dead2 instead of __dead, like FreeBSD. But it defines
889                    # __dead away so it needs to be removed before we can replace it.
890                    #
891                    AC_DEFINE(BROKEN___DEAD)
892                    #
893                    # macOS CMSG_FIRSTHDR is broken, so redefine it with a working one.
894                    # daemon works but has some stupid side effects, so use our internal
895                    # version which has a workaround.
896                    #
897                    AC_DEFINE(BROKEN_CMSG_FIRSTHDR)
898                    AC_LIBOBJ(daemon)
899                    AC_LIBOBJ(daemon-darwin)
900                    #
901                    # macOS wcwidth(3) is bad, so complain and suggest using utf8proc
902                    # instead.
903                    #
904                    if test "x$enable_utf8proc" = x; then
905                              AC_MSG_NOTICE([])
906                              AC_MSG_NOTICE([        macOS library support for Unicode is very poor,])
907                              AC_MSG_NOTICE([        particularly for complex codepoints like emojis;])
908                              AC_MSG_NOTICE([        to use these correctly, configuring with])
909                              AC_MSG_NOTICE([        --enable-utf8proc is recommended. To build])
910                              AC_MSG_NOTICE([        without anyway, use --disable-utf8proc])
911                              AC_MSG_NOTICE([])
912                              AC_MSG_ERROR([must give --enable-utf8proc or --disable-utf8proc])
913                    fi
914                    ;;
915          *dragonfly*)
916                    AC_MSG_RESULT(dragonfly)
917                    PLATFORM=dragonfly
918                    ;;
919          *linux*)
920                    AC_MSG_RESULT(linux)
921                    PLATFORM=linux
922                    ;;
923          *freebsd*)
924                    AC_MSG_RESULT(freebsd)
925                    PLATFORM=freebsd
926                    ;;
927          *netbsd*)
928                    AC_MSG_RESULT(netbsd)
929                    PLATFORM=netbsd
930                    ;;
931          *openbsd*)
932                    AC_MSG_RESULT(openbsd)
933                    PLATFORM=openbsd
934                    ;;
935          *sunos*)
936                    AC_MSG_RESULT(sunos)
937                    PLATFORM=sunos
938                    ;;
939          *solaris*)
940                    AC_MSG_RESULT(sunos)
941                    PLATFORM=sunos
942                    case `/usr/bin/nroff --version 2>&1` in
943                              *GNU*)
944                                        # Solaris 11.4 and later use GNU groff.
945                                        MANFORMAT=mdoc
946                                        ;;
947                              *)
948                                        if test `uname -o 2>/dev/null` = illumos; then
949                                                  # Illumos uses mandoc.
950                                                  MANFORMAT=mdoc
951                                        else
952                                                  # Solaris 2.0 to 11.3 use AT&T nroff.
953                                                  MANFORMAT=man
954                                        fi
955                                        ;;
956                    esac
957                    ;;
958          *hpux*)
959                    AC_MSG_RESULT(hpux)
960                    PLATFORM=hpux
961                    ;;
962          *cygwin*|*msys*)
963                    AC_MSG_RESULT(cygwin)
964                    PLATFORM=cygwin
965                    ;;
966          *haiku*)
967                    AC_MSG_RESULT(haiku)
968                    PLATFORM=haiku
969                    ;;
970          *)
971                    AC_MSG_RESULT(unknown)
972                    PLATFORM=unknown
973                    ;;
974esac
975AC_SUBST(PLATFORM)
976AM_CONDITIONAL(IS_AIX, test "x$PLATFORM" = xaix)
977AM_CONDITIONAL(IS_DARWIN, test "x$PLATFORM" = xdarwin)
978AM_CONDITIONAL(IS_DRAGONFLY, test "x$PLATFORM" = xdragonfly)
979AM_CONDITIONAL(IS_LINUX, test "x$PLATFORM" = xlinux)
980AM_CONDITIONAL(IS_FREEBSD, test "x$PLATFORM" = xfreebsd)
981AM_CONDITIONAL(IS_NETBSD, test "x$PLATFORM" = xnetbsd)
982AM_CONDITIONAL(IS_OPENBSD, test "x$PLATFORM" = xopenbsd)
983AM_CONDITIONAL(IS_SUNOS, test "x$PLATFORM" = xsunos)
984AM_CONDITIONAL(IS_HPUX, test "x$PLATFORM" = xhpux)
985AM_CONDITIONAL(IS_HAIKU, test "x$PLATFORM" = xhaiku)
986AM_CONDITIONAL(IS_UNKNOWN, test "x$PLATFORM" = xunknown)
987
988# Set the default lock command
989DEFAULT_LOCK_CMD="lock -np"
990AC_MSG_CHECKING(lock-command)
991if test "x$PLATFORM" = xlinux; then
992          AC_CHECK_PROG(found_vlock, vlock, yes, no)
993          if test "x$found_vlock" = xyes; then
994                    DEFAULT_LOCK_CMD="vlock"
995          fi
996fi
997AC_MSG_RESULT($DEFAULT_LOCK_CMD)
998AC_SUBST(DEFAULT_LOCK_CMD)
999
1000
1001# Save our CFLAGS/CPPFLAGS/LDFLAGS for the Makefile and restore the old user
1002# variables.
1003AC_SUBST(AM_CPPFLAGS)
1004CPPFLAGS="$SAVED_CPPFLAGS"
1005AC_SUBST(AM_CFLAGS)
1006CFLAGS="$SAVED_CFLAGS"
1007AC_SUBST(AM_LDFLAGS)
1008LDFLAGS="$SAVED_LDFLAGS"
1009
1010# autoconf should create a Makefile.
1011AC_CONFIG_FILES(Makefile)
1012AC_OUTPUT
1013