name: Build and Release on: push: tags: - '*' # Trigger on any tag push jobs: build_and_release: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: # Linux - name: Install build tools (Linux) if: runner.os == 'Linux' run: sudo apt-get update && sudo apt-get install -y flex bison # macOS - name: Install build tools (macOS) if: runner.os == 'macOS' run: brew install flex bison - name: Checkout code uses: actions/checkout@v3 with: submodules: recursive # Windows - name: Install build tools (Windows) if: runner.os == 'Windows' run: | choco install winflexbison mingw -y cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ shell: pwsh - name: Setup Python (needed for Conan) uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install Conan (Linux/macOS) if: runner.os != 'Windows' run: | python -m pip install --upgrade pip pip install conan shell: bash - name: Install Conan (Windows) if: runner.os == 'Windows' run: | python -m pip install --upgrade pip pip install conan shell: pwsh - name: Configure Conan (Linux/macOS) if: runner.os != 'Windows' run: conan profile detect shell: bash - name: Configure Conan (Windows) if: runner.os == 'Windows' run: conan profile detect shell: pwsh - name: Install dependencies and build (Linux/macOS) if: runner.os != 'Windows' run: | conan install . --build=missing conan build . shell: bash - name: Install dependencies and build (Windows) if: runner.os == 'Windows' run: | conan install . --build=missing conan build . --config Release shell: pwsh - name: Determine if prerelease (Linux/macOS) if: runner.os != 'Windows' id: prerelease_check_unix run: | TAG=${GITHUB_REF##refs/tags/} if [[ "$TAG" == prerelease-* ]]; then echo "true" > prerelease.txt else echo "false" > prerelease.txt fi echo "prerelease=$(cat prerelease.txt)" >> $GITHUB_OUTPUT shell: bash - name: Determine if prerelease (Windows) if: runner.os == 'Windows' id: prerelease_check_win run: | $TAG = $env:GITHUB_REF -replace 'refs/tags/', '' if ($TAG -like 'prerelease-*') { echo "true" > prerelease.txt } else { echo "false" > prerelease.txt } echo "prerelease=$(Get-Content prerelease.txt)" >> $env:GITHUB_OUTPUT shell: pwsh - name: Archive build folder (Linux/macOS) if: runner.os != 'Windows' run: | TAG=${GITHUB_REF##refs/tags/} OS=$(uname -s | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m) FOLDER_NAME="chloride-$TAG-$OS-$ARCH" TAR_NAME="$FOLDER_NAME.tar.gz" mv build/bin "$FOLDER_NAME" cp LICENSE.txt "$FOLDER_NAME" tar -czf "$TAR_NAME" "$FOLDER_NAME" echo "TAR_NAME=$TAR_NAME" >> $GITHUB_ENV shell: bash - name: Archive build folder (Windows) if: runner.os == 'Windows' run: | $TAG = $env:GITHUB_REF -replace 'refs/tags/', '' $ARCH = if ([Environment]::Is64BitOperatingSystem) { 'x64' } else { 'x86' } $FOLDER_NAME = "chloride-$TAG-windows-$ARCH" $TAR_NAME = "$FOLDER_NAME.zip" Rename-Item build\bin $FOLDER_NAME Copy-Item LICENSE.txt $FOLDER_NAME Compress-Archive -Path $FOLDER_NAME -DestinationPath $TAR_NAME echo "TAR_NAME=$TAR_NAME" >> $env:GITHUB_ENV shell: pwsh - name: Create GitHub Release uses: ncipollo/release-action@v1 with: tag: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: Automated release based on tag ${{ github.ref_name }} draft: false updateOnlyUnreleased: true replacesArtifacts: true prerelease: ${{ runner.os == 'Windows' && steps.prerelease_check_win.outputs.prerelease || steps.prerelease_check_unix.outputs.prerelease }} artifacts: ${{ env.TAR_NAME }}