Done to upgrade from CMake 3.16.3 to 3.22.1. CMake 3.21 or newer is needed to build the Qt 6.4.1 sources with emscripten. Also update to libidn12 to resolve an "Unable to locate package libidn11" error.
134 lines
5.0 KiB
Docker
134 lines
5.0 KiB
Docker
FROM ubuntu:jammy AS stage_build
|
|
|
|
ARG EMSCRIPTEN_VERSION=tot
|
|
ENV EMSDK /emsdk
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
RUN echo "## Start building" \
|
|
&& echo "## Update and install packages" \
|
|
&& apt-get -qq -y update \
|
|
&& apt-get -qq install -y --no-install-recommends \
|
|
binutils \
|
|
build-essential \
|
|
ca-certificates \
|
|
file \
|
|
git \
|
|
python3 \
|
|
python3-pip \
|
|
&& echo "## Done"
|
|
|
|
# Copy the contents of this repository to the container
|
|
COPY . ${EMSDK}
|
|
|
|
RUN echo "## Install Emscripten" \
|
|
&& cd ${EMSDK} \
|
|
&& ./emsdk install ${EMSCRIPTEN_VERSION} \
|
|
&& echo "## Done"
|
|
|
|
# This generates configuration that contains all valid paths according to installed SDK
|
|
# TODO(sbc): We should be able to use just emcc -v here but it doesn't
|
|
# currently create the sanity file.
|
|
RUN cd ${EMSDK} \
|
|
&& echo "## Generate standard configuration" \
|
|
&& ./emsdk activate ${EMSCRIPTEN_VERSION} \
|
|
&& chmod 777 ${EMSDK}/upstream/emscripten \
|
|
&& chmod -R 777 ${EMSDK}/upstream/emscripten/cache \
|
|
&& echo "int main() { return 0; }" > hello.c \
|
|
&& ${EMSDK}/upstream/emscripten/emcc -c hello.c \
|
|
&& cat ${EMSDK}/upstream/emscripten/cache/sanity.txt \
|
|
&& echo "## Done"
|
|
|
|
# Cleanup Emscripten installation and strip some symbols
|
|
RUN echo "## Aggressive optimization: Remove debug symbols" \
|
|
&& cd ${EMSDK} && . ./emsdk_env.sh \
|
|
# Remove debugging symbols from embedded node (extra 7MB)
|
|
&& strip -s `which node` \
|
|
# Tests consume ~80MB disc space
|
|
&& rm -fr ${EMSDK}/upstream/emscripten/tests \
|
|
# Fastcomp is not supported
|
|
&& rm -fr ${EMSDK}/upstream/fastcomp \
|
|
# strip out symbols from clang (~extra 50MB disc space)
|
|
&& find ${EMSDK}/upstream/bin -type f -exec strip -s {} + || true \
|
|
&& echo "## Done"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# -------------------------------- STAGE DEPLOY --------------------------------
|
|
# ------------------------------------------------------------------------------
|
|
|
|
FROM ubuntu:jammy AS stage_deploy
|
|
|
|
COPY --from=stage_build /emsdk /emsdk
|
|
|
|
# Fallback in case Emscripten isn't activated.
|
|
# This will let use tools offered by this image inside other Docker images
|
|
# (sub-stages) or with custom / no entrypoint
|
|
ENV EMSDK=/emsdk \
|
|
EMSDK_NODE=/emsdk/node/14.18.2_64bit/bin/node \
|
|
PATH="/emsdk:/emsdk/upstream/emscripten:/emsdk/upstream/bin:/emsdk/node/14.18.2_64bit/bin:${PATH}"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Create a 'standard` 1000:1000 user
|
|
# Thanks to that this image can be executed as non-root user and created files
|
|
# will not require root access level on host machine Please note that this
|
|
# solution even if widely spread (i.e. Node.js uses it) is far from perfect as
|
|
# user 1000:1000 might not exist on host machine, and in this case running any
|
|
# docker image will cause other random problems (mostly due `$HOME` pointing to
|
|
# `/`)
|
|
RUN echo "## Create emscripten user (1000:1000)" \
|
|
&& groupadd --gid 1000 emscripten \
|
|
&& useradd --uid 1000 --gid emscripten --shell /bin/bash --create-home emscripten \
|
|
&& echo "umask 0000" >> /etc/bash.bashrc \
|
|
&& echo ". /emsdk/emsdk_env.sh" >> /etc/bash.bashrc \
|
|
&& echo "## Done"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
|
|
RUN echo "## Update and install packages" \
|
|
&& apt-get -qq -y update \
|
|
# Somewhere in here apt sets up tzdata which asks for your time zone and blocks
|
|
# waiting for the answer which you can't give as docker build doesn't read from
|
|
# the terninal. The env vars set here avoid the interactive prompt and set the TZ.
|
|
&& DEBIAN_FRONTEND="noninteractive" TZ="America/San_Francisco" apt-get -qq install -y --no-install-recommends \
|
|
sudo \
|
|
libxml2 \
|
|
ca-certificates \
|
|
python3 \
|
|
python3-pip \
|
|
wget \
|
|
curl \
|
|
zip \
|
|
unzip \
|
|
git \
|
|
git-lfs \
|
|
ssh-client \
|
|
build-essential \
|
|
make \
|
|
ant \
|
|
libidn12 \
|
|
cmake \
|
|
openjdk-11-jre-headless \
|
|
# Standard Cleanup on Debian images
|
|
&& apt-get -y clean \
|
|
&& apt-get -y autoclean \
|
|
&& apt-get -y autoremove \
|
|
&& rm -rf /var/lib/apt/lists/* \
|
|
&& rm -rf /var/cache/debconf/*-old \
|
|
&& rm -rf /usr/share/doc/* \
|
|
&& rm -rf /usr/share/man/?? \
|
|
&& rm -rf /usr/share/man/??_* \
|
|
&& echo "## Done"
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Use commonly used /src as working directory
|
|
WORKDIR /src
|
|
|
|
LABEL maintainer="kontakt@trzeci.eu" \
|
|
org.label-schema.name="emscripten" \
|
|
org.label-schema.description="The official container with Emscripten SDK" \
|
|
org.label-schema.url="https://emscripten.org" \
|
|
org.label-schema.vcs-url="https://github.com/emscripten-core/emsdk" \
|
|
org.label-schema.docker.dockerfile="/docker/Dockerfile"
|
|
|
|
# ------------------------------------------------------------------------------
|