configure.ac 20.8 KB
Newer Older
1
AC_PREREQ([2.60])
2

3 4 5 6
m4_define([knot_VERSION_MAJOR], 2)dnl
m4_define([knot_VERSION_MINOR], 7)dnl
m4_define([knot_VERSION_PATCH], )dnl Leave empty if the master branch!
m4_include([m4/knot-version.m4])
7 8

AC_INIT([knot], knot_PKG_VERSION, [knot-dns@labs.nic.cz])
Daniel Salzman's avatar
Daniel Salzman committed
9 10 11 12 13

# Store ./configure parameters and CFLAGS
AC_DEFINE_UNQUOTED([CONFIGURE_PARAMS],["$*"],[Params passed to configure])
AC_DEFINE_UNQUOTED([CONFIGURE_CFLAGS],["$CFLAGS"],[Passed CFLAGS from environment])

14
AM_INIT_AUTOMAKE([foreign std-options subdir-objects no-dist-gzip dist-xz -Wall -Werror])
15
AM_SILENT_RULES([yes])
16
AC_CONFIG_SRCDIR([src/knot])
Ondřej Surý's avatar
Ondřej Surý committed
17 18
AC_CONFIG_HEADERS([src/config.h])
AC_CONFIG_MACRO_DIR([m4])
19
AC_USE_SYSTEM_EXTENSIONS
20
AC_CANONICAL_HOST
21

Daniel Salzman's avatar
Daniel Salzman committed
22 23 24 25 26 27
# Update library versions
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST([libknot_VERSION_INFO],["-version-info 7:0:0"])
AC_SUBST([libdnssec_VERSION_INFO],["-version-info 5:0:0"])
AC_SUBST([libzscanner_VERSION_INFO],["-version-info 1:0:0"])

28 29 30 31
AC_SUBST([KNOT_VERSION_MAJOR], knot_VERSION_MAJOR)
AC_SUBST([KNOT_VERSION_MINOR], knot_VERSION_MINOR)
AC_SUBST([KNOT_VERSION_PATCH], knot_VERSION_PATCH)

32
AC_CONFIG_FILES([src/libknot/version.h
33 34
                 src/libdnssec/version.h
                 src/libzscanner/version.h])
35

Daniel Salzman's avatar
Daniel Salzman committed
36
# Automatically update release date based on NEWS
37 38
AC_PROG_SED
release_date=$($SED -n 's/^Knot DNS .* (\(.*\))/\1/p;q;' ${srcdir}/NEWS)
39 40
AC_SUBST([RELEASE_DATE], $release_date)

41 42 43 44
# Set compiler compatibility flags
AC_PROG_CC_C99
AM_PROG_CC_C_O
AC_PROG_CPP_WERROR
Ondřej Surý's avatar
Ondřej Surý committed
45

Daniel Salzman's avatar
Daniel Salzman committed
46
# Set default CFLAGS
47
CFLAGS="$CFLAGS -Wall -Werror=format-security -Werror=implicit -Wstrict-prototypes"
48

Daniel Salzman's avatar
Daniel Salzman committed
49 50 51 52 53 54 55 56
AX_CHECK_COMPILE_FLAG("-fpredictive-commoning", [CFLAGS="$CFLAGS -fpredictive-commoning"], [], "-Werror")
AX_CHECK_LINK_FLAG(["-Wl,--exclude-libs,ALL"], [ldflag_exclude_libs="-Wl,--exclude-libs,ALL"], [ldflag_exclude_libs=""], "")
AC_SUBST([LDFLAG_EXCLUDE_LIBS], $ldflag_exclude_libs)

# Check if an archiver is available
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])

AC_PROG_INSTALL
57

Ondřej Surý's avatar
Ondřej Surý committed
58 59 60
# Initialize libtool
LT_INIT

61
# Use pkg-config
62
PKG_PROG_PKG_CONFIG
63
m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], [AC_SUBST([pkgconfigdir], ['${libdir}/pkgconfig'])])
64
AC_CONFIG_FILES([src/knotd.pc
65 66 67
                 src/libknot.pc
                 src/libdnssec.pc
                 src/libzscanner.pc
68
                 ])
