configure.ac 15.2 KB
Newer Older
1 2 3
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

4
AC_PREREQ([2.59])
5
AC_INIT(bind10-devel, 20100318, bind10-dev@isc.org)
6 7 8 9 10 11 12
AC_CONFIG_SRCDIR(README)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
13 14
AC_PROG_LIBTOOL

15 16 17
# Use C++ language
AC_LANG_CPLUSPLUS

18
m4_define([_AM_PYTHON_INTERPRETER_LIST], [python python3 python3.1])
19 20
AC_ARG_WITH([pythonpath],
AC_HELP_STRING([--with-pythonpath=PATH],
21
  [specify an absolute path to python executable when automatic version check (incorrectly) fails]),
22 23 24 25
  [python_path="$withval"], [python_path="auto"])
if test "$python_path" = auto; then
	AM_PATH_PYTHON([3.1])
else
26 27
	# Older versions of automake can't handle python3 well.  This is an
	# in-house workaround for them.
28 29
	PYTHON=$python_path
	AC_SUBST(PYTHON)
30 31 32 33
	PYTHON_PREFIX='${prefix}'
	AC_SUBST(PYTHON_PREFIX)
	PYTHON_EXEC_PREFIX='$(exec_prefix)'
	AC_SUBST(PYTHON_EXEC_PREFIX)
34 35 36 37
	PYTHON_VERSION=[`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`]
	if test `echo "$PYTHON_VERSION >= 3.1" | bc` != 1 ; then
		AC_MSG_ERROR(["Python version too old: $PYTHON_VERSION, need 3.1 or higher"])
	fi
38 39
	AC_SUBST(PYTHON_VERSION)
	PYTHON_PLATFORM=`$PYTHON -c "import sys; print(sys.platform)"`
40
	AC_SUBST(PYTHON_PLATFORM)
41
	pythondir='${prefix}/lib/python'$PYTHON_VERSION'/site-packages'
42
	AC_SUBST(pythondir)
43
	pkgpythondir='${pythondir}/'$PACKAGE
44
	AC_SUBST(pkgpythondir)
45
	pyexecdir='${exec_prefix}/lib/python'$PYTHON_VERSION'/site-packages'
46
	AC_SUBST(pyexecdir)
47
	pkgpyexecdir='${pyexecdir}/'$PACKAGE
48
	AC_SUBST(pkgpyexecdir)
49
fi
50

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
# Check for python development environments
if test -x ${PYTHON}-config; then
	PYTHON_INCLUDES=`${PYTHON}-config --includes`

	for flag in `${PYTHON}-config --ldflags`; do
		# add any '-L..." flags to PYTHON_LDFLAGS
		flag=`echo $flag | sed -ne 's/^\(\-L.*\)$/\1/p'`
		if test "X${flag}" != X; then
			PYTHON_LDFLAGS="$PYTHON_LDFLAGS ${flag}"
		fi
	done
	# on some platforms, ${PYTHON}-config --ldflags doesn't provide a -L
	# option while having the library under a non trivial directory.
	# as a workaround we try the "lib" sub directory under the common
	# prefix for this python.
	if test -z "${PYTHON_LDFLAGS}"; then
		PYTHON_LDFLAGS="-L`${PYTHON}-config --prefix`/lib"
	fi
else
	if test "X$PYTHON_INCLUDES" = X -o "X$PYTHON_LDFLAGS" = X; then
		AC_MSG_WARN([${PYTHON}-config does not exist or is not executable, so we could not detect python development environment.  Your system may require an additional package (e.g. "python3-dev").  Alternatively, if you are sure you have python headers and libraries, define PYTHON_INCLUDES and PYTHON_LDFLAGS and run this script.])
72 73
	fi
fi
74
AC_SUBST(PYTHON_INCLUDES)
75 76 77 78 79 80 81 82 83 84 85 86 87
AC_SUBST(PYTHON_LDFLAGS)

# Check for python library (not absolutely mandatory, but needed for
# Boost.Python when we use it.  See below.)
LDFLAGS_SAVED="$LDFLAGS"
LDFLAGS="$LDFLAGS $PYTHON_LDFLAGS"
python_bin="python${PYTHON_VERSION}"
AC_CHECK_LIB($python_bin, main, python_lib=$python_bin, python_lib=no)
if test $python_lib != "no"; then
	PYTHON_LIB="-l$python_lib"
fi
AC_SUBST(PYTHON_LIB)

88 89
# TODO: check for _sqlite3.py module

