spiegel-keyman/resources/locate_emscripten.inc.sh
Eberhard Beilharz be63a51b66
fix(linux): install emscripten prior to verifying source tarball
When running on CI kmcmplib gets fully build, which requires emscripten.
This change installs emscripten before running the source tarball
verification.

Also modify `launchpad.sh` and add option `--no-sign` so that we don't
have to set up things for signing. Use long options for `debuild` where
possible.

Build-bot: skip build:linux
Test-bot: skip
2026-05-19 19:53:25 +02:00

138 lines
4.7 KiB
Bash

# shellcheck shell=bash
# Keyman is copyright (C) SIL Global. MIT License.
# shellcheck disable=SC2154
. "${KEYMAN_ROOT}/resources/build/minimum-versions.inc.sh"
# On Windows/ARM64 machines, we build with the Emscripten x64 toolchain
if builder_is_windows; then
if [[ "${MSYSTEM-x}" == CLANGARM64 ]]; then
builder_echo "Using x86_64 for emscripten"
export EMSDK_ARCH=x86_64
fi
fi
#
# 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_is_windows; then
EMCC_EXECUTABLE="emcc.py"
else
EMCC_EXECUTABLE="emcc"
fi
if [[ -z "${EMSCRIPTEN_BASE:-}" ]]; then
if [[ -z "${EMCC:-}" ]]; then
local EMCC
EMCC="$(command -v "${EMCC_EXECUTABLE}" || true)"
[[ -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"
if [[ ! -d "${EMSCRIPTEN_BASE}" ]]; then
# $EMSCRIPTEN_BASE does not exist, but check if we have emsdk in a parent directory. #13464
_can_locate_emsdk "${EMSCRIPTEN_BASE}" || builder_die "locate_emscripten: Variable EMSCRIPTEN_BASE (${EMSCRIPTEN_BASE}) points to a non-existent directory"
else
[[ -x "${EMSCRIPTEN_BASE}/${EMCC_EXECUTABLE}" ]] || builder_die "locate_emscripten: Variable EMSCRIPTEN_BASE (${EMSCRIPTEN_BASE}) does not point to ${EMCC_EXECUTABLE}'s folder"
fi
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() {
# shellcheck disable=SC2154
if [[ "${KEYMAN_VERSION_ENVIRONMENT}" != local || ! -z "${KEYMAN_USE_EMSDK+x}" ]]; then
_select_emscripten_version_with_emsdk
fi
}
# Check if the grandparent directory (i.e. emscripten root) contains emsdk
_can_locate_emsdk() {
local DIR="$1"
local GRANDPARENT
GRANDPARENT="$(dirname "$(dirname "${DIR}")")"
if [[ -f "${GRANDPARENT}/emsdk" ]]; then
return 0
else
return 1
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
local GRANDPARENT
GRANDPARENT="$(dirname "$(dirname "${EMSCRIPTEN_BASE}")")"
(
# shellcheck disable=SC2164
cd "${GRANDPARENT}"
if [[ ! -f emsdk ]]; then
builder_die "emsdk[.bat] should be in ${GRANDPARENT}"
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}"
# shellcheck disable=SC2164
cd upstream/emscripten
npm install
fi
)
}
install_emscripten_into() {
if [[ -z "${1:-}" ]]; then
builder_die "${FUNCNAME[0]} requires a directory argument"
fi
local EMSDK_DIR=$1
builder_heading "Installing emscripten into ${EMSDK_DIR}"
mkdir -p "${EMSDK_DIR}"
(
cd "${EMSDK_DIR}"
git clone https://github.com/emscripten-core/emsdk.git .
./emsdk install "${KEYMAN_MIN_VERSION_EMSCRIPTEN}"
./emsdk activate "${KEYMAN_MIN_VERSION_EMSCRIPTEN}"
cd upstream/emscripten
npm install
)
}