| #!/bin/bash | |
| # | |
| # Copyright 2025 The Dawn & Tint Authors | |
| # | |
| # Redistribution and use in source and binary forms, with or without | |
| # modification, are permitted provided that the following conditions are met: | |
| # | |
| # 1. Redistributions of source code must retain the above copyright notice, this | |
| # list of conditions and the following disclaimer. | |
| # | |
| # 2. Redistributions in binary form must reproduce the above copyright notice, | |
| # this list of conditions and the following disclaimer in the documentation | |
| # and/or other materials provided with the distribution. | |
| # | |
| # 3. Neither the name of the copyright holder nor the names of its | |
| # contributors may be used to endorse or promote products derived from | |
| # this software without specific prior written permission. | |
| # | |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
| # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
| # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
| # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
| # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| set -euo pipefail | |
| # Version format: vYYYYMMDD.HHMMSS or vYYYYMMDD.HHMMSS-FORKOWNER.dawn.BRANCHNAME | |
| VERSION_DATETIME=$(git show -s --date=format:'%Y%m%d.%H%M%S' --format=%cd) | |
| VERSION_SUFFIX=${GITHUB_REPOSITORY/\//.}.${GITHUB_REF_NAME} | |
| if [[ "$VERSION_SUFFIX" != "google.dawn.main" ]] ; then | |
| PKG_VERSION=v${VERSION_DATETIME}-${VERSION_SUFFIX} | |
| else | |
| PKG_VERSION=v${VERSION_DATETIME} | |
| fi | |
| PKG_FILE=emdawnwebgpu_pkg-${PKG_VERSION}.zip | |
| REMOTE_PORT_FILE=emdawnwebgpu-${PKG_VERSION}.remoteport.py | |
| # Initialize emsdk so we can use emcmake. Other dependencies wll be downloaded | |
| # later via DAWN_FETCH_DEPENDENCIES (set in dawn-ci.cmake). | |
| git submodule update --init --depth=1 third_party/emsdk | |
| python3 tools/activate-emsdk | |
| # First build the link test in debug mode as a basic test. | |
| third_party/emsdk/upstream/emscripten/emcmake cmake -S=. -B=out/wasm \ | |
| -GNinja \ | |
| -C=.github/workflows/dawn-ci.cmake \ | |
| -DDAWN_ENABLE_INSTALL=0 \ | |
| -DCMAKE_BUILD_TYPE=Debug | |
| cmake --build out/wasm --target emdawnwebgpu_link_test | |
| # Switch the build type (in-place to save time), rebuild the link test and a C++ | |
| # sample (to verify webgpu_cpp.h builds and to run Closure, which verifies the | |
| # linked JS to some extent), and build the final package (which is not actually | |
| # affected by build type). | |
| # TODO: Since we have Ninja, we could use -G'Ninja Multi-Config' | |
| # to do multiple build types more cleanly. | |
| # https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html | |
| cmake -S=. -B=out/wasm -DCMAKE_BUILD_TYPE=Release | |
| cmake --build out/wasm --target emdawnwebgpu_pkg emdawnwebgpu_link_test HelloTriangle | |
| # Get variables for documentation. | |
| SHA=$(git rev-parse HEAD) | |
| EMSDK_VERSION=$(python3 tools/activate-emsdk --get-emsdk-version) | |
| # Create zip | |
| cat << EOF > out/wasm/emdawnwebgpu_pkg/VERSION.txt | |
| Dawn release ${PKG_VERSION} at revision <https://dawn.googlesource.com/dawn/+log/${SHA}>. | |
| EOF | |
| (cd out/wasm && zip -9roX - emdawnwebgpu_pkg > "../../${PKG_FILE}") | |
| PKG_FILE_SHA512=$(python3 -c 'import hashlib, sys; print(hashlib.sha512(sys.stdin.buffer.read()).hexdigest())' < "${PKG_FILE}") | |
| cat << EOF > "$REMOTE_PORT_FILE" | |
| # Copyright 2025 The Emscripten Authors. All rights reserved. | |
| # Emscripten is available under two separate licenses, the MIT license and the | |
| # University of Illinois/NCSA Open Source License. Both these licenses can be | |
| # found in the LICENSE file. | |
| # https://dawn.googlesource.com/dawn/+/${SHA}/src/emdawnwebgpu/pkg/README.md | |
| r""" | |
| This "remote port" instructs Emscripten (4.0.10+) how to automatically download | |
| the actual port for Emdawnwebgpu. See README below for instructions. | |
| $(cat out/wasm/emdawnwebgpu_pkg/README.md) | |
| """ | |
| import sys | |
| if __name__ == '__main__': | |
| print('Please see documentation inside this file for details on how to use this port.') | |
| sys.exit(1) | |
| _VERSION = '${PKG_VERSION}' | |
| # Remote-specific port information | |
| # - Where to download the port | |
| EXTERNAL_PORT = f'https://github.com/${GITHUB_REPOSITORY}/releases/download/{_VERSION}/emdawnwebgpu_pkg-{_VERSION}.zip' | |
| # - Hash to verify the download integrity | |
| SHA512 = '${PKG_FILE_SHA512}' | |
| # - Path of the port inside the zip file | |
| PORT_FILE = 'emdawnwebgpu_pkg/emdawnwebgpu.port.py' | |
| # General port information | |
| # - Visible in emcc --show-ports and emcc --use-port=emdawnwebgpu:help | |
| LICENSE = "Some files: BSD 3-Clause License. Other files: Emscripten's license (available under both MIT License and University of Illinois/NCSA Open Source License)" | |
| # - Visible in emcc --use-port=emdawnwebgpu:help | |
| DESCRIPTION = "Emdawnwebgpu implements webgpu.h on WebGPU, replacing -sUSE_WEBGPU. **For info on usage and filing feedback, see link below.**" | |
| URL = 'https://dawn.googlesource.com/dawn/+/${SHA}/src/emdawnwebgpu/pkg/README.md' | |
| # Emscripten <4.0.10 won't notice EXTERNAL_PORT and will try to use this. | |
| def get(ports, settings, shared): | |
| raise Exception('Remote ports require Emscripten 4.0.10+.') | |
| # (Make this look like a port so that the error message above can be hit.) | |
| def clear(ports, settings, shared): | |
| pass | |
| EOF | |
| # Create RELEASE_INFO.md | |
| # TODO(crbug.com/430624000): This is not specific to Emdawnwebgpu, move it | |
| # out of this script, and ideally include it in every release artifact. | |
| # (Also rename release artifacts for consistency.) | |
| cat << EOF > RELEASE_INFO.md | |
| $(cat out/wasm/emdawnwebgpu_pkg/VERSION.txt) | |
| Only dawn.googlesource.com Git source code is official. Nightly releases of | |
| native binaries and Emdawnwebgpu are built on GitHub, provided as a best-effort | |
| service. They are not signed or guaranteed by Google or the Dawn team. | |
| ## Emdawnwebgpu | |
| Use either the \`emdawnwebgpu-*.remoteport.py\` file (Emscripten 4.0.10+) or the \`emdawnwebgpu_pkg-*.zip\`. | |
| For full instructions, see the [README](https://dawn.googlesource.com/dawn/+/${SHA}/src/emdawnwebgpu/pkg/README.md) which is included in both files. | |
| Tested against emsdk release ${EMSDK_VERSION}. | |
| EOF | |
| # Save version numbers for later steps | |
| if [[ -n "${GITHUB_OUTPUT:-}" ]] ; then | |
| echo "PKG_VERSION=$PKG_VERSION" >> $GITHUB_OUTPUT | |
| echo "PKG_FILE=$PKG_FILE" >> $GITHUB_OUTPUT | |
| echo "REMOTE_PORT_FILE=$REMOTE_PORT_FILE" >> $GITHUB_OUTPUT | |
| fi |