diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 6621650e..308514c9 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -7,9 +7,7 @@ # libraries, and thus works on as many linuxes as possible. It's a thing from the # Python world, but generally useful. # -# Each target (os + architecture) is build in a seperate job. This is kinda verbose, -# resulting in some duplication, but at least its easy to read and maintain. -# Don't forget to add new jobs to the needs of the publish job. +# Each target (operating system + architecture) is built in grouped jobs by operating system. # # Each job should specify at least these env vars: # * TARGET: used in makefile to do cargo build --target $TARGET @@ -30,103 +28,25 @@ on: branches: [trunk, cd] jobs: - # ----- - linux-x86_64: - # Config - name: release - linux-x86_64 - runs-on: ubuntu-latest - env: - TARGET: x86_64-unknown-linux-gnu - ARCHIVE_NAME: wgpu-linux-x86_64 - TOOLCHAIN: stable-x86_64-unknown-linux-gnu - IMAGE: manylinux_2_28_x86_64 - steps: - # Common part (same for nearly each build) - - uses: actions/checkout@v4 - with: - submodules: true - - name: Set WGPU_NATIVE_VERSION - run: echo "WGPU_NATIVE_VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV - shell: bash - # Build - - name: Build - run: | - CID=$(docker create -t -w /tmp/wgpu-native -v $PWD:/tmp/src:ro -e TARGET -e ARCHIVE_NAME -e WGPU_NATIVE_VERSION quay.io/pypa/$IMAGE bash -c "\ - cp -r /tmp/src/. . && \ - rm -rf ./dist && \ - export PATH=/root/.cargo/bin:\$PATH && \ - export USER=root && \ - curl --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none && \ - rustup toolchain install --no-self-update $TOOLCHAIN && \ - rustup default $TOOLCHAIN && \ - dnf install clang-devel zip -y && \ - make package") - docker start -ai $CID - mkdir -p dist - docker cp $CID:/tmp/wgpu-native/dist/. dist/. - docker rm $CID - # Upload (same for each build) - - name: Upload - uses: actions/upload-artifact@v3 - with: - path: dist - name: dist # ----- - linux-aarch64: + iOS: # Config - name: release - linux-aarch64 - runs-on: ubuntu-latest - env: - TARGET: aarch64-unknown-linux-gnu - ARCHIVE_NAME: wgpu-linux-aarch64 - TOOLCHAIN: stable-aarch64-unknown-linux-gnu - IMAGE: manylinux_2_28_aarch64 - steps: - # Common part (same for nearly each build) - - uses: actions/checkout@v4 - with: - submodules: true - - name: Set WGPU_NATIVE_VERSION - run: echo "WGPU_NATIVE_VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV - shell: bash - # prepare qemu for cross-compilation - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - with: - platforms: arm64 - # Build - - name: Build - run: | - CID=$(docker create --platform linux/arm64 -t -w /tmp/wgpu-native -v $PWD:/tmp/src:ro -e TARGET -e ARCHIVE_NAME -e WGPU_NATIVE_VERSION quay.io/pypa/$IMAGE bash -c "\ - cp -r /tmp/src/. . && \ - rm -rf ./dist && \ - export PATH=/root/.cargo/bin:\$PATH && \ - export USER=root && \ - curl --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none && \ - rustup toolchain install --no-self-update $TOOLCHAIN && \ - rustup default $TOOLCHAIN && \ - dnf install clang-devel zip -y && \ - make package") - docker start -ai $CID - mkdir -p dist - docker cp $CID:/tmp/wgpu-native/dist/. dist/. - docker rm $CID - # Upload (same for each build) - - name: Upload - uses: actions/upload-artifact@v3 - with: - path: dist - name: dist - - # ----- - windows-x86_64: - # Config - name: release - windows-x86_64 - runs-on: windows-latest + name: release - ${{ matrix.name }} + runs-on: macos-latest + strategy: + fail-fast: true + matrix: + include: + - name: iOS-aarch64 + target: aarch64-apple-ios + - name: iOS-aarch64-simulator + target: aarch64-apple-ios-sim + - name: iOS-x86_64-simulator + target: x86_64-apple-ios env: - TARGET: x86_64-pc-windows-msvc - ARCHIVE_NAME: wgpu-windows-x86_64 + TARGET: ${{ matrix.target }} + ARCHIVE_NAME: wgpu-${{ matrix.name }} steps: # Common part (same for each build) - uses: actions/checkout@v4 @@ -138,40 +58,93 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: - toolchain: stable-msvc - targets: ${{ env.TARGET }} + toolchain: stable + - name: Add iOS targets + run: rustup target add ${{ matrix.TARGET }} - name: Setup caching uses: Swatinem/rust-cache@v2 with: - key: build-${{ env.TARGET }}-${{ env.CACHE_SUFFIX }} + key: build-${{ matrix.TARGET }}-${{ matrix.CACHE_SUFFIX }} # Build - - name: Install llvm - run: | - set -x - choco install -y llvm - echo "LIBCLANG_PATH=C:\Program Files\LLVM\lib" >> $GITHUB_ENV - shell: bash - name: Build run: make package - shell: bash # Upload (same for each build) - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist - name: dist + name: ${{ env.ARCHIVE_NAME }} # ----- - windows-i686: - # Config - name: release - windows-i686 - runs-on: windows-latest + android: + name: release - ${{ matrix.name }} + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + include: + - name: android-i686 + target: i686-linux-android + setup_env: | + set -x + ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.12077973 + CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/i686-linux-android21-clang + + echo "CC=$CC" >> $GITHUB_ENV + echo "CXX=$CC++" >> $GITHUB_ENV + echo "CLANG_PATH=$CC" >> $GITHUB_ENV + echo "CARGO_TARGET_I686_LINUX_ANDROID_LINKER=$CC" >> $GITHUB_ENV + + echo "LLVM_CONFIG_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-config" >> $GITHUB_ENV + echo "BINDGEN_EXTRA_CLANG_ARGS='-isysroot $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot'" >> $GITHUB_ENV + - name: android-x86_64 + target: x86_64-linux-android + setup_env: | + set -x + ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.12077973 + CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/x86_64-linux-android21-clang + + echo "CC=$CC" >> $GITHUB_ENV + echo "CXX=$CC++" >> $GITHUB_ENV + echo "CLANG_PATH=$CC" >> $GITHUB_ENV + echo "CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$CC" >> $GITHUB_ENV + + echo "LLVM_CONFIG_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-config" >> $GITHUB_ENV + echo "BINDGEN_EXTRA_CLANG_ARGS='-isysroot $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot'" >> $GITHUB_ENV + - name: android-aarch64 + target: aarch64-linux-android + setup_env: | + set -x + ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.12077973 + CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang + + echo "CC=$CC" >> $GITHUB_ENV + echo "CXX=$CC++" >> $GITHUB_ENV + echo "CLANG_PATH=$CC" >> $GITHUB_ENV + echo "CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$CC" >> $GITHUB_ENV + + echo "LLVM_CONFIG_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-config" >> $GITHUB_ENV + echo "BINDGEN_EXTRA_CLANG_ARGS='-isysroot $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot'" >> $GITHUB_ENV + - name: android-armv7 + target: armv7-linux-androideabi + setup_env: | + set -x + ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.12077973 + CC=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang + + echo "CC=$CC" >> $GITHUB_ENV + echo "CXX=$CC++" >> $GITHUB_ENV + echo "CLANG_PATH=$CC" >> $GITHUB_ENV + echo "CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$CC" >> $GITHUB_ENV + + echo "LLVM_CONFIG_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-config" >> $GITHUB_ENV + echo "BINDGEN_EXTRA_CLANG_ARGS='-isysroot $ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot'" >> $GITHUB_ENV env: - TARGET: i686-pc-windows-msvc - ARCHIVE_NAME: wgpu-windows-i686 + TARGET: ${{ matrix.target }} + ARCHIVE_NAME: wgpu-${{ matrix.name }} steps: - # Common part (same for each build) - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 with: submodules: true - name: Set WGPU_NATIVE_VERSION @@ -180,74 +153,109 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: - toolchain: stable-i686-pc-windows-msvc - targets: ${{ env.TARGET }} + target: ${{ matrix.target }} - name: Setup caching uses: Swatinem/rust-cache@v2 with: - key: build-${{ env.TARGET }}-${{ env.CACHE_SUFFIX }} - # Build - - name: Install llvm - run: | - set -x - choco install -y --x86 --force llvm - echo "LIBCLANG_PATH=C:\Program Files (x86)\LLVM\lib" >> $GITHUB_ENV - shell: bash + key: build-${{ matrix.TARGET }}-${{ matrix.CACHE_SUFFIX }} + - name: Setup Environment + run: ${{ matrix.setup_env }} - name: Build run: make package shell: bash # Upload (same for each build) - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist - name: dist + name: ${{ env.ARCHIVE_NAME }} # ----- - windows-aarch64: + linux: # Config - name: release - windows-aarch64 - runs-on: windows-latest + name: release - ${{ matrix.name }} + runs-on: ubuntu-latest + strategy: + fail-fast: true + matrix: + include: + - name: linux-x86_64 + target: x86_64-unknown-linux-gnu + image: manylinux_2_28_x86_64 + - name: linux-aarch64 + target: aarch64-unknown-linux-gnu + image: manylinux_2_28_aarch64 env: - TARGET: aarch64-pc-windows-msvc - ARCHIVE_NAME: wgpu-windows-aarch64 + TARGET: ${{ matrix.target }} + ARCHIVE_NAME: wgpu-${{ matrix.name }} + TOOLCHAIN: stable-${{ matrix.target }} + IMAGE: ${{ matrix.image }} steps: - # Common part (same for each build) + # Common part (same for nearly each build) - uses: actions/checkout@v4 with: submodules: true - name: Set WGPU_NATIVE_VERSION run: echo "WGPU_NATIVE_VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV shell: bash - - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ env.TARGET }} - - name: Setup caching - uses: Swatinem/rust-cache@v2 + # prepare qemu for cross-compilation + - name: Set up QEMU + if: matrix.image == 'manylinux_2_28_aarch64' + uses: docker/setup-qemu-action@v3 with: - key: build-${{ env.TARGET }}-${{ env.CACHE_SUFFIX }} + platforms: arm64 # Build - name: Build - run: make package - shell: bash + run: | + CID=$(docker create -t -w /tmp/wgpu-native -v $PWD:/tmp/src:ro -e TARGET -e ARCHIVE_NAME -e WGPU_NATIVE_VERSION quay.io/pypa/$IMAGE bash -c "\ + cp -r /tmp/src/. . && \ + rm -rf ./dist && \ + export PATH=/root/.cargo/bin:\$PATH && \ + export USER=root && \ + curl --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none && \ + rustup toolchain install --no-self-update $TOOLCHAIN && \ + rustup default $TOOLCHAIN && \ + dnf install clang-devel zip -y && \ + make package") + docker start -ai $CID + mkdir -p dist + docker cp $CID:/tmp/wgpu-native/dist/. dist/. + docker rm $CID # Upload (same for each build) - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist - name: dist + name: ${{ env.ARCHIVE_NAME }} # ----- - macos-x86_64: + windows: # Config - name: release - macos-x86_64 - runs-on: macos-latest + name: release - ${{ matrix.name }} + runs-on: windows-latest + strategy: + fail-fast: true + matrix: + include: + - name: windows-x86_64 - MSVC + target: x86_64-pc-windows-msvc + archive-name: windows-x86_64-msvc + toolchain: stable-msvc + - name: windows-i686 - MSVC + target: i686-pc-windows-msvc + archive-name: windows-i686-msvc + toolchain: stable-msvc + - name: windows-aarch64 - MSVC + target: aarch64-pc-windows-msvc + archive-name: windows-aarch64-msvc + toolchain: stable-msvc + - name: windows-x86_64 - GNU + target: x86_64-pc-windows-gnu + archive-name: windows-x86_64-gnu + toolchain: stable-gnu env: - TARGET: x86_64-apple-darwin - ARCHIVE_NAME: wgpu-macos-x86_64 - MACOSX_DEPLOYMENT_TARGET: "10.13" - RUSTFLAGS: "-C link-args=-Wl,-install_name,@rpath/libwgpu_native.dylib" + TARGET: ${{ matrix.target }} + ARCHIVE_NAME: wgpu-${{ matrix.archive-name }} steps: # Common part (same for each build) - uses: actions/checkout@v4 @@ -259,6 +267,7 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: + toolchain: ${{ matrix.toolchain }} targets: ${{ env.TARGET }} - name: Setup caching uses: Swatinem/rust-cache@v2 @@ -267,22 +276,33 @@ jobs: # Build - name: Build run: make package + shell: bash # Upload (same for each build) - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist - name: dist + name: ${{ env.ARCHIVE_NAME }} # ----- - macos-aarch64: + macos: # Config - name: release - macos-aarch64 - runs-on: macos-14 + name: release - ${{ matrix.name }} + runs-on: macos-latest + strategy: + fail-fast: true + matrix: + include: + - name: macos-x86_64 + target: x86_64-apple-darwin + archive-name: macos-x86_64 + - name: macos-aarch64 + target: aarch64-apple-darwin + archive-name: macos-aarch64 env: - TARGET: aarch64-apple-darwin - ARCHIVE_NAME: wgpu-macos-aarch64 - MACOSX_DEPLOYMENT_TARGET: "11.0" + TARGET: ${{ matrix.target }} + ARCHIVE_NAME: wgpu-${{ matrix.archive-name }} + MACOSX_DEPLOYMENT_TARGET: "10.13" RUSTFLAGS: "-C link-args=-Wl,-install_name,@rpath/libwgpu_native.dylib" steps: # Common part (same for each build) @@ -305,10 +325,10 @@ jobs: run: make package # Upload (same for each build) - name: Upload - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: dist - name: dist + name: ${{ env.ARCHIVE_NAME }} # Create a Github release and upload the binary libs that we just built. # There should be a release and debug build for each platform (win32, win64, MacOS64, Linux64), @@ -316,13 +336,11 @@ jobs: publish: name: Publish Github release needs: - - linux-x86_64 - - linux-aarch64 - - windows-x86_64 - - windows-i686 - - windows-aarch64 - - macos-x86_64 - - macos-aarch64 + - iOS + - android + - linux + - windows + - macos runs-on: ubuntu-latest if: success() && contains(github.ref, 'tags/v') steps: @@ -332,9 +350,8 @@ jobs: echo "WGPU_NATIVE_VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV shell: bash - name: Download assets - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: dist path: dist - name: Create commit-sha file env: @@ -347,12 +364,12 @@ jobs: tag_name: ${{ env.WGPU_NATIVE_VERSION }} name: ${{ env.WGPU_NATIVE_VERSION }} files: | - dist/*.zip + dist/**/*.zip dist/commit-sha body: | Autogenerated binary modules. The Linux builds are built on AlmaLinux 8 [manylinux_2_28](https://github.com/pypa/manylinux#manylinux). The MacOS builds target MacOS 10.13 High Sierra and up. - The Windows builds are built using MSVC. + The Windows builds are built using MSVC on all architectures and GNU on x64. draft: false prerelease: false diff --git a/Makefile b/Makefile index b56a1132..cd408046 100644 --- a/Makefile +++ b/Makefile @@ -51,7 +51,11 @@ package: lib-native lib-native-release LIBDIR=$(TARGET_DIR)/$$RELEASE; \ rm -f dist/$$ARCHIVE; \ if [ $(OS_NAME) = windows ]; then \ - 7z a -tzip dist/$$ARCHIVE ./$$LIBDIR/wgpu_native.dll ./$$LIBDIR/wgpu_native.dll.lib ./$$LIBDIR/wgpu_native.pdb ./$$LIBDIR/wgpu_native.lib ./ffi/webgpu-headers/*.h ./ffi/wgpu.h ./dist/commit-sha; \ + if [[ "$(TARGET)" == *"gnu"* ]]; then \ + 7z a -tzip dist/$$ARCHIVE ./$$LIBDIR/wgpu_native.dll ./$$LIBDIR/libwgpu_native.dll.a ./$$LIBDIR/libwgpu_native.a ./ffi/webgpu-headers/*.h ./ffi/wgpu.h ./dist/commit-sha; \ + else \ + 7z a -tzip dist/$$ARCHIVE ./$$LIBDIR/wgpu_native.dll ./$$LIBDIR/wgpu_native.dll.lib ./$$LIBDIR/wgpu_native.pdb ./$$LIBDIR/wgpu_native.lib ./ffi/webgpu-headers/*.h ./ffi/wgpu.h ./dist/commit-sha; \ + fi; \ else \ zip -j dist/$$ARCHIVE ./$$LIBDIR/libwgpu_native.so ./$$LIBDIR/libwgpu_native.dylib ./$$LIBDIR/libwgpu_native.a ./ffi/webgpu-headers/*.h ./ffi/wgpu.h ./dist/commit-sha; \ fi; \