90 91 92 93 94 95 96 97 98 99 100 101 102
#
# B10_CXXFLAGS is the default C++ compiler flags.  This will (and should) be
# used as the default value for each specifc AM_CXXFLAGS:
# AM_CXXFLAGS = $(B10_CXXFLAGS)
# AM_CXXFLAGS += ... # add module specific flags
# We need this so that we can disable some specific compiler warnings per
# module basis; since AM_CXXFLAGS are placed before CXXFLAGS, and since
# gcc's -Wno-XXX option must be specified after -Wall or -Wextra, we cannot
# specify the default warning flags in CXXFLAGS and let specific modules
# "override" the default.
#
B10_CXXFLAGS=

103
if test "X$GCC" = "Xyes"; then
104
B10_CXXFLAGS="-g -Wall -Wextra -Wwrite-strings -Woverloaded-virtual -Wno-sign-compare"
JINMEI Tatuya's avatar
JINMEI Tatuya committed
105
UNUSED_PARAM_ATTRIBUTE='__attribute__((unused))'
106 107 108 109 110 111

# Certain versions of gcc (g++) have a bug that incorrectly warns about
# the use of anonymous name spaces even if they're closed in a single
# translation unit.  For these versions we have to disable -Werror.
werror_ok=0
CXXFLAGS_SAVED="$CXXFLAGS"
112
CXXFLAGS="$CXXFLAGS $B10_CXXFLAGS -Werror"
113 114 115 116
AC_MSG_CHECKING(for in-TU anonymous namespace breakage)
AC_TRY_COMPILE([namespace { class Foo {}; }
namespace isc {class Bar {Foo foo_;};} ],,
	[AC_MSG_RESULT(no)
117 118
	 werror_ok=1
	 B10_CXXFLAGS="$B10_CXXFLAGS -Werror"],
119 120
	[AC_MSG_RESULT(yes)])
CXXFLAGS="$CXXFLAGS_SAVED"
121 122
fi				dnl GCC = yes

123
AM_CONDITIONAL(GCC_WERROR_OK, test $werror_ok = 1)
124
AC_DEFINE_UNQUOTED(UNUSED_PARAM, $UNUSED_PARAM_ATTRIBUTE, Define to compiler keyword indicating a function argument is intentionally unused)
125 126 127

# produce PIC unless we disable shared libraries. need this for python bindings.
if test $enable_shared != "no" -a "X$GCC" = "Xyes"; then
128
   B10_CXXFLAGS="$B10_CXXFLAGS -fPIC"
129 130
fi

131 132
AC_SUBST(B10_CXXFLAGS)

133 134
# Checks for libraries.

135 136 137
AC_SEARCH_LIBS(inet_pton, [nsl])
AC_SEARCH_LIBS(recvfrom, [socket])

138 139 140 141 142 143
# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_TYPE_SIZE_T

144 145 146 147 148 149 150 151 152
AC_MSG_CHECKING(for sa_len in struct sockaddr)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>],
[struct sockaddr sa; sa.sa_len = 0; return (0);],
        [AC_MSG_RESULT(yes)
        AC_DEFINE(HAVE_SIN_LEN, 1, Define to 1 if sockaddr_in has a sin_len member)],
        AC_MSG_RESULT(no))

153
AC_ARG_WITH(lcov,
154
[  --with-lcov[=PROGRAM]         enable gtest and coverage target using the specified lcov], lcov="$withval", lcov="no")
155

156
AC_ARG_WITH(gtest,
157
[  --with-gtest=PATH       specify a path to gtest header files (PATH/include) and library (PATH/lib)],
158
    gtest_path="$withval", gtest_path="no")
159 160 161 162 163 164


USE_LCOV="no"
if test "$lcov" != "no"; then
	# force gtest if not set
	if test "$gtest_path" = "no"; then
165 166
#		AC_MSG_ERROR("lcov needs gtest for test coverage report")
		AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests])
167 168 169
		gtest_path="yes"
	fi
	if test "$lcov" != "yes"; then
170
		LCOV=$lcov
171
	else
172
		AC_PATH_PROG([LCOV], [lcov])
173
	fi
174 175 176 177
	if test -x "${LCOV}"; then
		USE_LCOV="yes"
	else
		AC_MSG_ERROR([Cannot find lcov.])
178 179 180 181 182 183
	fi
	# is genhtml always in the same directory?
	GENHTML=`echo "$LCOV" | sed s/lcov$/genhtml/`
	if test ! -x $GENHTML; then
		AC_MSG_ERROR([genhtml not found, needed for lcov])
	fi
184
	# GCC specific?
185
	CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage"
186
	LIBS=" $LIBS -lgcov"
