| # configure.ac |
| |
| # Miscellaneous bits. |
| AC_INIT(tmux, 2.1) |
| |
| AC_CONFIG_AUX_DIR(etc) |
| AM_INIT_AUTOMAKE([foreign subdir-objects]) |
| |
| AC_CANONICAL_HOST |
| |
| # When CFLAGS isn't set at this stage and gcc is detected by the macro below, |
| # autoconf will automatically use CFLAGS="-O2 -g". Prevent that by using an |
| # empty default. |
| : ${CFLAGS=""} |
| |
| # Set up the compiler in two different ways and say yes we may want to install. |
| AC_PROG_CC |
| AM_PROG_CC_C_O |
| AC_PROG_CPP |
| AC_PROG_EGREP |
| AC_PROG_INSTALL |
| |
| # Default tmux.conf goes in /etc not ${prefix}/etc. |
| test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc |
| |
| # Is this --enable-debug? |
| found_debug=yes |
| AC_ARG_ENABLE( |
| debug, |
| AC_HELP_STRING(--enable-debug, enable debug build flags), |
| found_debug=$enable_debug |
| ) |
| AM_CONDITIONAL(IS_DEBUG, test "x$found_debug" = xyes) |
| |
| # Is this --enable-coverage? |
| AC_ARG_ENABLE( |
| coverage, |
| AC_HELP_STRING(--enable-coverage, enable coverage build flags), |
| found_coverage=$enable_coverage |
| ) |
| AM_CONDITIONAL(IS_COVERAGE, test "x$found_coverage" = xyes) |
| |
| # Is this a static build? |
| AC_ARG_ENABLE( |
| static, |
| AC_HELP_STRING(--enable-static, create a static build), |
| found_static=$enable_static |
| ) |
| if test "x$found_static" = xyes; then |
| LDFLAGS="$LDFLAGS -static" |
| fi |
| |
| # Is this gcc? |
| AM_CONDITIONAL(IS_GCC, test "x$GCC" = xyes) |
| |
| # Is this Sun CC? |
| AC_EGREP_CPP( |
| yes, |
| [ |
| #ifdef __SUNPRO_C |
| yes |
| #endif |
| ], |
| found_suncc=yes, |
| found_suncc=no |
| ) |
| AM_CONDITIONAL(IS_SUNCC, test "x$found_suncc" = xyes) |
| |
| # Is this glibc? |
| AC_MSG_CHECKING(for glibc) |
| AC_EGREP_CPP( |
| yes, |
| [ |
| #include <features.h> |
| #ifdef __GLIBC__ |
| yes |
| #endif |
| ], |
| found_glibc=yes, |
| found_glibc=no |
| ) |
| AM_CONDITIONAL(IS_GLIBC, test "x$found_glibc" = xyes) |
| AC_MSG_RESULT($found_glibc) |
| |
| # Check for various headers. Alternatives included from compat.h. |
| AC_CHECK_HEADERS( |
| [ \ |
| bitstring.h \ |
| curses.h \ |
| dirent.h \ |
| fcntl.h \ |
| inttypes.h \ |
| libutil.h \ |
| ncurses.h \ |
| ndir.h \ |
| paths.h \ |
| pty.h \ |
| stdint.h \ |
| sys/dir.h \ |
| sys/ndir.h \ |
| sys/tree.h \ |
| term.h \ |
| util.h \ |
| ] |
| ) |
| |
| # Look for library needed for flock. |
| AC_SEARCH_LIBS(flock, bsd) |
| |
| # Check for some functions that are replaced or omitted. |
| AC_CHECK_FUNCS( |
| [ \ |
| dirfd \ |
| flock \ |
| setproctitle \ |
| sysconf \ |
| cfmakeraw \ |
| ] |
| ) |
| |
| # Look for clock_gettime. Must come before event_init. |
| AC_SEARCH_LIBS(clock_gettime, rt) |
| |
| # Look for libevent. |
| PKG_CHECK_MODULES( |
| LIBEVENT, |
| libevent, |
| [ |
| CPPFLAGS="$LIBEVENT_CFLAGS $CPPFLAGS" |
| LIBS="$LIBEVENT_LIBS $LIBS" |
| found_libevent=yes |
| ], |
| [ |
| AC_SEARCH_LIBS( |
| event_init, |
| [event event-1.4 event2], |
| found_libevent=yes, |
| found_libevent=no |
| ) |
| ] |
| ) |
| if test "x$found_libevent" = xno; then |
| AC_MSG_ERROR("libevent not found") |
| fi |
| |
| # Look for curses. |
| AC_SEARCH_LIBS( |
| setupterm, |
| [terminfo curses ncurses tinfo], |
| found_curses=yes, |
| found_curses=no |
| ) |
| if test "x$found_curses" = xno; then |
| AC_MSG_ERROR("curses not found") |
| fi |
| |
| # Look for utempter. |
| AC_CHECK_HEADER(utempter.h, have_utempter=yes, have_utempter=no) |
| if test "x$have_utempter" = xyes; then |
| AC_DEFINE(HAVE_UTEMPTER) |
| LIBS="$LIBS -lutempter" |
| fi |
| |
| # Check for b64_ntop. |
| AC_MSG_CHECKING(for b64_ntop) |
| AC_TRY_LINK( |
| [ |
| #include <sys/types.h> |
| #include <netinet/in.h> |
| #include <resolv.h> |
| ], |
| [b64_ntop(NULL, 0, NULL, 0);], |
| found_b64_ntop=yes, |
| found_b64_ntop=no |
| ) |
| if test "x$found_b64_ntop" = xno; then |
| AC_MSG_RESULT(no) |
| |
| AC_MSG_CHECKING(for b64_ntop with -lresolv) |
| LIBS="$LIBS -lresolv" |
| AC_TRY_LINK( |
| [ |
| #include <sys/types.h> |
| #include <netinet/in.h> |
| #include <resolv.h> |
| ], |
| [b64_ntop(NULL, 0, NULL, 0);], |
| found_b64_ntop=yes, |
| found_b64_ntop=no |
| ) |
| if test "x$found_b64_ntop" = xno; then |
| AC_MSG_RESULT(no) |
| fi |
| fi |
| if test "x$found_b64_ntop" = xyes; then |
| AC_DEFINE(HAVE_B64_NTOP) |
| AC_MSG_RESULT(yes) |
| fi |
| AM_CONDITIONAL(NO_B64_NTOP, [test "x$found_b64_ntop" = xno]) |
| |
| # Look for networking libraries. |
| AC_SEARCH_LIBS(inet_ntoa, nsl) |
| AC_SEARCH_LIBS(socket, socket) |
| AC_CHECK_LIB(xnet, socket) |
| |
| # Check for CMSG_DATA. Some platforms require _XOPEN_SOURCE_EXTENDED (for |
| # example see xopen_networking(7) on HP-UX). |
| XOPEN_DEFINES= |
| AC_MSG_CHECKING(for CMSG_DATA) |
| AC_EGREP_CPP( |
| yes, |
| [ |
| #include <sys/socket.h> |
| #ifdef CMSG_DATA |
| yes |
| #endif |
| ], |
| found_cmsg_data=yes, |
| found_cmsg_data=no |
| ) |
| AC_MSG_RESULT($found_cmsg_data) |
| if test "x$found_cmsg_data" = xno; then |
| AC_MSG_CHECKING(if CMSG_DATA needs _XOPEN_SOURCE_EXTENDED) |
| AC_EGREP_CPP( |
| yes, |
| [ |
| #define _XOPEN_SOURCE 1 |
| #define _XOPEN_SOURCE_EXTENDED 1 |
| #include <sys/socket.h> |
| #ifdef CMSG_DATA |
| yes |
| #endif |
| ], |
| found_cmsg_data=yes, |
| found_cmsg_data=no |
| ) |
| AC_MSG_RESULT($found_cmsg_data) |
| if test "x$found_cmsg_data" = xyes; then |
| XOPEN_DEFINES="-D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED" |
| else |
| AC_MSG_ERROR("CMSG_DATA not found") |
| fi |
| fi |
| AC_SUBST(XOPEN_DEFINES) |
| |
| # Look for imsg in libutil. compat/imsg.c is linked by Makefile.am if missing. |
| AC_SEARCH_LIBS(imsg_init, util, found_imsg_init=yes, found_imsg_init=no) |
| if test "x$found_imsg_init" = xyes; then |
| AC_DEFINE(HAVE_IMSG) |
| fi |
| AM_CONDITIONAL(NO_IMSG, [test "x$found_imsg_init" = xno]) |
| |
| # Look for forkpty in libutil. compat/forkpty-*.c is linked if not found. |
| AC_SEARCH_LIBS(forkpty, util, found_forkpty=yes, found_forkpty=no) |
| if test "x$found_forkpty" = xyes; then |
| AC_DEFINE(HAVE_FORKPTY) |
| fi |
| AM_CONDITIONAL(NO_FORKPTY, [test "x$found_forkpty" = xno]) |
| |
| # Look for closefrom, compat/closefrom.c used if missing. |
| AC_CHECK_FUNC(closefrom, found_closefrom=yes, found_closefrom=no) |
| if test "x$found_closefrom" = xyes; then |
| AC_DEFINE(HAVE_CLOSEFROM) |
| fi |
| AM_CONDITIONAL(NO_CLOSEFROM, [test "x$found_closefrom" = xno]) |
| |
| # Look for daemon, compat/daemon.c used if missing. |
| AC_CHECK_FUNC(daemon, found_daemon=yes, found_daemon=no) |
| if test "x$found_daemon" = xyes; then |
| AC_DEFINE(HAVE_DAEMON) |
| fi |
| AM_CONDITIONAL(NO_DAEMON, [test "x$found_daemon" = xno]) |
| |
| # Look for setenv, compat/setenv.c used if missing. |
| AC_CHECK_FUNC(setenv, found_setenv=yes, found_setenv=no) |
| if test "x$found_setenv" = xyes; then |
| AC_DEFINE(HAVE_SETENV) |
| fi |
| AM_CONDITIONAL(NO_SETENV, [test "x$found_setenv" = xno]) |
| |
| # Look for strlcpy, compat/strlcpy.c used if missing. |
| AC_CHECK_FUNC(strlcpy, found_strlcpy=yes, found_strlcpy=no) |
| if test "x$found_strlcpy" = xyes; then |
| AC_DEFINE(HAVE_STRLCPY) |
| fi |
| AM_CONDITIONAL(NO_STRLCPY, [test "x$found_strlcpy" = xno]) |
| |
| # Look for strlcat, compat/strlcat.c used if missing. |
| AC_CHECK_FUNC(strlcat, found_strlcat=yes, found_strlcat=no) |
| if test "x$found_strlcat" = xyes; then |
| AC_DEFINE(HAVE_STRLCAT) |
| fi |
| AM_CONDITIONAL(NO_STRLCAT, [test "x$found_strlcat" = xno]) |
| |
| # Look for asprintf, compat/asprintf.c used if missing. |
| AC_CHECK_FUNC(asprintf, found_asprintf=yes, found_asprintf=no) |
| if test "x$found_asprintf" = xyes; then |
| AC_DEFINE(HAVE_ASPRINTF) |
| fi |
| AM_CONDITIONAL(NO_ASPRINTF, [test "x$found_asprintf" = xno]) |
| |
| # Look for fgetln, compat/fgetln.c used if missing. |
| AC_CHECK_FUNC(fgetln, found_fgetln=yes, found_fgetln=no) |
| if test "x$found_fgetln" = xyes; then |
| AC_DEFINE(HAVE_FGETLN) |
| fi |
| AM_CONDITIONAL(NO_FGETLN, [test "x$found_fgetln" = xno]) |
| |
| # Look for fparseln, compat/fparseln.c used if missing. |
| AC_CHECK_FUNC(fparseln, found_fparseln=yes, found_fparseln=no) |
| if test "x$found_fparseln" = xyes; then |
| AC_DEFINE(HAVE_FPARSELN) |
| fi |
| AM_CONDITIONAL(NO_FPARSELN, [test "x$found_fparseln" = xno]) |
| |
| # Look for strcasestr, compat/strcasestr.c used if missing. |
| AC_CHECK_FUNC(strcasestr, found_strcasestr=yes, found_strcasestr=no) |
| if test "x$found_strcasestr" = xyes; then |
| AC_DEFINE(HAVE_STRCASESTR) |
| fi |
| AM_CONDITIONAL(NO_STRCASESTR, [test "x$found_strcasestr" = xno]) |
| |
| # Look for strsep, compat/strsep.c used if missing. |
| AC_CHECK_FUNC(strsep, found_strsep=yes, found_strsep=no) |
| if test "x$found_strsep" = xyes; then |
| AC_DEFINE(HAVE_STRSEP) |
| fi |
| AM_CONDITIONAL(NO_STRSEP, [test "x$found_strsep" = xno]) |
| |
| # Look for strtonum, compat/strtonum.c used if missing. |
| AC_CHECK_FUNC(strtonum, found_strtonum=yes, found_strtonum=no) |
| if test "x$found_strtonum" = xyes; then |
| AC_DEFINE(HAVE_STRTONUM) |
| fi |
| AM_CONDITIONAL(NO_STRTONUM, [test "x$found_strtonum" = xno]) |
| |
| # Look for stravis, compat/{vis,unvis}.c used if missing. |
| AC_CHECK_FUNC(stravis, found_stravis=yes, found_stravis=no) |
| if test "x$found_stravis" = xyes; then |
| AC_MSG_CHECKING(if strnvis is broken) |
| AC_EGREP_HEADER([strnvis\(char \*, const char \*, size_t, int\)], |
| vis.h, |
| AC_MSG_RESULT(no), |
| [found_stravis=no]) |
| if test "x$found_stravis" = xno; then |
| AC_MSG_RESULT(yes) |
| fi |
| fi |
| if test "x$found_stravis" = xyes; then |
| AC_DEFINE(HAVE_VIS) |
| fi |
| AM_CONDITIONAL(NO_VIS, [test "x$found_stravis" = xno]) |
| |
| # Look for cfmakeraw, compat/cfmakeraw.c used if missing. |
| AC_CHECK_FUNC(cfmakeraw, found_cfmakeraw=yes, found_cfmakeraw=no) |
| if test "x$found_cfmakeraw" = xyes; then |
| AC_DEFINE(HAVE_CFMAKERAW) |
| fi |
| AM_CONDITIONAL(NO_CFMAKERAW, [test "x$found_cfmakeraw" = xno]) |
| |
| # Look for openat, compat/openat.c used if missing. |
| AC_CHECK_FUNC(openat, found_openat=yes, found_openat=no) |
| if test "x$found_openat" = xyes; then |
| AC_DEFINE(HAVE_OPENAT) |
| fi |
| AM_CONDITIONAL(NO_OPENAT, [test "x$found_openat" = xno]) |
| |
| # Look for getopt. glibc's getopt does not enforce argument order and the ways |
| # of making it do so are stupid, so just use our own instead. |
| AC_CHECK_FUNC(getopt, found_getopt=yes, found_getopt=no) |
| if test "x$found_getopt" != xno; then |
| AC_CHECK_DECLS( |
| [optarg, optind, optreset], |
| , |
| found_getopt=no, |
| [ |
| #include <unistd.h> |
| ] |
| ) |
| if test "x$found_getopt" != xno; then |
| AC_MSG_CHECKING(if system getopt should be avoided) |
| if test "x$found_glibc" = xyes; then |
| found_getopt=no |
| AC_MSG_RESULT(yes) |
| else |
| AC_MSG_RESULT(no) |
| AC_DEFINE(HAVE_GETOPT) |
| fi |
| fi |
| fi |
| AM_CONDITIONAL(NO_GETOPT, [test "x$found_getopt" = xno]) |
| |
| # Check for BSD-style integer types. |
| AC_MSG_CHECKING(for BSD-style unsigned types) |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE( |
| [ |
| #include <sys/types.h> |
| #ifdef HAVE_STDINT_H |
| #include <stdint.h> |
| #else |
| #include <inttypes.h> |
| #endif |
| int main(void) |
| { u_int8_t u8; u_int16_t u16; u_int32_t u32; u_int64_t u64; } |
| ])], |
| [AC_DEFINE(HAVE_BSD_TYPES) AC_MSG_RESULT(yes)], |
| AC_MSG_RESULT(no) |
| ) |
| |
| # Look for a suitable queue.h. |
| AC_CHECK_DECL( |
| TAILQ_PREV, |
| found_queue_h=yes, |
| found_queue_h=no, |
| [#include <sys/queue.h>] |
| ) |
| AC_CHECK_DECL( |
| TAILQ_REPLACE, |
| , |
| found_queue_h=no, |
| [#include <sys/queue.h>] |
| ) |
| if test "x$found_queue_h" = xyes; then |
| AC_DEFINE(HAVE_QUEUE_H) |
| fi |
| |
| # Look for __progname. |
| AC_MSG_CHECKING(for __progname) |
| AC_LINK_IFELSE([AC_LANG_SOURCE( |
| [ |
| #include <stdio.h> |
| #include <stdlib.h> |
| extern char *__progname; |
| int main(void) { |
| const char *cp = __progname; |
| printf("%s\n", cp); |
| exit(0); |
| } |
| ])], |
| [AC_DEFINE(HAVE___PROGNAME) AC_MSG_RESULT(yes)], |
| AC_MSG_RESULT(no) |
| ) |
| |
| # Look for fcntl(F_CLOSEM). |
| AC_CHECK_DECL( |
| F_CLOSEM, |
| AC_DEFINE(HAVE_FCNTL_CLOSEM), |
| , |
| [#include <fcntl.h>] |
| ) |
| |
| # Look for /proc/$$. |
| AC_MSG_CHECKING(for /proc/\$\$) |
| if test -d /proc/$$; then |
| AC_DEFINE(HAVE_PROC_PID) |
| AC_MSG_RESULT(yes) |
| else |
| AC_MSG_RESULT(no) |
| fi |
| |
| # Man page defaults to mdoc. |
| MANFORMAT=mdoc |
| AC_SUBST(MANFORMAT) |
| |
| # Figure out the platform for osdep-*.c and forkpty-*.c. |
| AC_MSG_CHECKING(platform) |
| case "$host_os" in |
| *aix*) |
| AC_MSG_RESULT(aix) |
| PLATFORM=aix |
| ;; |
| *darwin*) |
| AC_MSG_RESULT(darwin) |
| AC_DEFINE(BROKEN_CMSG_FIRSTHDR) |
| PLATFORM=darwin |
| ;; |
| *dragonfly*) |
| AC_MSG_RESULT(dragonfly) |
| PLATFORM=dragonfly |
| ;; |
| *linux*) |
| AC_MSG_RESULT(linux) |
| PLATFORM=linux |
| ;; |
| *freebsd*) |
| AC_MSG_RESULT(freebsd) |
| PLATFORM=freebsd |
| ;; |
| *netbsd*) |
| AC_MSG_RESULT(netbsd) |
| PLATFORM=netbsd |
| ;; |
| *openbsd*) |
| AC_MSG_RESULT(openbsd) |
| PLATFORM=openbsd |
| ;; |
| *sunos*) |
| AC_MSG_RESULT(sunos) |
| PLATFORM=sunos |
| ;; |
| *solaris*) |
| AC_MSG_RESULT(sunos) |
| PLATFORM=sunos |
| MANFORMAT=man |
| ;; |
| *hpux*) |
| AC_MSG_RESULT(hpux) |
| PLATFORM=hpux |
| ;; |
| *cygwin*) |
| AC_MSG_RESULT(cygwin) |
| PLATFORM=cygwin |
| ;; |
| *) |
| AC_MSG_RESULT(unknown) |
| PLATFORM=unknown |
| ;; |
| esac |
| AC_SUBST(PLATFORM) |
| AM_CONDITIONAL(IS_AIX, test "x$PLATFORM" = xaix) |
| AM_CONDITIONAL(IS_DARWIN, test "x$PLATFORM" = xdarwin) |
| AM_CONDITIONAL(IS_DRAGONFLY, test "x$PLATFORM" = xdragonfly) |
| AM_CONDITIONAL(IS_LINUX, test "x$PLATFORM" = xlinux) |
| AM_CONDITIONAL(IS_FREEBSD, test "x$PLATFORM" = xfreebsd) |
| AM_CONDITIONAL(IS_NETBSD, test "x$PLATFORM" = xnetbsd) |
| AM_CONDITIONAL(IS_OPENBSD, test "x$PLATFORM" = xopenbsd) |
| AM_CONDITIONAL(IS_SUNOS, test "x$PLATFORM" = xsunos) |
| AM_CONDITIONAL(IS_HPUX, test "x$PLATFORM" = xhpux) |
| AM_CONDITIONAL(IS_UNKNOWN, test "x$PLATFORM" = xunknown) |
| |
| # autoconf should create a Makefile. |
| AC_OUTPUT(Makefile) |