1AC_INIT([DHCP],[4.4.2],[dhcp-users@isc.org]) 2 3# for libtool 4AC_CONFIG_MACRO_DIR([m4]) 5 6# we specify "foreign" to avoid having to have the GNU mandated files, 7# like AUTHORS, COPYING, and such 8AM_INIT_AUTOMAKE([foreign]) 9 10# we specify AM_MAINTAINER_MODE to avoid problems with rebuilding 11# the configure and makefiles. Without it users doing things that 12# change the timestamps on the code, like checking it into a cvs 13# tree, could trigger a rebuild of the infrastructure files which 14# might fail if they don't have the correct tools. 15AM_MAINTAINER_MODE 16 17AC_CANONICAL_HOST 18 19# We want to turn on warnings if we are using gcc and the user did 20# not specify CFLAGS. The autoconf check for the C compiler sets the 21# CFLAGS if gcc is used, so we will save it before we run that check. 22SAVE_CFLAGS="$CFLAGS" 23 24# Now find our C compiler. 25AC_PROG_CC 26 27# Suppress warnings about --datarootdir 28AC_DEFUN([AC_DATAROOTDIR_CHECKED]) 29 30# If we have gcc, and AC_PROG_CC changed the flags, then we know the 31# user did not specify any flags. Add warnings in this case. 32if test "$GCC" = "yes"; then 33 if test "$CFLAGS" != "$SAVE_CFLAGS"; then 34 STD_CWARNINGS="$STD_CWARNINGS -Wall -Werror -fno-strict-aliasing" 35 fi 36fi 37 38# We can have some flags to pass to bind configure 39BINDCONFIG= 40if test "$cross_compiling" = "yes"; then 41 BINDCONFIG="--host=$host" 42fi 43# Pass CFLAGS and co. $ac_configure_args looks like "'arg1' 'arg2' ..." 44# and as there can be a space inside an argument some magic is required. 45# This sets $1 ... $N to my_configure_args, arg1 ... argN 46eval "set my_configure_args $ac_configure_args" 47# remove my_configure_args, i.e., the guard against empty $ac_configure_args 48shift 49# iterate on arguments and copying 'arg' when it begins by an upper case 50for a 51do 52 case $a in 53 [[A-Z]]*) BINDCONFIG="$BINDCONFIG '$a'" ;; 54 esac 55done 56AC_SUBST(BINDCONFIG) 57 58# POSIX doesn't include the IPv6 Advanced Socket API and glibc hides 59# parts of the IPv6 Advanced Socket API as a result. This is stupid 60# as it breaks how the two halves (Basic and Advanced) of the IPv6 61# Socket API were designed to be used but we have to live with it. 62# Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API. 63AC_USE_SYSTEM_EXTENSIONS 64 65 66AC_PATH_PROG(AR, ar) 67AC_SUBST(AR) 68 69if test "X$AR" = "X"; then 70 AC_MSG_ERROR([ 71ar program not found. Please fix your PATH to include the directory in 72which ar resides, or set AR in the environment with the full path to ar.]) 73fi 74 75AC_CONFIG_HEADERS([includes/config.h]) 76 77# we sometimes need to know byte order for building packets 78AC_C_BIGENDIAN(AC_SUBST(byte_order, BIG_ENDIAN), 79 AC_SUBST(byte_order, LITTLE_ENDIAN)) 80AC_DEFINE_UNQUOTED([DHCP_BYTE_ORDER], [$byte_order], 81 [Define to BIG_ENDIAN for MSB (Motorola or SPARC CPUs) 82 or LITTLE_ENDIAN for LSB (Intel CPUs).]) 83 84# Optional compile-time DEBUGging. 85AC_ARG_ENABLE(debug, 86 AS_HELP_STRING([--enable-debug],[create a debug-only version of the software (default is no).]), 87 [case "${enableval}" in 88 yes) enable_debug=yes 89 AC_DEFINE([DEBUG], [1], 90 [Define to compile debug-only DHCP software.]) 91 # Just override CFLAGS totally to remove optimization. 92 CFLAGS="-g";; 93 no) enable_debug=no ;; 94 *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; 95 esac],[enable_debug=no]) 96 97# XXX: there are actually quite a lot more DEBUG_ features we could enable, 98# but I don't want to pollute the --help space. 99# 100#/* #define DEBUG_TOKENS */ 101#/* #define DEBUG_PACKET */ 102#/* #define DEBUG_EXPRESSIONS */ 103#/* #define DEBUG_FIND_LEASE */ 104#/* #define DEBUG_EXPRESSION_PARSE */ 105#/* #define DEBUG_CLASS_MATCHING */ 106#/* #define DEBUG_MEMORY_LEAKAGE */ 107#/* #define DEBUG_MALLOC_POOL */ 108#/* #define DEBUG_LEASE_STATE_TRANSITIONS */ 109#/* #define DEBUG_RC_HISTORY */ 110#/* #define DEBUG_RC_HISTORY_EXHAUSTIVELY */ 111#/* #define RC_HISTORY_MAX 10240 */ 112#/* #define POINTER_DEBUG */ 113#/* #define DEBUG_FAILOVER_MESSAGES */ 114#/* #define DEBUG_FAILOVER_TIMING */ 115#/* #define DEBUG_DUMP_ALL_LEASES */ 116 117# Failover optional compile-time feature. 118AC_ARG_ENABLE(failover, 119 AS_HELP_STRING([--enable-failover],[enable support for failover (default is yes)])) 120# Failover is on by default, so define if it is not explicitly disabled. 121if test "$enable_failover" != "no"; then 122 enable_failover="yes" 123 AC_DEFINE([FAILOVER_PROTOCOL], [1], 124 [Define to include Failover Protocol support.]) 125fi 126 127# execute() support. 128AC_ARG_ENABLE(execute, 129 AS_HELP_STRING([--enable-execute],[enable support for execute() in config (default is yes)])) 130# execute() is on by default, so define if it is not explicitly disabled. 131if test "$enable_execute" != "no" ; then 132 enable_execute="yes" 133 AC_DEFINE([ENABLE_EXECUTE], [1], 134 [Define to include execute() config language support.]) 135fi 136 137# Server tracing support. 138AC_ARG_ENABLE(tracing, 139 AS_HELP_STRING([--enable-tracing],[enable support for server activity tracing (default is yes)])) 140# tracing is on by default, so define if it is not explicitly disabled. 141if test "$enable_tracing" != "no" ; then 142 AC_DEFINE([TRACING], [1], 143 [Define to include server activity tracing support.]) 144fi 145 146# Delayed-ack feature support. 147AC_ARG_ENABLE(delayed_ack, 148 AS_HELP_STRING([--enable-delayed-ack],[queues multiple DHCPACK replies (default is yes)])) 149if test "$enable_delayed_ack" != "no"; then 150 enable_delayed_ack="yes" 151 AC_DEFINE([DELAYED_ACK], [1], 152 [Define to queue multiple DHCPACK replies per fsync.]) 153fi 154 155# DHCPv6 optional compile-time feature. 156AC_ARG_ENABLE(dhcpv6, 157 AS_HELP_STRING([--enable-dhcpv6],[enable support for DHCPv6 (default is yes)])) 158# DHCPv6 is on by default, so define if it is not explicitly disabled. 159if test "$enable_dhcpv6" != "no"; then 160 enable_dhcpv6="yes" 161 AC_DEFINE([DHCPv6], [1], 162 [Define to 1 to include DHCPv6 support.]) 163fi 164 165# DHCPv4o6 optional compile-time feature. 166AC_ARG_ENABLE(dhcpv4o6, 167 AS_HELP_STRING([--enable-dhcpv4o6],[enable support for DHCPv4-over-DHCPv6 (default is no)])) 168# DHCPv4o6 is off by default, so define if it is explicitly enabled. 169if test "$enable_dhcpv4o6" = "yes"; then 170 # DHCPv4o6 requires DHCPv6 171 if test "$enable_dhcpv6" = "no"; then 172 AC_MSG_ERROR([dhcpv4o6 requires dhcpv6]) 173 fi 174 AC_DEFINE([DHCP4o6], [1], 175 [Define to 1 to include DHCPv4 over DHCPv6 support.]) 176else 177 # so we can report below 178 enable_dhcpv4o6="no" 179fi 180 181# Relay port (draft-ietf-dhc-relay-port-10.txt) optional compile-time feature. 182AC_ARG_ENABLE(relay-port, 183 AS_HELP_STRING([--enable-relay-port],[enable support for relay port (default is no)])) 184# Relay port is off by default (for now) 185if test "$enable_relay_port" = "yes"; then 186 AC_DEFINE([RELAY_PORT], [1], 187 [Define to 1 to include relay port support.]) 188else 189 # so we can report below 190 enable_relay_port="no" 191fi 192 193# PARANOIA is off by default (until we can test it with all features) 194AC_ARG_ENABLE(paranoia, 195 AS_HELP_STRING([--enable-paranoia],[enable support for chroot/setuid (default is no)])) 196AC_ARG_ENABLE(early_chroot, 197 AS_HELP_STRING([--enable-early-chroot],[enable chrooting prior to configuration (default is no)])) 198# If someone enables early chroot, but does not enable paranoia, do so for 199# them. 200if test "$enable_paranoia" != "yes" && \ 201 test "$enable_early_chroot" = "yes" ; then 202 enable_paranoia="yes" 203fi 204 205if test "$enable_paranoia" = "yes" ; then 206 AC_DEFINE([PARANOIA], [1], 207 [Define to any value to include Ari's PARANOIA patch.]) 208fi 209if test "$enable_early_chroot" = "yes" ; then 210 AC_DEFINE([EARLY_CHROOT], [1], 211 [Define to any value to chroot() prior to loading config.]) 212fi 213 214AC_ARG_ENABLE(ipv4_pktinfo, 215 AS_HELP_STRING([--enable-ipv4-pktinfo],[enable use of pktinfo on IPv4 sockets (default is no)])) 216 217if test "$enable_ipv4_pktinfo" = "yes"; then 218 AC_DEFINE([USE_V4_PKTINFO], [1], 219 [Define to 1 to enable IPv4 packet info support.]) 220fi 221 222AC_ARG_ENABLE(use_sockets, 223 AS_HELP_STRING([--enable-use-sockets],[use the standard BSD socket API (default is no)])) 224 225if test "$enable_use_sockets" = "yes"; then 226 AC_DEFINE([USE_SOCKETS], [1], 227 [Define to 1 to use the standard BSD socket API.]) 228fi 229 230# Include the PID in the log messages. This is useful when there may 231# be multiple instances of a program. 232# This is off by default 233AC_ARG_ENABLE(log_pid, 234 AS_HELP_STRING([--enable-log-pid],[Include PIDs in syslog messages (default is no).])) 235if test "$enable_log_pid" = "yes" ; then 236 AC_DEFINE([USE_LOG_PID], [1], 237 [Define to include PIDs in syslog messages.]) 238fi 239 240# Allow for binary search when inserting v4 leases into queues 241AC_ARG_ENABLE(binary_leases, 242 AS_HELP_STRING([--enable-binary-leases],[enable support for binary insertion of leases (default is no)])) 243# binary_leases is off by default. 244if test "$enable_binary_leases" = "yes"; then 245 AC_DEFINE([BINARY_LEASES], [1], 246 [Define to support binary insertion of leases into queues.]) 247else 248 enable_binary_leases="no" 249fi 250 251# Testing section 252 253# Bind Makefile needs to know ATF is not included. 254AM_CONDITIONAL(BIND_ATF, test "foo" = "barr") 255 256DISTCHECK_ATF_CONFIGURE_FLAG= 257atf_path="no" 258AC_ARG_WITH([atf], 259 AS_HELP_STRING([--with-atf=PATH],[specify location where atf was installed]), 260 [atf_path="$withval"]) 261if test "$atf_path" != "no" ; then 262 DISTCHECK_ATF_CONFIGURE_FLAG="--with-atf=$atf_path" 263 # Config path for pkg-config 264 atf_pcp="" 265 if test "$atf_path" != "yes" ; then 266 if test -f $atf_path/lib/pkgconfig/atf-c.pc ; then 267 atf_pcp=$atf_path/lib/pkgconfig 268 elif test -f $atf_path/lib64/pkgconfig/atf-c.pc ; then 269 atf_pcp=$atf_path/lib64/pkgconfig 270 fi 271 else 272 # Not specified, try some common paths 273 atf_dirs="/usr /usr/local /usr/pkg /opt /opt/local" 274 for d in $atf_dirs 275 do 276 if test -f $d/lib/pkgconfig/atf-c.pc ; then 277 atf_pcp=$d/lib/pkgconfig 278 atf_path=$d 279 elif test -f $d/lib64/pkgconfig/atf-c.pc ; then 280 atf_pcp=$d/lib64/pkgconfig 281 atf_path=$d 282 fi 283 done 284 fi 285 286 if test "$atf_pcp" = "" ; then 287 AC_MSG_ERROR([Unable to find atf files in location specified]) 288 else 289 AC_CHECK_PROG([pkgcfg_found],[pkg-config],[pkg-config],[]) 290 if test "$pkgcfg_found" = ""; then 291 AC_MSG_ERROR([Could not locate ATF, pkg-config not installed]) 292 fi 293 ATF_CFLAGS="`PKG_CONFIG_PATH=$atf_pcp pkg-config --cflags atf-c` -DUNIT_TEST" 294 ATF_LDFLAGS="`PKG_CONFIG_PATH=$atf_pcp pkg-config --libs atf-c`" 295 if test -f $atf_pcp/atf-sh.pc ; then 296 ATF_BIN="`PKG_CONFIG_PATH=$atf_pcp pkg-config --variable=exec_prefix atf-sh`/bin" 297 else 298 # older versions don't have atf-sh, try usual place 299 ATF_BIN=$atf_path/bin 300 fi 301 302 UNITTESTS=tests 303 304 AC_SUBST(ATF_CFLAGS) 305 AC_SUBST(ATF_LDFLAGS) 306 AC_SUBST(ATF_BIN) 307 AC_SUBST(UNITTESTS) 308 fi 309fi 310 311AM_CONDITIONAL(HAVE_ATF, test "$atf_pcp" != "") 312AM_COND_IF([HAVE_ATF], [AC_DEFINE([HAVE_ATF], [1], [ATF framework specified?])]) 313AC_SUBST(DISTCHECK_ATF_CONFIGURE_FLAG) 314 315### 316### Path fun. Older versions of DHCP were installed in /usr/sbin, so we 317### need to look there and potentially overwrite by default (but not if 318### the user configures an alternate value). LOCALSTATEDIR is totally 319### braindead. No one uses /usr/local/var/db/ nor /usr/local/var/run, and 320### they would be insane for suggesting it. We need to look in /var/for 321### 'db' and 'state/dhcp' for db files, and /var/run for pid files by 322### default. 323### 324AC_PREFIX_PROGRAM(dhcpd) 325 326# XXX - isn't there SOME WAY to default autoconf to /var instead of 327# /usr/local/var/no/one/has/this/please/stop/trying? 328case "$localstatedir" in 329 '${prefix}/var') 330 localstatedir=/var 331 ;; 332esac 333 334# Default server configuration file. 335AC_ARG_WITH(srv-conf-file, 336 AS_HELP_STRING([--with-srv-conf-file=PATH],[Default file containing dhcpd configuration 337 (default is typically /etc/dhcpd.conf)]), 338 AC_DEFINE_UNQUOTED([_PATH_DHCPD_CONF], ["$withval"], 339 [Default file containing dhcpd configuration.])) 340 341# Allow specification of alternate state files 342AC_ARG_WITH(srv-lease-file, 343 AS_HELP_STRING([--with-srv-lease-file=PATH],[File for dhcpd leases 344 (default is LOCALSTATEDIR/db/dhcpd.leases)]), 345 AC_DEFINE_UNQUOTED([_PATH_DHCPD_DB], ["$withval"], 346 [File for dhcpd leases.])) 347 348AC_MSG_CHECKING([for dhcpd.leases location]) 349if [[ "x$with_srv_lease_file" = "x" ]] ; then 350 if [[ -d "${localstatedir}/db" ]] ; then 351 with_srv_lease_file="${localstatedir}/db/dhcpd.leases" 352 elif [[ -d "${localstatedir}/state" ]] ; then 353 if [[ -d "${localstatedir}/state/dhcp" ]] ; then 354 with_srv_lease_file="${localstatedir}/state/dhcp/dhcpd.leases" 355 else 356 with_srv_lease_file="${localstatedir}/state/dhcpd.leases" 357 fi 358 elif [[ -d "${localstatedir}/lib" ]] ; then 359 if [[ -d "${localstatedir}/lib/dhcp" ]] ; then 360 with_srv_lease_file="${localstatedir}/lib/dhcp/dhcpd.leases" 361 else 362 with_srv_lease_file="${localstatedir}/lib/dhcpd.leases" 363 fi 364 elif [[ -d "${localstatedir}/etc" ]] ; then 365 with_srv_lease_file="${localstatedir}/etc/dhcpd.leases" 366 else 367 with_srv_lease_file="/etc/dhcpd.leases" 368 fi 369fi 370AC_MSG_RESULT($with_srv_lease_file) 371 372AC_ARG_WITH(srv6-lease-file, 373 AS_HELP_STRING([--with-srv6-lease-file=PATH],[File for dhcpd6 leases 374 (default is LOCALSTATEDIR/db/dhcpd6.leases)]), 375 AC_DEFINE_UNQUOTED([_PATH_DHCPD6_DB], ["$withval"], 376 [File for dhcpd6 leases.])) 377 378AC_MSG_CHECKING([for dhcpd6.leases location]) 379if [[ "x$with_srv6_lease_file" = "x" ]] ; then 380 if [[ -d "${localstatedir}/db" ]] ; then 381 with_srv6_lease_file="${localstatedir}/db/dhcpd6.leases" 382 elif [[ -d "${localstatedir}/state" ]] ; then 383 if [[ -d "${localstatedir}/state/dhcp" ]] ; then 384 with_srv6_lease_file="${localstatedir}/state/dhcp/dhcpd6.leases" 385 else 386 with_srv6_lease_file="${localstatedir}/state/dhcpd6.leases" 387 fi 388 elif [[ -d "${localstatedir}/lib" ]] ; then 389 if [[ -d "${localstatedir}/lib/dhcp" ]] ; then 390 with_srv6_lease_file="${localstatedir}/lib/dhcp/dhcpd6.leases" 391 else 392 with_srv6_lease_file="${localstatedir}/lib/dhcpd6.leases" 393 fi 394 elif [[ -d "${localstatedir}/etc" ]] ; then 395 with_srv6_lease_file="${localstatedir}/etc/dhcpd6.leases" 396 else 397 with_srv6_lease_file="/etc/dhcpd6.leases" 398 fi 399fi 400AC_MSG_RESULT($with_srv6_lease_file) 401 402AC_ARG_WITH(cli-lease-file, 403 AS_HELP_STRING([--with-cli-lease-file=PATH],[File for dhclient leases 404 (default is LOCALSTATEDIR/db/dhclient.leases)]), 405 AC_DEFINE_UNQUOTED([_PATH_DHCLIENT_DB], ["$withval"], 406 [File for dhclient leases.])) 407 408AC_MSG_CHECKING([for dhclient.leases location]) 409if [[ "x$with_cli_lease_file" = "x" ]] ; then 410 if [[ -d "${localstatedir}/db" ]] ; then 411 with_cli_lease_file="${localstatedir}/db/dhclient.leases" 412 elif [[ -d "${localstatedir}/state" ]] ; then 413 if [[ -d "${localstatedir}/state/dhcp" ]] ; then 414 with_cli_lease_file="${localstatedir}/state/dhcp/dhclient.leases" 415 else 416 with_cli_lease_file="${localstatedir}/state/dhclient.leases" 417 fi 418 elif [[ -d "${localstatedir}/lib" ]] ; then 419 if [[ -d "${localstatedir}/lib/dhcp" ]] ; then 420 with_cli_lease_file="${localstatedir}/lib/dhcp/dhclient.leases" 421 else 422 with_cli_lease_file="${localstatedir}/lib/dhclient.leases" 423 fi 424 elif [[ -d "${localstatedir}/etc" ]] ; then 425 with_cli_lease_file="${localstatedir}/etc/dhclient.leases" 426 else 427 with_cli_lease_file="/etc/dhclient.leases" 428 fi 429fi 430AC_MSG_RESULT($with_cli_lease_file) 431 432AC_ARG_WITH(cli6-lease-file, 433 AS_HELP_STRING([--with-cli6-lease-file=PATH],[File for dhclient6 leases 434 (default is LOCALSTATEDIR/db/dhclient6.leases)]), 435 AC_DEFINE_UNQUOTED([_PATH_DHCLIENT6_DB], ["$withval"], 436 [File for dhclient6 leases.])) 437 438AC_MSG_CHECKING([for dhclient6.leases location]) 439if [[ "x$with_cli6_lease_file" = "x" ]] ; then 440 if [[ -d "${localstatedir}/db" ]] ; then 441 with_cli6_lease_file="${localstatedir}/db/dhclient6.leases" 442 elif [[ -d "${localstatedir}/state" ]] ; then 443 if [[ -d "${localstatedir}/state/dhcp" ]] ; then 444 with_cli6_lease_file="${localstatedir}/state/dhcp/dhclient6.leases" 445 else 446 with_cli6_lease_file="${localstatedir}/state/dhclient6.leases" 447 fi 448 elif [[ -d "${localstatedir}/lib" ]] ; then 449 if [[ -d "${localstatedir}/lib/dhcp" ]] ; then 450 with_cli6_lease_file="${localstatedir}/lib/dhcp/dhclient6.leases" 451 else 452 with_cli6_lease_file="${localstatedir}/lib/dhclient6.leases" 453 fi 454 elif [[ -d "${localstatedir}/etc" ]] ; then 455 with_cli6_lease_file="${localstatedir}/etc/dhclient6.leases" 456 else 457 with_cli6_lease_file="/etc/dhclient6.leases" 458 fi 459fi 460AC_MSG_RESULT($with_cli6_lease_file) 461 462AC_ARG_WITH(srv-pid-file, 463 AS_HELP_STRING([--with-srv-pid-file=PATH],[File for dhcpd process information 464 (default is LOCALSTATEDIR/run/dhcpd.pid)]), 465 AC_DEFINE_UNQUOTED([_PATH_DHCPD_PID], ["$withval"], 466 [File for dhcpd process information.])) 467AC_ARG_WITH(srv6-pid-file, 468 AS_HELP_STRING([--with-srv6-pid-file=PATH],[File for dhcpd6 process information 469 (default is LOCALSTATEDIR/run/dhcpd6.pid)]), 470 AC_DEFINE_UNQUOTED([_PATH_DHCPD6_PID], ["$withval"], 471 [File for dhcpd6 process information.])) 472AC_ARG_WITH(cli-pid-file, 473 AS_HELP_STRING([--with-cli-pid-file=PATH],[File for dhclient process information 474 (default is LOCALSTATEDIR/run/dhclient.pid)]), 475 AC_DEFINE_UNQUOTED([_PATH_DHCLIENT_PID], ["$withval"], 476 [File for dhclient process information.])) 477AC_ARG_WITH(cli6-pid-file, 478 AS_HELP_STRING([--with-cli6-pid-file=PATH],[File for dhclient6 process information 479 (default is LOCALSTATEDIR/run/dhclient6.pid)]), 480 AC_DEFINE_UNQUOTED([_PATH_DHCLIENT6_PID], ["$withval"], 481 [File for dhclient6 process information.])) 482AC_ARG_WITH(relay-pid-file, 483 AS_HELP_STRING([--with-relay-pid-file=PATH],[File for dhcrelay process information 484 (default is LOCALSTATEDIR/run/dhcrelay.pid)]), 485 AC_DEFINE_UNQUOTED([_PATH_DHCRELAY_PID], ["$withval"], 486 [File for dhcrelay process information.])) 487AC_ARG_WITH(relay6-pid-file, 488 AS_HELP_STRING([--with-relay6-pid-file=PATH],[File for dhcrelay6 process information 489 (default is LOCALSTATEDIR/run/dhcrelay6.pid)]), 490 AC_DEFINE_UNQUOTED([_PATH_DHCRELAY6_PID], ["$withval"], 491 [File for dhcrelay6 process information.])) 492 493# Check basic types. 494AC_TYPE_INT8_T 495AC_TYPE_INT16_T 496AC_TYPE_INT32_T 497AC_TYPE_INT64_T 498 499# Some systems need the u_intX_t types defined across. 500AC_CHECK_TYPE([u_int8_t], [], [ 501 AC_TYPE_UINT8_T 502 AC_DEFINE(u_int8_t, [uint8_t], [Define a type for 8-bit unsigned 503 integers.]) 504]) 505AC_CHECK_TYPE([u_int16_t], [], [ 506 AC_TYPE_UINT16_T 507 AC_DEFINE(u_int16_t, [uint16_t], [Define a type for 16-bit unsigned 508 integers.]) 509]) 510AC_CHECK_TYPE([u_int32_t], [], [ 511 AC_TYPE_UINT32_T 512 AC_DEFINE(u_int32_t, [uint32_t], [Define a type for 32-bit unsigned 513 integers.]) 514]) 515AC_CHECK_TYPE([u_int64_t], [], [ 516 AC_TYPE_UINT64_T 517 AC_DEFINE(u_int64_t, [uint64_t], [Define a type for 64-bit unsigned 518 integers.]) 519]) 520 521# see if ifaddrs.h is available 522AC_CHECK_HEADERS(ifaddrs.h) 523 524# figure out what IPv4 interface code to use 525AC_CHECK_HEADERS(linux/types.h) # needed for linux/filter.h on old systems 526 527relay_port_supported="no" 528AC_CHECK_HEADER(linux/filter.h, DO_LPF=1, , 529[ 530#ifdef HAVE_LINUX_TYPES_H 531#include <linux/types.h> 532#endif 533]) 534if test -n "$DO_LPF" 535then 536 AC_DEFINE([HAVE_LPF], [1], 537 [Define to 1 to use the Linux Packet Filter interface code.]) 538 relay_port_supported="yes" 539else 540 AC_CHECK_HEADER(sys/dlpi.h, DO_DLPI=1) 541 if test -n "$DO_DLPI" 542 then 543 AC_DEFINE([HAVE_DLPI], [1], 544 [Define to 1 to use DLPI interface code.]) 545 else 546 AC_CHECK_HEADER(net/bpf.h, DO_BPF=1) 547 if test -n "$DO_BPF" 548 then 549 AC_DEFINE([HAVE_BPF], [1], 550 [Define to 1 to use the 551 Berkeley Packet Filter interface code.]) 552 relay_port_supported="yes" 553 fi 554 fi 555fi 556 557if test "$enable_relay_port" = "yes"; then 558 if test "$relay_port_supported" != "yes"; then 559 AC_MSG_ERROR([--enable-relay-port requires BPF or LPF]) 560 fi 561fi 562 563# SIOCGLIFCONF uses some transport structures. Trick is not all platforms 564# use the same structures. We like to use 'struct lifconf' and 'struct 565# lifreq', but we'll use these other structures if they're present. HPUX 566# does not define 'struct lifnum', but does use SIOCGLIFNUM - they use an 567# int value. 568# 569AC_MSG_CHECKING([for struct lifnum]) 570AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <sys/types.h> 571 #include <sys/socket.h> 572 #include <net/if.h> 573]], [[ struct lifnum a; 574]])],[AC_MSG_RESULT(yes) 575 AC_DEFINE([ISC_PLATFORM_HAVELIFNUM], [1], 576 [Define to 1 if the system has 'struct lifnum'.])],[AC_MSG_RESULT(no)]) 577 578AC_MSG_CHECKING([for struct if_laddrconf]) 579AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <sys/types.h> 580 #include <net/if6.h> 581]], [[ struct if_laddrconf a; 582]])],[AC_MSG_RESULT(yes) 583 AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRCONF], [1], 584 [Define to 1 if the system has 'struct if_laddrconf'.])],[AC_MSG_RESULT(no)]) 585 586AC_MSG_CHECKING([for struct if_laddrreq]) 587AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h> 588 #include <net/if6.h> 589]], [[ struct if_laddrreq a; 590]])],[AC_MSG_RESULT(yes) 591 AC_DEFINE([ISC_PLATFORM_HAVEIF_LADDRREQ], [1], 592 [Define to 1 if the system has 'struct if_laddrreq'.])],[AC_MSG_RESULT(no)]) 593 594# 595# check for GCC noreturn attribute 596# 597AC_MSG_CHECKING(for GCC noreturn attribute) 598AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[void foo() __attribute__((noreturn));]])],[AC_MSG_RESULT(yes) 599 AC_DEFINE([ISC_DHCP_NORETURN], [__attribute__((noreturn))], 600 [Define to the string for a noreturn attribute.])],[AC_MSG_RESULT(no) 601 AC_DEFINE([ISC_DHCP_NORETURN], [], 602 [Define to the string for a noreturn attribute.])]) 603 604# Look for optional headers. 605AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h) 606 607# Solaris needs some libraries for functions 608AC_SEARCH_LIBS(socket, [socket]) 609AC_SEARCH_LIBS(inet_ntoa, [nsl]) 610 611AC_SEARCH_LIBS(inet_aton, [socket nsl], , 612 AC_DEFINE([NEED_INET_ATON], [1], 613 [Define to 1 if the inet_aton() function is missing.])) 614 615# Check for a standalone regex library. 616AC_SEARCH_LIBS(regcomp, [regex]) 617 618AC_CHECK_FUNCS(strlcat) 619 620# For HP/UX we need -lipv6 for if_nametoindex, perhaps others. 621AC_SEARCH_LIBS(if_nametoindex, [ipv6]) 622 623# For some Solaris nanosleep is found by BIND in librt 624have_nanosleep="no" 625AC_CHECK_FUNC(nanosleep, have_nanosleep="yes") 626if test "$have_nanosleep" = "no"; then 627 AC_CHECK_LIB(rt, nanosleep, have_nanosleep="rt") 628fi 629if test "$have_nanosleep" = "rt"; then 630 LIBS="-lrt $LIBS" 631fi 632 633# check for /dev/random (declares HAVE_DEV_RANDOM) 634AC_MSG_CHECKING(for random device) 635AC_ARG_WITH(randomdev, 636 AS_HELP_STRING([--with-randomdev=PATH],[Path for random device 637 (default is /dev/random)]), 638 use_randomdev="$withval", use_randomdev="unspec") 639if test "$use_randomdev" = "unspec"; then 640 if test "$cross_compiling" = "yes"; then 641 AC_MSG_RESULT(unspecified) 642 AC_MSG_ERROR([ need --with-randomdev=PATH or --with-randomdev=no]) 643 fi 644 use_randomdev="/dev/random" 645elif test "$use_randomdev" = "yes"; then 646 use_randomdev="/dev/random" 647fi 648if test "$use_randomdev" = "no"; then 649 AC_MSG_RESULT(disabled) 650 BINDCONFIG="$BINDCONFIG --with-randomdev=no" 651else 652 if test "$cross_compiling" = "yes"; then 653 AC_MSG_RESULT($use_randomdev (unchecked)) 654 else 655 AC_MSG_RESULT($use_randomdev) 656 AC_CHECK_FILE($use_randomdev, 657 AC_DEFINE([HAVE_DEV_RANDOM], [1], 658 [Define to 1 if you have the /dev/random or other configured file.]), 659 AC_MSG_ERROR(cannot find $use_randomdev)) 660 fi 661 BINDCONFIG="$BINDCONFIG --with-randomdev=$use_randomdev" 662fi 663 664BINDIOMUX="--disable-kqueue --disable-epoll --disable-devpoll" 665# check kqueue/epoll/devpoll alternative to select 666AC_ARG_ENABLE(kqueue, 667 AS_HELP_STRING([--enable-kqueue],[use BSD kqueue (default is no)]), 668 want_kqueue="$enableval", want_kqueue="no") 669if test "$want_kqueue" = "yes"; then 670 BINDIOMUX="--enable-kqueue" 671 AC_MSG_WARN([--enable-kqueue is not supported: it may lead to issues such as server looping]) 672fi 673AC_ARG_ENABLE(epoll, 674 AS_HELP_STRING([--enable-epoll],[use Linux epoll (default is no)]), 675 want_epoll="$enableval", want_epoll="no") 676if test "$want_epoll" = "yes"; then 677 BINDIOMUX="--enable-epoll" 678 AC_MSG_WARN([--enable-epoll is not supported: it may lead to issues such as server looping]) 679fi 680AC_ARG_ENABLE(devpoll, 681 AS_HELP_STRING([--enable-devpoll],[use /dev/poll (default is no)]), 682 want_devpoll="$enableval", want_devpoll="no") 683if test "$want_devpoll" = "yes"; then 684 BINDIOMUX="--enable-devpoll" 685 AC_MSG_WARN([--enable-devpoll is not supported: it may lead to issues such as server looping]) 686fi 687AC_SUBST(BINDIOMUX) 688 689# general extra bind configure arguments 690AC_ARG_WITH(bind-extra-config, 691 AS_HELP_STRING([--with-bind-extra-config],[configure bind librairies 692 with some extra options (default is none)]), 693 use_xbindconfig="$withval", use_xbindconfig="") 694case "$use_xbindconfig" in 695yes|no|'') 696 ;; 697*) 698 BINDCONFIG="$BINDCONFIG $use_xbindconfig" 699 AC_MSG_WARN([Most options to bind configure are not supported when used by ISC DHCP]) 700 ;; 701esac 702 703# see if there is a "sa_len" field in our interface information structure 704AC_CHECK_MEMBER(struct sockaddr.sa_len, 705 AC_DEFINE([HAVE_SA_LEN], [], 706 [Define to 1 if the sockaddr structure has a length field.]), 707 , 708 [#include <sys/socket.h>]) 709 710# figure out pointer size 711SAVE_CFLAGS="$CFLAGS" 712CFLAGS="$CFLAGS -I$srcdir" 713AC_CHECK_SIZEOF(struct iaddr *, , [ 714#include "includes/inet.h" 715#include <stdio.h> 716]) 717CFLAGS="$SAVE_CFLAGS" 718 719# Solaris does not have the msg_control or msg_controlen members 720# in the msghdr structure unless you define: 721# 722# _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, and __EXTENSIONS__ 723# 724# See the "standards" man page for details. 725# 726# We check for the msg_control member, and if it is not found, we check 727# again with the appropriate defines added to the CFLAGS. (In order to 728# do this we have to remove the check from the cache, which is what the 729# "unset" is for.) 730AC_CHECK_MEMBER(struct msghdr.msg_control,, 731 [CFLAGS="$CFLAGS -D_XOPEN_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" 732 CFLAGS="$CFLAGS -D__EXTENSIONS__" 733 unset ac_cv_member_struct_msghdr_msg_control 734 AC_CHECK_MEMBER(struct msghdr.msg_control,, 735 [AC_MSG_ERROR([Missing msg_control member in 736 msg_control structure.])], 737 [ 738#include <sys/types.h> 739#include <sys/socket.h> 740 ]) 741 ], 742 [ 743#include <sys/types.h> 744#include <sys/socket.h> 745 ]) 746 747AC_CHECK_MEMBER(struct tpacket_auxdata.tp_vlan_tci, 748 [AC_DEFINE([VLAN_TCI_PRESENT], [1], [tpacket_auxdata.tp_vlan_tci present])] 749 ,, [#include <linux/if_packet.h>]) 750 751# bind/Makefile.in is not from automake so we need 2 variables for bind dir 752BINDSUBDIR= 753BINDDIR= 754BINDSRCDIR= 755BINDLIBIRSDIR= 756BINDLIBDNSDIR= 757BINDLIBISCCFGDIR= 758BINDLIBISCDIR= 759DISTCHECK_LIBBIND_CONFIGURE_FLAG= 760AC_ARG_WITH(libbind, 761 AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries are in PATH]), 762 use_libbind="$withval", use_libbind="no") 763case "$use_libbind" in 764yes) 765 AC_MSG_ERROR([PATH is required in --with-libbind=PATH]) 766 ;; 767no) 768 BINDSUBDIR="\${top_srcdir}/bind" 769 my_abs_srcdir=`cd $srcdir && pwd` 770 BINDDIR="${my_abs_srcdir}/bind" 771 if test ! -d "$srcdir/bind"; then 772 AC_MSG_ERROR([Where to find or build bind includes and libraries must be specified]) 773 fi 774 if test -d "$srcdir/bind/bind9"; then 775 BINDSRCDIR="${my_abs_srcdir}/bind/bind9" 776 else 777 if test ! -f "$srcdir/bind/version.tmp"; then 778 AC_MSG_ERROR([Cannot find $srcdir/bind/version.tmp]) 779 fi 780 . "$srcdir/bind/version.tmp" 781 bindversion=${MAJORVER}.${MINORVER}.${PATCHVER}${RELEASETYPE}${RELEASEVER} 782 BINDSRCDIR="${my_abs_srcdir}/bind/bind-$bindversion" 783 fi 784 AC_CONFIG_FILES([$srcdir/bind/Makefile]) 785 786 BINDLIBIRSDIR="$BINDSRCDIR/lib/irs" 787 BINDLIBDNSDIR="$BINDSRCDIR/lib/dns" 788 BINDLIBISCCFGDIR="$BINDSRCDIR/lib/isccfg" 789 BINDLIBISCDIR="$BINDSRCDIR/lib/isc" 790 ;; 791*) 792 if test ! -d "$use_libbind"; then 793 AC_MSG_ERROR([Cannot find bind directory at $use_libbind]) 794 fi 795 if test ! -d "$use_libbind/include" -o \ 796 ! -f "$use_libbind/include/isc/buffer.h" 797 then 798 AC_MSG_ERROR([Cannot find bind includes at $use_libbind/include]) 799 fi 800 if test ! -d "$use_libbind/lib" -o \ 801 \( ! -f "$use_libbind/lib/libisc.a" -a \ 802 ! -f "$use_libbind/lib/libisc.la" \) 803 then 804 AC_MSG_ERROR([Cannot find bind libraries at $use_libbind/lib]) 805 fi 806 BINDDIR="$use_libbind" 807 BINDLIBIRSDIR="$BINDDIR/lib" 808 BINDLIBDNSDIR="$BINDDIR/lib" 809 BINDLIBISCCFGDIR="$BINDDIR/lib" 810 BINDLIBISCDIR="$BINDDIR/lib" 811 DISTCHECK_LIBBIND_CONFIGURE_FLAG="--with-libbind=$use_libbind" 812 ;; 813esac 814AC_SUBST(BINDSUBDIR) 815AC_SUBST(BINDDIR) 816AC_SUBST(BINDSRCDIR) 817AC_SUBST(BINDLIBIRSDIR) 818AC_SUBST(BINDLIBDNSDIR) 819AC_SUBST(BINDLIBISCCFGDIR) 820AC_SUBST(BINDLIBISCDIR) 821AC_SUBST(DISTCHECK_LIBBIND_CONFIGURE_FLAG) 822AM_CONDITIONAL(HAVE_BINDDIR, test "$use_libbind" = "no") 823 824# 825# GNU libtool support 826# 827case "$build_os" in 828 sunos*) 829 # Just set the maximum command line length for sunos 830 # as it otherwise takes a exceptionally long time to 831 # work it out. Required for libtool. 832 833 lt_cv_sys_max_cmd_len=4096 834 ;; 835esac 836 837want_libtool="no" 838LT_INIT 839want_libtool="yes" 840 841BINDLT= 842DISTCHECK_LIBTOOL_CONFIGURE_FLAG= 843AC_ARG_ENABLE(libtool, 844 AS_HELP_STRING([--enable-libtool], 845[use GNU libtool for dynamic shared libraries (default is yes).]), 846 want_libtool="$enableval") 847 848if test "$use_libbind" != "no"; then 849 if test "$want_libtool" = "yes" -a \ 850 ! -f "$use_libbind/lib/libisc.la" 851 then 852 AC_MSG_ERROR([Cannot find dynamic libraries at $use_libbind/lib]) 853 fi 854 if test "$want_libtool" = "no" -a \ 855 ! -f "$use_libbind/lib/libisc.a" 856 then 857 AC_MSG_ERROR([Cannot find static libraries at $use_libbind/lib]) 858 fi 859fi 860 861if test "$want_libtool" = "no"; then 862 AC_MSG_ERROR([libtool configure is used but libtool is disabled?]) 863fi 864 865DHLIBS=LTLIBRARIES 866A=la 867BINDLT="--with-libtool --disable-symtable" 868DISTCHECK_LIBTOOL_CONFIGURE_FLAG="--enable-libtool" 869 870 871AC_SUBST(DHLIBS) 872AC_SUBST(A) 873AC_SUBST(BINDLT) 874AC_SUBST(DISTCHECK_LIBTOOL_CONFIGURE_FLAG) 875 876# quoting in Makefile.am.in 877Q=@ 878AC_SUBST(Q) 879 880# install bind includes and libraries 881 882want_install_bind="no" 883want_install_bind="yes" 884if test "$want_libtool" = "yes"; then 885 want_install_bind="yes" 886fi 887if test "$use_libbind" != "no"; then 888 want_install_bind="no" 889fi 890AC_ARG_ENABLE(bind_install, 891 AS_HELP_STRING([--enable-bind-install], 892[install bind includes and libraries.]), 893 want_install_bind="$enableval") 894if test "$want_install_bind" = "yes"; then 895 if test "$use_libbind" != "no"; then 896 AC_MSG_WARN([--enable-bind-install does nothing when --with-libbind is set]) 897 fi 898elif test "$want_libtool" = "yes" -a "$use_libbind" = "no"; then 899 AC_MSG_WARN([embedded dynamic bind libraries must be installed]) 900fi 901AM_CONDITIONAL(INSTALL_BIND, test "$want_install_bind" = "yes") 902 903# OpenLDAP support. 904AC_ARG_WITH(ldap, 905 AS_HELP_STRING([--with-ldap],[enable OpenLDAP support in dhcpd (default is no)]), 906 [ldap=$withval], 907 [ldap=no]) 908 909# OpenLDAP with SSL support. 910AC_ARG_WITH(ldapcrypto, 911 AS_HELP_STRING([--with-ldapcrypto],[enable OpenLDAP crypto support in dhcpd (default is no)]), 912 [ldapcrypto=$withval], 913 [ldapcrypto=no]) 914 915# Gssapi to allow LDAP to authenticate with a keytab 916AC_ARG_WITH(ldap-gssapi, 917 AC_HELP_STRING([--with-ldap-gssapi], 918 [enable krb5/gssapi authentication for OpenLDAP in dhcpd (default is no)]), 919 [ldap_gssapi=$withval], 920 [ldap_gssapi=no]) 921 922 923# LDAP CASA auth support. 924AC_ARG_WITH(ldapcasa, 925 AC_HELP_STRING([--with-ldapcasa], 926 [enable LDAP CASA auth support in dhcpd (default is no)]), 927 [ldapcasa=$withval], 928 [ldapcasa=no]) 929 930# OpenLDAP support is disabled by default, if enabled then SSL support is an 931# extra optional that is also disabled by default. Enabling LDAP SSL support 932# implies enabling LDAP support. Similarly, KRB5 support implies LDAP support, 933# but doesn't include SSL. The two are not dependant. 934if test x$ldap = xyes || test x$ldapcrypto = xyes || test x$ldap_gssapi = xyes; then 935 saved_LIBS="$LIBS" 936 LIBS="" 937 AC_SEARCH_LIBS(ldap_initialize, [ldap], , 938 AC_MSG_FAILURE([*** Cannot find ldap_initialize with -lldap - do you need to install an OpenLDAP2 Devel package?])) 939 AC_SEARCH_LIBS(ber_pvt_opt_on, [lber], , 940 AC_MSG_FAILURE([*** Cannot find ber_pvt_opt_on with -llber - do you need to install an OpenLDAP2 Devel package?])) 941 if test x$ldap_gssapi = xyes ; then 942 AC_SEARCH_LIBS(krb5_init_context, [krb5], , 943 AC_MSG_FAILURE([*** Cannot find krb5_init_context with -lkrb5 - do you need to install a Kerberos Devel package?])) 944 fi 945 946 # Create LDAP_LIBS which we specify them explicitly rather than lumping them in with LIBS 947 AC_SUBST(LDAP_LIBS, [$LIBS]) 948 LIBS="$saved_LIBS" 949 950 951 AC_CHECK_HEADERS([ldap.h]) 952 AC_CHECK_FUNCS([inet_pton inet_ntop]) 953 954 955 LDAP_CFLAGS="-DLDAP_CONFIGURATION" 956 957 if test x$ldapcasa = xyes ; then 958 AC_CHECK_HEADERS([micasa_mgmd.h],[ 959 LDAP_CFLAGS="$LDAP_CFLAGS -DLDAP_CASA_AUTH" 960 ], AC_MSG_FAILURE([*** Cannot find micasa_mgmd.h for ldap casa auth support])) 961 fi 962 963 if test x$ldapcrypto = xyes ; then 964 LDAP_CFLAGS="$LDAP_CFLAGS -DLDAP_USE_SSL" 965 fi 966 967 if test x$ldap_gssapi = xyes; then 968 LDAP_CFLAGS="$LDAP_CFLAGS -DLDAP_USE_GSSAPI" 969 fi 970 971 AC_SUBST(LDAP_CFLAGS, [$LDAP_CFLAGS]) 972fi 973 974# Append selected warning levels to CFLAGS before substitution (but after 975# AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[],[]) & etc). 976CFLAGS="$CFLAGS $STD_CWARNINGS" 977 978# Try to add the bind and dhcp include directories 979CFLAGS="$CFLAGS -I\$(top_srcdir)/includes -I$BINDDIR/include" 980 981case "$host" in 982*-darwin*) 983 CFLAGS="$CFLAGS -D__APPLE_USE_RFC_3542";; 984*-solaris*) 985 # As of Solaris 11, ethernet dev files are in /dev/net 986 AC_CHECK_FILE(/dev/net, 987 [AC_DEFINE([USE_DEV_NET], [1], 988 [Define to 1 if ethernet devices are in /dev/net])]) 989 ;; 990esac 991 992AC_C_FLEXIBLE_ARRAY_MEMBER 993 994AC_CONFIG_FILES([ 995 Makefile 996 client/Makefile 997 client/tests/Makefile 998 common/Makefile.am 999 common/Makefile 1000 common/tests/Makefile 1001 dhcpctl/Makefile.am 1002 dhcpctl/Makefile 1003 includes/Makefile 1004 keama/Makefile 1005 omapip/Makefile.am 1006 omapip/Makefile 1007 relay/Makefile 1008 relay/tests/Makefile 1009 server/Makefile 1010 tests/Makefile.am 1011 tests/Makefile 1012 tests/unittest.sh 1013 server/tests/Makefile 1014 doc/devel/doxyfile 1015]) 1016AC_OUTPUT 1017 1018AC_MSG_NOTICE([postconfig: run automake in $srcdir]) 1019(cd $srcdir; automake) 1020AC_MSG_NOTICE([postconfig: rerun config.status]) 1021sh ./config.status 1022 1023if test "$enable_dhcpv4o6" = "yes"; then 1024 DHCP_VERSIONS="DHCPv4, DHCPv6 and DHCPv4-over-DHCPv6" 1025elif test "$enable_dhcpv6" != "no"; then 1026 DHCP_VERSIONS="DHCPv4 and DHCPv6" 1027else 1028 DHCP_VERSIONS="DHCPv4" 1029fi 1030 1031cat > config.report << END 1032 1033 ISC DHCP source configure results: 1034 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 1035 1036Package: 1037 Name: $PACKAGE_NAME 1038 Version: $PACKAGE_VERSION 1039 1040C Compiler: $CC 1041 1042Flags: 1043 DEFS: $DEFS 1044 CFLAGS: $CFLAGS 1045 1046DHCP versions: $DHCP_VERSIONS 1047 1048Features: 1049 debug: $enable_debug 1050 failover: $enable_failover 1051 execute: $enable_execute 1052 binary-leases: $enable_binary_leases 1053 dhcpv6: $enable_dhcpv6 1054 delayed-ack: $enable_delayed_ack 1055 dhcpv4o6: $enable_dhcpv4o6 1056 relay-port: $enable_relay_port 1057 1058Developer: 1059 ATF unittests : $atf_path 1060 1061END 1062# TODO: Add Perl system tests 1063 1064if test "$atf_path" != "no" 1065then 1066echo "ATF_CFLAGS : $ATF_CFLAGS" >> config.report 1067echo "ATF_LDFLAGS : $ATF_LDFLAGS" >> config.report 1068echo "ATF_BIN : $ATF_BIN" >> config.report 1069echo 1070fi 1071 1072cat config.report 1073 1074echo 1075echo Now you can type "make" to build ISC DHCP 1076echo 1077