69

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
# Default directories
knot_prefix="/usr/local"
AC_PREFIX_DEFAULT([$knot_prefix])
AS_IF([test "$prefix" != NONE], [knot_prefix=$prefix])

run_dir="${localstatedir}/run/knot"
AC_ARG_WITH([rundir],
        AC_HELP_STRING([--with-rundir=path], [Path to run-time variable data (pid, sockets...). [default=LOCALSTATEDIR/run/knot]]),
        [run_dir=$withval])
AC_SUBST(run_dir)

storage_dir="${localstatedir}/lib/knot"
AC_ARG_WITH([storage],
        AC_HELP_STRING([--with-storage=path], [Default storage directory (slave zones, persistent data). [default=LOCALSTATEDIR/lib/knot]]),
        [storage_dir=$withval])
AC_SUBST(storage_dir)

config_dir="${sysconfdir}/knot"
AC_ARG_WITH([configdir],
        AC_HELP_STRING([--with-configdir=path], [Default directory for configuration. [default=SYSCONFDIR/knot]]),
        [config_dir=$withval])
AC_SUBST(config_dir)

module_dir=
module_instdir="${libdir}/knot/modules-${KNOT_VERSION_MAJOR}.${KNOT_VERSION_MINOR}"
AC_ARG_WITH([moduledir],
        AC_HELP_STRING([--with-moduledir=path], [Path to auto-loaded dynamic modules. [default not set]]),
        [module_dir=$withval module_instdir=$module_dir])
AC_SUBST(module_instdir)
AC_SUBST(module_dir)

