Revert "Update examples collection"

This reverts commit 87d3066428.
This commit is contained in:
Ray
2025-08-19 11:17:59 +02:00
parent 87d3066428
commit df1244688e
130 changed files with 0 additions and 21502 deletions

View File

@@ -1,354 +0,0 @@
version: 2.1
orbs:
win: circleci/windows@5.0
executors:
ubuntu:
docker:
- image: buildpack-deps:focal
mac_arm64:
environment:
EMSDK_NOTTY: "1"
# Without this, any `brew install` command will result in self-update of
# brew itself which takes more than 4 minutes.
HOMEBREW_NO_AUTO_UPDATE: "1"
macos:
xcode: "13.4.1"
resource_class: macos.m1.medium.gen1
linux_arm64:
machine:
image: ubuntu-2004:2023.07.1
resource_class: arm.medium
commands:
setup-macos:
steps:
- checkout
- run:
name: Install CMake
command: brew install cmake
test-macos:
steps:
- run:
name: test.sh
command: test/test.sh
- run:
name: test.py
command: |
source emsdk_env.sh
test/test.py
test-bazel-linux:
steps:
- checkout
- run:
name: install bazelisk
command: |
wget https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-linux-amd64
chmod +x bazelisk-linux-amd64
mv bazelisk-linux-amd64 /usr/local/bin/bazel
- run: test/test_bazel.sh
test-bazel-mac:
steps:
- checkout
- run:
name: install bazelisk
command: |
brew install bazelisk
- run: test/test_bazel_mac.sh
test-bazel-windows:
steps:
- checkout
- run:
name: Download Bazelisk
shell: powershell.exe
command: |
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri https://github.com/bazelbuild/bazelisk/releases/download/v1.10.1/bazelisk-windows-amd64.exe -OutFile ( New-Item -Path "temp\bazel\bazel.exe" -Force )
- run:
name: Run Tests
shell: powershell.exe
command: |
$env:Path += ";C:\Python27amd64;$pwd\temp\bazel"
.\test\test_bazel.ps1
jobs:
flake8:
executor: ubuntu
steps:
- checkout
- run:
name: install pip
command: |
apt-get update -q
apt-get install -q -y python3-pip
- run: python3 -m pip install --upgrade pip
- run: python3 -m pip install flake8==7.1.1
- run: python3 -m flake8 --show-source --statistics --extend-exclude=./scripts
test-linux:
executor: ubuntu
environment:
EMSDK_NOTTY: "1"
# This is needed because the old gcc-7 that is installed on debian/bionic
# generates warnings about unused variables when doing C++17
# destructuring:
# https://github.com/WebAssembly/binaryen/issues/4353
CXXFLAGS: "-Wno-unused-variable"
# I don't know why circleci VMs pretent to have 36 cores but its a lie.
EMSDK_NUM_CORES: "4"
steps:
- checkout
- run:
name: Install debian packages
command: apt-get update -q && apt-get install -q -y cmake build-essential openjdk-8-jre-headless ksh zsh
- run: test/test_node_path.sh
- run: test/test.sh
- run: test/test_source_env.sh
- run:
name: test.py
command: |
source emsdk_env.sh
test/test.py
test-linux-arm64:
executor: linux_arm64
steps:
- checkout
- run:
name: Install debian packages
command: sudo apt-get update -q && sudo apt-get install -q cmake build-essential openjdk-8-jre-headless
- run: test/test.sh
test-mac-arm64:
executor: mac_arm64
steps:
- setup-macos
- test-macos
test-windows:
executor:
name: win/server-2019
shell: bash.exe
environment:
# We need python installed before we can test anytyhing.
# There seems to be undocument copy of python installed here. Hopefully
# if this disappears there will be another way of getting a re-installed
# version.
PYTHON_BIN: "C:\\Python27amd64"
PYTHONUNBUFFERED: "1"
EMSDK_NOTTY: "1"
steps:
- checkout
- run:
name: Add python to bash path
command: echo "export PATH=\"$PATH:/c/python27amd64/\"" >> $BASH_ENV
- run:
name: Install latest
shell: cmd.exe
command: test\test.bat
- run:
name: test.py
command: |
source emsdk_env.sh
python test/test.py
- run:
name: flagless (process/shell) test
shell: powershell.exe
command: |
test/test_activation.ps1
- run:
name: --permanent test
shell: powershell.exe
command: |
$env:PERMANENT_FLAG="--permanent"
test/test_activation.ps1
- run:
name: --system test
shell: powershell.exe
command: |
$env:SYSTEM_FLAG="--system"
test/test_activation.ps1
- run:
name: Process/Shell PATH preservation test
shell: powershell.exe
command: |
test/test_path_preservation.ps1
- run:
name: User PATH preservation test
shell: powershell.exe
command: |
$env:PERMANENT_FLAG="--permanent"
test/test_path_preservation.ps1
- run:
name: System PATH preservation test
shell: powershell.exe
command: |
$env:SYSTEM_FLAG="--system"
test/test_path_preservation.ps1
build-docker-image-x64:
executor: ubuntu
steps:
- checkout
- run:
name: install docker
command: |
apt-get update -q
apt-get install -q -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -q
apt-get install -q -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- setup_remote_docker
# Build the `latest` version of EMSDK as docker image
- run:
name: build
command: make -C ./docker version=latest build
- run:
name: test
command: make -C ./docker version=latest test
publish-docker-image-x64:
executor: ubuntu
steps:
- checkout
- run:
name: install docker
command: |
apt-get update -q
apt-get install -q -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update -q
apt-get install -q -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- setup_remote_docker
- run:
name: build
command: make -C ./docker version=${CIRCLE_TAG} build
- run:
name: test
command: make -C ./docker version=${CIRCLE_TAG} test
- run:
name: push image
command: |
docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
make -C ./docker version=${CIRCLE_TAG} alias=latest push
publish-docker-image-arm64:
executor: linux_arm64
steps:
- checkout
- run:
name: build
command: make -C ./docker version=${CIRCLE_TAG} build
- run:
name: test
command: make -C ./docker version=${CIRCLE_TAG} test
- run:
name: push image
command: |
docker login -u "$DOCKER_USER" -p "$DOCKER_PASS"
make -C ./docker version=${CIRCLE_TAG} alias=${CIRCLE_TAG}-arm64 only_alias=true push
test-bazel7-linux:
executor: ubuntu
environment:
USE_BAZEL_VERSION: "7.x"
steps:
- test-bazel-linux
test-bazel-latest-linux:
executor: ubuntu
steps:
- test-bazel-linux
test-bazel7-mac-arm64:
executor: mac_arm64
environment:
USE_BAZEL_VERSION: "7.x"
steps:
- test-bazel-mac
test-bazel-latest-mac-arm64:
executor: mac_arm64
steps:
- test-bazel-mac
test-bazel7-windows:
executor:
name: win/server-2019
shell: powershell.exe -ExecutionPolicy Bypass
environment:
PYTHONUNBUFFERED: "1"
EMSDK_NOTTY: "1"
# For some reason version resolution with "7.x" does not work on Windows,
# so we have to specify a full version.
USE_BAZEL_VERSION: "7.6.1"
steps:
- test-bazel-windows
test-bazel-latest-windows:
executor:
name: win/server-2019
shell: powershell.exe -ExecutionPolicy Bypass
environment:
PYTHONUNBUFFERED: "1"
EMSDK_NOTTY: "1"
steps:
- test-bazel-windows
workflows:
flake8:
jobs:
- flake8
test-linux:
jobs:
- test-linux
test-linux-arm64:
jobs:
- test-linux-arm64
test-mac-arm64:
jobs:
- test-mac-arm64
test-windows:
jobs:
- test-windows
build-docker-image:
jobs:
- build-docker-image-x64
- publish-docker-image-x64:
filters:
branches:
ignore: /.*/
tags:
only: /.*/
- publish-docker-image-arm64:
filters:
branches:
ignore: /.*/
tags:
only: /.*/
test-bazel7-linux:
jobs:
- test-bazel7-linux
test-bazel-latest-linux:
jobs:
- test-bazel-latest-linux
test-bazel7-mac-arm64:
jobs:
- test-bazel7-mac-arm64
test-bazel-latest-mac-arm64:
jobs:
- test-bazel-latest-mac-arm64
test-bazel7-windows:
jobs:
- test-bazel7-windows
test-bazel-latest-windows:
jobs:
- test-bazel-latest-windows

View File

@@ -1,21 +0,0 @@
# Ignore everything
*
# Allow the entrypoint/test script inside the Docker container
!/docker/entrypoint.sh
!/docker/test_dockerimage.sh
# Allow license file
!LICENSE
# Allow necessary build files in top-level directory
!emscripten-releases-tags.json
!emsdk
!emsdk.py
!emsdk_env.sh
!emsdk_manifest.json
# Allow files required to install legacy versions
!legacy-binaryen-tags.txt
!legacy-emscripten-tags.txt
!llvm-tags-64bit.txt

View File

@@ -1,24 +0,0 @@
[flake8]
extend-exclude =
./.*,
./binaryen,
./clang,
./crunch,
./downloads,
./emscripten,
./fastcomp-clang,
./fastcomp,
./git,
./gnu,
./llvm,
./node,
./python,
./releases,
./temp,
./upstream,
# E111: Indentation is not a multiple of four
# E114: Indentation is not a multiple of four (comment)
extend-ignore = E111, E114
max-line-length = 326

View File

@@ -1,18 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 365
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 30
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because there has been no
activity in the past year. It will be closed automatically if no further
activity occurs in the next 30 days. Feel free to re-open at any time if this
issue is still relevant.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false

View File

@@ -1,40 +0,0 @@
name: Create Release PR
on:
workflow_dispatch:
inputs:
lto-sha:
required: true
type: string
nonlto-sha:
required: true
type: string
jobs:
create-release-pr:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Run create_release.py
run: python3 scripts/create_release.py -r ${{ inputs.lto-sha }} -a ${{ inputs.nonlto-sha }} --gh-action
- name: Create PR
id: cpr
uses: peter-evans/create-pull-request@v6
with:
token: ${{ secrets.EMSCRIPTEN_BOT_TOKEN }}
title: Release ${{ env.RELEASE_VERSION }}
commit-message: |
Release ${{ env.RELEASE_VERSION }}
team-reviewers: release-reviewers
labels: release
body: |
With emscripten-releases revisions:
https://chromium.googlesource.com/emscripten-releases/+/${{ inputs.lto-sha }} (LTO)
https://chromium.googlesource.com/emscripten-releases/+/${{ inputs.nonlto-sha }} (asserts)
branch: release_${{ env.RELEASE_VERSION }}
delete-branch: true
- name: Enable auto-merge
run: gh pr merge --squash --auto "${{ steps.cpr.outputs.pull-request-number }}"
env:
GH_TOKEN: ${{ secrets.EMSCRIPTEN_BOT_TOKEN }}

View File

