summaryrefslogtreecommitdiffstats
path: root/configure
diff options
context:
space:
mode:
Diffstat (limited to 'configure')
-rwxr-xr-xconfigure1134
1 files changed, 1134 insertions, 0 deletions
diff --git a/configure b/configure
new file mode 100755
index 0000000..fd777c8
--- /dev/null
+++ b/configure
@@ -0,0 +1,1134 @@
+#!/bin/sh
+# =======================================================================
+#
+# chronyd/chronyc - Programs for keeping computer clocks accurate.
+#
+# Copyright (C) Richard P. Curnow 1997-2003
+# Copyright (C) Bryan Christianson 2016
+# Copyright (C) Miroslav Lichvar 2009, 2012-2021
+# Copyright (C) Stefan R. Filipek 2019
+#
+# =======================================================================
+
+# This configure script determines the operating system type and version
+
+# ======================================================================
+# FUNCTIONS
+
+#{{{ test_code
+test_code () {
+ name=$1
+ headers=$2
+ cflags=$3
+ ldflags=$4
+ code=$5
+
+ printf "%s" "Checking for $name : "
+
+ (
+ echo "#include \"config.h\""
+ for h in $headers; do
+ echo "#include <$h>"
+ done
+ echo "int main(int argc, char **argv) {"
+ echo "$code"
+ echo "return 0; }"
+ ) > conftest.c
+
+ echo "conftest.c:" >> config.log
+ cat conftest.c >> config.log
+ echo $MYCC $MYCFLAGS $MYCPPFLAGS $cflags -o conftest conftest.c $ldflags \
+ $MYLDFLAGS >> config.log
+ $MYCC $MYCFLAGS $MYCPPFLAGS $cflags -o conftest conftest.c $ldflags \
+ $MYLDFLAGS >> config.log 2>&1
+
+ if [ $? -eq 0 ]
+ then
+ echo "Yes"
+ result=0
+ else
+ echo "No"
+ result=1
+ fi
+ rm -f conftest.c conftest
+ echo >> config.log
+ return $result
+}
+#}}}
+#{{{ test_executable
+test_executable () {
+ name=$1
+ executable=$2
+ options=$3
+
+ printf "%s" "Checking for $name : "
+
+ echo $executable $options >> config.log
+ $executable $options >> config.log 2>&1
+
+ if [ $? -eq 0 ]
+ then
+ echo "Yes"
+ result=0
+ else
+ echo "No"
+ result=1
+ fi
+ echo >> config.log
+ return $result
+}
+#}}}
+#{{{ pkg_config
+pkg_config () {
+ $PKG_CONFIG "$@" 2>> config.log
+}
+#}}}
+#{{{ usage
+usage () {
+ cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: ./configure [OPTION]...
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [/usr/local]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`/usr/local/bin', \`/usr/local/lib' etc. You can specify
+an installation prefix other than \`/usr/local' using \`--prefix',
+for instance \`--prefix=$HOME'.
+
+For better control, use the options below.
+ --disable-readline Disable line editing support
+ --without-editline Don't use editline even if it is available
+ --disable-sechash Disable support for hashes other than MD5
+ --without-nettle Don't use nettle even if it is available
+ --without-nss Don't use NSS even if it is available
+ --without-tomcrypt Don't use libtomcrypt even if it is available
+ --disable-nts Disable NTS support
+ --without-gnutls Don't use gnutls even if it is available
+ --disable-cmdmon Disable command and monitoring support
+ --disable-ntp Disable NTP support
+ --disable-refclock Disable reference clock support
+ --disable-phc Disable PHC refclock driver
+ --disable-pps Disable PPS refclock driver
+ --disable-ipv6 Disable IPv6 support
+ --disable-rtc Don't include RTC even on Linux
+ --disable-privdrop Disable support for dropping root privileges
+ --without-libcap Don't use libcap even if it is available
+ --enable-scfilter Enable support for system call filtering
+ --without-seccomp Don't use seccomp even if it is available
+ --disable-asyncdns Disable asynchronous name resolving
+ --disable-forcednsretry Don't retry on permanent DNS error
+ --without-clock-gettime Don't use clock_gettime() even if it is available
+ --disable-timestamping Disable support for SW/HW timestamping
+ --enable-ntp-signd Enable support for MS-SNTP authentication in Samba
+ --with-ntp-era=SECONDS Specify earliest assumed NTP time in seconds
+ since 1970-01-01 [50*365 days ago]
+ --with-user=USER Specify default chronyd user [root]
+ --with-hwclockfile=PATH Specify default path to hwclock(8) adjtime file
+ --with-pidfile=PATH Specify default pidfile [/var/run/chrony/chronyd.pid]
+ --with-rtcdevice=PATH Specify default path to RTC device [/dev/rtc]
+ --with-sendmail=PATH Path to sendmail binary [/usr/lib/sendmail]
+ --enable-debug Enable debugging support
+
+Fine tuning of the installation directories:
+ --sysconfdir=DIR chrony.conf location [/etc]
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --datarootdir=DIR data root [PREFIX/share]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/chrony]
+ --localstatedir=DIR modifiable single-machine data [/var]
+ --chronyrundir=DIR location for chrony sockets [LOCALSTATEDIR/run/chrony]
+ --chronyvardir=DIR location for chrony data [LOCALSTATEDIR/lib/chrony]
+
+Overriding system detection when cross-compiling:
+ --host-system=OS Specify system name (uname -s)
+ --host-release=REL Specify system release (uname -r)
+ --host-machine=CPU Specify machine (uname -m)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ CPPFLAGS C preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ PKG_CONFIG path to pkg-config utility
+ PKG_CONFIG_PATH
+ directories to add to pkg-config's search path
+ PKG_CONFIG_LIBDIR
+ path overriding pkg-config's built-in search path
+
+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
+}
+#}}}
+#{{{ get_features
+get_features () {
+ ff=1
+ for f; do
+ if [ "$ff" = "0" ]; then
+ printf " "
+ fi
+ if grep "define FEAT_$f" config.h > /dev/null; then
+ printf "%s" "+$f"
+ else
+ printf "%s" "-$f"
+ fi
+ ff=0
+ done
+}
+#}}}
+
+# ======================================================================
+
+
+
+OPERATINGSYSTEM=`uname -s`
+VERSION=`uname -r`
+MACHINE=`uname -m`
+
+LIBS=""
+EXTRA_LIBS=""
+EXTRA_CLI_LIBS=""
+EXTRA_OBJECTS=""
+EXTRA_CLI_OBJECTS=""
+
+feat_debug=0
+feat_cmdmon=1
+feat_ntp=1
+feat_refclock=1
+feat_readline=1
+try_editline=1
+feat_sechash=1
+try_nettle=1
+try_nss=1
+try_tomcrypt=1
+feat_nts=1
+try_gnutls=1
+feat_rtc=1
+try_rtc=0
+feat_droproot=1
+try_libcap=-1
+try_clockctl=0
+feat_scfilter=0
+try_seccomp=-1
+priv_ops=""
+feat_ipv6=1
+feat_phc=1
+try_phc=0
+feat_pps=1
+try_setsched=0
+try_lockmem=0
+feat_asyncdns=1
+feat_forcednsretry=1
+try_clock_gettime=1
+try_arc4random=1
+try_recvmmsg=1
+feat_timestamping=1
+try_timestamping=0
+feat_ntp_signd=0
+ntp_era_split=""
+use_pthread=0
+default_user="root"
+default_hwclockfile=""
+default_pidfile="/var/run/chrony/chronyd.pid"
+default_rtcdevice="/dev/rtc"
+mail_program="/usr/lib/sendmail"
+
+for option
+do
+ case "$option" in
+ --enable-debug )
+ feat_debug=1
+ ;;
+ --disable-readline )
+ feat_readline=0
+ ;;
+ --without-editline )
+ try_editline=0
+ ;;
+ --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/^.*=//;'`
+ ;;
+ --mandir=* )
+ SETMANDIR=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --docdir=* )
+ SETDOCDIR=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --localstatedir=* )
+ SETLOCALSTATEDIR=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --chronyrundir=* | --chronysockdir=* )
+ SETCHRONYRUNDIR=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --chronyvardir=* )
+ SETCHRONYVARDIR=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --disable-cmdmon)
+ feat_cmdmon=0
+ ;;
+ --disable-ntp)
+ feat_ntp=0
+ ;;
+ --disable-refclock)
+ feat_refclock=0
+ ;;
+ --disable-rtc)
+ feat_rtc=0
+ ;;
+ --disable-ipv6)
+ feat_ipv6=0
+ ;;
+ --disable-phc)
+ feat_phc=0
+ ;;
+ --disable-pps)
+ feat_pps=0
+ ;;
+ --disable-privdrop)
+ feat_droproot=0
+ ;;
+ --without-libcap|--disable-linuxcaps)
+ try_libcap=0
+ ;;
+ --enable-scfilter)
+ feat_scfilter=1
+ ;;
+ --disable-scfilter)
+ feat_scfilter=0
+ ;;
+ --without-seccomp)
+ try_seccomp=0
+ ;;
+ --disable-asyncdns)
+ feat_asyncdns=0
+ ;;
+ --disable-forcednsretry)
+ feat_forcednsretry=0
+ ;;
+ --without-clock-gettime)
+ try_clock_gettime=0
+ ;;
+ --disable-timestamping)
+ feat_timestamping=0
+ ;;
+ --enable-ntp-signd)
+ feat_ntp_signd=1
+ ;;
+ --with-ntp-era=* )
+ ntp_era_split=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --with-user=* )
+ default_user=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --with-hwclockfile=* )
+ default_hwclockfile=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --with-pidfile=* )
+ default_pidfile=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --with-rtcdevice=* )
+ default_rtcdevice=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --with-sendmail=* )
+ mail_program=`echo $option | sed -e 's/^.*=//;'`
+ ;;
+ --disable-sechash )
+ feat_sechash=0
+ ;;
+ --without-nettle )
+ try_nettle=0
+ ;;
+ --without-nss )
+ try_nss=0
+ ;;
+ --without-tomcrypt )
+ try_tomcrypt=0
+ ;;
+ --disable-nts )
+ feat_nts=0
+ ;;
+ --without-gnutls )
+ try_gnutls=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
+
+rm -f config.h config.log
+
+SYSTEM=${OPERATINGSYSTEM}-${MACHINE}
+
+case $OPERATINGSYSTEM in
+ Linux)
+ EXTRA_OBJECTS="sys_generic.o sys_linux.o sys_timex.o sys_posix.o"
+ [ $try_libcap != "0" ] && try_libcap=1
+ try_rtc=1
+ [ $try_seccomp != "0" ] && try_seccomp=1
+ try_timestamping=1
+ try_setsched=1
+ try_lockmem=1
+ try_phc=1
+ try_arc4random=0
+ add_def LINUX
+ echo "Configuring for " $SYSTEM
+ ;;
+ FreeBSD)
+ # recvmmsg() seems to be broken on FreeBSD 11.0 and it's just
+ # a wrapper around recvmsg()
+ try_recvmmsg=0
+ EXTRA_OBJECTS="sys_generic.o sys_netbsd.o sys_timex.o sys_posix.o"
+ try_setsched=1
+ try_lockmem=1
+ add_def FREEBSD
+ if [ $feat_droproot = "1" ]; then
+ add_def FEAT_PRIVDROP
+ priv_ops="ADJUSTTIME ADJUSTTIMEX SETTIME BINDSOCKET"
+ fi
+ echo "Configuring for $SYSTEM"
+ ;;
+ NetBSD)
+ EXTRA_OBJECTS="sys_generic.o sys_netbsd.o sys_timex.o sys_posix.o"
+ try_clockctl=1
+ try_setsched=1
+ try_lockmem=1
+ add_def NETBSD
+ echo "Configuring for $SYSTEM"
+ ;;
+ Darwin)
+ EXTRA_OBJECTS="sys_macosx.o"
+ LIBS="$LIBS -lresolv"
+ add_def MACOSX
+ if [ $feat_droproot = "1" ]; then
+ add_def FEAT_PRIVDROP
+ priv_ops="ADJUSTTIME SETTIME BINDSOCKET"
+ fi
+ major=`echo $VERSION | cut -d. -f1`
+ # ntp_adjtime is not available in macOS 10.12 (Darwin 16.x.x) and earlier
+ if [ $major -gt "16" ]; then
+ add_def HAVE_MACOS_SYS_TIMEX
+ EXTRA_OBJECTS="$EXTRA_OBJECTS sys_generic.o sys_netbsd.o sys_timex.o"
+ if [ $feat_droproot = "1" ]; then
+ priv_ops="$priv_ops ADJUSTTIMEX"
+ fi
+ fi
+ echo "Configuring for macOS (" $SYSTEM "macOS version" $VERSION ")"
+ ;;
+ SunOS)
+ EXTRA_OBJECTS="sys_generic.o sys_solaris.o sys_timex.o sys_posix.o"
+ LIBS="$LIBS -lsocket -lnsl -lkvm -lelf -lresolv"
+ try_setsched=1
+ try_lockmem=1
+ add_def SOLARIS
+ # These are needed to have msg_control in struct msghdr
+ add_def __EXTENSIONS__
+ add_def _XOPEN_SOURCE 1
+ add_def _XOPEN_SOURCE_EXTENDED 1
+ if [ $feat_droproot = "1" ]; then
+ add_def FEAT_PRIVDROP
+ priv_ops="ADJUSTTIMEX SETTIME BINDSOCKET"
+ fi
+ echo "Configuring for illumos (" $SYSTEM "SunOS version" $VERSION ")"
+ ;;
+ * )
+ echo "error: $SYSTEM is not supported (yet?)"
+ exit 1
+ ;;
+esac
+
+if [ $feat_debug = "1" ]; then
+ add_def FEAT_DEBUG
+fi
+add_def DEBUG $feat_debug
+
+if [ $feat_cmdmon = "1" ]; then
+ add_def FEAT_CMDMON
+ EXTRA_OBJECTS="$EXTRA_OBJECTS cmdmon.o manual.o pktlength.o"
+fi
+
+if [ $feat_ntp = "1" ]; then
+ add_def FEAT_NTP
+ EXTRA_OBJECTS="$EXTRA_OBJECTS ntp_auth.o ntp_core.o ntp_ext.o ntp_io.o ntp_sources.o"
+ if [ $feat_ntp_signd = "1" ]; then
+ add_def FEAT_SIGND
+ EXTRA_OBJECTS="$EXTRA_OBJECTS ntp_signd.o"
+ fi
+else
+ feat_asyncdns=0
+ feat_timestamping=0
+fi
+
+if [ "$feat_cmdmon" = "1" ] || [ $feat_ntp = "1" ]; then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS addrfilt.o clientlog.o keys.o nameserv.o"
+else
+ feat_ipv6=0
+fi
+
+if [ $feat_refclock = "1" ]; then
+ add_def FEAT_REFCLOCK
+ EXTRA_OBJECTS="$EXTRA_OBJECTS refclock.o refclock_phc.o refclock_pps.o refclock_shm.o refclock_sock.o"
+fi
+
+MYCC="$CC"
+MYCFLAGS="$CFLAGS"
+MYCPPFLAGS="$CPPFLAGS"
+MYLDFLAGS="$LDFLAGS"
+
+if [ "x$MYCC" = "x" ]; then
+ for cc in gcc clang cc ""; do
+ if [ "x$cc" = "x" ]; then
+ echo "error: no C compiler found"
+ exit 1
+ fi
+ MYCC=$cc
+ if test_code "$MYCC" '' '' '' ''; then
+ break
+ fi
+ done
+else
+ if ! test_code "$MYCC" '' '' '' ''; then
+ echo "error: C compiler $MYCC cannot create executables"
+ exit 1
+ fi
+fi
+
+if [ "x$MYCFLAGS" = "x" ]; then
+ MYCFLAGS="-O2 -g"
+
+ TESTCFLAGS="-D_FORTIFY_SOURCE=2 -fPIE"
+ TESTLDFLAGS="-pie -Wl,-z,relro,-z,now"
+ if test_code 'hardening compiler options' '' "$TESTCFLAGS" "$TESTLDFLAGS" ''; then
+ MYCFLAGS="$MYCFLAGS $TESTCFLAGS"
+ MYLDFLAGS="$MYLDFLAGS $TESTLDFLAGS"
+ fi
+ TESTCFLAGS="-fstack-protector-strong --param=ssp-buffer-size=4"
+ if test_code '-fstack-protector-strong' '' "$TESTCFLAGS" '' ''; then
+ MYCFLAGS="$MYCFLAGS $TESTCFLAGS"
+ else
+ TESTCFLAGS="-fstack-protector --param=ssp-buffer-size=4"
+ if test_code '-fstack-protector' '' "$TESTCFLAGS" '' ''; then
+ MYCFLAGS="$MYCFLAGS $TESTCFLAGS"
+ fi
+ fi
+fi
+
+if [ "x$MYCC" = "xgcc" ] || [ "x$MYCC" = "xclang" ]; then
+ MYCFLAGS="$MYCFLAGS -Wmissing-prototypes -Wall"
+fi
+
+if [ "x$PKG_CONFIG" = "x" ]; then
+ PKG_CONFIG=pkg-config
+fi
+
+if ! test_executable "pkg-config" $PKG_CONFIG --version; then
+ try_nettle=0
+ try_nss=0
+ try_gnutls=0
+fi
+
+if test_code '64-bit time_t' 'time.h' '' '' '
+ char x[sizeof(time_t) > 4 ? 1 : -1] = {0};
+ return x[0];'
+then
+ add_def HAVE_LONG_TIME_T 1
+
+ if [ "x$ntp_era_split" != "x" ]; then
+ split_seconds=$ntp_era_split
+ split_days=0
+ else
+ if [ "x$SOURCE_DATE_EPOCH" != "x" ]; then
+ split_seconds=$SOURCE_DATE_EPOCH
+ else
+ split_seconds=`date '+%s'`
+ fi
+ if [ "x$split_seconds" = "x" ]; then
+ echo "error: could not get current time, --with-ntp-era option is needed"
+ exit 1
+ fi
+ split_days=$((50 * 365))
+ fi
+
+ add_def NTP_ERA_SPLIT "(${split_seconds}LL - $split_days * 24 * 3600)"
+
+ date_format='+%Y-%m-%dT%H:%M:%SZ'
+
+ # Print the full NTP interval if a suitable date is found
+ if [ "x`date -u -d '1970-01-01 UTC 9 days ago 5 seconds 3 seconds' \
+ $date_format 2> /dev/null`" = "x1969-12-23T00:00:08Z" ]
+ then
+ time1="`date -u -d "1970-01-01 UTC $split_days days ago $split_seconds seconds" \
+ $date_format`"
+ time2="`date -u -d "1970-01-01 UTC $split_days days ago $split_seconds seconds 4294967296 seconds" \
+ $date_format`"
+ echo "NTP time mapped to $time1/$time2"
+ fi
+fi
+
+MATHCODE='return (int) pow(2.0, log(sqrt((double)argc)));'
+if ! test_code 'math' 'math.h' '' '' "$MATHCODE"; then
+ if test_code 'math in -lm' 'math.h' '' '-lm' "$MATHCODE"; then
+ LIBS="$LIBS -lm"
+ else
+ echo "error: could not compile/link a program which uses sqrt(), log(), pow()"
+ exit 1
+ fi
+fi
+
+if test_code 'struct in_pktinfo' 'sys/socket.h netinet/in.h' '' '' '
+ struct in_pktinfo ipi;
+ return sizeof (ipi.ipi_spec_dst.s_addr) + IP_PKTINFO;'
+then
+ add_def HAVE_IN_PKTINFO
+fi
+
+if [ $feat_ipv6 = "1" ] && \
+ test_code 'IPv6 support' 'arpa/inet.h sys/socket.h netinet/in.h' '' "$LIBS" '
+ struct sockaddr_in6 n;
+ char p[100];
+ n.sin6_addr = in6addr_any;
+ n.sin6_scope_id = 0;
+ return !inet_ntop(AF_INET6, &n.sin6_addr.s6_addr, p, sizeof(p));'
+then
+ add_def FEAT_IPV6
+ if test_code 'struct in6_pktinfo' 'sys/socket.h netinet/in.h' '' '' '
+ return sizeof (struct in6_pktinfo) + IPV6_PKTINFO;'
+ then
+ add_def HAVE_IN6_PKTINFO
+ else
+ if test_code 'struct in6_pktinfo with _GNU_SOURCE' 'sys/socket.h netinet/in.h' \
+ '-D_GNU_SOURCE' '' 'return sizeof (struct in6_pktinfo) + IPV6_PKTINFO;'
+ then
+ add_def _GNU_SOURCE
+ add_def HAVE_IN6_PKTINFO
+ fi
+ fi
+fi
+
+if ! test_code 'O_NOFOLLOW flag' 'sys/types.h sys/stat.h fcntl.h' '' "$LIBS" \
+ 'return open("/dev/null", O_NOFOLLOW);'
+then
+ if test_code 'O_NOFOLLOW flag with _GNU_SOURCE' 'sys/types.h sys/stat.h fcntl.h' \
+ '-D_GNU_SOURCE' "$LIBS" \
+ 'return open("/dev/null", O_NOFOLLOW);'
+ then
+ add_def _GNU_SOURCE
+ else
+ echo "error: open() does not support O_NOFOLLOW flag"
+ exit 1
+ fi
+fi
+
+if [ $try_clock_gettime = "1" ]; then
+ if test_code 'clock_gettime()' 'time.h' '' '' \
+ 'clock_gettime(CLOCK_REALTIME, (void *)1);'
+ then
+ add_def HAVE_CLOCK_GETTIME
+ else
+ if test_code 'clock_gettime() in -lrt' 'time.h' '' '-lrt' \
+ 'clock_gettime(CLOCK_REALTIME, (void *)1);'
+ then
+ add_def HAVE_CLOCK_GETTIME
+ EXTRA_LIBS="$EXTRA_LIBS -lrt"
+ fi
+ fi
+fi
+
+if ! test_code 'getaddrinfo()' 'sys/types.h sys/socket.h netdb.h' '' "$LIBS" \
+ 'return getaddrinfo(0, 0, 0, 0);'
+then
+ echo "error: getaddrinfo() not found"
+ exit 1
+fi
+
+if [ $feat_asyncdns = "1" ] && \
+ test_code 'pthread' 'pthread.h' '-pthread' '' '
+ pthread_t thread;
+ return (int)pthread_create(&thread, NULL, (void *)1, NULL);'
+then
+ add_def FEAT_ASYNCDNS
+ add_def USE_PTHREAD_ASYNCDNS
+ EXTRA_OBJECTS="$EXTRA_OBJECTS nameserv_async.o"
+ use_pthread=1
+fi
+
+if [ $try_arc4random = "1" ] && \
+ test_code 'arc4random_buf()' 'stdlib.h' '' '' \
+ 'arc4random_buf((void *)1, 1);'
+then
+ add_def HAVE_ARC4RANDOM
+else
+ if test_code 'getrandom()' 'stdlib.h sys/random.h' '' '' \
+ 'return getrandom((void *)1, 1, 0);'; then
+ add_def HAVE_GETRANDOM
+ fi
+fi
+
+RECVMMSG_CODE='
+ struct mmsghdr hdr;
+ return !recvmmsg(0, &hdr, 1, MSG_DONTWAIT, 0);'
+if [ $try_recvmmsg = "1" ]; then
+ if test_code 'recvmmsg()' 'sys/socket.h' '' "$LIBS" "$RECVMMSG_CODE"; then
+ add_def HAVE_RECVMMSG
+ else
+ if test_code 'recvmmsg() with _GNU_SOURCE' 'sys/socket.h' '-D_GNU_SOURCE' \
+ "$LIBS" "$RECVMMSG_CODE"
+ then
+ add_def _GNU_SOURCE
+ add_def HAVE_RECVMMSG
+ fi
+ fi
+fi
+
+if [ $feat_timestamping = "1" ] && [ $try_timestamping = "1" ] &&
+ test_code 'SW/HW timestamping' 'sys/types.h sys/socket.h linux/net_tstamp.h
+ linux/errqueue.h linux/ptp_clock.h' '' '' '
+ int val = SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_RX_SOFTWARE |
+ SOF_TIMESTAMPING_RAW_HARDWARE | SOF_TIMESTAMPING_OPT_CMSG;
+ return sizeof (struct scm_timestamping) + SCM_TSTAMP_SND + PTP_SYS_OFFSET +
+ setsockopt(0, SOL_SOCKET, SO_SELECT_ERR_QUEUE + SO_TIMESTAMPING,
+ &val, sizeof (val));'
+then
+ add_def HAVE_LINUX_TIMESTAMPING
+ EXTRA_OBJECTS="$EXTRA_OBJECTS hwclock.o ntp_io_linux.o"
+
+ if test_code 'other timestamping options' \
+ 'sys/types.h sys/socket.h linux/net_tstamp.h' '' '' '
+ struct scm_ts_pktinfo pktinfo;
+ pktinfo.if_index = pktinfo.pkt_length = 0;
+ return pktinfo.if_index + pktinfo.pkt_length + HWTSTAMP_FILTER_NTP_ALL +
+ SCM_TIMESTAMPING_PKTINFO +
+ SOF_TIMESTAMPING_OPT_PKTINFO + SOF_TIMESTAMPING_OPT_TX_SWHW;'; then
+ add_def HAVE_LINUX_TIMESTAMPING_RXFILTER_NTP 1
+ add_def HAVE_LINUX_TIMESTAMPING_OPT_PKTINFO 1
+ add_def HAVE_LINUX_TIMESTAMPING_OPT_TX_SWHW 1
+ fi
+fi
+
+timepps_h=""
+if [ $feat_refclock = "1" ] && [ $feat_pps = "1" ]; then
+ if test_code '<sys/timepps.h>' 'inttypes.h time.h sys/timepps.h' '' '' ''; then
+ timepps_h="sys/timepps.h"
+ add_def HAVE_SYS_TIMEPPS_H
+ else
+ if test_code '<timepps.h>' 'inttypes.h time.h timepps.h' '' '' ''; then
+ timepps_h="timepps.h"
+ add_def HAVE_TIMEPPS_H
+ fi
+ fi
+fi
+
+if [ "x$timepps_h" != "x" ] && \
+ test_code 'PPSAPI' "inttypes.h string.h time.h $timepps_h" '' '' '
+ pps_handle_t h = 0;
+ pps_info_t i;
+ struct timespec ts;
+ ts.tv_sec = ts.tv_nsec = 0;
+ return time_pps_fetch(h, PPS_TSFMT_TSPEC, &i, &ts);'
+then
+ add_def FEAT_PPS
+fi
+
+if [ $feat_droproot = "1" ] && [ $try_libcap = "1" ] && \
+ test_code \
+ libcap \
+ '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_PRIVDROP
+ EXTRA_LIBS="$EXTRA_LIBS -lcap"
+fi
+
+if [ $feat_droproot = "1" ] && [ $try_clockctl = "1" ] && \
+ test_code '<sys/clockctl.h>' 'sys/clockctl.h' '' '' ''
+then
+ add_def FEAT_PRIVDROP
+ priv_ops="BINDSOCKET"
+fi
+
+if [ $feat_scfilter = "1" ] && [ $try_seccomp = "1" ] && \
+ test_code seccomp 'seccomp.h' '' '-lseccomp' \
+ 'seccomp_init(SCMP_ACT_KILL);'
+then
+ add_def FEAT_SCFILTER
+ if [ $feat_ntp = "1" ]; then
+ # NAME2IPADDRESS shouldn't be enabled together with a privops operation
+ # used by the main thread as the helper process works on one request at
+ # a time and the async resolver would block the main thread
+ priv_ops="NAME2IPADDRESS RELOADDNS"
+ fi
+ EXTRA_LIBS="$EXTRA_LIBS -lseccomp"
+fi
+
+if [ "x$priv_ops" != "x" ]; then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS privops.o"
+ add_def PRIVOPS_HELPER
+ for o in $priv_ops; do
+ add_def PRIVOPS_$o
+ done
+fi
+
+if [ $feat_rtc = "1" ] && [ $try_rtc = "1" ] && \
+ test_code '<linux/rtc.h>' '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_refclock = "1" ] && [ $feat_phc = "1" ] && [ $try_phc = "1" ] && \
+ grep '#define HAVE_CLOCK_GETTIME' config.h > /dev/null && \
+ test_code '<linux/ptp_clock.h>' 'sys/ioctl.h linux/ptp_clock.h' '' '' \
+ 'ioctl(1, PTP_CLOCK_GETCAPS + PTP_SYS_OFFSET, 0);'
+then
+ grep 'HAVE_LINUX_TIMESTAMPING' config.h > /dev/null ||
+ EXTRA_OBJECTS="$EXTRA_OBJECTS hwclock.o"
+ add_def FEAT_PHC
+fi
+
+if [ $try_setsched = "1" ] && \
+ test_code \
+ 'pthread_setschedparam()' \
+ 'pthread.h sched.h' '-pthread' '' '
+ struct sched_param sched;
+ sched_get_priority_max(SCHED_FIFO);
+ pthread_setschedparam(pthread_self(), SCHED_FIFO, &sched);'
+then
+ add_def HAVE_PTHREAD_SETSCHEDPARAM
+ use_pthread=1
+fi
+
+if [ $try_lockmem = "1" ] && \
+ test_code \
+ 'mlockall()' \
+ 'sys/mman.h' '' '' '
+ mlockall(MCL_CURRENT|MCL_FUTURE);'
+then
+ add_def HAVE_MLOCKALL
+fi
+if [ $try_lockmem = "1" ] && \
+ test_code \
+ 'setrlimit(RLIMIT_MEMLOCK, ...)' \
+ 'sys/resource.h' '' '' '
+ struct rlimit rlim;
+ rlim.rlim_max = rlim.rlim_cur = RLIM_INFINITY;
+ setrlimit(RLIMIT_MEMLOCK, &rlim);'
+then
+ add_def HAVE_SETRLIMIT_MEMLOCK
+fi
+
+if [ $feat_forcednsretry = "1" ]
+then
+ add_def FORCE_DNSRETRY
+fi
+
+READLINE_LINK=""
+if [ $feat_readline = "1" ]; then
+ if [ $try_editline = "1" ]; then
+ if test_code editline 'stdio.h editline/readline.h' '' '-ledit' \
+ 'add_history(readline("prompt"));'
+ then
+ add_def FEAT_READLINE
+ READLINE_LINK="-ledit"
+ fi
+ fi
+
+ EXTRA_CLI_LIBS="$EXTRA_CLI_LIBS $READLINE_LINK"
+fi
+
+HASH_OBJ="hash_intmd5.o"
+HASH_LINK=""
+
+if [ $feat_sechash = "1" ] && [ "x$HASH_LINK" = "x" ] && [ $try_nettle = "1" ]; then
+ test_cflags="`pkg_config --cflags nettle`"
+ test_link="`pkg_config --libs nettle`"
+ if test_code 'nettle' 'nettle/nettle-meta.h nettle/sha2.h' \
+ "$test_cflags" "$test_link" \
+ 'return nettle_hashes[0]->context_size;'
+ then
+ HASH_OBJ="hash_nettle.o"
+ HASH_LINK="$test_link"
+ MYCPPFLAGS="$MYCPPFLAGS $test_cflags"
+ add_def FEAT_SECHASH
+
+ if test_code 'CMAC in nettle' 'nettle/cmac.h' "$test_cflags" "$test_link" \
+ 'cmac128_update((void *)1, (void *)2, (void *)3, 1, (void *)4);'
+ then
+ add_def HAVE_CMAC
+ EXTRA_OBJECTS="$EXTRA_OBJECTS cmac_nettle.o"
+ EXTRA_CLI_OBJECTS="$EXTRA_CLI_OBJECTS cmac_nettle.o"
+ fi
+ fi
+fi
+
+if [ $feat_sechash = "1" ] && [ "x$HASH_LINK" = "x" ] && [ $try_nss = "1" ]; then
+ test_cflags="`pkg_config --cflags nss`"
+ test_link="`pkg_config --libs-only-L nss` -lfreebl3 -lnssutil3"
+ 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_LINK="$test_link"
+ MYCPPFLAGS="$MYCPPFLAGS $test_cflags"
+ add_def FEAT_SECHASH
+ fi
+fi
+
+if [ $feat_sechash = "1" ] && [ "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"), (void *)1, (void *)2, (void *)3, 1, (void *)4, 1);'
+ then
+ HASH_OBJ="hash_tomcrypt.o"
+ HASH_LINK="-ltomcrypt"
+ MYCPPFLAGS="$MYCPPFLAGS -I/usr/include/tomcrypt"
+ add_def FEAT_SECHASH
+ fi
+fi
+
+if [ $feat_sechash = "1" ] && [ "x$HASH_LINK" = "x" ] && [ $try_gnutls = "1" ]; then
+ test_cflags="`pkg_config --cflags gnutls`"
+ test_link="`pkg_config --libs gnutls`"
+ if test_code 'gnutls' 'gnutls/crypto.h' \
+ "$test_cflags" "$test_link" '
+ return gnutls_hash((void *)1, (void *)2, 1);'
+ then
+ HASH_OBJ="hash_gnutls.o"
+ HASH_LINK="$test_link"
+ MYCPPFLAGS="$MYCPPFLAGS $test_cflags"
+ add_def FEAT_SECHASH
+
+ if test_code 'CMAC in gnutls' 'gnutls/crypto.h' "$test_cflags" "$test_link" \
+ 'return gnutls_hmac_init((void *)1, GNUTLS_MAC_AES_CMAC_128, (void *)2, 0);'
+ then
+ add_def HAVE_CMAC
+ EXTRA_OBJECTS="$EXTRA_OBJECTS cmac_gnutls.o"
+ EXTRA_CLI_OBJECTS="$EXTRA_CLI_OBJECTS cmac_gnutls.o"
+ fi
+ fi
+fi
+
+EXTRA_OBJECTS="$EXTRA_OBJECTS $HASH_OBJ"
+EXTRA_CLI_OBJECTS="$EXTRA_CLI_OBJECTS $HASH_OBJ"
+LIBS="$LIBS $HASH_LINK"
+
+if [ $feat_ntp = "1" ] && [ $feat_nts = "1" ] && [ $try_gnutls = "1" ]; then
+ if [ "$HASH_OBJ" = "hash_gnutls.o" ]; then
+ test_cflags=""
+ test_link=""
+ else
+ test_cflags="`pkg_config --cflags gnutls`"
+ test_link="`pkg_config --libs gnutls`"
+ fi
+ if test_code 'TLS1.3 in gnutls' 'gnutls/gnutls.h' \
+ "$test_cflags" "$test_link $LIBS" '
+ return gnutls_init((void *)1, 0) + GNUTLS_TLS1_3 +
+ gnutls_priority_init2((void *)1, "", NULL, GNUTLS_PRIORITY_INIT_DEF_APPEND) +
+ gnutls_prf_rfc5705((void *)1, 0, "", 0, "", 16, (void *)2);'
+ then
+ if test_code 'SIV in nettle' \
+ 'nettle/siv-cmac.h' "" "$LIBS" \
+ 'siv_cmac_aes128_set_key((void *)1, (void *)2);'
+ then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS siv_nettle.o"
+ add_def HAVE_SIV
+ add_def HAVE_NETTLE_SIV_CMAC
+ else
+ if test_code 'SIV in gnutls' 'gnutls/crypto.h' \
+ "$test_cflags" "$test_link $LIBS" '
+ return gnutls_aead_cipher_init((void *)1, GNUTLS_CIPHER_AES_128_SIV, (void *)2);'
+ then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS siv_gnutls.o"
+ add_def HAVE_SIV
+ if test_code 'gnutls_aead_cipher_set_key()' 'gnutls/crypto.h' \
+ "$test_cflags" "$test_link $LIBS" '
+ return gnutls_aead_cipher_set_key((void *)1, (void *)2);'
+ then
+ add_def HAVE_GNUTLS_AEAD_CIPHER_SET_KEY
+ fi
+ else
+ if test_code 'AES128 in nettle' 'nettle/aes.h' '' "$LIBS" \
+ 'aes128_set_encrypt_key((void *)1, (void *)2);'
+ then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS siv_nettle.o"
+ add_def HAVE_SIV
+ fi
+ fi
+ fi
+
+ if grep '#define HAVE_SIV' config.h > /dev/null; then
+ EXTRA_OBJECTS="$EXTRA_OBJECTS nts_ke_client.o nts_ke_server.o nts_ke_session.o"
+ EXTRA_OBJECTS="$EXTRA_OBJECTS nts_ntp_auth.o nts_ntp_client.o nts_ntp_server.o"
+ LIBS="$LIBS $test_link"
+ MYCPPFLAGS="$MYCPPFLAGS $test_cflags"
+ add_def FEAT_NTS
+ fi
+ fi
+fi
+
+if [ $use_pthread = "1" ]; then
+ MYCFLAGS="$MYCFLAGS -pthread"
+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
+
+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
+
+CHRONYRUNDIR=${LOCALSTATEDIR}/run/chrony
+if [ "x$SETCHRONYRUNDIR" != "x" ]; then
+ CHRONYRUNDIR=$SETCHRONYRUNDIR
+fi
+
+CHRONYVARDIR=${LOCALSTATEDIR}/lib/chrony
+if [ "x$SETCHRONYVARDIR" != "x" ]; then
+ CHRONYVARDIR=$SETCHRONYVARDIR
+fi
+
+add_def DEFAULT_CONF_FILE "\"$SYSCONFDIR/chrony.conf\""
+add_def DEFAULT_HWCLOCK_FILE "\"$default_hwclockfile\""
+add_def DEFAULT_PID_FILE "\"$default_pidfile\""
+add_def DEFAULT_RTC_DEVICE "\"$default_rtcdevice\""
+add_def DEFAULT_USER "\"$default_user\""
+add_def DEFAULT_COMMAND_SOCKET "\"$CHRONYRUNDIR/chronyd.sock\""
+add_def MAIL_PROGRAM "\"$mail_program\""
+
+common_features="`get_features SECHASH IPV6 DEBUG`"
+chronyc_features="`get_features READLINE`"
+chronyd_features="`get_features CMDMON NTP REFCLOCK RTC PRIVDROP SCFILTER SIGND ASYNCDNS NTS`"
+add_def CHRONYC_FEATURES "\"$chronyc_features $common_features\""
+add_def CHRONYD_FEATURES "\"$chronyd_features $common_features\""
+echo "Features : $chronyd_features $chronyc_features $common_features"
+
+if [ -f version.txt ]; then
+ CHRONY_VERSION="`cat version.txt`"
+else
+ CHRONY_VERSION="DEVELOPMENT"
+fi
+
+add_def CHRONY_VERSION "\"${CHRONY_VERSION}\""
+
+for f in Makefile doc/Makefile test/unit/Makefile
+do
+ echo Creating $f
+ sed -e "s%@EXTRA_OBJS@%${EXTRA_OBJECTS}%;\
+ s%@EXTRA_CLI_OBJS@%${EXTRA_CLI_OBJECTS}%;\
+ s%@CC@%${MYCC}%;\
+ s%@CFLAGS@%${MYCFLAGS}%;\
+ s%@CPPFLAGS@%${MYCPPFLAGS}%;\
+ s%@LDFLAGS@%${MYLDFLAGS}%;\
+ s%@LIBS@%${LIBS}%;\
+ s%@EXTRA_LIBS@%${EXTRA_LIBS}%;\
+ s%@EXTRA_CLI_LIBS@%${EXTRA_CLI_LIBS}%;\
+ s%@SYSCONFDIR@%${SYSCONFDIR}%;\
+ s%@BINDIR@%${BINDIR}%;\
+ s%@SBINDIR@%${SBINDIR}%;\
+ s%@DOCDIR@%${DOCDIR}%;\
+ s%@MANDIR@%${MANDIR}%;\
+ s%@LOCALSTATEDIR@%${LOCALSTATEDIR}%;\
+ s%@CHRONYRUNDIR@%${CHRONYRUNDIR}%;\
+ s%@CHRONYVARDIR@%${CHRONYVARDIR}%;\
+ s%@DEFAULT_HWCLOCK_FILE@%${default_hwclockfile}%;\
+ s%@DEFAULT_PID_FILE@%${default_pidfile}%;\
+ s%@DEFAULT_RTC_DEVICE@%${default_rtcdevice}%;\
+ s%@DEFAULT_USER@%${default_user}%;\
+ s%@CHRONY_VERSION@%${CHRONY_VERSION}%;" \
+ < ${f}.in > $f
+done
+
+# =======================================================================
+# vim:et:sw=2:ht=2:sts=2:fdm=marker:cms=#%s
+