configure.ac 28.5 KB
Newer Older
Niels Möller's avatar
Niels Möller committed
1 2
dnl -*- mode: shell-script; sh-indentation: 2; -*-

3 4
dnl Process this file with autoconf to produce a configure script.

5
AC_INIT([nettle], [3.5], [nettle-bugs@lists.lysator.liu.se])
6
AC_PREREQ(2.61)
7 8 9 10
AC_CONFIG_SRCDIR([arcfour.c])
# Needed to stop autoconf from looking for files in parent directories.
AC_CONFIG_AUX_DIR([.])

11
AC_CONFIG_HEADER([config.h])
12

13 14
LIBNETTLE_MAJOR=7
LIBNETTLE_MINOR=0
15

16 17
LIBHOGWEED_MAJOR=5
LIBHOGWEED_MINOR=0
18

19 20 21
dnl Note double square brackets, for extra m4 quoting.
MAJOR_VERSION=`echo $PACKAGE_VERSION | sed 's/^\([[^.]]*\)\..*/\1/'`
MINOR_VERSION=`echo $PACKAGE_VERSION | sed 's/^[[^.]]*\.\([[0-9]]*\).*/\1/'`
22 23 24
AC_SUBST([MAJOR_VERSION])
AC_SUBST([MINOR_VERSION])

25 26
AC_CANONICAL_HOST

27 28 29 30 31 32
# Command line options
AC_ARG_WITH(include-path,
  AC_HELP_STRING([--with-include-path], [A colon-separated list of directories to search for include files]),,
  [with_include_path=''])

if test x$with_include_path != x ; then
33
  CPPFLAGS="$CPPFLAGS -I`echo $with_include_path | sed 's/:/ -I/g'`"
34 35 36 37 38 39 40
fi

AC_ARG_WITH(lib-path,
  AC_HELP_STRING([--with-lib-path], [A colon-separated list of directories to search for libraries]),,
  [with_lib_path=''])

if test x$with_lib_path != x ; then
41
  LDFLAGS="$LDFLAGS -L`echo $with_lib_path | sed 's/:/ -L/g'`"
42 43
fi

44 45 46 47
AC_ARG_ENABLE(public-key,
  AC_HELP_STRING([--disable-public-key], [Disable public key algorithms]),,
  [enable_public_key=yes])

48
AC_ARG_ENABLE(assembler,
49 50
  AC_HELP_STRING([--disable-assembler],[Disable assembler code]),,
  [enable_assembler=yes])
51

52 53 54 55
AC_ARG_ENABLE(static,
  AC_HELP_STRING([--disable-static], [Do not build any static library]),,
  [enable_static=yes])

56
AC_ARG_ENABLE(shared,
57 58
  AC_HELP_STRING([--disable-shared], [Do not build any shared library]),,
  [enable_shared=yes])
59

60 61 62 63 64
AC_ARG_ENABLE(pic,
  AC_HELP_STRING([--disable-pic],
  [Do not try to compile library files as position independent code]),,
  [enable_pic=yes])

65 66 67
AC_ARG_ENABLE(openssl,
  AC_HELP_STRING([--disable-openssl], [Do not include openssl glue in the benchmark program]),,
  [enable_openssl=yes])
68 69 70 71 72

AC_ARG_ENABLE(gcov,
  AC_HELP_STRING([--enable-gcov], [Instrument for gcov (requires a modern gcc)]),,
  [enable_gcov=no])

Sam Thursfield's avatar
Sam Thursfield committed
73
AC_ARG_ENABLE(documentation,
74
  AC_HELP_STRING([--disable-documentation], [Omit building and installing the documentation. (default=auto)]),,
Sam Thursfield's avatar
Sam Thursfield committed
75 76
  [enable_documentation=auto])

77 78 79
AC_ARG_ENABLE(fat, AC_HELP_STRING([--enable-fat], [Enable fat library build (default=no)]),,
  [enable_fat=no])

80 81 82 83
AC_ARG_ENABLE(arm-neon,
  AC_HELP_STRING([--enable-arm-neon], [Enable ARM Neon assembly. (default=auto)]),,
  [enable_arm_neon=auto])

84 85 86 87
AC_ARG_ENABLE(x86-aesni,
  AC_HELP_STRING([--enable-x86-aesni], [Enable x86_64 aes instructions. (default=no)]),,
  [enable_x86_aesni=no])

88 89 90 91
AC_ARG_ENABLE(x86-sha-ni,
  AC_HELP_STRING([--enable-x86-sha-ni], [Enable x86_64 sha_ni instructions. (default=no)]),,
  [enable_x86_sha_ni=no])

92 93 94 95 96 97
AC_ARG_ENABLE(mini-gmp,
  AC_HELP_STRING([--enable-mini-gmp], [Enable mini-gmp, used instead of libgmp.]),,
  [enable_mini_gmp=no])

if test "x$enable_mini_gmp" = xyes ; then
  NETTLE_USE_MINI_GMP=1
98
  HOGWEED_EXTRA_SYMBOLS="mpz_*;gmp_*;mpn_*;mp_*;"
99 100
else
  NETTLE_USE_MINI_GMP=0
101
  HOGWEED_EXTRA_SYMBOLS=""
102 103
fi
AC_SUBST([NETTLE_USE_MINI_GMP])
104
AC_SUBST([HOGWEED_EXTRA_SYMBOLS])
105

106 107 108 109 110
LSH_RPATH_INIT([`echo $with_lib_path | sed 's/:/ /g'` \
    `echo $exec_prefix | sed "s@^NONE@$prefix/lib@g" | sed "s@^NONE@$ac_default_prefix/lib@g"` \
    /usr/local/lib /sw/local/lib /sw/lib \
    /usr/gnu/lib /opt/gnu/lib /sw/gnu/lib /usr/freeware/lib /usr/pkg/lib])

111
# Checks for programs.
Niels Möller's avatar
Niels Möller committed
112
AC_PROG_CC
113

114 115
NETTLE_CHECK_IFUNC

