From d89b8ab5aee59bd7ed468f30ac91be74d5b1cb85 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 9 Jun 2026 12:13:28 +0200 Subject: [PATCH 01/14] adding windows specific workflow --- .github/workflows/build_and_test.yml | 123 ++++++++++++++++++++++ .github/workflows/publish_version.yml | 144 +++++++++++++++++++++++++- 2 files changed, 266 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 2a01bd0..9e2e8bf 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -88,3 +88,126 @@ jobs: OUTPUT=$(python -c "from cuvis_il import cuvis_il; print(cuvis_il.cuvis_version_swig())") echo "Version output: $OUTPUT" echo "$OUTPUT" | grep -q "CUBERT SDK" || (echo "Version check failed!" && exit 1) + + setup-windows-deps: + needs: prepare + runs-on: windows-latest + steps: + - name: Cache SWIG 4.2.1 + id: cache-swig + uses: actions/cache@v4 + with: + path: C:\swigwin-4.2.1 + key: swigwin-4.2.1 + + - name: Install SWIG 4.2.1 + if: steps.cache-swig.outputs.cache-hit != 'true' + shell: pwsh + run: | + Invoke-WebRequest ` + "https://downloads.sourceforge.net/project/swig/swigwin/swigwin-4.2.1/swigwin-4.2.1.zip" ` + -OutFile swigwin.zip + Expand-Archive swigwin.zip -DestinationPath C:\ + + - name: Cache CUVIS SDK + id: cache-cuvis + uses: actions/cache@v4 + with: + path: C:\Program Files\Cuvis + key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + + - name: Download and install CUVIS SDK + if: steps.cache-cuvis.outputs.cache-hit != 'true' + shell: pwsh + env: + CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} + run: | + $v = $env:CUVIS_VERSION + $vn = $v -replace '\.', '' + Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" ` + -OutFile cuvis_sdk.zip + Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | + Where-Object { $_.DirectoryName -match 'Windows' } | + Select-Object -First 1 + Write-Output "Installing: $($installer.FullName)" + Start-Process -Wait -FilePath $installer.FullName -ArgumentList '/S' + + build-and-test-windows: + needs: [prepare, setup-windows-deps] + strategy: + fail-fast: false + matrix: + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + include: + - { python: "3.9", numpy: "2.0.0" } + - { python: "3.10", numpy: "2.0.0" } + - { python: "3.11", numpy: "2.0.0" } + - { python: "3.12", numpy: "2.0.0" } + - { python: "3.13", numpy: "2.1.0" } + - { python: "3.14", numpy: "2.3.2" } + runs-on: windows-latest + + steps: + - name: Restore SWIG cache + uses: actions/cache@v4 + with: + path: C:\swigwin-4.2.1 + key: swigwin-4.2.1 + + - name: Restore CUVIS SDK cache + uses: actions/cache@v4 + with: + path: C:\Program Files\Cuvis + key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + + - name: Add SWIG to PATH + shell: pwsh + run: echo "C:\swigwin-4.2.1" >> $env:GITHUB_PATH + + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Python ${{ matrix.python }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + + - name: Create venv and install Python build dependencies + shell: pwsh + run: | + python -m venv venv + .\venv\Scripts\Activate.ps1 + pip install --upgrade pip setuptools wheel build + pip install numpy==${{ matrix.numpy }} + + - name: CMake configure and build + shell: pwsh + run: | + cmake -DCMAKE_BUILD_TYPE=Release ` + -DDOXYGEN_BUILD_DOCUMENTATION=FALSE ` + -DSWIG_DIR="C:\swigwin-4.2.1\Lib" ` + -DSWIG_EXECUTABLE="C:\swigwin-4.2.1\swig.exe" ` + -DPython_ROOT_DIR="${{ github.workspace }}\venv" ` + -B build . + cmake --build build --target cuvis_pyil --config Release + + - name: Copy built files and install package + shell: bash + run: | + chmod +x ./copy_pyil_files.sh + ./copy_pyil_files.sh build/Release + source venv/Scripts/activate + pip install . + + - name: Smoke test - verify import and version + env: + CUVIS: C:\Program Files\Cuvis\bin + shell: bash + run: | + source venv/Scripts/activate + OUTPUT=$(python -c "from cuvis_il import cuvis_il; print(cuvis_il.cuvis_version_swig())") + echo "Version output: $OUTPUT" + echo "$OUTPUT" | grep -q "CUBERT SDK" || (echo "Version check failed!" && exit 1) diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 68f0ba8..15d906e 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -141,8 +141,150 @@ jobs: name: wheel-ubuntu${{ matrix.ubuntu }}-py${{ matrix.python }}-${{ matrix.arch }} path: dist/*.whl + setup-windows-deps: + needs: prepare + runs-on: windows-latest + steps: + - name: Cache SWIG 4.2.1 + id: cache-swig + uses: actions/cache@v4 + with: + path: C:\swigwin-4.2.1 + key: swigwin-4.2.1 + + - name: Install SWIG 4.2.1 + if: steps.cache-swig.outputs.cache-hit != 'true' + shell: pwsh + run: | + Invoke-WebRequest ` + "https://downloads.sourceforge.net/project/swig/swigwin/swigwin-4.2.1/swigwin-4.2.1.zip" ` + -OutFile swigwin.zip + Expand-Archive swigwin.zip -DestinationPath C:\ + + - name: Cache CUVIS SDK + id: cache-cuvis + uses: actions/cache@v4 + with: + path: C:\Program Files\Cuvis + key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + + - name: Download and install CUVIS SDK + if: steps.cache-cuvis.outputs.cache-hit != 'true' + shell: pwsh + env: + CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} + run: | + $v = $env:CUVIS_VERSION + $vn = $v -replace '\.', '' + Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" ` + -OutFile cuvis_sdk.zip + Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | + Where-Object { $_.DirectoryName -match 'Windows' } | + Select-Object -First 1 + Write-Output "Installing: $($installer.FullName)" + Start-Process -Wait -FilePath $installer.FullName -ArgumentList '/S' + + build-windows: + needs: [prepare, setup-windows-deps] + strategy: + fail-fast: false + matrix: + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + include: + - { python: "3.9", numpy: "2.0.0" } + - { python: "3.10", numpy: "2.0.0" } + - { python: "3.11", numpy: "2.0.0" } + - { python: "3.12", numpy: "2.0.0" } + - { python: "3.13", numpy: "2.1.0" } + - { python: "3.14", numpy: "2.3.2" } + runs-on: windows-latest + + permissions: + contents: read + + steps: + - name: Restore SWIG cache + uses: actions/cache@v4 + with: + path: C:\swigwin-4.2.1 + key: swigwin-4.2.1 + + - name: Restore CUVIS SDK cache + uses: actions/cache@v4 + with: + path: C:\Program Files\Cuvis + key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + + - name: Add SWIG to PATH + shell: pwsh + run: echo "C:\swigwin-4.2.1" >> $env:GITHUB_PATH + + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + submodules: recursive + + - name: Setup Python ${{ matrix.python }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + + - name: Create venv and install Python build dependencies + shell: pwsh + run: | + python -m venv venv + .\venv\Scripts\Activate.ps1 + pip install --upgrade pip setuptools wheel build + pip install numpy==${{ matrix.numpy }} + + - name: CMake configure and build + shell: pwsh + run: | + cmake -DCMAKE_BUILD_TYPE=Release ` + -DDOXYGEN_BUILD_DOCUMENTATION=FALSE ` + -DSWIG_DIR="C:\swigwin-4.2.1\Lib" ` + -DSWIG_EXECUTABLE="C:\swigwin-4.2.1\swig.exe" ` + -DPython_ROOT_DIR="${{ github.workspace }}\venv" ` + -B build . + cmake --build build --target cuvis_pyil --config Release + + - name: Copy built files and package wheel + shell: bash + run: | + rm -rf ./cuvis_il/*cuvis* + rm -rf ./dist/*.whl + chmod +x ./copy_pyil_files.sh + ./copy_pyil_files.sh build/Release + source venv/Scripts/activate + python -m build --wheel --no-isolation + + - name: Tag wheel with correct Python and platform tags + shell: bash + run: | + source venv/Scripts/activate + PYTHON_TAG="py$(echo '${{ matrix.python }}' | tr -d '.')" + WHEELS=$(find dist -type f -name "*.whl") + WHEEL_COUNT=$(echo "$WHEELS" | wc -l) + if [ "$WHEEL_COUNT" -ne 1 ]; then + echo "Expected exactly 1 wheel, found $WHEEL_COUNT" + exit 1 + fi + echo "Tagging $WHEELS with --python-tag=$PYTHON_TAG --platform-tag=win_amd64" + python -m wheel tags --remove \ + --python-tag="$PYTHON_TAG" \ + --platform-tag=win_amd64 \ + "$WHEELS" + + - name: Upload wheel artifact + uses: actions/upload-artifact@v4 + with: + name: wheel-windows-py${{ matrix.python }} + path: dist/*.whl + preflight: - needs: [prepare, build] + needs: [prepare, build, build-windows] runs-on: ubuntu-latest permissions: From 4c781fca806eed0a804da940cc94303dd5b01359 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 9 Jun 2026 12:17:22 +0200 Subject: [PATCH 02/14] wip invoke-webrequest --- .github/workflows/build_and_test.yml | 7 ++----- .github/workflows/publish_version.yml | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 9e2e8bf..3417be6 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -104,9 +104,7 @@ jobs: if: steps.cache-swig.outputs.cache-hit != 'true' shell: pwsh run: | - Invoke-WebRequest ` - "https://downloads.sourceforge.net/project/swig/swigwin/swigwin-4.2.1/swigwin-4.2.1.zip" ` - -OutFile swigwin.zip + Invoke-WebRequest "https://github.com/swig/swig/releases/download/v4.2.1/swigwin-4.2.1.zip" -OutFile swigwin.zip Expand-Archive swigwin.zip -DestinationPath C:\ - name: Cache CUVIS SDK @@ -124,8 +122,7 @@ jobs: run: | $v = $env:CUVIS_VERSION $vn = $v -replace '\.', '' - Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" ` - -OutFile cuvis_sdk.zip + Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | Where-Object { $_.DirectoryName -match 'Windows' } | diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 15d906e..18e94cd 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -156,9 +156,7 @@ jobs: if: steps.cache-swig.outputs.cache-hit != 'true' shell: pwsh run: | - Invoke-WebRequest ` - "https://downloads.sourceforge.net/project/swig/swigwin/swigwin-4.2.1/swigwin-4.2.1.zip" ` - -OutFile swigwin.zip + Invoke-WebRequest "https://github.com/swig/swig/releases/download/v4.2.1/swigwin-4.2.1.zip" -OutFile swigwin.zip Expand-Archive swigwin.zip -DestinationPath C:\ - name: Cache CUVIS SDK @@ -176,8 +174,7 @@ jobs: run: | $v = $env:CUVIS_VERSION $vn = $v -replace '\.', '' - Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" ` - -OutFile cuvis_sdk.zip + Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | Where-Object { $_.DirectoryName -match 'Windows' } | From 6e5a092ca5b23b03296d3762096645620d18b7f8 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 9 Jun 2026 12:24:00 +0200 Subject: [PATCH 03/14] fix: download swig from winget instead --- .github/workflows/build_and_test.yml | 38 +++++++-------------------- .github/workflows/publish_version.yml | 38 +++++++-------------------- 2 files changed, 18 insertions(+), 58 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 3417be6..5d7e8a6 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -93,20 +93,6 @@ jobs: needs: prepare runs-on: windows-latest steps: - - name: Cache SWIG 4.2.1 - id: cache-swig - uses: actions/cache@v4 - with: - path: C:\swigwin-4.2.1 - key: swigwin-4.2.1 - - - name: Install SWIG 4.2.1 - if: steps.cache-swig.outputs.cache-hit != 'true' - shell: pwsh - run: | - Invoke-WebRequest "https://github.com/swig/swig/releases/download/v4.2.1/swigwin-4.2.1.zip" -OutFile swigwin.zip - Expand-Archive swigwin.zip -DestinationPath C:\ - - name: Cache CUVIS SDK id: cache-cuvis uses: actions/cache@v4 @@ -146,11 +132,14 @@ jobs: runs-on: windows-latest steps: - - name: Restore SWIG cache - uses: actions/cache@v4 - with: - path: C:\swigwin-4.2.1 - key: swigwin-4.2.1 + - name: Install SWIG 4.2.1 + shell: pwsh + run: | + winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements + $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 + $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 + echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV + echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV - name: Restore CUVIS SDK cache uses: actions/cache@v4 @@ -158,10 +147,6 @@ jobs: path: C:\Program Files\Cuvis key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Add SWIG to PATH - shell: pwsh - run: echo "C:\swigwin-4.2.1" >> $env:GITHUB_PATH - - name: Checkout uses: actions/checkout@v4 with: @@ -183,12 +168,7 @@ jobs: - name: CMake configure and build shell: pwsh run: | - cmake -DCMAKE_BUILD_TYPE=Release ` - -DDOXYGEN_BUILD_DOCUMENTATION=FALSE ` - -DSWIG_DIR="C:\swigwin-4.2.1\Lib" ` - -DSWIG_EXECUTABLE="C:\swigwin-4.2.1\swig.exe" ` - -DPython_ROOT_DIR="${{ github.workspace }}\venv" ` - -B build . + cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" -B build . cmake --build build --target cuvis_pyil --config Release - name: Copy built files and install package diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 18e94cd..2b5b67d 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -145,20 +145,6 @@ jobs: needs: prepare runs-on: windows-latest steps: - - name: Cache SWIG 4.2.1 - id: cache-swig - uses: actions/cache@v4 - with: - path: C:\swigwin-4.2.1 - key: swigwin-4.2.1 - - - name: Install SWIG 4.2.1 - if: steps.cache-swig.outputs.cache-hit != 'true' - shell: pwsh - run: | - Invoke-WebRequest "https://github.com/swig/swig/releases/download/v4.2.1/swigwin-4.2.1.zip" -OutFile swigwin.zip - Expand-Archive swigwin.zip -DestinationPath C:\ - - name: Cache CUVIS SDK id: cache-cuvis uses: actions/cache@v4 @@ -201,11 +187,14 @@ jobs: contents: read steps: - - name: Restore SWIG cache - uses: actions/cache@v4 - with: - path: C:\swigwin-4.2.1 - key: swigwin-4.2.1 + - name: Install SWIG 4.2.1 + shell: pwsh + run: | + winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements + $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 + $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 + echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV + echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV - name: Restore CUVIS SDK cache uses: actions/cache@v4 @@ -213,10 +202,6 @@ jobs: path: C:\Program Files\Cuvis key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Add SWIG to PATH - shell: pwsh - run: echo "C:\swigwin-4.2.1" >> $env:GITHUB_PATH - - name: Checkout uses: actions/checkout@v4 with: @@ -239,12 +224,7 @@ jobs: - name: CMake configure and build shell: pwsh run: | - cmake -DCMAKE_BUILD_TYPE=Release ` - -DDOXYGEN_BUILD_DOCUMENTATION=FALSE ` - -DSWIG_DIR="C:\swigwin-4.2.1\Lib" ` - -DSWIG_EXECUTABLE="C:\swigwin-4.2.1\swig.exe" ` - -DPython_ROOT_DIR="${{ github.workspace }}\venv" ` - -B build . + cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" -B build . cmake --build build --target cuvis_pyil --config Release - name: Copy built files and package wheel From be64cae044b47e349147df6bb9f4a964aa029320 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 9 Jun 2026 12:45:20 +0200 Subject: [PATCH 04/14] fix: sdk install hangup --- .github/workflows/build_and_test.yml | 6 ++---- .github/workflows/publish_version.yml | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 5d7e8a6..7f6c1ad 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -110,11 +110,9 @@ jobs: $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk - $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | - Where-Object { $_.DirectoryName -match 'Windows' } | - Select-Object -First 1 + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\Windows\" -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" - Start-Process -Wait -FilePath $installer.FullName -ArgumentList '/S' + Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait build-and-test-windows: needs: [prepare, setup-windows-deps] diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 2b5b67d..80ea644 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -162,11 +162,9 @@ jobs: $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk - $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "*.exe" | - Where-Object { $_.DirectoryName -match 'Windows' } | - Select-Object -First 1 + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\Windows\" -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" - Start-Process -Wait -FilePath $installer.FullName -ArgumentList '/S' + Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait build-windows: needs: [prepare, setup-windows-deps] From 152508e713a8ed6fdf53cc4e1613a92368091586 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 9 Jun 2026 12:51:27 +0200 Subject: [PATCH 05/14] fix: wrong foldername --- .github/workflows/build_and_test.yml | 2 +- .github/workflows/publish_version.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 7f6c1ad..b1427ca 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -110,7 +110,7 @@ jobs: $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk - $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\Windows\" -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 80ea644..9857147 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -162,7 +162,7 @@ jobs: $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk - $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\Windows\" -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 + $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait From f03cbc640b3fecfa31edfe973e22cd35408a8ec2 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 16 Jun 2026 15:01:54 +0200 Subject: [PATCH 06/14] adding diagnostics workflow --- .github/workflows/build_and_test.yml | 37 +++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b1427ca..0a3bf20 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -112,7 +112,42 @@ jobs: Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" - Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait + + $logDir = Join-Path $env:RUNNER_TEMP 'cuvis_install' + New-Item -ItemType Directory -Force -Path $logDir | Out-Null + $nsisLog = Join-Path $logDir 'install.log' + + # -PassThru + poll loop instead of -Wait: the installer has hung indefinitely on a + # headless runner (nested sub-installer / NSIS MessageBox waiting for input that /S + # does not suppress). Bound the wait and log what is blocking so it fails fast. + $proc = Start-Process $installer.FullName -ArgumentList '/S', "/LOG=$nsisLog", '/NORESTART' -PassThru + $timeoutSec = 600; $elapsed = 0 + while (-not $proc.HasExited -and $elapsed -lt $timeoutSec) { + Start-Sleep -Seconds 20; $elapsed += 20 + Write-Output "== t=${elapsed}s : installer still running ==" + Get-Process | Where-Object { $_.MainWindowTitle } | + Select-Object Id, ProcessName, MainWindowTitle | Format-Table -Auto | Out-String | Write-Output + Get-CimInstance Win32_Process | + Where-Object { $_.Name -match 'setup|install|msiexec|ebus|vc_redist|cuda|nvidia' } | + Select-Object ProcessId, ParentProcessId, Name, CommandLine | Format-Table -Auto | Out-String | Write-Output + } + + if (-not $proc.HasExited) { + Write-Output "::error::Installer did not finish within $timeoutSec s" + if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } + Get-ChildItem $env:TEMP -Recurse -Filter '*.log' -ErrorAction SilentlyContinue | + Select-Object -First 20 | ForEach-Object { + Write-Output "----- $($_.FullName) -----"; Get-Content $_.FullName -ErrorAction SilentlyContinue } + Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue + exit 1 + } + + Write-Output "Installer exit code: $($proc.ExitCode)" + if ($proc.ExitCode -ne 0) { if (Test-Path $nsisLog) { Get-Content $nsisLog }; exit 1 } + + # Verify before the cache post-step runs, so a partial install can't poison the cache: + if (-not (Test-Path 'C:\Program Files\Cuvis\bin')) { Write-Output "::error::C:\Program Files\Cuvis\bin missing"; exit 1 } + Write-Output "CUVIS SDK installed:"; Get-ChildItem 'C:\Program Files\Cuvis\bin' | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output build-and-test-windows: needs: [prepare, setup-windows-deps] From bf8694c8e17f94430ed09bd20f360dce735e3ed6 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 16 Jun 2026 15:30:36 +0200 Subject: [PATCH 07/14] fix: workaround non-existing installer --- .github/workflows/build_and_test.yml | 47 ++++++++++++++------------- .github/workflows/publish_version.yml | 40 ++++++++++++++++++++++- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 0a3bf20..731e25b 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -116,38 +116,41 @@ jobs: $logDir = Join-Path $env:RUNNER_TEMP 'cuvis_install' New-Item -ItemType Directory -Force -Path $logDir | Out-Null $nsisLog = Join-Path $logDir 'install.log' + $cuvisBin = 'C:\Program Files\Cuvis\bin' - # -PassThru + poll loop instead of -Wait: the installer has hung indefinitely on a - # headless runner (nested sub-installer / NSIS MessageBox waiting for input that /S - # does not suppress). Bound the wait and log what is blocking so it fails fast. + # The installer silently runs the bundled Allied Vision VimbaX GigE-driver sub-installer. + # On a headless runner that sub-install leaves an orphan msiexec holding the pipe handle, + # so the NSIS ExecWait never returns and the installer process hangs forever -- even though + # the SDK files DO land on disk. So we wait for the installed files to appear (not for the + # process to exit), then terminate the stuck installer and continue. $proc = Start-Process $installer.FullName -ArgumentList '/S', "/LOG=$nsisLog", '/NORESTART' -PassThru - $timeoutSec = 600; $elapsed = 0 - while (-not $proc.HasExited -and $elapsed -lt $timeoutSec) { - Start-Sleep -Seconds 20; $elapsed += 20 - Write-Output "== t=${elapsed}s : installer still running ==" - Get-Process | Where-Object { $_.MainWindowTitle } | - Select-Object Id, ProcessName, MainWindowTitle | Format-Table -Auto | Out-String | Write-Output + $timeoutSec = 600; $elapsed = 0; $installed = $false + while ($elapsed -lt $timeoutSec) { + if (Test-Path "$cuvisBin\*.dll") { $installed = $true; break } + if ($proc.HasExited) { break } + Start-Sleep -Seconds 15; $elapsed += 15 + Write-Output "== t=${elapsed}s : waiting for SDK files (binExists=$(Test-Path $cuvisBin)) ==" Get-CimInstance Win32_Process | - Where-Object { $_.Name -match 'setup|install|msiexec|ebus|vc_redist|cuda|nvidia' } | - Select-Object ProcessId, ParentProcessId, Name, CommandLine | Format-Table -Auto | Out-String | Write-Output + Where-Object { $_.Name -match 'setup|install|msiexec|vimba|ebus|vc_redist|cuda|nvidia' } | + Select-Object ProcessId, ParentProcessId, Name | Format-Table -Auto | Out-String | Write-Output } + if (-not $installed) { Start-Sleep -Seconds 5; $installed = [bool](Test-Path "$cuvisBin\*.dll") } + if (-not $proc.HasExited) { - Write-Output "::error::Installer did not finish within $timeoutSec s" - if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } - Get-ChildItem $env:TEMP -Recurse -Filter '*.log' -ErrorAction SilentlyContinue | - Select-Object -First 20 | ForEach-Object { - Write-Output "----- $($_.FullName) -----"; Get-Content $_.FullName -ErrorAction SilentlyContinue } + Write-Output "Installer process still running (known VimbaX/msiexec ExecWait hang) - terminating it." Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue - exit 1 + } else { + Write-Output "Installer exit code: $($proc.ExitCode)" } - Write-Output "Installer exit code: $($proc.ExitCode)" - if ($proc.ExitCode -ne 0) { if (Test-Path $nsisLog) { Get-Content $nsisLog }; exit 1 } - # Verify before the cache post-step runs, so a partial install can't poison the cache: - if (-not (Test-Path 'C:\Program Files\Cuvis\bin')) { Write-Output "::error::C:\Program Files\Cuvis\bin missing"; exit 1 } - Write-Output "CUVIS SDK installed:"; Get-ChildItem 'C:\Program Files\Cuvis\bin' | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output + if (-not $installed) { + Write-Output "::error::CUVIS SDK files did not appear under $cuvisBin within $timeoutSec s" + if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } + exit 1 + } + Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output build-and-test-windows: needs: [prepare, setup-windows-deps] diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 9857147..54b36ca 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -164,7 +164,45 @@ jobs: Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" - Start-Process $installer.FullName -ArgumentList '/S', '/LOG=install.log', '/NORESTART' -Wait + + $logDir = Join-Path $env:RUNNER_TEMP 'cuvis_install' + New-Item -ItemType Directory -Force -Path $logDir | Out-Null + $nsisLog = Join-Path $logDir 'install.log' + $cuvisBin = 'C:\Program Files\Cuvis\bin' + + # The installer silently runs the bundled Allied Vision VimbaX GigE-driver sub-installer. + # On a headless runner that sub-install leaves an orphan msiexec holding the pipe handle, + # so the NSIS ExecWait never returns and the installer process hangs forever -- even though + # the SDK files DO land on disk. So we wait for the installed files to appear (not for the + # process to exit), then terminate the stuck installer and continue. + $proc = Start-Process $installer.FullName -ArgumentList '/S', "/LOG=$nsisLog", '/NORESTART' -PassThru + $timeoutSec = 600; $elapsed = 0; $installed = $false + while ($elapsed -lt $timeoutSec) { + if (Test-Path "$cuvisBin\*.dll") { $installed = $true; break } + if ($proc.HasExited) { break } + Start-Sleep -Seconds 15; $elapsed += 15 + Write-Output "== t=${elapsed}s : waiting for SDK files (binExists=$(Test-Path $cuvisBin)) ==" + Get-CimInstance Win32_Process | + Where-Object { $_.Name -match 'setup|install|msiexec|vimba|ebus|vc_redist|cuda|nvidia' } | + Select-Object ProcessId, ParentProcessId, Name | Format-Table -Auto | Out-String | Write-Output + } + + if (-not $installed) { Start-Sleep -Seconds 5; $installed = [bool](Test-Path "$cuvisBin\*.dll") } + + if (-not $proc.HasExited) { + Write-Output "Installer process still running (known VimbaX/msiexec ExecWait hang) - terminating it." + Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue + } else { + Write-Output "Installer exit code: $($proc.ExitCode)" + } + + # Verify before the cache post-step runs, so a partial install can't poison the cache: + if (-not $installed) { + Write-Output "::error::CUVIS SDK files did not appear under $cuvisBin within $timeoutSec s" + if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } + exit 1 + } + Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output build-windows: needs: [prepare, setup-windows-deps] From cd61a032a38623b6451dd42a2c6b3c4aa100c7fc Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Tue, 16 Jun 2026 16:12:50 +0200 Subject: [PATCH 08/14] fix: workaround on non-exiting installer --- .github/workflows/build_and_test.yml | 68 ++++++++++++++++----------- .github/workflows/publish_version.yml | 68 ++++++++++++++++----------- 2 files changed, 80 insertions(+), 56 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 731e25b..33bf2ae 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -115,41 +115,53 @@ jobs: $logDir = Join-Path $env:RUNNER_TEMP 'cuvis_install' New-Item -ItemType Directory -Force -Path $logDir | Out-Null - $nsisLog = Join-Path $logDir 'install.log' - $cuvisBin = 'C:\Program Files\Cuvis\bin' - - # The installer silently runs the bundled Allied Vision VimbaX GigE-driver sub-installer. - # On a headless runner that sub-install leaves an orphan msiexec holding the pipe handle, - # so the NSIS ExecWait never returns and the installer process hangs forever -- even though - # the SDK files DO land on disk. So we wait for the installed files to appear (not for the - # process to exit), then terminate the stuck installer and continue. + $nsisLog = Join-Path $logDir 'install.log' + $cuvisDir = 'C:\Program Files\Cuvis' + $cuvisBin = Join-Path $cuvisDir 'bin' + + # WORKAROUND for a bug in the current Cuvis_C_SDK_Installer (NSIS): $SILENT is never set under /S, + # so its bundled runtime driver MSIs (C:\Program Files\Cuvis\Runtime\*.msi, e.g. WavesSetup222.msi) + # launch via `msiexec /i ... /passive` instead of /quiet. /passive pops a GUI that nobody dismisses + # on a headless runner, so the installer's ExecWait hangs forever. We kill those stuck interactive + # msiexec processes so the installer finishes, then re-install the runtime MSIs ourselves with /qn. + # Those driver components are secondary -> their failure must not fail the job. + # Upstream fix for future installer versions: branch the runtime-MSI calls on ${Silent}, use /quiet. $proc = Start-Process $installer.FullName -ArgumentList '/S', "/LOG=$nsisLog", '/NORESTART' -PassThru - $timeoutSec = 600; $elapsed = 0; $installed = $false - while ($elapsed -lt $timeoutSec) { - if (Test-Path "$cuvisBin\*.dll") { $installed = $true; break } - if ($proc.HasExited) { break } - Start-Sleep -Seconds 15; $elapsed += 15 - Write-Output "== t=${elapsed}s : waiting for SDK files (binExists=$(Test-Path $cuvisBin)) ==" - Get-CimInstance Win32_Process | - Where-Object { $_.Name -match 'setup|install|msiexec|vimba|ebus|vc_redist|cuda|nvidia' } | - Select-Object ProcessId, ParentProcessId, Name | Format-Table -Auto | Out-String | Write-Output + $timeoutSec = 600; $elapsed = 0; $grace = 20; $firstSeen = @{} + while (-not $proc.HasExited -and $elapsed -lt $timeoutSec) { + Start-Sleep -Seconds 10; $elapsed += 10 + Get-CimInstance Win32_Process | Where-Object { + $_.Name -eq 'msiexec.exe' -and $_.CommandLine -and + $_.CommandLine -match 'Cuvis' -and $_.CommandLine -match '\.msi' -and $_.CommandLine -notmatch '/q' } | + ForEach-Object { + if (-not $firstSeen.ContainsKey($_.ProcessId)) { + $firstSeen[$_.ProcessId] = $elapsed + Write-Output "Detected interactive runtime sub-installer (PID $($_.ProcessId)): $($_.CommandLine)" + } elseif ($elapsed - $firstSeen[$_.ProcessId] -ge $grace) { + Write-Output "Killing stuck sub-installer PID $($_.ProcessId) so the main installer can continue." + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } + Write-Output "== t=${elapsed}s : installer running ==" } - if (-not $installed) { Start-Sleep -Seconds 5; $installed = [bool](Test-Path "$cuvisBin\*.dll") } + if ($proc.HasExited) { Write-Output "Installer exit code: $($proc.ExitCode)" } + else { Write-Output "::warning::Installer still running at ${timeoutSec}s - terminating."; Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue } - if (-not $proc.HasExited) { - Write-Output "Installer process still running (known VimbaX/msiexec ExecWait hang) - terminating it." - Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue - } else { - Write-Output "Installer exit code: $($proc.ExitCode)" - } - - # Verify before the cache post-step runs, so a partial install can't poison the cache: - if (-not $installed) { - Write-Output "::error::CUVIS SDK files did not appear under $cuvisBin within $timeoutSec s" + # Gate the cache on the CORE SDK only (a partial install must never be cached): + if (-not (Test-Path "$cuvisBin\*.dll")) { + Write-Output "::error::core CUVIS SDK missing under $cuvisBin" if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } exit 1 } + + # Secondary: silently (re)install the runtime drivers we had to interrupt. Best-effort, never fatal. + Get-ChildItem (Join-Path $cuvisDir 'Runtime') -Filter *.msi -ErrorAction SilentlyContinue | ForEach-Object { + $msiLog = Join-Path $logDir ($_.BaseName + '.log') + $p = Start-Process msiexec -Wait -PassThru -ArgumentList '/i', "`"$($_.FullName)`"", '/qn', '/norestart', '/l*v', "`"$msiLog`"" + Write-Output "Runtime component $($_.Name) -> msiexec exit $($p.ExitCode)" + } + Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output build-and-test-windows: diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 54b36ca..f08a209 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -167,41 +167,53 @@ jobs: $logDir = Join-Path $env:RUNNER_TEMP 'cuvis_install' New-Item -ItemType Directory -Force -Path $logDir | Out-Null - $nsisLog = Join-Path $logDir 'install.log' - $cuvisBin = 'C:\Program Files\Cuvis\bin' - - # The installer silently runs the bundled Allied Vision VimbaX GigE-driver sub-installer. - # On a headless runner that sub-install leaves an orphan msiexec holding the pipe handle, - # so the NSIS ExecWait never returns and the installer process hangs forever -- even though - # the SDK files DO land on disk. So we wait for the installed files to appear (not for the - # process to exit), then terminate the stuck installer and continue. + $nsisLog = Join-Path $logDir 'install.log' + $cuvisDir = 'C:\Program Files\Cuvis' + $cuvisBin = Join-Path $cuvisDir 'bin' + + # WORKAROUND for a bug in the current Cuvis_C_SDK_Installer (NSIS): $SILENT is never set under /S, + # so its bundled runtime driver MSIs (C:\Program Files\Cuvis\Runtime\*.msi, e.g. WavesSetup222.msi) + # launch via `msiexec /i ... /passive` instead of /quiet. /passive pops a GUI that nobody dismisses + # on a headless runner, so the installer's ExecWait hangs forever. We kill those stuck interactive + # msiexec processes so the installer finishes, then re-install the runtime MSIs ourselves with /qn. + # Those driver components are secondary -> their failure must not fail the job. + # Upstream fix for future installer versions: branch the runtime-MSI calls on ${Silent}, use /quiet. $proc = Start-Process $installer.FullName -ArgumentList '/S', "/LOG=$nsisLog", '/NORESTART' -PassThru - $timeoutSec = 600; $elapsed = 0; $installed = $false - while ($elapsed -lt $timeoutSec) { - if (Test-Path "$cuvisBin\*.dll") { $installed = $true; break } - if ($proc.HasExited) { break } - Start-Sleep -Seconds 15; $elapsed += 15 - Write-Output "== t=${elapsed}s : waiting for SDK files (binExists=$(Test-Path $cuvisBin)) ==" - Get-CimInstance Win32_Process | - Where-Object { $_.Name -match 'setup|install|msiexec|vimba|ebus|vc_redist|cuda|nvidia' } | - Select-Object ProcessId, ParentProcessId, Name | Format-Table -Auto | Out-String | Write-Output + $timeoutSec = 600; $elapsed = 0; $grace = 20; $firstSeen = @{} + while (-not $proc.HasExited -and $elapsed -lt $timeoutSec) { + Start-Sleep -Seconds 10; $elapsed += 10 + Get-CimInstance Win32_Process | Where-Object { + $_.Name -eq 'msiexec.exe' -and $_.CommandLine -and + $_.CommandLine -match 'Cuvis' -and $_.CommandLine -match '\.msi' -and $_.CommandLine -notmatch '/q' } | + ForEach-Object { + if (-not $firstSeen.ContainsKey($_.ProcessId)) { + $firstSeen[$_.ProcessId] = $elapsed + Write-Output "Detected interactive runtime sub-installer (PID $($_.ProcessId)): $($_.CommandLine)" + } elseif ($elapsed - $firstSeen[$_.ProcessId] -ge $grace) { + Write-Output "Killing stuck sub-installer PID $($_.ProcessId) so the main installer can continue." + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } + Write-Output "== t=${elapsed}s : installer running ==" } - if (-not $installed) { Start-Sleep -Seconds 5; $installed = [bool](Test-Path "$cuvisBin\*.dll") } + if ($proc.HasExited) { Write-Output "Installer exit code: $($proc.ExitCode)" } + else { Write-Output "::warning::Installer still running at ${timeoutSec}s - terminating."; Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue } - if (-not $proc.HasExited) { - Write-Output "Installer process still running (known VimbaX/msiexec ExecWait hang) - terminating it." - Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue - } else { - Write-Output "Installer exit code: $($proc.ExitCode)" - } - - # Verify before the cache post-step runs, so a partial install can't poison the cache: - if (-not $installed) { - Write-Output "::error::CUVIS SDK files did not appear under $cuvisBin within $timeoutSec s" + # Gate the cache on the CORE SDK only (a partial install must never be cached): + if (-not (Test-Path "$cuvisBin\*.dll")) { + Write-Output "::error::core CUVIS SDK missing under $cuvisBin" if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } exit 1 } + + # Secondary: silently (re)install the runtime drivers we had to interrupt. Best-effort, never fatal. + Get-ChildItem (Join-Path $cuvisDir 'Runtime') -Filter *.msi -ErrorAction SilentlyContinue | ForEach-Object { + $msiLog = Join-Path $logDir ($_.BaseName + '.log') + $p = Start-Process msiexec -Wait -PassThru -ArgumentList '/i', "`"$($_.FullName)`"", '/qn', '/norestart', '/l*v', "`"$msiLog`"" + Write-Output "Runtime component $($_.Name) -> msiexec exit $($p.ExitCode)" + } + Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output build-windows: From 6de636568681a19fd914b32afc6719435a6697bb Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 09:50:02 +0200 Subject: [PATCH 09/14] fix: pass CMAKE_PREFIX_PATH to cmake to locate cuvis library The cmake step relied on $ENV{PROGRAMFILES} in FindCuvis.cmake to find the SDK at C:\Program Files\Cuvis\bin. On the current Windows runner image this expansion may not resolve correctly. Passing CMAKE_PREFIX_PATH explicitly makes cmake search the SDK bin directory directly, bypassing the env-var lookup. --- .github/workflows/build_and_test.yml | 4 +++- .github/workflows/publish_version.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 33bf2ae..d55073b 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -215,8 +215,10 @@ jobs: - name: CMake configure and build shell: pwsh + env: + CUVIS: C:\Program Files\Cuvis run: | - cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" -B build . + cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" "-DCMAKE_PREFIX_PATH=$env:CUVIS" -B build . cmake --build build --target cuvis_pyil --config Release - name: Copy built files and install package diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index f08a209..9e04800 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -271,8 +271,10 @@ jobs: - name: CMake configure and build shell: pwsh + env: + CUVIS: C:\Program Files\Cuvis run: | - cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" -B build . + cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" "-DCMAKE_PREFIX_PATH=$env:CUVIS" -B build . cmake --build build --target cuvis_pyil --config Release - name: Copy built files and package wheel From 8c70724dfd3164d5273fa327cefc41f9c7124fba Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 09:55:29 +0200 Subject: [PATCH 10/14] fix: add cuvis bin to PATH for cmake try_run and use python -m pip - Add C:\Program Files\Cuvis\bin to PATH in cmake step so the version-check binary compiled by try_run can load cuvis.dll - Use python -m pip instead of pip to avoid WinError 5 access denied on pip.exe self-upgrade (Python 3.9 on Windows) --- .github/workflows/build_and_test.yml | 5 +++-- .github/workflows/publish_version.yml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index d55073b..973b126 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -210,14 +210,15 @@ jobs: run: | python -m venv venv .\venv\Scripts\Activate.ps1 - pip install --upgrade pip setuptools wheel build - pip install numpy==${{ matrix.numpy }} + python -m pip install --upgrade pip setuptools wheel build + python -m pip install numpy==${{ matrix.numpy }} - name: CMake configure and build shell: pwsh env: CUVIS: C:\Program Files\Cuvis run: | + $env:PATH += ";C:\Program Files\Cuvis\bin" cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" "-DCMAKE_PREFIX_PATH=$env:CUVIS" -B build . cmake --build build --target cuvis_pyil --config Release diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 9e04800..2016ffd 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -266,14 +266,15 @@ jobs: run: | python -m venv venv .\venv\Scripts\Activate.ps1 - pip install --upgrade pip setuptools wheel build - pip install numpy==${{ matrix.numpy }} + python -m pip install --upgrade pip setuptools wheel build + python -m pip install numpy==${{ matrix.numpy }} - name: CMake configure and build shell: pwsh env: CUVIS: C:\Program Files\Cuvis run: | + $env:PATH += ";C:\Program Files\Cuvis\bin" cmake "-DCMAKE_BUILD_TYPE=Release" "-DDOXYGEN_BUILD_DOCUMENTATION=FALSE" "-DSWIG_DIR=$env:SWIG_DIR" "-DSWIG_EXECUTABLE=$env:SWIG_EXECUTABLE" "-DPython_ROOT_DIR=${{ github.workspace }}\venv" "-DCMAKE_PREFIX_PATH=$env:CUVIS" -B build . cmake --build build --target cuvis_pyil --config Release From edce03a5e1a86d8cf709ab79ddfdedfd938a7714 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 10:06:24 +0200 Subject: [PATCH 11/14] fix: run full NSIS installer in each build job instead of caching installed files Caching C:\Program Files\Cuvis and restoring it in a downstream job does not replicate the registry entries and PATH changes the installer makes, so cmake's try_run version check could not load cuvis.dll. Instead: setup-windows-deps now only caches the installer zip at a workspace-relative path (reliable to restore). Each build-and-test- windows matrix job restores the zip and runs the full NSIS installer, which sets up the complete system state needed by FindCuvis.cmake. Keep CMAKE_PREFIX_PATH and PATH additions in the cmake step so the current session sees the SDK regardless of when the installer's PATH change propagates. --- .github/workflows/build_and_test.yml | 86 +++++++++++++------------ .github/workflows/publish_version.yml | 92 ++++++++++++++------------- 2 files changed, 95 insertions(+), 83 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 973b126..1728de7 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -93,15 +93,15 @@ jobs: needs: prepare runs-on: windows-latest steps: - - name: Cache CUVIS SDK - id: cache-cuvis + - name: Cache CUVIS SDK zip + id: cache-cuvis-zip uses: actions/cache@v4 with: - path: C:\Program Files\Cuvis - key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + path: ${{ github.workspace }}\cuvis_sdk.zip + key: cuvis-sdk-zip-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Download and install CUVIS SDK - if: steps.cache-cuvis.outputs.cache-hit != 'true' + - name: Download CUVIS SDK zip + if: steps.cache-cuvis-zip.outputs.cache-hit != 'true' shell: pwsh env: CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} @@ -109,7 +109,46 @@ jobs: $v = $env:CUVIS_VERSION $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip - Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk + + build-and-test-windows: + needs: [prepare, setup-windows-deps] + strategy: + fail-fast: false + matrix: + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + include: + - { python: "3.9", numpy: "2.0.0" } + - { python: "3.10", numpy: "2.0.0" } + - { python: "3.11", numpy: "2.0.0" } + - { python: "3.12", numpy: "2.0.0" } + - { python: "3.13", numpy: "2.1.0" } + - { python: "3.14", numpy: "2.3.2" } + runs-on: windows-latest + + steps: + - name: Install SWIG 4.2.1 + shell: pwsh + run: | + winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements + $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 + $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 + echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV + echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV + + - name: Restore CUVIS SDK zip + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}\cuvis_sdk.zip + key: cuvis-sdk-zip-windows-${{ needs.prepare.outputs.cuvis_version }} + fail-on-cache-miss: true + + - name: Install CUVIS SDK + shell: pwsh + env: + CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} + run: | + $v = $env:CUVIS_VERSION + Expand-Archive "${{ github.workspace }}\cuvis_sdk.zip" -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" @@ -148,14 +187,12 @@ jobs: if ($proc.HasExited) { Write-Output "Installer exit code: $($proc.ExitCode)" } else { Write-Output "::warning::Installer still running at ${timeoutSec}s - terminating."; Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue } - # Gate the cache on the CORE SDK only (a partial install must never be cached): if (-not (Test-Path "$cuvisBin\*.dll")) { Write-Output "::error::core CUVIS SDK missing under $cuvisBin" if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } exit 1 } - # Secondary: silently (re)install the runtime drivers we had to interrupt. Best-effort, never fatal. Get-ChildItem (Join-Path $cuvisDir 'Runtime') -Filter *.msi -ErrorAction SilentlyContinue | ForEach-Object { $msiLog = Join-Path $logDir ($_.BaseName + '.log') $p = Start-Process msiexec -Wait -PassThru -ArgumentList '/i', "`"$($_.FullName)`"", '/qn', '/norestart', '/l*v', "`"$msiLog`"" @@ -164,37 +201,6 @@ jobs: Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output - build-and-test-windows: - needs: [prepare, setup-windows-deps] - strategy: - fail-fast: false - matrix: - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] - include: - - { python: "3.9", numpy: "2.0.0" } - - { python: "3.10", numpy: "2.0.0" } - - { python: "3.11", numpy: "2.0.0" } - - { python: "3.12", numpy: "2.0.0" } - - { python: "3.13", numpy: "2.1.0" } - - { python: "3.14", numpy: "2.3.2" } - runs-on: windows-latest - - steps: - - name: Install SWIG 4.2.1 - shell: pwsh - run: | - winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements - $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 - $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 - echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV - echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV - - - name: Restore CUVIS SDK cache - uses: actions/cache@v4 - with: - path: C:\Program Files\Cuvis - key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Checkout uses: actions/checkout@v4 with: diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 2016ffd..598a437 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -145,15 +145,15 @@ jobs: needs: prepare runs-on: windows-latest steps: - - name: Cache CUVIS SDK - id: cache-cuvis + - name: Cache CUVIS SDK zip + id: cache-cuvis-zip uses: actions/cache@v4 with: - path: C:\Program Files\Cuvis - key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} + path: ${{ github.workspace }}\cuvis_sdk.zip + key: cuvis-sdk-zip-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Download and install CUVIS SDK - if: steps.cache-cuvis.outputs.cache-hit != 'true' + - name: Download CUVIS SDK zip + if: steps.cache-cuvis-zip.outputs.cache-hit != 'true' shell: pwsh env: CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} @@ -161,7 +161,49 @@ jobs: $v = $env:CUVIS_VERSION $vn = $v -replace '\.', '' Invoke-WebRequest "https://cloud.cubert-gmbh.de/s/cuvis_sdk_release_ver_$vn/download" -OutFile cuvis_sdk.zip - Expand-Archive cuvis_sdk.zip -DestinationPath cuvis_sdk + + build-windows: + needs: [prepare, setup-windows-deps] + strategy: + fail-fast: false + matrix: + python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + include: + - { python: "3.9", numpy: "2.0.0" } + - { python: "3.10", numpy: "2.0.0" } + - { python: "3.11", numpy: "2.0.0" } + - { python: "3.12", numpy: "2.0.0" } + - { python: "3.13", numpy: "2.1.0" } + - { python: "3.14", numpy: "2.3.2" } + runs-on: windows-latest + + permissions: + contents: read + + steps: + - name: Install SWIG 4.2.1 + shell: pwsh + run: | + winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements + $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 + $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 + echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV + echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV + + - name: Restore CUVIS SDK zip + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}\cuvis_sdk.zip + key: cuvis-sdk-zip-windows-${{ needs.prepare.outputs.cuvis_version }} + fail-on-cache-miss: true + + - name: Install CUVIS SDK + shell: pwsh + env: + CUVIS_VERSION: ${{ needs.prepare.outputs.cuvis_version }} + run: | + $v = $env:CUVIS_VERSION + Expand-Archive "${{ github.workspace }}\cuvis_sdk.zip" -DestinationPath cuvis_sdk $installer = Get-ChildItem "cuvis_sdk\Cuvis $v\" -Recurse -Filter "Cuvis_C_SDK_Installer_*.exe" | Select-Object -First 1 Write-Output "Installing: $($installer.FullName)" @@ -200,14 +242,12 @@ jobs: if ($proc.HasExited) { Write-Output "Installer exit code: $($proc.ExitCode)" } else { Write-Output "::warning::Installer still running at ${timeoutSec}s - terminating."; Stop-Process -Id $proc.Id -Force -ErrorAction SilentlyContinue } - # Gate the cache on the CORE SDK only (a partial install must never be cached): if (-not (Test-Path "$cuvisBin\*.dll")) { Write-Output "::error::core CUVIS SDK missing under $cuvisBin" if (Test-Path $nsisLog) { Write-Output '----- NSIS install.log -----'; Get-Content $nsisLog } exit 1 } - # Secondary: silently (re)install the runtime drivers we had to interrupt. Best-effort, never fatal. Get-ChildItem (Join-Path $cuvisDir 'Runtime') -Filter *.msi -ErrorAction SilentlyContinue | ForEach-Object { $msiLog = Join-Path $logDir ($_.BaseName + '.log') $p = Start-Process msiexec -Wait -PassThru -ArgumentList '/i', "`"$($_.FullName)`"", '/qn', '/norestart', '/l*v', "`"$msiLog`"" @@ -216,40 +256,6 @@ jobs: Write-Output "CUVIS SDK installed:"; Get-ChildItem $cuvisBin | Select-Object -First 20 | Format-Table -Auto | Out-String | Write-Output - build-windows: - needs: [prepare, setup-windows-deps] - strategy: - fail-fast: false - matrix: - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] - include: - - { python: "3.9", numpy: "2.0.0" } - - { python: "3.10", numpy: "2.0.0" } - - { python: "3.11", numpy: "2.0.0" } - - { python: "3.12", numpy: "2.0.0" } - - { python: "3.13", numpy: "2.1.0" } - - { python: "3.14", numpy: "2.3.2" } - runs-on: windows-latest - - permissions: - contents: read - - steps: - - name: Install SWIG 4.2.1 - shell: pwsh - run: | - winget install --id SWIG.SWIG --version 4.2.1 --silent --accept-package-agreements --accept-source-agreements - $swigPkg = Get-ChildItem "$env:LOCALAPPDATA\Microsoft\WinGet\Packages" -Directory | Where-Object { $_.Name -like "SWIG.SWIG_*" } | Select-Object -First 1 - $swigExe = Get-ChildItem $swigPkg.FullName -Recurse -Filter "swig.exe" | Select-Object -First 1 - echo "SWIG_EXECUTABLE=$($swigExe.FullName)" >> $env:GITHUB_ENV - echo "SWIG_DIR=$(Join-Path $swigExe.DirectoryName 'Lib')" >> $env:GITHUB_ENV - - - name: Restore CUVIS SDK cache - uses: actions/cache@v4 - with: - path: C:\Program Files\Cuvis - key: cuvis-sdk-windows-${{ needs.prepare.outputs.cuvis_version }} - - name: Checkout uses: actions/checkout@v4 with: From 4e8509fd71f143b024bded7c204a8901280133e4 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 10:20:43 +0200 Subject: [PATCH 12/14] fix: drop Python 3.9 from Windows CI matrix Python 3.9 reached EOL in Oct 2024 and is not installable via actions/setup-python@v5 on Windows Server 2025 runners. Linux jobs continue to cover 3.9 via deadsnakes PPA in Docker containers. --- .github/workflows/build_and_test.yml | 3 +-- .github/workflows/publish_version.yml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 1728de7..bbb37ff 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -115,9 +115,8 @@ jobs: strategy: fail-fast: false matrix: - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] include: - - { python: "3.9", numpy: "2.0.0" } - { python: "3.10", numpy: "2.0.0" } - { python: "3.11", numpy: "2.0.0" } - { python: "3.12", numpy: "2.0.0" } diff --git a/.github/workflows/publish_version.yml b/.github/workflows/publish_version.yml index 598a437..93521a6 100644 --- a/.github/workflows/publish_version.yml +++ b/.github/workflows/publish_version.yml @@ -167,9 +167,8 @@ jobs: strategy: fail-fast: false matrix: - python: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"] + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] include: - - { python: "3.9", numpy: "2.0.0" } - { python: "3.10", numpy: "2.0.0" } - { python: "3.11", numpy: "2.0.0" } - { python: "3.12", numpy: "2.0.0" } From 8e2ebaa7a1d8f962dfee8c92d7e06fc4986fc298 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 10:45:32 +0200 Subject: [PATCH 13/14] fix: rewrite Windows smoke test in PowerShell The bash version ran via Git Bash which swallowed the version output. Now uses pwsh consistently with the rest of the Windows job steps. --- .github/workflows/build_and_test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index bbb37ff..f00cb3a 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -236,11 +236,11 @@ jobs: pip install . - name: Smoke test - verify import and version + shell: pwsh env: CUVIS: C:\Program Files\Cuvis\bin - shell: bash run: | - source venv/Scripts/activate - OUTPUT=$(python -c "from cuvis_il import cuvis_il; print(cuvis_il.cuvis_version_swig())") - echo "Version output: $OUTPUT" - echo "$OUTPUT" | grep -q "CUBERT SDK" || (echo "Version check failed!" && exit 1) + .\venv\Scripts\Activate.ps1 + $output = python -c "from cuvis_il import cuvis_il; print(cuvis_il.cuvis_version_swig())" + Write-Output "Version output: $output" + if ($output -notmatch "CUBERT SDK") { Write-Output "Version check failed!"; exit 1 } From 165003adcfd7b773b328c0da80fdb998dac562e8 Mon Sep 17 00:00:00 2001 From: Simon Birkholz Date: Mon, 22 Jun 2026 11:48:15 +0200 Subject: [PATCH 14/14] updating patch version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 33ab0e3..c77b7b5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "cuvis_il" -version = "3.5.3.1" +version = "3.5.3.2" description = "Compiled Python Bindings for the CUVIS SDK." readme = "README.md" requires-python = ">=3.9"