diff options
Diffstat (limited to 'kerl')
-rwxr-xr-x | kerl | 445 |
1 files changed, 298 insertions, 147 deletions
@@ -21,19 +21,27 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. +#Grep fix for mac pcre errors +GREP_OPTIONS='' + ERLANG_DOWNLOAD_URL=http://www.erlang.org/download -KERL_BASE_DIR="$HOME/.kerl" -KERL_CONFIG="$HOME/.kerlrc" -KERL_DOWNLOAD_DIR="$KERL_BASE_DIR/archives" -KERL_BUILD_DIR="$KERL_BASE_DIR/builds" -KERL_GIT_DIR="$KERL_BASE_DIR/gits" +# Default values +: ${KERL_BASE_DIR:="$HOME"/.kerl} +: ${KERL_CONFIG:="$HOME"/.kerlrc} +: ${KERL_DOWNLOAD_DIR:="${KERL_BASE_DIR:?}"/archives} +: ${KERL_BUILD_DIR:="${KERL_BASE_DIR:?}"/builds} +: ${KERL_GIT_DIR:="${KERL_BASE_DIR:?}"/gits} + if [ -n "$KERL_CONFIGURE_OPTIONS" ]; then _KCO="$KERL_CONFIGURE_OPTIONS" fi if [ -n "$KERL_CONFIGURE_APPLICATIONS" ]; then _KCA="$KERL_CONFIGURE_APPLICATIONS" fi +if [ -n "$KERL_CONFIGURE_DISABLE_APPLICATIONS" ]; then + _KCDA="$KERL_CONFIGURE_DISABLE_APPLICATIONS" +fi if [ -n "$KERL_SASL_STARTUP" ]; then _KSS="$KERL_SASL_STARTUP" fi @@ -43,13 +51,23 @@ fi if [ -n "$KERL_DEPLOY_RSYNC_OPTIONS" ]; then _KDRSYNC="$KERL_DEPLOY_RSYNC_OPTIONS" fi +if [ -n "$KERL_INSTALL_MANPAGES" ]; then + _KIM="$KERL_INSTALL_MANPAGES" +fi +if [ -n "$KERL_BUILD_PLT" ]; then + _KBPLT="$KERL_BUILD_PLT" +fi KERL_CONFIGURE_OPTIONS= KERL_CONFIGURE_APPLICATIONS= +KERL_CONFIGURE_DISABLE_APPLICATIONS= KERL_SASL_STARTUP= +KERL_DEPLOY_SSH_OPTIONS= +KERL_DEPLOY_RSYNC_OPTIONS= KERL_INSTALL_MANPAGES= +KERL_BUILD_PLT= # ensure the base dir exsists -mkdir -p "$KERL_BASE_DIR" +mkdir -p "$KERL_BASE_DIR" || exit 1 # source the config file if available if [ -f "$KERL_CONFIG" ]; then . "$KERL_CONFIG"; fi @@ -60,6 +78,9 @@ fi if [ -n "$_KCA" ]; then KERL_CONFIGURE_APPLICATIONS="$_KCA" fi +if [ -n "$_KCDA" ]; then + KERL_CONFIGURE_DISABLE_APPLICATIONS="$_KCDA" +fi if [ -n "$_KSS" ]; then KERL_SASL_STARTUP="$_KSS" fi @@ -69,6 +90,12 @@ fi if [ -n "$_KDRSYNC" ]; then KERL_DEPLOY_RSYNC_OPTIONS="$_KDRSYNC" fi +if [ -n "$_KIM" ]; then + KERL_INSTALL_MANPAGES="$_KIM" +fi +if [ -n "$_KBPLT" ]; then + KERL_BUILD_PLT="$_KBPLT" +fi if [ -z "$KERL_SASL_STARTUP" ]; then INSTALL_OPT=-minimal @@ -76,7 +103,7 @@ else INSTALL_OPT=-sasl fi -KERL_SYSTEM=`uname -s` +KERL_SYSTEM=$(uname -s) case "$KERL_SYSTEM" in Darwin|FreeBSD|OpenBSD) MD5SUM="openssl md5" @@ -94,7 +121,7 @@ usage() { echo "kerl: build and install Erlang/OTP" echo "usage: $0 <command> [options ...]" - echo "\n <command> Command to be executed\n" + printf "\n <command> Command to be executed\n\n" echo "Valid commands are:" echo " build Build specified release or git repository" echo " install Install the specified release at the given location" @@ -103,6 +130,7 @@ usage() echo " list List releases, builds and installations" echo " delete Delete builds and installations" echo " active Print the path of the active installation" + echo " plt Print Dialyzer PLT path for the active installation" echo " status Print available builds and installations" echo " prompt Print a string suitable for insertion in prompt" echo " cleanup Remove compilation artifacts (use after installation)" @@ -113,29 +141,30 @@ if [ $# -eq 0 ]; then usage; fi get_releases() { - curl -s $ERLANG_DOWNLOAD_URL/ | \ - sed $SED_OPT -e 's/^.*<[aA] [hH][rR][eE][fF]=\"\/download\/otp_src_(R1[-0-9A-Za-z_]+)\.tar\.gz\">.*$/\1/' \ - -e '/^R/!d' + curl -L -s $ERLANG_DOWNLOAD_URL/ | \ + sed $SED_OPT -e 's/^.*<[aA] [hH][rR][eE][fF]=\"\otp_src_([-0-9A-Za-z_.]+)\.tar\.gz\">.*$/\1/' \ + -e '/^R1|^[0-9]/!d' | \ + sed -e "s/^R\(.*\)/\1:R\1/" | sed -e "s/^\([^\:]*\)$/\1-z:\1/" | sort | cut -d':' -f2 } update_checksum_file() { echo "Getting the checksum file from erlang.org..." - curl $ERLANG_DOWNLOAD_URL/MD5 > "$KERL_DOWNLOAD_DIR/MD5" || exit 1 + curl -L $ERLANG_DOWNLOAD_URL/MD5 > "$KERL_DOWNLOAD_DIR"/MD5 || exit 1 } ensure_checksum_file() { - if [ ! -f "$KERL_DOWNLOAD_DIR/MD5" ]; then + if [ ! -f "$KERL_DOWNLOAD_DIR"/MD5 ]; then update_checksum_file fi } check_releases() { - if [ ! -f "$KERL_BASE_DIR/otp_releases" ]; then + if [ ! -f "$KERL_BASE_DIR"/otp_releases ]; then echo "Getting the available releases from erlang.org..." - get_releases > "$KERL_BASE_DIR/otp_releases" + get_releases > "$KERL_BASE_DIR"/otp_releases fi } @@ -155,17 +184,17 @@ lion_support() { is_valid_release() { check_releases - for rel in `cat $KERL_BASE_DIR/otp_releases`; do + while read -r rel; do if [ "$1" = "$rel" ]; then return 0 fi - done + done < "$KERL_BASE_DIR"/otp_releases return 1 } assert_valid_release() { - if ! is_valid_release $1; then + if ! is_valid_release "$1"; then echo "$1 is not a valid Erlang/OTP release" exit 1 fi @@ -174,15 +203,15 @@ assert_valid_release() get_release_from_name() { - if [ -f "$KERL_BASE_DIR/otp_builds" ]; then - for l in `cat "$KERL_BASE_DIR/otp_builds"`; do - rel=`echo $l | cut -d "," -f 1` - name=`echo $l | cut -d "," -f 2` + if [ -f "$KERL_BASE_DIR"/otp_builds ]; then + while read -r l; do + rel=$(echo "$l" | cut -d "," -f 1) + name=$(echo "$l" | cut -d "," -f 2) if [ "$name" = "$1" ]; then echo "$rel" return 0 fi - done + done < "$KERL_BASE_DIR"/otp_builds fi return 1 } @@ -190,18 +219,18 @@ get_release_from_name() get_newest_valid_release() { check_releases - for rel in `cat $KERL_BASE_DIR/otp_releases | tail -1`; do + while read -r rel; do if [ ! -z "$rel" ]; then echo "$rel" return 0 fi - done + done < "$KERL_BASE_DIR"/otp_releases | tail -1 return 1 } is_valid_installation() { - if [ -f "$1/activate" ]; then + if [ -f "$1"/activate ]; then return 0 fi return 1 @@ -209,7 +238,7 @@ is_valid_installation() assert_valid_installation() { - if ! is_valid_installation $1; then + if ! is_valid_installation "$1"; then echo "$1 is not a kerl-managed Erlang/OTP installation" exit 1 fi @@ -218,24 +247,24 @@ assert_valid_installation() assert_build_name_unused() { - if [ -f "$KERL_BASE_DIR/otp_builds" ]; then - for l in `cat "$KERL_BASE_DIR/otp_builds"`; do - name=`echo $l | cut -d "," -f 2` + if [ -f "$KERL_BASE_DIR"/otp_builds ]; then + while read -r l; do + name=$(echo "$l" | cut -d "," -f 2) if [ "$name" = "$1" ]; then echo "There's already a build named $1" exit 1 fi - done + done < "$KERL_BASE_DIR"/otp_builds fi } do_git_build() { - assert_build_name_unused $3 + assert_build_name_unused "$3" - GIT=`echo -n "$1" | $MD5SUM | cut -d " " -f $MD5SUM_FIELD` + GIT=$(echo -n "$1" | $MD5SUM | cut -d ' ' -f $MD5SUM_FIELD) mkdir -p "$KERL_GIT_DIR" - cd "$KERL_GIT_DIR" + cd "$KERL_GIT_DIR" || exit 1 echo "Checking Erlang/OTP git repository from $1..." if [ ! -d "$GIT" ]; then git clone -q --mirror "$1" "$GIT" > /dev/null 2>&1 @@ -244,37 +273,37 @@ do_git_build() exit 1 fi fi - cd "$GIT" + cd "$GIT" || exit 1 git remote update --prune > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error updating remote git repository" exit 1 fi - rm -Rf "$KERL_BUILD_DIR/$3" + rm -Rf "${KERL_BUILD_DIR:?}/$3" mkdir -p "$KERL_BUILD_DIR/$3" - cd "$KERL_BUILD_DIR/$3" + cd "$KERL_BUILD_DIR/$3" || exit 1 git clone -l "$KERL_GIT_DIR/$GIT" otp_src_git > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error cloning local git repository" exit 1 fi - cd otp_src_git - git checkout $2 > /dev/null 2>&1 + cd otp_src_git || exit 1 + git checkout "$2" > /dev/null 2>&1 if [ $? -ne 0 ]; then - git checkout -b $2 $2 > /dev/null 2>&1 + git checkout -b "$2" "$2" > /dev/null 2>&1 fi if [ $? -ne 0 ]; then echo "Couldn't checkout specified version" - rm -Rf "$KERL_BUILD_DIR/$3" + rm -Rf "${KERL_BUILD_DIR:?}/$3" exit 1 fi if [ ! -x otp_build ]; then echo "Not a valid Erlang/OTP repository" - rm -Rf "$KERL_BUILD_DIR/$3" + rm -Rf "${KERL_BUILD_DIR:?}/$3" exit 1 fi - LOGFILE="$KERL_BUILD_DIR/$3/otp_build.log" + LOGFILE="$KERL_BUILD_DIR/$3"/otp_build.log echo "Building Erlang/OTP $3 from git, please wait..." ./otp_build autoconf $KERL_CONFIGURE_OPTIONS > "$LOGFILE" 2>&1 && \ ./otp_build configure $KERL_CONFIGURE_OPTIONS > "$LOGFILE" 2>&1 @@ -285,35 +314,79 @@ do_git_build() if [ -n "$KERL_CONFIGURE_APPLICATIONS" ]; then find ./lib -maxdepth 1 -type d -exec touch -f {}/SKIP \; for i in $KERL_CONFIGURE_APPLICATIONS; do - rm ./lib/$i/SKIP + rm ./lib/"$i"/SKIP if [ $? -ne 0 ]; then echo "Couldn't prepare '$i' application for building" exit 1 fi done fi + if [ -n "$KERL_CONFIGURE_DISABLE_APPLICATIONS" ]; then + for i in $KERL_CONFIGURE_DISABLE_APPLICATIONS; do + touch -f ./lib/"$i"/SKIP + if [ $? -ne 0 ]; then + echo "Couldn't disable '$i' application for building" + exit 1 + fi + done + fi ./otp_build boot -a $KERL_CONFIGURE_OPTIONS > "$LOGFILE" 2>&1 if [ $? -ne 0 ]; then echo "Build error, see $LOGFILE" exit 1 fi rm -f "$LOGFILE" - ./otp_build release -a "$KERL_BUILD_DIR/$3/release_git" > /dev/null 2>&1 - cd "$KERL_BUILD_DIR/$3/release_git" - ./Install $INSTALL_OPT "$KERL_BUILD_DIR/$3/release_git" > /dev/null 2>&1 + ./otp_build release -a "$KERL_BUILD_DIR/$3"/release_git > /dev/null 2>&1 + cd "$KERL_BUILD_DIR/$3"/release_git || exit 1 + ./Install $INSTALL_OPT "$KERL_BUILD_DIR/$3"/release_git > /dev/null 2>&1 echo "Erlang/OTP $3 from git has been successfully built" list_add builds "git,$3" } +get_otp_version() +{ + echo $1 | sed $SED_OPT -e 's/R?([0-9]{1,2})[.AB]?[0-9]*/\1/' +} + do_build() { case "$KERL_SYSTEM" in Darwin) - if [ `gcc --version | grep llvm | wc -l` = "1" ]; then - if lion_support $1; then + # Apple removed OpenSSL from El Capitan, but its still in this + # funky location, so set ssl headers to look here + OSVERSION=`uname -r` + RELVERSION=`get_otp_version "$1"` + case "$OSVERSION" in + 15*) + echo -n $KERL_CONFIGURE_OPTIONS | grep "ssl" 1>/dev/null 2>&1 + # Reminder to self: 0 from grep means the string was detected + if [ $? -ne 0 ]; then + if [ ! -d /usr/include/openssl -o ! -d /usr/local/include/openssl ]; then + xc_ssl='/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdk/MacOSX.sdk/usr' + if [ -d "$xc_ssl/include/openssl" ] + then + if [ $RELVERSION -ge 17 ] + then + KERL_CONFIGURE_OPTIONS="$KERL_CONFIGURE_OPTIONS --with-ssl --with-ssl-incl=$xc_ssl" + else + KERL_CONFIGURE_OPTIONS="$KERL_CONFIGURE_OPTIONS --with-ssl=$xc_ssl" + fi + else + echo 'WARNING: No OpenSSL library was found in the usual places. Your Erlang will be built without crypto support!' + fi + unset xc_ssl + fi + fi + ;; + *) + ;; + esac + + if [ "$(gcc --version 2>/dev/null | grep -i -c llvm)" = "1" ]; then + if lion_support "$1"; then KERL_CONFIGURE_OPTIONS="CFLAGS=-O0 $KERL_CONFIGURE_OPTIONS" else - if [ -x "`which gcc-4.2`" ]; then + if [ -x "$(which gcc-4.2)" ]; then KERL_CONFIGURE_OPTIONS="CC=gcc-4.2 $KERL_CONFIGURE_OPTIONS" else KERL_CONFIGURE_OPTIONS="CC=llvm-gcc-4.2 CFLAGS=-O0 $KERL_CONFIGURE_OPTIONS" @@ -325,8 +398,8 @@ do_build() ;; esac - assert_valid_release $1 - assert_build_name_unused $2 + assert_valid_release "$1" + assert_build_name_unused "$2" FILENAME=otp_src_$1.tar.gz download "$FILENAME" @@ -336,12 +409,12 @@ do_build() UNTARDIRNAME="$KERL_BUILD_DIR/$2/otp_src_$1-kerluntar-$$" rm -rf "$UNTARDIRNAME" mkdir -p "$UNTARDIRNAME" - (cd "$UNTARDIRNAME" && tar xfz "$KERL_DOWNLOAD_DIR/$FILENAME" && mv * "$KERL_BUILD_DIR/$2/otp_src_$1") + (cd "$UNTARDIRNAME" && tar xfz "$KERL_DOWNLOAD_DIR/$FILENAME" && mv ./* "$KERL_BUILD_DIR/$2/otp_src_$1") rm -rf "$UNTARDIRNAME" fi echo "Building Erlang/OTP $1 ($2), please wait..." ERL_TOP="$KERL_BUILD_DIR/$2/otp_src_$1" - cd "$ERL_TOP" + cd "$ERL_TOP" || exit 1 LOGFILE="$KERL_BUILD_DIR/$2/otp_build_$1.log" if [ -n "$KERL_USE_AUTOCONF" ]; then ./otp_build autoconf $KERL_CONFIGURE_OPTIONS > "$LOGFILE" 2>&1 && \ @@ -358,7 +431,7 @@ do_build() if [ -n "$KERL_CONFIGURE_APPLICATIONS" ]; then find ./lib -maxdepth 1 -type d -exec touch -f {}/SKIP \; for i in $KERL_CONFIGURE_APPLICATIONS; do - rm ./lib/$i/SKIP + rm ./lib/"$i"/SKIP if [ $? -ne 0 ]; then echo "Couldn't prepare '$i' application for building" list_remove builds "$1 $2" @@ -366,6 +439,15 @@ do_build() fi done fi + if [ -n "$KERL_CONFIGURE_DISABLE_APPLICATIONS" ]; then + for i in $KERL_CONFIGURE_DISABLE_APPLICATIONS; do + touch -f ./lib/"$i"/SKIP + if [ $? -ne 0 ]; then + echo "Couldn't disable '$i' application for building" + exit 1 + fi + done + fi ./otp_build boot -a $KERL_CONFIGURE_OPTIONS > "$LOGFILE" 2>&1 if [ $? -ne 0 ]; then echo "Build failed, see $LOGFILE" @@ -374,7 +456,7 @@ do_build() fi rm -f "$LOGFILE" ERL_TOP="$ERL_TOP" ./otp_build release -a "$KERL_BUILD_DIR/$2/release_$1" > /dev/null 2>&1 - cd "$KERL_BUILD_DIR/$2/release_$1" + cd "$KERL_BUILD_DIR/$2/release_$1" || exit 1 ./Install $INSTALL_OPT "$KERL_BUILD_DIR/$2/release_$1" > /dev/null 2>&1 echo "Erlang/OTP $1 ($2) has been successfully built" list_add builds "$1,$2" @@ -382,7 +464,7 @@ do_build() do_install() { - rel=`get_release_from_name $1` + rel=$(get_release_from_name "$1") if [ $? -ne 0 ]; then echo "No build named $1" exit 1 @@ -392,10 +474,10 @@ do_install() echo "Destination is not a directory" exit 1 fi - absdir=`cd "$2" && pwd` + absdir=$(cd "$2" && pwd) echo "Installing Erlang/OTP $rel ($1) in $absdir..." ERL_TOP="$KERL_BUILD_DIR/$1/otp_src_$rel" - cd "$ERL_TOP" + cd "$ERL_TOP" || exit 1 ERL_TOP="$ERL_TOP" ./otp_build release -a "$absdir" > /dev/null 2>&1 && cd "$absdir" && ./Install $INSTALL_OPT "$absdir" > /dev/null 2>&1 if [ $? -ne 0 ]; then @@ -403,25 +485,28 @@ do_install() exit 1 fi list_add installations "$1 $absdir"; - cat <<ACTIVATE > "$absdir/activate" + cat <<ACTIVATE > "$absdir"/activate # credits to virtualenv kerl_deactivate() { - if [ -n "\$_KERL_SAVED_PATH" ]; then - PATH="\$_KERL_SAVED_PATH" + if [ -n "\$_KERL_PATH_REMOVABLE" ]; then + PATH=\${PATH//\${_KERL_PATH_REMOVABLE}:/} export PATH - unset _KERL_SAVED_PATH + unset _KERL_PATH_REMOVABLE fi - if [ -n "\$_KERL_SAVED_MANPATH" ]; then - MANPATH="\$_KERL_SAVED_MANPATH" + if [ -n "\$_KERL_MANPATH_REMOVABLE" ]; then + MANPATH=\${MANPATH//\${_KERL_MANPATH_REMOVABLE}:/} export MANPATH - unset _KERL_SAVED_MANPATH + unset _KERL_MANPATH_REMOVABLE 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 "\$_KERL_ACTIVE_DIR" ]; then + unset _KERL_ACTIVE_DIR + fi if [ -n "\$_KERL_SAVED_PS1" ]; then PS1="\$_KERL_SAVED_PS1" export PS1 @@ -435,18 +520,19 @@ kerl_deactivate() fi } kerl_deactivate nondestructive -_KERL_SAVED_PATH="\$PATH" -export _KERL_SAVED_PATH -_KERL_SAVED_MANPATH="\$MANPATH" -export _KERL_SAVED_MANPATH + _KERL_SAVED_REBAR_PLT_DIR="\$REBAR_PLT_DIR" export _KERL_SAVED_REBAR_PLT_DIR -PATH="$absdir/bin:\$PATH" -export PATH -MANPATH="$absdir/man:\$MANPATH" -export MANPATH +_KERL_PATH_REMOVABLE="$absdir/bin" +PATH="\${_KERL_PATH_REMOVABLE}:\$PATH" +export PATH _KERL_PATH_REMOVABLE +_KERL_MANPATH_REMOVABLE="$absdir/man" +MANPATH="\${_KERL_MANPATH_REMOVABLE}:\$MANPATH" +export MANPATH _KERL_MANPATH_REMOVABLE REBAR_PLT_DIR="$absdir" export REBAR_PLT_DIR +_KERL_ACTIVE_DIR="$absdir" +export _KERL_ACTIVE_DIR if [ -f "$KERL_CONFIG" ]; then . "$KERL_CONFIG"; fi if [ -n "\$KERL_ENABLE_PROMPT" ]; then _KERL_SAVED_PS1="\$PS1" @@ -461,22 +547,15 @@ ACTIVATE if [ "$rel" != "git" ]; then if [ -n "$KERL_INSTALL_MANPAGES" ]; then echo "Fetching and installing manpages..." - FILENAME=otp_doc_man_$rel.tar.gz - download "$FILENAME" - echo "Extracting manpages" - cd "$absdir" && tar xfz "$KERL_DOWNLOAD_DIR/$FILENAME" + do_install_manpages "$rel" fi if [ -n "$KERL_INSTALL_HTMLDOCS" ]; then echo "Fetching and installing HTML docs..." - FILENAME="otp_doc_html_$rel.tar.gz" - download "$FILENAME" - echo "Extracting HTML docs" - (cd "$absdir" && mkdir -p html && \ - tar -C "$absdir/html" -xzf "$KERL_DOWNLOAD_DIR/$FILENAME") + do_install_htmldocs "$rel" fi else - rel=`get_newest_valid_release` + rel=$(get_newest_valid_release) if [ $? -ne 0 ]; then echo "No newest valid release" exit 1 @@ -484,46 +563,99 @@ ACTIVATE if [ -n "$KERL_INSTALL_MANPAGES" ]; then echo "CAUTION: Fetching and installing newest ($rel) manpages..." - FILENAME=otp_doc_man_$rel.tar.gz - download "$FILENAME" - echo "Extracting manpages" - cd "$absdir" && tar xfz "$KERL_DOWNLOAD_DIR/$FILENAME" + do_install_manpages "$rel" fi if [ -n "$KERL_INSTALL_HTMLDOCS" ]; then - echo "CATION: Fetching and installing newest ($rel) HTML docs..." - FILENAME="otp_doc_html_$rel.tar.gz" - download "$FILENAME" - echo "Extracting HTML docs" - (cd "$absdir" && mkdir -p html && \ - tar -C "$absdir/html" -xzf "$KERL_DOWNLOAD_DIR/$FILENAME") + echo "CAUTION: Fetching and installing newest ($rel) HTML docs..." + do_install_htmldocs "$rel" fi fi + if [ -n "$KERL_BUILD_PLT" ]; then + echo "Building Dialyzer PLT..." + build_plt "$absdir" + fi + echo "You can activate this installation running the following command:" echo ". $absdir/activate" echo "Later on, you can leave the installation typing:" echo "kerl_deactivate" } +do_install_manpages() +{ + FILENAME=otp_doc_man_$1.tar.gz + download "$FILENAME" + echo "Extracting manpages" + cd "$absdir" && tar xfz "$KERL_DOWNLOAD_DIR/$FILENAME" +} + +do_install_htmldocs() +{ + FILENAME="otp_doc_html_$1.tar.gz" + download "$FILENAME" + echo "Extracting HTML docs" + (cd "$absdir" && mkdir -p html && \ + tar -C "$absdir/html" -xzf "$KERL_DOWNLOAD_DIR/$FILENAME") +} + +build_plt() +{ + dialyzerd=$1/dialyzer + mkdir -p $dialyzerd + plt=$dialyzerd/plt + build_log=$dialyzerd/build.log + dialyzer=$1/bin/dialyzer + apps=`ls -1 $1/lib | cut -d- -f1 | grep -Ev 'erl_interface|jinterface' | xargs echo` + $dialyzer --output_plt $plt --build_plt --apps $apps > $build_log 2>&1 + status=$? + if [ $status -eq 0 -o $status -eq 2 ]; then + echo "Done building $plt" + return 0 + else + echo "Error building PLT, see $build_log for details" + return 1 + fi +} + +do_plt() +{ + ACTIVE_PATH=`get_active_path` + if [ -n "$ACTIVE_PATH" ]; then + plt=$ACTIVE_PATH/dialyzer/plt + if [ -f "$plt" ]; then + echo "Dialyzer PLT for the active installation is:" + echo $plt + return 0 + else + echo "There's no Dialyzer PLT for the active installation" + return 1 + fi + else + echo "No Erlang/OTP kerl installation is currently active" + return 2 + fi +} + do_deploy() { if [ -z "$1" ]; then echo "No host given" exit 1 fi - host=$1 + host="$1" assert_valid_installation "$2" - rel=`get_name_from_install_path "$2"` - path=$2 - remotepath=$path + rel="$(get_name_from_install_path "$2")" + path="$2" + remotepath="$path" if [ ! -z "$3" ]; then - remotepath=$3 + remotepath="$3" fi - ssh $KERL_DEPLOY_SSH_OPTIONS $host true > /dev/null 2>&1 + ssh $KERL_DEPLOY_SSH_OPTIONS "$host" true > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Couldn't ssh to $host" exit 1 @@ -537,13 +669,13 @@ do_deploy() exit 1 fi - ssh $KERL_DEPLOY_SSH_OPTIONS $host "cd \"$remotepath\" && env ERL_TOP=\`pwd\` ./Install $INSTALL_OPT \`pwd\` > /dev/null 2>&1" + ssh $KERL_DEPLOY_SSH_OPTIONS "$host" "cd \"$remotepath\" && env ERL_TOP=\"\`pwd\`\" ./Install $INSTALL_OPT \"\`pwd\`\" > /dev/null 2>&1" if [ $? -ne 0 ]; then echo "Couldn't install Erlang/OTP $rel to $host ($remotepath)" exit 1 fi - ssh $KERL_DEPLOY_SSH_OPTIONS $host "cd \"$remotepath\" && sed -i -e \"s#$path#\`pwd\`#g\" activate" + ssh $KERL_DEPLOY_SSH_OPTIONS "$host" "cd \"$remotepath\" && sed -i -e \"s#$path#\"\`pwd\`\"#g\" activate" if [ $? -ne 0 ]; then echo "Couldn't completely install Erlang/OTP $rel to $host ($remotepath)" exit 1 @@ -557,8 +689,8 @@ do_deploy() list_print() { - if [ -f $KERL_BASE_DIR/otp_$1 ]; then - if [ "`cat "$KERL_BASE_DIR/otp_$1" | wc -l`" != "0" ]; then + if [ -f "$KERL_BASE_DIR/otp_$1" ]; then + if [ "$(wc -l "$KERL_BASE_DIR/otp_$1")" != "0" ]; then if [ -z "$2" ]; then cat "$KERL_BASE_DIR/otp_$1" else @@ -573,11 +705,11 @@ list_print() list_add() { if [ -f "$KERL_BASE_DIR/otp_$1" ]; then - for l in `cat "$KERL_BASE_DIR/otp_$1"`; do + while read -r l; do if [ "$l" = "$2" ]; then return 1 fi - done + done < "$KERL_BASE_DIR/otp_$1" echo "$2" >> "$KERL_BASE_DIR/otp_$1" else echo "$2" > "$KERL_BASE_DIR/otp_$1" @@ -594,7 +726,7 @@ list_remove() list_has() { if [ -f "$KERL_BASE_DIR/otp_$1" ]; then - grep $2 "$KERL_BASE_DIR/otp_$1" > /dev/null 2>&1 && return 0 + grep "$2" "$KERL_BASE_DIR/otp_$1" > /dev/null 2>&1 && return 0 fi return 1 } @@ -616,31 +748,31 @@ cleanup_usage() update_usage() { - echo "usage: $0 $1 <releases>" + echo "usage: $0 update releases" } get_active_path() { - if [ -n "$_KERL_SAVED_PATH" ]; then - echo $PATH | cut -d ":" -f 1 | sed 's/\(.*\)..../\1/' + if [ -n "$_KERL_ACTIVE_DIR" ]; then + echo "$_KERL_ACTIVE_DIR" fi return 0 } get_name_from_install_path() { - if [ -f "$KERL_BASE_DIR/otp_installations" ]; then - grep -F "$1" "$KERL_BASE_DIR/otp_installations" | cut -d ' ' -f 1 + if [ -f "$KERL_BASE_DIR"/otp_installations ]; then + grep -F "$1" "$KERL_BASE_DIR"/otp_installations | cut -d ' ' -f 1 fi return 0 } do_active() { - ACTIVE_PATH=`get_active_path` + ACTIVE_PATH="$(get_active_path)" if [ -n "$ACTIVE_PATH" ]; then echo "The current active installation is:" - echo $ACTIVE_PATH + echo "$ACTIVE_PATH" return 0 else echo "No Erlang/OTP kerl installation is currently active" @@ -653,13 +785,13 @@ download() if [ ! -f "$KERL_DOWNLOAD_DIR/$1" ]; then echo "Downloading $1 to $KERL_DOWNLOAD_DIR" mkdir -p "$KERL_DOWNLOAD_DIR" - curl "$ERLANG_DOWNLOAD_URL/$1" > "$KERL_DOWNLOAD_DIR/$1" + curl -L "$ERLANG_DOWNLOAD_URL/$1" > "$KERL_DOWNLOAD_DIR/$1" update_checksum_file fi ensure_checksum_file echo "Verifying archive checksum..." - SUM=`$MD5SUM "$KERL_DOWNLOAD_DIR/$1" | cut -d " " -f $MD5SUM_FIELD` - ORIG_SUM=`grep -F "$1" "$KERL_DOWNLOAD_DIR/MD5" | cut -d " " -f 2` + SUM="$($MD5SUM "$KERL_DOWNLOAD_DIR/$1" | cut -d ' ' -f $MD5SUM_FIELD)" + ORIG_SUM="$(grep -F "$1" "$KERL_DOWNLOAD_DIR"/MD5 | cut -d ' ' -f 2)" if [ "$SUM" != "$ORIG_SUM" ]; then echo "Checksum error, check the files in $KERL_DOWNLOAD_DIR" exit 1 @@ -674,13 +806,13 @@ case "$1" in echo "usage: $0 $1 $2 <git_url> <git_version> <build_name>" exit 1 fi - do_git_build $3 $4 $5 + do_git_build "$3" "$4" "$5" else if [ $# -lt 3 ]; then echo "usage: $0 $1 <release> <build_name>" exit 1 fi - do_build $2 $3 + do_build "$2" "$3" fi ;; install) @@ -689,12 +821,22 @@ case "$1" in exit 1 fi if [ $# -eq 3 ]; then - do_install $2 "$3" + if [ "$3" = "$HOME" ]; then + echo "Refusing to install in $HOME, this is a bad idea." + exit 1 + else + do_install "$2" "$3" + fi else if [ -z "$KERL_DEFAULT_INSTALL_DIR" ]; then - do_install $2 . + if [ "$PWD" = "$HOME" ]; then + echo "Refusing to install in $HOME, this is a bad idea." + exit 1 + else + do_install "$2" . + fi else - do_install $2 "$KERL_DEFAULT_INSTALL_DIR/$2" + do_install "$2" "$KERL_DEFAULT_INSTALL_DIR/$2" fi fi ;; @@ -704,12 +846,12 @@ case "$1" in exit 1 fi if [ $# -eq 4 ]; then - do_deploy $2 "$3" "$4" + do_deploy "$2" "$3" "$4" else if [ $# -eq 3 ]; then - do_deploy $2 "$3" + do_deploy "$2" "$3" else - do_deploy $2 . + do_deploy "$2" '.' fi fi ;; @@ -720,7 +862,7 @@ case "$1" in fi case "$2" in releases) - rm -f "$KERL_BASE_DIR/otp_releases" + rm -f "${KERL_BASE_DIR:?}"/otp_releases check_releases echo "The available releases are:" list_print releases spaces @@ -739,14 +881,14 @@ case "$1" in case "$2" in releases) check_releases - list_print $2 space - echo "Run \"$0 update releases\" to update this list from erlang.org" + list_print "$2" space + echo "Run '$0 update releases' to update this list from erlang.org" ;; builds) - list_print $2 + list_print "$2" ;; installations) - list_print $2 + list_print "$2" ;; *) echo "Cannot list $2" @@ -762,21 +904,23 @@ case "$1" in fi case "$2" in build) - rel=`get_release_from_name $3` - if [ -d "$KERL_BUILD_DIR/$3" ]; then - rm -Rf "$KERL_BUILD_DIR/$3" - list_remove $2s "$rel,$3" - echo "The $3 build has been deleted" + rel="$(get_release_from_name "$3")" + if [ -d "${KERL_BUILD_DIR:?}/$3" ]; then + rm -Rf "${KERL_BUILD_DIR:?}/$3" else - echo "No build named $3" - exit 1 + if [ -z "$rel" ]; then + echo "No build named $3" + exit 1 + fi fi + list_remove "$2"s "$rel,$3" + echo "The $3 build has been deleted" ;; installation) assert_valid_installation "$3" rm -Rf "$3" - escaped=`echo "$3" | sed $SED_OPT -e 's#/$##' -e 's#\/#\\\/#g'` - list_remove $2s "$escaped" + escaped="$(echo "$3" | sed $SED_OPT -e 's#/$##' -e 's#\/#\\\/#g')" + list_remove "$2"s "$escaped" echo "The installation in $3 has been deleted" ;; *) @@ -791,6 +935,11 @@ case "$1" in exit 1; fi ;; + plt) + if ! do_plt; then + exit 1; + fi + ;; status) echo "Available builds:" list_print builds @@ -798,7 +947,9 @@ case "$1" in echo "Available installations:" list_print installations echo "----------" - do_active + if do_active; then + do_plt + fi exit 0 ;; prompt) @@ -806,11 +957,11 @@ case "$1" in if [ -n "$2" ]; then FMT="$2" fi - ACTIVE_PATH=`get_active_path` + ACTIVE_PATH="$(get_active_path)" if [ -n "$ACTIVE_PATH" ]; then - ACTIVE_NAME=`get_name_from_install_path "$ACTIVE_PATH"` + ACTIVE_NAME="$(get_name_from_install_path "$ACTIVE_PATH")" if [ -z "$ACTIVE_NAME" ]; then - VALUE="`basename "$ACTIVE_PATH"`*" + VALUE="$(basename "$ACTIVE_PATH")*" else VALUE="$ACTIVE_NAME" fi @@ -826,14 +977,14 @@ case "$1" in case "$2" in all) echo "Cleaning up compilation products for ALL builds" - rm -rf $KERL_BUILD_DIR/* - rm -rf $KERL_DOWNLOAD_DIR/* - rm -rf $KERL_GIT_DIR/* + rm -rf "${KERL_BUILD_DIR:?}"/* + rm -rf "${KERL_DOWNLOAD_DIR:?}"/* + rm -rf "${KERL_GIT_DIR:?}"/* echo "Cleaned up all compilation products under $KERL_BUILD_DIR" ;; *) echo "Cleaning up compilation products for $3" - rm -rf $KERL_BUILD_DIR/$3 + rm -rf "${KERL_BUILD_DIR:?}/$3" echo "Cleaned up all compilation products under $KERL_BUILD_DIR" ;; esac |