1#!/bin/sh
2
3# set default values
4OPT_OPENSSL=auto
5OPT_OPENSSL_RUNTIME=auto
6OPT_GETTEXT=auto
7OPT_CC=
8
9export LC_ALL=C
10CFG_LINE="$*"
11INSTALL_PREFIX="/usr/local"
12test -z "$CC" && CC=cc
13CMD_AR=ar
14CMD_INSTALL=install
15BUILD_DEBUG=
16BUILD_STATIC=auto
17BUILD_EXTRA_CFLAGS=
18BUILD_EXTRA_LDFLAGS=
19CHECK_LDFLAGS=
20WARN_CFLAGS="-Wall -W -Wstrict-prototypes -Wnested-externs -Winline -Wpointer-arith -Wbad-function-cast -Wmissing-prototypes -Wmissing-declarations"
21INSTALL_SYMLINKS="sfv-hash has160-hash gost12-256-hash gost12-512-hash edonr256-hash edonr512-hash tiger-hash tth-hash whirlpool-hash ed2k-link magnet-link"
22INSTALL_LIB_STATIC=auto
23INSTALL_LIB_SHARED=auto
24INSTALL_PKGCONFIGDIR="$PKG_INSTALLDIR"
25
26# detect and prepare tmp directory
27for DETECT_TMP in "$TMPDIR" "$TEMPDIR" "/tmp"; do
28  test -d "$DETECT_TMP" && break
29done
30RANDNUM=$RANDOM
31test -z "$RANDNUM" && jot -r 1 2>/dev/null >dev/null && RANDNUM=$(jot -r 1 1 32767) || RANDNUM=0
32BUILD_TMPDIR="$DETECT_TMP/rhash-configure-$RANDNUM-$$"
33mkdir $BUILD_TMPDIR || die "Unable to create tmp dir."
34TMPC="$BUILD_TMPDIR/tmp.c"
35TMPT="$BUILD_TMPDIR/tmp.txt"
36TMPBIN="$BUILD_TMPDIR/tmp"
37TMPLOG="config.log"
38rm -f "$TMPLOG"
39echo "Configuration parameters: \"$CFG_LINE\"" > "$TMPLOG"
40echo "Symlinks to install: $INSTALL_SYMLINKS" >> "$TMPLOG"
41echo >> "$TMPLOG"
42
43remove_tmpdir()
44{
45  rm -rf "$BUILD_TMPDIR"
46}
47trap remove_tmpdir EXIT
48
49# display error message and exit
50die() {
51  echo
52  echo "Error: $@" >&2
53  echo >&2
54  test -f "$TMPLOG" && echo "Error: $@" >> "$TMPLOG"
55  rm -f "$TMPBIN" "$TMPC" "$TMPT"
56  echo "Check \"$TMPLOG\" if you do not understand why it failed."
57  exit 1
58}
59
60print_help()
61{
62  cat << EOF
63Usage: configure [OPTIONS]...
64
65Generic Options:
66  -h, --help             display this help and exit
67  --cc=COMPILER          C compiler to build RHash [gcc]
68  --ar=AR                librarian to build RHash [ar]
69  --target=PLATFORM      target platform (i386-linux, arm-linux, etc)
70  --with-install=PATH    path to a custom install program
71
72Directory Options:
73  --prefix=DIR           prefix directory for installation [/usr/local]
74  --exec-prefix=DIR      prefix directory for binaries [PREFIX]
75  --bindir=DIR           directory for installing binaries [EXEC_PREFIX/bin]
76  --sysconfdir=DIR       directory to look for configuration file
77                         [PREFIX/etc]
78  --mandir=DIR           directory for installing man pages [PREFIX/share/man]
79  --libdir=DIR           directory for the rhash library [EXEC_PREFIX/lib]
80  --pkgconfigdir=DIR     directory for pkg-config files [LIBDIR/pkgconfig]
81  --localedir=DIR        directory for locale files [PREFIX/share/locale]
82
83Features options:
84  --disable-FEATURE      do not include FEATURE
85  --enable-gettext       enable gettext (localization) support [autodetect]
86  --enable-openssl[=runtime] enable OpenSSL (optimized hash functions) support.
87                         If runtime specified, then load OpenSSL at runtime if
88                         the library is found [autodetect]
89  --enable-debug         enable debug information
90  --enable-static        statically link libraries into RHash binary
91  --enable-lib-static    build and install LibRHash static library [auto]
92  --enable-lib-shared    build and install LibRHash shared library [auto]
93  --enable-symlinks[=LIST]   install symlinks to the binary [enable]
94
95Use these options if autodetection fails:
96  --extra-cflags=FLAGS        extra CFLAGS
97  --extra-ldflags=FLAGS       extra LDFLAGS
98EOF
99exit 0
100}
101
102check_set_contains()
103{
104  VALUE="$1"
105  shift
106  for VALID_VALUE do
107	if test "$VALUE" = "$VALID_VALUE"; then
108	  return 0
109	fi
110    shift
111  done
112  return 1
113}
114
115get_opt_value()
116{
117  echo $(echo $* | cut -d '=' -f 2-)
118}
119
120for OPT do
121  case "$OPT" in
122    --help|-help|-h)
123      print_help
124      ;;
125    --prefix=*)
126      INSTALL_PREFIX=$(get_opt_value $OPT)
127      ;;
128    --exec-prefix=*)
129      INSTALL_EXEC_PREFIX=$(get_opt_value $OPT)
130      INSTALL_EXEC_PREFIX_SET=yes
131      ;;
132    --bindir=*)
133      INSTALL_BINDIR=$(get_opt_value $OPT)
134      ;;
135    --mandir=*)
136      INSTALL_MANDIR=$(get_opt_value $OPT)
137      ;;
138    --sysconfdir=*)
139      INSTALL_SYSCONFDIR=$(get_opt_value $OPT)
140      ;;
141    --libdir=*)
142      INSTALL_LIBDIR=$(get_opt_value $OPT)
143      ;;
144    --pkgconfigdir=*)
145      INSTALL_PKGCONFIGDIR=$(get_opt_value $OPT)
146      ;;
147    --localedir=*)
148      INSTALL_LOCALEDIR=$(get_opt_value $OPT)
149      ;;
150  --enable-gettext)
151      OPT_GETTEXT=yes
152      ;;
153  --disable-gettext)
154      OPT_GETTEXT=no
155      ;;
156  --enable-openssl)
157      OPT_OPENSSL=yes
158      ;;
159  --enable-openssl=*)
160      OPT_OPENSSL=$(get_opt_value $OPT)
161      check_set_contains "$OPT_OPENSSL" "runtime" || die "Unexpected option value: $OPT"
162      ;;
163  --disable-openssl)
164      OPT_OPENSSL=no
165      ;;
166  --enable-openssl-runtime)
167      OPT_OPENSSL=runtime # legacy option
168      echo "warning: use --enable-openssl=runtime instead of $OPT" >> "$TMPLOG"
169      ;;
170  --disable-openssl-runtime)
171      OPT_OPENSSL=yes # legacy option
172      echo "warning: use --enable-openssl instead of $OPT" >> "$TMPLOG"
173      ;;
174  --target=*)
175    BUILD_TARGET=$(get_opt_value $OPT)
176    ;;
177  --cc=*)
178    CC=$(get_opt_value $OPT)
179    OPT_CC=1
180    ;;
181  --ar=*)
182    CMD_AR=$(get_opt_value $OPT)
183    ;;
184  --enable-static)
185    BUILD_STATIC=yes
186    ;;
187  --disable-static)
188    BUILD_STATIC=no
189    ;;
190  --enable-lib-static)
191    INSTALL_LIB_STATIC=yes
192    ;;
193  --disable-lib-static)
194    INSTALL_LIB_STATIC=no
195    ;;
196  --enable-lib-shared)
197    INSTALL_LIB_SHARED=yes
198    ;;
199  --disable-lib-shared)
200    INSTALL_LIB_SHARED=no
201    ;;
202  --enable-symlinks)
203    # use default INSTALL_SYMLINKS list
204    ;;
205  --enable-symlinks=*)
206    INSTALL_SYMLINKS=$(get_opt_value $OPT)
207    ;;
208  --disable-symlinks)
209    INSTALL_SYMLINKS=
210    ;;
211  --enable-debug)
212    BUILD_DEBUG='-g'
213    ;;
214  --enable-debug=*)
215    BUILD_DEBUG='-g '$(get_opt_value $OPT)
216    ;;
217  --disable-debug)
218    BUILD_DEBUG=
219    ;;
220  --with-install=*)
221    CMD_INSTALL=$(get_opt_value $OPT)
222    ;;
223  --extra-cflags=*)
224    BUILD_EXTRA_CFLAGS="$BUILD_EXTRA_CFLAGS $(get_opt_value $OPT)"
225    ;;
226  --extra-ldflags=*)
227    BUILD_EXTRA_LDFLAGS="$BUILD_EXTRA_LDFLAGS $(get_opt_value $OPT)"
228    ;;
229  *)
230      echo "unknown option $OPT"
231      exit 1
232      ;;
233  esac
234  shift
235done
236
237# set variables which use INSTALL_PREFIX
238test -z "$INSTALL_EXEC_PREFIX_SET" && INSTALL_EXEC_PREFIX="$INSTALL_PREFIX"
239test -z "$INSTALL_BINDIR" && INSTALL_BINDIR="$INSTALL_EXEC_PREFIX/bin"
240test -z "$INSTALL_MANDIR" && INSTALL_MANDIR="$INSTALL_PREFIX/share/man"
241test -z "$INSTALL_SYSCONFDIR" && INSTALL_SYSCONFDIR="$INSTALL_PREFIX/etc"
242test -z "$INSTALL_INCDIR" && INSTALL_INCDIR="$INSTALL_PREFIX/include"
243test -z "$INSTALL_LIBDIR" && INSTALL_LIBDIR="$INSTALL_EXEC_PREFIX/lib"
244test -z "$INSTALL_PKGCONFIGDIR" && INSTALL_PKGCONFIGDIR="$INSTALL_LIBDIR/pkgconfig"
245test -z "$INSTALL_LOCALEDIR" && INSTALL_LOCALEDIR="$INSTALL_PREFIX/share/locale"
246
247join_params()
248{
249  printf '%s ' $@ | sed -e 's/ $//'
250}
251
252run_cmd() {
253  echo "Run: $@" >> "$TMPLOG"
254  $@ >> "$TMPLOG" 2>&1
255  TMPRES="$?"
256  echo "Run result: $TMPRES" >> "$TMPLOG"
257  echo >> "$TMPLOG"
258  return "$TMPRES"
259}
260
261yn_nonempty()
262{
263  test -n "$1" && echo yes || echo no;
264}
265
266log_start()
267{
268  echo "============ Checking for $1 ============" >> "$TMPLOG"
269}
270
271log_finish()
272{
273  echo "=============================================" >> "$TMPLOG"
274  echo "" >> "$TMPLOG"
275}
276
277# Use this before starting a check
278start_check() {
279  log_start "$1"
280  printf '%s' "Checking for $1 ... "
281  res_comment=""
282}
283
284# Use this to echo the results of a check
285finish_check() {
286  if test -n "$res_comment"; then
287    res_comment="($res_comment)"
288  fi
289  echo "Result is: $1 $res_comment" >> "$TMPLOG"
290  log_finish
291  echo "$1 $res_comment"
292  res_comment=""
293}
294
295# check source file compilation and return exit code
296compile_check() {
297  source="$1"
298  shift
299  echo >> "$TMPLOG"
300  echo "----- source file: $source -----" >> "$TMPLOG"
301  cat "$source" >> "$TMPLOG"
302  echo "----- end of file: $source -----" >> "$TMPLOG"
303  echo "$CC $OPTFLAGS $WARN_CFLAGS $CFLAGS $source $BUILD_EXTRA_CFLAGS $BUILD_EXTRA_LDFLAGS $CHECK_LDFLAGS -o $TMPBIN $@" >> "$TMPLOG"
304  rm -f "$TMPBIN"
305  $CC $OPTFLAGS $WARN_CFLAGS $CFLAGS "$source" $BUILD_EXTRA_CFLAGS $BUILD_EXTRA_LDFLAGS $CHECK_LDFLAGS -o "$TMPBIN" "$@" >> "$TMPLOG" 2>&1
306  TMPRES="$?"
307  echo "Compilation result: $TMPRES" >> "$TMPLOG"
308  echo >> "$TMPLOG"
309  return "$TMPRES"
310}
311
312cc_check() {
313  compile_check $TMPC $@
314}
315
316create_c_file() {
317  rm -f "$TMPC"
318  if test -n "$1"; then
319    echo "#include <$1>" > $TMPC || die "Can't write to the $TMPC file"
320  fi
321}
322
323cc_check_macro() {
324  create_c_file "$1"
325  cat >> $TMPC << EOF
326#ifndef $2
327#error condition not true: $2
328#endif
329int main(void) { return 0; }
330EOF
331  shift 2
332  cc_check $@
333}
334
335cc_check_cflag() {
336  echo "int main(void) { return 0; }" > $TMPC
337  cc_check $@
338}
339
340cc_check_headers() {
341  rm -f "$TMPC"
342  while test -n "$1"; do
343    echo "#include <$1>" >> $TMPC
344    shift
345  done
346  echo "int main(void) { return 0; }" >> $TMPC
347  cc_check "-c"
348}
349
350cc_check_statement() {
351  create_c_file "$1"
352  cat >> $TMPC << EOF
353int main(void) {
354  $2
355  return 0;
356}
357EOF
358  shift 2
359  cc_check $@
360}
361
362# detect host and target OS
363start_check "target OS"
364HOST_OS=$(uname -s 2>&1)
365case "$HOST_OS" in
366  Linux|FreeBSD|NetBSD|OpenBSD|DragonFly|BSD/OS|Darwin|SunOS|QNX|GNU|MorphOS|AIX|AmigaOS|Haiku)
367    ;;
368  IRIX*)
369    HOST_OS=IRIX
370    ;;
371  GNU/kFreeBSD)
372    HOST_OS=FreeBSD
373    ;;
374  HP-UX*)
375    HOST_OS=HP-UX
376    ;;
377  MINGW32*)
378    HOST_OS=MINGW32
379    ;;
380  MINGW64*)
381    HOST_OS=MINGW64
382    ;;
383  MSYS*)
384    HOST_OS=MSYS
385    ;;
386  [cC][yY][gG][wW][iI][nN]*)
387    HOST_OS=CYGWIN
388    ;;
389  OS/2*)
390    HOST_OS=OS/2
391    ;;
392  *)
393    HOST_OS="$HOST_OS-UNKNOWN"
394    ;;
395esac
396
397if test -z "$BUILD_TARGET"; then
398  # host's CPU/instruction set
399  set_host_arch() {
400      case "$1" in
401          x86_64|amd64|i[3-9]86*|i86pc|x86|x86pc|k5|k6|k6_2|k6_3|k6-2|k6-3|pentium*|athlon*|i586_i686|i586-i686) HOST_ARCH=i386 ;;
402          ia64) HOST_ARCH=ia64 ;;
403          macppc|ppc*|Power*) HOST_ARCH=ppc ;;
404          alpha) HOST_ARCH=alpha ;;
405          sun4*|sparc*) HOST_ARCH=sparc ;;
406          parisc*|hppa*|9000*) HOST_ARCH=hppa ;;
407          aarch64*) HOST_ARCH=aarch64 ;;
408          arm*|zaurus|cats) HOST_ARCH=arm ;;
409          sh3|sh4|sh4a) HOST_ARCH=sh ;;
410          s390) HOST_ARCH=s390 ;;
411          s390x) HOST_ARCH=s390x ;;
412          *mips*) HOST_ARCH=mips ;;
413          nios2) HOST_ARCH=nios2 ;;
414          vax) HOST_ARCH=vax ;;
415          xtensa*) HOST_ARCH=xtensa ;;
416          *) HOST_ARCH=UNKNOWN ;;
417      esac
418  }
419  set_host_arch "$(uname -m 2>&1)"
420  if test "$HOST_ARCH" = UNKNOWN; then
421    set_host_arch "$(uname -p 2>&1)"
422  fi
423  TARGET_OS="$HOST_OS"
424  TARGET_ARCH="$HOST_ARCH"
425else
426  set_target_os() {
427    component=$1
428    part=$(echo $BUILD_TARGET | cut -d '-' -f $component)
429    case "$(echo $part | tr '[A-Z]' '[a-z]')" in
430      linux|uclinux) TARGET_OS=Linux ;;
431      freebsd*) TARGET_OS=FreeBSD ;;
432      gnu/kfreebsd) TARGET_OS=FreeBSD ;;
433      netbsd) TARGET_OS=NetBSD ;;
434      bsd/os) TARGET_OS=BSD/OS ;;
435      openbsd) TARGET_OS=OpenBSD ;;
436      dragonfly) TARGET_OS=DragonFly ;;
437      sunos|solaris2.*) TARGET_OS=SunOS ;;
438      qnx) TARGET_OS=QNX ;;
439      morphos) TARGET_OS=MorphOS ;;
440      amigaos) TARGET_OS=AmigaOS ;;
441      mingw32*) TARGET_OS=MINGW32 ;;
442      wine) TARGET_OS=Wine ;;
443      darwin*) TARGET_OS=Darwin ;;
444      cygwin*) TARGET_OS=CYGWIN ;;
445    esac
446  }
447  TARGET_OS="UNKNOWN"
448  set_target_os 3
449  if test "$TARGET_OS" = UNKNOWN; then
450    set_target_os 2
451  fi
452  TARGET_ARCH=$(echo $BUILD_TARGET | cut -d '-' -f 1)
453  if test "$(echo $TARGET_ARCH)" != "x86_64"; then
454    TARGET_ARCH=$(echo $TARGET_ARCH | tr '_' '-')
455  fi
456fi
457
458echo "Host   OS  : $HOST_OS" >> "$TMPLOG"
459echo "Target OS  : $TARGET_OS" >> "$TMPLOG"
460echo "Target ARCH: $TARGET_ARCH" >> "$TMPLOG"
461finish_check "$TARGET_OS"
462test "$TARGET_OS" = UNKNOWN && die "Unknown target OS, please specify the --target option"
463
464OS_LC="$(echo $TARGET_OS | tr '[A-Z]' '[a-z]')"
465aix()       { test "$OS_LC" = "aix"; }
466amigaos()   { test "$OS_LC" = "amigaos"; }
467bsdos()     { test "$OS_LC" = "bsd/os"; }
468darwin()    { test "$OS_LC" = "darwin"; }
469dragonfly() { test "$OS_LC" = "dragonfly"; }
470freebsd()   { test "$OS_LC" = "freebsd" || test "$OS_LC" = "gnu/kfreebsd"; }
471gnu()       { test "$OS_LC" = "gnu"; }
472hpux()      { test "$OS_LC" = "hp-ux"; }
473irix()      { test "$OS_LC" = "irix"; }
474linux()     { test "$OS_LC" = "linux"; }
475mingw32()   { test "$OS_LC" = "mingw32"; }
476mingw64()   { test "$OS_LC" = "mingw64"; }
477msys()      { test "$OS_LC" = "msys"; }
478cygwin()    { test "$OS_LC" = "cygwin"; }
479netbsd()    { test "$OS_LC" = "netbsd"; }
480openbsd()   { test "$OS_LC" = "openbsd"; }
481os2()       { test "$OS_LC" = "os/2"; }
482qnx()       { test "$OS_LC" = "qnx"; }
483sunos()     { test "$OS_LC" = "sunos"; }
484wine()      { test "$OS_LC" = "wine"; }
485win32()     { cygwin || mingw32 || mingw64 || msys || wine; }
486posix_make() { aix || bsdos || hpux || irix || qnx || sunos; }
487
488# Checking CC version...
489# Intel C++ Compilers (no autoselect, use CC=/some/binary ./configure)
490cc_vendor=
491if test "$(basename $CC)" = "icc" || test "$(basename $CC)" = "ecc"; then
492  start_check "$CC version"
493  cc_vendor=intel
494  cc_name=$($CC -V 2>&1 | head -n 1 | cut -d ',' -f 1)
495  cc_version=$($CC -V 2>&1 | head -n 1 | cut -d ',' -f 2 | cut -d ' ' -f 3)
496  _cc_major=$(echo $cc_version | cut -d '.' -f 1)
497  _cc_minor=$(echo $cc_version | cut -d '.' -f 2)
498  case $cc_version in
499    '')
500      cc_version="v. ?.??, bad"
501      cc_fail=yes
502      ;;
503    10.1|11.1|12.*|13.*)
504      cc_version="$cc_version, ok"
505      ;;
506    *)
507      cc_version="$cc_version, bad"
508      cc_fail=yes
509      ;;
510  esac
511  finish_check "$cc_version"
512else
513  CC_TMP="$CC"
514  test -n "$OPT_CC" && OTHER_CC= || OTHER_CC="gcc cc"
515  for CC in "$CC_TMP" $OTHER_CC; do
516    if run_cmd "$CC -v"; then
517      cc_name_tmp=$($CC -v 2>&1 | tail -n 1 | cut -d ' ' -f 1)
518      if test "$cc_name_tmp" = "gcc"; then
519        cc_name=$cc_name_tmp
520        start_check "$CC version"
521        cc_vendor=gnu
522        cc_version=$($CC -dumpversion 2>&1)
523        if ! echo $cc_version | grep -q '^[0-9][0-9]*\.[0-9]'; then
524          cc_v2=$($CC -dumpfullversion -dumpversion 2>/dev/null)
525          if echo $cc_v2 | grep -q '^[0-9][0-9]*\.[0-9]'; then
526            cc_version=$cc_v2
527          fi
528        fi
529        case $cc_version in
530          2.96*)
531            cc_fail=yes
532            ;;
533          *)
534            _cc_major=$(echo $cc_version | cut -d '.' -f 1)
535            _cc_minor=$(echo $cc_version | cut -d '.' -f 2)
536            _cc_mini=$(echo $cc_version | cut -d '.' -f 3)
537            ;;
538        esac
539        finish_check "$cc_name $cc_version"
540        break
541      fi
542      if $CC -v 2>&1 | grep -q "clang"; then
543        start_check "$CC version"
544        cc_vendor=clang
545        cc_version=$($CC -dumpversion 2>&1)
546        finish_check "clang $cc_version"
547        break
548      fi
549      cc_name_tmp=$($CC -V 2>&1 | head -n 1 | cut -d ' ' -f 2,3)
550      if test "$cc_name_tmp" = "Sun C"; then
551        start_check "$CC version"
552        cc_vendor=sun
553        cc_version=$($CC -V 2>&1 | head -n 1 | cut -d ' ' -f 4)
554        res_comment="experimental support"
555        finish_check "Sun C $cc_version"
556        break
557      fi
558    fi
559  done
560fi # icc
561test -z "$cc_vendor" && die "compiler not found"
562test "$cc_fail" = "yes" && die "unsupported compiler version"
563
564log_start "compiler working with default options"
565if ! cc_check_cflag; then
566  die "compiler doesn't work"
567fi
568log_finish
569
570if test "$cc_name" = "gcc" && test "$_cc_major" -gt 3; then
571  WARN_CFLAGS="$WARN_CFLAGS -Wdeclaration-after-statement"
572fi
573
574# select optimization flags
575has_optimization()
576{
577  # posix-compatible way to find -O<n> option
578  for OPT in $BUILD_EXTRA_CFLAGS $BUILD_DEBUG; do
579    case "$OPT" in
580      -O[0-3]|-O) return 0 ;;
581    esac
582  done
583  return 1
584}
585has_optimization && OPTLEVEL= || OPTLEVEL="-O2"
586test -n "$BUILD_DEBUG" && OPTNDEBUG= || OPTNDEBUG="-DNDEBUG"
587OPTFLAGS="-pipe -ffunction-sections -fdata-sections"
588check_set_contains "-fno-omit-frame-pointer" $BUILD_EXTRA_CFLAGS $BUILD_DEBUG \
589  || OPTFLAGS="$OPTFLAGS -fomit-frame-pointer"
590OPTFLAGS=$(join_params $BUILD_DEBUG $OPTLEVEL $OPTNDEBUG $OPTFLAGS)
591
592# test that compiler works with options specified by command line
593log_start "compiler working with provided options"
594if ! cc_check_cflag; then
595  die "wrong compiler options provided"
596fi
597log_finish
598
599# detect proper shared library name
600SHARED_PREFIX="lib"
601STATIC_PREFIX="lib"
602SHARED_EXT=".so.0"
603STATIC_EXT=".a"
604SOLINK_EXT=".so"
605EXEC_EXT=
606NEED_IMPLIB=no
607NEED_SOLINK=yes
608INSTALL_SO_DIR=$INSTALL_LIBDIR
609LN_S="ln -sf"
610if win32; then
611  LN_S="cp -pR"
612  EXEC_EXT=".exe"
613  SHARED_EXT=".dll"
614  NEED_IMPLIB=yes
615  NEED_SOLINK=no
616  INSTALL_SO_DIR=$INSTALL_BINDIR
617  if msys; then
618    SHARED_PREFIX="msys-"
619  elif cygwin; then
620    SHARED_PREFIX="cyg"
621  fi
622elif darwin; then
623  SHARED_EXT=".0.dylib"
624  SOLINK_EXT=".dylib"
625fi
626
627# check for linker flags
628LD_STATIC=-static
629test "$BUILD_STATIC" = "auto" && BUILD_STATIC=no
630test "$OPT_OPENSSL" = "runtime" && ! win32 && LD_STATIC=
631if test -n "$LD_STATIC"; then
632  start_check "linker support for $LD_STATIC"
633  if cc_check_cflag "$LD_STATIC"; then
634    test "$BUILD_STATIC" = "yes" && CHECK_LDFLAGS=$LD_STATIC
635  else
636    LD_STATIC=
637  fi
638  finish_check $(yn_nonempty "$LD_STATIC")
639fi
640
641LIBDL_LDFLAGS=
642if win32; then
643  ALLOW_RUNTIME_LINKING=yes
644elif test "$BUILD_STATIC" = "yes"; then
645  ALLOW_RUNTIME_LINKING=no
646elif test "$OPT_OPENSSL" = "auto" || test "$OPT_OPENSSL" = "runtime"; then
647  start_check "linker support for dlopen"
648  ALLOW_RUNTIME_LINKING=no
649  if cc_check_statement "dlfcn.h" 'dlopen("", RTLD_NOW);'; then
650    ALLOW_RUNTIME_LINKING=yes
651  elif cc_check_statement "dlfcn.h" 'dlopen("", RTLD_NOW);' "-ldl"; then
652    ALLOW_RUNTIME_LINKING=yes
653    LIBDL_LDFLAGS="-ldl"
654  fi
655  finish_check "$ALLOW_RUNTIME_LINKING"
656fi
657
658SHARED_VSCRIPT=
659if ! darwin; then
660  start_check "linker support for --version-script"
661  echo "{ local: *; };" > $TMPT
662  cc_check_cflag "-Wl,--version-script,$TMPT -shared" &&
663    SHARED_VSCRIPT=",--version-script,exports.sym"
664  finish_check $(yn_nonempty "$SHARED_VSCRIPT")
665fi
666
667WIN_LDFLAGS=
668if win32; then
669  start_check "linker support for --nxcompat --no-seh --dynamicbase"
670  cc_check_cflag "-Wl,--nxcompat,--no-seh,--dynamicbase" &&
671    WIN_LDFLAGS="-Wl,--nxcompat,--no-seh,--dynamicbase"
672  finish_check $(yn_nonempty "$WIN_LDFLAGS")
673fi
674
675# detect library names and build flags
676LIBRHASH_SHARED="${SHARED_PREFIX}rhash${SHARED_EXT}"
677LIBRHASH_STATIC="${STATIC_PREFIX}rhash${STATIC_EXT}"
678LIBRHASH_SOLINK="${SHARED_PREFIX}rhash${SOLINK_EXT}"
679LIBRHASH_SOLINK_TARGET=
680test "$NEED_SOLINK" = "yes" && LIBRHASH_SOLINK_TARGET=$LIBRHASH_SOLINK
681LIBRHASH_DEF="${SHARED_PREFIX}rhash.def"
682LIBRHASH_IMPLIB="${STATIC_PREFIX}rhash${SHARED_EXT}${STATIC_EXT}"
683LIBRHASH_EXPORTS_FILE="exports.sym"
684LIBRHASH_EXPORTS_TARGET=
685LIBRHASH_SH_CFLAGS=""
686LIBRHASH_SH_LDFLAGS=""
687LIBRHASH_RM_FILES=
688LIBRHASH_LEGACY_HEADERS=
689if win32; then
690  LIBRHASH_SH_CFLAGS="-DRHASH_EXPORTS"
691  LIBRHASH_SH_LDFLAGS="-shared -Wl,--out-implib=${LIBRHASH_IMPLIB}${SHARED_VSCRIPT},--output-def,${LIBRHASH_DEF}"
692  test -n "$SHARED_VSCRIPT" && LIBRHASH_EXPORTS_TARGET=$LIBRHASH_EXPORTS_FILE
693  LIBRHASH_RM_FILES="${LIBRHASH_IMPLIB} ${LIBRHASH_DEF}"
694elif darwin; then
695  LIBRHASH_SH_CFLAGS="-fpic"
696  LIBRHASH_SH_LDFLAGS='-dynamiclib -Wl,-install_name,$(LIBDIR)/$@'
697else
698  LIBRHASH_LEGACY_HEADERS="rhash_timing.h"
699  LIBRHASH_SH_CFLAGS="-fpic"
700  LIBRHASH_SH_LDFLAGS="-shared -Wl${SHARED_VSCRIPT},-soname,\$(LIBRHASH_SHARED)"
701  test -n "$SHARED_VSCRIPT" && LIBRHASH_EXPORTS_TARGET=$LIBRHASH_EXPORTS_FILE
702fi
703LIBRHASH_RM_FILES=$(join_params $LIBRHASH_RM_FILES $LIBRHASH_EXPORTS_TARGET $LIBRHASH_SOLINK_TARGET)
704
705RHASH_DEFINES=
706LIBRHASH_DEFINES=
707GETTEXT_LDFLAGS=
708OPENSSL_LDFLAGS=
709if test "$OPT_GETTEXT" != "no"; then
710  start_check "gettext"
711  GETTEXT_FOUND=no
712  if cc_check_headers "libintl.h"; then
713    if cc_check_statement "libintl.h" "gettext(\"\");"; then
714      GETTEXT_FOUND=found
715    elif cc_check_statement "libintl.h" "gettext(\"\");" "-lintl"; then
716      GETTEXT_LDFLAGS="-lintl"
717      GETTEXT_FOUND=found
718    elif cc_check_statement "libintl.h" "gettext(\"\");" "-lintl -liconv"; then
719      GETTEXT_LDFLAGS="-lintl -liconv"
720      GETTEXT_FOUND=found
721    fi
722  fi
723  test "$GETTEXT_FOUND" = "found" && RHASH_DEFINES=$(join_params $RHASH_DEFINES -DUSE_GETTEXT)
724  finish_check $GETTEXT_FOUND
725  test "$OPT_GETTEXT" = "yes" && test "$GETTEXT_FOUND" = "no" && die "gettext library not found"
726fi
727
728if test "$OPT_OPENSSL" != "no"; then
729  start_check "OpenSSL"
730  OPENSSL_FOUND=no
731  if test "$ALLOW_RUNTIME_LINKING" = "no"; then
732    echo "No runtime library loading, because dlopen() is not found!" >> "$TMPLOG"
733    test "$OPT_OPENSSL" = "runtime" && die "dlopen() is required for OpenSSL runtime loading"
734  fi
735  OPENSSL_HEADERS="openssl/opensslconf.h openssl/md4.h openssl/md5.h openssl/sha.h"
736  if cc_check_headers $OPENSSL_HEADERS; then
737    if test "$OPT_OPENSSL" = "runtime" || ( test "$ALLOW_RUNTIME_LINKING" = "yes" && test "$OPT_OPENSSL" = "auto" ); then
738      OPENSSL_FOUND=runtime
739      LIBRHASH_DEFINES=$(join_params $LIBRHASH_DEFINES -DOPENSSL_RUNTIME)
740      OPENSSL_LDFLAGS="$LIBDL_LDFLAGS"
741      # note: libdl should disable -static
742      test -n "$LIBDL_LDFLAGS" && LD_STATIC=
743    elif win32 && cc_check_statement "openssl/md5.h" "MD5_Init(NULL);" "-leay32"; then
744      OPENSSL_FOUND=found
745      LIBRHASH_DEFINES=$(join_params $LIBRHASH_DEFINES -DUSE_OPENSSL)
746      OPENSSL_LDFLAGS="-leay32"
747    elif cc_check_statement "openssl/md5.h" "MD5_Init(NULL);" "-lcrypto"; then
748      OPENSSL_FOUND=found
749      LIBRHASH_DEFINES=$(join_params $LIBRHASH_DEFINES -DUSE_OPENSSL)
750      OPENSSL_LDFLAGS="-lcrypto"
751    fi
752  fi
753  finish_check $OPENSSL_FOUND
754  test "$OPT_OPENSSL" != "auto" && test "$OPENSSL_FOUND" = "no" && die "OpenSSL library not found"
755fi
756
757# building of static/shared binary and library
758RHASH_STATIC=rhash_static
759RHASH_SHARED=rhash_shared
760RHASH_BUILD_TARGETS=
761RHASH_EXTRA_INSTALL=
762LIBRHASH_BUILD_TARGETS=
763LIBRHASH_TEST_TARGETS=
764EXTRA_INSTALL_LIBSHARED=
765EXTRA_UNINSTALL_LIBSHARED=
766if test "$BUILD_STATIC" = "yes"; then
767  RHASH_STATIC=rhash
768  RHASH_BUILD_TYPE=static
769  RHASH_BUILD_TARGETS="\$(RHASH_STATIC)"
770  test "$INSTALL_LIB_SHARED" = "yes" && RHASH_BUILD_TARGETS="$RHASH_BUILD_TARGETS \$(LIBRHASH_SHARED)"
771else
772  RHASH_SHARED=rhash
773  RHASH_BUILD_TYPE=shared
774  RHASH_BUILD_TARGETS="\$(RHASH_SHARED)"
775  test "$INSTALL_LIB_SHARED" = "auto" && INSTALL_LIB_SHARED=yes
776  test "$INSTALL_LIB_STATIC" = "yes"  && RHASH_BUILD_TARGETS="$RHASH_BUILD_TARGETS \$(LIBRHASH_STATIC)"
777fi
778if test "$INSTALL_LIB_STATIC" = "yes"; then
779  RHASH_EXTRA_INSTALL=$(join_params $RHASH_EXTRA_INSTALL install-lib-static)
780  LIBRHASH_BUILD_TARGETS=$LIBRHASH_STATIC
781  LIBRHASH_TEST_TARGETS=test-static
782fi
783if test "$NEED_IMPLIB" = "yes"; then
784  EXTRA_INSTALL_LIBSHARED="install-implib"
785  EXTRA_UNINSTALL_LIBSHARED="uninstall-implib"
786fi
787if test "$INSTALL_LIB_SHARED" = "yes"; then
788  RHASH_EXTRA_INSTALL=$(join_params $RHASH_EXTRA_INSTALL install-lib-shared)
789  LIBRHASH_BUILD_TARGETS=$(join_params $LIBRHASH_BUILD_TARGETS $LIBRHASH_SHARED)
790  LIBRHASH_TEST_TARGETS=$(join_params $LIBRHASH_TEST_TARGETS test-shared)
791fi
792
793# check for old POSIX make
794posix_make && Q_ASSIGN="=" || Q_ASSIGN="?="
795
796# detect source directories
797start_check "sources"
798HAS_RHASH=no
799HAS_LIBRHASH=no
800HAS_BINDINGS=no
801RHASH_VERSION=
802RHASH_XVERSION=
803BINDINGS_VERSION=
804RHASH_SRC=
805LIBRHASH_SRC=
806LIBRHASH_PC=
807BINDINGS_SRC=
808SRC_FOUND=no
809test -f Makefile || die "Makefile not found"
810if test -f rhash_main.c; then
811  HAS_RHASH=yes
812  SRC_FOUND=RHash
813  if test -d librhash; then
814    HAS_LIBRHASH=yes
815    LIBRHASH_SRC=librhash/
816  fi
817  if test -f bindings/version.properties; then
818    HAS_BINDINGS=yes
819    BINDINGS_SRC=bindings/
820  fi
821elif test -f rhash.c; then
822  HAS_LIBRHASH=yes
823  SRC_FOUND=LibRHash
824elif test -f version.properties; then
825  HAS_BINDINGS=yes
826  SRC_FOUND="RHash bindings"
827fi
828echo "RHASH_SRC=$RHASH_SRC, LIBRHASH_SRC=$LIBRHASH_SRC, BINDINGS_SRC=$BINDINGS_SRC" >> "$TMPLOG"
829
830# check version
831good_version() { echo "$1" | grep -q '^[1-9]\.[1-9][0-9]*\.[0-9]' ; }
832if test "$HAS_RHASH" = "yes" || test "$HAS_LIBRHASH" = "yes"; then
833  test -f "${RHASH_SRC}version.h" || die "${RHASH_SRC}version.h not found"
834  RHASH_VERSION=$(cut -d'"' -f2 "${RHASH_SRC}version.h")
835  echo "RHASH_VERSION=$RHASH_VERSION" >> "$TMPLOG"
836  good_version "$RHASH_VERSION" || die "wrong version: $RHASH_VERSION"
837  _v1=$(echo $RHASH_VERSION | cut -d '.' -f 1)
838  _v2=$(echo $RHASH_VERSION | cut -d '.' -f 2)
839  _v3=$(echo $RHASH_VERSION | cut -d '.' -f 3)
840  RHASH_XVERSION=$(printf "0x%02x%02x%02x%02x" "$_v1" "$_v2" "$_v3" 0)
841  test "$HAS_LIBRHASH" = "yes" && LIBRHASH_PC=dist/librhash.pc
842fi
843if test "$HAS_BINDINGS" = "yes"; then
844  BINDINGS_VERSION=$(cut -d = -f 2 "${BINDINGS_SRC}version.properties")
845  echo "BINDINGS_VERSION=$BINDINGS_VERSION" >> "$TMPLOG"
846  good_version "$BINDINGS_VERSION" || die "wrong bindings version: $BINDINGS_VERSION"
847  test -z "$RHASH_VERSION" && RHASH_VERSION="$BINDINGS_VERSION"
848fi
849test -n "$RHASH_VERSION" && SRC_FOUND="$SRC_FOUND $RHASH_VERSION"
850finish_check "$SRC_FOUND"
851test "$SRC_FOUND" = "no" && die "sources not found"
852
853if test "$HAS_BINDINGS" = "yes" && test "$BINDINGS_VERSION" != "$RHASH_VERSION"; then
854  echo "Updating ${BINDINGS_SRC}version.properties"
855  echo "version=$RHASH_VERSION" > ${BINDINGS_SRC}version.properties
856fi
857
858if test "$HAS_RHASH" = "yes"; then
859  echo "Writing ${RHASH_SRC}config.mak"
860  cat > ${RHASH_SRC}config.mak << EOF
861# -------- Generated by configure -----------
862
863DESTDIR $Q_ASSIGN
864BINDIR       = \$(DESTDIR)$INSTALL_BINDIR
865SYSCONFDIR   = \$(DESTDIR)$INSTALL_SYSCONFDIR
866MANDIR       = \$(DESTDIR)$INSTALL_MANDIR
867PKGCONFIGDIR = \$(DESTDIR)$INSTALL_PKGCONFIGDIR
868LOCALEDIR    = \$(DESTDIR)$INSTALL_LOCALEDIR
869
870AR      = $CMD_AR
871CC      = $CC
872INSTALL = $CMD_INSTALL
873
874LIBRHASH_STATIC = librhash/$LIBRHASH_STATIC
875LIBRHASH_SHARED = librhash/$LIBRHASH_SHARED
876BUILD_TYPE      = $RHASH_BUILD_TYPE
877VERSION         = $RHASH_VERSION
878EXEC_EXT        = $EXEC_EXT
879RHASH_STATIC    = $RHASH_STATIC\$(EXEC_EXT)
880RHASH_SHARED    = $RHASH_SHARED\$(EXEC_EXT)
881BUILD_TARGETS   = $RHASH_BUILD_TARGETS
882EXTRA_INSTALL   = $RHASH_EXTRA_INSTALL
883SYMLINKS        = $INSTALL_SYMLINKS
884LN_S            = $LN_S
885
886OPTFLAGS    = $OPTFLAGS
887OPTLDFLAGS  = $WIN_LDFLAGS
888WARN_CFLAGS = $WARN_CFLAGS
889ADDCFLAGS   = $BUILD_EXTRA_CFLAGS
890ADDLDFLAGS  = $BUILD_EXTRA_LDFLAGS
891CONFCFLAGS  = -DSYSCONFDIR=\\"$INSTALL_SYSCONFDIR\\"
892LOCALECFLAGS = -DLOCALEDIR=\\"$INSTALL_LOCALEDIR\\"
893CFLAGS  = $RHASH_DEFINES \$(OPTFLAGS) \$(WARN_CFLAGS) \$(ADDCFLAGS)
894LDFLAGS = \$(OPTLDFLAGS) \$(ADDLDFLAGS) $GETTEXT_LDFLAGS
895BIN_STATIC_LDFLAGS = \$(LDFLAGS) $(join_params $LD_STATIC $OPENSSL_LDFLAGS)
896
897EOF
898fi
899
900
901if test "$HAS_LIBRHASH" = "yes"; then
902  echo "Writing ${LIBRHASH_SRC}config.mak"
903  cat > ${LIBRHASH_SRC}config.mak << EOF
904# -------- Generated by configure -----------
905
906DESTDIR $Q_ASSIGN
907INCDIR  = \$(DESTDIR)$INSTALL_INCDIR
908LIBDIR  = \$(DESTDIR)$INSTALL_LIBDIR
909SO_DIR  = \$(DESTDIR)$INSTALL_SO_DIR
910
911AR      = $CMD_AR
912CC      = $CC
913INSTALL = $CMD_INSTALL
914
915LIBRHASH_STATIC  = $LIBRHASH_STATIC
916LIBRHASH_SHARED  = $LIBRHASH_SHARED
917LIBRHASH_SOLINK  = $LIBRHASH_SOLINK
918LIBRHASH_DEF     = $LIBRHASH_DEF
919LIBRHASH_IMPLIB  = $LIBRHASH_IMPLIB
920EXPORTS_FILE     = $LIBRHASH_EXPORTS_FILE
921RM_FILES         = $LIBRHASH_RM_FILES
922BUILD_TYPE       = $RHASH_BUILD_TYPE
923EXEC_EXT         = $EXEC_EXT
924LEGACY_HEADERS   = $LIBRHASH_LEGACY_HEADERS
925
926EXPORTS_TARGET   = $LIBRHASH_EXPORTS_TARGET
927BUILD_TARGETS    = $LIBRHASH_BUILD_TARGETS
928TEST_TARGETS     = $LIBRHASH_TEST_TARGETS
929SOLINK_TARGET    = $LIBRHASH_SOLINK_TARGET
930EXTRA_INSTALL_LIBSHARED   = $EXTRA_INSTALL_LIBSHARED
931EXTRA_UNINSTALL_LIBSHARED = $EXTRA_UNINSTALL_LIBSHARED
932
933OPTFLAGS    = $OPTFLAGS
934OPTLDFLAGS  = $WIN_LDFLAGS
935WARN_CFLAGS = $WARN_CFLAGS
936ADDCFLAGS   = $BUILD_EXTRA_CFLAGS
937ADDLDFLAGS  = $BUILD_EXTRA_LDFLAGS
938CFLAGS  = $LIBRHASH_DEFINES \$(OPTFLAGS) \$(WARN_CFLAGS) \$(ADDCFLAGS)
939LDFLAGS = \$(OPTLDFLAGS) \$(ADDLDFLAGS)
940SHARED_CFLAGS  = \$(CFLAGS) $LIBRHASH_SH_CFLAGS
941SHARED_LDFLAGS = \$(LDFLAGS) $(join_params $OPENSSL_LDFLAGS $LIBRHASH_SH_LDFLAGS)
942VERSION_CFLAGS = -DRHASH_XVERSION=$RHASH_XVERSION
943BIN_STATIC_LDFLAGS = \$(LDFLAGS) $(join_params $LD_STATIC $OPENSSL_LDFLAGS)
944
945EOF
946fi
947
948if test -n "$LIBRHASH_PC"; then
949  PC_EXC="$INSTALL_EXEC_PREFIX"
950  PC_INC="$INSTALL_INCDIR"
951  PC_LIB="$INSTALL_LIBDIR"
952  test "$PC_EXC" = "${INSTALL_PREFIX}" && PC_EXC='${prefix}'
953  test "$PC_INC" = "${INSTALL_PREFIX}/include" && PC_INC='${prefix}/include'
954  test "$PC_LIB" = "${INSTALL_EXEC_PREFIX}/lib" && PC_LIB='${exec_prefix}/lib'
955  echo "Writing ${LIBRHASH_PC}"
956  cat > $LIBRHASH_PC << EOF
957prefix=${INSTALL_PREFIX}
958exec_prefix=${PC_EXC}
959libdir=${PC_LIB}
960includedir=${PC_INC}
961
962Name: librash
963Description: LibRHash shared library
964Version: ${RHASH_VERSION}
965Cflags: -I\${includedir}
966Libs: -L\${libdir} -lrhash
967Libs.private: ${OPENSSL_LDFLAGS}
968
969EOF
970fi
971