#!/bin/sh # ======================================================================= # # chronyd/chronyc - Programs for keeping computer clocks accurate. # # Copyright (C) Richard P. Curnow 1997-2003 # Copyright (C) Miroslav Lichvar 2009, 2012 # # ======================================================================= rm -f config.h config.log # This configure script determines the operating system type and version if [ "x${CC}" = "x" ]; then MYCC="gcc" else MYCC="${CC}" fi if [ "x${CFLAGS}" = "x" ]; then MYCFLAGS="-O2 -g" else MYCFLAGS="${CFLAGS}" fi MYCPPFLAGS="${CPPFLAGS}" if [ "x${MYCC}" = "xgcc" ]; then MYCFLAGS="${MYCFLAGS} -Wmissing-prototypes -Wall" fi MYLDFLAGS="${LDFLAGS}" # ====================================================================== # FUNCTIONS #{{{ test_code test_code () { name=$1 headers=$2 cflags=$3 ldflags=$4 code=$5 echo -n "Checking for $name : " ( for h in $headers; do echo "#include <$h>" done echo "int main(int argc, char **argv) {" echo "$code" echo "return 0; }" ) > docheck.c echo "docheck.c:" >> config.log cat docheck.c >> config.log echo $MYCC $MYCFLAGS $MYCPPFLAGS $cflags -o docheck docheck.c $ldflags \ $MYLDFLAGS >> config.log $MYCC $MYCFLAGS $MYCPPFLAGS $cflags -o docheck docheck.c $ldflags \ $MYLDFLAGS >> config.log 2>&1 if [ $? -eq 0 ] then echo "Yes" result=0 else echo "No" result=1 fi rm -f docheck.c docheck echo >> config.log return $result } #}}} #{{{ usage usage () { cat < if you have headers in a nonstandard directory LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory Use these variables to override the choices made by \`configure' or to help it to find libraries and programs with nonstandard names/locations. EOF } #}}} #{{{ add_def () { if [ "x$2" = "x" ]; then echo "#define $1 1" >> config.h else echo "#define $1 $2" >> config.h fi } #}}} # ====================================================================== OPERATINGSYSTEM=`uname -s` VERSION=`uname -r` MACHINE=`uname -m` EXTRA_LIBS="" EXTRA_CLI_LIBS="" EXTRA_OBJECTS="" EXTRA_DEFS="" SYSDEFS="" # Support for readline (on by default) feat_readline=1 try_readline=1 try_editline=1 try_nss=1 try_tomcrypt=1 feat_rtc=1 try_rtc=0 feat_linuxcaps=1 try_linuxcaps=0 readline_lib="" readline_inc="" ncurses_lib="" feat_ipv6=1 feat_phc=1 try_phc=0 feat_pps=1 try_setsched=0 try_lockmem=0 feat_forcednsretry=1 mail_program="/usr/lib/sendmail" for option do case "$option" in --enable-trace ) add_def TRACEON ;; --disable-readline ) feat_readline=0 ;; --without-readline ) try_readline=0 ;; --without-editline ) try_editline=0 ;; --with-readline-library=* ) readline_lib=-L`echo $option | sed -e 's/^.*=//;'` ;; --with-readline-includes=* ) readline_inc=-I`echo $option | sed -e 's/^.*=//;'` ;; --with-ncurses-library=* ) ncurses_lib=-L`echo $option | sed -e 's/^.*=//;'` ;; --prefix=* | --install_prefix=* ) SETPREFIX=`echo $option | sed -e 's/[^=]*=//;'` ;; --exec-prefix=* ) SETEPREFIX=`echo $option | sed -e 's/[^=]*=//;'` ;; --sysconfdir=* ) SETSYSCONFDIR=`echo $option | sed -e 's/^.*=//;'` ;; --bindir=* ) SETBINDIR=`echo $option | sed -e 's/^.*=//;'` ;; --sbindir=* ) SETSBINDIR=`echo $option | sed -e 's/^.*=//;'` ;; --datarootdir=* ) SETDATAROOTDIR=`echo $option | sed -e 's/^.*=//;'` ;; --infodir=* ) SETINFODIR=`echo $option | sed -e 's/^.*=//;'` ;; --mandir=* ) SETMANDIR=`echo $option | sed -e 's/^.*=//;'` ;; --docdir=* ) SETDOCDIR=`echo $option | sed -e 's/^.*=//;'` ;; --localstatedir=* ) SETLOCALSTATEDIR=`echo $option | sed -e 's/^.*=//;'` ;; --chronyvardir=* ) SETCHRONYVARDIR=`echo $option | sed -e 's/^.*=//;'` ;; --disable-rtc) feat_rtc=0 ;; --disable-ipv6) feat_ipv6=0 ;; --disable-phc) feat_phc=0 ;; --disable-pps) feat_pps=0 ;; --disable-linuxcaps) feat_linuxcaps=0 ;; --disable-forcednsretry) feat_forcednsretry=0 ;; --with-sendmail=* ) mail_program=`echo $option | sed -e 's/^.*=//;'` ;; --without-nss ) try_nss=0 ;; --without-tomcrypt ) try_tomcrypt=0 ;; --host-system=* ) OPERATINGSYSTEM=`echo $option | sed -e 's/^.*=//;'` ;; --host-release=* ) VERSION=`echo $option | sed -e 's/^.*=//;'` ;; --host-machine=* ) MACHINE=`echo $option | sed -e 's/^.*=//;'` ;; --help | -h ) usage exit 0 ;; * ) echo "Unrecognized option : " $option esac done SYSTEM=${OPERATINGSYSTEM}-${MACHINE} case $SYSTEM in SunOS-sun4* ) case $VERSION in 4.* ) EXTRA_OBJECTS="sys_sunos.o strerror.o" EXTRA_LIBS="-lkvm" add_def SUNOS echo "Configuring for SunOS (" $SYSTEM "version" $VERSION ")" ;; 5.* ) EXTRA_OBJECTS="sys_solaris.o" EXTRA_LIBS="-lsocket -lnsl -lkvm -lelf" EXTRA_CLI_LIBS="-lsocket -lnsl" add_def SOLARIS echo "Configuring for Solaris (" $SYSTEM "SunOS version" $VERSION ")" ;; esac ;; Linux* ) EXTRA_OBJECTS="sys_linux.o wrap_adjtimex.o" try_linuxcaps=1 try_rtc=1 try_setsched=1 try_lockmem=1 try_phc=1 add_def LINUX echo "Configuring for " $SYSTEM if [ "${MACHINE}" = "alpha" ]; then echo "Enabling -mieee" # FIXME: Should really test for GCC MYCFLAGS="$MYCFLAGS -mieee" fi ;; BSD/386-i[3456]86|FreeBSD-i386|FreeBSD-amd64 ) # Antti Jrvinen reported that this system can # be supported with the SunOS 4.x driver files. EXTRA_OBJECTS="sys_sunos.o strerror.o" EXTRA_LIBS="-lkvm" add_def SUNOS echo "Configuring for $SYSTEM (using SunOS driver)" ;; NetBSD-* ) EXTRA_OBJECTS="sys_netbsd.o" EXTRA_LIBS="-lkvm" SYSDEFS="" echo "Configuring for $SYSTEM" ;; SunOS-i86pc* ) # Doug Woodward reported that this configuration # works for Solaris 2.8 / SunOS 5.8 on x86 platforms EXTRA_OBJECTS="sys_solaris.o" EXTRA_LIBS="-lsocket -lnsl -lkvm -lelf" EXTRA_CLI_LIBS="-lsocket -lnsl" add_def SOLARIS echo "Configuring for Solaris (" $SYSTEM "SunOS version" $VERSION ")" ;; CYGWIN32_NT-i[3456]86 ) EXTRA_OBJECTS="sys_winnt.o" EXTRA_LIBS="" add_def WINNT echo "Configuring for Windows NT (Cygwin32)" ;; * ) echo "Sorry, I don't know how to build this software on your system." exit 1 ;; esac MATHCODE='return (int) pow(2.0, log(sqrt((double)argc)));' if test_code 'math' 'math.h' '' '' "$MATHCODE"; then LIBS="" else if test_code 'math in -lm' 'math.h' '' '-lm' "$MATHCODE"; then LIBS="-lm" else echo "Can't compile/link a program which uses sqrt(), log(), pow(), bailing out" exit 1 fi fi if test_code '' 'stdint.h' '' '' ''; then add_def HAS_STDINT_H fi if test_code '' 'inttypes.h' '' '' ''; then add_def HAS_INTTYPES_H fi if [ $feat_ipv6 = "1" ] && \ test_code 'IPv6 support' 'arpa/inet.h sys/socket.h netinet/in.h' '' '' ' struct sockaddr_in6 n; char p[100]; n.sin6_addr = in6addr_any; return !inet_ntop(AF_INET6, &n.sin6_addr.s6_addr, p, sizeof(p));' then add_def HAVE_IPV6 if test_code 'in6_pktinfo' 'sys/socket.h netinet/in.h' '' '' ' return sizeof(struct in6_pktinfo);' then add_def HAVE_IN6_PKTINFO else if test_code 'in6_pktinfo with _GNU_SOURCE' 'sys/socket.h netinet/in.h' \ '-D_GNU_SOURCE' '' 'return sizeof(struct in6_pktinfo);' then add_def _GNU_SOURCE add_def HAVE_IN6_PKTINFO fi fi fi timepps_h="" if [ $feat_pps = "1" ]; then if test_code '' 'sys/timepps.h' '' '' ''; then timepps_h="sys/timepps.h" add_def HAVE_SYS_TIMEPPS_H else if test_code '' 'timepps.h' '' '' ''; then timepps_h="timepps.h" add_def HAVE_TIMEPPS_H fi fi fi if [ "x$timepps_h" != "x" ] && \ test_code 'PPSAPI' "string.h $timepps_h" '' '' ' pps_handle_t h; pps_info_t i; struct timespec ts; return time_pps_fetch(h, PPS_TSFMT_TSPEC, &i, &ts);' then add_def HAVE_PPSAPI fi if [ $feat_linuxcaps = "1" ] && [ $try_linuxcaps = "1" ] && \ test_code \ linuxcaps \ 'sys/types.h pwd.h sys/prctl.h sys/capability.h grp.h' \ '' '-lcap' \ 'prctl(PR_SET_KEEPCAPS, 1);cap_set_proc(cap_from_text("cap_sys_time=ep"));' then add_def FEAT_LINUXCAPS EXTRA_LIBS="-lcap" fi if [ $feat_rtc = "1" ] && [ $try_rtc = "1" ] && \ test_code '' 'sys/ioctl.h linux/rtc.h' '' '' \ 'ioctl(1, RTC_UIE_ON&RTC_UIE_OFF&RTC_RD_TIME&RTC_SET_TIME, 0&RTC_UF);' then EXTRA_OBJECTS="$EXTRA_OBJECTS rtc_linux.o" add_def FEAT_RTC fi if [ $feat_phc = "1" ] && [ $try_phc = "1" ] && \ test_code '' 'sys/ioctl.h linux/ptp_clock.h' '' '' \ 'ioctl(1, PTP_CLOCK_GETCAPS, 0);' then if test_code 'clock_gettime()' 'time.h' '' '' 'clock_gettime(0, NULL);'; then add_def FEAT_PHC else if test_code 'clock_gettime() in -lrt' 'time.h' '' '-lrt' \ 'clock_gettime(0, NULL);' then EXTRA_LIBS="$EXTRA_LIBS -lrt" add_def FEAT_PHC fi fi fi if [ $try_setsched = "1" ] && \ test_code \ 'sched_setscheduler()' \ 'sched.h' '' '' ' struct sched_param sched; sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, &sched);' then add_def HAVE_SCHED_SETSCHEDULER fi if [ $try_lockmem = "1" ] && \ test_code \ 'mlockall()' \ 'sys/mman.h sys/resource.h' '' '' ' struct rlimit rlim; setrlimit(RLIMIT_MEMLOCK, &rlim); mlockall(MCL_CURRENT|MCL_FUTURE);' then add_def HAVE_MLOCKALL fi if [ $feat_forcednsretry = "1" ] then add_def FORCE_DNSRETRY fi READLINE_COMPILE="" READLINE_LINK="" if [ $feat_readline = "1" ]; then if [ $try_editline = "1" ]; then if test_code editline 'stdio.h editline/readline.h' \ "$readline_inc" "$readline_lib -ledit" \ 'add_history(readline("prompt"));' then add_def FEAT_READLINE add_def USE_EDITLINE READLINE_COMPILE="$readline_inc" READLINE_LINK="$readline_lib -ledit" fi fi if [ "x$READLINE_LINK" = "x" ] && [ $try_readline = "1" ]; then if test_code readline 'stdio.h readline/readline.h readline/history.h' \ "$readline_inc" "$readline_lib $ncurses_lib -lreadline" \ 'add_history(readline("prompt"));' then add_def FEAT_READLINE READLINE_COMPILE="$readline_inc" READLINE_LINK="$readline_lib $ncurses_lib -lreadline" fi fi if [ "x$READLINE_LINK" = "x" ] && [ $try_readline = "1" ]; then if test_code 'readline with -lncurses' \ 'stdio.h readline/readline.h readline/history.h' \ "$readline_inc" "$readline_lib $ncurses_lib -lreadline -lncurses" \ 'add_history(readline("prompt"));' then add_def FEAT_READLINE READLINE_COMPILE="$readline_inc" READLINE_LINK="$readline_lib $ncurses_lib -lreadline -lncurses" fi fi fi HASH_OBJ="hash_intmd5.o" HASH_COMPILE="" HASH_LINK="" if [ $try_nss = "1" ]; then test_cflags="`pkg-config --cflags nss`" test_link="`pkg-config --libs-only-L nss` -lfreebl3" if test_code 'NSS' 'nss.h hasht.h nsslowhash.h' \ "$test_cflags" "$test_link" \ 'NSSLOWHASH_Begin(NSSLOWHASH_NewContext(NSSLOW_Init(), HASH_AlgSHA512));' then HASH_OBJ="hash_nss.o" HASH_COMPILE="$test_cflags" HASH_LINK="$test_link" add_def GENERATE_SHA1_KEY fi fi if [ "x$HASH_LINK" = "x" ] && [ $try_tomcrypt = "1" ]; then if test_code 'tomcrypt' 'tomcrypt.h' '-I/usr/include/tomcrypt' '-ltomcrypt' \ 'hash_memory_multi(find_hash("md5"), NULL, NULL, NULL, 0, NULL, 0);' then HASH_OBJ="hash_tomcrypt.o" HASH_COMPILE="-I/usr/include/tomcrypt" HASH_LINK="-ltomcrypt" add_def GENERATE_SHA1_KEY fi fi SYSCONFDIR=/etc if [ "x$SETSYSCONFDIR" != "x" ]; then SYSCONFDIR=$SETSYSCONFDIR fi PREFIX=/usr/local if [ "x$SETPREFIX" != "x" ]; then PREFIX=$SETPREFIX fi EPREFIX=${PREFIX} if [ "x$SETEPREFIX" != "x" ]; then EPREFIX=$SETEPREFIX fi BINDIR=${EPREFIX}/bin if [ "x$SETBINDIR" != "x" ]; then BINDIR=$SETBINDIR fi SBINDIR=${EPREFIX}/sbin if [ "x$SETSBINDIR" != "x" ]; then SBINDIR=$SETSBINDIR fi DATAROOTDIR=${PREFIX}/share if [ "x$SETDATAROOTDIR" != "x" ]; then DATAROOTDIR=$SETDATAROOTDIR fi INFODIR=${DATAROOTDIR}/info if [ "x$SETINFODIR" != "x" ]; then INFODIR=$SETINFODIR fi MANDIR=${DATAROOTDIR}/man if [ "x$SETMANDIR" != "x" ]; then MANDIR=$SETMANDIR fi DOCDIR=${DATAROOTDIR}/doc/chrony if [ "x$SETDOCDIR" != "x" ]; then DOCDIR=$SETDOCDIR fi LOCALSTATEDIR=/var if [ "x$SETLOCALSTATEDIR" != "x" ]; then LOCALSTATEDIR=$SETLOCALSTATEDIR fi CHRONYVARDIR=${LOCALSTATEDIR}/lib/chrony if [ "x$SETCHRONYVARDIR" != "x" ]; then CHRONYVARDIR=$SETCHRONYVARDIR fi add_def DEFAULT_CONF_FILE "\"$SYSCONFDIR/chrony.conf\"" add_def MAIL_PROGRAM "\"$mail_program\"" if [ -f version.txt ]; then add_def CHRONY_VERSION "\"`cat version.txt`\"" else add_def CHRONY_VERSION "\"DEVELOPMENT\"" fi for f in Makefile chrony.conf.5 chrony.texi chronyc.1 chronyd.8 do echo Creating $f sed -e "s%@EXTRA_OBJECTS@%${EXTRA_OBJECTS}%;\ s%@CC@%${MYCC}%;\ s%@CFLAGS@%${MYCFLAGS}%;\ s%@CPPFLAGS@%${CPPFLAGS}%;\ s%@LIBS@%${LIBS}%;\ s%@LDFLAGS@%${MYLDFLAGS}%;\ s%@EXTRA_LIBS@%${EXTRA_LIBS}%;\ s%@EXTRA_CLI_LIBS@%${EXTRA_CLI_LIBS}%;\ s%@READLINE_COMPILE@%${READLINE_COMPILE}%;\ s%@READLINE_LINK@%${READLINE_LINK}%;\ s%@HASH_OBJ@%${HASH_OBJ}%;\ s%@HASH_LINK@%${HASH_LINK}%;\ s%@HASH_COMPILE@%${HASH_COMPILE}%;\ s%@SYSCONFDIR@%${SYSCONFDIR}%;\ s%@BINDIR@%${BINDIR}%;\ s%@SBINDIR@%${SBINDIR}%;\ s%@DOCDIR@%${DOCDIR}%;\ s%@MANDIR@%${MANDIR}%;\ s%@INFODIR@%${INFODIR}%;\ s%@LOCALSTATEDIR@%${LOCALSTATEDIR}%;\ s%@CHRONYVARDIR@%${CHRONYVARDIR}%;"\ < ${f}.in > $f done # ======================================================================= # vim:et:sw=2:ht=2:sts=2:fdm=marker:cms=#%s