]> git.proxmox.com Git - mirror_kronosnet.git/blob - configure.ac
build: accomodate to the actual date utility
[mirror_kronosnet.git] / configure.ac
1 #
2 # Copyright (C) 2010-2018 Red Hat, Inc. All rights reserved.
3 #
4 # Authors: Fabio M. Di Nitto <fabbione@kronosnet.org>
5 # Federico Simoncelli <fsimon@kronosnet.org>
6 #
7 # This software licensed under GPL-2.0+, LGPL-2.0+
8 #
9
10 # -*- Autoconf -*-
11 # Process this file with autoconf to produce a configure script.
12 #
13
14 AC_PREREQ([2.63])
15 AC_INIT([kronosnet],
16 m4_esyscmd([build-aux/git-version-gen .tarball-version]),
17 [devel@lists.kronosnet.org])
18 # Don't let AC_PROC_CC (invoked by AC_USE_SYSTEM_EXTENSIONS) replace
19 # undefined CFLAGS with -g -O2, overriding our special OPT_CFLAGS.
20 : ${CFLAGS=""}
21 AC_USE_SYSTEM_EXTENSIONS
22 AM_INIT_AUTOMAKE([1.13 dist-bzip2 dist-xz color-tests -Wno-portability subdir-objects])
23
24 LT_PREREQ([2.2.6])
25 # --enable-new-dtags: Use RUNPATH instead of RPATH.
26 # It is necessary to have this done before libtool does linker detection.
27 # See also: https://github.com/kronosnet/kronosnet/issues/107
28 # --as-needed: Modern systems have builtin ceil() making -lm superfluous but
29 # AC_SEARCH_LIBS can't detect this because it tests with a false prototype
30 AX_CHECK_LINK_FLAG([-Wl,--enable-new-dtags],
31 [AM_LDFLAGS=-Wl,--enable-new-dtags],
32 [AC_MSG_ERROR(["Linker support for --enable-new-dtags is required"])])
33 AX_CHECK_LINK_FLAG([-Wl,--as-needed], [AM_LDFLAGS="$AM_LDFLAGS -Wl,--as-needed"])
34
35 AC_SUBST([AM_LDFLAGS])
36 saved_LDFLAGS="$LDFLAGS"
37 LDFLAGS="$AM_LDFLAGS $LDFLAGS"
38 LT_INIT
39 LDFLAGS="$saved_LDFLAGS"
40
41 AC_CONFIG_MACRO_DIR([m4])
42 AC_CONFIG_SRCDIR([kronosnetd/main.c])
43 AC_CONFIG_HEADERS([config.h])
44
45 AC_CANONICAL_HOST
46
47 AC_LANG([C])
48
49 systemddir=${prefix}/lib/systemd/system
50
51 if test "$prefix" = "NONE"; then
52 prefix="/usr"
53 if test "$localstatedir" = "\${prefix}/var"; then
54 localstatedir="/var"
55 fi
56 if test "$sysconfdir" = "\${prefix}/etc"; then
57 sysconfdir="/etc"
58 fi
59 if test "$systemddir" = "NONE/lib/systemd/system"; then
60 systemddir=/lib/systemd/system
61 fi
62 if test "$libdir" = "\${exec_prefix}/lib"; then
63 if test -e /usr/lib64; then
64 libdir="/usr/lib64"
65 else
66 libdir="/usr/lib"
67 fi
68 fi
69 fi
70
71 AC_PROG_AWK
72 AC_PROG_GREP
73 AC_PROG_SED
74 AC_PROG_CPP
75 AC_PROG_CC
76 AC_PROG_CC_C99
77 if test "x$ac_cv_prog_cc_c99" = "xno"; then
78 AC_MSG_ERROR(["C99 support is required"])
79 fi
80 AC_PROG_LN_S
81 AC_PROG_INSTALL
82 AC_PROG_MAKE_SET
83 PKG_PROG_PKG_CONFIG
84
85 AC_CHECK_PROGS([VALGRIND_EXEC], [valgrind])
86 AM_CONDITIONAL([HAS_VALGRIND], [test x$VALGRIND_EXEC != "x"])
87
88 # KNET_OPTION_DEFINES(stem,type,detection code)
89 # stem: enters name of option, Automake conditional and preprocessor define
90 # type: compress or crypto, determines where the default comes from
91 AC_DEFUN([KNET_OPTION_DEFINES],[
92 AC_ARG_ENABLE([$2-$1],[AS_HELP_STRING([--disable-$2-$1],[disable libknet $1 support])],,
93 [enable_$2_$1="$enable_$2_all"])
94 AM_CONDITIONAL([BUILD_]m4_toupper([$2_$1]),[test "x$enable_$2_$1" = xyes])
95 if test "x$enable_$2_$1" = xyes; then
96 $3
97 fi
98 AC_DEFINE_UNQUOTED([WITH_]m4_toupper([$2_$1]), [`test "x$enable_$2_$1" != xyes; echo $?`], $1 $2 [built in])
99 ])
100
101 AC_ARG_ENABLE([man],
102 [AS_HELP_STRING([--disable-man],[disable man page creation])],,
103 [ enable_man="yes" ])
104 AM_CONDITIONAL([BUILD_MAN], [test x$enable_man = xyes])
105
106 AC_ARG_ENABLE([libknet-sctp],
107 [AS_HELP_STRING([--disable-libknet-sctp],[disable libknet SCTP support])],,
108 [ enable_libknet_sctp="yes" ])
109 AM_CONDITIONAL([BUILD_SCTP], [test x$enable_libknet_sctp = xyes])
110
111 AC_ARG_ENABLE([crypto-all],
112 [AS_HELP_STRING([--disable-crypto-all],[disable libknet all crypto modules support])],,
113 [ enable_crypto_all="yes" ])
114
115 KNET_OPTION_DEFINES([nss],[crypto],[PKG_CHECK_MODULES([nss], [nss])])
116 KNET_OPTION_DEFINES([openssl],[crypto],[
117 PKG_CHECK_MODULES([openssl],[libcrypto < 1.1],
118 [AC_DEFINE_UNQUOTED([BUILDCRYPTOOPENSSL10], [1], [openssl 1.0 crypto])],
119 [PKG_CHECK_MODULES([openssl],[libcrypto >= 1.1],
120 [AC_DEFINE_UNQUOTED([BUILDCRYPTOOPENSSL11], [1], [openssl 1.1 crypto])])])
121 ])
122
123 AC_ARG_ENABLE([compress-all],
124 [AS_HELP_STRING([--disable-compress-all],[disable libknet all compress modules support])],,
125 [ enable_compress_all="yes" ])
126
127 KNET_OPTION_DEFINES([zlib],[compress],[PKG_CHECK_MODULES([zlib], [zlib])])
128 KNET_OPTION_DEFINES([lz4],[compress],[PKG_CHECK_MODULES([liblz4], [liblz4])])
129 KNET_OPTION_DEFINES([lzo2],[compress],[
130 PKG_CHECK_MODULES([lzo2], [lzo2],
131 [# work around broken pkg-config file in v2.10
132 AC_SUBST([lzo2_CFLAGS],[`echo $lzo2_CFLAGS | sed 's,/lzo *, ,'`])],
133 [AC_CHECK_HEADERS([lzo/lzo1x.h],
134 [AC_CHECK_LIB([lzo2], [lzo1x_decompress_safe],
135 [AC_SUBST([lzo2_LIBS], [-llzo2])])],
136 [AC_MSG_ERROR(["missing required lzo/lzo1x.h header"])])])
137 ])
138 KNET_OPTION_DEFINES([lzma],[compress],[PKG_CHECK_MODULES([liblzma], [liblzma])])
139 KNET_OPTION_DEFINES([bzip2],[compress],[
140 PKG_CHECK_MODULES([bzip2], [bzip2],,
141 [AC_CHECK_HEADERS([bzlib.h],
142 [AC_CHECK_LIB([bz2], [BZ2_bzBuffToBuffCompress],
143 [AC_SUBST([bzip2_LIBS], [-lbz2])])],
144 [AC_MSG_ERROR(["missing required bzlib.h"])])])
145 ])
146
147 AC_ARG_ENABLE([poc],
148 [AS_HELP_STRING([--enable-poc],[enable building poc code])],,
149 [ enable_poc="no" ])
150 AM_CONDITIONAL([BUILD_POC], [test x$enable_poc = xyes])
151
152 AC_ARG_ENABLE([kronosnetd],
153 [AS_HELP_STRING([--enable-kronosnetd],[Kronosnetd support])],,
154 [ enable_kronosnetd="no" ])
155 AM_CONDITIONAL([BUILD_KRONOSNETD], [test x$enable_kronosnetd = xyes])
156
157 AC_ARG_ENABLE([runautogen],
158 [AS_HELP_STRING([--enable-runautogen],[run autogen.sh])],,
159 [ enable_runautogen="no" ])
160 AM_CONDITIONAL([BUILD_RUNAUTOGEN], [test x$enable_runautogen = xyes])
161
162 override_rpm_debuginfo_option="yes"
163 AC_ARG_ENABLE([rpm-debuginfo],
164 [AS_HELP_STRING([--enable-rpm-debuginfo],[build debuginfo packages])],,
165 [ enable_rpm_debuginfo="no", override_rpm_debuginfo_option="no" ])
166 AM_CONDITIONAL([BUILD_RPM_DEBUGINFO], [test x$enable_rpm_debuginfo = xyes])
167 AM_CONDITIONAL([OVERRIDE_RPM_DEBUGINFO], [test x$override_rpm_debuginfo_option = xyes])
168
169 AC_ARG_ENABLE([libtap],
170 [AS_HELP_STRING([--enable-libtap],[libtap support])],,
171 [ enable_libtap="no" ])
172
173 if test "x$enable_kronosnetd" = xyes; then
174 enable_libtap=yes
175 fi
176 AM_CONDITIONAL([BUILD_LIBTAP], [test x$enable_libtap = xyes])
177
178 ## local helper functions
179 # this function checks if CC support options passed as
180 # args. Global CPPFLAGS are ignored during this test.
181 cc_supports_flag() {
182 saveCPPFLAGS="$CPPFLAGS"
183 CPPFLAGS="$@"
184 if echo $CC | grep -q clang; then
185 CPPFLAGS="-Werror $CPPFLAGS"
186 fi
187 AC_MSG_CHECKING([whether $CC supports "$@"])
188 AC_PREPROC_IFELSE([AC_LANG_PROGRAM([])],
189 [RC=0; AC_MSG_RESULT([yes])],
190 [RC=1; AC_MSG_RESULT([no])])
191 CPPFLAGS="$saveCPPFLAGS"
192 return $RC
193 }
194
195 # Checks for libraries.
196 AX_PTHREAD(,[AC_MSG_ERROR([POSIX threads support is required])])
197 saved_LIBS="$LIBS"
198 LIBS=
199 AC_SEARCH_LIBS([ceil], [m], , [AC_MSG_ERROR([ceil not found])])
200 AC_SUBST([m_LIBS], [$LIBS])
201 LIBS=
202 AC_SEARCH_LIBS([clock_gettime], [rt], , [AC_MSG_ERROR([clock_gettime not found])])
203 AC_SUBST([rt_LIBS], [$LIBS])
204 LIBS=
205 AC_SEARCH_LIBS([dlopen], [dl dld], , [AC_MSG_ERROR([dlopen not found])])
206 AC_SUBST([dl_LIBS], [$LIBS])
207 LIBS="$saved_LIBS"
208
209 # OS detection
210
211 AC_MSG_CHECKING([for os in ${host_os}])
212 case "$host_os" in
213 *linux*)
214 AC_DEFINE_UNQUOTED([KNET_LINUX], [1], [Compiling for Linux platform])
215 AC_MSG_RESULT([Linux])
216 ;;
217 *bsd*)
218 AC_DEFINE_UNQUOTED([KNET_BSD], [1], [Compiling for BSD platform])
219 AC_MSG_RESULT([BSD])
220 if test "x$enable_libtap" = xyes; then
221 AC_MSG_ERROR([libtap is not currently supported on BSD platforms])
222 fi
223 ;;
224 *)
225 AC_MSG_ERROR([Unsupported OS? hmmmm])
226 ;;
227 esac
228
229 # Checks for header files.
230 AC_CHECK_HEADERS([sys/epoll.h])
231 AC_CHECK_FUNCS([kevent])
232 # if neither sys/epoll.h nor kevent are present, we should fail.
233
234 if test "x$ac_cv_header_sys_epoll_h" = xno && test "x$ac_cv_func_kevent" = xno; then
235 AC_MSG_ERROR([Both epoll and kevent unavailable on this OS])
236 fi
237
238 if test "x$ac_cv_header_sys_epoll_h" = xyes && test "x$ac_cv_func_kevent" = xyes; then
239 AC_MSG_ERROR([Both epoll and kevent available on this OS, please contact the maintainers to fix the code])
240 fi
241
242 if test "x$enable_libknet_sctp" = xyes; then
243 AC_CHECK_HEADERS([netinet/sctp.h],, [AC_MSG_ERROR(["missing required SCTP headers"])])
244 fi
245
246 # Checks for typedefs, structures, and compiler characteristics.
247 AC_C_INLINE
248 AC_TYPE_PID_T
249 AC_TYPE_SIZE_T
250 AC_TYPE_SSIZE_T
251 AC_TYPE_UINT8_T
252 AC_TYPE_UINT16_T
253 AC_TYPE_UINT32_T
254 AC_TYPE_UINT64_T
255 AC_TYPE_INT8_T
256 AC_TYPE_INT16_T
257 AC_TYPE_INT32_T
258 AC_TYPE_INT64_T
259
260 if test "x$enable_man" = "xyes"; then
261 AC_ARG_VAR([DOXYGEN], [override doxygen executable])
262 AC_CHECK_PROGS([DOXYGEN], [doxygen], [no])
263 if test "x$DOXYGEN" = xno; then
264 AC_MSG_ERROR(["Doxygen command not found"])
265 fi
266 # required by doxyxml to build man pages dynamically
267 # Don't let AC_PROC_CC (invoked by AX_PROG_CC_FOR_BUILD) replace
268 # undefined CFLAGS_FOR_BUILD with -g -O2, overriding our special OPT_CFLAGS.
269 : ${CFLAGS_FOR_BUILD=""}
270 AX_PROG_CC_FOR_BUILD
271 saved_PKG_CONFIG="$PKG_CONFIG"
272 saved_ac_cv_path_PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
273 unset PKG_CONFIG ac_cv_path_PKG_CONFIG
274 AC_PATH_PROG([PKG_CONFIG], [pkg-config])
275 PKG_CHECK_MODULES([libqb_BUILD], [libqb])
276 PKG_CHECK_MODULES([libxml_BUILD], [libxml-2.0])
277 PKG_CONFIG="$saved_PKG_CONFIG"
278 ac_cv_path_PKG_CONFIG="$saved_ac_cv_path_PKG_CONFIG"
279 fi
280
281 # checks (for kronosnetd)
282 if test "x$enable_kronosnetd" = xyes; then
283 AC_CHECK_HEADERS([security/pam_appl.h],
284 [AC_CHECK_LIB([pam], [pam_start],
285 [AC_SUBST([pam_LIBS], [-lpam])],
286 [AC_MSG_ERROR([Unable to find LinuxPAM devel files])])])
287
288 AC_CHECK_HEADERS([security/pam_misc.h],
289 [AC_CHECK_LIB([pam_misc], [misc_conv],
290 [AC_SUBST([pam_misc_LIBS], [-lpam_misc])],
291 [AC_MSG_ERROR([Unable to find LinuxPAM MISC devel files])])])
292
293 PKG_CHECK_MODULES([libqb], [libqb])
294
295 AC_CHECK_LIB([qb], [qb_log_thread_priority_set],
296 [have_qb_log_thread_priority_set="yes"],
297 [have_qb_log_thread_priority_set="no"])
298 if test "x${have_qb_log_thread_priority_set}" = xyes; then
299 AC_DEFINE_UNQUOTED([HAVE_QB_LOG_THREAD_PRIORITY_SET], [1], [have qb_log_thread_priority_set])
300 fi
301 fi
302
303 # local options
304 AC_ARG_ENABLE([debug],
305 [AS_HELP_STRING([--enable-debug],[enable debug build])])
306
307 AC_ARG_WITH([initdefaultdir],
308 [AS_HELP_STRING([--with-initdefaultdir=DIR],[path to /etc/sysconfig or /etc/default dir])],
309 [ INITDEFAULTDIR="$withval" ],
310 [ INITDEFAULTDIR="$sysconfdir/default" ])
311
312 AC_ARG_WITH([initddir],
313 [AS_HELP_STRING([--with-initddir=DIR],[path to init script directory])],
314 [ INITDDIR="$withval" ],
315 [ INITDDIR="$sysconfdir/init.d" ])
316
317 AC_ARG_WITH([systemddir],
318 [AS_HELP_STRING([--with-systemddir=DIR],[path to systemd unit files directory])],
319 [ SYSTEMDDIR="$withval" ],
320 [ SYSTEMDDIR="$systemddir" ])
321
322 AC_ARG_WITH([syslogfacility],
323 [AS_HELP_STRING([--with-syslogfacility=FACILITY],[default syslog facility])],
324 [ SYSLOGFACILITY="$withval" ],
325 [ SYSLOGFACILITY="LOG_DAEMON" ])
326
327 AC_ARG_WITH([sysloglevel],
328 [AS_HELP_STRING([--with-sysloglevel=LEVEL],[default syslog level])],
329 [ SYSLOGLEVEL="$withval" ],
330 [ SYSLOGLEVEL="LOG_INFO" ])
331
332 AC_ARG_WITH([defaultadmgroup],
333 [AS_HELP_STRING([--with-defaultadmgroup=GROUP],
334 [define PAM group. Users part of this group will be allowed to configure
335 kronosnet. Others will only receive read-only rights.])],
336 [ DEFAULTADMGROUP="$withval" ],
337 [ DEFAULTADMGROUP="kronosnetadm" ])
338
339 ## random vars
340 LOGDIR=${localstatedir}/log/
341 RUNDIR=${localstatedir}/run/
342 DEFAULT_CONFIG_DIR=${sysconfdir}/kronosnet
343
344 ## do subst
345
346 AC_SUBST([DEFAULT_CONFIG_DIR])
347 AC_SUBST([INITDEFAULTDIR])
348 AC_SUBST([INITDDIR])
349 AC_SUBST([SYSTEMDDIR])
350 AC_SUBST([LOGDIR])
351 AC_SUBST([DEFAULTADMGROUP])
352
353 AC_DEFINE_UNQUOTED([DEFAULT_CONFIG_DIR],
354 ["$(eval echo ${DEFAULT_CONFIG_DIR})"],
355 [Default config directory])
356
357 AC_DEFINE_UNQUOTED([DEFAULT_CONFIG_FILE],
358 ["$(eval echo ${DEFAULT_CONFIG_DIR}/kronosnetd.conf)"],
359 [Default config file])
360
361 AC_DEFINE_UNQUOTED([LOGDIR],
362 ["$(eval echo ${LOGDIR})"],
363 [Default logging directory])
364
365 AC_DEFINE_UNQUOTED([DEFAULT_LOG_FILE],
366 ["$(eval echo ${LOGDIR}/kronosnetd.log)"],
367 [Default log file])
368
369 AC_DEFINE_UNQUOTED([RUNDIR],
370 ["$(eval echo ${RUNDIR})"],
371 [Default run directory])
372
373 AC_DEFINE_UNQUOTED([SYSLOGFACILITY],
374 [$(eval echo ${SYSLOGFACILITY})],
375 [Default syslog facility])
376
377 AC_DEFINE_UNQUOTED([SYSLOGLEVEL],
378 [$(eval echo ${SYSLOGLEVEL})],
379 [Default syslog level])
380
381 AC_DEFINE_UNQUOTED([DEFAULTADMGROUP],
382 ["$(eval echo ${DEFAULTADMGROUP})"],
383 [Default admin group])
384
385 # debug build stuff
386 if test "x${enable_debug}" = xyes; then
387 AC_DEFINE_UNQUOTED([DEBUG], [1], [Compiling Debugging code])
388 OPT_CFLAGS="-O0"
389 else
390 OPT_CFLAGS="-O3"
391 fi
392
393 # gdb flags
394 if test "x${GCC}" = xyes; then
395 GDB_FLAGS="-ggdb3"
396 else
397 GDB_FLAGS="-g"
398 fi
399
400 # extra warnings
401 EXTRA_WARNINGS=""
402
403 WARNLIST="
404 all
405 extra
406 unused
407 shadow
408 missing-prototypes
409 missing-declarations
410 suggest-attribute=noreturn
411 suggest-attribute=format
412 strict-prototypes
413 declaration-after-statement
414 pointer-arith
415 write-strings
416 cast-align
417 bad-function-cast
418 missing-format-attribute
419 float-equal
420 format=2
421 format-signedness
422 format-security
423 format-nonliteral
424 no-long-long
425 unsigned-char
426 gnu89-inline
427 no-strict-aliasing
428 error
429 address
430 cpp
431 overflow
432 parentheses
433 sequence-point
434 switch
435 shift-overflow=2
436 overlength-strings
437 retundent-decls
438 init-self
439 uninitialized
440 unused-but-set-variable
441 unused-function
442 unused-result
443 unused-value
444 unused-variable
445 unknown-pragmas
446 no-unused-parameter
447 "
448
449 for j in $WARNLIST; do
450 if cc_supports_flag -W$j; then
451 EXTRA_WARNINGS="$EXTRA_WARNINGS -W$j";
452 fi
453 done
454
455 AC_SUBST([AM_CFLAGS],["$OPT_CFLAGS $GDB_FLAGS $EXTRA_WARNINGS"])
456
457 AX_PROG_DATE
458 AS_IF([test "$ax_cv_prog_date_gnu_date:$ax_cv_prog_date_gnu_utc" = yes:yes],
459 [UTC_DATE_AT="date -u -d@"],
460 [AS_IF([test "x$ax_cv_prog_date_bsd_date" = xyes],
461 [UTC_DATE_AT="date -u -r"],
462 [AC_MSG_ERROR([date utility unable to convert epoch to UTC])])])
463 AC_SUBST([UTC_DATE_AT])
464
465 AC_ARG_VAR([SOURCE_EPOCH],[last modification date of the source])
466 AC_MSG_NOTICE([trying to determine source epoch])
467 AC_MSG_CHECKING([for source epoch in \$SOURCE_EPOCH])
468 AS_IF([test -n "$SOURCE_EPOCH"],
469 [AC_MSG_RESULT([yes])],
470 [AC_MSG_RESULT([no])
471 AC_MSG_CHECKING([for source epoch in source_epoch file])
472 AS_IF([test -e source_epoch],
473 [read SOURCE_EPOCH <source_epoch
474 AC_MSG_RESULT([yes])],
475 [AC_MSG_RESULT([no])
476 AC_MSG_CHECKING([for source epoch baked in by gitattributes export-subst])
477 SOURCE_EPOCH='$Format:%at$' # template for rewriting by git-archive
478 AS_CASE([$SOURCE_EPOCH],
479 [?Format:*], # was not rewritten
480 [AC_MSG_RESULT([no])
481 AC_MSG_CHECKING([whether git log can provide a source epoch])
482 SOURCE_EPOCH=f${SOURCE_EPOCH#\$F} # convert into git log --pretty format
483 SOURCE_EPOCH=$(git -C "$srcdir" log -1 --pretty=${SOURCE_EPOCH%$} 2>/dev/null)
484 AS_IF([test -n "$SOURCE_EPOCH"],
485 [AC_MSG_RESULT([yes])],
486 [AC_MSG_RESULT([no, using current time and breaking reproducibility])
487 SOURCE_EPOCH=$(date +%s)])],
488 [AC_MSG_RESULT([yes])]
489 )])
490 ])
491 AC_MSG_NOTICE([using source epoch $($UTC_DATE_AT$SOURCE_EPOCH +'%F %T %Z')])
492
493 AC_CONFIG_FILES([
494 Makefile
495 init/Makefile
496 libtap/Makefile
497 libtap/libtap.pc
498 kronosnetd/Makefile
499 kronosnetd/kronosnetd.logrotate
500 libknet/Makefile
501 libknet/libknet.pc
502 libknet/tests/Makefile
503 man/Makefile
504 man/Doxyfile-knet
505 poc-code/Makefile
506 poc-code/iov-hash/Makefile
507 poc-code/access-list/Makefile
508 ])
509
510 AC_OUTPUT