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