diff --git a/.github/workflows/build-and-publish-bindings.yml b/.github/workflows/build-and-publish-bindings.yml index 4508d89..de1505e 100644 --- a/.github/workflows/build-and-publish-bindings.yml +++ b/.github/workflows/build-and-publish-bindings.yml @@ -17,12 +17,55 @@ on: required: true jobs: build: - runs-on: ubuntu-latest + permissions: + contents: read + packages: write + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + include: + - os: ubuntu-latest + jextract_url: https://download.java.net/java/early_access/jextract/25/2/openjdk-25-jextract+2-4_linux-x64_bin.tar.gz + jextract_archive: jdk.tar.gz + os_name: linux + gradle_cmd: ./gradlew + - os: windows-latest + jextract_url: https://download.java.net/java/early_access/jextract/25/2/openjdk-25-jextract+2-4_windows-x64_bin.tar.gz + jextract_archive: jdk.tar.gz + os_name: windows + gradle_cmd: .\gradlew.bat + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - - run: wget -O $RUNNER_TEMP/jdk.tar.gz https://download.java.net/java/early_access/jextract/25/2/openjdk-25-jextract+2-4_linux-x64_bin.tar.gz - - run: tar -xf $RUNNER_TEMP/jdk.tar.gz - - run: echo "JEXTRACT_HOME=$(pwd)/jextract-25" >> $GITHUB_ENV + + - name: Download jextract (Linux) + if: matrix.os == 'ubuntu-latest' + run: wget -O $RUNNER_TEMP/${{ matrix.jextract_archive }} ${{ matrix.jextract_url }} + + - name: Download jextract (Windows) + if: matrix.os == 'windows-latest' + run: | + Invoke-WebRequest -Uri "${{ matrix.jextract_url }}" -OutFile "$env:RUNNER_TEMP\${{ matrix.jextract_archive }}" + shell: pwsh + + - name: Extract jextract (Linux) + if: matrix.os == 'ubuntu-latest' + run: tar -xf $RUNNER_TEMP/${{ matrix.jextract_archive }} + + - name: Extract jextract (Windows) + if: matrix.os == 'windows-latest' + run: tar -xf $env:RUNNER_TEMP\${{ matrix.jextract_archive }} + shell: pwsh + + - name: Set JEXTRACT_HOME (Linux) + if: matrix.os == 'ubuntu-latest' + run: echo "JEXTRACT_HOME=$(pwd)/jextract-25" >> $GITHUB_ENV + + - name: Set JEXTRACT_HOME (Windows) + if: matrix.os == 'windows-latest' + run: echo "JEXTRACT_HOME=$((Get-Location).Path)\jextract-25" >> $env:GITHUB_ENV + shell: pwsh + - uses: actions/setup-java@v4 id: install-jdk with: @@ -35,25 +78,25 @@ jobs: gradle-version: wrapper - name: Download natives - run: ./gradlew -PwgpuVersion=${{ inputs.wgpuVersion }} :natives:download + run: ${{ matrix.gradle_cmd }} "-PwgpuVersion=${{ inputs.wgpuVersion }}" "-Pos=${{ matrix.os_name }}" :natives:download - name: Extract natives - run: ./gradlew -PwgpuVersion=${{ inputs.wgpuVersion }} :natives:unzip + run: ${{ matrix.gradle_cmd }} "-PwgpuVersion=${{ inputs.wgpuVersion }}" "-Pos=${{ matrix.os_name }}" :natives:unzip - name: Copy headers - run: ./gradlew -PwgpuVersion=${{ inputs.wgpuVersion }} ':natives:copyWgpuHeaders' + run: ${{ matrix.gradle_cmd }} "-PwgpuVersion=${{ inputs.wgpuVersion }}" "-Pos=${{ matrix.os_name }}" ':natives:copyWgpuHeaders' - name: Generate bindings - run: ./gradlew -PwgpuVersion=${{ inputs.wgpuVersion }} -Pjextract.home=${{ env.JEXTRACT_HOME }} :lib:bindings + run: ${{ matrix.gradle_cmd }} "-PwgpuVersion=${{ inputs.wgpuVersion }}" "-Pjextract.home=${{ env.JEXTRACT_HOME }}" :lib:bindings - name: Publish bindings as artifact uses: actions/upload-artifact@v4 with: - name: webgpu-bindings + name: webgpu-bindings-${{ matrix.os_name }} path: lib/build/webgpu.jar - name: Publish bindings to GH packages - run: ./gradlew -PwgpuVersion=${{ inputs.wgpuVersion }} :lib:publish + run: ${{ matrix.gradle_cmd }} "-PwgpuVersion=${{ inputs.wgpuVersion }}" :lib:publish env: GITHUB_USER: ${{ github.actor }} GITHUB_TOKEN: ${{ secrets.PKG_PUBLISHING_AUTH_TOKEN }} diff --git a/natives/build.gradle b/natives/build.gradle index e1d6212..19e8204 100644 --- a/natives/build.gradle +++ b/natives/build.gradle @@ -12,19 +12,24 @@ def wgpuVersion = project.findProperty('wgpuVersion') def os = project.hasProperty('os') ? project.findProperty('os') : 'linux' def arch = project.hasProperty('arch') ? project.findProperty('arch') : 'x86_64' def type = project.hasProperty('type') ? project.findProperty('type') : 'debug' +def toolchain = project.hasProperty('toolchain') ? project.findProperty('toolchain') : (os == 'windows' ? 'msvc' : null) + +// Construct the platform string based on OS +def platformString = (os == 'windows' && toolchain) ? "$os-$arch-$toolchain" : "$os-$arch" +def fileName = "wgpu-$platformString-${type}.zip" task download(type: Download) { - src "https://github.com/gfx-rs/wgpu-native/releases/download/$wgpuVersion/wgpu-$os-$arch-${type}.zip" - dest "bin/$wgpuVersion/$os-$arch-${type}.zip" + src "https://github.com/gfx-rs/wgpu-native/releases/download/$wgpuVersion/$fileName" + dest "bin/$wgpuVersion/$fileName" } task unzip(type: Copy) { - from zipTree("bin/$wgpuVersion/$os-$arch-${type}.zip") - into "bin/$wgpuVersion/$os-$arch-$type" + from zipTree("bin/$wgpuVersion/$fileName") + into "bin/$wgpuVersion/$platformString-$type" } task copyWgpuHeaders(type: Copy) { - from "bin/$wgpuVersion/$os-$arch-$type/include/webgpu/webgpu.h" + from "bin/$wgpuVersion/$platformString-$type/include/webgpu/webgpu.h" into 'build/headers/' }