@@ -1,78 +0,0 @@
# When a release commit created by create-release.yml is landed, create the
# corresponding tag.
name: Create release tag
on:
push:
paths:
- emscripten-releases-tags.json
- .github/workflows/tag-release.yml
branches:
- main
workflow_dispatch:
jobs:
tag-release:
# Only activate for commits created by the create-release.yml workflow.
# The assumption is that when manual changes happen, we want to handle
# tagging manually too.
name: Check for release commit and create tag
# The author is emscripten-bot when triggered from Chromium CI, and github-actions when manually triggered.
if: ${{ github.event.head_commit.author.username == 'github-actions[bot]' || github.event.head_commit.author.username == 'emscripten-bot' }}
runs-on: ubuntu-latest
outputs:
is_release: ${{ steps.create-tag.outputs.result }}
steps:
- name: Match message and create tag
id: create-tag
uses: actions/github-script@v7
with:
github-token: ${{ secrets.EMSCRIPTEN_BOT_TOKEN }}
# A commit with the message of the form 'Release X.Y.Z' is expected
# to have been created by create_release.py and update the latest
# release in emscripten-releases-tags.json
script: |
const message = `${{ github.event.head_commit.message }}`
const regex = /Release ([0-9]+.[0-9]+.[0-9]+)/;
const match = message.match(regex);
let is_release = false;
if (match) {
const release = match[1];
console.log(`Matched release ${release}`);
await github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${release}`,
sha: context.sha
});
is_release = true;
} else {
console.log(`Commit message: '${message}' did not match pattern`);
}
return is_release;
dispatch-emscripten-tag:
name: Dispatch workflow to tag emscripten repo
runs-on: ubuntu-latest
needs: tag-release
if: ${{ needs.tag-release.outputs.is_release == 'true' }}
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Find emscripten revision
# get_emscripten_revision_info.py sets env.EMSCRIPTEN_HASH to the
# emscripten hash associated with the latest release in
# emscripten-releases-tags.json
run: python3 scripts/get_emscripten_revision_info.py
- name: Dispatch emscripten workflow
uses: actions/github-script@v7
with:
github-token: ${{ secrets.EMSCRIPTEN_BOT_TOKEN }}
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: 'emscripten',
workflow_id: 'tag-release.yml',
ref: 'main',
inputs: { 'release-sha': '${{ env.EMSCRIPTEN_HASH }}' }
});

View File

@@ -1,35 +0,0 @@
*.pyc
__pycache__
# Support for --embedded configs
/.emscripten
/.emscripten.old
/.emscripten_cache
/.emscripten_cache__last_clear
/.emscripten_sanity
/.emscripten_sanity_wasm
# Tags files that get generated at runtime
/emscripten-releases-tot.txt
# File that get download/extracted by emsdk itself
/ccache
/gnu
/upstream
/fastcomp
/fastcomp-clang/
/llvm
/ninja
/releases
/clang
/emscripten
/git
/node
/python
/temp
/downloads
/crunch
/java
/mingw
/spidermonkey
/binaryen

View File

@@ -1,27 +0,0 @@
Copyright (c) 2018 Emscripten authors (see AUTHORS in Emscripten)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
----------------------------------------------------------------------------
This is the MIT/Expat Licence. For more information see:
1. http://www.opensource.org/licenses/mit-license.php
2. http://en.wikipedia.org/wiki/MIT_License

View File

@@ -1,245 +0,0 @@
Emscripten SDK
==============
[![CircleCI](https://circleci.com/gh/emscripten-core/emsdk/tree/main.svg?style=svg)](https://circleci.com/gh/emscripten-core/emsdk/tree/main)
The Emscripten toolchain is distributed as a standalone Emscripten SDK. The SDK
provides all the required tools, such as Clang, Python and Node.js along with an
update mechanism that enables migrating to newer Emscripten versions as they are
released.
You can also set up Emscripten from source, without the pre-built SDK, see
"Installing from Source" below.
## Downloads / How do I get the latest Emscripten build?
To get started with Emscripten development, see the [Emscripten website
documentation](https://emscripten.org/docs/getting_started/downloads.html).
That explains how to use the emsdk to get the latest binary builds (without
compiling from source). Basically, that amounts to
```
git pull
./emsdk install latest
./emsdk activate latest
```
## SDK Concepts
The Emscripten SDK is effectively a small package manager for tools that are
used in conjunction with Emscripten. The following glossary highlights the
important concepts to help understanding the internals of the SDK:
* **Tool**: The basic unit of software bundled in the SDK. A Tool has a name and
a version. For example, 'clang-3.2-32bit' is a Tool that contains the 32-bit
version of the Clang v3.2 compiler.
* **SDK**: A set of tools. For example, 'sdk-1.5.6-32bit' is an SDK consisting
of the tools `clang-3.2-32bit`, `node-0.10.17-32bit`, `python-2.7.5.1-32bit`
and `emscripten-1.5.6`.
* **Active Tool/SDK**: Emscripten SDK stores compiler configuration in a file
called `.emscripten` within the emsdk directory. This file points to paths
for Emscripten, Python, Clang and so on. If the configuration file points to a
Tool in a specific directory, then that tool is denoted as being
**active**. This mechanism allows switching between different installed
tools and SDKs.
* **emsdk**: This is the name of the manager script that Emscripten SDK is
accessed through. Most operations are of the form `emsdk <command>`.
## System Requirements
Using the emsdk pre-compiled packages requires only the minimal set of
dependencies lists below. When building from source a wider set of tools
include git, cmake, and a host compiler are required. See:
https://emscripten.org/docs/building_from_source/toolchain_what_is_needed.html.
### Mac OS X
- For Intel-based Macs, macOS 10.13 or newer. For ARM64 M1 based Macs, macOS
11.0 or newer.
- `java`: For running closure compiler (optional). After installing emscripten
via emsdk, typing 'emcc --help' should pop up a OS X dialog "Java is not
installed. To open java, you need a Java SE 6 runtime. Would you like to
install one now?" that will automatically download a Java runtime to the
system.
### Linux
- `python`: Version 3.8 or above.
- `java`: For running closure compiler (optional)
The emsdk pre-compiled binaries are built against Ubuntu/Focal 20.04 LTS and
therefore depend on system libraries compatible with versions of `glibc` and
`libstdc++` present in that release. If your linux distribution is very old
you may not be able to use the pre-compiled binaries packages.
### Windows
- `java`: For running closure compiler (optional)
## Uninstalling the Emscripten SDK
To remove the Emscripten SDK, simply delete the emsdk directory.
## SDK Maintenance
The following tasks are common with the Emscripten SDK:
### How do I work the emsdk utility?
Run `emsdk help` or just `emsdk` to get information about all available commands.
### How do I check the installation status and version of the SDK and tools?
To get a list of all currently installed tools and SDK versions, and all
available tools, run `emsdk list`.
* A line will be printed for each tool/SDK that is available for installation.
* The text `INSTALLED` will be shown for each tool that has already been
installed.
* If a tool/SDK is currently active, a star * will be shown next to it.
* If a tool/SDK is currently active, but the terminal your are calling emsdk
from does not have `PATH` and environment set up to utilize that tool, a star
in parentheses (\*) will be shown next to it. Run `emsdk_env.bat` (Windows) or
`source ./emsdk_env.sh` (Linux and OS X) to set up the environment for the
calling terminal.
### How do I install a tool/SDK version?
Run the command `emsdk install <tool/sdk name>` to download and install a new
tool or an SDK version.
### How do I remove a tool or an SDK?
Run the command `emsdk uninstall <tool/sdk name>` to delete the given tool or
SDK from the local hard drive completely.
### How do I check for updates to the Emscripten SDK?
`emsdk update` will fetch package information for all the new tools and
SDK versions. After that, run `emsdk install <tool/sdk name>` to install a new
version.
### How do I install an old Emscripten compiler version?
Emsdk contains a history of old compiler versions that you can use to maintain
your migration path. Type `emsdk list --old` to get a list of archived tool and
SDK versions, and `emsdk install <name_of_tool>` to install it.
### I want to build from source!
Some Emsdk Tool and SDK targets refer to packages that are precompiled, and
no compilation is needed when installing them. Other Emsdk Tools and SDK
targets come "from source", meaning that they will fetch the source repositories
using git, and compile the package on demand.
When you run `emsdk list`, it will group the Tools and SDKs under these two
categories.
To obtain and build latest wasm SDK from source, run
```
emsdk install sdk-main-64bit
emsdk activate sdk-main-64bit
```
You can use this target for example to bootstrap developing patches to LLVM,
Binaryen or Emscripten. (After initial installation, use `git remote add`
in the cloned tree to add your own fork to push changes as patches)
If you only intend to contribute to Emscripten repository, and not to LLVM
or Binaryen, you can also use precompiled versions of them, and only git
clone the Emscripten repository. For more details, see
https://emscripten.org/docs/contributing/developers_guide.html?highlight=developer#setting-up
### When working on git branches compiled from source, how do I update to a newer compiler version?
Unlike tags and precompiled versions, a few of the SDK packages are based on
"moving" git branches and compiled from source (e.g. sdk-main,
sdk-main, emscripten-main, binaryen-main). Because of that, the
compiled versions will eventually go out of date as new commits are introduced
to the development branches. To update an old compiled installation of one of
this branches, simply reissue the "emsdk install" command on that tool/SDK. This
will `git pull` the latest changes to the branch and issue an incremental
recompilation of the target in question. This way you can keep calling `emsdk
install` to keep an Emscripten installation up to date with a given git branch.
Note though that if the previously compiled branch is very old, sometimes CMake
gets confused and is unable to properly rebuild a project. This has happened in
the past e.g. when LLVM migrated to requiring a newer CMake version. In cases of
any odd compilation errors, it is advised to try deleting the intermediate build
directory to clear the build (e.g. "emsdk/clang/fastcomp/build_xxx/") before
reissuing `emsdk install`.
### How do I change the currently active SDK version?
You can toggle between different tools and SDK versions by running `emsdk
activate <tool/sdk name>`. Activating a tool will set up `~/.emscripten` to
point to that particular tool. On Windows, you can pass the option `--permanent` to
the `activate` command to register the environment permanently for the current user. Use `--system` to do this for all users.
### How do I track the latest Emscripten development with the SDK?
A common and supported use case of the Emscripten SDK is to enable the workflow
where you directly interact with the github repositories. This allows you to
obtain new features and latest fixes immediately as they are pushed to the
github repository, without having to wait for release to be tagged. You do not
need a github account or a fork of Emscripten to do this. To switch to using the
latest git development branch `main`, run the following:
emsdk install git-1.9.4 # Install git. Skip if the system already has it.
emsdk install sdk-main-64bit # Clone+pull the latest emscripten-core/emscripten/main.
emsdk activate sdk-main-64bit # Set the main SDK as the currently active one.
### How do I use my own Emscripten github fork with the SDK?
It is also possible to use your own fork of the Emscripten repository via the
SDK. This is achieved with standard git machinery, so if you are already
acquainted with working on multiple remotes in a git clone, these steps should
be familiar to you. This is useful in the case when you want to make your own
modifications to the Emscripten toolchain, but still keep using the SDK
environment and tools. To set up your own fork as the currently active
Emscripten toolchain, first install the `sdk-main` SDK like shown in the
previous section, and then run the following commands in the emsdk directory:
cd emscripten/main
# Add a git remote link to your own repository.
git remote add myremote https://github.com/mygituseraccount/emscripten.git
# Obtain the changes in your link.
git fetch myremote
# Switch the emscripten-main tool to use your fork.
git checkout -b mymain --track myremote/main
In this way you can utilize the Emscripten SDK tools while using your own git
fork. You can switch back and forth between remotes via the `git checkout`
command as usual.
### How do I use Emscripten SDK with a custom version of python, java, node.js or some other tool?
The provided Emscripten SDK targets are metapackages that refer to a specific
set of tools that have been tested to work together. For example,
`sdk-1.35.0-64bit` is an alias to the individual packages `clang-e1.35.0-64bit`,
`node-4.1.1-64bit`, `python-2.7.5.3-64bit` and `emscripten-1.35.0`. This means
that if you install this version of the SDK, both python and node.js will be
installed inside emsdk as well. If you want to use your own/system python or
node.js instead, you can opt to install emsdk by specifying the individual set
of packages that you want to use. For example, `emsdk install
clang-e1.35.0-64bit emscripten-1.35.0` will only install the Emscripten
LLVM/Clang compiler and the Emscripten frontend without supplying python and
node.js.
### My installation fails with "fatal error: ld terminated with signal 9 [Killed]"?
This may happen if the system runs out of memory. If you are attempting to build
one of the packages from source and are running in a virtual OS or may have
relatively little RAM and disk space available, then the build might fail. Try
feeding your computer more memory. Another thing to try is to force emsdk
install to build in a singlethreaded mode, which will require less RAM
simultaneously. To do this, pass the `-j1` flag to the `emsdk install` command.
### How do I run Emscripten on 32-bit systems or non-x86-64 systems?
Emscripten SDK releases are no longer packaged or maintained for 32-bit systems.
If you want to run Emscripten on a 32-bit system, you can try manually building
the compiler. Follow the steps in the above section "Building an Emscripten tag
or branch from source" to get started.

View File

@@ -1,16 +0,0 @@
# Security Policy
If you have discovered a security vulnerability in this project, please report it
privately. **Do not disclose it as a public issue.** This gives us time to work with you
to fix the issue before public exposure, reducing the chance that the exploit will be
used before a patch is released.
Please submit the report as a [security bug on the Chromium tracker](https://bugs.chromium.org/p/chromium/issues/entry?template=Security%20Bug).
Please provide the following information in your report:
- A description of the vulnerability and its impact
- How to reproduce the issue
- Make it clear that it's an Emscripten SDK bug.
We ask that you give us 90 days to work on a fix before public exposure.

View File

@@ -1 +0,0 @@
build --incompatible_enable_cc_toolchain_resolution

View File

@@ -1 +0,0 @@
/bazel-*

View File

@@ -1,79 +0,0 @@
module(
name = "emsdk",
version = "4.0.13",
)
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "aspect_rules_js", version = "1.42.0")
bazel_dep(name = "rules_nodejs", version = "6.3.2")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "rules_python", version = "1.3.0")
python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
python_version = "3.13",
)
node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")
node.toolchain(node_version = "20.18.0")
use_repo(node, "nodejs")
emscripten_deps = use_extension(
"//:emscripten_deps.bzl",
"emscripten_deps",
)
use_repo(emscripten_deps, "emscripten_bin_linux")
use_repo(emscripten_deps, "emscripten_bin_linux_arm64")
use_repo(emscripten_deps, "emscripten_bin_mac")
use_repo(emscripten_deps, "emscripten_bin_mac_arm64")
use_repo(emscripten_deps, "emscripten_bin_win")
npm = use_extension(
"@aspect_rules_js//npm:extensions.bzl",
"npm",
)
npm.npm_translate_lock(
name = "emscripten_npm_linux",
data = ["@emscripten_bin_linux//:emscripten/package.json"],
npm_package_lock = "@emscripten_bin_linux//:emscripten/package-lock.json",
)
npm.npm_translate_lock(
name = "emscripten_npm_linux_arm64",
data = ["@emscripten_bin_linux_arm64//:emscripten/package.json"],
npm_package_lock = "@emscripten_bin_linux_arm64//:emscripten/package-lock.json",
)
npm.npm_translate_lock(
name = "emscripten_npm_mac",
data = ["@emscripten_bin_mac//:emscripten/package.json"],
npm_package_lock = "@emscripten_bin_mac//:emscripten/package-lock.json",
)
npm.npm_translate_lock(
name = "emscripten_npm_mac_arm64",
data = ["@emscripten_bin_mac_arm64//:emscripten/package.json"],
npm_package_lock = "@emscripten_bin_mac_arm64//:emscripten/package-lock.json",
)
npm.npm_translate_lock(
name = "emscripten_npm_win",
data = ["@emscripten_bin_win//:emscripten/package.json"],
npm_package_lock = "@emscripten_bin_win//:emscripten/package-lock.json",
)
use_repo(
npm,
"emscripten_npm_linux",
"emscripten_npm_linux_arm64",
"emscripten_npm_mac",
"emscripten_npm_mac_arm64",
"emscripten_npm_win",
)
emscripten_cache = use_extension("//:emscripten_cache.bzl", "emscripten_cache")
use_repo(emscripten_cache, "emscripten_cache")
register_toolchains(
"//emscripten_toolchain:cc-toolchain-wasm-emscripten_linux",
"//emscripten_toolchain:cc-toolchain-wasm-emscripten_linux_arm64",
"//emscripten_toolchain:cc-toolchain-wasm-emscripten_mac",
"//emscripten_toolchain:cc-toolchain-wasm-emscripten_mac_arm64",
"//emscripten_toolchain:cc-toolchain-wasm-emscripten_win",
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,90 +0,0 @@
# Bazel Emscripten toolchain
## Setup Instructions
Support for depending on emsdk with a WORKSPACE file was removed and last available in [emsdk version 4.0.6](https://github.com/emscripten-core/emsdk/tree/24fc909c0da13ef641d5ae75e89b5a97f25e37aa). Now we only support inclusion as a bzlmod module.
In your `MODULE.bazel` file, put:
```starlark
emsdk_version = "4.0.6"
bazel_dep(name = "emsdk", version = emsdk_version)
git_override(
module_name = "emsdk",
remote = "https://github.com/emscripten-core/emsdk.git",
strip_prefix = "bazel",
tag = emsdk_version,
)
```
You can use a different version of this SDK by changing it in your `MODULE.bazel` file. The Emscripten version is by default the same as the SDK version, but you can use a different one as well by adding to your `MODULE.bazel`:
```
emscripten_deps = use_extension(
"@emsdk//:emscripten_deps.bzl",
"emscripten_deps",
)
emscripten_deps.config(version = "4.0.1")
```
## Building
Put the following line into your `.bazelrc`:
```
build --incompatible_enable_cc_toolchain_resolution
```
Then write a new rule wrapping your `cc_binary`.
```starlark
load("@rules_cc//cc:defs.bzl", "cc_binary")
load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary")
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
wasm_cc_binary(
name = "hello-world-wasm",
cc_target = ":hello-world",
)
```
Now you can run `bazel build :hello-world-wasm`. The result of this build will
be the individual files produced by emscripten. Note that some of these files
may be empty. This is because bazel has no concept of optional outputs for
rules.
`wasm_cc_binary` uses transition to use emscripten toolchain on `cc_target`
and all of its dependencies, and does not require amending `.bazelrc`. This
is the preferred way, since it also unpacks the resulting tarball.
The Emscripten cache shipped by default does not include LTO, 64-bit or PIC
builds of the system libraries and ports. If you wish to use these features you
will need to declare the cache in your `MODULE.bazel` as follows. Note
that the configuration consists of the same flags that can be passed to
embuilder. If `targets` is not set, all system libraries and ports will be
built, i.e., the `ALL` option to embuilder.
```starlark
emscripten_cache = use_extension(
"@emsdk//:emscripten_cache.bzl",
"emscripten_cache",
)
emscripten_cache.configuration(flags = ["--lto"])
emscripten_cache.targets(targets = [
"crtbegin",
"libprintf_long_double-debug",
"libstubs-debug",
"libnoexit",
"libc-debug",
"libdlmalloc",
"libcompiler_rt",
"libc++-noexcept",
"libc++abi-debug-noexcept",
"libsockets"
])
```
See `test_external/` for an example using [embind](https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html).

View File

@@ -1,2 +0,0 @@
build:wasm --incompatible_enable_cc_toolchain_resolution
build:wasm --platforms=@emsdk//:platform_wasm

View File

@@ -1,93 +0,0 @@
"""A templated build file for emscripten repositories"""
EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE = """
package(default_visibility = ['//visibility:public'])
filegroup(
name = "all",
srcs = glob(["**"]),
)
filegroup(
name = "includes",
srcs = glob([
"emscripten/cache/sysroot/include/c++/v1/**",
"emscripten/cache/sysroot/include/compat/**",
"emscripten/cache/sysroot/include/**",
"lib/clang/**/include/**",
]),
)
filegroup(
name = "emcc_common",
srcs = [
"emscripten/emcc.py",
"emscripten/embuilder.py",
"emscripten/emscripten-version.txt",
"emscripten/cache/sysroot_install.stamp",
"emscripten/src/settings.js",
"emscripten/src/settings_internal.js",
] + glob(
include = [
"emscripten/third_party/**",
"emscripten/tools/**",
],
exclude = [
"**/__pycache__/**",
],
),
)
filegroup(
name = "compiler_files",
srcs = [
"bin/clang{bin_extension}",
"bin/clang++{bin_extension}",
":emcc_common",
":includes",
],
)
filegroup(
name = "linker_files",
srcs = [
"bin/clang{bin_extension}",
"bin/llvm-ar{bin_extension}",
"bin/llvm-dwarfdump{bin_extension}",
"bin/llvm-nm{bin_extension}",
"bin/llvm-objcopy{bin_extension}",
"bin/wasm-ctor-eval{bin_extension}",
"bin/wasm-emscripten-finalize{bin_extension}",
"bin/wasm-ld{bin_extension}",
"bin/wasm-metadce{bin_extension}",
"bin/wasm-opt{bin_extension}",
"bin/wasm-split{bin_extension}",
"bin/wasm2js{bin_extension}",
":emcc_common",
] + glob(
include = [
"emscripten/cache/sysroot/lib/**",
"emscripten/node_modules/**",
"emscripten/src/**",
],
),
)
filegroup(
name = "ar_files",
srcs = [
"bin/llvm-ar{bin_extension}",
"emscripten/emar.py",
"emscripten/emscripten-version.txt",
"emscripten/src/settings.js",
"emscripten/src/settings_internal.js",
] + glob(
include = [
"emscripten/tools/**",
],
exclude = [
"**/__pycache__/**",
],
),
)
"""

View File

@@ -1,113 +0,0 @@
BUILD_FILE_CONTENT_TEMPLATE = """
package(default_visibility = ['//visibility:public'])
exports_files(['emscripten_config'])
"""
EMBUILDER_CONFIG_TEMPLATE = """
CACHE = '{cache}'
BINARYEN_ROOT = '{binaryen_root}'
LLVM_ROOT = '{llvm_root}'
"""
def get_root_and_script_ext(repository_ctx):
if repository_ctx.os.name.startswith("linux"):
if "amd64" in repository_ctx.os.arch or "x86_64" in repository_ctx.os.arch:
return (repository_ctx.path(Label("@emscripten_bin_linux//:BUILD.bazel")).dirname, "")
elif "aarch64" in repository_ctx.os.arch:
return (repository_ctx.path(Label("@emscripten_bin_linux_arm64//:BUILD.bazel")).dirname, "")
else:
fail("Unsupported architecture for Linux")
elif repository_ctx.os.name.startswith("mac"):
if "amd64" in repository_ctx.os.arch or "x86_64" in repository_ctx.os.arch:
return (repository_ctx.path(Label("@emscripten_bin_mac//:BUILD.bazel")).dirname, "")
elif "aarch64" in repository_ctx.os.arch:
return (repository_ctx.path(Label("@emscripten_bin_mac_arm64//:BUILD.bazel")).dirname, "")
else:
fail("Unsupported architecture for MacOS")
elif repository_ctx.os.name.startswith("windows"):
return (repository_ctx.path(Label("@emscripten_bin_win//:BUILD.bazel")).dirname, ".bat")
else:
fail("Unsupported operating system")
def _emscripten_cache_repository_impl(repository_ctx):
# Read the default emscripten configuration file
default_config = repository_ctx.read(
repository_ctx.path(
Label("@emsdk//emscripten_toolchain:default_config"),
),
)
if repository_ctx.attr.targets or repository_ctx.attr.configuration:
root, script_ext = get_root_and_script_ext(repository_ctx)
llvm_root = root.get_child("bin")
cache = repository_ctx.path("cache")
# Create configuration file
embuilder_config_content = EMBUILDER_CONFIG_TEMPLATE.format(
cache = cache,
binaryen_root = root,
llvm_root = llvm_root,
)
repository_ctx.file("embuilder_config", embuilder_config_content)
embuilder_config_path = repository_ctx.path("embuilder_config")
embuilder_path = "{}{}".format(root.get_child("emscripten").get_child("embuilder"), script_ext)
# Prepare the command line
if repository_ctx.attr.targets:
targets = repository_ctx.attr.targets
else:
# If no targets are requested, build everything
targets = ["ALL"]
flags = ["--em-config", embuilder_config_path] + repository_ctx.attr.configuration
embuilder_args = [embuilder_path] + flags + ["build"] + targets
# Run embuilder
repository_ctx.report_progress("Building secondary cache")
result = repository_ctx.execute(
embuilder_args,
quiet = True,
environment = {
"EM_IGNORE_SANITY": "1",
"EM_NODE_JS": "empty",
},
)
if result.return_code != 0:
fail("Embuilder exited with a non-zero return code")
# Override Emscripten's cache with the secondary cache
default_config += "CACHE = '{}'\n".format(cache)
# Create the configuration file for the toolchain and export
repository_ctx.file("emscripten_config", default_config)
repository_ctx.file("BUILD.bazel", BUILD_FILE_CONTENT_TEMPLATE)
_emscripten_cache_repository = repository_rule(
implementation = _emscripten_cache_repository_impl,
attrs = {
"configuration": attr.string_list(),
"targets": attr.string_list(),
},
)
def _emscripten_cache_impl(ctx):
all_configuration = []
all_targets = []
for mod in ctx.modules:
for configuration in mod.tags.configuration:
all_configuration += configuration.flags
for targets in mod.tags.targets:
all_targets += targets.targets
_emscripten_cache_repository(
name = "emscripten_cache",
configuration = all_configuration,
targets = all_targets,
)
emscripten_cache = module_extension(
tag_classes = {
"configuration": tag_class(attrs = {"flags": attr.string_list()}),
"targets": tag_class(attrs = {"targets": attr.string_list()}),
},
implementation = _emscripten_cache_impl,
)

View File

@@ -1,99 +0,0 @@
load(":remote_emscripten_repository.bzl", "remote_emscripten_repository")
load(":revisions.bzl", "EMSCRIPTEN_TAGS")
def _parse_version(v):
return [int(u) for u in v.split(".")]
def _empty_repository_impl(ctx):
ctx.file("MODULE.bazel", """module(name = "{}")""".format(ctx.name))
ctx.file("BUILD.bazel", "")
_empty_repository = repository_rule(
implementation = _empty_repository_impl,
)
def emscripten_repo_name(name):
return "emscripten_bin_{}".format(name)
def _emscripten_deps_impl(ctx):
version = None
for mod in ctx.modules:
for config in mod.tags.config:
if config.version and version != None:
fail("More than one emscripten version specified!")
version = config.version
if version == None:
version = "latest"
if version == "latest":
version = reversed(sorted(EMSCRIPTEN_TAGS.keys(), key = _parse_version))[0]
revision = EMSCRIPTEN_TAGS[version]
emscripten_url = "https://storage.googleapis.com/webassembly/emscripten-releases-builds/{}/{}/wasm-binaries{}.{}"
remote_emscripten_repository(
name = emscripten_repo_name("linux"),
bin_extension = "",
sha256 = revision.sha_linux,
strip_prefix = "install",
type = "tar.xz",
url = emscripten_url.format("linux", revision.hash, "", "tar.xz"),
)
# Not all versions have a linux/arm64 release: https://github.com/emscripten-core/emsdk/issues/547
if hasattr(revision, "sha_linux_arm64"):
remote_emscripten_repository(
name = emscripten_repo_name("linux_arm64"),
bin_extension = "",
sha256 = revision.sha_linux_arm64,
strip_prefix = "install",
type = "tar.xz",
url = emscripten_url.format("linux", revision.hash, "-arm64", "tar.xz"),
)
else:
_empty_repository(
name = emscripten_repo_name("linux_arm64"),
)
remote_emscripten_repository(
name = emscripten_repo_name("mac"),
bin_extension = "",
sha256 = revision.sha_mac,
strip_prefix = "install",
type = "tar.xz",
url = emscripten_url.format("mac", revision.hash, "", "tar.xz"),
)
remote_emscripten_repository(
name = emscripten_repo_name("mac_arm64"),
bin_extension = "",
sha256 = revision.sha_mac_arm64,
strip_prefix = "install",
type = "tar.xz",
url = emscripten_url.format("mac", revision.hash, "-arm64", "tar.xz"),
)
remote_emscripten_repository(
name = emscripten_repo_name("win"),
bin_extension = ".exe",
sha256 = revision.sha_win,
strip_prefix = "install",
type = "zip",
url = emscripten_url.format("win", revision.hash, "", "zip"),
)
emscripten_deps = module_extension(
tag_classes = {
"config": tag_class(
attrs = {
"version": attr.string(
doc = "Version to use. 'latest' to use latest.",
values = ["latest"] + EMSCRIPTEN_TAGS.keys(),
),
},
),
},
implementation = _emscripten_deps_impl,
)

View File

@@ -1,43 +0,0 @@
load("//:emscripten_deps.bzl", "emscripten_repo_name")
load("//:remote_emscripten_repository.bzl", "create_toolchains", "emscripten_toolchain_name")
load("@rules_python//python:py_binary.bzl", "py_binary")
package(default_visibility = ["//visibility:public"])
# dlmalloc.bc is implicitly added by the emscripten toolchain
cc_library(name = "malloc")
create_toolchains(
name = emscripten_toolchain_name("linux"),
repo_name = emscripten_repo_name("linux"),
exec_compatible_with = [ "@platforms//os:linux", "@platforms//cpu:x86_64"],
)
create_toolchains(
name = emscripten_toolchain_name("linux_arm64"),
repo_name = emscripten_repo_name("linux_arm64"),
exec_compatible_with = ["@platforms//os:linux", "@platforms//cpu:arm64"],
)
create_toolchains(
name = emscripten_toolchain_name("mac"),
repo_name = emscripten_repo_name("mac"),
exec_compatible_with = ["@platforms//os:macos", "@platforms//cpu:x86_64"],
)
create_toolchains(
name = emscripten_toolchain_name("mac_arm64"),
repo_name = emscripten_repo_name("mac_arm64"),
exec_compatible_with = ["@platforms//os:macos", "@platforms//cpu:arm64"],
)
create_toolchains(
name = emscripten_toolchain_name("win"),
repo_name = emscripten_repo_name("win"),
exec_compatible_with = ["@platforms//os:windows", "@platforms//cpu:x86_64"],
)
py_binary(
name = "wasm_binary",
srcs = ["wasm_binary.py"],
)

View File

@@ -1,16 +0,0 @@
import os
import platform
ROOT_DIR = os.environ["ROOT_DIR"]
EMSCRIPTEN_ROOT = os.environ["EMSCRIPTEN"]
BINARYEN_ROOT = os.path.join(ROOT_DIR, os.environ["EM_BIN_PATH"])
LLVM_ROOT = os.path.join(BINARYEN_ROOT, "bin")
NODE_JS = os.path.join(ROOT_DIR, os.environ["NODE_JS_PATH"])
FROZEN_CACHE = True
# This works around an issue with Bazel RBE where the symlinks in node_modules/.bin
# are uploaded as the linked files, which means the cli.js cannot load its
# dependencies from the expected locations.
# See https://github.com/emscripten-core/emscripten/pull/16640 for more
CLOSURE_COMPILER = [NODE_JS, os.path.join(EMSCRIPTEN_ROOT, "node_modules",
"google-closure-compiler", "cli.js")]

View File

@@ -1,5 +0,0 @@
@ECHO OFF
call %~dp0\env.bat
py -3 %EMSCRIPTEN%\emar.py %*

View File

@@ -1,5 +0,0 @@
#!/bin/bash
source $(dirname $0)/env.sh
exec python3 $EMSCRIPTEN/emar.py "$@"

View File

@@ -1,5 +0,0 @@
@ECHO OFF
call %~dp0\env.bat
py -3 %EMSCRIPTEN%\emcc.py %*

View File

@@ -1,5 +0,0 @@
#!/bin/bash
source $(dirname $0)/env.sh
exec python3 $EMSCRIPTEN/emcc.py "$@"

View File

@@ -1,5 +0,0 @@
@ECHO OFF
call %~dp0\env.bat
py -3 %~dp0\link_wrapper.py %*

View File

@@ -1,5 +0,0 @@
#!/bin/bash
source $(dirname $0)/env.sh
exec python3 $(dirname $0)/link_wrapper.py "$@"

View File

@@ -1,6 +0,0 @@
@ECHO OFF
set ROOT_DIR=%EXT_BUILD_ROOT%
if "%ROOT_DIR%"=="" set ROOT_DIR=%CD%
set EMSCRIPTEN=%ROOT_DIR%\%EM_BIN_PATH%\emscripten
set EM_CONFIG=%ROOT_DIR%\%EM_CONFIG_PATH%

View File

@@ -1,5 +0,0 @@
#!/bin/bash
export ROOT_DIR=${EXT_BUILD_ROOT:-$(pwd -P)}
export EMSCRIPTEN=$ROOT_DIR/$EM_BIN_PATH/emscripten
export EM_CONFIG=$ROOT_DIR/$EM_CONFIG_PATH

View File

@@ -1,167 +0,0 @@
#!/usr/bin/env python
"""wrapper around emcc link step.
This wrapper currently serves the following purposes.
1. When building with --config=wasm the final output is multiple files, usually
at least one .js and one .wasm file. Since the cc_binary link step only
allows a single output, we must tar up the outputs into a single file.
2. Add quotes around arguments that need them in the response file to work
around a bazel quirk.
3. Ensure the external_debug_info section of the wasm points at the correct
bazel path.
"""
from __future__ import print_function
import argparse
import os
import subprocess
import sys
# Only argument should be @path/to/parameter/file
assert sys.argv[1][0] == '@', sys.argv
param_filename = sys.argv[1][1:]
param_file_args = [line.strip() for line in open(param_filename, 'r').readlines()]
# Re-write response file if needed.
if any(' ' in a for a in param_file_args):
new_param_filename = param_filename + '.modified'
with open(new_param_filename, 'w') as f:
for param in param_file_args:
if ' ' in param:
f.write('"%s"' % param)
else:
f.write(param)
f.write('\n')
sys.argv[1] = '@' + new_param_filename
emcc_py = os.path.join(os.environ['EMSCRIPTEN'], 'emcc.py')
rtn = subprocess.call([sys.executable, emcc_py] + sys.argv[1:])
if rtn != 0:
sys.exit(1)
# Parse the arguments that we gave to the linker to determine what the output
# file is named and what the output format is.
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-o')
parser.add_argument('--oformat')
options = parser.parse_known_args(param_file_args)[0]
output_file = options.o
oformat = options.oformat
outdir = os.path.normpath(os.path.dirname(output_file))
base_name = os.path.basename(output_file)
# The output file name is the name of the build rule that was built.
# Add an appropriate file extension based on --oformat.
if oformat is not None:
base_name_split = os.path.splitext(base_name)
# If the output name has no extension, give it the appropriate extension.
if not base_name_split[1]:
os.replace(output_file, output_file + '.' + oformat)
# If the output name does have an extension and it matches the output format,
# change the base_name so it doesn't have an extension.
elif base_name_split[1] == '.' + oformat:
base_name = base_name_split[0]
# If the output name does have an extension and it does not match the output
# format, change the base_name so it doesn't have an extension and rename
# the output_file so it has the proper extension.
# Note that if you do something like name your build rule "foo.js" and pass
# "--oformat=html", emscripten will write to the same file for both the js and
# html output, overwriting the js output entirely with the html.
# Please don't do that.
else:
base_name = base_name_split[0]
os.replace(output_file, os.path.join(outdir, base_name + '.' + oformat))
files = []
extensions = [
'.js',
'.wasm',
'.wasm.map',
'.js.mem',
'.fetch.js',
'.worker.js',
'.data',
'.js.symbols',
'.wasm.debug.wasm',
'.html',
'.aw.js'
]
for ext in extensions:
filename = base_name + ext
if os.path.exists(os.path.join(outdir, filename)):
files.append(filename)
wasm_base = os.path.join(outdir, base_name + '.wasm')
if os.path.exists(wasm_base + '.debug.wasm') and os.path.exists(wasm_base):
# If we have a .wasm.debug.wasm file and a .wasm file, we need to rewrite the
# section in the .wasm file that refers to it. The path that's in there
# is the blaze output path; we want it to be just the filename.
llvm_objcopy = os.path.join(
os.environ['EM_BIN_PATH'], 'bin/llvm-objcopy')
# First, check to make sure the .wasm file has the header that needs to be
# rewritten.
rtn = subprocess.call([
llvm_objcopy,
'--dump-section=external_debug_info=/dev/null',
wasm_base], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if rtn == 0:
# If llvm-objcopy did not return an error, the external_debug_info section
# must exist, so we're good to continue.
# Next we need to convert length of the filename to LEB128.
# Start by converting the length of the filename to a bit string.
bit_string = '{0:b}'.format(len(base_name + '.wasm.debug.wasm'))
# Pad the bit string with 0s so that its length is a multiple of 7.
while len(bit_string) % 7 != 0:
bit_string = '0' + bit_string
# Break up our bit string into chunks of 7.
# We do this backwards because the final format is little-endian.
final_bytes = bytearray()
for i in reversed(range(0, len(bit_string), 7)):
binary_part = bit_string[i:i + 7]
if i != 0:
# Every chunk except the last one needs to be prepended with '1'.
# The length of each chunk is 7, so that one has an implicit '0'.
binary_part = '1' + binary_part
final_bytes.append(int(binary_part, 2))
# Finally, add the actual filename.
final_bytes.extend((base_name + '.wasm.debug.wasm').encode())
# Write our length + filename bytes to a temp file.
with open(base_name + '_debugsection.tmp', 'wb+') as f:
f.write(final_bytes)
f.close()
# First delete the old section.
subprocess.check_call([
llvm_objcopy,
wasm_base,
'--remove-section=external_debug_info'])
# Rewrite section with the new size and filename from the temp file.
subprocess.check_call([
llvm_objcopy,
wasm_base,
'--add-section=external_debug_info=' + base_name + '_debugsection.tmp'])
# Make sure we have at least one output file.
if not len(files):
print('emcc.py did not appear to output any known files!')
sys.exit(1)
# cc_binary must output exactly one file; put all the output files in a tarball.
cmd = ['tar', 'cf', base_name + '.tar'] + files
subprocess.check_call(cmd, cwd=outdir)
os.replace(os.path.join(outdir, base_name + '.tar'), output_file)
sys.exit(0)

File diff suppressed because it is too large Load Diff

View File

@@ -1,56 +0,0 @@
"""Unpackages a bazel emscripten archive for use in a bazel BUILD rule.
This script will take a tar archive containing the output of the emscripten
toolchain. This file contains any output files produced by a wasm_cc_binary or a
cc_binary built with --config=wasm. The files are extracted into the given
output paths.
The contents of the archive are expected to match the given outputs extnames.
This script and its accompanying Bazel rule should allow you to extract a
WebAssembly binary into a larger web application.
"""
import argparse
import os
import tarfile
def ensure(f):
if not os.path.exists(f):
with open(f, 'w'):
pass
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--archive', help='The archive to extract from.')
parser.add_argument('--outputs', help='Comma separated list of files that should be extracted from the archive. Only the extname has to match a file in the archive.')
parser.add_argument('--allow_empty_outputs', help='If an output listed in --outputs does not exist, create it anyways.', action='store_true')
args = parser.parse_args()
args.archive = os.path.normpath(args.archive)
args.outputs = args.outputs.split(",")
tar = tarfile.open(args.archive)
for member in tar.getmembers():
extname = '.' + member.name.split('.', 1)[1]
for idx, output in enumerate(args.outputs):
if output.endswith(extname):
member_file = tar.extractfile(member)
with open(output, "wb") as output_file:
output_file.write(member_file.read())
args.outputs.pop(idx)
break
for output in args.outputs:
extname = '.' + output.split('.', 1)[1]
if args.allow_empty_outputs:
ensure(output)
else:
print("[ERROR] Archive does not contain file with extname: %s" % extname)
if __name__ == '__main__':
main()

View File

@@ -1,231 +0,0 @@
"""wasm_cc_binary rule for compiling C++ targets to WebAssembly.
"""
def _wasm_transition_impl(settings, attr):
_ignore = (settings, attr)
features = list(settings["//command_line_option:features"])
linkopts = list(settings["//command_line_option:linkopt"])
if attr.threads == "emscripten":
# threads enabled
features.append("use_pthreads")
elif attr.threads == "off":
# threads disabled
features.append("-use_pthreads")
if attr.exit_runtime == True:
features.append("exit_runtime")
if attr.backend == "llvm":
features.append("llvm_backend")
elif attr.backend == "emscripten":
features.append("-llvm_backend")
if attr.simd:
features.append("wasm_simd")
platform = "@emsdk//:platform_wasm"
if attr.standalone:
platform = "@emsdk//:platform_wasi"
features.append("wasm_standalone")
return {
"//command_line_option:compiler": "emscripten",
"//command_line_option:cpu": "wasm",
"//command_line_option:features": features,
"//command_line_option:dynamic_mode": "off",
"//command_line_option:linkopt": linkopts,
"//command_line_option:platforms": [platform],
# This is hardcoded to an empty cc_library because the malloc library
# is implicitly added by the emscripten toolchain
"//command_line_option:custom_malloc": "@emsdk//emscripten_toolchain:malloc",
}
_wasm_transition = transition(
implementation = _wasm_transition_impl,
inputs = [
"//command_line_option:features",
"//command_line_option:linkopt",
],
outputs = [
"//command_line_option:compiler",
"//command_line_option:cpu",
"//command_line_option:features",
"//command_line_option:dynamic_mode",
"//command_line_option:linkopt",
"//command_line_option:platforms",
"//command_line_option:custom_malloc",
],
)
_ALLOW_OUTPUT_EXTNAMES = [
".js",
".wasm",
".wasm.map",
".worker.js",
".js.mem",
".data",
".fetch.js",
".js.symbols",
".wasm.debug.wasm",
".html",
".aw.js",
]
_WASM_BINARY_COMMON_ATTRS = {
"backend": attr.string(
default = "_default",
values = ["_default", "emscripten", "llvm"],
),
"cc_target": attr.label(
cfg = _wasm_transition,
mandatory = True,
),
"exit_runtime": attr.bool(
default = False,
),
"threads": attr.string(
default = "_default",
values = ["_default", "emscripten", "off"],
),
"simd": attr.bool(
default = False,
),
"standalone": attr.bool(
default = False,
),
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
),
"_wasm_binary_extractor": attr.label(
executable = True,
allow_files = True,
cfg = "exec",
default = Label("@emsdk//emscripten_toolchain:wasm_binary"),
),
}
def _wasm_cc_binary_impl(ctx):
args = ctx.actions.args()
cc_target = ctx.attr.cc_target[0]
for output in ctx.outputs.outputs:
valid_extname = False
for allowed_extname in _ALLOW_OUTPUT_EXTNAMES:
if output.path.endswith(allowed_extname):
valid_extname = True
break
if not valid_extname:
fail("Invalid output '{}'. Allowed extnames: {}".format(output.basename, ", ".join(_ALLOW_OUTPUT_EXTNAMES)))
args.add_all("--archive", ctx.files.cc_target)
args.add_joined("--outputs", ctx.outputs.outputs, join_with = ",")
ctx.actions.run(
inputs = ctx.files.cc_target,
outputs = ctx.outputs.outputs,
arguments = [args],
executable = ctx.executable._wasm_binary_extractor,
)
return [
DefaultInfo(
files = depset(ctx.outputs.outputs),
# This is needed since rules like web_test usually have a data
# dependency on this target.
data_runfiles = ctx.runfiles(transitive_files = depset(ctx.outputs.outputs)),
),
OutputGroupInfo(_wasm_tar = cc_target.files),
]
def _wasm_cc_binary_legacy_impl(ctx):
cc_target = ctx.attr.cc_target[0]
outputs = [
ctx.outputs.loader,
ctx.outputs.wasm,
ctx.outputs.map,
ctx.outputs.mem,
ctx.outputs.fetch,
ctx.outputs.worker,
ctx.outputs.data,
ctx.outputs.symbols,
ctx.outputs.dwarf,
ctx.outputs.html,
ctx.outputs.audio_worklet,
]
args = ctx.actions.args()
args.add("--allow_empty_outputs")
args.add_all("--archive", ctx.files.cc_target)
args.add_joined("--outputs", outputs, join_with = ",")
ctx.actions.run(
inputs = ctx.files.cc_target,
outputs = outputs,
arguments = [args],
executable = ctx.executable._wasm_binary_extractor,
)
return [
DefaultInfo(
executable = ctx.outputs.wasm,
files = depset(outputs),
# This is needed since rules like web_test usually have a data
# dependency on this target.
data_runfiles = ctx.runfiles(transitive_files = depset(outputs)),
),
OutputGroupInfo(_wasm_tar = cc_target.files),
]
_wasm_cc_binary = rule(
implementation = _wasm_cc_binary_impl,
attrs = dict(
_WASM_BINARY_COMMON_ATTRS,
outputs = attr.output_list(
allow_empty = False,
mandatory = True,
),
),
)
def _wasm_binary_legacy_outputs(name, cc_target):
basename = cc_target.name
basename = basename.split(".")[0]
outputs = {
"loader": "{}/{}.js".format(name, basename),
"wasm": "{}/{}.wasm".format(name, basename),
"map": "{}/{}.wasm.map".format(name, basename),
"mem": "{}/{}.js.mem".format(name, basename),
"fetch": "{}/{}.fetch.js".format(name, basename),
"worker": "{}/{}.worker.js".format(name, basename),
"data": "{}/{}.data".format(name, basename),
"symbols": "{}/{}.js.symbols".format(name, basename),
"dwarf": "{}/{}.wasm.debug.wasm".format(name, basename),
"html": "{}/{}.html".format(name, basename),
"audio_worklet": "{}/{}.aw.js".format(name, basename)
}
return outputs
_wasm_cc_binary_legacy = rule(
implementation = _wasm_cc_binary_legacy_impl,
attrs = _WASM_BINARY_COMMON_ATTRS,
outputs = _wasm_binary_legacy_outputs,
)
# Wraps a C++ Blaze target, extracting the appropriate files.
#
# This rule will transition to the emscripten toolchain in order
# to build the the cc_target as a WebAssembly binary.
#
# Args:
# name: The name of the rule.
# cc_target: The cc_binary or cc_library to extract files from.
def wasm_cc_binary(outputs = None, **kwargs):
# for backwards compatibility if no outputs are set the deprecated
# implementation is used.
if not outputs:
_wasm_cc_binary_legacy(**kwargs)
else:
_wasm_cc_binary(outputs = outputs, **kwargs)

View File

@@ -1,6 +0,0 @@
"""Rules related to C++ and WebAssembly.
"""
load(":wasm_cc_binary.bzl", _wasm_cc_binary = "wasm_cc_binary")
wasm_cc_binary = _wasm_cc_binary

View File

@@ -1,10 +0,0 @@
#include <wasm_simd128.h>
void multiply_arrays(int* out, int* in_a, int* in_b, int size) {
for (int i = 0; i < size; i += 4) {
v128_t a = wasm_v128_load(&in_a[i]);
v128_t b = wasm_v128_load(&in_b[i]);
v128_t prod = wasm_i32x4_mul(a, b);
wasm_v128_store(&out[i], prod);
}
}

View File

@@ -1,6 +0,0 @@
#include <iostream>
int main(int argc, char** argv) {
std::cout << "hello world!" << std::endl;
return 0;
}

View File

@@ -1,148 +0,0 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load(":emscripten_build_file.bzl", "EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE")
load(":revisions.bzl", "EMSCRIPTEN_TAGS")
load("//emscripten_toolchain:toolchain.bzl", "emscripten_cc_toolchain_config_rule")
def remote_emscripten_repository(
name,
bin_extension,
**kwargs,
):
"""Imports an Emscripten from an http archive
Args:
name: A unique name for this Emscripten repository.
bin_extension: Extension for the binaries in this Emscripten repository
**kwargs: Args for http_archive. Refer to http_archive documentation for more info.
"""
http_archive(
name = name,
build_file_content = EMSCRIPTEN_BUILD_FILE_CONTENT_TEMPLATE.format(bin_extension = bin_extension),
**kwargs
)
def emscripten_toolchain_name(name):
return "emscripten_{}".format(name)
def _get_name_and_target(name):
return name, ":" + name
def create_toolchains(name, repo_name, exec_compatible_with):
"""Creates toolchain definition for an Emscripten
Register the toolchains defined by this macro via
`register_toolchains("//<path-to-target>:cc-toolchain-wasm-<name>")`
Args:
name: A unique name for this Emscripten toolchain
repo_name: The name of the Emscripten repository for this toolchain
exec_compatible_with: Execute platform constraints for the Emscripten toolchain associated
with this repository.
**kwargs: Args for http_archive. Refer to http_archive documentation for more info.
"""
common_files_name, common_files_target = _get_name_and_target("common_files_" + name)
compiler_files_name, compiler_files_target = _get_name_and_target("compiler_files_" + name)
linker_files_name, linker_files_target = _get_name_and_target("linker_files_" + name)
ar_files_name, ar_files_target = _get_name_and_target("ar_files_" + name)
all_files_name, all_files_target = _get_name_and_target("all_files_" + name)
cc_wasm_name, cc_wasm_target = _get_name_and_target("cc-compiler-wasm-" + name)
wasm_name = "wasm-" + name
# These are file groups defined by the build_file_content on the Emscripten http_archive
remote_repo = "@{}//".format(repo_name)
repo_compiler_files_target = remote_repo + ":compiler_files"
repo_linker_files_target = remote_repo + ":linker_files"
repo_ar_files_target = remote_repo + ":ar_files"
native.filegroup(
name = common_files_name,
srcs = [
"@emscripten_cache//:emscripten_config",
"@emsdk//emscripten_toolchain:env.sh",
"@emsdk//emscripten_toolchain:env.bat",
"@nodejs//:node_files",
],
)
native.filegroup(
name = compiler_files_name,
srcs = [
"@emsdk//emscripten_toolchain:emcc.sh",
"@emsdk//emscripten_toolchain:emcc.bat",
repo_compiler_files_target,
common_files_target,
],
)
native.filegroup(
name = linker_files_name,
srcs = [
"@emsdk//emscripten_toolchain:emcc_link.sh",
"@emsdk//emscripten_toolchain:emcc_link.bat",
"link_wrapper.py",
repo_linker_files_target,
common_files_target,
],
)
native.filegroup(
name = ar_files_name,
srcs = [
"@emsdk//emscripten_toolchain:emar.sh",
"@emsdk//emscripten_toolchain:emar.bat",
repo_ar_files_target,
common_files_target,
],
)
native.filegroup(
name = all_files_name,
srcs = [
ar_files_target,
compiler_files_target,
linker_files_target,
],
)
emscripten_cc_toolchain_config_rule(
name = wasm_name,
cpu = "wasm",
em_config = "@emscripten_cache//:emscripten_config",
emscripten_binaries = repo_compiler_files_target,
nodejs_bin = "@nodejs//:node",
script_extension = select({
"@bazel_tools//src/conditions:host_windows": "bat",
"//conditions:default": "sh",
}),
)
native.cc_toolchain(
name = cc_wasm_name,
all_files = all_files_target,
ar_files = ar_files_target,
as_files = ":empty",
compiler_files = compiler_files_target,
dwp_files = ":empty",
linker_files = linker_files_target,
objcopy_files = ":empty",
strip_files = ":empty",
toolchain_config = wasm_name,
toolchain_identifier = "emscripten-wasm-" + name,
)
native.toolchain(
name = "cc-toolchain-wasm-" + name,
target_compatible_with = ["@platforms//cpu:wasm32"],
exec_compatible_with = exec_compatible_with,
toolchain = cc_wasm_target,
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)
native.cc_toolchain_suite(
name = "everything-" + name,
toolchains = {
"wasm": cc_wasm_target,
"wasm|emscripten": cc_wasm_target,
},
)

View File

@@ -1,805 +0,0 @@
# This file is automatically updated by emsdk/scripts/update_bazel_workspace.py
# DO NOT MODIFY
EMSCRIPTEN_TAGS = {
"4.0.13": struct(
hash = "32b8ae819674cb42b8ac2191afeb9571e33ad5e2",
sha_linux = "2ad887035e3e5cac78abcaeca3b3881897f03b9919d008cbc0ef41d7641247c9",
sha_linux_arm64 = "675156bd626c7b19d4f2271ea8ffa77a235d9b0a031116632e53b374cf23754c",
sha_mac = "657cbd01e84f0a33cb7a1379baecd18a7d96883222a3a99b43919d8bb2374f55",
sha_mac_arm64 = "12ac26e298ef973207eba9332e28da375ec2ba1d32e68e0d8b32de3c886a2e39",
sha_win = "a363d6e92dcaf0024d378f1faabb61a139d9152a796f66a475a48e33e90f6adb",
),
"4.0.12": struct(
hash = "209b886304498eff50dd835850dc5715803401ed",
sha_linux = "1c303712707a91b88f743b0ad6dd1544c289e614844396698a2510a66c5608f1",
sha_linux_arm64 = "2c503d031d2ad2b13c6e4fe09f104fe50c5d1319feaa2b3d19d4e4608435fbb8",
sha_mac = "c85830f151ec8eebec6bb2344e3eed942bc7b5dc91b146326635f9f71af459f2",
sha_mac_arm64 = "853dff1a8451b54ff7cdd95f923851dd9b58ab36873b7b600d16243a5fb6d907",
sha_win = "7b7e58fbd35a78ddf9a2a4a3f6215857bf2342942c429cdf540a2251540cb845",
),
"4.0.11": struct(
hash = "7033fec38817ec01909b044ea0193ddd5057255c",
sha_linux = "f38e70b53be587e7c757f375b3452e259c70130d4b40db3213c95b7ae321f5d7",
sha_linux_arm64 = "42020e4db200ac366a3e91ac2fccc04ee0ffc090cd2d5986c892b27f39172bb9",
sha_mac = "4169811f9682f54ae5c9d0662d0a4dd4318abab5d3d0473fa54007f515a8cdea",
sha_mac_arm64 = "09554371e3941306d047d67618532e5366ba6c9b5bda1a504a917bfbabc5d414",
sha_win = "bd2094ca9bde5df25020a46ece7f56b622d1d22214fbd12950b01b952dd40084",
),
"4.0.10": struct(
hash = "8103ffedfb0c42d231c6af6859a5a1a832260b43",
sha_linux = "0183f887b56c3f8d4b45826cb49856a3324afb66236ad3c13944c0fd2550cbbc",
sha_linux_arm64 = "0679f459118d80163d0712b0abda00cbc97a90cddf1dcefa9efb1bf89f67baed",
sha_mac = "02f3179f703b4d196a679897b430c1eeeb1d5f9aeba9b435b04ba3f526f7e8e0",
sha_mac_arm64 = "c744ffe06ffed55cd8dae42862b7646f15550c7decd47a48d09a474af83732b0",
sha_win = "1a66825e85fda039f57d39c98ae2bdb96a18e53745159e9599f69679be18439f",
),
"4.0.9": struct(
hash = "cb2a69bce627bd2247624c71fc12907cb8785d2f",
sha_linux = "c6fd245138e6bbdd8349963cb4045c557d657e4be0ea44155375633c689c8be9",
sha_linux_arm64 = "872d7f5870f1bfc523a446ca66ab1b47009a96be33c398dbbb12a56597e46ab5",
sha_mac = "7efb0a6ddcb915aeca9f8685db909ae7799452894876fc1223a78d5c3288ff2d",
sha_mac_arm64 = "b97f3cda61211dd83b31ef9ea92e83d416a9422192cf3ee484fffe11e5d6e5b9",
sha_win = "e6e409ae564c041691f2fecd690431a9935401f8ab6afe284b222546887e84c5",
),
"4.0.8": struct(
hash = "56f86607aeb458086e72f23188789be2ee0e971a",
sha_linux = "7b50b2b40f80d4531ae29a0a5b902eca41552e04815f59880a122ac81e8f269d",
sha_linux_arm64 = "d6e3ab0cdec2e6983235322f600f248d313bfce4a6a69ef16cdfdc330ff748b8",
sha_mac = "e1b2e6d4797338ed884f9d8a8419f93fc42cfcdea5e8a8b29fe13c6fd3fe7f7a",
sha_mac_arm64 = "115b207304d5471b77fc7649904111f3bb5ed7998ad192cba6cfc5fd0b2d78cb",
sha_win = "9ca65cb49287f448216c2eac12dacff9808ae827d5de267aaf2bd65f6d4f233e",
),
"4.0.7": struct(
hash = "ef4e9cedeac3332e4738087567552063f4f250d3",
sha_linux = "60079078b1ecc4e96ab01c4189aceeff9049a1bb2544123295e9841b91a9410d",
sha_linux_arm64 = "caa10ae2d2b01eb290957e96636f0a6861e7305c8d991c762379542208415793",
sha_mac = "d588cc31b7db0d876f1d45f4d0c656d5e205d049c0bb27209cad04cfebe19309",
sha_mac_arm64 = "c0153cc053d8961e094447c3e706cb8f379c263bee64202fd78251fe018fb014",
sha_win = "7974b6e11164c2c94ddb252c9728d21de321094421f5d0856702e65c06751e54",
),
"4.0.6": struct(
hash = "14767574a5c37ff9526a253a65ddbe0811cb3667",
sha_linux = "27fc220a9ad98d323cad73531ff563e9838c9e1205f51ee2a5632bb4266a35d2",
sha_linux_arm64 = "2d03f8eb3f81dd94821658eefbb442a92b0b7601f4cfb08590590fd7bc467ef8",
sha_mac = "c06048915595726fc2e2da6a8db3134581a6287645fb818802a9734ff9785e77",
sha_mac_arm64 = "35d743453d0f91857b09f00d721037bb46753aaeae373bd7f64746338db11770",
sha_win = "3b576e825b26426bb72854ed98752df3fcb58cc3ab1dc116566e328b79a8abb3",
),
"4.0.5": struct(
hash = "d7f8ff5e2ca3539c33fae81e98f7c56ef9fa1239",
sha_linux = "fdd4d9d6b37e845039b207baaef60cd98fb594ea13a3e6d622c2dcd8f2a48ac6",
sha_linux_arm64 = "0007aec32eee609b91f35c32481ec060ea7dac7151e36344bbcae419907f9240",
sha_mac = "f4e5a6c57ad9de59bff73463972213a299af2bb419dafbdd3959947fa801a342",
sha_mac_arm64 = "b8b93190fa17afe32a5eaa7120b807767b1c9d6e1d4ae6b9a2c6adb231758683",
sha_win = "3b8ed9e298a6d58fee841f5c3f1d3e7b2dff104cc7df314cd329f4c05d470be0",
),
"4.0.4": struct(
hash = "ea71afcf5a172125179a07ff1731de6e81c92222",
sha_linux = "f05dab4a6a13a5fe6972e95e918d1483e687faf468e1a653deaa8d7956a97a3a",
sha_linux_arm64 = "95a421f304a7209c6f259754ad15aea5bbbbb1838139b51837aeb2c184fa4a89",
sha_mac = "d8b44aae37224ae76572ad84b60a2adaa126826332864fb689944d5130705d8d",
sha_mac_arm64 = "ade1c1a0c2e5893c6f74079beeae8b7e2a0c3f3b7ae88891064104fd985dfc2b",
sha_win = "342cf9dfb83e95bf678d07e460e093ea61a609d34b4603d9be06d4f31784409d",
),
"4.0.3": struct(
hash = "de2109f0e5e7278d470da11de526aed16c527722",
sha_linux = "6480f51d0c24130424c696bf83e9774f42246a0109c8d48b59f4520fdfadb928",
sha_linux_arm64 = "76b1511d550b4f47276b93581ae5122063acbca7c960703637657388cf178636",
sha_mac = "f40851b816b31b3ca3214ebf61cc152625a05c24f43e2b13c2ad9b9e5dca73c0",
sha_mac_arm64 = "6d8ac5ad1f59f71de0927eb2c595dab2f21d9946ca293434359a6db2ab06a138",
sha_win = "3702e4a518057520d4ad9e7cd63a01a829770d090551e00f19f417f55b0170d3",
),
"4.0.2": struct(
hash = "cc8eba40de8235f9c33d92463018f87b3edaa09e",
sha_linux = "3c0e3940240709388c24a4262680c18bb1d5979f2337abe53db00fb039606c44",
sha_linux_arm64 = "21ed0c31c1fc972e3509fcb140e0323061b5f2b173fe56d1f8961df2a37e4c11",
sha_mac = "e1bd96ec790968adf583d348158375b76ee0287e348954c3393c82565475b07b",
sha_mac_arm64 = "e5bf9a5efabc114b42636abcea07a1e02d3a9406cd399a29ccbc730586dce465",
sha_win = "78010f8e2f7bb6868bb20e3fc32e24d45e6fca749c388c2d25bea9845512338d",
),
"4.0.1": struct(
hash = "5ff495a591978fdf8a16f2d172be3616f3150d1e",
sha_linux = "7b2b64b1bc15555696f78cbcb54c8d75832222d1578270ff5f56a8024c9a0dbc",
sha_linux_arm64 = "5c046a22b933de14be6b2522b75796afffe3940a19422eee483b7f3f1a226d66",
sha_mac = "d089eba9c3cad675bbd7d3318aec166ebe5ba984a6c5291136c09c68324d9818",
sha_mac_arm64 = "c8359b334bad71719e8d29e796ca7b63891e0305987b2572eb5a2f020e34f773",
sha_win = "9cf861339327f3657281c5c8c18aa723323acffe3b3d1c3807b9d4576d097e0e",
),
"4.0.0": struct(
hash = "3ebc04a3dab24522a5bf8ced3ce3caea816558f6",
sha_linux = "6836988f0b7ee6ce3df5192dd4375b9eee55be78847ce31cf1d2abfb00f1e991",
sha_linux_arm64 = "d4e6e04b7e2fa1bdffc9c07ab4e0a3f66bde75adb06ebf9cc66a341907b17db4",
sha_mac = "4123e9ff6a699dac303c4fe22529ae0d618c118fcd8267df590363b0fc98c91d",
sha_mac_arm64 = "4b5fb7cc4f5f8526aaa41c8560a00ad6782b97cd3894d856beb635f05a825613",
sha_win = "6b1e5aee4b4a4274712566c845888bdf4eced09a5aaa64c1796cda57cd2854c4",
),
"3.1.74": struct(
hash = "c2655005234810c7c42e02a18e4696554abe0352",
sha_linux = "a987bb4cded4f29437e8589accac204ce3c134feaaaf251bb97d0fdf450dce65",
sha_linux_arm64 = "c7fcc532eb7ee1dc7df0eacb49128ded12e4d55a973b8a2a5215da8bb6c4027c",
sha_mac = "04f848f40bd19220a43abde2dd1012d95bf1f89c618c0f631b83d18357e2bb65",
sha_mac_arm64 = "fc71758a5bfb02b8a5c2dd21d6bfc34aa3c64698f6105e204a1f4d11f6d67603",
sha_win = "603b0515e0367ee2718b2f360ef0194663d23a91236910d5f4a90ac4d745a4f2",
),
"3.1.73": struct(
hash = "b363a836e75a245c548b7a6a021822d8c9e4c6df",
sha_linux = "4f3bc91cffec9096c3d3ccb11c222e1c2cb7734a0ff9a92d192e171849e68f28",
sha_linux_arm64 = "e6fb8a32889d4e4a3ac3e45d8012641369251ddd1255ada132ff6c70ab62b932",
sha_mac = "8d52ec080834f49996534de26772800dee048ec9bf148bb508be95887e267735",
sha_mac_arm64 = "58e6c984c5a1fb71e0871f0c3bb9e32d41e7553260c6eeb38800a4612623a99d",
sha_win = "d76003fad2146ad1f2289e8b251fbc359406ced0857f141a41f15149c2138302",
),
"3.1.72": struct(
hash = "7a360458327cd24c2a7aab428bdbcb5bca8810e4",
sha_linux = "be094d6dd27c27a64116e9c0165d6cade5d329f5137e56696773e98e1df83fa7",
sha_linux_arm64 = "5dba64454809d72d53c432f3c91830d69d413ebd9dcd0ce18df5a79a3af235a6",
sha_mac = "52f713c118717814d2371912ab9019a3605b7d6acc627f3842e6aa7d3ffff7bf",
sha_mac_arm64 = "644593539684f59c635c7eae2e743f5e4e27b1d665f9c71c23dcefd4c2448b3c",
sha_win = "c72623fb68f109d8f122036f25b9fc75353bd1ce28995d9920277d4be4a1d99c",
),
"3.1.71": struct(
hash = "7ee0f9488f152e9e9cf0d4d243970e03742f1a5c",
sha_linux = "43f87aa84a73697b905d2a13c89d016af8ec66bed792f37dd5a0059529abee12",
sha_linux_arm64 = "d25f5e57b2e7557df39cd9dec3b0283fb086f66c800af3d9a3f70f36c5fc6b14",
sha_mac = "8dac015c03c4f2e594d8bca25fe35d1e4d808aea81705121e852aff0464c4a9d",
sha_mac_arm64 = "a7797c3d210eda29f88eede261fc8f0aabf22c7b05214916b5b50a1271e9f0b8",
sha_win = "dfe77eaf22278ca975519f0497c8b336c86e52461c478060418fe67b39b6e87c",
),
"3.1.70": struct(
hash = "6fa6145af41e835f3d13edf7d308c08e4573357a",
sha_linux = "c29b4a2c6addd5aafa613768d34273a23d8fcd1753c685ff61099506710cd8d7",
sha_linux_arm64 = "b13386975023a06f19057daef3896d480229b144d1e97f8764ed2f3e0fcb7d37",
sha_mac = "bc0edcaaaa19daeda9164d38d36c5f7d7b4b4e1eb7695ad58e776336c571fcc4",
sha_mac_arm64 = "e470d5eeb570850d66a79bd4c06064b9b3a1e90c7c2101e1a444ebcd6466fe5a",
sha_win = "f0118d71fd67583ddcfd39af2ed8bec3d18152fb6aadee085ebec5bcaf4ac4f5",
),
"3.1.69": struct(
hash = "8fe01288bc35668c13316324336ea00195dfb814",
sha_linux = "24a786666e6f48ed3c3944b44df5cf146c45cf4faece4cb2686312a3d052a00c",
sha_linux_arm64 = "48e670501d215ac5b6b2680c900c517d9028dbc4de43be5dd6f25211a3640f2b",
sha_mac = "8503fe87dd2f30abff2550e9d6eb8aadeaf30fd3c6972d635b31e67f82e155f7",
sha_mac_arm64 = "995c7b3c84458edf6b8945e81405320c64a25dfe79eaa427fc1fe9a680f56b4f",
sha_win = "3839e0a581ae7b19156f004762a8221585e9a0d6237e468b13a878d1947636c5",
),
"3.1.68": struct(
hash = "b52d8c9150dc7d4c8e4a7a08c7a9b4006c9abe49",
sha_linux = "1f2bcb47d85eb31d90fa797b3513221adc50f0656bb37f0962a40fd0f49fcf6a",
sha_linux_arm64 = "de346e7a489aa27a442215945d154d58a0d35c608b6150b2992af0e70c04e1c5",
sha_mac = "b180711544d783121370d2c894703f99d370a864ab147730f82fd59b88fa3481",
sha_mac_arm64 = "5e9b6242b56edc8cb404cbaf6c8bd7eb1f0f168b55b580bd92652f98c5d286f4",
sha_win = "824d37e8a0845f44e4c1111e8365640eea28944f1bdbd1e9e3fea0279b68baea",
),
"3.1.67": struct(
hash = "4ae62984ea36ef0e5bfcbd0ed9b62f04bee6426a",
sha_linux = "535b64822916c80124363a5c7a5bd0cafd703f166d5155c0ad0e464e4a879091",
sha_linux_arm64 = "04c5f959702d8c1e5c000752b562271c224dee593e81144280840fed06e36cd9",
sha_mac = "692b8fdc79a47332ba9881966c72517eedf15b2da7bed37a535dfec55e6bbd9c",
sha_mac_arm64 = "ac26753f59fa9c8e92be9c91666014ad9400c91fbd37064105d1b5fcae503985",
sha_win = "8c6af8046ed47386018e42d18b53f57fad0926306dd4315d7f09dfae844b3dd3",
),
"3.1.66": struct(
hash = "243eae09cf5c20c4fde51a620b92f483255c8214",
sha_linux = "b10eac37c978b28da2f1f34cdd8a7759c0ed5e5a2d8eb4f4e6790209de33dbf7",
sha_linux_arm64 = "9c78a470f74c24fc1fde2c8d86583ed98847b6cbdd87cd0b36ff2d6b4799d950",
sha_mac = "64fd0603ccbf949967cb0dfd8f1b0b25e018abf8bfe813b53596c4fc78751027",
sha_mac_arm64 = "fd6250f25101957f56086d292263379880c4b3329819a021008b2058f92ef67b",
sha_win = "b24f65a1a1111d8ace6ba47b55e07681cd0620f7bf711d1018ee262c9501defc",
),
"3.1.65": struct(
hash = "fdcf56c75a1d27fdff6525a7e03423595485ca19",
sha_linux = "b2b7de13d37c4c5126e6c6a077e6019ebacc78ef1fb1b35b9035f03975f5ffaa",
sha_linux_arm64 = "f838af6495408f3c0a14d233171b4919b62e445c62805a22dea1875cb709a116",
sha_mac = "cc50b829a21a041979e0941cfd2047d30a06e3c4a8fd9f662ecdc12a0ab40535",
sha_mac_arm64 = "db4430db6a085d6ed5284917e632541dad3ce0a9464659fb674055247ad059d0",
sha_win = "e72ae4ec3231d9a492eadbf77ff28c13efd90307a69df04234792e67a001d05e",
),
"3.1.64": struct(
hash = "fd61bacaf40131f74987e649a135f1dd559aff60",
sha_linux = "c39de24beca60fd580f6dff0eca0e275016042a30234588b19eda82397e299f3",
sha_linux_arm64 = "61b412135630a60c5517278dc83930e06f80fa286fcc2bb6366c4f620c86e4e0",
sha_mac = "2644772be398c8095621b3d0fe9ff2d122b18b7b0963c0eb702639d94dfb8e90",
sha_mac_arm64 = "47449057c345a09aa8750be1a357c364ffea9f8a066066cb341a7a2a14bac96a",
sha_win = "eb5b59afb420915daab4c383e5f73d456cc14776dce02fdc852c46522cda5531",
),
"3.1.63": struct(
hash = "aeb36a44b29e8ca9f4c7efbb4735b69003ac2bb9",
sha_linux = "2a38ac1ea2fe3b7169879f0f666ea278f344cbb5db6e34421b9554939559109c",
sha_linux_arm64 = "f1dd5fe4cd22e89b1f5bfd216f1245f9f40f6ea76651a7f66e925a68ff6f18b8",
sha_mac = "7e192b84aecfade22817b5b38f0c69d1f795a9b990308188d39ed1d218692cd3",
sha_mac_arm64 = "751ef26a3682f5f23dfdc1c2f80cd0604a32cad61e6373c823de774722ecb9af",
sha_win = "947f8e867e781750d374d659644897f2345a133ad3d0f9ade23afcb81eeaddd3",
),
"3.1.62": struct(
hash = "d52176ac8e07c47c1773bb2776ebd91e3886c3af",
sha_linux = "fd303a2b2a85c4b3ab8aa29595d70c5fde9df71c5254d56ed19d54e9ee98e881",
sha_linux_arm64 = "233c0df77644472cd322b45b2d7cf709e6c338799b46f6ec5d5f39ca4dbe8aef",
sha_mac = "d9cfef7ba8f44bf21be715244d0d5f909f1ccc2a481a301b3c01d12d1babc049",
sha_mac_arm64 = "de5484d60c858aaa8b93ba6485924adffe734cf4f8296765c089900cf9ce0701",
sha_win = "7455680bf9c19a26fe4868111ac01401023b0f92e862d3cabadf7950b87707fd",
),
"3.1.61": struct(
hash = "28e4a74b579b4157bda5fc34f23c7d3905a8bd6c",
sha_linux = "e3e20e09219fd47a0019bb3252e17db4a00ded39b39b41634bc73f840a8ff2be",
sha_linux_arm64 = "a6b858601ca09fb7bb6ddf1a5ffb1a4130454c936ad046d45fef183037828c46",
sha_mac = "1fe69a3c42fb2857b80c8e77bfab780cb212ed7cf81ae57c0c4d235504df5269",
sha_mac_arm64 = "4ba702eea409e2d4bfabc73a68919217d3993e7585d95734e3e40a3c9ce1bd21",
sha_win = "bbafba849ff072a61dd34a8ffc0c85eed20a417854a3ca751b092e3565a92581",
),
"3.1.60": struct(
hash = "87709b5747de5b1993fe314285528bf4b65c23e1",
sha_linux = "ff5eb062165920c7cb69935d396f13e9f8ca5b13f2d7f3af2759bcacb5e877e2",
sha_linux_arm64 = "2c291942df4868d3f65b31dd964bda9736bfddcd6a7886158963f797d1b45cf5",
sha_mac = "45586fab1bad65a4293ea8939dafb5ec711ba92ae7b4d1edbaae3b4486f398b5",
sha_mac_arm64 = "8dc27416a378ad07285d380f68717cfe0db1ea6252fdb1ad012af95e4d3f342e",
sha_win = "f3147ef2d4ca48ea2624039969fd0529d0bacb63bf49ee4809c681902768b973",
),
"3.1.59": struct(
hash = "e20ee09a8a740544c4bc6de5d4ba5f81f74b74d6",
sha_linux = "ae59d1946cb92e1651cbb904fe824b3f07b39f42fa25f582116b5aaa226fa239",
sha_linux_arm64 = "25b918d6d5ee2af7ef6b28e089dc21d2dc419dca76c8079bb638cb20459eb9e5",
sha_mac = "af175bd559cb80459749e504da314af0163291f195461bf4d376d6980c4c60c3",
sha_mac_arm64 = "e17553bca5d00b30c920595e785281627e973f9e7e14c5dc0a73c355ccafe113",
sha_win = "bb54256fc3b7824cb75d5474f887d9bf8e1e63c15b351bdfbed898aa293ee4ab",
),
"3.1.58": struct(
hash = "a4d4afb626c5010f6ccda4638b8d77579a63782e",
sha_linux = "b188249ecb939dadc679aaf2d3d9afd0fe19ab942f91b7bc926b4f252915dd1a",
sha_linux_arm64 = "4aedc8ca641b40d9bd82d85b1dc3458fe1afc9a132da06a09384a5f89c058969",
sha_mac = "2092aa4bef3b9f88d3f343b042a417ba617d4e04454656d8f2e101ba53f854e8",
sha_mac_arm64 = "7a9a15845257629b7602d15bdf7633a8e10472b0fa9b3d9ee7149938aa2f2039",
sha_win = "9fe76b6189566d56f0cf9aecbd23a006778530aa87184a900f5662e39ce7272a",
),
"3.1.57": struct(
hash = "523b29e1b99a61069a2fa9f9d3cc9be1c4c53d4d",
sha_linux = "5bc444132258d4404d396f2044a4a334064ad0f1022555cad5ec72804a98ba5a",
sha_linux_arm64 = "f0022413afcc1610deff10921b3f5938bf4d01eba46ce96655f2295bdd84bd6a",
sha_mac = "31ddccb68c86f0a45332982938c49505158860ed4f7e8ccef72a48382e0e3c96",
sha_mac_arm64 = "cc5fdb65b339464f99b9c731cc63c233ec9577268886a856fa49f227ca2a56d1",
sha_win = "b53555420bb9b6e31c153e4c59427000ec692be17ae900f659a9b774d1ecebed",
),
"3.1.56": struct(
hash = "9d106be887796484c4aaffc9dc45f48a8810f336",
sha_linux = "52338cca556002251e5e7d738adb1870d14331ddf463e613af02028b64e05a82",
sha_mac = "fc5cca6a9db571ecb2974bf0d4e12f1bc6068726271464586cf7e8723004b4c6",
sha_mac_arm64 = "aed728d09d801c4a33210505874ce066269292e7809a7d6a6414146be01545f1",
sha_win = "cd5fbe94fb0bcf01badc10eace48eddbca22b34f31229e3d70c68ade7bcdd571",
),
"3.1.55": struct(
hash = "f5557e3b7166d05bddb5977e363ec48cd06e9d32",
sha_linux = "2a1cccc2f6db801219eb966d00af78a026af7822055064092387e7eba18e75ad",
sha_mac = "f1f8f4ebd086d0cd8bd54c41c6a0e86bbb26d7b8020484fef3dba67cd9e6906c",
sha_mac_arm64 = "7533b7a1beaa692a4f1e57b91c456b13e6bcc367dc9a414cb066350e8a2058c7",
sha_win = "204984cbb755f9aa09c21b49129d908f59617a60d5aebd8742097a9a2c196abb",
),
"3.1.54": struct(
hash = "aa1588cd28c250a60457b5ed342557c762f416e3",
sha_linux = "5c8db804abe1ac7ddaa99a6997683cf9fa9004de655b32b5b612d59a94bd59d0",
sha_mac = "e6d2b8c6983767c7ced83d40b87081a221f05bab08d0fa4f0c6de652547c8a9f",
sha_mac_arm64 = "83764751ee5c7b42529e1df168695d4a51a23c9c165f3f90693baa9bd9256efa",
sha_win = "c0a1c9f3e1dfc9bb2e600501aea999f53b34a16f82da387317fdcae7e9c2a79b",
),
"3.1.53": struct(
hash = "e5523d57a0e0dcf80f3b101bbc23613fcc3101aa",
sha_linux = "1025c0c738fbaedf3f8fcffee23bef71c8d04a95b30ea8a69a47231fb35d1c8b",
sha_mac = "318dc0cc51a237040bc1cb0a9e7d6c214196c8a100b50d0e298cf3ea7c365dbe",
sha_mac_arm64 = "e346ef588f7cfe1e41623de2257a11ecf8381fbd3bde63a8773b3a663411ea12",
sha_win = "af7f7175ab0b3c1e9121c713764e8ac1d970b6dbee8a84602b4a69cc5ec5940d",
),
"3.1.52": struct(
hash = "ce2097fb81953331e65543c20b437475f218127c",
sha_linux = "1c0cd572067c6348cea5e347b9ef7c5460493ca3f0d84bb991689731d0e140ef",
sha_mac = "5d9c801f9cfe81337d65969e174e0b3ef4cf2b47eb548ff4695abe3a2e69ba70",
sha_mac_arm64 = "7ce8fef7542437c85412143cb59b13b8804bb06243a106d2d342c7d9132edc8e",
sha_win = "82ed01d965f5c2765191c67da5baecd2d3ce3f82a8cf30fc47fcd56d47826cf6",
),
"3.1.51": struct(
hash = "4f416d92fbff66ce79901cfc8263768f1b25dd3e",
sha_linux = "09af08eb562cccf85770e4b8e368acb5accb1759fe3bc436b8fad80c27f90c79",
sha_mac = "b12201caf9ff2b981349edebd2d2c022ff000c74241ef96305b831abbd4f9450",
sha_mac_arm64 = "65fbee020cf965f9216607bad56215795529cbe8cef318fadcb33141dd6b5e82",
sha_win = "65c2d005a6be80723fa795ea724d4db9960601cf7d59d880f2882ecd45c8ad2b",
),
"3.1.50": struct(
hash = "2ce4170cef5ce46f337f9fd907b614a8db772c7d",
sha_linux = "8822050b999286694cd4ffc7d959a8ea3137e3a910121d78b5377439ede9b598",
sha_mac = "39ce2f689be348b558df9c2c988b03472d43f8ac0827624397f7c0bb56a1e893",
sha_mac_arm64 = "5a9fa8de121db400bb46e716d861283b938ad87257d7c48f99dd5557100bd3ea",
sha_win = "29096f5596d93dbf620a9547fd1ecec8f54f3f52d49b13f09959d852310220db",
),
"3.1.49": struct(
hash = "bd0a2e230466dadb36efc71aa7271f17c6c35420",
sha_linux = "18f452f8bdcd13e0d3a65c569180d1b83579775eadb8069cb32bca1f2e751751",
sha_mac = "c5275eab15e42abb3a42bbe1cfe38ee1b852febc78f65f5605b8972a7bee672f",
sha_mac_arm64 = "10a722e2c7dcc97236f70f2d68b23a7975800ebf27ec4fdf76deddf483b1c6d6",
sha_win = "4361fc18faaf70a2dc342c219b13c39a8196e9a48e6897d08c7b0dca6ba6525d",
),
"3.1.48": struct(
hash = "694434b6d47c5f6eff2c8fbd9eeb016c977ae9dc",
sha_linux = "689fffcb60f93a60a7bb52cc205ead43ab31f252753cfef39ae2074f6a442634",
sha_mac = "8ac2a3f32b4cba0d84ca5a1fe1db883dbfc2731432833ab5a7e6967c5f4ab7dc",
sha_mac_arm64 = "10dd40f94fe5c5f8c4efc838d1623cafe98c629d4c7872ad8c15cd7b0836f281",
sha_win = "9276435ea7c402c18572a4301d6a26426eac73414b0ed5cb3e721044a50f651d",
),
"3.1.47": struct(
hash = "39ade279e75e6d17dd6b7eb9fba2006e61fe966b",
sha_linux = "bdc50abe5c7d4b4f14acea4ec36b270e86770cea2da4b0c393b80a692dc7eb7a",
sha_mac = "6a3a116707037d75a967a7d971894d8ace74a2a230aa50ba55e88e7cd7b94953",
sha_mac_arm64 = "b13d228e6a1c89c13a1500fff07dcf093fb01fa621d458496d4a6d7f05cfd600",
sha_win = "66a6c4f0cda4ace14a86d3e59d20685d35211854d21670632b0566ac73638245",
),
"3.1.46": struct(
hash = "21644188d5c473e92f1d7df2f9f60c758a78a486",
sha_linux = "75cbf14629b06e417b597d3f897ad7d881c53762380aca2f0dd85f1b15891511",
sha_mac = "06f45608381203d501141be632cab960aa105626c3a0f7a48657b79728103880",
sha_mac_arm64 = "c2a85b509a91663b390f77d51fba775421d42456211466fd3757f9dede7af9e4",
sha_win = "1ed3a3f36dee5d373ebea213fc723b3eeb7d6ba4c43da6a951ea0d76f265f234",
),
"3.1.45": struct(
hash = "2b7c5fb8ffeac3315deb1f82ab7bf8da544f84a1",
sha_linux = "1c0576765f8b34603eead6f2bd4bc77bf68ea2f0a39ed4c144514103e85bc7d9",
sha_mac = "87f63ebb2f9807435016b238bbf46ccb94c919ec0786b46463cd788634391b0c",
sha_mac_arm64 = "29e698772c0e00c21ce120dd1db1586f5c65507168babff148c2e628add6e72a",
sha_win = "891d49f8828f715ef621d55fe202de4929bbdc89b69101fd33963571458a7f47",
),
"3.1.44": struct(
hash = "b90507fcf011da61bacfca613569d882f7749552",
sha_linux = "5ffa2bab560a9cda6db6ee041a635d10e1ef26c8fc63675d682917b8d3d53263",
sha_mac = "291b2653f7576f8354f0267047e47a5ddef11223c89d5be399d04618f13b3832",
sha_mac_arm64 = "ad1625821b49ccbbe733596223fdf99fd786470d679f2c9dfabd4a1a7b929282",
sha_win = "8b61f60ef169b1c20207361067c40192c83b96cdbdb2f4cff21dfb20b9ee528d",
),
"3.1.43": struct(
hash = "bf3c159888633d232c0507f4c76cc156a43c32dc",
sha_linux = "147a67a3454783b8c351780ec0111329d1e6fbb1d2fcdfe1c035e1c0997e0701",
sha_mac = "d84896c6d1ba0fbd9a5e5c5830b3ac4a02da5e683e9d8c7172f4c3ffdfaa0392",
sha_mac_arm64 = "d684f0bfc655f61e76cec29fdaad1668f3d21a229fdd908267f400691468328d",
sha_win = "a335f5f5b070cf354f1ca8e0afb23c06ae5f9ffb2c501124da7fcaea09a7db6d",
),
"3.1.42": struct(
hash = "9d73bf4bd5b5c9ce6e51be0ed5ce6599fcb28e9e",
sha_linux = "aaa076e64dd511b0d874c348f8dab80a2f9ade0887ba74845fd02c40bbf9e68f",
sha_mac = "4715002394c5d444243c77ca231883eb999cf3313c4869cf0ae288d911f80f89",
sha_mac_arm64 = "84dede714edd81362ed2a2f79b91b1bd9cd544f219f937582e616d73bf0ea7f9",
sha_win = "4c704f4a4927aa537c2815a72915b7591c163ae8f0dbaedc167e810dd2a4a83d",
),
"3.1.41": struct(
hash = "eb71265ef0ab905620015adbfedacf88c5dbf021",
sha_linux = "493ec8bd3f3ea3d6d616de01d6dac9c2af696978c6c44d453757ab2f8a666656",
sha_mac = "bb088e7b8f83b6bae02a0992eae61351e4e97bd033f8c8937cdaea0cb961ac9e",
sha_mac_arm64 = "aaba2de03a6dcc0db90e61e5e405a52aa47124e5ef21953d052ca015ce5ee773",
sha_win = "c7afbf2dfb6040990bd40bd72c726ada36e3e6f1985c4b62db7296465dd0778f",
),
"3.1.40": struct(
hash = "c3122846bb040798aab975f61008c37eb19476de",
sha_linux = "5501e750c92f5a54b27ee101f6816e7416f154cb4181b73fd0be3faae947016c",
sha_mac = "052d6236ce49eaf3aa02b3c4d367b5ed4fb78209c1f1e64d48beb79e9c0b7131",
sha_mac_arm64 = "c8af68f904367938bac255f5e64ed271021b289bb135dc77ab3b58b87e1ea5b2",
sha_win = "3ec21ca18b56f7d3953da2e0d468154fcaaf30b5ac663d9ad00c41540923a099",
),
"3.1.39": struct(
hash = "1b56b171b627af0841cf8d4d8c0160c6cb6d855f",
sha_linux = "7ec6e15a2da2701243f89af7744403ee011211e59e4f0a6fd8ced544e72e917d",
sha_mac = "dad7d270207aaffb8b8ef584cf0579bbad144879ea6f00ec9a8080adf22130dc",
sha_mac_arm64 = "c5e474ca661348d0339c785e25ad81845d49dab19d5e3e84eef2393e623e0bac",
sha_win = "a04f898b9d54dd2dc95fb697a92a1b65d07102a4cc36a02dea44c448fad83472",
),
"3.1.38": struct(
hash = "03ecb526947f6a3702a0d083083799fe410d3893",
sha_linux = "e2812859fa32b6019f688dd66f2fa48efbfb5594da9a43b876fd4fe4ca474c20",
sha_mac = "a88c4b9eeb5dedb0d9af3b6b84bd45c486de567fbeba1675edb2d7d196e0013b",
sha_mac_arm64 = "0e5d1519ccc1163c13ee93d85f70ef6a520464f59ca3795c47cc7c44ab0f5f49",
sha_win = "bcdea031961a4f3c23008d53e083770d19751dd2a2aa71cacdea8462d09548be",
),
"3.1.37": struct(
hash = "7c905cfc1ca6699f6ccb288ae174902cfbdcf0a2",
sha_linux = "9ff44ef69d3f389adcacbb9b95331da72cffdf6e9431c8beb6ebf7aedb77499c",
sha_mac = "accfe90322b6449933c3d8e1346024e2e2e3bef7b101942294f995b2c8e1b60f",
sha_mac_arm64 = "a0461e234c08bd7ddd7a86b49b52ccc853ebe4ce0fb5b4314e9de0193c32514a",
sha_win = "e026ea2570e747d0640829c62abddcdc14a4acffe31180110971750b80042d7a",
),
"3.1.36": struct(
hash = "adedc0750c4a89b65bee866edab24298cb8d6677",
sha_linux = "55d3cc557a83716f7a7fe121a07dbd59ed4b5d425051e22c902570e3e0ea6c4c",
sha_mac = "6643fcef0f928cd730b894f0c2c3343eeef870576e43e56428a7a8247c7bc921",
sha_mac_arm64 = "2e8d9103cd0ba7a2b143927196a630b091b981006c908d7d36995a210a04d73b",
sha_win = "69a197f6fc153d9f98ced539564683cb13ff0ef144d3d4fbddf643e33b5f860c",
),
"3.1.35": struct(
hash = "671550b5bdceee7bdb21493714f9a815aa5149a9",
sha_linux = "9d4b5dcb719d39e59b646ecf7c409db20c5cb6b9575f5362ffb49a9e66290819",
sha_mac = "01ea06c1f4a6c980bfdc812f9599a8ef424a975c89d5c288c9e6f2fa5e5ef5ad",
sha_mac_arm64 = "f6480ee21c80fe062e0f9d8555f8bdef621601634b9bd1e5ad07b90777ff5e4b",
sha_win = "cd26088365433ce1263a11898406c2f9284e55c2c7f23b26170c2a172c52f0b1",
),
"3.1.34": struct(
hash = "2fdd6b9e5b67d5b62f84d0501a876513ff118ef1",
sha_linux = "dd3713f077072dcdb811f934d6685187daa47c424039e31cba83633c8d1681b1",
sha_mac = "3824609ee9b7c9919e29b19775d495a16778adb981867901f4bc503fe2f65d7d",
sha_mac_arm64 = "72728637171df46e7cd22f90537dd6faf1d4809ed1befc504ff96768c82f0e0f",
sha_win = "7538d1a1e0d586bd0723f595557551b05d724a5803132949a6fafb8b056af995",
),
"3.1.33": struct(
hash = "49b960bd03b3a9da478a08541ce6eafe792a58a8",
sha_linux = "eab02b3f4b7c076974452ba602f908a36adf597afa15b16095b441f191ede1bb",
sha_linux_arm64 = "5e15af6affcf37c9ce6c304b4aeccb87a2758e1ef029dbc996f9d77d7444378e",
sha_mac = "b8dad3cddb19c1daf9dae99020bd17b903ae9649cfc58e433ea4951e758804de",
sha_mac_arm64 = "fbf03d06c7503f091191e440b8ea577d65b3261167cdb47359d053f12888974b",
sha_win = "031f951668eaeea39bd9363abb3f514efc3401506374984fa9b1d7ba3130a62f",
),
"3.1.32": struct(
hash = "29ad1037cd6b99e5d8a1bd75bc188c1e9a6fda8d",
sha_linux = "25fa252e9fc674d1bcef35b3a10dd85024aa93c843b8067f8d917e5151968ffc",
sha_mac = "7881714e7738eb183b5a421bb2b907e96359e791ad0a622be6e7f5690a16b9d6",
sha_mac_arm64 = "04eede7352aca4b6fc1c111a8b31d00e8aa40547c3cd062ff9be4ffe1ed98d95",
sha_win = "22c3429eb1e6051bda46e9c02c14eca1ae3749ba8c411fbd5a3b51e3b9623161",
),
"3.1.31": struct(
hash = "1eec24930cb2f56f6d9cd10ffcb031e27ea4157a",
sha_linux = "5952523c0c58cfc7c8839c1d3fe42ff34af5d8721231306ee432063dfacf96ca",
sha_mac = "13482cf3cb29f423f2037b9dc2b9e4ff72d0a49fcd471bbaa9b76d9f86f31d82",
sha_mac_arm64 = "654a35af16be5eeb2082e68fb36190fe76de28fa2da75ac0d2197482a203f39a",
sha_win = "493c29f5a505ccd9687036ee4c580d190b1c32b286be0e751a78e68997cec8b2",
),
"3.1.30": struct(
hash = "dc1fdcfd3f5b9d29cb1ebdf15e6e845bef9b0cc1",
sha_linux = "151d7afdfb728e1e55ed1d100e4d3fbd20925fd65f3c3b9e093061a2c89dcac7",
sha_mac = "f0cdbc676c58bce7a65572418fb1521665ed522d7d05ae90f0764b77801982bb",
sha_mac_arm64 = "fca4eaf8ff528bb9308e5e8d0cf2709713b99fc19d55c6578a6c8f3e66182f55",
sha_win = "3001101622d98b2af3e5209154f60bbe341d32f6178307c6c723e84b5fe08bdc",
),
"3.1.29": struct(
hash = "d949f1b99a477d4b0b54d95413df3688afa69d0a",
sha_linux = "d3f274446924c27082603170fab60ba78a2fb51360e5578fab4d9b5adab0fa9a",
sha_mac = "ed224c296efd22437f298f0fe0852613b0b1d48810b1b6d87b6b7e6beb589fe2",
sha_mac_arm64 = "af9bb86a7996bbbb36820e93dbc7f537ac23070e8730439b1e49792c4fc008e9",
sha_win = "6203f80273565a2ee6734bd33ad7bc6940ef709cbd593e70d6489e96c02ced25",
),
"3.1.28": struct(
hash = "30b9e46ddcea66e91530559379089002d8b692cf",
sha_linux = "c23426d8b6d94cea702542c39e3bcef9439425dd4bd03bcc172e291dbbe5ed0d",
sha_mac = "4cfb918fe3233a2b31e5734e85b2a365e634f4e8a83c4390e8595cb98ae6bd8c",
sha_mac_arm64 = "a47f1f09bc7bbd4952cf54445d4fbfae53623ecbfecee0506a637665c7b4ea4c",
sha_win = "4388d230871d5b1e15c2fd0db21a792ab2836f23d860475fe183c03c5db75c8c",
),
"3.1.27": struct(
hash = "48ce0b44015d0182fc8c27aa9fbc0a4474b55982",
sha_linux = "4dc872260c8f42a8e20c8612b2255adbd466fec54cfbe37b46eca4eb34a2b03f",
sha_mac = "40c3326147b162b8357efdc72476faaa6686338cff3e176680e361c2511453e8",
sha_mac_arm64 = "7b87610de966b84353c8c1ded8e12c034b5b913c093210ebd3b26320e2ac2990",
sha_win = "39bbfcb09ba7feb214518a67b1ff6d38bae065b416b4483834e4fdaef2316f8c",
),
"3.1.26": struct(
hash = "4f68bb2a505c727bcf58195cf4da20592a6e92c8",
sha_linux = "82d24d5619c814ae99ef7243de428600c02e96dfc49c36e44753b1fce626766e",
sha_mac = "7b645979d8901f3153507561bbec10ecfeb197dca5914228715a74b760cf7eec",
sha_mac_arm64 = "d9c647fd70588bae71303a6c923df8a44ffe63e168b375d35bf6ceda21258fa1",
sha_win = "1ad49d69634ce2d1fe04614c18060a903c102e1dbc9dfdef3a03e52c189b4c92",
),
"3.1.25": struct(
hash = "ff6babb041d0f31575cc16d15ef82c6222ca99b8",
sha_linux = "c5ae6b4525845ea36bde89cbf4e1d03de87a2658862d76c6a53bbf8de7c67ff5",
sha_mac = "d2581aaa7207f0d9dd9949247f0706bda8561e805d67aec166ed4f3b39c3a3fa",
sha_mac_arm64 = "dbcb76036a09248c2a839872c27b87b6d4ccc81e57add4e2a6f5e560a2c530fc",
sha_win = "3a86d98d934456a74ed06388c1487d95a0d5a3f31777636453f22e61d57d7fb1",
),
"3.1.24": struct(
hash = "54217a0950bb1dafe8808cc6207d378e323f9d74",
sha_linux = "20e8e5bd745e3ad69c03bb877091d2fbb0c7db1eab309de8f185e9821aea40f4",
sha_mac = "cfb897a980dd51fceb02ff143ad0fd8e5d299db640c5646d1547d522194545f2",
sha_mac_arm64 = "e87b0727343051312f82a6653cad4682a518dd9cb6575844c0cd6505d520fab6",
sha_win = "a0ea07f9014a912f13176fdbbc1ee7ab08104d45e7ca7e1c237505579b63d530",
),
"3.1.23": struct(
hash = "bfd5e63a44ba4c8568cd8ac87c27b35e40732bf4",
sha_linux = "3b8d9e163d6afc8569deca0ba1d4042f80da7a31e23cee006c3faa9cbf2fbc31",
sha_mac = "fd1c79475e47fd2f06ee9ba189e68309e443c2d3c56fd28163d1cd6f77047075",
sha_mac_arm64 = "66e57ee0962ec31056674b5681f91bd62f85b0bf1238a8d5b160660c0bf47292",
sha_win = "7c30b281abcc0ffb9e7575197f1ac0598a94c6cec36547b81554a97b792a9e75",
),
"3.1.22": struct(
hash = "990cee04a21caafc75955d736fb45791a7f2aeee",
sha_linux = "a310ed9f16c97a91c72564ca5f85c412cb99429d8001825663fda1b28c00346e",
sha_mac = "b19afaf414178781c4c91ee711ec4d9063b9736719e45ca2e8b45c2258df16be",
sha_mac_arm64 = "7c8212abf77f0307b6ff848bf9c6212f870506df6d074349f76401f30f9fcefe",
sha_win = "2c0cfe267d47f390d7e35a83545b1d5043e4a7fb77b838ee19b0fce65035f55d",
),
"3.1.21": struct(
hash = "a16a8bca2466eb144f7c93fa899c0272c8815dc3",
sha_linux = "7045ddb3b37a2cc63cb1cf976019a6a3b7f8dbdc71254db0eee5b0452f94e9e7",
sha_linux_arm64 = "2852c8b108ec748d52d31dab3f4854bc6022df008019daff1c7e31ac00363b3f",
sha_mac = "2a8d3d3ad721fec81ca1a4a581e4183b6e732e9905beb874531851846a05a367",
sha_mac_arm64 = "cf788a7bdc38bb40d01f94b2d46acafb0e2f02d8ee3b3d69541c114e467ee37f",
sha_win = "81518bba13f41717ffe6990b6d4a5af635d0c9d0f71a8d3bc0980cd0bc8f5f66",
),
"3.1.20": struct(
hash = "d92c8639f406582d70a5dde27855f74ecf602f45",
sha_linux = "3b606d133489aac8cdfff4f99ff14a35563b1fafe658aa23f83694f77ed9467a",
sha_mac = "cc9ea1696bdb3f28778bac1cf4587a34e90830e1c64976cd205fd73e77566cd8",
sha_mac_arm64 = "b976410bf4fa1af9896be1c736634bfb56b2ef0f3386cd3cf39616ce47445cc0",
sha_win = "1e6806ee240ab838ae7eee618c57efc793195c62e4d167136507efcfa66d6c6d",
),
"3.1.19": struct(
hash = "4c3772879a04140298c3abde90962d5567b5e2fc",
sha_linux = "18d4a5bb93371fe1d4586db9804f673fff0c510d98713ec25b6bda1a8457230d",
sha_mac = "6adb721340cb93b7a3efafbfd1d283842a39bb6f1390630b0806c8af26b66840",
sha_mac_arm64 = "429c9e3a79d32380f3dfee52b1001963edaa2e3035fce9f52ca87b08e1a2f26e",
sha_win = "0368eefb28f42799ce897020d0d10a4a27e1b69b650575d94deb268e402a3632",
),
"3.1.18": struct(
hash = "49d45744895c7d7e28acd94a385d7ee361653b4a",
sha_linux = "6ef373c4ff3cdf33d7beecea47d4eaee7795693f8ca9469f33785cb9c54f40bb",
sha_mac = "ad0e645abdb6d3f0b6c6ad0ee70761010a712949c9b0b193aefc78ecbc3f1710",
sha_mac_arm64 = "68d0a1ec3e83e0415e24133c59e64206b83686712434c8c2e6792547cf654b1c",
sha_win = "96829a228f7c08fabd37833f7361614785aa39aa865beef06890ee8ede58dc66",
),
"3.1.17": struct(
hash = "d27fef2070c86a218965da8b8b5df8b4425aa3bb",
sha_linux = "562b3ba75ce77a917317bc697febb38194e85cfe07f4fec308c3b29c621f8f13",
sha_mac = "8a2bee8ea434049e40663a6d78d1c3584e5c32196fd85d6a10f3192d2e3aba4e",
sha_mac_arm64 = "5f60d3f351d06d862e853a294642d24243d6cb197e34c2f2602d80555c2eb014",
sha_win = "90b2ade825e07bb05831090dd64b5f5b01a4169a84a3ddec85fcd60be3b246a5",
),
"3.1.16": struct(
hash = "fb1baf00423818052359cf9126e94bc71c39feb5",
sha_linux = "bdce7e58833069a98d7e0b4fd9d6fea7394770ec10339cc95ed9fe52ba39f3a7",
sha_mac = "d05f4e997324d7f7d8561436677687d296893d6414f53930184fab272e4c6158",
sha_mac_arm64 = "36ab8da30698558a567c5c1c0e130b59f08cf4b29c9c5242f4ea60b449ecff17",
sha_win = "e1324c22c914ab7f62fe6d38a550de25b2232a723c80393fa8884a260c07766d",
),
"3.1.15": struct(
hash = "568a46a9fb7e1f1686a6f7216b3dc976f28d2a79",
sha_linux = "737db513047d12e95a12f4fbe05314f3af79ac955d1ea43fc83626337e307edc",
sha_mac = "f8993371a1ff713203023f0283054a31df5342ca287debc4e16d04d97e069aee",
sha_mac_arm64 = "c61a8efa8543a6c44e394a0685e7d4facb4c7dbb210c4c32d311b0002c4dec99",
sha_win = "235592467a0be6a537e03fb587aaee230aa2c889f2785cb9754eb44bfbf747ed",
),
"3.1.14": struct(
hash = "ade9d780ff17c88d81aa13860361743e3c1e1396",
sha_linux = "e2c43068fb1985592db42183a13f85bbd9518b3747746e0003d70c7d770a0b2f",
sha_mac = "567e9548f3fa7c1aa717821af4aaa7849a0f7217cb55eb7f66a06c898808fd96",
sha_mac_arm64 = "df8319aba8bc0d0c40ebec3c8f45e507c2a51a57df24826d4cab6f6cd75017ac",
sha_win = "6bfec6bf6a01e483a57e91f7223340a425f6ff711cbd32a08ed78002810d7882",
),
"3.1.13": struct(
hash = "bc44364b561cfde15c243a54e3b96ea12d7ea284",
sha_linux = "290f04300465cbb7c8e920f9986128b3f287b14b93627b0c6d069d534860c1b4",
sha_mac = "72b209a3e5800be155cf5b29bdaceb18aefceeba68f35ac719a483bd27d85705",
sha_mac_arm64 = "2bf90ed73454f58b810e09a776a34ddf7395f9ee45580f3a8fea53f74ba7ede2",
sha_win = "07fd730289c26f72ae4037fd25f608f6b9d36f1950677229b6c7d392957db3d2",
),
"3.1.12": struct(
hash = "a8c3b314d61e2bb98581d522f858132b2fc21488",
sha_linux = "ac8ae46b2fe2fbef07077cdeefc8288d2a73e3189958f32b36f2d17d868275d0",
sha_mac = "c33afddd7c8f7a5293cb427ef26eb65f51fa3121d0577568824174227aa37ef3",
sha_mac_arm64 = "253feff779385d2499764cd988175446e21db8cbb9952746e96969c2a763924c",
sha_win = "04015fb6a1b4ad4d7c16587a7eeaabf19c5b35097f3e28efa029c0c67547067c",
),
"3.1.11": struct(
hash = "8c3a799341c01148692c52fda73bbba5e89c5727",
sha_linux = "ba52cfd784362530866c9d554ddc62cfa3f0690f44007c0b3b36e189bb579d5e",
sha_mac = "c46548425e0bf4acd3c4275aff6a463c90ff1faf283ae7f5237d8c17bf84d779",
sha_mac_arm64 = "c5ae40c468955ed02b86c54061278d2b4075b1230612bae5910f836aa9c200b3",
sha_win = "74481a1998236fd9d296f367584934d5ab8bbf174446ceb647f714031671de98",
),
"3.1.10": struct(
hash = "8bd05c7221b4ce34d4bedec40b672d94e681a765",
sha_linux = "f5a937383b5c9fa15071a31d679a2ddd5c03bc8952cbbd5bfbf7c0a86c2dae5a",
sha_mac = "e73491f2787cbda75e718c3947916b57259164eddd9b2db16b9c876d3deb16a9",
sha_mac_arm64 = "d7485ce3b13f183484af5163d7bec79ece9a1fdc5845f8152e36270e6f90cfd9",
sha_win = "dd75061405bc902ecd983bd3e4cfd6931a866e1c9de602c4458280cbeb271720",
),
"3.1.9": struct(
hash = "edabe25af34554d19c046078f853999b074259ca",
sha_linux = "89fa75c981e47ad19942b8236d2604b2666dfd516a08626aaa1bfb0d657c87bf",
sha_mac = "6c7f59dd84d1484f1dfa041d71cc79fc97db8d15834b6220e5868bd9bd373a24",
sha_mac_arm64 = "13a258de0daaa3c09a53e21a67414cbf5fa5706f955767fe791a059ed5eb90bf",
sha_win = "0857b03919b948558f9a57d15cf2b220852cc070359c386da0e6e4831c7ac5e0",
),
"3.1.8": struct(
hash = "8c9e0a76ebed2c5e88a718d43e8b62452def3771",
sha_linux = "6b170777eb523e62972ad458e533b1853cd0c4e02f6f2cf4cd68e109499ccd9b",
sha_mac = "ede01fe160c3b8443f53f94dbad530e0e7e8197a1b874c7bb9038b187279080c",
sha_mac_arm64 = "9ecc8678f948875e7f64defeababc0320f98e103547f395c390c01d76e5a1d64",
sha_win = "039d27d4ae43b50d0858dbc4dcf412f572351e98e1056d7fdcdf2aab1740557e",
),
"3.1.7": struct(
hash = "d0e637fe48197587d981f79e8114757731d0c2a9",
sha_linux = "d941738a3c755d6d530bab66d38325515b9dbaa588d2db2b8a63b2a8a1961e52",
sha_mac = "597aacdb25d422094427014d3a97e8b91ec80df2255a66e0986414bf71aaf37d",
sha_mac_arm64 = "a0b2db0269c55e854d1007a59f95b8e5f14d32309e76f985ea9afe481b2bd6e6",
sha_win = "cb44339db27b694862efb37539d41eaff7253c93c0882cf7d9aaf4afeaa82912",
),
"3.1.6": struct(
hash = "8791c3e936141cbc2dd72d76290ea9b2726d39f3",
sha_linux = "f43dfe707dff18fa7a08dbfe2fa3f8d46afb65ccba9bbe554465d83d5d80e388",
sha_mac = "13a01080ff042560b9a9b1b2c9fc5f8c154710bc41db8bbd907a9e53c286afd0",
sha_mac_arm64 = "7ae97e85593b037c345b539e7f8b8952b82c001be982219060c83f0834bb6827",
sha_win = "e7005c0a5439e532cb64f34ba90405792288a1ed8845cdafcedd3de5af6fd3f2",
),
"3.1.5": struct(
hash = "2dee36c7163f7394ab9341854ef5281501dd97d0",
sha_linux = "6641703b7da1805aa5a8488d231ae7fedfe27f1a5a33e7d05a2ee5902ab84180",
sha_mac = "9dba57f09702a7eed53f3f71cdd8a4ed1202ca5a5f4449249c2d98a285b26f75",
sha_mac_arm64 = "0093b4d47c9eb9c8bab5b3048c68855255b5e5a8bfd78f4183424009489327e6",
sha_win = "849edc42b494f670df4763dbc8ebbb5464ac28787482668c3f6e27588a77cb3a",
),
"3.1.4": struct(
hash = "39e60dda6945cfcd6487725bdb1361ae7975173f",
sha_linux = "4a57c0d60eeb4e021de61c8497f0b595a0a9db0235f1640a528de752409f4fcf",
sha_mac = "f28a9a4f42f67de1d5c4d8a288f29e5082bbf4fcb172e0c6e248695163372478",
sha_mac_arm64 = "be35043edad7a7022f7b174e8efc90e2db54ba4fd71288760bea4db082835f56",
sha_win = "d97ff247bdfc7e839610cbcd87d30a65018f964d183d5b852b6021d43c5d199a",
),
"3.1.3": struct(
hash = "2ddc66235392b37e5b33477fd86cbe01a14b8aa2",
sha_linux = "8b840819eb88f9178c11bad25859ce448a0559e485823a863a6add21380636ca",
sha_mac = "0cb3f9bfbcc744233eae9d20036155738409405eacf8a3d4f9beefc5919d809a",
sha_mac_arm64 = "ee2772f380419df17d154e00388a16bcddc78c7af035c16a2ee534d6ecf099aa",
sha_win = "c0549e1dbaa581ae66934c38beebd4250cd450cc2778e9a602cd9431bc81bc37",
),
"3.1.2": struct(
hash = "6626e25d6d866cf283147ca68d54ac9326fe399f",
sha_linux = "4fb53364a2ba1de8978445aa26b2204bfd215b41da5d7df04f231040b197010a",
sha_mac = "a8e347accb1ff402d96a128912ac8cda1731611c9f89095fee0ad39a6a18bbc3",
sha_mac_arm64 = "4374f5c852d0403b0a3b0e9dc8a3856a340e9d82ecf0f20aa8b36c6179d31fc8",
sha_win = "e96f6ab8252fefa42f461676311d4c4e2d96fdc2e876ece07d9d7a49ef31aef0",
),
"3.1.1": struct(
hash = "5ee64de9809592480da01372880ea11debd6c740",
sha_linux = "ba94c5ecabacbedc89665a742c37c4c132c739aea46aa66fd744cb72b260c870",
sha_mac = "8b5f8cec55af0e6816a08d8d1e8b873f96d0e0504fdd6e8deb2fc024957d1aa7",
sha_win = "6cbe976aff6155cf1c48707f0520b5aa6a7770860e9b1964bfca3e5923ce7225",
),
"3.1.0": struct(
hash = "562e3a0af169e6dea5e6dbecac2255d67c2c8b94",
sha_linux = "0714344e32e244e6d44d9ea75937633ab1338e417a232fb66d6dcd7d4b704e8c",
sha_mac = "f6c1cad729ed799e1df09eacf5aa80cce9861d69ec6d9581c17e4ba8d9b064ce",
sha_win = "756c41cbcab4ae6077cca30834d16151392b8c19ab186c13d42d7d05d6d727cc",
),
"3.0.1": struct(
hash = "91b7a67a486d2430e73423a38d950d8a550826ed",
sha_linux = "25fd430268596229c4ac38e188d7c2b31f75c2ec8172b1351d763e37c830c6af",
sha_mac = "52ec2204115b727cc4de38b5eeae147eead12b299b98e5a88653d12958cae4d4",
sha_win = "0e072736b471c9a07cdf534ba4da46b3b6545b63c8a6cbb0ef7d544251e15092",
),
"3.0.0": struct(
hash = "7fbe748230f2ce99abbf975d9ad997699efb3153",
sha_linux = "10646b64daea15354f14f89f7e79937f420b77f31bda7c4b174de2474835950f",
sha_mac = "ebb17bc91c6a72ca06d17337d27aa1a2be4c9af4c68644c221712123f663b8ab",
sha_win = "0d4f2ff5d88a8eef5ed769ee4ffc5d5574143911d2e0079325cdc5206c9e9bb1",
),
"2.0.34": struct(
hash = "d8fc1b92dbc0ce8d740a7adb937c5137ba4755e0",
sha_linux = "a6304e3a52c172eb178c6f9817d74aa3ee411e97ef00bcae0884377799c49954",
sha_mac = "975ae11000100362baf19d161fec04d82e1f7c9fb7d43c43864ddd65a47f1780",
sha_win = "8167a44bb895a0fdc153836bed91bf387be57f2dc1b8f103bf70e68923b61d39",
),
"2.0.33": struct(
hash = "cef8850d57278271766fb2163eebcb07354018e7",
sha_linux = "958a0f4b1533e877c1a5ed3c13cb8baabc80e791d45858c2c94ac62325ada953",
sha_mac = "8ecb248653d44c3748e23c089cb9f0e3d4eee7cda13fdec27ec0113b896e34c4",
sha_mac_arm64 = "1ec6f3d7afa5e10f3af996e26d9c3a66f02ae49e48e512a4b5d6b7165c61290f",
sha_win = "6b6b2831f8b338488f787b4a8c34700277bf3988358dbb54426f017155603ac9",
),
"2.0.32": struct(
hash = "74646397e3c5010824ad60d1de86c6bcbe334dff",
sha_linux = "236b3954e71d3bb30d347c655b9f47f2a091aa2e61046e1912c8da90152f4ca1",
sha_mac = "6a03267574534948e3b041e5d3e31bd757751ef17912eb6e90b96a47da03afb6",
sha_win = "2f8fbf0db097d67d0c364946faceec27c569c5c2d7b22068eef8db55645aba36",
),
"2.0.31": struct(
hash = "597724ca3f6cd6e84bea73f1f519a3953b5c273d",
sha_linux = "ef70c7733aa0df41cb4c812f5a89bf6b2ed13ca8aa252872396c0be271156d9e",
sha_mac = "77e57c3e98758488ef676f8f58a85faa0bd65a1d326a91771ad83d7cb0e373ca",
sha_win = "541605b740afccd08a39f5ae815978f699f350d621a1b2dfba0763970b56aee4",
),
"2.0.30": struct(
hash = "c69458f1bbf3ef5b8da4e934de210659cc9bca04",
sha_linux = "ee1c8270096a728966ae38af548047d1f64c18318e06ba75952e657136f02537",
sha_mac = "574a5819308eba6c8be6a780e26dff415a0e7178d3f44162dd8dca87eb40d4a7",
sha_win = "242d244f4f5f5af08e6e6ac9c143aebf1b7bb2a23fd2992350731e59acfee07c",
),
"2.0.29": struct(
hash = "c2369dc425725fff86ba90a9007a4603ddf7941b",
sha_linux = "7df4a8f3e25820becadfa7f1fe0d78e764102ec3ee50c474ca1634ed90d48890",
sha_mac = "d998521ba95882a27792f0113ea2c972fbb891c240649f4c994f0260c0e1a213",
sha_win = "c64aa3f2af6503f6711b2322986a45784e00d7c7fe13ec3f5c4f740472d065a0",
),
"2.0.28": struct(
hash = "866055ea639d64dfedc625d28ec981e47ce37168",
sha_linux = "7dca7704eb14e367bb67e9abc9eaf59e75f59b74e32422e04556de10897a9a86",
sha_mac = "370f76493e3805e2538290b698a381f04b6d78a77771e48fc0099cf89dad985f",
sha_win = "e913c50ea5f196d36971f7cf5b1cf9a9ca27ce0818aba56be3a66e31e95c0e5b",
),
"2.0.27": struct(
hash = "1ac46e3b84955231ab4a4f4cbe0c7ac28c86b8cc",
sha_linux = "3e124e278de168cf22e03b93b2f14a65a86777e428cdaab7e5e1c2289eb41605",
sha_mac = "388262b9e1042ef9a3a1945d5a23dcd634c8042a225e8fdf80bcc2c1cb7e05cc",
sha_win = "762276a332432e717afb988310d21ae10e36facc1e05bfd77042a364fb43cc3c",
),
"2.0.26": struct(
hash = "823d37b15d1ab61bc9ac0665ceef6951d3703842",
sha_linux = "996e16d368a99dd4dd12126acbcb8bea9a607b5257cc7b747c4afc2f036fd8cf",
sha_mac = "8b2d7e84cc449531e88034beb31da89a0b61ccaeaa1584ffb6da7842c6348fdc",
sha_win = "095e772764d7f8c0f8228bda4b8500ae43aac2303567da5cdc9f8623f70a5743",
),
"2.0.25": struct(
hash = "f6f001b08fbb67935379cf13d17fd9bfdbaff791",
sha_linux = "06d8e2f3d4f4b35a57de9c15e62a559c941cfba1dd7ec02353d815904d912c3b",
sha_mac = "6541bf3a648aae7df84de424ff392dd1513ab5450203c84f72a6a03e321a301b",
sha_win = "267fbfa809ec0eb911c1962b1b9768675cb82228e694a5f9ef570232ee71db76",
),
"2.0.24": struct(
hash = "6ab7fc5622a67e6111d07c4ba61c8d3c8fc33ed2",
sha_linux = "e5daa0e87f3afd2197e7975297cb0cd4c245edccb964ca5f1f32ee7d985bf440",
sha_mac = "e4b7f2a7b71d6ac4610ee7b14743570e0dfba3668dc6b4f984cbe7a135888527",
sha_win = "db2aad422a3ca2295be6101b0151eeee55dcea29ba1f31b4594c02ba46591cbe",
),
"2.0.23": struct(
hash = "77b065ace39e6ab21446e13f92897f956c80476a",
sha_linux = "7713a9a5572d839aea9eaa84a7c4779d11c6c8818ee64a0f443b62081fae6d47",
sha_mac = "b793087462d581e25c8c267fca9d30519619e3272480862a56cc316a32c7afab",
sha_win = "b8885cbb41a39e4734861462e05ee58c7ff7562016a842bcee2603f229940e8b",
),
"2.0.22": struct(
hash = "6465a9acb820207acf7da44661a7de52d0a1ae3c",
sha_linux = "c079781124e763c53c9fc73781fcee40296ce3314276836bc694f07bd331a859",
sha_mac = "ab95574dfc685b0300e37bea36aba413045bbfa2ab06b93eceb881670489eec1",
sha_win = "ba142e7e380596cba763e3a414de6511bcb86de48e4b48cf393b1ea449a24aaa",
),
"2.0.21": struct(
hash = "72f4ec97fbc7ec16c15ae68a75b0a257b2835160",
sha_linux = "741264f33f96ba4b785ed0b133861ebdfefbaefab76ddcfe7bde6522829d6f70",
sha_mac = "b07c0d65ee7e2799170c6f3b2aacebfe070c2e4975088bcd1b3a4140fecd8418",
sha_win = "dc3cbf47aa4be52a92526f1790a013734ecbd407f7f36286ed0283c96355999a",
),
"2.0.20": struct(
hash = "e0c15cd14170f407a9eb27fcbad22931dc67feb7",
sha_linux = "a196504fd1095836ca3961208338ff9e292be7729ea529bc19800aa7c966d34a",
sha_mac = "6cdbf17ed61486b38ea79d3f31d74483e7388d1e7468518dccba3f24e0ddd4c4",
sha_win = "4d22a32c219dbe18c55b635d014b9eaf7da60536171b7af37d9a8099fd33794b",
),
"2.0.19": struct(
hash = "9b9ff2dabfb4a7fbacbc004c0bead12a60f9d05c",
sha_linux = "bd7c2a38ac88d219a1ab5003ddbf8fdc66a6ba55bc69f99077346edf2753b4ea",
sha_mac = "6cc44029c9052855a55938eb6496b5659da4b1ce9cb34502b740af5993a94f93",
sha_win = "a1fa8b1c387b9307f9b87c43dc83c0ff1bc04b9f29fbe4f39aff2dd946ca4b70",
),
"2.0.18": struct(
hash = "c2ac7520fad29a7937ed60ab6a95b08eb374c7ba",
sha_linux = "e9f777de592f606b10104b2efe5179a7a8f44e3a9dffa1e3aaf73e05eb8893d7",
sha_mac = "86b1dd62e424e3788bf132292a694a25ca9b0875d06f50d0f5d424593697452c",
sha_win = "49ce07bda6be070251db44a08fcc05cae21ffdbd7522423a0c79bde635e87e28",
),
"2.0.17": struct(
hash = "f5c45e60392b82f603e3a8039c62db294fab02d2",
sha_linux = "b40a4874057e4cace600f8ee9787dcbe236e3dc5b2fff5c2ecb0e867e426f99c",
sha_mac = "081f61abf7d5ac0ec31aaffc5550013d4093ea4ea39520b7a32b7448d2a6ee70",
sha_win = "45d06e597e6a1185a76200bd0481495e7298800a4805045d9cdbcce6311c91b2",
),
"2.0.16": struct(
hash = "80d9674f2fafa6b9346d735c42d5c52b8cc8aa8e",
sha_linux = "e527638b224d9a30dc7e5fa4b9bd2eb2ab76ad306739ba8cacf5a5e333933a2a",
sha_mac = "061020eb0e3ee0611dc5a0008ccc7778168a4f838d49ca41c0aad8c52c1a01c9",
sha_win = "99364ed0388f928e0594f790662bf3a30c2894b0eff81797e1b64f62128561cb",
),
"2.0.15": struct(
hash = "89202930a98fe7f9ed59b574469a9471b0bda7dd",
sha_linux = "7ff49fc63adf29970f6e7af1df445d7f554bdbbb2606db1cb5d3567ce69df1db",
sha_mac = "e35cced1514ad0da40584f8dd6f76aabf847ce0fa82c6dc8dd9442fb74ed6d0d",
sha_win = "31d5f8107c87833cea57edc57613bba4b36b16152772f744c5ad204594b4e666",
),
"2.0.14": struct(
hash = "fc5562126762ab26c4757147a3b4c24e85a7289e",
sha_linux = "e466cd47ddd4bf0acd645412fdf08eda6d232484e48e5a2643e08062a7a4cf56",
sha_mac = "1c554c08459b7025638ca4eddba0d35babe8c26b202a70a74e9442d577896211",
sha_win = "428bc6094671937af96f26d803871fc5cd83d4d2b1c1df45fa6873a9bc5cac51",
),
"2.0.13": struct(
hash = "ce0e4a4d1cab395ee5082a60ebb4f3891a94b256",
sha_linux = "8986ed886e111c661099c5147126b8a379a4040aab6a1f572fe01f0f9b99a343",
sha_mac = "88c91332c8c76fed14ebf0edc9a08f586012f54f04ad61e5b1b6d02bf96bdeab",
sha_win = "9fb3b945b7bd56e34d17ec04de4cce475f26c49d161aee9d9c0b8b1434591f88",
),
}

View File

@@ -1 +0,0 @@
build --incompatible_enable_cc_toolchain_resolution

View File

@@ -1,4 +0,0 @@
bazel-bin
bazel-out
bazel-test_external
bazel-testlogs

View File

@@ -1,6 +0,0 @@
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "emsdk")
local_path_override(
module_name = "emsdk",
path = "..",
)

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
// This file prevents customJSFunctionToTestClosure from being minified by the Closure compiler.
Module.customJSFunctionToTestClosure = function() {}

View File

@@ -1,3 +0,0 @@
Module.customJSFunctionToTestClosure = function(firstParam, secondParam) {
console.log("This function adds two numbers to get", firstParam + secondParam);
}

View File

@@ -1,16 +0,0 @@
#include <emscripten/bind.h>
using namespace emscripten;
class HelloClass {
public:
static std::string SayHello(const std::string &name) {
return "Yo! " + name;
};
};
EMSCRIPTEN_BINDINGS(Hello) {
emscripten::class_<HelloClass>("HelloClass")
.constructor<>()
.class_function("SayHello", &HelloClass::SayHello);
}

View File

@@ -1,6 +0,0 @@
#include <iostream>
int main(int argc, char** argv) {
std::cout << "hello world!" << std::endl;
return 0;
}

View File

@@ -1,61 +0,0 @@
load("@emsdk//emscripten_toolchain:wasm_rules.bzl", "wasm_cc_binary")
_TEST_TARGETS = [
"long_command_line_file01",
"long_command_line_file02",
"long_command_line_file03",
"long_command_line_file04",
"long_command_line_file05",
"long_command_line_file06",
"long_command_line_file07",
"long_command_line_file08",
"long_command_line_file09",
"long_command_line_file10",
"long_command_line_file11",
"long_command_line_file12",
"long_command_line_file13",
"long_command_line_file14",
"long_command_line_file15",
"long_command_line_file16",
"long_command_line_file17",
"long_command_line_file18",
"long_command_line_file19",
"long_command_line_file20",
]
_TEST_TARGET_SUFFIXES = [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
]
[cc_library(
name = "{}_{}".format(target, suffix),
hdrs = ["include/{}.hh".format(target)],
# stripping include prefix to create more flags passed to emcc
strip_include_prefix = "include",
srcs = ["{}.cc".format(target)],
) for target in _TEST_TARGETS for suffix in _TEST_TARGET_SUFFIXES]
cc_binary(
name = "long_command_line",
linkshared = True,
srcs = ["long_command_line.cc"],
deps = [":{}_{}".format(target, suffix) for target in _TEST_TARGETS for suffix in _TEST_TARGET_SUFFIXES],
)
wasm_cc_binary(
name = "long_command_line_wasm",
cc_target = ":long_command_line",
outputs = [
"long_command_line.js",
"long_command_line.wasm",
],
)

View File

@@ -1,43 +0,0 @@
#include "long_command_line_file01.hh"
#include "long_command_line_file02.hh"
#include "long_command_line_file03.hh"
#include "long_command_line_file04.hh"
#include "long_command_line_file05.hh"
#include "long_command_line_file06.hh"
#include "long_command_line_file07.hh"
#include "long_command_line_file08.hh"
#include "long_command_line_file09.hh"
#include "long_command_line_file10.hh"
#include "long_command_line_file11.hh"
#include "long_command_line_file12.hh"
#include "long_command_line_file13.hh"
#include "long_command_line_file14.hh"
#include "long_command_line_file15.hh"
#include "long_command_line_file16.hh"
#include "long_command_line_file17.hh"
#include "long_command_line_file18.hh"
#include "long_command_line_file19.hh"
#include "long_command_line_file20.hh"
int main() {
f1();
f2();
f3();
f4();
f5();
f6();
f7();
f8();
f9();
f10();
f11();
f12();
f13();
f14();
f15();
f16();
f17();
f18();
f19();
f20();
}

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file01.hh"
#include <iostream>
void f1() { std::cout << "hello from f1()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file02.hh"
#include <iostream>
void f2() { std::cout << "hello from f2()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file03.hh"
#include <iostream>
void f3() { std::cout << "hello from f3()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file04.hh"
#include <iostream>
void f4() { std::cout << "hello from f4()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file05.hh"
#include <iostream>
void f5() { std::cout << "hello from f5()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file06.hh"
#include <iostream>
void f6() { std::cout << "hello from f6()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file07.hh"
#include <iostream>
void f7() { std::cout << "hello from f7()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file08.hh"
#include <iostream>
void f8() { std::cout << "hello from f8()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file09.hh"
#include <iostream>
void f9() { std::cout << "hello from f9()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file10.hh"
#include <iostream>
void f10() { std::cout << "hello from f10()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file11.hh"
#include <iostream>
void f11() { std::cout << "hello from f11()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file12.hh"
#include <iostream>
void f12() { std::cout << "hello from f12()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file13.hh"
#include <iostream>
void f13() { std::cout << "hello from f13()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file14.hh"
#include <iostream>
void f14() { std::cout << "hello from f14()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file15.hh"
#include <iostream>
void f15() { std::cout << "hello from f15()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file16.hh"
#include <iostream>
void f16() { std::cout << "hello from f16()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file17.hh"
#include <iostream>
void f17() { std::cout << "hello from f17()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file18.hh"
#include <iostream>
void f18() { std::cout << "hello from f18()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file19.hh"
#include <iostream>
void f19() { std::cout << "hello from f19()\n"; }

View File

@@ -1,5 +0,0 @@
#include "long_command_line_file20.hh"
#include <iostream>
void f20() { std::cout << "hello from f20()\n"; }

View File

@@ -1 +0,0 @@
build --incompatible_enable_cc_toolchain_resolution

View File

@@ -1,4 +0,0 @@
bazel-bin
bazel-out
bazel-test_secondary_lto_cache
bazel-testlogs

View File

@@ -1,26 +0,0 @@
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "emsdk")
local_path_override(
module_name = "emsdk",
path = "..",
)
emscripten_cache = use_extension(
"@emsdk//:emscripten_cache.bzl",
"emscripten_cache",
)
emscripten_cache.configuration(flags = ["--lto"])
emscripten_cache.targets(targets = [
"crtbegin",
"libprintf_long_double-debug",
"libstubs-debug",
"libnoexit",
"libc-debug",
"libdlmalloc",
"libcompiler_rt",
"libc++-noexcept",
"libc++-debug-noexcept",
"libc++abi-debug-noexcept",
"libsockets",
"libdlmalloc-debug",
])

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +0,0 @@
#include <iostream>
int main(int argc, char** argv) {
std::cout << "hello world!" << std::endl;
return 0;
}

View File

@@ -1,131 +0,0 @@
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="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"
# ------------------------------------------------------------------------------

View File

@@ -1,31 +0,0 @@
# A Makefile to build, test, tag and publish the Emscripten SDK Docker container.
# Emscripten version to build: Should match the version that has been already released.
# i.e.: 1.39.18
version =
alias =
only_alias =
image_name ?= emscripten/emsdk
.TEST:
ifndef version
$(error argument 'version' is not set. Please call `make version=SOME_VERSION ...`)
endif
build: Dockerfile .TEST
cd .. && docker build --progress=plain --network host --build-arg=EMSCRIPTEN_VERSION=${version} -t ${image_name}:${version} -f docker/$< .
test: test_dockerimage.sh .TEST
# test as non-root
# test fallback env variables by overriding the entrypoint
docker run --rm -u `id -u`:`id -g` -w /emsdk/docker --net=host --entrypoint /bin/bash ${image_name}:${version} $<
push: .TEST
ifndef only_alias
docker push ${image_name}:${version}
endif
ifdef alias
docker tag ${image_name}:${version} ${image_name}:${alias}
docker push ${image_name}:${alias}
endif

View File

@@ -1,125 +0,0 @@
# Dockerfile for EMSDK
This Dockerfile builds a self-contained version of Emscripten SDK that enables Emscripten to be used without any
other installation on the host system.
It is published at https://hub.docker.com/r/emscripten/emsdk.
### Usage
Simple usage of this container to compile a hello-world
```bash
# create helloworld.cpp
cat << EOF > helloworld.cpp
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
EOF
```
```bash
# compile with docker image
docker run \
--rm \
-v "$(pwd):$(pwd)" \
-u $(id -u):$(id -g) \
emscripten/emsdk \
emcc helloworld.cpp -o helloworld.js
# execute on host machine
node helloworld.js
```
Teardown of compilation command:
|part|description|
|---|---|
|`docker run`| A standard command to run a command in a container|
|`--rm`|remove a container after execution (optimization)|
|`-v "$(pwd):$(pwd)"`|Mounting current folder from the host system into mirrored path on the container<br>TIP: This helps to investigate possible problem as we preserve exactly the same paths like in host. In such case modern editors (like Sublime, Atom, VS Code) let us to CTRL+Click on a problematic file |
|`-u $(id -u):$(id -g)`| Run the container as a non-root user with the same UID and GID as local user. Hence all files produced by this are accessible to non-root users|
|`emscripten/emsdk`|Get the latest tag of this container|
|`emcc helloworld.cpp -o helloworld.js`|Execute `emcc` command with following arguments inside container, effectively compile our source code|
### Building Dockerfile
This image has following optional arguments
| arg | default value | description |
| --- | --- | --- |
| `EMSCRIPTEN_VERSION` | `tot`<br/>(special case, tip-of-tree) | One of released version of Emscripten. For example `2.0.0`<br/> Minimal supported version is **1.39.0** |
**Building**
This step will build Dockerfile as given tag on local machine
```bash
# using docker
docker build \
--network host \
--build-arg=EMSCRIPTEN_VERSION=1.39.17 \
-t emscripten/emsdk:1.39.17 \
-f docker/Dockerfile \
.
```
```bash
# using predefined make target
make version=1.39.17 build test
```
**Tagging**
In case of using `docker build` command directly, given `--tag` should match version of released Emscripten (you can see list of non-legacy versions by executing `emsdk list`).
**Pushing**
This step will take local image and push to default docker registry. You need to make sure that you logged in docker cli (`docker login`) and you have rights to push to that registry.
```bash
# using docker
docker push emscripten/emsdk:1.39.17
```
```bash
# using predefined make target
make version=1.39.17 push
```
In case of pushing the most recent version, this version should be also tagged as `latest` and pushed.
```bash
# using docker cli
docker tag emscripten/emsdk:1.39.17 emscripten/emsdk:latest
docker push emscripten/emsdk:latest
```bash
# using make
make version=1.39.17 alias=latest push
```
### Extending
If your project uses packages that this image doesn't provide you might want to:
* Contribute to this repo: Maybe your dependency is either non-intrusive or could be useful for other people
* Create custom image that bases on this image
1. create own Dockerfile that holds:
```dockerfile
# Point at any base image that you find suitable to extend.
FROM emscripten/emsdk:1.39.17
# Install required tools that are useful for your project i.e. ninja-build
RUN apt update && apt install -y ninja-build
```
2. build it
```bash
docker build -t extended_emscripten .
```
3. test
```bash
docker run --rm extended_emscripten ninja --version
# 1.10.0
```

View File

@@ -1,7 +0,0 @@
#!/bin/bash
set -e
# Set-up PATH and other environment variables
EMSDK_QUIET=1 source /emsdk/emsdk_env.sh
exec "$@"

View File

@@ -1,29 +0,0 @@
#!/usr/bin/env bash
set -ex
if [ $EUID -eq 0 ]; then
sudo -u nobody `which emcc` --version
fi
which emsdk
node --version
npm --version
python3 --version
pip3 --version
em++ --version
emcc --version
java -version
cmake --version
exit_code=0
# test emcc compilation
echo 'int main() { return 0; }' | emcc -o /tmp/main.js -xc -
node /tmp/main.js || exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Node exited with non-zero exit code: $exit_code"
exit $exit_code
fi
# test embuilder
embuilder build zlib --force

View File

@@ -1 +0,0 @@
@cmd /k call emsdk_env.bat

View File

@@ -1,279 +0,0 @@
{
"aliases": {
"latest": "4.0.13",
"latest-sdk": "latest",
"latest-arm64-linux": "latest",
"latest-64bit": "latest",
"sdk-latest-64bit": "latest",
"latest-upstream": "latest",
"latest-clang-upstream": "latest",
"latest-releases-upstream": "latest"
},
"releases": {
"4.0.13": "32b8ae819674cb42b8ac2191afeb9571e33ad5e2",
"4.0.13-asserts": "17d4746128fd81d192c1685da52332c5221799bb",
"4.0.12": "209b886304498eff50dd835850dc5715803401ed",
"4.0.12-asserts": "a9e9ee083503b842a14d31db764e31d65afb8910",
"4.0.11": "7033fec38817ec01909b044ea0193ddd5057255c",
"4.0.11-asserts": "0eacb0d6",
"4.0.10": "8103ffedfb0c42d231c6af6859a5a1a832260b43",
"4.0.10-asserts": "ccf48a673362f11ddb6c3656405bb6a03b344052",
"4.0.9": "cb2a69bce627bd2247624c71fc12907cb8785d2f",
"4.0.9-asserts": "27f1e0801c6ec5ea4d9a9e1d573eb1fead3525f1",
"4.0.8": "56f86607aeb458086e72f23188789be2ee0e971a",
"4.0.8-asserts": "ab275365d4057cf92d698ef99744d66cd8c7cba9",
"4.0.7": "ef4e9cedeac3332e4738087567552063f4f250d3",
"4.0.7-asserts": "4bef8973dc12f5f38022f323d67c16237bbd2962",
"4.0.6": "14767574a5c37ff9526a253a65ddbe0811cb3667",
"4.0.6-asserts": "4050eaf1fd8e1c191198ec4ba8c346c4f3da0dc8",
"4.0.5": "d7f8ff5e2ca3539c33fae81e98f7c56ef9fa1239",
"4.0.5-asserts": "71269375282224b2e662bbe009e2e3ebc40db67f",
"4.0.4": "ea71afcf5a172125179a07ff1731de6e81c92222",
"4.0.4-asserts": "5121692126f7c96d86a13dc8462e758813e30123",
"4.0.3": "de2109f0e5e7278d470da11de526aed16c527722",
"4.0.3-asserts": "bae6703fb819bd84fb4dfb5e87b41cf93b6d3f2b",
"4.0.2": "cc8eba40de8235f9c33d92463018f87b3edaa09e",
"4.0.2-asserts": "dc575ac9a214463b2b3503c11a1a31db665b4414",
"4.0.1": "5ff495a591978fdf8a16f2d172be3616f3150d1e",
"4.0.1-asserts": "c2e46b78d3dde701187d685f8c175f17425bee68",
"4.0.0": "3ebc04a3dab24522a5bf8ced3ce3caea816558f6",
"4.0.0-asserts": "912ac2d711bb343205f314564ed287d883a7d888",
"3.1.74": "c2655005234810c7c42e02a18e4696554abe0352",
"3.1.74-asserts": "88e95307accc1f4b247b86b7a0c0e6beaf07f844",
"3.1.73": "b363a836e75a245c548b7a6a021822d8c9e4c6df",
"3.1.73-asserts": "86f3e54628089634c6b73039955388296e920291",
"3.1.72": "7a360458327cd24c2a7aab428bdbcb5bca8810e4",
"3.1.72-asserts": "92d39398c0016e73821548a4cd9df3df1358f6d9",
"3.1.71": "7ee0f9488f152e9e9cf0d4d243970e03742f1a5c",
"3.1.71-asserts": "15b142643065fe241138c6785cb8e384504f76e8",
"3.1.70": "6fa6145af41e835f3d13edf7d308c08e4573357a",
"3.1.70-asserts": "11444ec05e2cc64ef42c4f33c6e3a2a7534694f2",
"3.1.69": "8fe01288bc35668c13316324336ea00195dfb814",
"3.1.69-asserts": "cf6f9d1b4026ec7aec33aceb68077c704b52b068",
"3.1.68": "b52d8c9150dc7d4c8e4a7a08c7a9b4006c9abe49",
"3.1.68-asserts": "1565c9e5a4547215a1b63013607bf7a1cbb3d9d3",
"3.1.67": "4ae62984ea36ef0e5bfcbd0ed9b62f04bee6426a",
"3.1.67-asserts": "7cfc00962efe07f2e2ff3383f59519dc5bea4f82",
"3.1.66": "243eae09cf5c20c4fde51a620b92f483255c8214",
"3.1.66-asserts": "c5d25114210455d19cb9232171824292005a5080",
"3.1.65": "fdcf56c75a1d27fdff6525a7e03423595485ca19",
"3.1.65-asserts": "3231fb47481b2248c31002cdd7324a9155135ce0",
"3.1.64": "fd61bacaf40131f74987e649a135f1dd559aff60",
"3.1.64-asserts": "42c1d51ceb8e41e70ce1d8dc1bc534c0f609c196",
"3.1.63": "aeb36a44b29e8ca9f4c7efbb4735b69003ac2bb9",
"3.1.63-asserts": "b0275806047b42f2f88998c5c8159aec90e195ab",
"3.1.62": "d52176ac8e07c47c1773bb2776ebd91e3886c3af",
"3.1.62-asserts": "9d9e7deac8b91fbdd8804045595e807f9d774a53",
"3.1.61": "28e4a74b579b4157bda5fc34f23c7d3905a8bd6c",
"3.1.61-asserts": "7fc912687ba2077b3aeae472b51c238b3d201c46",
"3.1.60": "87709b5747de5b1993fe314285528bf4b65c23e1",
"3.1.60-asserts": "e2388e8a528890b8f3ff7b9ab4f52dbe2aeb38b9",
"3.1.59": "e20ee09a8a740544c4bc6de5d4ba5f81f74b74d6",
"3.1.59-asserts": "10ae1e83ccce9f4a363bb2e3090ba8fc32d25851",
"3.1.58": "a4d4afb626c5010f6ccda4638b8d77579a63782e",
"3.1.58-asserts": "5bc1c7108d4d91db316b24a75593a37c1117c266",
"3.1.57": "523b29e1b99a61069a2fa9f9d3cc9be1c4c53d4d",
"3.1.57-asserts": "10b736eeeac0dae3fd5bc29c6b3e32f7f7adf941",
"3.1.56": "9d106be887796484c4aaffc9dc45f48a8810f336",
"3.1.56-asserts": "2b9c4b912b611dc51f9019e11371e3cdd36fa64e",
"3.1.55": "f5557e3b7166d05bddb5977e363ec48cd06e9d32",
"3.1.55-asserts": "eb23cc30563325fd6dc97fcf85ddf26489ab9110",
"3.1.54": "aa1588cd28c250a60457b5ed342557c762f416e3",
"3.1.54-asserts": "d525f56cb765ed6884a0c443dbb906b63b148915",
"3.1.53": "e5523d57a0e0dcf80f3b101bbc23613fcc3101aa",
"3.1.53-asserts": "152cef4e00fc17776576bcc57f53badd21b92509",
"3.1.52": "ce2097fb81953331e65543c20b437475f218127c",
"3.1.52-asserts": "49e9a37dd6d1d65aa92472d8908cb8b88092dfaf",
"3.1.51": "4f416d92fbff66ce79901cfc8263768f1b25dd3e",
"3.1.51-asserts": "9035c99beb760aa0ea381bdf11abf440d88bb451",
"3.1.50": "2ce4170cef5ce46f337f9fd907b614a8db772c7d",
"3.1.50-asserts": "0a6fe6ef5880bf5b035d396f3875fda9b7c4bb60",
"3.1.49": "bd0a2e230466dadb36efc71aa7271f17c6c35420",
"3.1.49-asserts": "4ea035c5bbd6168dae34c970b5f56d7aa4dcf952",
"3.1.48": "694434b6d47c5f6eff2c8fbd9eeb016c977ae9dc",
"3.1.48-asserts": "6e2b8a97c6db82089c3a405bc88ea9fb125deb16",
"3.1.47": "39ade279e75e6d17dd6b7eb9fba2006e61fe966b",
"3.1.47-asserts": "dc49d84ed226a5a30a5117cefc07c781f6c0d16e",
"3.1.46": "21644188d5c473e92f1d7df2f9f60c758a78a486",
"3.1.46-asserts": "3e09b252d0d5a8e045d2ca92c606bfb9874bddf8",
"3.1.45": "2b7c5fb8ffeac3315deb1f82ab7bf8da544f84a1",
"3.1.45-asserts": "2aec03dfd8ce68c95316116dafbe30e273f32a81",
"3.1.44": "b90507fcf011da61bacfca613569d882f7749552",
"3.1.44-asserts": "06d00b0c62e435b743aa37c67b4ab76bc8568c79",
"3.1.43": "bf3c159888633d232c0507f4c76cc156a43c32dc",
"3.1.43-asserts": "3ec53a819a5958665d6bb0ac895c99546921b6ef",
"3.1.42": "9d73bf4bd5b5c9ce6e51be0ed5ce6599fcb28e9e",
"3.1.42-asserts": "7a622e0b66ee095aea9766375a2774b68c8bd8ef",
"3.1.41": "eb71265ef0ab905620015adbfedacf88c5dbf021",
"3.1.41-asserts": "064607aeccaffd93175bb40c072271c0393d71a5",
"3.1.40": "c3122846bb040798aab975f61008c37eb19476de",
"3.1.40-asserts": "5b5daaaabaf7292736454e4f8a73fa79bd455af4",
"3.1.39": "1b56b171b627af0841cf8d4d8c0160c6cb6d855f",
"3.1.39-asserts": "5e237cc9d9f6020af9ba908692361aa71744af1d",
"3.1.38": "03ecb526947f6a3702a0d083083799fe410d3893",
"3.1.38-asserts": "f771c7a0b55bc5d89ecceedfe9521c2c04aa43ae",
"3.1.37": "7c905cfc1ca6699f6ccb288ae174902cfbdcf0a2",
"3.1.37-asserts": "323607efbcdf84886dab55a18d758fe4c7d71d1e",
"3.1.36": "adedc0750c4a89b65bee866edab24298cb8d6677",
"3.1.36-asserts": "fdd2824226a8b001df5697146b88be98920fc215",
"3.1.35": "671550b5bdceee7bdb21493714f9a815aa5149a9",
"3.1.35-asserts": "42481a713ae805eda34f6e3e7170384c426b1d73",
"3.1.34": "2fdd6b9e5b67d5b62f84d0501a876513ff118ef1",
"3.1.34-asserts": "385382932c18a1312fff88000c4f83c2b9d1bb44",
"3.1.33": "49b960bd03b3a9da478a08541ce6eafe792a58a8",
"3.1.33-asserts": "e3ca2c6756b75cf6c6daa40276de0f25218e04a7",
"3.1.32": "29ad1037cd6b99e5d8a1bd75bc188c1e9a6fda8d",
"3.1.32-asserts": "2811c849256ec5b62b4ec32fb8369e5f3c9a54b1",
"3.1.31": "1eec24930cb2f56f6d9cd10ffcb031e27ea4157a",
"3.1.31-asserts": "48488847a38bb9cfb36e7397bea21ab2bb062680",
"3.1.30": "dc1fdcfd3f5b9d29cb1ebdf15e6e845bef9b0cc1",
"3.1.30-asserts": "21cca44e843267533c3d0b258b46c37bd142a2d7",
"3.1.29": "d949f1b99a477d4b0b54d95413df3688afa69d0a",
"3.1.29-asserts": "9d1e32e66e4b5921efc1a45cdc68e8c522c42c32",
"3.1.28": "30b9e46ddcea66e91530559379089002d8b692cf",
"3.1.28-asserts": "19871a9ea4914d63749b8d4d170e27a8854cb565",
"3.1.27": "48ce0b44015d0182fc8c27aa9fbc0a4474b55982",
"3.1.27-asserts": "630810e5a312f57d17efbe384ed7e4299f796bc1",
"3.1.26": "4f68bb2a505c727bcf58195cf4da20592a6e92c8",
"3.1.26-asserts": "4e2ffe94b04dbadfbca1687ab458d306b3414d13",
"3.1.25": "ff6babb041d0f31575cc16d15ef82c6222ca99b8",
"3.1.25-asserts": "6b19d6a8c30d7b83ba2193625fc12cce9ae0206b",
"3.1.24": "54217a0950bb1dafe8808cc6207d378e323f9d74",
"3.1.24-asserts": "4c20c7393ca208c740c16a97dbf305ba52fea2bb",
"3.1.23": "bfd5e63a44ba4c8568cd8ac87c27b35e40732bf4",
"3.1.23-asserts": "77d2c744fe37fe0e22a51329fa23bab4b8ffa656",
"3.1.22": "990cee04a21caafc75955d736fb45791a7f2aeee",
"3.1.22-asserts": "d94fe69a037e93562d0bbe9d0372ce23f4ab1089",
"3.1.21": "a16a8bca2466eb144f7c93fa899c0272c8815dc3",
"3.1.21-asserts": "c7a387161b029621eb4d3dd57363b1393b4c50b2",
"3.1.20": "d92c8639f406582d70a5dde27855f74ecf602f45",
"3.1.20-asserts": "db0fd1cb7316675317d527b6ed4f4cc7005df9ec",
"3.1.19": "4c3772879a04140298c3abde90962d5567b5e2fc",
"3.1.19-asserts": "83c2ba526ec47139d29e1417ac23d15b37ead98a",
"3.1.18": "49d45744895c7d7e28acd94a385d7ee361653b4a",
"3.1.18-asserts": "cb7fa1dce4b04e35b78ec43499a7759f24c1e64d",
"3.1.17": "d27fef2070c86a218965da8b8b5df8b4425aa3bb",
"3.1.17-asserts": "19aab28a81be09863e86aba8ee4e20feaee31f6b",
"3.1.16": "fb1baf00423818052359cf9126e94bc71c39feb5",
"3.1.16-asserts": "61848bee5b330db5ad5f827352d453b5557757fa",
"3.1.15": "568a46a9fb7e1f1686a6f7216b3dc976f28d2a79",
"3.1.15-asserts": "a8a770a0a23d2279270bd28004c8c60b02d91fbb",
"3.1.14": "ade9d780ff17c88d81aa13860361743e3c1e1396",
"3.1.14-asserts": "b55548282b553fc0b922b82d97b80f256bf01d20",
"3.1.13": "bc44364b561cfde15c243a54e3b96ea12d7ea284",
"3.1.13-asserts": "6b8f75967b5d37fa898d217b560d571694eb5b13",
"3.1.12": "a8c3b314d61e2bb98581d522f858132b2fc21488",
"3.1.12-asserts": "0ec1936aa3cb809d96abfebcc5356cd0cb15f6b8",
"3.1.11": "8c3a799341c01148692c52fda73bbba5e89c5727",
"3.1.11-asserts": "4d27b98351e021e9b7d2681a84cbab5a0ddc7a88",
"3.1.10": "8bd05c7221b4ce34d4bedec40b672d94e681a765",
"3.1.10-asserts": "d9b20effb2d660936fb5be525744e941fd900bc6",
"3.1.9": "edabe25af34554d19c046078f853999b074259ca",
"3.1.9-asserts": "c751721b1dfa47c03ede0f0da89be453c79b34ef",
"3.1.8": "8c9e0a76ebed2c5e88a718d43e8b62452def3771",
"3.1.8-asserts": "d33ae3c8d16f04b004b76c1d7c1989d637aa36e0",
"3.1.7": "d0e637fe48197587d981f79e8114757731d0c2a9",
"3.1.7-asserts": "88f0cab4e7db846e171cbbbbf20cc1a51b8c779f",
"3.1.6": "8791c3e936141cbc2dd72d76290ea9b2726d39f3",
"3.1.6-asserts": "84fa976d87a29ea1734601b042f3c6809ecb89f0",
"3.1.5": "2dee36c7163f7394ab9341854ef5281501dd97d0",
"3.1.5-asserts": "e9b96739e70faf11bbb2f63addcef59f2b2c7b48",
"3.1.4": "39e60dda6945cfcd6487725bdb1361ae7975173f",
"3.1.4-asserts": "05edbd634e300fc79ce0f635251bd5bef375328b",
"3.1.3": "2ddc66235392b37e5b33477fd86cbe01a14b8aa2",
"3.1.3-asserts": "66aaf7da980346898a84e3e1b70477286e225eec",
"3.1.2": "6626e25d6d866cf283147ca68d54ac9326fe399f",
"3.1.2-asserts": "b5cb3731eeaf127ae73d5e24b56cf5f0cdbf16a6",
"3.1.1": "5ee64de9809592480da01372880ea11debd6c740",
"3.1.1-asserts": "9455ce6306d97c0b3854e88e1e2f66d4b8565daf",
"3.1.0": "562e3a0af169e6dea5e6dbecac2255d67c2c8b94",
"3.1.0-asserts": "1de2db691103282dad6b2037018db6ece54f57c6",
"3.0.1": "91b7a67a486d2430e73423a38d950d8a550826ed",
"3.0.1-asserts": "2a84a08e92ce8748015dfc3eee40ee35a853fed0",
"3.0.0": "7fbe748230f2ce99abbf975d9ad997699efb3153",
"3.0.0-asserts": "f1d65c26f502220e278d31e7621e99b673e28093",
"2.0.34": "d8fc1b92dbc0ce8d740a7adb937c5137ba4755e0",
"2.0.33": "cef8850d57278271766fb2163eebcb07354018e7",
"2.0.32": "74646397e3c5010824ad60d1de86c6bcbe334dff",
"2.0.31": "597724ca3f6cd6e84bea73f1f519a3953b5c273d",
"2.0.31-asserts": "c1065389ccf4a81e3c1af080316afd444788bc46",
"2.0.30": "c69458f1bbf3ef5b8da4e934de210659cc9bca04",
"2.0.30-asserts": "e13a2d74c5fa5f175ae7cffd4197fe7f78bea304",
"2.0.29": "c2369dc425725fff86ba90a9007a4603ddf7941b",
"2.0.29-lto": "439b7bd7da11e99065c84a60766e427b03be4206",
"2.0.28": "866055ea639d64dfedc625d28ec981e47ce37168",
"2.0.28-lto": "ac6ac36f7a02cec857bc1e543e55c686c5bd1256",
"2.0.27": "1ac46e3b84955231ab4a4f4cbe0c7ac28c86b8cc",
"2.0.27-lto": "79509f70be89d66b8441383de94b3e5a91dedc68",
"2.0.26": "823d37b15d1ab61bc9ac0665ceef6951d3703842",
"2.0.26-lto": "b92ba43f3ac92ab6f1ce6136a8c5969b68ba6968",
"2.0.25": "f6f001b08fbb67935379cf13d17fd9bfdbaff791",
"2.0.24": "6ab7fc5622a67e6111d07c4ba61c8d3c8fc33ed2",
"2.0.23": "77b065ace39e6ab21446e13f92897f956c80476a",
"2.0.23-lto": "3f6dbb899f61fab52e4574beb4f7c8382658aa20",
"2.0.22": "6465a9acb820207acf7da44661a7de52d0a1ae3c",
"2.0.21": "72f4ec97fbc7ec16c15ae68a75b0a257b2835160",
"2.0.20": "e0c15cd14170f407a9eb27fcbad22931dc67feb7",
"2.0.20-lto": "d1b26cd17e51c5c705eea69b9545975e3705c058",
"2.0.19": "9b9ff2dabfb4a7fbacbc004c0bead12a60f9d05c",
"2.0.19-lto": "4487f6c5107e7882ae2bad6d26c34ffdceb713f0",
"2.0.18": "c2ac7520fad29a7937ed60ab6a95b08eb374c7ba",
"2.0.17": "f5c45e60392b82f603e3a8039c62db294fab02d2",
"2.0.16": "80d9674f2fafa6b9346d735c42d5c52b8cc8aa8e",
"2.0.15": "89202930a98fe7f9ed59b574469a9471b0bda7dd",
"2.0.14": "fc5562126762ab26c4757147a3b4c24e85a7289e",
"2.0.13": "ce0e4a4d1cab395ee5082a60ebb4f3891a94b256",
"2.0.12": "dcf819a7821f8db0c8f15ac336fea8960ec204f5",
"2.0.11": "4764c5c323a474f7ba28ae991b0c9024fccca43c",
"2.0.10": "37fc7647c754ac9a28ad588c143b82286de0ef71",
"2.0.9": "d8e430f9a9b6e87502f826c39e7684852f59624f",
"2.0.8": "e4ed6c79f4db8b175d9bbe55869b697aba9bcf2a",
"2.0.7": "d7a29d82b320e471203b69d43aaf03b560eedc54",
"2.0.6": "4ba921c8c8fe2e8cae071ca9889d5c27f5debd87",
"2.0.5": "461f0f118d8d8e6cfd84e077f3eb010c17a39032",
"2.0.4": "eefeb3e623af023844ac477d70d1fd8a668f5110",
"2.0.3": "7a7f38ca19da152d4cd6da4776921a0f1e3f3e3f",
"2.0.2": "ede25d889a0abe63360d4c5d420087c8753b8bbe",
"2.0.1": "13e29bd55185e3c12802bc090b4507901856b2ba",
"2.0.0": "5974288502aab433d45f53511e961aaca4079d86",
"1.40.1": "536568644fd67d53778f6111fdd5f64ad3f4c539",
"1.40.0": "edf24e7233e0def312a08cc8dcec63a461155da1",
"1.39.20": "e7e39da9c81faecd9ecf44065cee864d76e4e34d",
"1.39.19": "665121d026cafc46c29b30d6d4c45ed73eedbb7e",
"1.39.18": "1914a1543f08cd8e41f44c2bb05f7a90d1920275",
"1.39.17": "9bc968c0e49b1c795ecddb87391b265911e2adcb",
"1.39.16": "ae5001fac3849895a873e422a2a80afc90f3b798",
"1.39.15": "3880c744c068986d4ee781a61f7b2e820043e11f",
"1.39.14": "574ad04affb82cc36a32dd89b2a87bea4fb30eba",
"1.39.13": "7b3cd38017f7c582cfa3ac24a9f12aa6a8dca51f",
"1.39.12": "e13b86d4dbd9a986525ef27d4ad8157949b9bc3a",
"1.39.11": "6584e2d88570ee55914db92a3bad84f99e5bdd82",
"1.39.10": "65d33d604d3fa0ebe03548378b898fc6608e9cb8",
"1.39.9": "122396dfad60e1b2a83ccefa74a1425a2e05b5cb",
"1.39.8": "9e60f34accb4627d7358223862a7e74291886ab6",
"1.39.7": "9a89fff28cc6f75e17976fce1904b280e4beb25d",
"1.39.6": "967836071d96d9b7894e492382f5fcb96423fc07",
"1.39.5": "b3ddcab6efd749d3ed937fb452ace4e39a825842",
"1.39.4": "8bb7b0bbbca74cc58741416cc955011f22ff5ccb",
"1.39.3": "b024b71038d1291ed7ec23ecd553bf2c0c8d6da6",
"1.39.2": "c630da9163a64e08de3dd948be0a0f7a175d285b",
"1.39.1": "40f3caabcef7b52bdde63d3883462414d7a25bec",
"1.39.0": "d57bfdd6d43181501bbd3fab502d57c9073ceb49",
"1.38.48": "1290d9deb93d67c4649999a8f2c8d9167d38dc04",
"1.38.47": "bc367c257409d676e71c5511383228b7aabf1689",
"1.38.46": "c89919d252f7cea00d944bdf3bd630cd3c7e7388",
"1.38.45": "f3030d9fffcc9e1287cb6b8e72982e94ece31d71",
"1.38.44": "e5fd171371c3dcb8806a337f2dfa9b70f598f456",
"1.38.43": "737d4a07be76c15124adf3c6ef2c218123f7a67f",
"1.38.42": "05f8c01394ddd0838d3cb484ba8ca97a3efc1ac9",
"1.38.41": "5c6785a63993ae7a4d5362b32b0be9c85138fb96",
"1.38.40": "7b4b328af02eafbc857b8ca1e3d9b12dddc56ef7",
"1.38.39": "f42b12c45fd3f4c20de1321402fbc28f8fd21df1",
"1.38.38": "80bff2784f8500c1305ca69ba1d9fc84df0e401c",
"1.38.37": "0ca6c49e30bc09c3ccefc867df4196a4b4183441",
"1.38.36": "d46be49c2aab975333423122239892bd46f52bba",
"1.38.35": "98f49919f25e06fa557cbcb1321d4c10e60c87ca",
"1.38.34": "048cf9424790cc525a7ea6da340820aae226f3b9",
"1.38.33": "3b8cff670e9233a6623563add831647e8689a86b"
}
}

Some files were not shown because too many files have changed in this diff Show More