See ChangeLog: Sat Jun 26 12:15:59 CEST 1999 Werner Koch
[gnupg.git] / configure.in
1 dnl
2 dnl Configure template for GNUPG
3 dnl
4 dnl (Process this file with autoconf to produce a configure script.)
5 AC_REVISION($Revision$)dnl
6
7 dnl Must reset CDPATH so that bash's cd does not print to stdout
8 CDPATH=
9
10 AC_PREREQ(2.13)
11 AC_INIT(g10/g10.c)
12 AC_CONFIG_AUX_DIR(scripts)
13 AM_CONFIG_HEADER(config.h)
14
15
16 VERSION=`cat $srcdir/VERSION`
17 PACKAGE=gnupg
18 ALL_LINGUAS="de es_ES fr it pl pt_BR ru"
19 static_modules="sha1 md5 rmd160"
20 AC_SUBST(VERSION)
21 AC_SUBST(PACKAGE)
22 AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
23 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
24
25 MODULES_IN_CIPHER=`awk '/# MODULES: / { for(i=3;i<=NF;i++) print $i}' \
26                                                 $srcdir/cipher/Makefile.am`
27
28 dnl
29 dnl  Check for random module options
30 dnl
31 dnl  Fixme: get the list of available modules from MODULES_IN_CIPHER
32 dnl         and check against this list
33
34 AC_MSG_CHECKING([which static random module to use])
35 AC_ARG_ENABLE(static-rnd,
36     [  --enable-static-rnd=[egd|unix|linux|none]  ],
37 [use_static_rnd=$enableval], [use_static_rnd=default] )
38
39 if test "$use_static_rnd" = no; then
40     use_static_rnd=default
41 fi
42
43 case "$use_static_rnd" in
44     egd | linux | unix | none | default )
45       AC_MSG_RESULT($use_static_rnd)
46       ;;
47     * )
48       AC_MSG_RESULT(invalid argument)
49       AC_MSG_ERROR(there is no random module rnd$use_static_rnd)
50       ;;
51 esac
52
53 dnl
54 dnl See whether the user wants to disable checking for /dev/random
55
56 AC_MSG_CHECKING([whether use of /dev/random is requested])
57 AC_ARG_ENABLE(dev-random,
58 [  --disable-dev-random    disable the use of dev random],
59     try_dev_random=$enableval, try_dev_random=yes)
60 AC_MSG_RESULT($try_dev_random)
61
62
63 dnl
64 dnl  Check other options
65 dnl
66
67 AC_MSG_CHECKING([whether use of extensions is requested])
68 AC_ARG_ENABLE(dynload,
69 [  --disable-dynload       disable use of extensions],
70     try_dynload=$enableval, try_dynload=yes)
71 AC_MSG_RESULT($try_dynload)
72
73 AC_MSG_CHECKING([whether assembler modules are requested])
74 AC_ARG_ENABLE(asm,
75 [  --disable-asm           do not use assembler modules],
76      try_asm_modules=$enableval, try_asm_modules=yes)
77 AC_MSG_RESULT($try_asm_modules)
78
79 AC_MSG_CHECKING([whether memory debugging is requested])
80 AC_ARG_ENABLE(m-debug,
81 [  --enable-m-debug        enable debugging of memory allocation],
82 use_m_debug=$enableval, use_m_debug=no)
83 AC_MSG_RESULT($use_m_debug)
84 if test "$use_m_debug" = yes; then
85     AC_DEFINE(M_DEBUG)
86     use_m_guard=yes
87 else
88     AC_MSG_CHECKING([whether memory guard is requested])
89     AC_ARG_ENABLE(m-guard,
90     [  --enable-m-guard        enable memory guard facility],
91     use_m_guard=$enableval, use_m_guard=no)
92     AC_MSG_RESULT($use_m_guard)
93 fi
94 if test "$use_m_guard" = yes ; then
95     AC_DEFINE(M_GUARD)
96 fi
97
98
99 AC_MSG_CHECKING([whether included zlib is requested])
100 AC_ARG_WITH(included-zlib,
101     [  --with-included-zlib    use the zlib code included here],
102 [g10_force_zlib=yes], [g10_force_zlib=no] )
103 AC_MSG_RESULT($g10_force_zlib)
104
105 dnl
106 dnl Check wether we want to compile libgcrypt
107 dnl
108 AC_MSG_CHECKING([whether compilation of libgcrypt is requested])
109 AC_ARG_ENABLE(libgcrypt,
110     [  --enable-libgcrypt      compile the libgcrypt [default=no]],
111 [compile_libgcrypt="$enableval"],[compile_libgcrypt=no])
112 AM_CONDITIONAL(COMPILE_LIBGCRYPT, test x$compile_libgcrypt = xyes)
113 AC_MSG_RESULT($compile_libgcrypt)
114
115
116 dnl Checks for programs.
117
118 AC_CANONICAL_SYSTEM
119 AC_ARG_PROGRAM
120 AC_PROG_MAKE_SET
121 AM_SANITY_CHECK
122 missing_dir=`cd $ac_aux_dir && pwd`
123 AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
124 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
125 AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
126 AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
127 dnl AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
128 AC_PROG_CC
129 AC_PROG_CPP
130 AC_ISC_POSIX
131 AC_PROG_INSTALL
132 AC_PROG_RANLIB
133 AC_CHECK_PROG(DOCBOOK_TO_MAN, docbook-to-man, yes, no)
134 AM_CONDITIONAL(HAVE_DOCBOOK_TO_MAN, test "$ac_cv_prog_DOCBOOK_TO_MAN" = yes)
135
136
137
138 if test x$compile_libgcrypt = xyes; then
139    dnl Don't default to build shared libs
140    AM_DISABLE_SHARED
141    AM_PROG_LIBTOOL
142 fi
143
144
145 MPI_OPT_FLAGS=""
146 if test "$GCC" = yes; then
147     CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
148 fi
149
150
151 try_gettext=yes
152 try_gdbm=yes
153 case "${target}" in
154     i386--mingw32)
155         # special stuff for Windoze NT
156         cross_compiling=yes
157         CC="i386--mingw32-gcc"
158         CPP="i386--mingw32-gcc -E"
159         RANLIB="i386--mingw32-ranlib"
160         ac_cv_have_dev_random=no
161         AC_DEFINE(USE_ONLY_8DOT3)
162         AC_DEFINE(HAVE_DRIVE_LETTERS)
163         AC_DEFINE(HAVE_DOSISH_SYSTEM)
164         try_gettext="no"
165         try_gdbm="no"
166         ;;
167     i386-emx-os2 | i[3456]86-pc-os2emx )
168         # OS/2 with the EMX environment
169         ac_cv_have_dev_random=no
170         AC_DEFINE(HAVE_DRIVE_LETTERS)
171         AC_DEFINE(HAVE_DOSISH_SYSTEM)
172         try_gettext="no"
173         try_gdbm="no"
174         ;;
175     *-*-hpux*)
176         if test -z "$GCC" ; then
177             CFLAGS="$CFLAGS -Ae -D_HPUX_SOURCE"
178         fi
179         ;;
180     *-dec-osf4*)
181         if test -z "$GCC" ; then
182             # Suppress all warnings
183             # to get rid of the unsigned/signed char mismatch warnings.
184             CFLAGS="$CFLAGS -w"
185         fi
186         ;;
187     m68k-atari-mint)
188         ;;
189     *)
190        ;;
191 esac
192
193 AC_SUBST(MPI_OPT_FLAGS)
194 GNUPG_SYS_SYMBOL_UNDERSCORE
195 GNUPG_CHECK_PIC
196 GNUPG_CHECK_RDYNAMIC
197 if test "$NO_PIC" = yes; then
198     try_dynload=no
199 fi
200
201
202 case "${target}" in
203     i386--mingw32)
204         PRINTABLE_OS_NAME="MingW32"
205         ;;
206     i386-emx-os2 | i[3456]86-pc-os2emx)
207         PRINTABLE_OS_NAME="OS/2"
208         ;;
209     *-linux*)
210         PRINTABLE_OS_NAME="GNU/Linux"
211         ;;
212     *)
213         PRINTABLE_OS_NAME=`uname -s || echo "Unknown"`
214         ;;
215 esac
216 AC_DEFINE_UNQUOTED(PRINTABLE_OS_NAME, "$PRINTABLE_OS_NAME")
217
218 dnl  Fixme: Are these the best flags for OpenBSD????
219 dnl (I have removed the -lc from * ...CFLAGS for test purposes.)
220 case "${target}" in
221     *-openbsd*)
222         NAME_OF_DEV_RANDOM="/dev/srandom"
223         NAME_OF_DEV_URANDOM="/dev/urandom"
224         DYNLINK_MOD_CFLAGS="-shared -rdynamic -fpic -Wl,-Bshareable -Wl,-x"
225         ;;
226     *)
227         NAME_OF_DEV_RANDOM="/dev/random"
228         NAME_OF_DEV_URANDOM="/dev/urandom"
229         DYNLINK_MOD_CFLAGS="-shared $CFLAGS_PIC"
230         ;;
231 esac
232 AC_DEFINE_UNQUOTED(NAME_OF_DEV_RANDOM, "$NAME_OF_DEV_RANDOM")
233 AC_DEFINE_UNQUOTED(NAME_OF_DEV_URANDOM, "$NAME_OF_DEV_URANDOM")
234 AC_SUBST(MPI_OPT_FLAGS)
235
236
237 dnl Checks for libraries.
238
239 if test "$try_gettext" = yes; then
240 AM_GNU_GETTEXT
241 else
242 USE_NLS=no
243 USE_INCLUDED_LIBINTL=no
244 AC_SUBST(USE_NLS)
245 AC_SUBST(USE_INCLUDED_LIBINTL)
246 fi
247
248 dnl
249 dnl There are lot of misconfigured systems.  We include
250 dnl gdbm support only if the lib and the header is installed.
251 dnl
252 if test "$try_gdbm" = yes; then
253 AC_CHECK_HEADERS(gdbm.h)
254 if test "$ac_cv_header_gdbm_h" = yes ; then
255   AC_CHECK_LIB(gdbm,gdbm_firstkey)
256 fi
257 fi
258
259
260 dnl Solaris needs -lsocket and -lnsl. Unisys system includes
261 dnl gethostbyname in libsocket but needs libnsl for socket.
262 AC_CHECK_LIB(nsl, gethostbyname)
263 AC_CHECK_LIB(socket, socket, ac_need_libsocket=1, ac_try_nsl=1)
264 if test x$ac_need_libsocket = x1; then
265     LIBS="$LIBS -lsocket"
266 fi
267 if test x$ac_try_nsl = x1; then
268     AC_CHECK_LIB(nsl, gethostbyname, ac_need_libnsl=1)
269     if test x$ac_need_libnsl = x1
270     then
271         LIBS="$LIBS -lnsl"
272     fi
273 fi
274
275
276 if test "$try_dynload" = yes ; then
277   AC_CHECK_LIB(dl,dlopen)
278   if test "$ac_cv_lib_dl_dlopen" = "yes"; then
279     AC_DEFINE(USE_DYNAMIC_LINKING)
280     AC_DEFINE(HAVE_DL_DLOPEN)
281     DYNLINK_LDFLAGS="$CFLAGS_RDYNAMIC"
282     use_gnupg_extensions=yes
283   else
284     AC_CHECK_LIB(c,dlopen)
285     if test "$ac_cv_lib_c_dlopen" = "yes"; then
286       AC_DEFINE(USE_DYNAMIC_LINKING)
287       AC_DEFINE(HAVE_DL_DLOPEN)
288       DYNLINK_LDFLAGS="$CFLAGS_RDYNAMIC"
289       use_gnupg_extensions=yes
290     else
291       AC_CHECK_LIB(dld,shl_load)
292       if test "$ac_cv_lib_dld_shl_load" = "yes"; then
293         AC_DEFINE(USE_DYNAMIC_LINKING)
294         AC_DEFINE(HAVE_DL_SHL_LOAD)
295         DYNLINK_LDFLAGS="$CFLAGS_RDYNAMIC"
296         use_gnupg_extensions=yes
297 dnl -----------------
298 dnl  DLD is not ready for use. So I better disable this test
299 dnl
300 dnl    AC_CHECK_LIB(dld,dld_link)
301 dnl    if test "$ac_cv_lib_dld_dld_link" = "yes"; then
302 dnl      AC_DEFINE(USE_DYNAMIC_LINKING)
303 dnl      AC_DEFINE(HAVE_DLD_DLD_LINK)
304 dnl      DYNLINK_LDFLAGS="$CFLAGS_RDYNAMIC"
305 dnl      use_gnupg_extensions=yes
306 dnl ---------------
307       fi
308     fi
309   fi
310 else
311   AC_MSG_CHECKING(for dynamic loading)
312   DYNLINK_LDFLAGS=
313   DYNLINK_MOD_CFLAGS=
314   use_gnupg_extensions=no
315   AC_MSG_RESULT(has been disabled)
316 fi
317
318 AM_CONDITIONAL(ENABLE_GNUPG_EXTENSIONS, test "$use_gnupg_extensions" = yes )
319 AC_SUBST(DYNLINK_LDFLAGS)
320 AC_SUBST(DYNLINK_MOD_CFLAGS)
321
322
323 dnl Checks for header files.
324 AC_HEADER_STDC
325 AC_CHECK_HEADERS(unistd.h langinfo.h)
326
327
328 dnl Checks for typedefs, structures, and compiler characteristics.
329 AC_C_CONST
330 AC_C_INLINE
331 AC_TYPE_SIZE_T
332 AC_TYPE_SIGNAL
333 AC_DECL_SYS_SIGLIST
334
335 GNUPG_CHECK_ENDIAN
336
337
338 GNUPG_CHECK_TYPEDEF(byte, HAVE_BYTE_TYPEDEF)
339 GNUPG_CHECK_TYPEDEF(ushort, HAVE_USHORT_TYPEDEF)
340 GNUPG_CHECK_TYPEDEF(ulong, HAVE_ULONG_TYPEDEF)
341 GNUPG_CHECK_TYPEDEF(u16, HAVE_U16_TYPEDEF)
342 GNUPG_CHECK_TYPEDEF(u32, HAVE_U32_TYPEDEF)
343
344 AC_CHECK_SIZEOF(unsigned short, 2)
345 AC_CHECK_SIZEOF(unsigned int, 4)
346 AC_CHECK_SIZEOF(unsigned long, 4)
347
348 if test "$ac_cv_sizeof_unsigned_short" = "0" \
349    || test "$ac_cv_sizeof_unsigned_int" = "0" \
350    || test "$ac_cv_sizeof_unsigned_long" = "0"; then
351     AC_MSG_WARN([Hmmm, something is wrong with the sizes - using defaults]);
352 fi
353
354
355
356 dnl Checks for library functions.
357 AC_FUNC_VPRINTF
358 AC_CHECK_FUNCS(strerror stpcpy strlwr tcgetattr rand strtoul mmap)
359 AC_CHECK_FUNCS(memmove gettimeofday getrusage gethrtime setrlimit)
360 AC_CHECK_FUNCS(memicmp atexit raise getpagesize strftime nl_langinfo)
361
362 GNUPG_CHECK_MLOCK
363
364 GNUPG_CHECK_IPC
365 if test "$ac_cv_header_sys_shm_h" = "yes"; then
366   AC_DEFINE(USE_SHM_COPROCESSING)
367 fi
368
369 dnl
370 dnl check whether we have a random device
371 dnl
372 if test "$try_dev_random" = yes ; then
373     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
374     [if test -c "$NAME_OF_DEV_RANDOM" && test -c "$NAME_OF_DEV_URANDOM" ; then
375       ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
376     if test "$ac_cv_have_dev_random" = yes; then
377         AC_DEFINE(HAVE_DEV_RANDOM)
378     fi
379 else
380     AC_MSG_CHECKING(for random device)
381     ac_cv_have_dev_random=no
382     AC_MSG_RESULT(has been disabled)
383 fi
384
385 dnl
386 dnl and whether this device supports ioctl
387 dnl (Note, that we should do a real test here)
388 dnl
389 if test "$ac_cv_have_dev_random" = yes ; then
390     AC_CHECK_HEADERS(linux/random.h)
391     AC_CACHE_CHECK(for random device ioctl, ac_cv_have_dev_random_ioctl,
392       [ if test "$ac_cv_header_linux_random_h" = yes ; then
393           ac_cv_have_dev_random_ioctl=yes;
394         else
395           ac_cv_have_dev_random_ioctl=no;
396         fi
397       ])
398     if test "$ac_cv_have_dev_random_ioctl" = yes; then
399         AC_DEFINE(HAVE_DEV_RANDOM_IOCTL)
400     fi
401 fi
402
403
404 dnl
405 dnl Figure out the default linkage mode for cipher modules
406 dnl
407 dnl (We always need a static rmd160)
408 static_modules="$static_modules rmd160"
409 if test "$use_static_rnd" = default; then
410   if test "$ac_cv_have_dev_random" = yes; then
411       static_modules="$static_modules rndlinux"
412   else
413       case "${target}" in
414           i386--mingw32)
415               static_modules="$static_modules rndw32"
416               ;;
417           i386-emx-os2|i[3456]86-pc-os2emx)
418               static_modules="$static_modules rndos2"
419               ;;
420           m68k-atari-mint)
421               static_modules="$static_modules rndatari"
422               ;;
423           *)
424               static_modules="$static_modules rndunix"
425              ;;
426       esac
427   fi
428 else
429   if test "$use_static_rnd" = none; then
430     :
431   else
432     static_modules="$static_modules rnd$use_static_rnd"
433   fi
434 fi
435
436 dnl
437 dnl Parse the modules list and build the list
438 dnl of static and dymically linked modules
439 dnl
440 STATIC_CIPHER_NAMES=""
441 STATIC_CIPHER_OBJS=""
442 DYNAMIC_CIPHER_MODS=""
443 GNUPG_MSG_PRINT([dynamically linked cipher modules:])
444 for name in $MODULES_IN_CIPHER; do
445     x="no"
446     for i in $static_modules; do
447         if test "$name" = "$i" ; then
448             x="yes"
449         fi
450     done;
451     if test $x = yes; then
452         STATIC_CIPHER_NAMES="$STATIC_CIPHER_NAMES $name"
453         STATIC_CIPHER_OBJS="$STATIC_CIPHER_OBJS $name.o"
454     else
455         DYNAMIC_CIPHER_MODS="$DYNAMIC_CIPHER_MODS $name"
456         GNUPG_MSG_PRINT([$name])
457     fi
458 done
459 AC_MSG_RESULT()
460 AC_SUBST(STATIC_CIPHER_OBJS)
461 AC_SUBST(STATIC_CIPHER_NAMES)
462 AC_SUBST(DYNAMIC_CIPHER_MODS)
463
464 dnl
465 dnl And build the constructor file
466 dnl
467
468 test -d cipher || mkdir cipher
469 cat <<G10EOF >cipher/construct.c
470 /* automatically generated by configure - do not edit */
471
472 G10EOF
473 GNUPG_MSG_PRINT([statically linked cipher modules:])
474 for name in $STATIC_CIPHER_NAMES; do
475     echo "void ${name}_constructor(void);" >>cipher/construct.c
476     GNUPG_MSG_PRINT([$name])
477 done
478 AC_MSG_RESULT()
479 cat <<G10EOF >>cipher/construct.c
480
481 void
482 cipher_modules_constructor(void)
483 {
484     static int done = 0;
485     if( done )
486         return;
487     done = 1;
488
489 G10EOF
490 for name in $STATIC_CIPHER_NAMES; do
491     echo "   ${name}_constructor();" >>cipher/construct.c
492 done
493 echo '}' >>cipher/construct.c
494
495
496
497
498 dnl
499 dnl Figure how to link the cipher modules
500 dnl
501 AC_SUBST(STATIC_CIPHER_OBJS)
502 AC_SUBST(DYNAMIC_CIPHER_MODS)
503
504
505 dnl setup assembler stuff
506 AC_MSG_CHECKING(for mpi assembler functions)
507 if test -f $srcdir/mpi/config.links ; then
508     . $srcdir/mpi/config.links
509     GNUPG_LINK_FILES($mpi_ln_src, $mpi_ln_dst)
510     ac_cv_mpi_extra_asm_modules="$mpi_extra_modules"
511     ac_cv_mpi_sflags="$mpi_sflags"
512     ac_cv_mpi_config_done="yes"
513     AC_MSG_RESULT(done)
514 else
515     AC_MSG_RESULT(failed)
516     AC_MSG_ERROR([mpi/config.links missing!])
517 fi
518 MPI_EXTRA_ASM_OBJS=""
519 if test "$ac_cv_mpi_extra_asm_modules" != ""; then
520 GNUPG_MSG_PRINT([mpi extra asm functions:])
521 for i in $ac_cv_mpi_extra_asm_modules; do
522     GNUPG_MSG_PRINT([$i])
523     MPI_EXTRA_ASM_OBJS="$MPI_EXTRA_ASM_OBJS $i.o"
524 done
525 AC_MSG_RESULT()
526 fi
527 AC_SUBST(MPI_EXTRA_ASM_OBJS)
528 MPI_SFLAGS="$ac_cv_mpi_sflags"
529 AC_SUBST(MPI_SFLAGS)
530
531 dnl Do we have zlib? Must do it here because Solaris failed
532 dnl when compiling a conftest (due to the "-lz" from LIBS).
533 use_local_zlib=yes
534 if test "$g10_force_zlib" = "yes"; then
535   :
536 else
537   AC_CHECK_HEADERS(zlib.h)
538   if test "$ac_cv_header_zlib_h" = yes ; then
539       AC_CHECK_LIB(z,deflateInit2_,use_local_zlib=no,:)
540   fi
541 fi
542
543 if test "use_local_zlib" = yes ; then
544     AM_CONDITIONAL(ENABLE_LOCAL_ZLIB, true)
545     GNUPG_LINK_FILES(zlib/zlib.h, zlib.h )
546     GNUPG_LINK_FILES(zlib/zconf.h, zconf.h )
547     ZLIBS="../zlib/libzlib.a"
548 else
549     AM_CONDITIONAL(ENABLE_LOCAL_ZLIB, false)
550     ZLIBS=
551     LIBS="-lz $LIBS"
552 fi
553 AC_SUBST(ZLIBS)
554
555
556 changequote(,)dnl
557 tmp_pat='[a-zA-Z]'
558 changequote([,])dnl
559 if echo "$VERSION" | grep $tmp_pat >/dev/null ; then
560     AC_DEFINE(IS_DEVELOPMENT_VERSION)
561 fi
562
563 GNUPG_DO_LINK_FILES
564
565
566 AC_OUTPUT_COMMANDS([
567 cat >g10defs.tmp <<G10EOF
568 /* Generated automatically by configure */
569 #ifdef HAVE_DRIVE_LETTERS
570   #define G10_LOCALEDIR "c:/lib/gnupg/locale"
571   #define GNUPG_LIBDIR  "c:/lib/gnupg"
572   #define GNUPG_DATADIR "c:/lib/gnupg"
573 #else
574   #define G10_LOCALEDIR "${prefix}/${DATADIRNAME}/locale"
575   #define GNUPG_LIBDIR  "${libdir}/gnupg"
576   #define GNUPG_DATADIR "${datadir}/gnupg"
577 #endif
578 G10EOF
579 if cmp -s g10defs.h g10defs.tmp 2>/dev/null; then
580     echo "g10defs.h is unchanged"
581     rm -f g10defs.tmp
582 else
583     rm -f g10defs.h
584     mv g10defs.tmp g10defs.h
585     echo "g10defs.h created"
586 fi
587 ],[
588 prefix=$prefix
589 exec_prefix=$exec_prefix
590 libdir=$libdir
591 datadir=$datadir
592 DATADIRNAME=$DATADIRNAME
593 ])
594
595
596 AC_OUTPUT([
597 Makefile
598 intl/Makefile
599 po/Makefile.in
600 util/Makefile
601 mpi/Makefile
602 cipher/Makefile
603 g10/Makefile
604 doc/Makefile
605 tools/Makefile
606 zlib/Makefile
607 checks/Makefile
608 gcrypt/Makefile
609 ])
610
611 dnl *-*wedit:notab*-*  Please keep this as the last line.