Current section
Files
Jump to
Current section
Files
bin/stuff/xlfe
#! /bin/sh
# -*- mode: shell-script; indent-tabs-mode: nil -*-
# Copyright (c) 2008-2024 Robert Virding
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Follow symlinks to actual program and set env variables. We have to
# cd to each directory following symlinks to handle relative symlinks.
follow_symlink () {
cd "$(dirname "$1")" > /dev/null
filename="$(basename "$1")"
if [ -h "$filename" ]; then
follow_symlink "$(readlink "$filename")"
else
echo "$(pwd -P)/$filename"
fi
}
show_help () {
echo "Usage: `basename $0` [flags] file [args]
-h | --help Print this help and exit
-e | -eval \"sexp\" Evaluates the given sexpr
-- | -extra \"switches\" Send misc configuration switches to the Erlang VM
-prompt value Set the LFE prompt to a user-supplied value
-flag | +flag Enables/disables configuration flags to be
used by the Erlang VM" >&2
}
SELF=$(follow_symlink "$0")
LFE_PROGNAME=$(echo "$0" | sed 's/.*\///') # Basically basename
LFE_BINDIR=$(dirname "$SELF")
LFE_ROOTDIR=$(dirname "$LFE_BINDIR")
export LFE_ROOTDIR
export LFE_BINDIR
export LFE_PROGNAME
# Stores static Erlang arguments and --erl (which is passed as is)
ERL=""
# Stores erl arguments preserving spaces/quotes (mimics an array)
erl_set () {
eval "E${E}=\$1"
E=$((E + 1))
}
# Checks if a string starts with prefix. Usage: starts_with "$STRING" "$PREFIX"
starts_with () {
case $1 in
"$2"*) true;;
*) false;;
esac
}
ERL_EXEC=erl
I=1
E=0
LENGTH=$#
set -- "$@" -extra
while [ $I -le $LENGTH ]; do
# S counts to be shifted, C counts to be copied
S=0
C=0
case "$1" in
-e | -pa | -pz | -eval)
C=1
;;
-erl)
S=2
ERL="$ERL $2"
;;
-sname | -name)
S=2
erl_set "$1" #erl_set "$(echo "$1" | cut -c 2-)"
erl_set "$2"
;;
-cookie | -setcookie)
S=2
erl_set "-setcookie"
erl_set "$2"
;;
-sname | -name)
erl_set "$1" #erl_set "$(echo "$1" | cut -c 2-)"
erl_set "$2"
;;
*)
while [ $I -le $LENGTH ]; do
I=$((I+1))
set -- "$@" "$1"
shift
done
break
;;
esac
while [ $I -le $LENGTH ] && [ $C -gt 0 ]; do
C=$((C - 1))
I=$((I + 1))
set -- "$@" "$1"
shift
done
I=$((I + S))
shift $S
done
echo "1 " "$@"
I=$((E - 1))
while [ $I -ge 0 ]; do
eval "VAL=\$E$I"
set -- "$VAL" "$@"
I=$((I - 1))
done
echo "2 " "$@"
## set -- "-user" "lfe_init" "$@" "-extra"
set -- "-user" "lfe_init" "$@"
# The order of precedence for LFE libraries is as follows:
# 1) The LFE_ROOTDIR for the current bin/lfe being executed is unusurpable;
# allowing anything else would leave LFE open to instabilities where it
# could be executed with libraries of a different release.
# 2) A user/developer should be allowed to override anything else by updating
# ERL_LIBS as they see fit.
# 3) A project's libraries (current directory) should be loaded automatically,
# if they exist, but not override the previous two.
# 4) If a default library is installed in ~/.lfe/libs, then that will be added
# last, in the event that the sought library is not picked up in any of the
# other locations.
#
# Note that ERL_LIBS will find *either* an ebin subdir *or* lib subdir
# Find application ebin directories in lib if lib exists.
find_libs () {
if [ -d "$1" ]; then
echo $(find "$1" -maxdepth 1 -mindepth 1 -exec printf "%s:" {} \;)
fi
}
# The following works for rebar and erl.mk
PROJ_LIBS=$(find_libs "./deps")
# The following works for rebar3
if [ -d "$REBAR_DEPS_DIR" ]; then
# Use $REBAR_DEPS_DIR if set...
R3_PROJ_LIBS=$(find_libs "$REBAR_DEPS_DIR")
else
# ... otherwise provide a sensible default
R3_PROJ_LIBS=$(find_libs "./_build/${REBAR_PROFILE:-default}/deps"):$(find_libs "./_build/${REBAR_PROFILE:-default}/lib")
fi
LFE_HOME_LIBS=$(find_libs "$HOME"/.lfe/lib)
ALL_LIBS="$LFE_ROOTDIR":"$ERL_LIBS":"$PROJ_LIBS""$R3_PROJ_LIBS""$LFE_HOME_LIBS"
if [ -n "$LFE_CLI_DRY_RUN" ]; then
echo "ERL_LIBS=$ALL_LIBS" exec erl $ERL "$@"
else
ERL_LIBS="$ALL_LIBS" exec erl $ERL "$@"
fi