blob: 8cc10f13a278611071038110b40dc2030af7f370 (
plain) (
tree)
|
|
#!/usr/bin/env bash
# Launcher bash script that bootstraps CBT from source.
# (Some of the code for reporting missing dependencies and waiting for nailgun to come up is a bit weird.)
# This is inentionally kept as small as posible.
# Welcome improvements to this file:
# - reduce code size through better ideas
# - reduce code size by moving more of this into type-checked Java/Scala code (if possible without performance loss).
# - reduction of dependencies
# - performance improvements
# utility function to log message to stderr with stating the time
log () {
msg=$1
enabled=1
while test $# -gt 0; do
case "$1" in
"-Dlog=time") enabled=0 ;;
"-Dlog=all") enabled=0 ;;
esac
shift
done
if [ $enabled -eq 0 ]; then
which gdate 2>&1 > /dev/null
gdate_installed=$?
if [ $gdate_installed -eq 0 ]; then
i=`gdate +"%S.%N"`
echo "[$i] $msg" 1>&2
fi
fi
}
log "Checking for dependencies" $*
which javac 2>&1 > /dev/null
javac_installed=$?
if [ ! $javac_installed -eq 0 ]; then
echo "You need to install javac! CBT needs it to bootstrap from Java sources into Scala." 1>&2
exit 1
fi
javac_version=$(javac -version 2>&1 | cut -d ' ' -f 2)
javac_version_minor=$(echo -n $javac_version | cut -d '.' -f 2)
if [ ! "$javac_version_minor" -ge "8" ]; then
echo "You need to install javac version 1.8 or greater! CBT currently relies on Java 8." 2>&1
echo "Current javac version is $javac_version" 2>&1
exit 1
fi
which ng 2>&1 > /dev/null
ng_installed=$?
which ng-server 2>&1 > /dev/null
ng_server_installed=$?
nailgun_installed=0
if [ ! $ng_installed -eq 0 ] || [ ! $ng_server_installed -eq 0 ]; then
nailgun_installed=1
echo "(Note: nailgun not found. It makes CBT faster! Try 'brew install nailgun'.)" 1>&2
fi
which realpath 2>&1 > /dev/null
realpath_installed=$?
which gcc 2>&1 > /dev/null
gcc_installed=$?
if [ ! $realpath_installed -eq 0 ] && [ ! $gcc_installed -eq 0 ]; then
echo "You need realpath or gcc installed! CBT needs it to locate itself reliably." 1>&2
exit 1
fi
which gpg 2>&1 > /dev/null
gpg_installed=$?
if [ ! $gpg_installed -eq 0 ]; then
echo "(Note: gpg not found. In order to use publishSigned you'll need it.)" 1>&2
fi
NAILGUN_PORT=4444
NG="ng --nailgun-port $NAILGUN_PORT"
CWD=$(pwd)
_DIR=$(dirname $(readlink "$0") 2>/dev/null || dirname "$0" 2>/dev/null )
log "Find out real path. Build realpath if needed." $*
export CBT_HOME=$(dirname $($_DIR/realpath/realpath.sh $0))
export SCALA_VERSION="2.11.7"
export NAILGUN=$CBT_HOME/nailgun_launcher/
export STAGE1=$CBT_HOME/stage1/
export TARGET=target/scala-2.11/classes/
mkdir -p $NAILGUN$TARGET
mkdir -p $STAGE1$TARGET
which nc 2>&1 > /dev/null
nc_installed=$?
log "Check for running nailgun with nc." $*
server_up=1
if [ $nc_installed -eq 0 ]; then
nc -z -n -w 1 127.0.0.1 $NAILGUN_PORT > /dev/null 2>&1
server_up=$?
else
echo "(Note: nc not found. It will make slightly startup faster.)" 1>&2
fi
if [ $nc_installed -eq 0 ] || [ ! $server_up -eq 0 ]; then
log "Starting up nailgun server." $*
# try to start nailgun-server, just in case it's not up
ng-server 127.0.0.1:$NAILGUN_PORT >> $NAILGUN/target/nailgun.stdout.log 2>> $NAILGUN/target/nailgun.stderr.log &
fi
log "Downloading Scala jars if necessary..." $*
export SCALA_CLASSPATH=`$CBT_HOME/bootstrap_scala/bootstrap_scala $SCALA_VERSION`
if [ ! $? -eq 0 ]; then echo "Problem with bootstrap_scala" 1>&2; exit 1; fi
SCALAC="java -Xmx256M -Xms32M\
-Xbootclasspath/a:$SCALA_CLASSPATH\
-Dscala.usejavacp=true\
-Denv.emacs=\
scala.tools.nsc.Main\
-deprecation\
-feature"
stage1 () {
log "Checking for source changes in NailgunLauncher and maybe compiling." $*
NAILGUN_INDICATOR=$NAILGUN$TARGET/cbt/NailgunLauncher.class
changed=0
for file in `ls $NAILGUN/*.java`; do
if [ $file -nt $NAILGUN_INDICATOR ]; then changed=1; fi
done
compiles=0
if [ $changed -eq 1 ]; then
#rm $NAILGUN$TARGET/cbt/*.class 2>/dev/null
echo "Recompiling NailgunLauncher. Detected source changes." 1>&2
javac -Xlint:deprecation -d $NAILGUN$TARGET `ls $NAILGUN*.java`
compiles=$?
if [ $compiles -ne 0 ]; then exit 1; fi
if [ $nailgun_installed -eq 0 ]; then
echo "Stopping nailgun" 1>&2
$NG ng-stop >> $NAILGUN/target/nailgun.stdout.log 2>> $NAILGUN/target/nailgun.stderr.log &
echo "Restarting nailgun" 1>&2
ng-server 127.0.0.1:$NAILGUN_PORT >> $NAILGUN/target/nailgun.stdout.log 2>> $NAILGUN/target/nailgun.stderr.log &
fi
fi
log "Checking for source changes in Stage1 and maybe compiling." $*
STAGE1_INDICATOR=$STAGE1$TARGET/cbt/Stage1.class
changed2=0
for file in `ls $STAGE1*.scala`; do
if [ $file -nt $STAGE1_INDICATOR ]; then changed2=1; fi
done
compiles2=0
if [ $changed2 -eq 1 ]; then
echo "Recompiling Stage1. Detected source changes." 1>&2
rm $STAGE1$TARGET/cbt/*.class 2>/dev/null
$SCALAC -cp $NAILGUN$TARGET -d $STAGE1$TARGET `ls $STAGE1/*.scala`
compiles2=$?
if [ $compiles2 -ne 0 ]; then exit 1; fi
fi
log "run CBT and loop if desired. This allows recompiling CBT itself as part of compile looping." $*
if [ "$1" = "admin" ]; then
mainClass=cbt.AdminStage1
else
mainClass=cbt.Stage1
fi
CP=$STAGE1$TARGET:$SCALA_CLASSPATH
if [ $nailgun_installed -eq 1 ] || [ "$1" = "publishSigned" ] || [ "$2" = "publishSigned" ] || [ "$1" = "direct" ] || [ "$2" = "direct" ]
then
log "Running JVM directly" $*
# -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=localhost:5005
java -cp $NAILGUN$TARGET cbt.NailgunLauncher $mainClass $CP "$CWD" $*
else
log "Running via nailgun." $*
while true; do
log "Adding classpath." $*
$NG ng-cp $NAILGUN$TARGET >> $NAILGUN/target/nailgun.stdout.log 2>> $NAILGUN/target/nailgun.stderr.log
log "Checking if nailgun is up yet." $*
$NG cbt.NailgunLauncher cbt.CheckAlive $CP "$CWD" $* >> $NAILGUN/target/nailgun.stdout.log 2>> $NAILGUN/target/nailgun.stderr.log
alive=$?
if [[ $alive -eq 33 ]]; then
break
else
log "Nope. Sleeping for 1 second" $*
echo "Waiting for nailgun to start..." 1>&2
sleep 1
fi
done
log "Running $mainClass via Nailgun." $*
$NG cbt.NailgunLauncher $mainClass $CP "$CWD" $*
fi
log "Done running $mainClass." $*
}
while true; do
stage1 $*
if [ ! "$1" = "loop" ]; then
break
fi
echo "======= Restarting CBT =======" 1>&2
done
log "Exiting CBT" $*
|