187 188 189 190 191 192 193
	AC_SUBST(CPPFLAGS)
	AC_SUBST(LIBS)
	AC_SUBST(LCOV)
	AC_SUBST(GENHTML)
fi
AC_SUBST(USE_LCOV)

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
AC_ARG_WITH([boost-include],
  AC_HELP_STRING([--with-boost-include=PATH],
    [specify exact directory for Boost headers]),
    [boost_include_path="$withval"])
if test "${boost_include_path}" ; then
	BOOST_INCLUDES="-I${boost_include_path}"
	CPPFLAGS="$CPPFLAGS $BOOST_INCLUDES"
fi
AC_SUBST(BOOST_INCLUDES)

AC_ARG_WITH([boost-lib],
AC_HELP_STRING([--with-boost-lib=PATH],
  [specify exact directory for Boost libraries]),
  [if test "$withval" != "yes" -a "$withval" != "no"; then
   BOOST_LDFLAGS="-L$withval"
   fi])
AC_SUBST(BOOST_LDFLAGS)

212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
# Check availability of the Boost Python library

AC_MSG_CHECKING([for boost::python library])
AC_ARG_WITH([boost-python],
AC_HELP_STRING([--with-boost-python],
  [specify whether to use the boost python library]),
  [with_boost_python="$withval"], [with_boost_python="auto"])
if test "$with_boost_python" != "no"; then
	if test "$with_boost_python" != "auto" -a "X$PYTHON_LIB" = X; then
		AC_MSG_ERROR([Boost.Python requested but python library is not available])
	fi
	LDFLAGS_SAVED="$LDFLAGS"
	LIBS_SAVED="$LIBS"
	CPPFLAGS_SAVED="$CPPFLAGS"
	CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"

	for BOOST_TRY_LIB in boost_python boost_python-mt; do
		LDFLAGS="$LDFLAGS_SAVED ${BOOST_LDFLAGS} ${PYTHON_LDFLAGS}"
		LIBS="$LIBS_SAVED -l${BOOST_TRY_LIB} ${PYTHON_LIB}"
		AC_TRY_LINK([#include <boost/python/module.hpp>
	      using namespace boost::python;
	      BOOST_PYTHON_MODULE(test) { throw "Boost::Python test."; }],
			[ return 0; ],
			[ AC_MSG_RESULT(yes)
			BOOST_PYTHON_LIB="-l${BOOST_TRY_LIB}"
			],[])
		if test "X${BOOST_PYTHON_LIB}" != X; then
        		break
		fi
	done

	LDFLAGS="$LDFLAGS_SAVED"
	CPPFLAGS="$CPPFLAGS_SAVED"
	LIBS="$LIBS_SAVED"
fi

if test "X${BOOST_PYTHON_LIB}" = X; then
	AC_MSG_RESULT(no)
	if test "$with_boost_python" = "yes"; then
	   AC_MSG_ERROR([boost python library is requested but not found])
	fi
else
	AC_DEFINE(HAVE_BOOST_PYTHON, 1, Define to 1 if boost python library is available)
fi

AM_CONDITIONAL(HAVE_BOOST_PYTHON, test "X${BOOST_PYTHON_LIB}" != X)
AC_SUBST(BOOST_PYTHON_LIB)

260
#
261
# Check availability of gtest, which will be used for unit tests.
262
#
263
if test "$gtest_path" != "no"
264
then
265 266
	if test "$gtest_path" != "yes"; then
		GTEST_PATHS=$gtest_path
267 268 269
		if test -x "${gtest_path}/bin/gtest-config" ; then
			GTEST_CONFIG="${gtest_path}/bin/gtest-config"
		fi
270
	else
271
		AC_PATH_PROG([GTEST_CONFIG], [gtest-config])
272
	fi
273 274 275 276 277 278 279 280 281 282
	if test -x "${GTEST_CONFIG}" ; then :
		# using cppflags instead of cxxflags
		GTEST_INCLUDES=`${GTEST_CONFIG} --cppflags`
		GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
		GTEST_LDADD=`${GTEST_CONFIG} --libs`
		GTEST_FOUND="true"
	else
		AC_MSG_WARN([Unable to locate Google Test gtest-config.])
		if test -z "${GTEST_PATHS}" ; then
			GTEST_PATHS="/usr /usr/local"
283
		fi
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
		GTEST_FOUND="false"
	fi
	if test "${GTEST_FOUND}" != "true"; then
		GTEST_FOUND="false"
		for dir in $GTEST_PATHS; do
			if test -f "$dir/include/gtest/gtest.h"; then
				GTEST_INCLUDES="-I$dir/include"
				GTEST_LDFLAGS="-L$dir/lib"
				GTEST_LDADD="-lgtest"
				GTEST_FOUND="true"
				break
			fi
		done
	fi
	if test "${GTEST_FOUND}" != "true"; then
