96 lines
2.6 KiB
Bash
96 lines
2.6 KiB
Bash
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
SCRIPT=$(readlink "$0" || true)
|
|
if [ -z "$SCRIPT" ]; then
|
|
SCRIPT=$0
|
|
fi;
|
|
SCRIPT_DIR="$(cd "$(dirname "$SCRIPT")" && pwd -P)"
|
|
RELEASE_ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd -P)"
|
|
export REL_NAME="{{ rel_name }}"
|
|
REL_VSN="{{ rel_vsn }}"
|
|
|
|
# export these to match mix release environment variables
|
|
export RELEASE_NAME="{{ rel_name }}"
|
|
export RELEASE_VSN="{{ rel_vsn }}"
|
|
export RELEASE_PROG="${SCRIPT}"
|
|
|
|
ERTS_VSN="{{ erts_vsn }}"
|
|
REL_DIR="$RELEASE_ROOT_DIR/releases/$REL_VSN"
|
|
ERL_OPTS="{{ erl_opts }}"
|
|
export ESCRIPT_NAME="${ESCRIPT_NAME-$SCRIPT}"
|
|
|
|
find_erts_dir() {
|
|
__erts_dir="$RELEASE_ROOT_DIR/erts-$ERTS_VSN"
|
|
if [ -d "$__erts_dir" ]; then
|
|
ERTS_DIR="$__erts_dir";
|
|
else
|
|
__erl="$(command -v erl)"
|
|
code="io:format(\"~s\", [code:root_dir()]), halt()."
|
|
__erl_root="$("$__erl" -boot no_dot_erlang -noshell -eval "$code")"
|
|
ERTS_DIR="$__erl_root/erts-$ERTS_VSN"
|
|
fi
|
|
}
|
|
|
|
find_sys_config() {
|
|
__possible_sys="$REL_DIR/sys.config"
|
|
if [ -f "$__possible_sys" ]; then
|
|
SYS_CONFIG="$__possible_sys"
|
|
else
|
|
if [ -L "$__possible_sys".orig ]; then
|
|
mv "$__possible_sys".orig "$__possible_sys"
|
|
SYS_CONFIG="$__possible_sys"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
find_vm_args() {
|
|
__possible_vm_args="$REL_DIR/vm.args"
|
|
if [ -f "$__possible_vm_args" ]; then
|
|
VM_ARGS="$__possible_vm_args"
|
|
else
|
|
if [ -L "$__possible_vm_args".orig ]; then
|
|
mv "$__possible_vm_args".orig "$__possible_vm_args"
|
|
VM_ARGS="$__possible_vm_args"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
find_erts_dir
|
|
find_sys_config
|
|
find_vm_args
|
|
export ROOTDIR="$RELEASE_ROOT_DIR"
|
|
export BINDIR="$ERTS_DIR/bin"
|
|
export EMU="beam"
|
|
export PROGNAME="erl"
|
|
export LD_LIBRARY_PATH="$ERTS_DIR/lib:$LD_LIBRARY_PATH"
|
|
SYSTEM_LIB_DIR="$(dirname "$ERTS_DIR")/lib"
|
|
[ -f "$REL_DIR/$REL_NAME.boot" ] && BOOTFILE="$REL_NAME" || BOOTFILE=start
|
|
cd "$ROOTDIR"
|
|
|
|
{{! Define alternative field separator using ASCII US (unit separator). US is
|
|
not expected to appear in any argument. }}
|
|
IFS_NORM="$IFS"
|
|
IFS_ARGS="$(printf '\x1f')"
|
|
|
|
# Save extra arguments
|
|
{{! Join extra arguments into a US-delimited string. }}
|
|
IFS="$IFS_ARGS"
|
|
ARGS="$*"
|
|
IFS="$IFS_NORM"
|
|
|
|
# Build arguments for erlexec
|
|
set --
|
|
[ "$ERL_OPTS" ] && set -- "$@" "$ERL_OPTS"
|
|
[ "$SYS_CONFIG" ] && set -- "$@" -config "$SYS_CONFIG"
|
|
[ "$VM_ARGS" ] && set -- "$@" -args_file "$VM_ARGS"
|
|
set -- "$@" -boot_var SYSTEM_LIB_DIR "$SYSTEM_LIB_DIR" -boot "$REL_DIR/$BOOTFILE"
|
|
{{! Split string with extra arguments back into an argument list. }}
|
|
IFS="$IFS_ARGS"
|
|
# shellcheck disable=SC2086
|
|
set -- "$@" $ARGS
|
|
IFS="$IFS_NORM"
|
|
|
|
exec "$BINDIR/erlexec" "$@"
|