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