diff third_party/emsdk/docker/Dockerfile @ 179:8d17f6e6e290

[ThirdParty] Added emsdk bazel rules that can be supported by bazel 9.0.0
author MrJuneJune <me@mrjunejune.com>
date Thu, 22 Jan 2026 21:23:17 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/third_party/emsdk/docker/Dockerfile	Thu Jan 22 21:23:17 2026 -0800
@@ -0,0 +1,131 @@
+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 \
+    # 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
+
+# These fallback environment variables are intended for situations where the
+# entrypoint is not utilized (as in a derived image) or overridden (e.g. when
+# using `--entrypoint /bin/bash` in CLI).
+# This corresponds to the env variables set during: `source ./emsdk_env.sh`
+ENV EMSDK=/emsdk \
+    PATH="/emsdk:/emsdk/upstream/emscripten:/emsdk/node/22.16.0_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 "## 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 terminal. 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
+
+ENTRYPOINT ["/emsdk/docker/entrypoint.sh"]
+
+LABEL maintainer="[email protected]" \
+      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"
+
+# ------------------------------------------------------------------------------