|
#!/usr/bin/env bash |
|
|
|
|
|
# Note: erlang depends on ncurses, openssl at a minimum |
|
|
|
usage () |
|
{ |
|
echo "usage: $0 <release> <type>" |
|
echo " release: R14B01|R14B02|R14B03|R14B04|R15B|R15B01|R15B02|R15B03|R16B|R16B01|R16B02" |
|
echo " type: normal, opt, gcov, gprof, debug, valgrind, or lcnt" |
|
} |
|
|
|
CPU=`gcc -c -Q -march=native --help=target | grep march | awk '{print $2}'` |
|
|
|
case $2 in |
|
normal|opt|gcov|gprof|debug|valgrind|lcnt) |
|
export ERL_VARIETY=$2 |
|
;; |
|
*) |
|
usage; |
|
echo "Unsupported build type: \"$2\"" |
|
exit -1 |
|
esac |
|
|
|
case $1 in |
|
R14B01|R14B02|R14B03|R14B04|R15B|R15B01|R15B02|R15B03|R16B|R16B01|R16B02) |
|
echo "Goal: build a $2 version of Erlang OTP release $1 for $CPU" |
|
export ERL_VERSION=`echo $1 | tr '[A-Z]' '[a-z]'` |
|
export ERL_TAG=$1 |
|
echo " installed in /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}" |
|
echo " source /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}/activate to use it." |
|
;; |
|
*) |
|
usage; |
|
echo "Unsupported release $1" |
|
exit -1 |
|
esac |
|
|
|
export ERL_TOP=`pwd` |
|
|
|
do_git () |
|
{ |
|
echo "Cloning Erlang/OTP..." |
|
git clone git://github.com/erlang/otp.git |
|
(shopt -s dotglob nullglob && mv otp/* . && rmdir otp) |
|
git checkout refs/tags/OTP_${ERL_TAG} || exit -1 |
|
echo -n "On ref/tags/" |
|
git describe --tags |
|
echo "done" |
|
} |
|
|
|
do_clean () |
|
{ |
|
echo -n "Cleaning..." |
|
make -j clean 2>&1 > /dev/null && \ |
|
./otp_build remove_prebuilt_files 2>&1 > /dev/null |
|
echo "done" |
|
} |
|
|
|
do_configure () |
|
{ |
|
echo "Configuring..." |
|
[ -f configure ] || ./otp_build autoconf 2>&1 > /dev/null |
|
CFLAGS="-Og -g -march=native -mtune=native" ./otp_build configure --disable-hipe --enable-smp-support --enable-thread --enable-kernel-poll --prefix=/opt/erlang/${ERL_VARIETY}/${ERL_VERSION} |
|
echo "done" |
|
} |
|
|
|
do_build () |
|
{ |
|
echo "Building..." |
|
if [ ! `wx-config --help`]; then |
|
for lib in odbc wx debugger observer; do touch lib/${lib}/SKIP ; done |
|
fi |
|
make -j |
|
if [ ${ERL_VARIETY} != "normal" ]; then |
|
(cd erts/emulator && make -j ${ERL_VARIETY} FLAVOR=smp) |
|
fi |
|
echo "done" |
|
} |
|
|
|
do_install () |
|
{ |
|
echo "Building..." |
|
make install |
|
if [ ${ERL_VARIETY} != "normal" ]; then |
|
export ERL_DEST_BIN=`dirname /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}/lib/erlang/erts-*/bin/beam.smp` |
|
cp $ERL_TOP/bin/x86_64*/beam.${ERL_VARIETY}.smp ${ERL_DEST_BIN} |
|
mv ${ERL_DEST_BIN}/beam.smp ${ERL_DEST_BIN}/beam.smp-normal |
|
ln ${ERL_DEST_BIN}/beam.${ERL_VARIETY}.smp ${ERL_DEST_BIN}/beam.smp |
|
fi |
|
echo "done" |
|
} |
|
|
|
[ -d .git ] || do_git; |
|
[ -f Makefile ] && do_clean; |
|
do_configure; |
|
do_build; |
|
do_install; |
|
|
|
cat > /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}/activate <<EOF |
|
# credits to virtualenv |
|
kerl_deactivate() |
|
{ |
|
if [ -n "\$_KERL_SAVED_PATH" ]; then |
|
PATH="\$_KERL_SAVED_PATH" |
|
export PATH |
|
unset _KERL_SAVED_PATH |
|
fi |
|
if [ -n "\$_KERL_SAVED_MANPATH" ]; then |
|
MANPATH="\$_KERL_SAVED_MANPATH" |
|
export MANPATH |
|
unset _KERL_SAVED_MANPATH |
|
fi |
|
if [ -n "\$_KERL_SAVED_AGNER_BIN" ]; then |
|
AGNER_BIN="\$_KERL_SAVED_AGNER_BIN" |
|
export AGNER_BIN |
|
unset _KERL_SAVED_AGNER_BIN |
|
fi |
|
if [ -n "\$_KERL_SAVED_AGNER_EXACT_PREFIX" ]; then |
|
AGNER_EXACT_PREFIX="\$_KERL_SAVED_AGNER_EXACT_PREFIX" |
|
export AGNER_EXACT_PREFIX |
|
unset _KERL_SAVED_AGNER_EXACT_PREFIX |
|
fi |
|
if [ -n "\$_KERL_SAVED_REBAR_PLT_DIR" ]; then |
|
REBAR_PLT_DIR="\$_KERL_SAVED_REBAR_PLT_DIR" |
|
export REBAR_PLT_DIR |
|
unset _KERL_SAVED_REBAR_PLT_DIR |
|
fi |
|
if [ -n "\$BASH" -o -n "\$ZSH_VERSION" ]; then |
|
hash -r |
|
fi |
|
if [ ! "\$1" = "nondestructive" ]; then |
|
unset -f kerl_deactivate |
|
fi |
|
} |
|
kerl_deactivate nondestructive |
|
_KERL_SAVED_PATH="\$PATH" |
|
export _KERL_SAVED_PATH |
|
_KERL_SAVED_MANPATH="\$MANPATH" |
|
export _KERL_SAVED_MANPATH |
|
_KERL_SAVED_AGNER_BIN="\$AGNER_BIN" |
|
export _KERL_SAVED_AGNER_BIN |
|
_KERL_SAVED_AGNER_EXACT_PREFIX="\$AGNER_EXACT_PREFIX" |
|
export _KERL_SAVED_AGNER_EXACT_PREFIX |
|
_KERL_SAVED_REBAR_PLT_DIR="\$REBAR_PLT_DIR" |
|
export _KERL_SAVED_REBAR_PLT_DIR |
|
PATH="__ROOTDIR__/bin:\$PATH" |
|
export PATH |
|
MANPATH="__ROOTDIR__/man:\$MANPATH" |
|
export MANPATH |
|
AGNER_BIN="__ROOTDIR__/bin" |
|
export AGNER_BIN |
|
AGNER_EXACT_PREFIX="__ROOTDIR__/lib" |
|
export AGNER_EXACT_PREFIX |
|
REBAR_PLT_DIR="__ROOTDIR__" |
|
export REBAR_PLT_DIR |
|
|
|
ROOTDIR=__ROOTDIR__/lib/erlang |
|
BINDIR=__BINDIR__ |
|
EMU=beam |
|
PROGNAME=erl |
|
export EMU |
|
export ROOTDIR |
|
export BINDIR |
|
export PROGNAME |
|
|
|
if [ -n "\$BASH" -o -n "\$ZSH_VERSION" ]; then |
|
hash -r |
|
fi |
|
|
|
EOF |
|
|
|
perl -pi -e "s^__ROOTDIR__^/opt/erlang/${ERL_VARIETY}/${ERL_VERSION}^" /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}/activate |
|
perl -pi -e "s^__BINDIR__^${ERL_DEST_BIN}^" /opt/erlang/${ERL_VARIETY}/${ERL_VERSION}/activate |