116 117 118 119 120 121 122
# When $CC foo.c -o foo creates both foo and foo.exe, autoconf picks
# up the foo.exe and sets exeext to .exe. That is correct for cygwin,
# which has some kind of magic link from foo to foo.exe, but not for
# rntcl. A better check for the cygwin case would check if the
# contents of foo and foo.exe are equal; in the rntcl case, foo is a
# sh script, and foo.exe is a windows executable.

Niels Möller's avatar
Niels Möller committed
123
if test "x$CC" = xrntcl ; then
124
    AC_MSG_NOTICE([Compiling with rntcl; clearing EXEEXT and disabling assembler])
125 126
    ac_exeext=''
    ac_cv_exeext=''
Niels Möller's avatar
Niels Möller committed
127
    EXEEXT=''
128
    enable_assembler=no
129 130
fi

131 132 133 134
# Used by the testsuite only
AC_PROG_CXX

AC_LANG_PUSH(C++)
135 136
AC_TRY_COMPILE([],[return 0;],[IF_CXX=''], [IF_CXX='#'])
AC_SUBST([IF_CXX])
137 138
AC_LANG_POP

139 140
LD_VERSION_SCRIPT

Niels Möller's avatar
Niels Möller committed
141
AC_PROG_MAKE_SET
Niels Möller's avatar
Niels Möller committed
142
AC_PROG_RANLIB
143
AC_CHECK_TOOL(NM, nm, strings)
144 145
# Used only for the GNU-stack configure test.
AC_CHECK_TOOL(OBJDUMP, objdump, false)
146
AC_CHECK_TOOL(AR, ar, false)
Niels Möller's avatar
Niels Möller committed
147

