2017-04-06 16:19:44 +03:00
|
|
|
#!/bin/bash -e
|
|
|
|
|
|
|
|
set -o pipefail
|
|
|
|
|
|
|
|
FAIL=
|
|
|
|
PROVISION_DOWNLOAD_DIR=/tmp/x-provisioning
|
|
|
|
|
|
|
|
# parse command-line arguments
|
|
|
|
while ! test -z $1; do
|
|
|
|
case $1 in
|
|
|
|
--provision)
|
|
|
|
PROVISION_MONO=1
|
2017-04-07 14:47:26 +03:00
|
|
|
PROVISION_XI=1
|
|
|
|
PROVISION_XM=1
|
2017-04-06 16:19:44 +03:00
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--provision-mono)
|
|
|
|
PROVISION_MONO=1
|
|
|
|
shift
|
|
|
|
;;
|
2017-04-07 14:47:26 +03:00
|
|
|
--provision-xamarin-ios)
|
|
|
|
PROVISION_XI=1
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--provision-xamarin-mac)
|
|
|
|
PROVISION_XM=1
|
|
|
|
shift
|
|
|
|
;;
|
2017-04-06 16:19:44 +03:00
|
|
|
--provision-all)
|
|
|
|
PROVISION_MONO=1
|
2017-04-07 14:47:26 +03:00
|
|
|
PROVISION_XI=1
|
|
|
|
PROVISION_XM=1
|
2017-04-06 16:19:44 +03:00
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--ignore-mono)
|
|
|
|
IGNORE_MONO=1
|
|
|
|
shift
|
|
|
|
;;
|
2017-04-07 14:47:26 +03:00
|
|
|
--ignore-xamarin-ios)
|
|
|
|
IGNORE_XI=1
|
|
|
|
shift
|
|
|
|
;;
|
|
|
|
--ignore-xamarin-mac)
|
|
|
|
IGNORE_XM=1
|
|
|
|
shift
|
|
|
|
;;
|
2017-04-06 16:19:44 +03:00
|
|
|
*)
|
|
|
|
echo "Unknown argument: $1"
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# reporting functions
|
|
|
|
function fail () {
|
|
|
|
tput setaf 1 2>/dev/null || true
|
|
|
|
echo " $1"
|
|
|
|
tput sgr0 2>/dev/null || true
|
|
|
|
FAIL=1
|
|
|
|
}
|
|
|
|
|
|
|
|
function warn () {
|
|
|
|
tput setaf 3 2>/dev/null || true
|
|
|
|
echo " $1"
|
|
|
|
tput sgr0 2>/dev/null || true
|
|
|
|
}
|
|
|
|
|
|
|
|
function ok () {
|
|
|
|
echo " $1"
|
|
|
|
}
|
|
|
|
|
|
|
|
function log () {
|
|
|
|
echo " $1"
|
|
|
|
}
|
|
|
|
|
|
|
|
# $1: the version to check
|
|
|
|
# $2: the minimum version to check against
|
|
|
|
function is_at_least_version () {
|
|
|
|
ACT_V=$1
|
|
|
|
MIN_V=$2
|
|
|
|
|
|
|
|
if [[ "$ACT_V" == "$MIN_V" ]]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
IFS=. read -a V_ACT <<< "$ACT_V"
|
|
|
|
IFS=. read -a V_MIN <<< "$MIN_V"
|
|
|
|
|
|
|
|
# get the minimum # of elements
|
|
|
|
AC=${#V_ACT[@]}
|
|
|
|
MC=${#V_MIN[@]}
|
|
|
|
COUNT=$(($AC>$MC?$MC:$AC))
|
|
|
|
|
|
|
|
C=0
|
|
|
|
while (( $C < $COUNT )); do
|
|
|
|
ACT=${V_ACT[$C]}
|
|
|
|
MIN=${V_MIN[$C]}
|
|
|
|
if (( $ACT > $MIN )); then
|
|
|
|
return 0
|
|
|
|
elif (( "$MIN" > "$ACT" )); then
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
let C++
|
|
|
|
done
|
|
|
|
|
|
|
|
if (( $AC == $MC )); then
|
|
|
|
# identical?
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
if (( $AC > $MC )); then
|
|
|
|
# more version fields in actual than min: OK
|
|
|
|
return 0
|
|
|
|
elif (( $AC == $MC )); then
|
|
|
|
# entire strings aren't equal (first check in function), but each individual field is?
|
|
|
|
return 0
|
|
|
|
else
|
|
|
|
# more version fields in min than actual (1.0 vs 1.0.1 for instance): not OK
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_mono () {
|
|
|
|
local MONO_URL=`grep MIN_MONO_URL= Make.config | sed 's/.*=//'`
|
|
|
|
local MIN_MONO_VERSION=`grep MIN_MONO_VERSION= Make.config | sed 's/.*=//'`
|
|
|
|
|
|
|
|
if test -z $MONO_URL; then
|
|
|
|
fail "No MIN_MONO_URL set in Make.config, cannot provision"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p $PROVISION_DOWNLOAD_DIR
|
|
|
|
log "Downloading Mono $MIN_MONO_VERSION from $MONO_URL to $PROVISION_DOWNLOAD_DIR..."
|
|
|
|
local MONO_NAME=`basename $MONO_URL`
|
|
|
|
local MONO_PKG=$PROVISION_DOWNLOAD_DIR/$MONO_NAME
|
|
|
|
curl -L $MONO_URL > $MONO_PKG
|
|
|
|
|
|
|
|
log "Installing Mono $MIN_MONO_VERSION from $MONO_URL..."
|
|
|
|
sudo installer -pkg $MONO_PKG -target /
|
|
|
|
|
|
|
|
rm -f $MONO_PKG
|
|
|
|
}
|
|
|
|
|
|
|
|
function check_mono () {
|
|
|
|
if ! test -z $IGNORE_MONO; then return; fi
|
|
|
|
|
|
|
|
PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/bin/pkg-config
|
|
|
|
if ! /Library/Frameworks/Mono.framework/Commands/mono --version 2>/dev/null >/dev/null; then
|
|
|
|
if ! test -z $PROVISION_MONO; then
|
|
|
|
install_mono
|
|
|
|
else
|
|
|
|
fail "You must install the Mono MDK (http://www.mono-project.com/download/)"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
elif ! test -e $PKG_CONFIG_PATH; then
|
|
|
|
if ! test -z $PROVISION_MONO; then
|
|
|
|
install_mono
|
|
|
|
else
|
|
|
|
fail "Could not find pkg-config, you must install the Mono MDK (http://www.mono-project.com/download/)"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
MIN_MONO_VERSION=`grep MIN_MONO_VERSION= Make.config | sed 's/.*=//'`
|
|
|
|
MAX_MONO_VERSION=`grep MAX_MONO_VERSION= Make.config | sed 's/.*=//'`
|
|
|
|
|
|
|
|
ACTUAL_MONO_VERSION=`$PKG_CONFIG_PATH --modversion mono`.`cat /Library/Frameworks/Mono.framework/Home/updateinfo | cut -d' ' -f2 | cut -c6- | awk '{print(int($0))}'`
|
|
|
|
if ! is_at_least_version $ACTUAL_MONO_VERSION $MIN_MONO_VERSION; then
|
|
|
|
if ! test -z $PROVISION_MONO; then
|
|
|
|
install_mono
|
|
|
|
ACTUAL_MONO_VERSION=`$PKG_CONFIG_PATH --modversion mono`
|
|
|
|
else
|
|
|
|
fail "You must have at least Mono $MIN_MONO_VERSION, found $ACTUAL_MONO_VERSION"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
elif [[ "$ACTUAL_MONO_VERSION" == "$MAX_MONO_VERSION" ]]; then
|
|
|
|
: # this is ok
|
|
|
|
elif is_at_least_version $ACTUAL_MONO_VERSION $MAX_MONO_VERSION; then
|
|
|
|
if ! test -z $PROVISION_MONO; then
|
|
|
|
install_mono
|
|
|
|
ACTUAL_MONO_VERSION=`$PKG_CONFIG_PATH --modversion mono`.`cat /Library/Frameworks/Mono.framework/Home/updateinfo | cut -d' ' -f2 | cut -c6- | awk '{print(int($0))}'`
|
|
|
|
else
|
|
|
|
fail "Your mono version is too new, max version is $MAX_MONO_VERSION, found $ACTUAL_MONO_VERSION."
|
|
|
|
fail "You may edit Make.config and change MAX_MONO_VERSION to your actual version to continue the"
|
|
|
|
fail "build (unless you're on a release branch). Once the build completes successfully, please"
|
|
|
|
fail "commit the new MAX_MONO_VERSION value."
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
ok "Found Mono $ACTUAL_MONO_VERSION (at least $MIN_MONO_VERSION and not more than $MAX_MONO_VERSION is required)"
|
|
|
|
}
|
|
|
|
|
2017-04-07 14:47:26 +03:00
|
|
|
function install_pkg () {
|
|
|
|
local PRODUCT=$1
|
|
|
|
local MIN_VERSION=$2
|
|
|
|
local URL=$3
|
|
|
|
|
|
|
|
if test -z $URL; then
|
|
|
|
fail "No url set for $PRODUCT in Make.config, cannot provision"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p $PROVISION_DOWNLOAD_DIR
|
|
|
|
log "Downloading $PRODUCT $MIN_VERSION from $URL to $PROVISION_DOWNLOAD_DIR..."
|
|
|
|
local NAME=`basename $URL`
|
|
|
|
local PKG=$PROVISION_DOWNLOAD_DIR/$NAME
|
|
|
|
curl -L $URL > $PKG
|
|
|
|
|
|
|
|
log "Installing $PRODUCT $MIN_VERSION from $URL..."
|
|
|
|
sudo installer -pkg $PKG -target /
|
|
|
|
|
|
|
|
rm -f $PKG
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_xamarin_ios () {
|
|
|
|
local URL=`grep MIN_XI_URL= Make.config | sed 's/.*=//'`
|
|
|
|
local MIN_VERSION=`grep MIN_XI_VERSION= Make.config | sed 's/.*=//'`
|
|
|
|
|
|
|
|
install_pkg Xamarin.iOS "$MIN_VERSION" "$URL"
|
|
|
|
}
|
|
|
|
|
|
|
|
function install_xamarin_mac () {
|
|
|
|
local URL=`grep MIN_XM_URL= Make.config | sed 's/.*=//'`
|
|
|
|
local MIN_VERSION=`grep MIN_XM_VERSION= Make.config | sed 's/.*=//'`
|
|
|
|
|
|
|
|
install_pkg Xamarin.Mac "$MIN_VERSION" "$URL"
|
|
|
|
}
|
|
|
|
|
|
|
|
function check_xamarin_ios () {
|
|
|
|
if ! test -z $IGNORE_XI; then return; fi
|
|
|
|
|
|
|
|
local MIN_XI_VERSION=$(grep MIN_XI_VERSION= Make.config | sed 's/.*=//')
|
|
|
|
local MAX_XI_VERSION=$(grep MAX_XI_VERSION= Make.config | sed 's/.*=//')
|
|
|
|
|
|
|
|
if ! test -f /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/Version; then
|
|
|
|
if ! test -z $PROVISION_XI; then
|
|
|
|
install_xamarin_ios
|
|
|
|
else
|
|
|
|
fail "You must install Xamarin.iOS ($MIN_XI_VERSION)"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
local ACTUAL_XI_VERSION=$(cat /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/Version)
|
|
|
|
if ! is_at_least_version $ACTUAL_XI_VERSION $MIN_XI_VERSION; then
|
|
|
|
if ! test -z $PROVISION_XI; then
|
|
|
|
install_xamarin_ios
|
|
|
|
else
|
|
|
|
fail "You must have at least Xamarin.iOS $MIN_XI_VERSION, found $ACTUAL_XI_VERSION"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
elif [[ "$ACTUAL_XI_VERSION" == "$MAX_XI_VERSION" ]]; then
|
|
|
|
: # this is ok
|
|
|
|
elif is_at_least_version $ACTUAL_XI_VERSION $MAX_XI_VERSION; then
|
|
|
|
if ! test -z $PROVISION_XI; then
|
|
|
|
install_xamarin_ios
|
|
|
|
else
|
|
|
|
fail "Your Xamarin.iOS version is too new, max version is $MAX_XI_VERSION, found $ACTUAL_XI_VERSION."
|
|
|
|
fail "You may edit Make.config and change MAX_XI_VERSION to your actual version to continue the"
|
|
|
|
fail "build (unless you're on a release branch). Once the build completes successfully, please"
|
|
|
|
fail "commit the new MAX_XI_VERSION value."
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
local ACTUAL_XI_VERSION=$(cat /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/Version)
|
|
|
|
ok "Found Xamarin.iOS $ACTUAL_XI_VERSION (at least $MIN_XI_VERSION and not more than $MAX_XI_VERSION is required)"
|
|
|
|
}
|
|
|
|
|
|
|
|
function check_xamarin_mac () {
|
|
|
|
if ! test -z $IGNORE_XM; then return; fi
|
|
|
|
|
|
|
|
local MIN_XM_VERSION=$(grep MIN_XM_VERSION= Make.config | sed 's/.*=//')
|
|
|
|
local MAX_XM_VERSION=$(grep MAX_XM_VERSION= Make.config | sed 's/.*=//')
|
|
|
|
|
|
|
|
if ! test -f /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/Version; then
|
|
|
|
if ! test -z $PROVISION_XM; then
|
|
|
|
install_xamarin_mac
|
|
|
|
else
|
|
|
|
fail "You must install Xamarin.Mac ($MIN_XM_VERSION)"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
local ACTUAL_XM_VERSION=$(cat /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/Version)
|
|
|
|
if ! is_at_least_version $ACTUAL_XM_VERSION $MIN_XM_VERSION; then
|
|
|
|
if ! test -z $PROVISION_XM; then
|
|
|
|
install_xamarin_mac
|
|
|
|
else
|
|
|
|
fail "You must have at least Xamarin.Mac $MIN_XM_VERSION, found $ACTUAL_XM_VERSION"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
elif [[ "$ACTUAL_XM_VERSION" == "$MAX_XM_VERSION" ]]; then
|
|
|
|
: # this is ok
|
|
|
|
elif is_at_least_version $ACTUAL_XM_VERSION $MAX_XM_VERSION; then
|
|
|
|
if ! test -z $PROVISION_XM; then
|
|
|
|
install_xamarin_mac
|
|
|
|
else
|
|
|
|
fail "Your Xamarin.Mac version is too new, max version is $MAX_XM_VERSION, found $ACTUAL_XM_VERSION."
|
|
|
|
fail "You may edit Make.config and change MAX_XM_VERSION to your actual version to continue the"
|
|
|
|
fail "build (unless you're on a release branch). Once the build completes successfully, please"
|
|
|
|
fail "commit the new MAX_XM_VERSION value."
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
local ACTUAL_XM_VERSION=$(cat /Library/Frameworks/Xamarin.Mac.framework/Versions/Current/Version)
|
|
|
|
ok "Found Xamarin.Mac $ACTUAL_XM_VERSION (at least $MIN_XM_VERSION and not more than $MAX_XM_VERSION is required)"
|
|
|
|
}
|
|
|
|
|
2017-04-06 16:19:44 +03:00
|
|
|
echo "Checking system..."
|
|
|
|
|
|
|
|
check_mono
|
2017-04-07 14:47:26 +03:00
|
|
|
check_xamarin_ios
|
|
|
|
check_xamarin_mac
|
2017-04-06 16:19:44 +03:00
|
|
|
|
|
|
|
if test -z $FAIL; then
|
|
|
|
echo "System check succeeded"
|
|
|
|
else
|
|
|
|
echo "System check failed"
|
|
|
|
exit 1
|
|
|
|
fi
|