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