spiegel-keyman/resources/locate_emscripten.inc.sh
Eberhard Beilharz ef4f829737
chore(common): add offline support for emscripten
This change allows to build with emscripten if offline (when
passing the `--offline` parameter). Previously this failed because
as part of locating emscripten we try to pull the latest repo
version and install the desired emscripten version. With this change
when `--offline` is specified we try to use the currently installed
version of emsdk. If it isn't installed or if the wrong version
is installed we will fail the build.
2024-11-28 14:21:17 +01:00

85 lines
3.2 KiB
Bash

# shellcheck shell=bash
# no hashbang for .inc.sh
. "$KEYMAN_ROOT/resources/build/minimum-versions.inc.sh"
#
# We don't want to rely on emcc being on the path, because Emscripten puts far
# too many things onto the path (in particular for us, node).
#
# The following comment suggests that we don't need emcc on the path.
# https://github.com/emscripten-core/emscripten/issues/4848#issuecomment-1097357775
#
# So we try and locate emcc in common locations ourselves. The search pattern
# is:
#
# 1. Look for $EMSCRIPTEN_BASE (our primary emscripten variable), which should
# point to the folder that emcc is located in
# 2. Look for $EMCC which should point to the emcc executable
# 3. Look for emcc on the path
#
locate_emscripten() {
local EMCC_EXECUTABLE
if [[ "${BUILDER_OS}" == "win" ]]; then
EMCC_EXECUTABLE="emcc.py"
else
EMCC_EXECUTABLE="emcc"
fi
if [[ -z ${EMSCRIPTEN_BASE+x} ]]; then
if [[ -z ${EMCC+x} ]]; then
local EMCC=$(which ${EMCC_EXECUTABLE})
[[ -z $EMCC ]] && builder_die "locate_emscripten: Could not locate emscripten (${EMCC_EXECUTABLE}) on the path or with \$EMCC or \$EMSCRIPTEN_BASE"
fi
[[ -f $EMCC && ! -x $EMCC ]] && builder_die "locate_emscripten: Variable EMCC ($EMCC) points to ${EMCC_EXECUTABLE} but it is not executable"
[[ -x $EMCC ]] || builder_die "locate_emscripten: Variable EMCC ($EMCC) does not point to a valid executable ${EMCC_EXECUTABLE}"
EMSCRIPTEN_BASE="$(dirname "$EMCC")"
fi
[[ -f ${EMSCRIPTEN_BASE}/${EMCC_EXECUTABLE} && ! -x ${EMSCRIPTEN_BASE}/${EMCC_EXECUTABLE} ]] && builder_die "locate_emscripten: Variable EMSCRIPTEN_BASE ($EMSCRIPTEN_BASE) contains ${EMCC_EXECUTABLE} but it is not executable"
[[ -x ${EMSCRIPTEN_BASE}/${EMCC_EXECUTABLE} ]] || builder_die "locate_emscripten: Variable EMSCRIPTEN_BASE ($EMSCRIPTEN_BASE) does not point to ${EMCC_EXECUTABLE}'s folder"
verify_emscripten_version
}
# Ensure that we use correct version of emsdk on build agents.
# For developers, define KEYMAN_USE_EMSDK to do this on your
# build machine.
verify_emscripten_version() {
if [[ "$VERSION_ENVIRONMENT" != local || ! -z "${KEYMAN_USE_EMSDK+x}" ]]; then
_select_emscripten_version_with_emsdk
fi
}
# Use emsdk to select the appropriate version of Emscripten
# according to minimum-versions.inc.sh
_select_emscripten_version_with_emsdk() {
if [[ -z "${EMSCRIPTEN_BASE+x}" ]]; then
builder_die "Variable EMSCRIPTEN_BASE must be set"
fi
if [[ -z "${KEYMAN_MIN_VERSION_EMSCRIPTEN+x}" ]]; then
builder_die "Variable KEYMAN_MIN_VERSION_EMSCRIPTEN must be set"
fi
pushd "${EMSCRIPTEN_BASE}/../.." > /dev/null
if [[ ! -f emsdk ]]; then
builder_die "emsdk[.bat] should be in $(pwd)"
fi
export EMSDK_KEEP_DOWNLOADS=1
if builder_try_offline; then
if [[ ! -f ./emsdk_env.sh ]]; then
builder_die "emsdk_env.sh not found - emsdk not installed?"
fi
. ./emsdk_env.sh
if ! emcc --version | grep -q "$KEYMAN_MIN_VERSION_EMSCRIPTEN"; then
builder_die "Wrong emsdk version installed"
fi
else
git pull
./emsdk install "$KEYMAN_MIN_VERSION_EMSCRIPTEN"
./emsdk activate "$KEYMAN_MIN_VERSION_EMSCRIPTEN"
cd upstream/emscripten
npm install
fi
popd > /dev/null
}