148
if test "x$ac_cv_prog_cc_stdc" = xno ; then
149
  AC_ERROR([the C compiler doesn't handle ANSI-C]) #'
Niels Möller's avatar
Niels Möller committed
150
fi
151

152 153
AC_PROG_INSTALL

154 155 156 157
# According to the autoconf manual, needs install-sh from
# autoconf-2.60 or automake-1.10 to avoid races.
AC_PROG_MKDIR_P

158 159
AC_PROG_LN_S

Niels Möller's avatar
Niels Möller committed
160 161 162 163
# Compiler tests for the build system
GMP_PROG_CC_FOR_BUILD
GMP_PROG_EXEEXT_FOR_BUILD

164 165
LSH_DEPENDENCY_TRACKING

166
if test x$enable_dependency_tracking = xyes ; then
167 168 169
  # Since the makefiles use include to get the dependency files, we must
  # make sure that the files exist. We generate some more files than are
  # actually needed.
170

171
  AC_CONFIG_COMMANDS([dummy-dep-files],
172
  [(cd "$srcdir" && find . '(' -name '*.c' -o -name '*.cxx' ')' -print) \
173
 | sed 's/\.cx*$//' | (while read f; do \
174 175
      test -f "$f.o.d" || echo > "$f.o.d"; \
   done)
176
])
177
fi
178

179 180 181 182 183 184 185 186 187 188 189 190 191
if test "x$enable_gcov" = "xyes"; then
  CFLAGS="$CFLAGS -ftest-coverage -fprofile-arcs"
fi

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
AC_TYPE_UID_T
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(size_t)

192
AC_CHECK_HEADERS([openssl/evp.h openssl/ecdsa.h],,
193 194 195
[enable_openssl=no
 break])

196
# For use by the testsuite
197
AC_CHECK_HEADERS([valgrind/memcheck.h])
198 199 200 201
AC_CHECK_HEADERS([dlfcn.h])
AC_CHECK_LIB([dl], [dlopen],
	     [AC_DEFINE([HAVE_LIBDL], 1,
			[Define to 1 if you have dlopen (with -ldl).])])
202 203 204 205 206 207

LSH_FUNC_ALLOCA
LSH_FUNC_STRERROR
# getenv_secure is used for fat overrides,
# getline is used in the testsuite
AC_CHECK_FUNCS(secure_getenv getline)
208 209 210 211 212

ASM_WORDS_BIGENDIAN=unknown
AC_C_BIGENDIAN([AC_DEFINE([WORDS_BIGENDIAN], 1)
		ASM_WORDS_BIGENDIAN=yes],
	[ASM_WORDS_BIGENDIAN=no])
213

214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
AC_CACHE_CHECK([for __builtin_bswap64],
		nettle_cv_c_builtin_bswap64,
[AC_TRY_COMPILE([
#include <stdint.h>
],[
uint64_t x = 17;
uint64_t y = __builtin_bswap64(x);
],
nettle_cv_c_builtin_bswap64=yes,
nettle_cv_c_builtin_bswap64=no)])

AH_TEMPLATE([HAVE_BUILTIN_BSWAP64], [Define if __builtin_bswap64 is available])
if test "x$nettle_cv_c_builtin_bswap64" = "xyes" ; then
  AC_DEFINE(HAVE_BUILTIN_BSWAP64)
fi

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 260 261 262
LSH_GCC_ATTRIBUTES

# According to Simon Josefsson, looking for uint32_t and friends in
# sys/types.h is needed on some systems, in particular cygwin.
AX_CREATE_STDINT_H([nettle-stdint.h], [sys/types.h])

# Check for file locking. We (AC_PROG_CC?) have already checked for
# sys/types.h and unistd.h.
AC_CACHE_CHECK([for fcntl file locking],
		nettle_cv_fcntl_locking,
[AC_TRY_COMPILE([
#if HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#include <fcntl.h>
],[
int op = F_SETLKW;
struct flock fl;
],
nettle_cv_fcntl_locking=yes,
nettle_cv_fcntl_locking=no)])

AH_TEMPLATE([HAVE_FCNTL_LOCKING], [Define if fcntl file locking is available])
if test "x$nettle_cv_fcntl_locking" = "xyes" ; then
  AC_DEFINE(HAVE_FCNTL_LOCKING)
fi

# Checks for libraries
if test "x$enable_public_key" = "xyes" ; then
  if test "x$enable_mini_gmp" = "xno" ; then
263
    AC_CHECK_LIB(gmp, __gmpn_sec_div_r,,
264
        [AC_MSG_WARN(
265
    [GNU MP not found, or too old. GMP-6.0 or later is needed, see https://gmplib.org/.
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
    Support for public key algorithms will be unavailable.])]
        enable_public_key=no)

    # Add -R flags needed to run programs linked with gmp
    LSH_RPATH_FIX
  fi
fi

nettle_cv_gmp_numb_bits=0
if test "x$enable_public_key" = "xyes" ; then
  # Check for gmp limb size
  if test "x$enable_mini_gmp" = "xyes" ; then
    AC_MSG_CHECKING([for mini-gmp limb size])
    # With mini-gmp, mp_limb_t is always unsigned long.
    AC_COMPUTE_INT(nettle_cv_gmp_numb_bits, [(sizeof(unsigned long) * CHAR_BIT)],
        [#include <limits.h>],
        [AC_MSG_FAILURE([cannot find value of GMP_NUMB_BITS])])

    AC_MSG_RESULT([$nettle_cv_gmp_numb_bits bits])
  else
    AC_MSG_CHECKING([for GMP limb size])
    AC_COMPUTE_INT(nettle_cv_gmp_numb_bits, [GMP_NUMB_BITS],
        [#include <gmp.h>],
        [AC_MSG_FAILURE([cannot find value of GMP_NUMB_BITS])])

    AC_MSG_RESULT([$nettle_cv_gmp_numb_bits bits])
  fi
fi

295 296 297 298 299 300 301 302 303 304
# Substituted in Makefile, passed on to the eccdata command.
NUMB_BITS="$nettle_cv_gmp_numb_bits"
AC_SUBST([NUMB_BITS])

# Substituted in version.h, used only with mini-gmp.
if test "x$enable_mini_gmp" = "xyes" ; then
  GMP_NUMB_BITS="$NUMB_BITS"
else
  GMP_NUMB_BITS="n/a"
fi
305 306
AC_SUBST([GMP_NUMB_BITS])

307
# Figure out ABI. Currently, configurable only by setting CFLAGS.
308 309
ABI=standard

310
case "$host_cpu" in
311
  [x86_64 | amd64])
312
    AC_TRY_COMPILE([
313 314
#if defined(__x86_64__) || defined(__arch64__)
#error 64-bit x86
315 316
#endif
    ], [], [
317
      ABI=32
318
    ], [
319
      ABI=64
320
    ])
321
    ;;
322
  *sparc*)
323 324 325
    AC_TRY_COMPILE([
#if defined(__sparcv9) || defined(__arch64__)
#error 64-bit sparc
326 327 328 329 330 331 332 333 334 335
#endif
    ], [], [
      ABI=32
    ], [
      ABI=64
    ])
    ;;
  *mips*)
    AC_TRY_COMPILE([
#if defined(__sgi) && defined(__LP64__)
336
#error 64-bit mips
337 338
#endif
    ], [], [
339
      ABI=32
340
    ], [
341
      ABI=64
342
    ])
343
    ;;
344 345 346
esac

if test "x$ABI" != xstandard ; then
347
  AC_MSG_NOTICE([Compiler uses $ABI-bit ABI. To change, set CC.])
348 349 350 351 352 353 354 355 356
  if test "$libdir" = '${exec_prefix}/lib' ; then
    # Try setting a better default
    case "$host_cpu:$host_os:$ABI" in
      *:solaris*:32|*:sunos*:32)
	libdir='${exec_prefix}/lib'
	;;
      *:solaris*:64|*:sunos*:64)
	libdir='${exec_prefix}/lib/64'
	;;
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
      # Linux conventions are a mess... According to the Linux File
      # Hierarchy Standard, all architectures except IA64 puts 32-bit
      # libraries in lib, and 64-bit in lib64. Some distributions,
      # e.g., Fedora and Gentoo, adhere to this standard, while at
      # least Debian has decided to put 64-bit libraries in lib and
      # 32-bit libraries in lib32.
      
      # We try to figure out the convention, except if we're cross
      # compiling. We use lib${ABI} if /usr/lib${ABI} exists and
      # appears to not be a symlink to a different name.
      *:linux*:32|*:linux*:64)
	if test "$cross_compiling" = yes ; then
          AC_MSG_WARN([Cross compiling for linux. Can't guess if libraries go in lib${ABI} or lib.]); dnl '
	else
	  # The dash builtin pwd tries to be "helpful" and remember
372
	  # symlink names. Use -P option, and hope it's portable enough.
373
	  test -d /usr/lib${ABI} \
374
	    && (cd /usr/lib${ABI} && pwd -P | grep >/dev/null "/lib${ABI}"'$') \
375 376
	    && libdir='${exec_prefix}/'"lib${ABI}"
	fi
377 378 379 380 381 382 383 384 385 386
	;;
      # On freebsd, it seems 32-bit libraries are in lib32,
      # and 64-bit in lib. Don't know about "kfreebsd", does
      # it follow the Linux fhs conventions?
      *:freebsd*:32)
	libdir='${exec_prefix}/lib32'
	;;
      *:freebsd*:64)
	libdir='${exec_prefix}/lib'
	;;
387 388 389 390 391 392
      *:irix*:32)
	libdir='${exec_prefix}/lib32'
	;;
      *:irix*:64)
	libdir='${exec_prefix}/lib64'
	;;
393
      *)
394
        AC_MSG_WARN([Don't know where to install $ABI-bit libraries on this system.]); dnl '
395 396 397 398

    esac
    AC_MSG_NOTICE([Libraries to be installed in $libdir.])
  fi
399 400
fi

401 402
OPT_NETTLE_SOURCES=""

403 404
# Select assembler code
asm_path=
405 406
if test "x$enable_assembler" = xyes ; then
  case "$host_cpu" in
Niels Möller's avatar
Niels Möller committed
407
    [x86 | i?86* | k[5-8]* | pentium* | athlon])
408
      asm_path=x86
409 410 411 412
      ;;
    [x86_64 | amd64])
      if test "$ABI" = 64 ; then
	asm_path=x86_64