101 102 103 104
# Build Knot DNS daemon
AC_ARG_ENABLE([daemon],
    AS_HELP_STRING([--disable-daemon], [Don't build Knot DNS main daemon]), [], [enable_daemon=yes])
AM_CONDITIONAL([HAVE_DAEMON], [test "$enable_daemon" = "yes"])
105

106 107 108 109
# Build Knot DNS modules
AC_ARG_ENABLE([modules],
    AS_HELP_STRING([--disable-modules], [Don't build Knot DNS modules]), [], [enable_modules=yes])

110 111 112 113
# Build Knot DNS utilities
AC_ARG_ENABLE([utilities],
    AS_HELP_STRING([--disable-utilities], [Don't build Knot DNS utilities]), [], [enable_utilities=yes])
AM_CONDITIONAL([HAVE_UTILS], [test "$enable_utilities" = "yes"])
114

115 116 117 118
# Build Knot DNS documentation
AC_ARG_ENABLE([documentation],
    AS_HELP_STRING([--disable-documentation], [Don't build Knot DNS documentation]), [], [enable_documentation=yes])
AM_CONDITIONAL([HAVE_DOCS], [test "$enable_documentation" = "yes"])
119

120 121
AM_CONDITIONAL([HAVE_LIBUTILS], test "$enable_utilities" != "no" -o \
                                     "$enable_daemon" != "no")
122 123 124
######################
# Generic dependencies
######################
125

126
AC_ARG_ENABLE([fastparser],
127 128 129 130
    AS_HELP_STRING([--disable-fastparser], [Disable use of fastest zone parser]),[],[
    # Set zone parser type - fastest on release build, slowest on dev build
    AS_IF([test -d ".git" -o "$PATCH_VERSION" = "dev"],[
        enable_fastparser=no
131 132 133
        ],[
        enable_fastparser=yes
        ])
134
    ])
135

136
AX_CC_CLANG
137
AS_IF([test "$enable_fastparser" = "yes"],[
138
    AS_IF([test -n "$CC_CLANG_VERSION"],[
139 140 141 142
      enable_fastparser=no
      AC_MSG_WARN([Fast zone parser disabled due to possible compiler bug.])
      AC_MSG_WARN([See https://llvm.org/bugs/show_bug.cgi?id=23490 for details.])
      AC_MSG_WARN([Use --enable-fastparser=force if your know your clang is fixed.])
143
    ])
144 145 146
])

AS_IF([test "$enable_fastparser" = "force"],[enable_fastparser=yes])
147

148
AM_CONDITIONAL([FAST_PARSER], [test "$enable_fastparser" = "yes"])
149 150

# GnuTLS crypto backend
151
PKG_CHECK_MODULES([gnutls], [gnutls >= 3.3], [
152
    save_CFLAGS=$CFLAGS
153
    save_LIBS=$LIBS
154
    CFLAGS="$CFLAGS $gnutls_CFLAGS"
155
    LIBS="$LIBS $gnutls_LIBS"
156

157
    AC_CHECK_FUNC([gnutls_pkcs11_copy_pubkey], [enable_pkcs11=yes], [enable_pkcs11=no])
158
    AS_IF([test "$enable_pkcs11" = yes],
Jan Včelák's avatar
Jan Včelák committed
159
        [AC_DEFINE([ENABLE_PKCS11], [1], [PKCS #11 support available])])
160

161 162
    AC_CHECK_DECL([GNUTLS_PK_EDDSA_ED25519],
        [AC_DEFINE([HAVE_ED25519], [1], [GnuTLS ED25519 support available])
Daniel Salzman's avatar
Daniel Salzman committed
163
         enable_ed25519=yes],
164
        [enable_ed25519=no],
Daniel Salzman's avatar
Daniel Salzman committed
165
        [#include <gnutls/gnutls.h>])
166 167 168

    AC_CHECK_FUNC([gnutls_privkey_sign_data2],
        [AC_DEFINE([HAVE_SIGN_DATA2], [1], [gnutls_privkey_sign_data2 available])])
169

170
    CFLAGS=$save_CFLAGS
171
    LIBS=$save_LIBS
172
])
173

174
AC_ARG_ENABLE([recvmmsg],
175 176 177 178 179 180 181 182 183 184 185 186 187 188
   AS_HELP_STRING([--enable-recvmmsg=auto|yes|no], [enable recvmmsg() network API [default=auto]]),
   [], [enable_recvmmsg=auto])

AS_CASE([$enable_recvmmsg],
   [auto|yes],[
      AC_CHECK_FUNC([recvmmsg],
                    [AC_CHECK_FUNC([sendmmsg],[enable_recvmmsg=yes],[enable_recvmmsg=no])],
                    [enable_recvmmsg=no])],
   [no],[],
   [*], [AC_MSG_ERROR([Invalid value of --enable-recvmmsg.]
 )])

AS_IF([test "$enable_recvmmsg" = yes],[
   AC_DEFINE([ENABLE_RECVMMSG], [1], [Use recvmmsg().])])
189

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
AC_ARG_ENABLE([reuseport],
    AS_HELP_STRING([--enable-reuseport=auto|yes|no], [enable Linux SO_REUSEPORT support [default=auto]]),
    [enable_reuseport="$enableval"], [enable_reuseport=auto])

AC_DEFUN([CHECK_REUSEPORT], [
  AC_CHECK_DECL(
    [SO_REUSEPORT],
    [$1],
    [$2],
    [
    #include <sys/socket.h>
    ]
  )])

AS_IF([test "$enable_reuseport" != no], [
  AS_CASE([$enable_reuseport],
    [auto],[
      AS_CASE([$host_os],
        [linux*], [CHECK_REUSEPORT([enable_reuseport=yes], [enable_reuseport=no])],
        [*], [enable_reuseport=no]
      )],
    [yes],[
      AS_CASE([$host_os],
        [linux*], [CHECK_REUSEPORT([enable_reuseport=yes], [AC_MSG_ERROR([SO_REUSEPORT support not detected.])])],
        [*], [AC_MSG_ERROR(["SO_REUSEPORT not supported on $host_os."])]
      )],
    [*], [AC_MSG_ERROR([Invalid value of --enable-reuseport.])]
  )])

AS_IF([test "$enable_reuseport" = yes],[
   AC_DEFINE([ENABLE_REUSEPORT], [1], [Use SO_REUSEPORT.])])

222 223 224 225 226 227 228 229 230 231 232
#########################################
# Dependencies needed for Knot DNS daemon
#########################################

# Systemd integration
AC_ARG_ENABLE([systemd],
    AS_HELP_STRING([--enable-systemd=auto|yes|no], [enable systemd integration [default=auto]]),
    [enable_systemd="$enableval"], [enable_systemd=auto])

AS_IF([test "$enable_daemon" = "yes"],[

233
AS_IF([test "$enable_systemd" != "no"],[
234
  AS_CASE([$enable_systemd],
235 236 237
    [auto],[PKG_CHECK_MODULES([systemd], [libsystemd], [enable_systemd=yes], [
            PKG_CHECK_MODULES([systemd], [libsystemd-daemon libsystemd-journal], [enable_systemd=yes], [enable_systemd=no])])],
    [yes],[PKG_CHECK_MODULES([systemd], [libsystemd], [], [
238
            PKG_CHECK_MODULES([systemd], [libsystemd-daemon libsystemd-journal])])],
239 240 241 242 243
    [*],[AC_MSG_ERROR([Invalid value of --enable-systemd.])])
    ])

AS_IF([test "$enable_systemd" = "yes"],[
  AC_DEFINE([ENABLE_SYSTEMD], [1], [Use systemd integration.])])
244

245 246
]) dnl enable_daemon

247 248 249 250 251

dnl Check for userspace-rcu library
AC_ARG_WITH(urcu,
[  --with-urcu=DIR        where to find userspace-rcu library])

252 253
AS_IF([test "$enable_daemon" = "yes"],[

254 255
AS_IF([test "$with_urcu" != "no"], [
  PKG_CHECK_MODULES([liburcu], liburcu, [
256
    liburcu_PKGCONFIG="liburcu >= 0.4.0"
257
    AC_SUBST([liburcu_PKGCONFIG])
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
    with_urcu=yes
  ],[
    for try_urcu in "$with_urcu" "" "/usr/local"; do
      save_LIBS="$LIBS"
      save_CPPFLAGS="$CPPFLAGS"

      AS_IF([test -d "$try_urcu"], [
        liburcu_CFLAGS="-I$try_urcu/include"
        liburcu_LIBS="-L$try_urcu/lib"
      ],[
        liburcu_CFLAGS=""
        liburcu_LIBS=""
      ])

      CPPFLAGS="$CPPFLAGS $liburcu_CFLAGS"
      LIBS="$LIBS $liburcu_LIBS"

      AC_SEARCH_LIBS([rcu_set_pointer_sym], [urcu], [
        with_urcu=yes
277 278 279 280
        liburcu_LIBS="$liburcu_LIBS -lurcu"
        AC_SUBST([liburcu_CFLAGS])
        AC_SUBST([liburcu_LIBS])
        break
281
      ],[
282 283
        CPPFLAGS="$save_CPPFLAGS"
        LIBS="$save_LIBS"
284
        with_urcu=no
285 286
        # do not cache result of AC_SEARCH_LIBS test
        unset ac_cv_search_rcu_set_pointer_sym
287 288
      ])
    done
289 290
    CPPFLAGS="$save_CPPFLAGS"
    LIBS="$save_LIBS"
291 292 293

    AS_IF([test "$with_urcu" = "no"],[
      AC_MSG_ERROR([liburcu is required])
294
      ])
295 296 297
  ])
])

298
])
299

300 301
static_modules=""
shared_modules=""
302 303 304 305
static_modules_declars=""
static_modules_init=""
doc_modules=""

306
KNOT_MODULE([cookies],     "yes")
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
KNOT_MODULE([dnsproxy],    "yes", "non-shareable")
KNOT_MODULE([dnstap],      "no")
KNOT_MODULE([noudp],       "yes")
KNOT_MODULE([onlinesign],  "yes", "non-shareable")
KNOT_MODULE([rrl],         "yes")
KNOT_MODULE([stats],       "yes")
KNOT_MODULE([synthrecord], "yes")
KNOT_MODULE([whoami],      "yes")

AC_SUBST([STATIC_MODULES_DECLARS], [$(printf "$static_modules_declars")])
AM_SUBST_NOTMAKE([STATIC_MODULES_DECLARS])
AC_SUBST([STATIC_MODULES_INIT], [$(printf "$static_modules_init")])
AM_SUBST_NOTMAKE([STATIC_MODULES_INIT])
AC_SUBST([DOC_MODULES], [$(printf "$doc_modules")])
AM_SUBST_NOTMAKE([DOC_MODULES])
322

323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
# Check for Dnstap
AC_ARG_ENABLE([dnstap],
  AS_HELP_STRING([--enable-dnstap], [Enable dnstap support for kdig (requires fstrm, protobuf-c)]),
  [], [enable_dnstap=no])

AS_IF([test "$enable_dnstap" != "no" -o "$STATIC_MODULE_dnstap" != "no" -o "$SHARED_MODULE_dnstap" != "no"],[
  AC_PATH_PROG([PROTOC_C], [protoc-c])
  AS_IF([test -z "$PROTOC_C"],[
    AC_MSG_ERROR([The protoc-c program was not found. Please install protobuf-c!])
  ])
  PKG_CHECK_MODULES([libfstrm], [libfstrm])
  PKG_CHECK_MODULES([libprotobuf_c], [libprotobuf-c >= 1.0.0])
  AC_SUBST([DNSTAP_CFLAGS], ["$libfstrm_CFLAGS $libprotobuf_c_CFLAGS"])
  AC_SUBST([DNSTAP_LIBS], ["$libfstrm_LIBS $libprotobuf_c_LIBS"])
])

AS_IF([test "$enable_dnstap" != "no"],[
  AC_DEFINE([USE_DNSTAP], [1], [Define to 1 to enable dnstap support for kdig])
341
])
342
AM_CONDITIONAL([HAVE_DNSTAP], test "$enable_dnstap" != "no")
343

344 345 346
AM_CONDITIONAL([HAVE_LIBDNSTAP], test "$enable_dnstap" != "no" -o \
                                      "$STATIC_MODULE_dnstap" != "no" -o \
                                      "$SHARED_MODULE_dnstap" != "no")
347

Jan Včelák's avatar
Jan Včelák committed
348
dnl Check for LMDB
349 350 351 352 353
lmdb_MIN_VERSION_MAJOR=0
lmdb_MIN_VERSION_MINOR=9
lmdb_MIN_VERSION_PATCH=15
lmdb_MIN_VERSION_STRING="$lmdb_MIN_VERSION_MAJOR.$lmdb_MIN_VERSION_MINOR.$lmdb_MIN_VERSION_PATCH"
lmdb_MIN_VERSION_FULL="$((($lmdb_MIN_VERSION_MAJOR << 24) | ($lmdb_MIN_VERSION_MINOR << 16) | $lmdb_MIN_VERSION_PATCH))"
354
AC_ARG_WITH([lmdb],
355
    AC_HELP_STRING([--with-lmdb=[DIR]], [Link with external LMDB (>= $lmdb_MIN_VERSION_STRING)]),[
356 357
    with_lmdb=$withval
    ],[
358
    with_lmdb=auto
359 360 361
    ])

have_lmdb=no
362

363 364 365
AS_IF([test "$with_lmdb" != "no"],[
    save_CPPFLAGS=$CPPFLAGS
    save_LIBS=$LIBS
366 367

    # Look for lmdb in given path and common locations
368 369
    for try_lmdb in "$with_lmdb" "" "/usr/local"; do

370 371 372
      AS_IF([test -d "$try_lmdb"], [
        lmdb_CFLAGS="-I$try_lmdb/include"
        lmdb_LIBS="-L$try_lmdb/lib"
373 374 375
        ],[
        lmdb_CFLAGS=""
        lmdb_LIBS=""
376
        ])
377

378 379
      CPPFLAGS="$save_CPPFLAGS $lmdb_CFLAGS"
      LIBS="$save_LIBS $lmdb_LIBS"
380 381 382

      AC_SEARCH_LIBS([mdb_env_open], [lmdb], [
          AC_CHECK_HEADERS([lmdb.h], [], [
383 384
              AC_MSG_ERROR([lmdb headers not found in `$try_lmdb', is your installation complete?])])
          AC_COMPUTE_INT(lmdb_VERSION_FULL, MDB_VERSION_FULL, [#include <lmdb.h>],
385 386
              AC_MSG_ERROR([Unable to determine lmdb version from MDB_VERSION_FULL]))
          AS_IF([test "$lmdb_VERSION_FULL" -ge "$lmdb_MIN_VERSION_FULL"],[
387 388
              lmdb_LIBS="$lmdb_LIBS -llmdb"
              have_lmdb=yes],[
389 390 391 392 393
              unset lmdb_CFLAGS
              unset lmdb_LIBS
              AC_MSG_WARN([lmdb version 0.9.15 and higher not found, using embedded version])
              ])
          break
394
          ])
395

396 397 398 399
      unset lmdb_CFLAGS
      unset lmdb_LIBS
      # do not cache result of AC_SEARCH_LIBS test
      unset ac_cv_search_mdb_env_open
400
    done
401

402 403
    CPPFLAGS="$save_CPPFLAGS"
    LIBS="$save_LIBS"
404 405

    # fail the configure if we haven't found lmdb library in the system
406
    AS_IF([test "$with_lmdb" != "auto" -a "$have_lmdb" = "no"],[
407
        AC_MSG_ERROR([shared lmdb library not found])
408
        ])
409 410 411
    ])

AS_IF([test "$have_lmdb" != "no"],[
412 413
    AC_SUBST([lmdb_LIBS])
    enable_lmdb=shared
414 415
    ],[
    enable_lmdb=embedded
416
    lmdb_CFLAGS="-I\$(top_srcdir)/src/contrib/lmdb"
417
    ])
418
AM_CONDITIONAL([HAVE_LMDB], test "$enable_lmdb" = "shared")
419
AC_SUBST([lmdb_CFLAGS])
420

421
# LMDB mapping sizes
422
conf_mapsize_default=500
423
AC_ARG_WITH([conf_mapsize],
424 425 426 427 428 429 430 431
    AC_HELP_STRING([--with-conf-mapsize=NUM], [Configuration DB mapsize in MiB [default=$conf_mapsize_default]]),
    [conf_mapsize=$withval],[conf_mapsize=$conf_mapsize_default])

AS_CASE([$conf_mapsize],
    [yes],[conf_mapsize=$conf_mapsize_default],
    [no], [AC_MSG_ERROR([conf_mapsize must be a number])],
    [*],  [AS_IF([test $conf_mapsize != $(( $conf_mapsize + 0 ))],
                 [AC_ERROR([conf_mapsize must be an integer number])])])
432
AC_DEFINE_UNQUOTED([CONF_MAPSIZE], [$conf_mapsize], [Configuration DB mapsize.])
433
AC_SUBST(conf_mapsize)
434

435
# libedit
436
AS_IF([test "$enable_daemon" = "yes" -o "$enable_utilities" = "yes"], [
437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
  PKG_CHECK_MODULES([libedit], [libedit], [with_libedit=yes], [
    with_libedit=no
    AC_CHECK_HEADER([histedit.h], [
      # workaround for OpenBSD
      AS_CASE([$host_os],
        [openbsd*], [libedit_deps=-lcurses],
        [libedit_deps=]
      )
      AC_CHECK_LIB([edit], [el_init], [
        with_libedit=yes
        libedit_CFLAGS=
        libedit_LIBS="-ledit $libedit_deps"
        ], [], [$libedit_deps]
      )
    ])
  ])
  AS_IF([test "$with_libedit" != "yes"], [
    AC_MSG_ERROR([libedit not found])
  ])
456
], [
457 458 459 460 461
  with_libedit=no
  libedit_CFLAGS=
  libedit_LIBS=
])

462 463 464 465 466 467
############################################
# Dependencies needed for Knot DNS utilities
############################################

dnl Check for libidn.
AC_ARG_WITH(libidn,
468 469 470 471 472 473 474
  AC_HELP_STRING([--with-libidn=[DIR]], [Support IDN (needs GNU libidn2 or libidn)]),
  with_libidn=$withval,
  with_libidn=yes
)

AS_IF([test "$enable_utilities" = "yes"], [
  AS_IF([test "$with_libidn" != "no"], [
475
    PKG_CHECK_MODULES([libidn2], [libidn2 >= 2.0.0], [
476 477 478 479 480
      with_libidn=yes
      AC_DEFINE([LIBIDN], [1], [Define to 1 to enable IDN support])
      AC_DEFINE([LIBIDN_HEADER], [<idn2.h>], [Define to proper libidn header])
    ], [
      PKG_CHECK_MODULES([libidn], [libidn >= 0.0.0], [
481 482
        with_libidn=yes
        AC_DEFINE([LIBIDN], [1], [Define to 1 to enable IDN support])
483 484
        AC_DEFINE([LIBIDN_HEADER], [<idna.h>], [Define to proper libidn header])
      ], [
485
        with_libidn=no
486 487 488 489
        AC_MSG_WARN([libidn2 or libidn not found])
      ])
    ])
  ])
490
]) # Knot DNS utilities dependencies
491

492 493
AC_SEARCH_LIBS([pow], [m])
AC_SEARCH_LIBS([pthread_create], [pthread], [], [AC_MSG_ERROR([pthreads not found])])
494
AC_SEARCH_LIBS([dlopen], [dl])
Marek Vavrusa's avatar
Marek Vavrusa committed
495
AC_SEARCH_LIBS([clock_gettime], [rt])
496
AC_SEARCH_LIBS([capng_apply], [cap-ng])
Ondřej Surý's avatar
Ondřej Surý committed
497 498 499

# Checks for header files.
AC_HEADER_RESOLV
500
AC_CHECK_HEADERS_ONCE([cap-ng.h pthread_np.h signal.h sys/time.h sys/wait.h sys/uio.h])
Ondřej Surý's avatar
Ondřej Surý committed
501 502

# Checks for library functions.
503
AC_CHECK_FUNCS([clock_gettime gettimeofday fgetln getline madvise malloc_trim poll \
Daniel Salzman's avatar
Daniel Salzman committed
504
                posix_memalign pthread_setaffinity_np setgroups strlcat strlcpy \
505 506 507 508
                initgroups accept4])

AC_CHECK_FUNC([vasprintf], [], [
  AC_MSG_ERROR([vasprintf support in the libc is required])])
Ondřej Surý's avatar
Ondřej Surý committed
509

510 511 512 513 514 515 516 517
# Check for cpu_set_t/cpuset_t compatibility
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]], [[cpu_set_t set; CPU_ZERO(&set);]])],
[AC_DEFINE(HAVE_CPUSET_LINUX, 1, [Define if Linux-like cpu_set_t exists.])])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread_np.h>]], [[cpuset_t set; CPU_ZERO(&set);]])],
[AC_DEFINE(HAVE_CPUSET_BSD, 1, [Define if FreeBSD-like cpuset_t exists.])])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sched.h>]], [[cpuset_t* set = cpuset_create(); cpuset_destroy(set);]])],
[AC_DEFINE(HAVE_CPUSET_NETBSD, 1, [Define if cpuset_t and cpuset(3) exists.])])

518
AC_LINK_IFELSE(
519 520
  [AC_LANG_PROGRAM([[#include <stdint.h>]],
                   [[uint64_t val = 0; __atomic_add_fetch(&val, 1, __ATOMIC_RELAXED);]])],
521
  [AC_DEFINE(HAVE_ATOMIC, 1, [Define to 1 if you have '__atomic' functions.])]
522 523
)

524
# Prepare CFLAG_VISIBILITY to be used where needed
525
gl_VISIBILITY()
526

527 528 529
# Add code coverage macro
AX_CODE_COVERAGE

530
AX_SANITIZER
531 532
AS_IF([test -n "$sanitizer_CFLAGS"], [CFLAGS="$CFLAGS $sanitizer_CFLAGS"])
AM_CONDITIONAL([FUZZER], [test "$with_fuzzer" != "no"])
533
AM_CONDITIONAL([OSS_FUZZ], [test "$with_oss_fuzz" != "no"])
534

535 536
AS_IF([test "$enable_documentation" = "yes"],[

537
AC_PATH_PROGS([SPHINXBUILD], [sphinx-build sphinx-build-3], [false])
538 539 540 541 542 543 544 545 546 547
AS_IF([test "$SPHINXBUILD" = "false"],
  [AC_MSG_WARN([Could not find the 'sphinx-build' executable, you will be unable to regenerate documentation.])],
  [AC_PATH_PROG([PDFLATEX], [pdflatex], [false])
   AS_IF([test "$PDFLATEX" = ""],
     [AC_MSG_WARN([Could not find the 'pdflatex' executable, you will be unable to generate PDF documentation.])])
   AC_PATH_PROG([MAKEINFO], [makeinfo], [false])
   AS_IF([test "$MAKEINFO" = "false"],
     [AC_MSG_WARN([Could not find the 'makeinfo' executable, you will be unable to generate info documentation.])])
  ])

548 549
])

550 551 552 553
AM_CONDITIONAL([HAVE_SPHINXBUILD], test "$SPHINXBUILD" != "false")
AM_CONDITIONAL([HAVE_PDFLATEX], test "$PDFLATEX" != "false")
AM_CONDITIONAL([HAVE_MAKEINFO], test "$MAKEINFO" != "false")

554
result_msg_base="  Knot DNS $VERSION
555 556 557

    Target:   $host_os $host_cpu
    Compiler: ${CC}
558
    CFLAGS:   ${CFLAGS} ${CPPFLAGS}
559 560 561
    LIBS:     ${LIBS} ${LDFLAGS}
    LibURCU:  ${liburcu_LIBS} ${liburcu_CFLAGS}
    GnuTLS:   ${gnutls_LIBS} ${gnutls_CFLAGS}
562
    Libedit:  ${libedit_LIBS} ${libedit_CFLAGS}
563
    LMDB:     ${enable_lmdb} ${lmdb_LIBS} ${lmdb_CFLAGS}
564
    Config:   ${conf_mapsize} MiB default mapsize
565

566
    Prefix:      ${knot_prefix}
567 568 569
    Run dir:     ${run_dir}
    Storage dir: ${storage_dir}
    Config dir:  ${config_dir}
570
    Module dir:  ${module_dir}
571

572 573
    Static modules: ${static_modules}
    Shared modules: ${shared_modules}
574

575 576
    Knot DNS libraries:     yes
    Knot DNS daemon:        ${enable_daemon}
577
    Knot DNS utilities:     ${enable_utilities}
578 579
    Knot DNS documentation: ${enable_documentation}

580 581 582 583
    Use recvmmsg:           ${enable_recvmmsg}
    Use SO_REUSEPORT:       ${enable_reuseport}
    Fast zone parser:       ${enable_fastparser}
    Utilities with IDN:     ${with_libidn}
584
    Utilities with Dnstap:  ${enable_dnstap}
585 586
    Systemd integration:    ${enable_systemd}
    PKCS #11 support:       ${enable_pkcs11}
587
    Ed25519 support:        ${enable_ed25519}
588
    Code coverage:          ${enable_code_coverage}
589 590
    Sanitizer:              ${with_sanitizer}
    LibFuzzer:              ${with_fuzzer}
591
    OSS-Fuzz:               ${with_oss_fuzz}"
592 593

result_msg_esc=$(echo -n "$result_msg_base" | sed '$!s/$/\\n/' | tr -d '\n')
594 595 596 597

AC_DEFINE_UNQUOTED([CONFIGURE_SUMMARY],["$result_msg_esc"],[Configure summary])

AC_CONFIG_FILES([Makefile
598
                 Doxyfile
599 600 601 602 603 604
                 doc/Makefile
                 tests/Makefile
                 tests-fuzz/Makefile
                 samples/Makefile
                 python/Makefile
                 src/Makefile
605
                 src/knot/modules/static_modules.h
606 607
                 ])

608 609
AC_CONFIG_FILES([doc/modules.rst],
                [cp doc/modules.rst ${srcdir}/doc/modules.rst 2>/dev/null;
610
                 ln -s -f $(readlink -f ${srcdir})/src/knot/modules ${srcdir}/doc 2>/dev/null])
611

612
AC_OUTPUT
613 614 615
AC_MSG_RESULT([
$result_msg_base
])