1#!/usr/local/bin/bash 2# =========================================================================== 3# 4# PUBLIC DOMAIN NOTICE 5# National Center for Biotechnology Information 6# 7# This software/database is a "United States Government Work" under the 8# terms of the United States Copyright Act. It was written as part of 9# the author's official duties as a United States Government employee and 10# thus cannot be copyrighted. This software/database is freely available 11# to the public for use. The National Library of Medicine and the U.S. 12# Government have not placed any restriction on its use or reproduction. 13# 14# Although all reasonable efforts have been taken to ensure the accuracy 15# and reliability of the software and data, the NLM and the U.S. 16# Government do not and cannot warrant the performance or results that 17# may be obtained by using this software or data. The NLM and the U.S. 18# Government disclaim all warranties, express or implied, including 19# warranties of performance, merchantability or fitness for any particular 20# purpose. 21# 22# Please cite the author in any work or product based on this material. 23# 24# =========================================================================== 25 26# prepare script name 27SELF_NAME="$(basename $0)" 28BUILD_DIR="$(dirname $0)" 29TOP="$(dirname $BUILD_DIR)" 30SCRIPT_BASE="${0%.sh}" 31 32# os 33OS="$1" 34shift 35 36# architecture 37ARCH="$1" 38shift 39 40# binary loader tool 41LD="$1" 42shift 43 44# configuration 45unset SHLX 46unset DYLX 47unset LIBX 48unset OBJX 49unset LOBX 50 51# parameters 52TYPE=exe 53STATIC=0 54DYLD=0 55STATICSYSLIBS=0 56CHECKSUM=0 57KPROC=4 58THREADS=0 59HAVE_KSPROC=0 60NEED_KPROC=1 61HAVE_GZIP=0 62NEED_GZIP=1 63HAVE_BZIP=0 64NEED_BZIP=1 65HAVE_DL=0 66NEED_DL=1 67HAVE_M=0 68NEED_M=1 69HAVE_XML=0 70NEED_XML=0 71HAVE_KFC=0 72HAVE_KAPP=0 73HAVE_NCBI_VDB=0 74HAVE_NCBI_WVDB=0 75unset BUILD 76unset LDIRS 77unset XDIRS 78unset SRCDIR 79unset BINDIR 80unset VERSFILE 81unset VERSDIR 82unset TARG 83unset EXT 84unset OBJS 85unset LIBS 86unset DEPFILE 87 88# paths for translating local to remote 89unset RHOME 90unset LHOME 91unset RHOST 92unset LOUTDIR 93unset ROUTDIR 94unset PROXY_TOOL 95 96while [ $# -ne 0 ] 97do 98 99 case "$1" in 100 --build) 101 BUILD="$2" 102 shift 103 ;; 104 105 --ldflags) 106 LDFLAGS="$2" 107 shift 108 ;; 109 110 --static-system-libs) 111 STATICSYSLIBS=1 112 ;; 113 114 --checksum) 115 CHECKSUM=1 116 ;; 117 118 --shlx) 119 SHLX="$2" 120 shift 121 ;; 122 123 --dylx) 124 SHLX="$2" 125 shift 126 ;; 127 128 --libx) 129 LIBX="$2" 130 shift 131 ;; 132 133 --objx) 134 OBJX="$2" 135 shift 136 ;; 137 138 --srcdir) 139 SRCDIR="$2" 140 shift 141 ;; 142 143 --bindir) 144 BINDIR="$2" 145 shift 146 ;; 147 148 --rhome) 149 RHOME="$2" 150 shift 151 ;; 152 153 --lhome) 154 LHOME="$2" 155 shift 156 ;; 157 158 --loutdir) 159 LOUTDIR="$2" 160 shift 161 ;; 162 163 --routdir) 164 ROUTDIR="$2" 165 shift 166 ;; 167 168 --rhost) 169 RHOST="$2" 170 shift 171 ;; 172 173 --rport) 174 RPORT="$2" 175 shift 176 ;; 177 178 --proxy_tool) 179 PROXY_TOOL="$2" 180 shift 181 ;; 182 183 -MD) 184 DEPFILE=1 185 ;; 186 187 -L*) 188 ARG="${1#-L}" 189 if [ "$ARG" = "" ] 190 then 191 ARG="$2" 192 shift 193 fi 194 LDIRS="$LDIRS:$ARG" 195 ;; 196 197 -X*) 198 ARG="${1#-X}" 199 if [ "$ARG" = "" ] 200 then 201 ARG="$2" 202 shift 203 fi 204 XDIRS="$XDIRS:$ARG" 205 ;; 206 207 --dlib) 208 TYPE=dlib 209 ;; 210 211 --slib) 212 TYPE=slib 213 ;; 214 215 --stub) 216 TYPE=stub 217 ;; 218 219 --exe) 220 TYPE=exe 221 ;; 222 223 --static) 224 STATIC=1 225 ;; 226 227 --vers) 228 if [ -f "$2" ] 229 then 230 VERSFILE="$2" 231 elif [ -d "$2" ] 232 then 233 VERSDIR="$2" 234 else 235 echo "$SELF_NAME: expected version file or source directory" 236 exit 3 237 fi 238 shift 239 ;; 240 241 -o*) 242 ARG="${1#-o}" 243 if [ "$ARG" = "" ] 244 then 245 ARG="$2" 246 shift 247 fi 248 TARG="$ARG" 249 ;; 250 251 -lz|-sz|-dz) 252 LIBS="$LIBS $1" 253 HAVE_GZIP=1 254 ;; 255 -[lds]bz2) 256 LIBS="$LIBS $1" 257 HAVE_BZIP=1 258 ;; 259 -[lds]dl) 260 LIBS="$LIBS $1" 261 HAVE_DL=1 262 ;; 263 264 -[lds]xml2) 265 HAVE_XML=32 266 ;; 267 268 -[lds]m) 269 HAVE_M=16 270 ;; 271 272 -lsradb|-ssradb|-dsradb|-lwsradb|-swsradb) 273 LIBS="$LIBS $1" 274 NEED_DL=1 275 DYLD=2 276 ;; 277 278 -lkrypto|-dkrypto) 279 LIBS="$LIBS $1" 280 NEED_KPROC=1 281 ;; 282 -skrypto) 283 LIBS="$LIBS $1" 284 NEED_KPROC=1 285 ;; 286 287 -[ld]kproc) 288 KPROC=4 289 LIBS="$LIBS $1" 290 ;; 291 -skproc) 292 KPROC=4 293 THREADS=8 294 LIBS="$LIBS $1" 295 ;; 296 297 -[lds]ncbi-vdb) 298 HAVE_NCBI_VDB=1 299 KPROC=4 300 HAVE_GZIP=1 301 HAVE_BZIP=1 302 HAVE_KFC=1 303 NEED_M=1 304 305 NEED_XML=$CONFIGURE_FOUND_XML2 306 # CONFIGURE_FOUND_XML2 comes from Makefile.config.$OS.$ARCH 307 308 LIBS="$LIBS $1" 309 ;; 310 -[lds]ncbi-ngs-c++) 311 HAVE_NCBI_VDB=1 312 KPROC=4 313 HAVE_GZIP=1 314 HAVE_BZIP=1 315 HAVE_KFC=1 316 NEED_M=1 317 NEED_XML=$CONFIGURE_FOUND_XML2 318 LIBS="$LIBS $1" 319 ;; 320 -[lds]ncbi-wvdb) 321 HAVE_NCBI_WVDB=1 322 KPROC=4 323 HAVE_GZIP=1 324 HAVE_BZIP=1 325 HAVE_KFC=1 326 NEED_M=16 327 NEED_XML=$CONFIGURE_FOUND_XML2 328 LIBS="$LIBS $1" 329 ;; 330 331 -[lds]ksproc) 332 HAVE_KSPROC=1 333 LIBS="$LIBS $1" 334 THREADS=0 335 ;; 336 337 -[lds]pthread) 338 THREADS=8 339 ;; 340 341 -[ls]kfs) 342 LIBS="$LIBS $1" 343 NEED_GZIP=1 344 NEED_BZIP=1 345 NEED_DL=1 346 ;; 347 -dkfs) 348 LIBS="$LIBS $1" 349 NEED_GZIP=1 350 NEED_BZIP=1 351 NEED_DL=1 352 DYLD=2 353 ;; 354 355 -[ls]vfs) 356 LIBS="$LIBS $1" 357 ;; 358 -dvfs) 359 LIBS="$LIBS $1" 360 DYLD=2 361 ;; 362 363 -[ls]kxml) 364 LIBS="$LIBS $1" 365 NEED_XML=1 366 ;; 367 -dkxml) 368 LIBS="$LIBS $1" 369 NEED_XML=1 370 DYLD=2 371 ;; 372 373 -[lds]ncbi-bam) 374 LIBS="$LIBS $1" 375 #NEED_GZIP=1 376 ;; 377 378 -[lds]kapp) 379 HAVE_KAPP=1 380 ;; 381 382 -[lds]kapp-norsrc) 383 HAVE_KAPP=1 384 ;; 385 386 -[lds]kfc) 387 LIBS="$LIBS $1" 388 HAVE_KFC=1 389 ;; 390 391 -[ls]*) 392 LIBS="$LIBS $1" 393 ;; 394 395 -d*) 396 LIBS="$LIBS $1" 397 DYLD=2 398 ;; 399 400 *.$OBJX) 401 OBJS="$OBJS $1" 402 ;; 403 404 esac 405 406 shift 407done 408 409# correct for prefixes 410LDIRS="${LDIRS#:}" 411XDIRS="${XDIRS#:}" 412LIBS="${LIBS# }" 413OBJS="${OBJS# }" 414 415# split target 416OUTDIR=$(dirname "$TARG") 417NAME=$(basename "$TARG") 418 419# dependency file 420[ "$DEPFILE" != "" ] && DEPFILE="$NAME.$TYPE.d" 421 422# parse target 423if [ "$TYPE" = "dlib" ] && [ "$DYLX" != "" ] 424then 425 EXT="$DYLX" 426 NAME="${NAME%.$DYLX}" 427fi 428 429unset VERS 430 431V="${NAME#${NAME%\.[^.]*}\.}" 432if [[ $V == ${V//[^0-9]/} ]] 433then 434 ARG="${NAME%\.$V}" 435 VERS="$V" 436 NAME="${ARG#.}" 437 438 V="${NAME#${NAME%\.[^.]*}\.}" 439 if [[ $V == ${V//[^0-9]/} ]] 440 then 441 ARG="${NAME%\.$V}" 442 VERS="$V.$VERS" 443 NAME="${ARG#.}" 444 445 V="${NAME#${NAME%\.[^.]*}\.}" 446 if [[ $V == ${V//[^0-9]/} ]] 447 then 448 ARG="${NAME%\.$V}" 449 VERS="$V.$VERS" 450 NAME="${ARG#.}" 451 fi 452 fi 453 #echo "ARG=$ARG,VERS=$VERS,NAME=$NAME" 454fi 455 456case "$TYPE" in 457dlib) 458 if [ "$SHLX" != "" ] 459 then 460 EXT="$SHLX" 461 NAME="${NAME%.$SHLX}" 462 fi 463 ;; 464slib) 465 EXT="$LIBX" 466 NAME="${NAME%.$LIBX}" 467esac 468 469unset DBGAP 470if [ "$NAME" != "${NAME%-dbgap}" ] 471then 472 DBGAP=-dbgap 473 NAME="${NAME%-dbgap}" 474fi 475 476# locate version file and version 477[ "$VERSDIR" != "" ] && VERSFILE="$VERSDIR/$NAME.vers" 478if [ "$VERSFILE" != "" ] 479then 480 if [ ! -f "$VERSFILE" ] 481 then 482 echo "$SELF_NAME: warning - creating version file '$VERSFILE'" 483 echo 1.0.0 > $VERSFILE 484 fi 485 486 if [ ! -r "$VERSFILE" ] 487 then 488 echo "$SELF_NAME: version file '$VERSFILE' is unreadable" 489 exit 5 490 fi 491 492 ARG=$(cat $VERSFILE) 493 if [ "$VERS" != "" ] && [ "$VERS" != "$ARG" ] && [ "$ARG" = "${ARG#$VERS.}" ] 494 then 495 echo "$SELF_NAME: version from file '$VERSFILE' ($ARG) does not match '$VERS'" 496 exit 5 497 fi 498 VERS="$ARG" 499fi 500 501# fix kapp 502[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -ne 0 ] && LIBS="-lkapp $LIBS" 503[ $HAVE_KAPP -ne 0 ] && [ $HAVE_KFC -eq 0 ] && LIBS="-lkapp-norsrc $LIBS" 504 505# detect need for kproc 506if [ $KPROC -eq 0 ] && [ $NEED_KPROC -ne 0 ] && [ $HAVE_KSPROC -eq 0 ] 507then 508 KPROC=4 509 LIBS="$LIBS -lkproc" 510fi 511 512# turn on threads for kproc 513[ $KPROC -ne 0 ] && THREADS=8 514 515# supply missing libraries 516[ $HAVE_GZIP -eq 0 ] && [ $NEED_GZIP -ne 0 ] && LIBS="$LIBS -lz" 517[ $HAVE_BZIP -eq 0 ] && [ $NEED_BZIP -ne 0 ] && LIBS="$LIBS -lbz2" 518[ $HAVE_DL -eq 0 ] && [ $NEED_DL -ne 0 ] && LIBS="$LIBS -ldl" 519[ $HAVE_M -eq 0 ] && [ $NEED_M -ne 0 ] && HAVE_M=16 520[ $HAVE_XML -eq 0 ] && [ $NEED_XML -ne 0 ] && HAVE_XML=32 521 522# overwrite dependencies 523[ -f "$DEPFILE" ] && rm -f "$DEPFILE" 524 525# generate mode 526MODE=$(expr $HAVE_XML + $HAVE_M + $THREADS + $KPROC + $DYLD + $STATIC) 527#MODE=$(expr $THREADS + $KPROC + $DYLD + 1) 528 529# generate SCM flags 530SCMFLAGS=$(expr $STATICSYSLIBS + $STATICSYSLIBS + $CHECKSUM) 531if [ 0 -ne 0 ] 532then 533 echo "# $SELF_NAME" 534 echo "# script-base : $SCRIPT_BASE" 535 echo "# OS : $OS" 536 echo "# type : $TYPE" 537 echo "# tool : $LD" 538 echo "# ARCH : $ARCH" 539 echo "# BUILD : $BUILD" 540 echo "# srcdir : $SRCDIR" 541 echo "# bindir : $BINDIR" 542 echo "# outdir : $OUTDIR" 543 echo "# target : $TARG" 544 echo "# name : $NAME" 545 echo "# dbgap : $DBGAP" 546 echo "# version : $VERS" 547 echo "# vers file : $VERSFILE" 548 echo "# dep file : $DEPFILE" 549 echo "# mode : $MODE" 550 echo "# DYLD : $DYLD" 551 echo "# SCMFLAGS : $SCMFLAGS" 552 echo "# LDFLAGS : $LDFLAGS" 553 echo "# LDIRS : $LDIRS" 554 echo "# XDIRS : $XDIRS" 555 echo "# objects : $OBJS" 556 echo "# libraries : $LIBS" 557 echo "# rhost : $RHOST" 558 echo "# rport : $RPORT" 559 echo "# rhome : $RHOME" 560 echo "# lhome : $LHOME" 561 echo "# proxy_tool : $PROXY_TOOL" 562 563 echo "# static sys libs: $STATICSYSLIBS" 564 echo "# checksum : $CHECKSUM" 565 echo "# static : $STATIC" 566 echo "# kproc : $KPROC" 567 echo "# thread libs : $THREADS" 568 echo "# vers dir : $VERSDIR" 569 echo "# extension : $EXT" 570fi 571 572# perform link 573"$SCRIPT_BASE.$OS.$TYPE.sh" "$LD" "$ARCH" "$BUILD" "$SRCDIR" "$BINDIR" "$OUTDIR" \ 574 "$TARG" "$NAME" "$DBGAP" "$VERS" "$VERSFILE" "$DEPFILE" "$MODE" "$SCMFLAGS" \ 575 "$LDFLAGS" "$LDIRS" "$XDIRS" "$OBJS" "$LIBS" "$PROXY_TOOL" "$RHOST" "$RPORT" "$RHOME" "$LHOME" "$(pwd)" "$ROUTDIR" "$LOUTDIR" || exit $? 576 577# establish links 578if [ "$VERS" != "" ] && [ "$OS" != "win" ] && [ "$OS" != "rwin" ] 579then 580 $SCRIPT_BASE.$OS.ln.sh "$TYPE" "$OUTDIR" "$TARG" "$NAME" "$DBGAP" "$EXT" "$VERS" 581fi 582 583# SCM 584if [ $CHECKSUM -eq 1 ] && [ "$OS" = "linux" ] 585then 586 # calling the scm-version-script 587 # parameters are: module-name, current-md5-file, version-file 588 if [ $TYPE = "dlib" ] || [ $TYPE = "exe" ] || [ $STATIC -eq 1 ] 589 then 590 SCM_DIR="$TOP/scm" 591 LOGFILE="$SCM_DIR/scm.log" 592 SCMD="$BUILD_DIR/scm.sh $NAME $TARG.md5 $VERSFILE" 593 echo "$SCMD" >> $LOGFILE 594 $SCMD 595 fi 596fi 597