299 300
		AC_MSG_ERROR([Cannot find gtest in: $GTEST_PATHS])
	fi
301
else
302 303 304
	GTEST_INCLUDES=
	GTEST_LDFLAGS=
	GTEST_LDADD=
305
fi
306 307 308 309
AM_CONDITIONAL(HAVE_GTEST, test $gtest_path != "no")
AC_SUBST(GTEST_INCLUDES)
AC_SUBST(GTEST_LDFLAGS)
AC_SUBST(GTEST_LDADD)
310

311
PKG_CHECK_MODULES(SQLITE, sqlite3 >= 3.3.9, enable_features="$enable_features SQLite3")
312

313 314 315
# Use local ASIO headers from ext
CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/asio"

316 317
# Check for headers from required devel kits.
# boost/shared_ptr.hpp is in ext in svn but not in tarball.
318 319 320 321
CPPFLAGS_SAVED=$CPPFLAGS
if test "X$BOOST_INCLUDES" = "X"; then
	# abs_top_srcdir not defined yet
	# so this is only useful to check.  We'll replace it after the check.
322
	CPPFLAGS="$CPPFLAGS -Iext/boost"
323
fi
324
AC_CHECK_HEADERS([boost/shared_ptr.hpp boost/foreach.hpp],,
325
  AC_MSG_ERROR([Missing required header files.]))
326 327
CPPFLAGS=$CPPFLAGS_SAVED
if test "X$BOOST_INCLUDES" = "X"; then
328
	CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/boost"
329
fi
330

331 332 333 334
AC_ARG_ENABLE(man, [AC_HELP_STRING([--enable-man],
  [regenerate man pages [default=no]])] ,enable_man=yes, enable_man=no)

AM_CONDITIONAL(ENABLE_MAN, test x$enable_man != xno)
335

336 337 338
AC_ARG_ENABLE(install-configurations,
  [AC_HELP_STRING([--disable-install-configurations],
  [do not install configuration])], install_configurations=$enableval, install_configurations=yes)
339

340
AM_CONDITIONAL(INSTALL_CONFIGURATIONS, test x$install_configurations = xyes || test x$install_configurations = xtrue)
341

342 343
AC_CONFIG_FILES([Makefile
                 src/Makefile
344
                 src/bin/Makefile
345
                 src/bin/bind10/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
346
                 src/bin/bind10/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
347
                 src/bin/cmdctl/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
348
                 src/bin/cmdctl/tests/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
349
                 src/bin/bindctl/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
350
                 src/bin/bindctl/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
351
                 src/bin/cfgmgr/Makefile
352
                 src/bin/host/Makefile
Evan Hunt's avatar
Evan Hunt committed
353
                 src/bin/loadzone/Makefile
354
                 src/bin/msgq/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
355
                 src/bin/msgq/tests/Makefile
356
                 src/bin/auth/Makefile
JINMEI Tatuya's avatar
JINMEI Tatuya committed
357
                 src/bin/auth/tests/Makefile
Likun Zhang's avatar
Likun Zhang committed
358
                 src/bin/xfrin/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
359
                 src/bin/xfrin/tests/Makefile
360
                 src/bin/xfrout/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
361
                 src/bin/xfrout/tests/Makefile
362
                 src/bin/usermgr/Makefile
363
                 src/lib/Makefile
364
                 src/lib/cc/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
365 366
                 src/lib/python/Makefile
                 src/lib/python/isc/Makefile
Evan Hunt's avatar
Evan Hunt committed
367
                 src/lib/python/isc/datasrc/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
368
                 src/lib/python/isc/cc/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
369
                 src/lib/python/isc/cc/tests/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
370
                 src/lib/python/isc/config/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
371
                 src/lib/python/isc/config/tests/Makefile
372
                 src/lib/config/Makefile
373
                 src/lib/config/tests/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
374
                 src/lib/dns/Makefile
Jeremy C. Reed's avatar
Jeremy C. Reed committed
375
                 src/lib/dns/tests/Makefile
376
                 src/lib/exceptions/Makefile
Evan Hunt's avatar
Evan Hunt committed
377 378
                 src/lib/datasrc/Makefile
                 src/lib/datasrc/tests/Makefile
379
                 src/lib/xfr/Makefile
Jelte Jansen's avatar
Jelte Jansen committed
380
               ])
