name: Linux & Windows CMake Build on: # Allow manual call workflow_dispatch: # Allow use in other workflows (such as release) worlflow_call: inputs: release: required: false type: bool default: false release_tag: required: false type: string # Run on push to main push: branches: - main # Run on PR to main pull_request: branches: - main jobs: build: runs-on: ${{ matrix.os }} strategy: # Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable. fail-fast: false # Set up a matrix to run the following 3 configurations: # 1. # 2. # 3. # # To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list. matrix: os: [ubuntu-latest, windows-latest] build_type: [Release] c_compiler: [gcc, cl] include: - os: windows-latest c_compiler: cl cpp_compiler: cl - os: ubuntu-latest c_compiler: gcc cpp_compiler: g++ exclude: - os: windows-latest c_compiler: gcc - os: ubuntu-latest c_compiler: cl outputs: build_dir: ${{ steps.strings.outputs.build-output-dir }} steps: - uses: actions/checkout@v4 - name: Set reusable strings # Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file. id: strings shell: bash run: | echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" - name: Configure CMake for Linux if: matrix.os == 'ubuntu-latest' # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type run: > cmake -B ${{ steps.strings.outputs.build-output-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S ${{ github.workspace }} - name: Configure CMake for Windows x86 if: matrix.os == 'windows-latest' # Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make. # See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type run: > cmake -B ${{ steps.strings.outputs.build-output-dir }} -DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }} -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} -S ${{ github.workspace }} -A Win32 -T host=x86 - name: Build # Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator). run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }} # Upload non-release DLL to artifacts - name: Upload Windows DLL if: ${{ (matrix.os == 'windows-latest') && !(inputs.release) }} uses: actions/upload-artifact@v4 with: name: libvocoder-win-x86 path: ${{ steps.strings.outputs.build-output-dir }}/${{ matrix.build_type }}/libvocoder.dll # Upload non-release .SO to artifacts - name: Upload Linux SO if: if: ${{ (matrix.os == 'ubuntu-latest') && !(inputs.release) }} uses: actions/upload-artifact@v4 with: name: libvocoder-linux path: ${{ steps.strings.outputs.build-output-dir }}/libvocoder.so # (Release-Only) Upload Release Windows .zip to release - name: Upload Windows DLL Release if: ${{ (matrix.os == 'windows-latest') && (inputs.release) }} env: GITHUB_TOKEN: ${{ github.token }} run: | cd ${{ steps.strings.outputs.build-output-dir }}/${{ matrix.build_type }} Compress-Archive -Path ./libvocoder.dll -Destination ./libvocoder-${{ inputs.release_tag }}-win-x86.zip gh release upload ${{ inputs.release_tag }} ./libvocoder-${{ inputs.release_tag }}-win-x86.zip # (Release-Only) Upload release linux .tar.gz to release - name: Upload Linux Release DLL if: ${{ (matrix.os == 'ubuntu-latest') && (inputs.release) }} env: GITHUB_TOKEN: ${{ github.token }} run: | cd ${{ steps.strings.outputs.build-output-dir }} tar -czvf ./libvocoder-${{ inputs.release_tag }}-linux.tar.gz ./libvocoder.so gh release upload ${{ inputs.release_tag }} ./libvocoder-${{ inputs.release_tag }}-linux.tar.gz