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