413 414
	if test "x$enable_fat" = xyes ; then
	  asm_path="x86_64/fat $asm_path"
415
	  OPT_NETTLE_SOURCES="fat-x86_64.c $OPT_NETTLE_SOURCES"
416 417 418 419 420 421 422
	else
	  if test "x$enable_x86_aesni" = xyes ; then
	    asm_path="x86_64/aesni $asm_path"
	  fi
	  if test "x$enable_x86_sha_ni" = xyes ; then
	    asm_path="x86_64/sha_ni $asm_path"
	  fi
423
	fi
424 425 426 427 428 429 430 431 432 433 434
      else
	asm_path=x86
      fi
      ;;
    *sparc*)
      if test "$ABI" = 64 ; then
	asm_path=sparc64
      else
	asm_path=sparc32
      fi
      ;;
435 436 437 438 439 440 441 442 443
    arm*)
      asm_path=arm
      if test "x$enable_fat" = xyes ; then
	asm_path="arm/fat $asm_path"
	OPT_NETTLE_SOURCES="fat-arm.c $OPT_NETTLE_SOURCES"
      else
	case "$host_cpu" in
	  armv6* | armv7*)
	    NETTLE_CHECK_ARM_NEON
444

445
	    asm_path="arm/v6 arm"
446
      
447 448 449 450 451
	    if test "x$enable_arm_neon" = xyes ; then
	      asm_path="arm/neon $asm_path"
	    fi
	    ;;
	esac
452
      fi
453
      ;;
454 455 456 457 458
    *)
      enable_assembler=no
      ;;
  esac
fi
459 460 461 462 463

# Files which replace a C source file (or otherwise don't correspond
# to a new object file).
asm_replace_list="aes-encrypt-internal.asm aes-decrypt-internal.asm \
		arcfour-crypt.asm camellia-crypt-internal.asm \
Niels Möller's avatar
Niels Möller committed
464 465
		md5-compress.asm memxor.asm memxor3.asm \
		poly1305-internal.asm \
Niels Möller's avatar
Niels Möller committed
466
		chacha-core-internal.asm \
467 468
		salsa20-crypt.asm salsa20-core-internal.asm \
		serpent-encrypt.asm serpent-decrypt.asm \
Niels Möller's avatar
Niels Möller committed
469
		sha1-compress.asm sha256-compress.asm sha512-compress.asm \
470
		sha3-permute.asm umac-nh.asm umac-nh-n.asm machine.m4"
Niels Möller's avatar
Niels Möller committed
471

472
# Assembler files which generate additional object files if they are used.
473
asm_nettle_optional_list="gcm-hash8.asm cpuid.asm \
474
  aes-encrypt-internal-2.asm aes-decrypt-internal-2.asm memxor-2.asm \
475
  chacha-core-internal-2.asm \
476 477
  salsa20-core-internal-2.asm sha1-compress-2.asm sha256-compress-2.asm \
  sha3-permute-2.asm sha512-compress-2.asm \
478 479
  umac-nh-n-2.asm umac-nh-2.asm"

480
asm_hogweed_optional_list=""
481
if test "x$enable_public_key" = "xyes" ; then
482
  asm_hogweed_optional_list="ecc-192-modp.asm ecc-224-modp.asm \
483
    ecc-25519-modp.asm ecc-256-redc.asm ecc-384-modp.asm ecc-521-modp.asm"
484 485
fi

486 487
OPT_NETTLE_OBJS=""
OPT_HOGWEED_OBJS=""
488

489
asm_file_list=""
490

491
if test "x$enable_assembler" = xyes ; then
492
  if test -n "$asm_path"; then
493
    AC_MSG_NOTICE([Looking for assembler files in $asm_path.])
494
    for tmp_f in $asm_replace_list ; do
495 496 497 498 499 500 501
      for asm_dir in $asm_path ; do
        if test -f "$srcdir/$asm_dir/$tmp_f"; then
	  asm_file_list="$asm_file_list $tmp_f"
          AC_CONFIG_LINKS($tmp_f:$asm_dir/$tmp_f)
	  break
        fi
      done
502
    done
503 504
    dnl Workaround for AC_CONFIG_LINKS, which complains if we use the
    dnl same destination argument $tmp_f multiple times.
505
    for tmp_n in $asm_nettle_optional_list ; do
506 507
      dnl Note extra pair of [] in sed expression
      tmp_b=`echo "$tmp_n" | sed 's/\.[[^.]]*$//'`
508 509 510 511 512 513 514 515
      for asm_dir in $asm_path ; do
	if test -f "$srcdir/$asm_dir/$tmp_n"; then
	  asm_file_list="$asm_file_list $tmp_n"
	  AC_CONFIG_LINKS($tmp_n:$asm_dir/$tmp_n)
	  while read tmp_func ; do
	    AC_DEFINE_UNQUOTED(HAVE_NATIVE_$tmp_func)
	    eval HAVE_NATIVE_$tmp_func=yes
	  done <<EOF
516
[`sed -n 's/^.*[^ 	]*PROLOGUE(_*\(nettle_\)*\([^)]*\)).*$/\2/p' < "$srcdir/$asm_dir/$tmp_n"`]
517
EOF
518
	  OPT_NETTLE_OBJS="$OPT_NETTLE_OBJS $tmp_b"'.$(OBJEXT)'
519 520 521 522 523
	  break
	fi
      done
    done	
    for tmp_h in $asm_hogweed_optional_list ; do
524 525
      dnl Note extra pair of [] in sed expression
      tmp_b=`echo "$tmp_h" | sed 's/\.[[^.]]*$//'`
526
      for asm_dir in $asm_path ; do
527
	if test -f "$srcdir/$asm_dir/$tmp_h"; then
