UNIXworkcode

1 #!/bin/sh 2 3 4 # some utility functions 5 isplatform() 6 { 7 for p in $PLATFORM 8 do 9 if [ "$p" = "$1" ]; then 10 return 0 11 fi 12 done 13 return 1 14 } 15 notisplatform() 16 { 17 for p in $PLATFORM 18 do 19 if [ "$p" = "$1" ]; then 20 return 1 21 fi 22 done 23 return 0 24 } 25 istoolchain() 26 { 27 for t in $TOOLCHAIN 28 do 29 if [ "$t" = "$1" ]; then 30 return 0 31 fi 32 done 33 return 1 34 } 35 notistoolchain() 36 { 37 for t in $TOOLCHAIN 38 do 39 if [ "$t" = "$1" ]; then 40 return 1 41 fi 42 done 43 return 0 44 } 45 46 # clean abort 47 abort_configure() 48 { 49 rm -Rf "$TEMP_DIR" 50 exit 1 51 } 52 53 # Test for availability of pkg-config 54 PKG_CONFIG=`command -v pkg-config` 55 : ${PKG_CONFIG:="false"} 56 57 # Simple uname based platform detection 58 # $PLATFORM is used for platform dependent dependency selection 59 OS=`uname -s` 60 OS_VERSION=`uname -r` 61 ARCH=`uname -m` 62 printf "detect platform... " 63 if [ "$OS" = "SunOS" ]; then 64 PLATFORM="solaris sunos unix svr4" 65 elif [ "$OS" = "Linux" ]; then 66 PLATFORM="linux unix" 67 elif [ "$OS" = "FreeBSD" ]; then 68 PLATFORM="freebsd bsd unix" 69 elif [ "$OS" = "OpenBSD" ]; then 70 PLATFORM="openbsd bsd unix" 71 elif [ "$OS" = "NetBSD" ]; then 72 PLATFORM="netbsd bsd unix" 73 elif [ "$OS" = "Darwin" ]; then 74 PLATFORM="macos osx bsd unix" 75 elif echo "$OS" | grep -i "MINGW" > /dev/null; then 76 PLATFORM="windows mingw" 77 fi 78 : ${PLATFORM:="unix"} 79 80 PLATFORM_NAME=`echo "$PLATFORM" | cut -f1 -d' ' -` 81 echo "$PLATFORM_NAME" 82 83 84 # help text 85 printhelp() 86 { 87 echo "Usage: $0 [OPTIONS]..." 88 echo 'Configuration:' 89 if true \ 90 ; then 91 : 92 if test -z "$prefix__described__"; then 93 prefix__described__=1 94 cat << '__EOF__' 95 --prefix path prefix for architecture-independent files 96 [`pwd`/work] 97 __EOF__ 98 fi 99 if test -z "$exec_prefix__described__"; then 100 exec_prefix__described__=1 101 cat << '__EOF__' 102 --exec-prefix path prefix for architecture-dependent files [PREFIX] 103 __EOF__ 104 fi 105 fi 106 cat << '__EOF__' 107 108 Build Types: 109 --debug add extra compile flags for debug builds 110 --release add extra compile flags for release builds 111 112 Optional Features: 113 --enable-postgresql 114 115 __EOF__ 116 abort_configure 117 } 118 119 # create temporary directory 120 TEMP_DIR=".tmp-`uname -n`" 121 rm -Rf "$TEMP_DIR" 122 if mkdir -p "$TEMP_DIR"; then 123 : 124 else 125 echo "Cannot create tmp dir $TEMP_DIR" 126 echo "Abort" 127 exit 1 128 fi 129 touch "$TEMP_DIR/options" 130 touch "$TEMP_DIR/features" 131 132 # config variables 133 if true \ 134 ; then 135 : 136 if test -z "$host__initialized__"; then 137 host__initialized__=1 138 host=`uname -n` 139 fi 140 if test -z "$prefix__initialized__"; then 141 prefix__initialized__=1 142 prefix='`pwd`/work' 143 fi 144 if test -z "$exec_prefix__initialized__"; then 145 exec_prefix__initialized__=1 146 exec_prefix='' 147 fi 148 fi 149 150 # features 151 152 # 153 # parse arguments 154 # 155 BUILD_TYPE="default" 156 for ARG in "$@" 157 do 158 case "$ARG" in 159 "--prefix="*) prefix=${ARG#--prefix=} ;; 160 "--exec-prefix="*) exec_prefix=${ARG#--exec-prefix=} ;; 161 "--help"*) printhelp ;; 162 "--debug") BUILD_TYPE="debug" ;; 163 "--release") BUILD_TYPE="release" ;; 164 "--enable-postgresql") FEATURE_POSTGRESQL=on ;; 165 "--disable-postgresql") unset FEATURE_POSTGRESQL ;; 166 "-"*) echo "unknown option: $ARG"; abort_configure ;; 167 esac 168 done 169 170 # toolchain detection utilities 171 . make/toolchain.sh 172 173 # check languages 174 lang_c= 175 lang_cpp= 176 if detect_c_compiler ; then 177 lang_c=1 178 fi 179 180 181 182 # set defaults for dir variables 183 : ${exec_prefix:="$prefix"} 184 : ${bindir:='${exec_prefix}/bin'} 185 : ${sbindir:='${exec_prefix}/sbin'} 186 : ${libdir:='${exec_prefix}/lib'} 187 : ${libexecdir:='${exec_prefix}/libexec'} 188 : ${datarootdir:='${prefix}/share'} 189 : ${datadir:='${datarootdir}'} 190 : ${sharedstatedir:='${prefix}/com'} 191 if [ -z "$sysconfdir" ]; then 192 if [ "$prefix" = '/usr' ]; then 193 sysconfdir='/etc' 194 else 195 sysconfdir='${prefix}/etc' 196 fi 197 fi 198 if [ -z "$localstatedir" ]; then 199 if [ "$prefix" = '/usr' ]; then 200 localstatedir='/var' 201 else 202 localstatedir='${prefix}/var' 203 fi 204 fi 205 if [ -z "$runstatedir" ]; then 206 if [ "$prefix" = '/usr' ]; then 207 runstatedir='/var/run' 208 else 209 runstatedir='${prefix}/var' 210 fi 211 fi 212 : ${includedir:='${prefix}/include'} 213 : ${infodir:='${datarootdir}/info'} 214 : ${mandir:='${datarootdir}/man'} 215 : ${localedir:='${datarootdir}/locale'} 216 217 218 # check if a config.site exists and load it 219 CONFIG_SITE_OK=0 220 if [ -n "$CONFIG_SITE" ]; then 221 # CONFIG_SITE may contain space separated file names 222 for cs in $CONFIG_SITE; do 223 printf "loading defaults from $cs... " 224 if [ -f "$cs" ]; then 225 . "$cs" 226 echo ok 227 CONFIG_SITE_OK=1 228 break 229 else 230 echo "not found" 231 fi 232 done 233 elif [ -f "$prefix/share/config.site" ]; then 234 printf "loading site defaults... " 235 . "$prefix/share/config.site" 236 echo ok 237 CONFIG_SITE_OK=1 238 elif [ -f "$prefix/etc/config.site" ]; then 239 printf "loading site defaults... " 240 . "$prefix/etc/config.site" 241 echo ok 242 CONFIG_SITE_OK=1 243 fi 244 245 if [ $CONFIG_SITE_OK -eq 0 ]; then 246 # try to detect the correct libdir on our own, except it was changed by the user 247 if [ "$libdir" = '${exec_prefix}/lib' ] ; then 248 if [ "$TOOLCHAIN_WSIZE" = "64" ] ; then 249 if [ "$OS" = "SunOS" ]; then 250 [ -d "${exec_prefix}/lib/64" ] && libdir='${exec_prefix}/lib/64' 251 else 252 [ -d "${exec_prefix}/lib64" ] && libdir='${exec_prefix}/lib64' 253 fi 254 elif [ "$TOOLCHAIN_WSIZE" = "32" ] ; then 255 if [ "$OS" = "SunOS" ]; then 256 [ -d "${exec_prefix}/lib/32" ] && libdir='${exec_prefix}/lib/32' 257 else 258 [ -d "${exec_prefix}/lib32" ] && libdir='${exec_prefix}/lib32' 259 fi 260 fi 261 fi 262 fi 263 264 265 # generate vars.mk 266 cat > "$TEMP_DIR/vars.mk" << __EOF__ 267 host=$host 268 prefix=$prefix 269 exec_prefix=$exec_prefix 270 __EOF__ 271 272 273 # 274 # DEPENDENCIES 275 # 276 277 278 279 # create buffer for make variables required by dependencies 280 echo > "$TEMP_DIR/make.mk" 281 282 test_pkg_config() 283 { 284 if "$PKG_CONFIG" --exists "$1" ; then : 285 else return 1 ; fi 286 if [ -z "$2" ] || "$PKG_CONFIG" --atleast-version="$2" "$1" ; then : 287 else return 1 ; fi 288 if [ -z "$3" ] || "$PKG_CONFIG" --exact-version="$3" "$1" ; then : 289 else return 1 ; fi 290 if [ -z "$4" ] || "$PKG_CONFIG" --max-version="$4" "$1" ; then : 291 else return 1 ; fi 292 return 0 293 } 294 295 print_check_msg() 296 { 297 if [ -z "$1" ]; then 298 shift 299 printf "$@" 300 fi 301 } 302 303 dependency_error_libpq() 304 { 305 print_check_msg "$dep_checked_libpq" "checking for libpq... " 306 # dependency libpq 307 while true 308 do 309 if [ -z "$PKG_CONFIG" ]; then 310 break 311 fi 312 if test_pkg_config "libpq" "" "" "" ; then 313 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags libpq`" 314 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs libpq`" 315 else 316 break 317 fi 318 cat >> $TEMP_DIR/make.mk << __EOF__ 319 # Dependency: libpq 320 CFLAGS += -DENABLE_POSTGRESQL 321 PLUGINS += postgresql 322 TEST_PLUGIN_LDFLAGS += -lwspgtest 323 __EOF__ 324 print_check_msg "$dep_checked_libpq" "yes\n" 325 dep_checked_libpq=1 326 return 1 327 done 328 329 print_check_msg "$dep_checked_libpq" "no\n" 330 dep_checked_libpq=1 331 return 0 332 } 333 dependency_error_openssl() 334 { 335 print_check_msg "$dep_checked_openssl" "checking for openssl... " 336 # dependency openssl 337 while true 338 do 339 if [ -z "$PKG_CONFIG" ]; then 340 break 341 fi 342 if test_pkg_config "openssl" "" "" "" ; then 343 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags openssl`" 344 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs openssl`" 345 else 346 break 347 fi 348 print_check_msg "$dep_checked_openssl" "yes\n" 349 dep_checked_openssl=1 350 return 1 351 done 352 353 # dependency openssl 354 while true 355 do 356 TEMP_LDFLAGS="$TEMP_LDFLAGS -lssl -lcrypto" 357 print_check_msg "$dep_checked_openssl" "yes\n" 358 dep_checked_openssl=1 359 return 1 360 done 361 362 print_check_msg "$dep_checked_openssl" "no\n" 363 dep_checked_openssl=1 364 return 0 365 } 366 dependency_error_libxml2() 367 { 368 print_check_msg "$dep_checked_libxml2" "checking for libxml2... " 369 # dependency libxml2 370 while true 371 do 372 if [ -z "$PKG_CONFIG" ]; then 373 break 374 fi 375 if test_pkg_config "libxml-2.0" "" "" "" ; then 376 TEMP_CFLAGS="$TEMP_CFLAGS `"$PKG_CONFIG" --cflags libxml-2.0`" 377 TEMP_LDFLAGS="$TEMP_LDFLAGS `"$PKG_CONFIG" --libs libxml-2.0`" 378 else 379 break 380 fi 381 print_check_msg "$dep_checked_libxml2" "yes\n" 382 dep_checked_libxml2=1 383 return 1 384 done 385 386 # dependency libxml2 387 while true 388 do 389 if tmp_flags=`xml2-config --cflags` ; then 390 TEMP_CFLAGS="$TEMP_CFLAGS $tmp_flags" 391 else 392 break 393 fi 394 if tmp_flags=`xml2-config --libs` ; then 395 TEMP_LDFLAGS="$TEMP_LDFLAGS $tmp_flags" 396 else 397 break 398 fi 399 print_check_msg "$dep_checked_libxml2" "yes\n" 400 dep_checked_libxml2=1 401 return 1 402 done 403 404 print_check_msg "$dep_checked_libxml2" "no\n" 405 dep_checked_libxml2=1 406 return 0 407 } 408 409 # start collecting dependency information 410 echo > "$TEMP_DIR/flags.mk" 411 412 DEPENDENCIES_FAILED= 413 ERROR=0 414 # unnamed dependencies 415 TEMP_CFLAGS="$CFLAGS" 416 TEMP_CXXFLAGS="$CXXFLAGS" 417 TEMP_LDFLAGS="$LDFLAGS" 418 while true 419 do 420 while true 421 do 422 if [ -z "$lang_c" ] ; then 423 ERROR=1 424 break 425 fi 426 427 break 428 done 429 break 430 done 431 while true 432 do 433 if notisplatform "linux"; then 434 break 435 fi 436 while true 437 do 438 439 TEMP_CFLAGS="$TEMP_CFLAGS -DLINUX" 440 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -ldl -lm -lldap -llber" 441 cat >> "$TEMP_DIR/make.mk" << __EOF__ 442 # platform dependend source files 443 PLATFORM_DAEMONOBJ = event_linux.o 444 445 # platform dependend vars 446 OBJ_EXT = .o 447 LIB_EXT = .so 448 APP_EXT = 449 450 # ld flags 451 UCX_SO_NAME = 452 RPATH_WS_LIB_FLAG = -Wl,-rpath,'\$\$ORIGIN/../lib' 453 __EOF__ 454 break 455 done 456 break 457 done 458 while true 459 do 460 if notisplatform "bsd"; then 461 break 462 fi 463 if isplatform "macos" || istoolchain "macos"; then 464 break 465 fi 466 while true 467 do 468 469 TEMP_CFLAGS="$TEMP_CFLAGS -DBSD -I/usr/local/include" 470 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -lm -lldap -llber" 471 cat >> "$TEMP_DIR/make.mk" << __EOF__ 472 # platform dependend source files 473 PLATFORM_DAEMONOBJ = event_bsd.o 474 475 # platform dependend vars 476 OBJ_EXT = .o 477 LIB_EXT = .so 478 APP_EXT = 479 480 # ld flags 481 UCX_SO_NAME = 482 RPATH_WS_LIB_FLAG = -Wl,-rpath,'\$\$ORIGIN/../lib' 483 __EOF__ 484 break 485 done 486 break 487 done 488 while true 489 do 490 if notisplatform "macos"; then 491 break 492 fi 493 while true 494 do 495 496 TEMP_CFLAGS="$TEMP_CFLAGS -DBSD -DOSX" 497 TEMP_LDFLAGS="$TEMP_LDFLAGS -lpthread -ldl -lm -lldap -llber" 498 cat >> "$TEMP_DIR/make.mk" << __EOF__ 499 # platform dependend source files 500 PLATFORM_DAEMONOBJ = event_bsd.o 501 502 # platform dependend vars 503 OBJ_EXT = .o 504 LIB_EXT = .dylib 505 APP_EXT = 506 507 # ld flags 508 SHLIB_LDFLAGS = -dynamiclib 509 UCX_SO_NAME = -install_name @rpath/libucx.dylib 510 RPATH_WS_LIB_FLAG = -rpath @loader_path/../lib 511 __EOF__ 512 break 513 done 514 break 515 done 516 while true 517 do 518 if notisplatform "solaris"; then 519 break 520 fi 521 while true 522 do 523 524 TEMP_CFLAGS="$TEMP_CFLAGS -DSOLARIS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS" 525 TEMP_LDFLAGS="$TEMP_LDFLAGS -lsocket -lnsl -lsendfile -lposix4 -lpthread -ldl -lm -lmd -lldap" 526 cat >> "$TEMP_DIR/make.mk" << __EOF__ 527 # platform dependend source files 528 PLATFORM_DAEMONOBJ = event_solaris.o 529 530 # platform dependend vars 531 OBJ_EXT = .o 532 LIB_EXT = .so 533 APP_EXT = 534 __EOF__ 535 break 536 done 537 break 538 done 539 while true 540 do 541 while true 542 do 543 544 cat >> "$TEMP_DIR/make.mk" << __EOF__ 545 HOST = $host 546 INSTALL_DIR = $prefix 547 __EOF__ 548 break 549 done 550 break 551 done 552 553 # build type 554 if [ "$BUILD_TYPE" = "debug" ]; then 555 TEMP_CFLAGS="\${DEBUG_CFLAGS} $TEMP_CFLAGS" 556 TEMP_CXXFLAGS="\${DEBUG_CXXFLAGS} $TEMP_CXXFLAGS" 557 fi 558 if [ "$BUILD_TYPE" = "release" ]; then 559 TEMP_CFLAGS="\${RELEASE_CFLAGS} $TEMP_CFLAGS" 560 TEMP_CXXFLAGS="\${RELEASE_CXXFLAGS} $TEMP_CXXFLAGS" 561 fi 562 563 # add general dependency flags to flags.mk 564 echo "# general flags" >> "$TEMP_DIR/flags.mk" 565 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then 566 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 567 fi 568 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then 569 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 570 fi 571 if [ -n "${TEMP_LDFLAGS}" ]; then 572 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 573 fi 574 575 # 576 # OPTION VALUES 577 # 578 579 # 580 # TARGETS 581 # 582 583 echo >> "$TEMP_DIR/flags.mk" 584 echo "configuring global target" 585 echo "# flags for unnamed target" >> "$TEMP_DIR/flags.mk" 586 TEMP_CFLAGS= 587 TEMP_CXXFLAGS= 588 TEMP_LDFLAGS= 589 590 if dependency_error_libxml2; then 591 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libxml2 " 592 ERROR=1 593 fi 594 if dependency_error_openssl; then 595 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED openssl " 596 ERROR=1 597 fi 598 599 # Features 600 601 602 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then 603 echo "CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 604 fi 605 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then 606 echo "CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 607 fi 608 if [ -n "${TEMP_LDFLAGS}" ]; then 609 echo "LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 610 fi 611 612 echo >> "$TEMP_DIR/flags.mk" 613 echo "configuring target: postgresql" 614 echo "# flags for target postgresql" >> "$TEMP_DIR/flags.mk" 615 TEMP_CFLAGS= 616 TEMP_CXXFLAGS= 617 TEMP_LDFLAGS= 618 619 620 # Features 621 if [ -n "$FEATURE_POSTGRESQL" ]; then 622 # check dependency 623 if dependency_error_libpq ; then 624 # "auto" features can fail and are just disabled in this case 625 if [ "$FEATURE_POSTGRESQL" = "auto" ]; then 626 DISABLE_FEATURE_POSTGRESQL=1 627 else 628 DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED libpq " 629 ERROR=1 630 fi 631 fi 632 if [ -n "$DISABLE_FEATURE_POSTGRESQL" ]; then 633 unset FEATURE_POSTGRESQL 634 fi 635 fi 636 if [ -n "$FEATURE_POSTGRESQL" ]; then 637 : 638 else 639 : 640 fi 641 642 643 if [ -n "${TEMP_CFLAGS}" ] && [ -n "$lang_c" ]; then 644 echo "POSTGRESQL_CFLAGS += $TEMP_CFLAGS" >> "$TEMP_DIR/flags.mk" 645 fi 646 if [ -n "${TEMP_CXXFLAGS}" ] && [ -n "$lang_cpp" ]; then 647 echo "POSTGRESQL_CXXFLAGS += $TEMP_CXXFLAGS" >> "$TEMP_DIR/flags.mk" 648 fi 649 if [ -n "${TEMP_LDFLAGS}" ]; then 650 echo "POSTGRESQL_LDFLAGS += $TEMP_LDFLAGS" >> "$TEMP_DIR/flags.mk" 651 fi 652 653 654 # final result 655 if [ $ERROR -ne 0 ]; then 656 echo 657 echo "Error: Unresolved dependencies" 658 echo "$DEPENDENCIES_FAILED" 659 abort_configure 660 fi 661 662 echo "configure finished" 663 echo 664 echo "Toolchain:" 665 echo " name: $TOOLCHAIN_NAME" 666 if [ -n "$TOOLCHAIN_CC" ]; then 667 echo " cc: $TOOLCHAIN_CC" 668 fi 669 if [ -n "$TOOLCHAIN_CXX" ]; then 670 echo " cxx: $TOOLCHAIN_CXX" 671 fi 672 if [ -n "$TOOLCHAIN_WSIZE" ]; then 673 echo " word size: $TOOLCHAIN_WSIZE bit" 674 fi 675 if [ -n "$TOOLCHAIN_CSTD" ]; then 676 echo " default C std: $TOOLCHAIN_CSTD" 677 fi 678 echo 679 echo "Config:" 680 printf ' %-16s' 'prefix:' 681 echo "$prefix" 682 printf ' %-16s' 'exec-prefix:' 683 echo "$exec_prefix" 684 echo 685 echo "Features:" 686 printf ' %-16s' 'postgresql:' 687 if [ -n "$FEATURE_POSTGRESQL" ]; then 688 echo 'on' 689 else 690 echo 'off' 691 fi 692 echo 693 694 # generate the config.mk file 695 pwd=`pwd` 696 cat > "$TEMP_DIR/config.mk" << __EOF__ 697 # 698 # config.mk generated by: 699 # pwd: $pwd 700 # $0 $@ 701 # 702 703 __EOF__ 704 write_toolchain_defaults "$TEMP_DIR/toolchain.mk" 705 cat "$TEMP_DIR/config.mk" "$TEMP_DIR/vars.mk" "$TEMP_DIR/toolchain.mk" "$TEMP_DIR/flags.mk" "$TEMP_DIR/make.mk" > config.mk 706 rm -Rf "$TEMP_DIR" 707