1#!/usr/bin/env bash
2
3# This script looks for the necessary BOOST sub-libraries.
4# If found, it prints out two SHELL assignments (to be processed
5# using the eval commmand) to BOOST_LIB_DIR & BOOST_LDLIBS.
6# If not, it prints out a warning and returns with exit code 1.
7
8SCRIPT_NAME=[[`basename "$0"`]]
9
10SUBLIBS="system thread filesystem"
11
12# taken from StackExchange 256434
13is_absolute()
14{
15    case "$1" in
16	///* | //) true;;
17	//*) false;;
18	/*) true;;
19	*) false;;
20    esac
21}
22
23##################################################################
24# Check we have 1 arg
25
26if [ "$#" \!= "1" -o -z "$1" ]
27then
28    echo "ERROR: expected 1 arg (full path of BOOST_HDR_DIR)   $SCRIPT_NAME"   > /dev/stderr
29    exit 1
30fi
31
32if [ \! -d "$1" -o \! -d "$1/boost" ]
33then
34  echo "ERROR: arg must be a directory containing subdir \"boost\"   $SCRIPT_NAME"   > /dev/stderr
35  exit 2
36fi
37
38BOOST_HDR_DIR="$1"
39
40# Check environment variable COCOA_EXTLIB_DIR
41
42if [ -z "$COCOA_EXTLIB_DIR" ]
43then
44    echo "ERROR: environment variable COCOA_EXTLIB_DIR not set.   $SCRIPT_NAME"   > /dev/stderr
45    exit 1
46fi
47
48# The following is a cryptic if...then block
49is_absolute "$COCOA_EXTLIB_DIR" ||
50(
51  echo "ERROR: environment variable COCOA_EXTLIB_DIR is not absolute: \"$COCOA_EXTLIB_DIR\"   $SCRIPT_NAME"   > /dev/stderr
52  exit 1
53)
54
55if [ \! -d "$COCOA_EXTLIB_DIR" -o \! -d "$COCOA_EXTLIB_DIR/include" -o \! -d "$COCOA_EXTLIB_DIR/lib" ]
56then
57  echo "ERROR: environment variable COCOA_EXTLIB_DIR is implausible: \"$COCOA_EXTLIB_DIR\"   $SCRIPT_NAME"   > /dev/stderr
58  exit 1
59fi
60
61
62
63#############################################################################
64# Find directory of this script (taken from link below)
65# http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get-the-full-path-to-itself
66
67pushd . > /dev/null
68SCRIPT_PATH="${BASH_SOURCE[0]}"
69while [ -L "$SCRIPT_PATH" ]
70do
71  cd "`dirname "$SCRIPT_PATH"`"
72  SCRIPT_PATH="$(readlink "`basename "$SCRIPT_PATH"`")"
73done
74cd "`dirname "$SCRIPT_PATH"`" > /dev/null
75SCRIPT_DIR="`pwd`"
76popd  > /dev/null
77
78
79has_libboost_mt ()
80{
81    MISSING_SUBLIBS=
82    for sublib in $SUBLIBS
83    do
84	/bin/ls "${1}"/libboost_$sublib-mt.* >/dev/null 2>&1
85	if [ $? -ne 0 ]
86	then
87	    MISSING_SUBLIBS="libboost_$sublib-mt $MISSING_SUBLIBS"
88	fi
89    done
90    test -z "$MISSING_SUBLIBS"
91}
92
93has_libboost ()
94{
95    MISSING_SUBLIBS=
96    for sublib in $SUBLIBS
97    do
98	/bin/ls "${1}"/libboost_$sublib.* >/dev/null 2>&1
99	if [ $? -ne 0 ]
100	then
101	    MISSING_SUBLIBS="libboost_$sublib $MISSING_SUBLIBS"
102	fi
103    done
104    test -z "$MISSING_SUBLIBS"
105}
106
107
108# Special handling if BOOST is not fully installed...
109if [ -d "$BOOST_HDR_DIR/stage" -a -r "$BOOST_HDR_DIR/stage" -a -d "$BOOST_HDR_DIR/stage/lib" -a -r "$BOOST_HDR_DIR/stage/lib" ]
110then
111    BOOST_LIB_DIR="$BOOST_HDR_DIR/stage/lib"
112else
113    # CHEAP HACK: prefer lib/x86_64-linux-gnu over lib64 over lib
114    # Remember: GMP probably chose 64-bits
115    BOOST_LIB_DIR_DIR="`dirname \"$BOOST_HDR_DIR\"`"
116    for subdir in  lib/x86_64-linux-gnu  lib64  lib  lib/i386-linux-gnu
117    do
118      DIR="$BOOST_LIB_DIR_DIR/$subdir"
119      if [ -d "$DIR" ]
120      then
121        if has_libboost_mt "$DIR"
122        then
123          TAIL="-mt"
124          BOOST_LIB_DIR="$DIR"
125          break
126	fi
127        if has_libboost "$DIR"
128        then
129          TAIL=
130          BOOST_LIB_DIR="$DIR"
131          break
132	fi
133      fi
134    done
135fi
136
137if [ -z "$BOOST_LIB_DIR" ]
138then
139    echo "WARNING: BOOST headers found, but not the required BOOST libs ($SUBLIBS)   $SCRIPT_NAME"   > /dev/stderr
140    echo > /dev/stderr
141  exit 1
142fi
143
144# Heuristic for recognizing standard installation of BOOST
145BOOST_LIB_DIR_DIR=`dirname "$BOOST_LIB_DIR"`
146if [ "$BOOST_LIB_DIR_DIR" = /usr -o "$BOOST_LIB_DIR_DIR" = /usr/local ]
147then
148    BOOST_IS_STANDARD=yes  ## not currently used
149else
150    TAIL="-symlink"
151    for sublib in $SUBLIBS
152    do
153	BOOST_LIB_ORIG=`/bin/ls "$BOOST_LIB_DIR"/libboost_$sublib$THREADED.* | head -1`
154	BOOST_LIB_EXTN=`"$SCRIPT_DIR/extn.sh" "$BOOST_LIB_ORIG"`
155	/bin/ln -s "$BOOST_LIB_ORIG" $COCOA_EXTLIB_DIR/lib/libboost_$sublib-symlink.$BOOST_LIB_EXTN
156    done
157fi
158
159BOOST_LDLIBS=
160for sublib in $SUBLIBS
161do
162    BOOST_LDLIBS="-lboost_$sublib$TAIL $BOOST_LDLIBS"
163done
164echo "BOOST_LIB_DIR=\"$BOOST_LIB_DIR\""
165echo "BOOST_LDLIBS=\"$BOOST_LDLIBS\""
166exit 0
167