528 529 530
	  dnl Note double square brackets, for extra m4 quoting.
	  tmp_bits=`grep GMP_NUMB_BITS "$srcdir/$asm_dir/$tmp_h" \
            | sed 's/^.*GMP_NUMB_BITS(\([[0-9]]*\)).*$/\1/'`
531
	  if test "$tmp_bits" && test "$tmp_bits" != "${NUMB_BITS}" ; then
532 533 534
	     AC_MSG_WARN([skipping $tmp_h, because GMP_NUMB_BITS != $tmp_bits])
	     continue
	  fi
535 536
	  asm_file_list="$asm_file_list $tmp_h"
	  AC_CONFIG_LINKS($tmp_h:$asm_dir/$tmp_h)
537 538 539 540
	  while read tmp_func ; do
	    AC_DEFINE_UNQUOTED(HAVE_NATIVE_$tmp_func)
	    eval HAVE_NATIVE_$tmp_func=yes
	  done <<EOF
541
[`sed -n 's/[^ 	]*PROLOGUE(_*\(nettle_\)*\([^)]*\)).*$/\2/p' < "$srcdir/$asm_dir/$tmp_h"`]
542
EOF
543
	  OPT_HOGWEED_OBJS="$OPT_HOGWEED_OBJS $tmp_b"'.$(OBJEXT)'
544 545 546
	  break
	fi
      done
547
    done	
548
    if test -z "$asm_file_list"; then
549 550 551 552
      enable_assembler=no
      AC_MSG_WARN([No assembler files found.])
    fi
  fi
553 554 555 556 557 558 559 560
  case "$host_os" in
    darwin*)
      ASM_RODATA='.section __TEXT,__const'
      ;;
    *)
      ASM_RODATA='.section .rodata'
      ;;
  esac
561 562
fi

563 564
AC_SUBST([OPT_NETTLE_OBJS])
AC_SUBST([OPT_HOGWEED_OBJS])
565
AC_SUBST([OPT_NETTLE_SOURCES])
566
AC_SUBST([ASM_RODATA])
567 568 569 570 571 572
if test "x$enable_assembler" = xyes ; then
  IF_ASM=''
else
  IF_ASM='#'
fi
AC_SUBST([IF_ASM])
573 574 575 576

AH_VERBATIM([HAVE_NATIVE],
[/* Define to 1 each of the following for which a native (ie. CPU specific)
    implementation of the corresponding routine exists.  */
577
#undef HAVE_NATIVE_chacha_core
578 579 580 581
#undef HAVE_NATIVE_ecc_192_modp
#undef HAVE_NATIVE_ecc_192_redc
#undef HAVE_NATIVE_ecc_224_modp
#undef HAVE_NATIVE_ecc_224_redc
582
#undef HAVE_NATIVE_ecc_25519_modp
583 584 585 586 587
#undef HAVE_NATIVE_ecc_256_modp
#undef HAVE_NATIVE_ecc_256_redc
#undef HAVE_NATIVE_ecc_384_modp
#undef HAVE_NATIVE_ecc_384_redc
#undef HAVE_NATIVE_ecc_521_modp
588
#undef HAVE_NATIVE_ecc_521_redc
589 590
#undef HAVE_NATIVE_gcm_hash8
#undef HAVE_NATIVE_salsa20_core
591 592
#undef HAVE_NATIVE_sha1_compress
#undef HAVE_NATIVE_sha256_compress
593 594 595 596
#undef HAVE_NATIVE_sha512_compress
#undef HAVE_NATIVE_sha3_permute
#undef HAVE_NATIVE_umac_nh
#undef HAVE_NATIVE_umac_nh_n])
597

598 599 600 601 602 603
if test "x$enable_pic" = xyes; then
    LSH_CCPIC
else
    CCPIC=''
fi
AC_SUBST(CCPIC)
604

605 606 607
IF_DLL='#'
LIBNETTLE_FILE_SRC='$(LIBNETTLE_FORLINK)'
LIBHOGWEED_FILE_SRC='$(LIBHOGWEED_FORLINK)'
608
EMULATOR=''
Martin Storsjö's avatar
Martin Storsjö committed
609
W64_ABI=no
610

611
case "$host_os" in
Martin Storsjö's avatar
Martin Storsjö committed
612
  mingw32*|cygwin*)
613 614 615 616
    # The actual DLLs, e.g. libnettle-$major-$minor.dll, are normally
    # installed into the bin dir (or more exactly $libdir/../bin, for
    # automake), while libnettle.dll.a, which is a stub file for
    # linking to the DLL, is installed into the lib dir.
Martin Storsjö's avatar
Martin Storsjö committed
617 618
    case "$host_os" in
      mingw32*)
619 620
        LIBNETTLE_FORLINK='libnettle-$(LIBNETTLE_MAJOR).dll'
        LIBHOGWEED_FORLINK='libhogweed-$(LIBHOGWEED_MAJOR).dll'
Martin Storsjö's avatar
Martin Storsjö committed
621 622
        ;;
      cygwin*)
623 624
        LIBNETTLE_FORLINK='cygnettle-$(LIBNETTLE_MAJOR).dll'
        LIBHOGWEED_FORLINK='cyghogweed-$(LIBHOGWEED_MAJOR).dll'
Martin Storsjö's avatar
Martin Storsjö committed
625 626
        ;;
    esac
627 628 629 630 631 632 633 634 635 636
    if test "x$cross_compiling" = xyes ; then
	case "$ABI" in
	    64)
		EMULATOR=wine64
		;;
	    *)
		EMULATOR=wine
		;;
	esac
    fi
Martin Storsjö's avatar
Martin Storsjö committed
637 638 639
    if test "x$ABI" = x64 ; then
        W64_ABI=yes
    fi
640 641
    LIBNETTLE_SONAME=''
    LIBNETTLE_FILE='libnettle.dll.a'
642
    LIBNETTLE_FILE_SRC='$(LIBNETTLE_FILE)'
643
    LIBNETTLE_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,--out-implib=$(LIBNETTLE_FILE) -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--whole-archive'
