151 lines
3.8 KiB
Bash
151 lines
3.8 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
prefix="/opt/coin-or"
|
|
|
|
# get json2 for helping with github APIs later:
|
|
if [ ! -s "json2" ]; then
|
|
curl -LsS https://github.com/vi/json2/raw/master/json2 -o json2
|
|
fi
|
|
chmod +x json2
|
|
|
|
# ensure we can actually run it:
|
|
./json2 <<< '{}' >/dev/null
|
|
|
|
# prepare paths:
|
|
mkdir -p $prefix/lib/pkgconfig
|
|
PATH="$prefix/bin:$PATH"
|
|
PKG_CONFIG_PATH="$prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
|
|
|
|
# prepare a mapping of coin-or project names to their tar.gz's:
|
|
declare -A tgzs
|
|
|
|
note() {
|
|
echo -e "\e[1m$@\e[0m" >&2
|
|
}
|
|
|
|
stfu() {
|
|
"$@" > .stdout 2> .stderr || fail=$?
|
|
if [[ "$fail" -ne 0 ]]; then
|
|
echo "command failed with exit status $fail:" >&2
|
|
echo -E "$@" >&2
|
|
echo >&2
|
|
note '$ tail .stdout'
|
|
tail .stdout >&2
|
|
echo >&2
|
|
note '$ tail .stderr'
|
|
tail .stderr >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
get_autotool() {
|
|
if [ -s "$1.tar.gz" ]; then
|
|
note "skipping downloading $1"
|
|
return 0
|
|
fi
|
|
note "downloading $1"
|
|
curl -LsS "http://ftp.gnu.org/gnu/${1%-*}/$1.tar.gz" -o "$1.tar.gz"
|
|
}
|
|
|
|
make_autotool() {
|
|
if [[ $(command -v "${1%-*}") == "$prefix/bin"* ]]; then
|
|
note "skipping building $1"
|
|
return 0
|
|
fi
|
|
note "building $1"
|
|
|
|
# always extract in case configs/caches got messed up (as they do):
|
|
tar -xzf "$1.tar.gz"
|
|
pushd "$1" >/dev/null
|
|
stfu ./configure --prefix=$prefix
|
|
stfu make
|
|
stfu make install
|
|
popd >/dev/null
|
|
}
|
|
|
|
get_coin() {
|
|
organ="coin-or"
|
|
if [ "$1" == "BuildTools" ] || [[ "$1" == "ThirdParty-"* ]]; then
|
|
organ="coin-or-tools"
|
|
fi
|
|
|
|
curl -LsS "https://api.github.com/repos/$organ/$1/tags" | ./json2 > temp
|
|
for i in {0..9}; do # check first few tags for a release
|
|
grep -Eq "^/$i/name=releases" temp || continue
|
|
url="$(grep -E "^/$i/tarball_url=" temp)"
|
|
url="${url#*=}"
|
|
sha="$(grep -E "^/$i/commit/sha=" temp)"
|
|
sha="${sha#*=}"
|
|
tgz="$organ-$1-${sha::7}.tar.gz"
|
|
tgzs["$1"]="$tgz"
|
|
if [ -s "$tgz" ]; then
|
|
note "skipping downloading $1"
|
|
else
|
|
note "downloading $1"
|
|
curl -LsS "$url" -o "$tgz"
|
|
fi
|
|
return 0
|
|
done
|
|
echo "failed to find the latest release of $1" >&2
|
|
return 1
|
|
}
|
|
|
|
with() {
|
|
withs=()
|
|
for name in "$@"; do
|
|
withs+=("--with-$name")
|
|
if [ "$name" == "asl" ]; then
|
|
withs+=("--with-$name-lib=$(pkg-config --libs coin$name)")
|
|
withs+=("--with-$name-incdir=$prefix/include/coin/ThirdParty/")
|
|
else
|
|
withs+=("--with-$name-lib=$(pkg-config --libs $name)")
|
|
withs+=("--with-$name-incdir=$prefix/include/coin/")
|
|
fi
|
|
done
|
|
}
|
|
|
|
make_coin() {
|
|
note "building $1"
|
|
tgz="${tgzs[$1]}"
|
|
# always extract in case configs/caches got messed up (as they do):
|
|
tar -xzf "$tgz"
|
|
dir="$(tar -tzf "$tgz" | head -1 | cut -f1 -d/)"
|
|
pushd "$dir" >/dev/null
|
|
if [[ "$1" == "ThirdParty-"* ]]; then
|
|
stfu "./get.${1##*-}"
|
|
fi
|
|
shift
|
|
stfu ./configure --prefix=$prefix "${withs[@]}" "$@"
|
|
stfu make
|
|
stfu make install
|
|
popd >/dev/null
|
|
}
|
|
|
|
for autotool in autoconf-2.59 automake-1.9.6 libtool-1.5.22; do
|
|
get_autotool "$autotool"
|
|
make_autotool "$autotool"
|
|
done
|
|
|
|
get_coin CoinUtils
|
|
get_coin Osi
|
|
get_coin Clp
|
|
get_coin Cgl
|
|
get_coin Cbc
|
|
get_coin Ipopt
|
|
get_coin Bonmin
|
|
get_coin ThirdParty-ASL
|
|
|
|
with; make_coin ThirdParty-ASL
|
|
with; make_coin CoinUtils
|
|
with coinutils; make_coin Osi
|
|
with coinutils osi; make_coin Clp
|
|
with coinutils osi clp; make_coin Cgl
|
|
with coinutils osi clp cgl asl; make_coin Cbc
|
|
with coinutils osi clp cgl asl cbc; make_coin Ipopt --with-blas="/mingw64/bin/libopenblas.dll"
|
|
with coinutils osi clp cgl asl cbc ipopt; make_coin Bonmin
|
|
|
|
# FIXME: Bonmin needs to be linked with more stuff: (g++ invoked by libtool)
|
|
# -lipoptamplinterface
|
|
# -lcoinasl
|