381
AC_OUTPUT([src/bin/cfgmgr/b10-cfgmgr.py
382
           src/bin/cmdctl/cmdctl.py
383
           src/bin/cmdctl/run_b10-cmdctl.sh
384 385
           src/bin/cmdctl/tests/cmdctl_test
           src/bin/xfrin/tests/xfrin_test
Likun Zhang's avatar
Likun Zhang committed
386
           src/bin/xfrin/xfrin.py
387
           src/bin/xfrin/xfrin.spec.pre
Likun Zhang's avatar
Likun Zhang committed
388
           src/bin/xfrin/run_b10-xfrin.sh
389
           src/bin/xfrout/xfrout.py
390
           src/bin/xfrout/xfrout.spec.pre
Likun Zhang's avatar
Likun Zhang committed
391
           src/bin/xfrout/tests/xfrout_test
392
           src/bin/xfrout/run_b10-xfrout.sh
393
           src/bin/bind10/bind10.py
394
           src/bin/bind10/tests/bind10_test
395
           src/bin/bind10/run_bind10.sh
396
           src/bin/bindctl/run_bindctl.sh
397
           src/bin/bindctl/bindctl-source.py
398
           src/bin/bindctl/tests/bindctl_test
399
           src/bin/loadzone/run_loadzone.sh
Evan Hunt's avatar
Evan Hunt committed
400
           src/bin/loadzone/b10-loadzone.py
401 402
           src/bin/usermgr/run_b10-cmdctl-usermgr.sh
           src/bin/usermgr/b10-cmdctl-usermgr.py
403
           src/bin/msgq/msgq.py
Jeremy C. Reed's avatar
Jeremy C. Reed committed
404
           src/bin/msgq/tests/msgq_test
405
           src/bin/msgq/run_msgq.sh
406
           src/bin/auth/auth.spec.pre
407
           src/bin/auth/spec_config.h.pre
408 409
           src/lib/config/tests/data_def_unittests_config.h
           src/lib/python/isc/config/tests/config_test
410
           src/lib/python/isc/cc/tests/cc_test
Jeremy C. Reed's avatar
Jeremy C. Reed committed
411 412
           src/lib/dns/gen-rdatacode.py
           src/lib/dns/tests/testdata/gen-wiredata.py
413
          ], [
414
           chmod +x src/bin/cmdctl/run_b10-cmdctl.sh
Likun Zhang's avatar
Likun Zhang committed
415
           chmod +x src/bin/xfrin/run_b10-xfrin.sh
416
           chmod +x src/bin/xfrout/run_b10-xfrout.sh
417
           chmod +x src/bin/bind10/run_bind10.sh
418 419
           chmod +x src/bin/cmdctl/tests/cmdctl_test
           chmod +x src/bin/xfrin/tests/xfrin_test
Likun Zhang's avatar
Likun Zhang committed
420
           chmod +x src/bin/xfrout/tests/xfrout_test
421
           chmod +x src/bin/bindctl/tests/bindctl_test
422 423
           chmod +x src/bin/bindctl/run_bindctl.sh
           chmod +x src/bin/loadzone/run_loadzone.sh
424
           chmod +x src/bin/usermgr/run_b10-cmdctl-usermgr.sh
425
           chmod +x src/bin/msgq/run_msgq.sh
Jeremy C. Reed's avatar
Jeremy C. Reed committed
426
           chmod +x src/bin/msgq/tests/msgq_test
Jeremy C. Reed's avatar
Jeremy C. Reed committed
427 428
           chmod +x src/lib/dns/gen-rdatacode.py
           chmod +x src/lib/dns/tests/testdata/gen-wiredata.py
429
          ])
430
AC_OUTPUT
431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448

dnl Print the results
dnl

cat > config.report << END

     BIND 10 source configure results:
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Package:
  Name:          $PACKAGE_NAME
  Version:       $PACKAGE_VERSION

Flags:
  DEFS:          $DEFS
  CPPFLAGS:      $CPPFLAGS
  CFLAGS:        $CFLAGS
  CXXFLAGS:      $CXXFLAGS
449
  B10_CXXFLAGS:  $B10_CXXFLAGS
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
dnl includes too
  Boost Python:  $BOOST_PYTHON_LIB
  SQLite:	 $SQLITE_CFLAGS
                 $SQLITE_LIBS

Features:
  $enable_features

Developer:
  Google Tests:  $gtest_path
  Code Coverage: $USE_LCOV
  Generate Manuals:  $enable_man

END

cat config.report
cat <<EOF

  Now you can type "make" to build BIND 10

EOF