Files
2026-06-14 19:09:18 +01:00

156 lines
5.1 KiB
Bash
Executable File

#! /usr/bin/env bash
# Copyright 2015-2020 The Khronos Group Inc.
# SPDX-License-Identifier: Apache-2.0
# Build WebAssembly with Emscripten in Docker.
# Exit if any command fails.
set -e
docker_running=0
rm_container=0
function atexit () {
if [ $docker_running -eq 0 ]; then
docker stop emscripten > /dev/null
# By default keep the container as it now has a populated emscripten cache.
if [ $rm_container -eq 1 ]; then
docker rm emscripten > /dev/null
fi
fi
}
function usage() {
echo "Usage: $0 [Option] [PARAMETER=value] [target...]"
echo ""
echo "Build KTX-Software using Emscripten docker package."
echo "Defaults to building everything (Release config) if no targets specified."
echo "Options:"
echo " --help, -h Print this usage message."
echo " --remove-container, -r Remove docker container when finished."
echo " --verbose ,-v Cause the underlying make to run in verbose mode."
exit $1
}
# cd repo root so script will work whereever the current directory
path_to_repo_root=..
cd -- "$(dirname -- "${BASH_SOURCE[0]}")/$path_to_repo_root"
for arg in $@; do
case $arg in
--help | -h)
usage 0
;;
--remove-container | -r)
rm_container=1
shift
;;
--verbose | -v)
verbose_make="-- VERBOSE=1"
shift
;;
*\=*)
# Set parameter from command-line arguments
eval $arg
shift ;;
*)
targets="$targets --target $arg"
shift ;;
esac
done
# Set defaults
CONFIGURATION=${CONFIGURATION:-Release}
FEATURE_DOC=${FEATURE_DOC:-OFF}
FEATURE_JNI=${FEATURE_JNI:-OFF}
FEATURE_LOADTESTS=${FEATURE_LOADTESTS:-OpenGL}
FEATURE_PY=${FEATURE_PY:-OFF}
FEATURE_TESTS=${FEATURE_TESTS:-OFF}
FEATURE_TOOLS=${FEATURE_TOOLS:-OFF}
PACKAGE=${PACKAGE:-NO}
SUPPORT_SSE=OFF
SUPPORT_OPENCL=${SUPPORT_OPENCL:-OFF}
WERROR=${WERROR:-OFF}
BUILD_DIR=${BUILD_DIR:-build/web-$CONFIGURATION}
trap atexit EXIT SIGINT
# Check emscripten container status.
if ! container_status="$(docker container inspect -f '{{.State.Status}}' emscripten 2> /dev/null)"; then
# `inspect` failed therefore no docker container. Create one.
# In the event that /src in docker ends up having the same owner as
# the repo (cwd) on the docker host, which is presumably the user running
# this script, it is necessary to set the uid/gid used to run the
# commands in docker. This is because the recent fix for
# CVE-2022-24765 causes Git to error when the repo owner differs from
# the user running the command and the default docker user running the
# commands is root. For details see
# https://github.blog/2022-04-12-git-security-vulnerability-announced/
# When I run docker locally on macOS /src is owned by root so we don't
# trip over the CVE fix. However in Linux CI runners, on both Travis and
# GitHub, /src ends up owned by the same uid as the repo on the host.
# Since .github/workflows/web.yml starts docker before calling this
# script, the correct uid is set there. This is retained as an example
# in case this is related to Linux rather than GHA/Travis or some other
# system exhibits the same behavior.
if [ -n "$TRAVIS" ]; then
ugids="--user $(id -u):$(id -g)"
fi
echo "Starting Enscripten Docker container"
docker run -dit --name emscripten $ugids -v $(pwd):/src emscripten/emsdk bash
else
if [ "$container_status" = "running" ]; then
# CI has already started it.
echo "Emscripten Docker container running"
dockerrunning=1
elif [ "$container_status" = "exited" ]; then
# It wasn't removed after previous run. Resume it for use of Emscripten cache.
echo "Resuming Emscripten Docker container"
docker start emscripten
else
echo "Emscripten container is in unsupported state."
exit 1
fi
fi
echo "Software versions"
echo '*****************'
docker exec emscripten sh -c "emcc -v; echo '********'"
docker exec emscripten sh -c "cmake --version; echo '********'"
docker exec emscripten sh -c "git --version; echo '********'"
mkdir -p $BUILD_DIR
# emcmake uses the "Unix Makefiles" generator on Linux which does not
# support multiple configurations.
echo "Configure and Build KTX-Software (Web $CONFIGURATION)"
# Uncomment for debugging some generator expressions.
#targets="--target debug_isgnufe1 --target debug_gnufe_ffpcontract"
# Since 4.0.9 SDL2 has to be installed in order for its CMake config
# file to be found.
if [ -n "$FEATURE_LOADTESTS" ]; then
docker exec emscripten sh -c "embuilder build sdl3"
fi
docker exec emscripten sh -c "emcmake cmake -B$BUILD_DIR . \
-D CMAKE_BUILD_TYPE=$CONFIGURATION \
-D KTX_FEATURE_DOC=$FEATURE_DOC \
-D KTX_FEATURE_JNI=$FEATURE_JNI \
-D KTX_FEATURE_LOADTEST_APPS=$FEATURE_LOADTESTS \
-D KTX_FEATURE_TESTS=$FEATURE_TESTS \
-D KTX_FEATURE_TOOLS=$FEATURE_TOOLS \
-D KTX_WERROR=$WERROR \
&& cmake --build $BUILD_DIR $targets $verbose_make"
if [ "$PACKAGE" = "YES" ]; then
echo "Pack KTX-Software (Web $CONFIGURATION)"
# Call cmake rather than cpack so we don't need knowledge of the working
# directory inside docker.
docker exec emscripten sh -c "cmake --build $BUILD_DIR --target package"
fi