Fix Windows zip failures, update MATLAB toolbox packaging, and add startTime to header #36
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Release Pyraview | |
| on: | |
| push: | |
| branches: [ main ] | |
| tags: [ 'v*' ] | |
| pull_request: | |
| branches: [ main ] | |
| workflow_dispatch: # Allows manual triggering | |
| jobs: | |
| build_and_test: | |
| name: Build & Test (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v4 | |
| - name: Setup CMake | |
| uses: lukka/get-cmake@latest | |
| - name: Configure CMake | |
| shell: bash | |
| run: | | |
| mkdir build | |
| if [ "${{ runner.os }}" == "Windows" ]; then | |
| cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release | |
| else | |
| cmake -S . -B build -DCMAKE_BUILD_TYPE=Release | |
| fi | |
| - name: Build All | |
| run: cmake --build build --parallel | |
| - name: Run C Tests | |
| shell: bash | |
| run: | | |
| cd build | |
| ctest --output-on-failure | |
| # Zip binaries for release (naming by OS/Architecture) | |
| - name: Package Binaries | |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' | |
| shell: bash | |
| run: | | |
| mkdir -p dist | |
| if [ "${{ runner.os }}" == "Windows" ]; then | |
| # Use 7-Zip (pre-installed on Windows runners) | |
| # 'a' is add, '-j' junk paths (like zip -j) | |
| 7z a -tzip dist/pyraview-win-x64.zip ./build/bin/*.dll ./build/bin/*.exe | |
| else | |
| zip -j dist/pyraview-${{ runner.os }}-${{ runner.arch }}.zip build/bin/* | |
| fi | |
| - name: Upload Artifacts | |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: binaries-${{ matrix.os }} | |
| path: dist/* | |
| build-matlab: | |
| name: Build & Test Matlab (${{ matrix.os }}) | |
| needs: build_and_test | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| matrix: | |
| # Matlab actions support limited OS versions, check availability | |
| os: [ubuntu-latest, windows-latest, macos-latest] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: matlab-actions/setup-matlab@v2 | |
| with: | |
| release: 'R2024b' | |
| - name: Compile MEX | |
| uses: matlab-actions/run-command@v2 | |
| with: | |
| # Enable OpenMP if supported by the platform (simple check or flag) | |
| # For Ubuntu (GCC): -fopenmp | |
| # For Windows (MSVC): -openmp (or implied via /openmp) | |
| # For macOS (Clang): -Xpreprocessor -fopenmp -lomp (but requires libomp) | |
| # To keep it simple and avoid linker errors on stock runners without libomp, we skip explicit OMP flags for now or use safe defaults. | |
| # But pyraview.c has #include <omp.h>. If we don't link OMP, it might fail if _OPENMP is defined by default but library isn't linked. | |
| # Let's try compiling WITHOUT flags first, relying on the source's #ifdef _OPENMP guards. | |
| command: mex -v src/matlab/pyraview_mex.c src/c/pyraview.c -Iinclude -output src/matlab/pyraview | |
| - name: Run Matlab Tests | |
| uses: matlab-actions/run-tests@v2 | |
| with: | |
| select-by-folder: src/matlab | |
| - name: Upload MEX Artifact | |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: mex-${{ matrix.os }} | |
| path: src/matlab/pyraview.* # Matches pyraview.mexw64, .mexa64, etc. | |
| if-no-files-found: error | |
| package-matlab: | |
| name: Package Matlab Toolbox | |
| needs: build-matlab | |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: matlab-actions/setup-matlab@v2 | |
| with: | |
| release: 'R2024b' | |
| # Download all platform-specific MEX files we just built | |
| - name: Download all MEX artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: src/matlab | |
| pattern: mex-* | |
| merge-multiple: true | |
| # Run the packaging command | |
| - name: Package Toolbox | |
| uses: matlab-actions/run-command@v2 | |
| env: | |
| GITHUB_REF_NAME: ${{ github.ref_name }} | |
| with: | |
| command: | | |
| % 1. Use a fixed, permanent UUID for the project | |
| % This ensures MATLAB treats every build as an update to the same toolbox | |
| guid = '6e14a2b9-7f3c-4d8e-9a1b-3c5d7e9f2a4b'; | |
| % 2. Grab the version from the GitHub Tag environment variable | |
| % Default to 1.0.0 if not running in a tagged action | |
| version = getenv('GITHUB_REF_NAME'); | |
| if isempty(version) || ~startsWith(version, 'v') | |
| version = '1.0.0'; | |
| else | |
| % Remove the 'v' prefix (e.g., 'v1.2.3' -> '1.2.3') | |
| version = erase(version, 'v'); | |
| end | |
| % 3. Create a structurally complete, valid Toolbox PRJ XML | |
| xmlCode = [... | |
| '<?xml version="1.0" encoding="UTF-8"?>', ... | |
| '<deployment-project plugin="plugin.toolbox" v3.0>', ... | |
| '<configuration file="pyraview.prj" name="pyraview" target="target.toolbox" target-name="Package Toolbox">', ... | |
| '<param.appname>Pyraview</param.appname>', ... | |
| '<param.authnamewatermark>Pyraview Team</param.authnamewatermark>', ... | |
| '<param.summary>High-performance decimation engine.</param.summary>', ... | |
| '<param.version>' version '</param.version>', ... | |
| '<param.output>${PROJECT_ROOT}/Pyraview.mltbx</param.output>', ... | |
| '<param.guid>' guid '</param.guid>', ... | |
| '<fileset.rootdir><file>${PROJECT_ROOT}/src/matlab</file></fileset.rootdir>', ... | |
| '<fileset.rootfiles><file>${PROJECT_ROOT}/src/matlab</file></fileset.rootfiles>', ... | |
| '<build-deliverables><file location="${PROJECT_ROOT}" name="Pyraview.mltbx" optional="false">${PROJECT_ROOT}/Pyraview.mltbx</file></build-deliverables>', ... | |
| '<workflow />', ... | |
| '<matlab><root>/usr/local/matlab</root><toolboxes /></matlab>', ... | |
| '</configuration></deployment-project>']; | |
| % 4. Write the file | |
| fid = fopen('pyraview.prj', 'w'); | |
| fprintf(fid, '%s', xmlCode); | |
| fclose(fid); | |
| % 5. Package using the file directly | |
| fprintf('Packaging Pyraview version %s with GUID %s...\n', version, guid); | |
| matlab.addons.toolbox.packageToolbox('pyraview.prj', 'Pyraview.mltbx'); | |
| # Upload the .mltbx as an artifact so the release job can pick it up | |
| - name: Upload Toolbox Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: matlab-toolbox | |
| path: Pyraview.mltbx | |
| release: | |
| name: Create GitHub Release | |
| needs: [build_and_test, package-matlab] | |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write # Required to create releases | |
| steps: | |
| - name: Download All Artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: release-assets | |
| merge-multiple: true | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: release-assets/* | |
| name: Release ${{ github.ref_name }} | |
| draft: false | |
| prerelease: false | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |