#!/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-2022 # 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 < if you have headers in a nonstandard directory LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory 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_aes_gcm_siv=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-aes-gcm-siv) try_aes_gcm_siv=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 TESTCFLAGS="-fwrapv" if test_code '-fwrapv' '' "$TESTCFLAGS" '' ''; then GETDATE_CFLAGS="-fwrapv" else GETDATE_CFLAGS="" 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 '' 'inttypes.h time.h sys/timepps.h' '' '' ''; then timepps_h="sys/timepps.h" add_def HAVE_SYS_TIMEPPS_H else if test_code '' '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' '' '' '' 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 '' '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 '' '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_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 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 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 [ $try_nettle = "1" ] && test_code 'AES-SIV-CMAC 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 if [ $try_aes_gcm_siv = "1" ] && test_code 'AES-GCM-SIV in nettle' \ 'nettle/siv-gcm.h' "" "$LIBS" \ 'siv_gcm_aes128_encrypt_message((void *)1, 0, NULL, 0, (void *)2, 16, (void *)3, (void *)4);' then add_def HAVE_NETTLE_SIV_GCM fi else if test_code 'AES-SIV-CMAC 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 [ $try_aes_gcm_siv = "1" ] && test_code 'AES-GCM-SIV in gnutls' \ 'gnutls/crypto.h' "$test_cflags" "$test_link $LIBS" ' return gnutls_aead_cipher_init((void *)1, GNUTLS_CIPHER_AES_128_SIV_GCM, (void *)2);' then add_def HAVE_GNUTLS_SIV_GCM fi 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%@GETDATE_CFLAGS@%${GETDATE_CFLAGS}%;\ 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