644 645 646
    LIBNETTLE_LIBS='-Wl,--no-whole-archive $(LIBS)'

    LIBHOGWEED_SONAME=''
647
    LIBHOGWEED_FILE='libhogweed.dll.a'
648
    LIBHOGWEED_FILE_SRC='$(LIBHOGWEED_FILE)'
649
    LIBHOGWEED_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,--out-implib=$(LIBHOGWEED_FILE) -Wl,--export-all-symbols -Wl,--enable-auto-import -Wl,--whole-archive'
650
    LIBHOGWEED_LIBS='-Wl,--no-whole-archive $(LIBS) libnettle.dll.a'
651
    IF_DLL=''
652
    ;;
Grant Robinson's avatar
Grant Robinson committed
653
  darwin*)
654
    LIBNETTLE_FORLINK=libnettle.dylib
655 656
    LIBNETTLE_SONAME='libnettle.$(LIBNETTLE_MAJOR).dylib'
    LIBNETTLE_FILE='libnettle.$(LIBNETTLE_MAJOR).$(LIBNETTLE_MINOR).dylib'
657
    LIBNETTLE_LINK='$(CC) $(CFLAGS) -dynamiclib $(LDFLAGS) -install_name ${libdir}/$(LIBNETTLE_SONAME) -compatibility_version $(LIBNETTLE_MAJOR) -current_version $(LIBNETTLE_MAJOR).$(LIBNETTLE_MINOR)'
658 659
    LIBNETTLE_LIBS=''

660
    LIBHOGWEED_FORLINK=libhogweed.dylib
661 662
    LIBHOGWEED_SONAME='libhogweed.$(LIBHOGWEED_MAJOR).dylib'
    LIBHOGWEED_FILE='libhogweed.$(LIBHOGWEED_MAJOR).$(LIBHOGWEED_MINOR).dylib'
663
    LIBHOGWEED_LINK='$(CC) $(CFLAGS) -dynamiclib -L. $(LDFLAGS) -install_name ${libdir}/$(LIBHOGWEED_SONAME) -compatibility_version $(LIBHOGWEED_MAJOR) -current_version $(LIBHOGWEED_MAJOR).$(LIBHOGWEED_MINOR)'
664
    LIBHOGWEED_LIBS='-lnettle $(LIBS)'
Grant Robinson's avatar
Grant Robinson committed
665
    ;;
666 667 668 669 670 671 672
  solaris*)
    # Sun's ld uses -h to set the soname, and this option is passed
    # through by both Sun's compiler and gcc. Might not work with GNU
    # ld, but it's unusual to use GNU ld on Solaris.
    LIBNETTLE_FORLINK=libnettle.so
    LIBNETTLE_SONAME='$(LIBNETTLE_FORLINK).$(LIBNETTLE_MAJOR)'
    LIBNETTLE_FILE='$(LIBNETTLE_SONAME).$(LIBNETTLE_MINOR)'
673
    LIBNETTLE_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -G -h $(LIBNETTLE_SONAME)'
674 675 676 677 678
    LIBNETTLE_LIBS=''

    LIBHOGWEED_FORLINK=libhogweed.so
    LIBHOGWEED_SONAME='$(LIBHOGWEED_FORLINK).$(LIBHOGWEED_MAJOR)'
    LIBHOGWEED_FILE='$(LIBHOGWEED_SONAME).$(LIBHOGWEED_MINOR)'
679
    LIBHOGWEED_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -G -h $(LIBHOGWEED_SONAME)'
680
    LIBHOGWEED_LIBS='libnettle.so $(LIBS)'
681
    ;;
682
  *)
683 684 685
    LIBNETTLE_FORLINK=libnettle.so
    LIBNETTLE_SONAME='$(LIBNETTLE_FORLINK).$(LIBNETTLE_MAJOR)'
    LIBNETTLE_FILE='$(LIBNETTLE_SONAME).$(LIBNETTLE_MINOR)'
686
    LIBNETTLE_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname=$(LIBNETTLE_SONAME)'
687 688
    LIBNETTLE_LIBS=''

689
    LIBHOGWEED_FORLINK=libhogweed.so
690 691
    LIBHOGWEED_SONAME='$(LIBHOGWEED_FORLINK).$(LIBHOGWEED_MAJOR)'
    LIBHOGWEED_FILE='$(LIBHOGWEED_SONAME).$(LIBHOGWEED_MINOR)'
692
    LIBHOGWEED_LINK='$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,-soname=$(LIBHOGWEED_SONAME)'
693 694 695 696
    # Requested by debian, to make linking with only -lhogweed work
    # (does not work in general, e.g., with static linking all of
    # -lhogweed -lgmp -lnettle are still required). Also makes dlopen
    # of libhogweed.so work, without having to use RTLD_GLOBAL.
697
    LIBHOGWEED_LIBS='libnettle.so $(LIBS)'
698 699
    ;;
esac
700

701
ASM_SYMBOL_PREFIX=''
702
ASM_ELF_STYLE='no'
703
ASM_COFF_STYLE='no'
704 705 706
# GNU as default is to use @
ASM_TYPE_FUNCTION='@function'
ASM_TYPE_PROGBITS='@progbits'
707
ASM_MARK_NOEXEC_STACK=''
708
ASM_ALIGN_LOG=''
709 710 711 712 713 714 715

if test x$enable_assembler = xyes ; then
  AC_CACHE_CHECK([if globals are prefixed by underscore],
  nettle_cv_asm_underscore,
  [ # Default is no underscore
    nettle_cv_asm_underscore=no
    AC_COMPILE_IFELSE(
716
      [AC_LANG_SOURCE([int a_global_symbol;])],
717
      [ $NM conftest.$OBJEXT >conftest.out
718 719 720 721 722
        if grep _a_global_symbol conftest.out >/dev/null ; then
          nettle_cv_asm_underscore=yes
        elif grep a_global_symbol conftest.out >/dev/null ; then
          nettle_cv_asm_underscore=no
        else
723
          AC_MSG_WARN([nm does not list a_global_symbol at all])
724 725
	fi],
      [AC_MSG_WARN([test program with a single global could not be compiled!?])])])
726
  if test x$nettle_cv_asm_underscore = xyes ; then
727
    ASM_SYMBOL_PREFIX='_'
728
  fi
729

730 731 732
  AC_CACHE_CHECK([for ELF-style .type,%function pseudo-ops],
    [nettle_cv_asm_type_percent_function],
    [GMP_TRY_ASSEMBLE([
733 734
.text
.globl foo
735
.type foo,%function
736 737 738 739
foo:
.Lend:

.size foo, .Lend - foo
740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
],
       [nettle_cv_asm_type_percent_function=yes],
       [nettle_cv_asm_type_percent_function=no])])

dnl Needs double quote for the # character
  AC_CACHE_CHECK([[for ELF-style .type,#function pseudo-ops]],
    [nettle_cv_asm_type_hash_function],
    [GMP_TRY_ASSEMBLE([
.text
.globl foo
.type foo,#function
foo:
.Lend:

.size foo, .Lend - foo
],
       [nettle_cv_asm_type_hash_function=yes],
       [nettle_cv_asm_type_hash_function=no])])

  if test x$nettle_cv_asm_type_percent_function = xyes ; then
760
    ASM_ELF_STYLE='yes'
761
    ASM_TYPE_FUNCTION='%function'
762
    ASM_TYPE_PROGBITS='%progbits'
763 764 765 766
  else
    if test x$nettle_cv_asm_type_hash_function = xyes ; then
      ASM_ELF_STYLE='yes'
      ASM_TYPE_FUNCTION='#function'
767
      ASM_TYPE_PROGBITS='#progbits'
768
    fi
769
  fi
770

771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787
  AC_CACHE_CHECK([for COFF-style .type directive],
    [nettle_cv_asm_coff_type],
      [GMP_TRY_ASSEMBLE([
.text
.globl _foo
.def _foo
.scl 2
.type 32
.endef
_foo:
],
        [nettle_cv_asm_coff_type=yes],
        [nettle_cv_asm_coff_type=no])])
  if test "x$nettle_cv_asm_coff_type" = "xyes" ; then
    ASM_COFF_STYLE=yes
  fi

788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810
  AC_CACHE_CHECK([if we should use a .note.GNU-stack section],
  nettle_cv_asm_gnu_stack,
  [ # Default
    nettle_cv_asm_gnu_stack=no

    cat >conftest.c <<EOF
int foo() { return 0; }
EOF
    nettle_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >conftest.out 2>&1"
    if AC_TRY_EVAL(nettle_compile); then
      cat conftest.out >&AC_FD_CC
      $OBJDUMP -x conftest.o | grep '\.note\.GNU-stack' > /dev/null \
      && nettle_cv_asm_gnu_stack=yes
    else
      cat conftest.out >&AC_FD_CC
      echo "configure: failed program was:" >&AC_FD_CC
      cat conftest.s >&AC_FD_CC
    fi
    rm -f conftest.*])
  if test x$nettle_cv_asm_gnu_stack = xyes ; then
    ASM_MARK_NOEXEC_STACK='.section .note.GNU-stack,"",TYPE_PROGBITS'
  fi

811 812 813 814 815 816 817
  AC_CACHE_CHECK([if .align assembly directive is logarithmic],
    [nettle_cv_asm_align_log],
    [GMP_TRY_ASSEMBLE([
.align 3
],
       [nettle_cv_asm_align_log=yes],
       [nettle_cv_asm_align_log=no])])
818
  ASM_ALIGN_LOG="$nettle_cv_asm_align_log"
819 820 821
fi

AC_SUBST(ASM_SYMBOL_PREFIX)
822
AC_SUBST(ASM_ELF_STYLE)
823
AC_SUBST(ASM_COFF_STYLE)
824
AC_SUBST(ASM_TYPE_FUNCTION)
825
AC_SUBST(ASM_TYPE_PROGBITS)
826
AC_SUBST(ASM_MARK_NOEXEC_STACK)
827
AC_SUBST(ASM_ALIGN_LOG)
Martin Storsjö's avatar
Martin Storsjö committed
828
AC_SUBST(W64_ABI)
829
AC_SUBST(ASM_WORDS_BIGENDIAN)
830
AC_SUBST(EMULATOR)
831

832 833 834 835 836
AC_SUBST(LIBNETTLE_MAJOR)
AC_SUBST(LIBNETTLE_MINOR)
AC_SUBST(LIBNETTLE_FORLINK)
AC_SUBST(LIBNETTLE_SONAME)
AC_SUBST(LIBNETTLE_FILE)
837
AC_SUBST(LIBNETTLE_FILE_SRC)
838 839 840
AC_SUBST(LIBNETTLE_LINK)
AC_SUBST(LIBNETTLE_LIBS)

Niels Möller's avatar
Niels Möller committed
841 842 843 844 845
AC_SUBST(LIBHOGWEED_MAJOR)
AC_SUBST(LIBHOGWEED_MINOR)
AC_SUBST(LIBHOGWEED_FORLINK)
AC_SUBST(LIBHOGWEED_SONAME)
AC_SUBST(LIBHOGWEED_FILE)
846
AC_SUBST(LIBHOGWEED_FILE_SRC)
Niels Möller's avatar
Niels Möller committed
847 848
AC_SUBST(LIBHOGWEED_LINK)
AC_SUBST(LIBHOGWEED_LIBS)
Niels Möller's avatar
Niels Möller committed
849

Niels Möller's avatar
Niels Möller committed
850
AC_PATH_PROG(M4, m4, m4)
851

852 853
AH_TEMPLATE([WITH_HOGWEED], [Defined if public key features are enabled])

854
if test "x$enable_public_key" = xyes ; then
855 856 857 858 859 860
  AC_DEFINE(WITH_HOGWEED)
  IF_HOGWEED=''
else
  IF_HOGWEED='#'
fi

861 862 863 864 865 866
if test "x$enable_static" = xyes ; then
  IF_STATIC=''
else
  IF_STATIC='#'
fi

867
IF_DLOPEN_TEST='#'
868 869
if test "x$enable_shared" = xyes ; then
  IF_SHARED=''
870
  IF_NOT_SHARED='#'
871
  if test "x$ac_cv_lib_dl_dlopen" = xyes ; then
872 873
    IF_DLOPEN_TEST=''
  fi
874
else
875
  IF_SHARED='#'
876
  IF_NOT_SHARED=''
877 878
fi

Sam Thursfield's avatar
Sam Thursfield committed
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
# Documentation tools
if test "x$enable_documentation" != "xno"; then
  AC_PATH_PROG(MAKEINFO, makeinfo, not-found)

  if test "x$MAKEINFO" != "xnot-found"; then
    enable_documentation=yes
    AC_SUBST(MAKEINFO)
  else
    if test "x$enable_documentation" == "xauto" ; then
      enable_documentation=no
    else
      AC_MSG_ERROR([Cannot find 'makeinfo', required for documentation.])
    fi
  fi
fi

if test "x$enable_documentation" = "xyes" ; then
  IF_DOCUMENTATION=''
else
  IF_DOCUMENTATION='#'
fi

901 902 903 904 905 906
if test "x$enable_mini_gmp" = "xyes" ; then
  IF_MINI_GMP=''
else
  IF_MINI_GMP='#'
fi
  
907
AC_SUBST(IF_HOGWEED)
908
AC_SUBST(IF_STATIC)
909
AC_SUBST(IF_SHARED)
910
AC_SUBST(IF_NOT_SHARED)
911
AC_SUBST(IF_DLOPEN_TEST)
Sam Thursfield's avatar
Sam Thursfield committed
912
AC_SUBST(IF_DOCUMENTATION)
913
AC_SUBST(IF_DLL)
914
AC_SUBST(IF_MINI_GMP)
915

916 917
OPENSSL_LIBFLAGS=''

918
# Check for openssl's libcrypto (used only for benchmarking)
919
if test x$enable_openssl = xyes ; then
920
  AC_CHECK_LIB(crypto, EVP_CIPHER_CTX_new,
921 922 923 924 925
    [OPENSSL_LIBFLAGS='-lcrypto'],
    [enable_openssl=no])
fi

AH_TEMPLATE([WITH_OPENSSL],
926
	    [Define if you have openssl's libcrypto (used for benchmarking)]) dnl'
927 928 929 930

if test x$enable_openssl = xyes ; then
  AC_DEFINE(WITH_OPENSSL)
fi
931 932

AC_SUBST(OPENSSL_LIBFLAGS)
933

934
AH_BOTTOM(
935 936 937 938 939 940
[#if defined(__x86_64__) || defined(__arch64__)
# define HAVE_NATIVE_64_BIT 1
#else
/* Needs include of <limits.h> before use. */
# define HAVE_NATIVE_64_BIT (SIZEOF_LONG * CHAR_BIT >= 64)
#endif
941 942
])

943 944 945 946 947 948 949
# clock_gettime is in librt on *-*-osf5.1 and on glibc, so add -lrt to
# BENCH_LIBS if needed. On linux (tested on x86_32, 2.6.26),
# clock_getres reports ns accuracy, while in a quick test on osf
# clock_getres said only 1 millisecond.

old_LIBS="$LIBS"
AC_SEARCH_LIBS(clock_gettime, rt, [
950
  AC_DEFINE([HAVE_CLOCK_GETTIME],1,[Define if clock_gettime is available])])
951 952 953 954 955
BENCH_LIBS="$LIBS"
LIBS="$old_LIBS"

AC_SUBST(BENCH_LIBS)

Niels Möller's avatar
Niels Möller committed
956 957
# Set these flags *last*, or else the test programs won't compile
if test x$GCC = xyes ; then
958
  # Using -ggdb3 makes (some versions of) Redhat's gcc-2.96 dump core
959
  if $CC --version | grep '^2\.96$' 1>/dev/null 2>&1; then
960 961 962 963
    true
  else
    CFLAGS="$CFLAGS -ggdb3"
  fi
964
  # FIXME: It would be better to actually test if this option works and/or is needed.
Niels Möller's avatar
Niels Möller committed
965
  # Or perhaps use -funsigned-char.
966
  if $CC --version | grep 'gcc.* 4\.' 1>/dev/null 2>&1; then
967 968
    CFLAGS="$CFLAGS -Wno-pointer-sign"
  fi
969 970 971
  CFLAGS="$CFLAGS -Wall -W \
  -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \
  -Wpointer-arith -Wbad-function-cast -Wnested-externs"
Niels Möller's avatar
Niels Möller committed
972 973 974

# Don't enable -Wcast-align as it results in tons of warnings in the
# DES code. And when using stdio.
975 976
# Don't enable -Waggregate-return, as that causes warnings for glibc
# inttypes.h.
Niels Möller's avatar
Niels Möller committed
977
fi
Niels Möller's avatar
Niels Möller committed
978

979
AC_CONFIG_FILES([config.make config.m4 Makefile version.h])
980
AC_CONFIG_FILES([tools/Makefile testsuite/Makefile examples/Makefile])
981
AC_CONFIG_FILES([nettle.pc hogweed.pc libnettle.map libhogweed.map])
982 983

AC_OUTPUT
984

985 986 987 988 989 990 991 992 993
AC_MSG_NOTICE([summary of build options:

  Version:           ${PACKAGE_STRING}
  Host type:         ${host}
  ABI:               ${ABI}
  Assembly files:    ${asm_path:-none}
  Install prefix:    ${prefix}
  Library directory: ${libdir}
  Compiler:          ${CC}
994
  Static libraries:  ${enable_static}
995 996
  Shared libraries:  ${enable_shared}
  Public key crypto: ${enable_public_key}
997
  Using mini-gmp:    ${enable_mini_gmp}
Sam Thursfield's avatar
Sam Thursfield committed
998
  Documentation:     ${enable_documentation}
999
])