name: Common setup description: Performs setup common to all our actions inputs: os: required: true compiler: required: true platform: required: true config: required: true build-llvm: required: true runs: using: composite steps: - name: Add bash to PATH shell: pwsh if: ${{inputs.os == 'windows'}} run: | Add-Content -Path $env:GITHUB_PATH -Value "C:\\Program Files\\Git\\bin" Add-Content -Path $env:GITHUB_PATH -Value "C:\\Program Files\\Git\\usr\\bin" - name: Set up MSVC dev tools on Windows uses: ilammy/msvc-dev-cmd@v1 - name: Install dependencies (Linux only) if: inputs.os == 'linux' shell: bash run: | sudo apt-get update sudo apt-get install -y libx11-dev - name: Setup Node.js (Linux only) if: inputs.os == 'linux' uses: actions/setup-node@v4 with: node-version: "20.x" - shell: bash run: | # Set up system dependencies # Install Ninja if ! command -v ninja; then case "${{inputs.os}}" in linux*) sudo apt-get install -y ninja-build;; windows*) choco install ninja;; macos*) brew install ninja;; esac fi # Install cross tools on Ubuntu if [[ "${{inputs.os}}" == linux* && "${{inputs.platform}}" == "aarch64" && "$(uname -m)" != "aarch64" ]]; then sudo apt-get install -y crossbuild-essential-arm64 fi # Set compiler CC=${{inputs.compiler}} CXX=${{inputs.compiler}} # infer C++ compiler CXX=${CXX/gcc/g++} CXX=${CXX/clang/clang++} # Correct gcc version on older ubuntu if [[ "${{inputs.os}}" == linux* ]]; then gcc_version=$(gcc -dumpversion | cut -d'.' -f1) if [ "$gcc_version" -lt 10 ]; then CC=${CC/gcc/gcc-10} CXX=${CXX/g++/g++-10} fi fi # Export echo "CC=$CC" >> "$GITHUB_ENV" echo "CXX=$CXX" >> "$GITHUB_ENV" # Some useful variables config=${{inputs.config}} cmake_config=$(echo "${{inputs.config}}" | sed ' s/^debug$/Debug/ s/^release$/Release/ s/^releaseWithDebugInfo$/RelWithDebInfo/ s/^minSizeRelease$/MinSizeRel/ ') bin_dir=$(pwd)/build/$cmake_config/bin lib_dir=$(pwd)/build/$cmake_config/lib echo "config=$config" >> "$GITHUB_ENV" echo "cmake_config=$cmake_config" >> "$GITHUB_ENV" echo "bin_dir=$bin_dir" >> "$GITHUB_ENV" echo "lib_dir=$lib_dir" >> "$GITHUB_ENV" # Try to restore an LLVM install, and build it otherwise - uses: actions/cache/restore@v4 id: cache-llvm if: inputs.build-llvm == 'true' with: path: build/llvm-project-install # Use os*compiler*platform in lieu of an ABI key here, which is what we really want key: llvm-${{ inputs.os }}-${{ inputs.compiler }}-${{ inputs.platform }}-${{ hashFiles('external/build-llvm.sh') }} - name: Build LLVM if: inputs.build-llvm == 'true' && steps.cache-llvm.outputs.cache-hit != 'true' shell: bash run: | ./external/build-llvm.sh \ --install-prefix "${{github.workspace}}/build/llvm-project-install" \ --repo "https://${{github.token}}@github.com/llvm/llvm-project" - uses: actions/cache/save@v4 if: inputs.build-llvm == 'true' && steps.cache-llvm.outputs.cache-hit != 'true' with: path: build/llvm-project-install key: ${{ steps.cache-llvm.outputs.cache-primary-key }} - name: Set environment variable for CMake shell: bash run: | if [ "${{inputs.build-llvm}}" == "true" ]; then echo "LLVM_DIR=${{ github.workspace }}/build/llvm-project-install" >> "$GITHUB_ENV" echo "Clang_DIR=${{ github.workspace }}/build/llvm-project-install" >> "$GITHUB_ENV" fi # Put spirv-tools in path - shell: bash run: | win_platform="${{ inputs.platform }}" win_platform="${win_platform//x86_64/x64}" case "${{inputs.os}}" in windows*) echo "${{github.workspace}}/external/slang-binaries/spirv-tools/windows-$win_platform/bin" >> "$GITHUB_PATH";; linux*) echo "${{github.workspace}}/external/slang-binaries/spirv-tools/$(uname -m)-linux/bin" >> "$GITHUB_PATH";; esac # Setup ccache for local compilation speedup (Windows self-hosted only) # Only use ccache if already installed - don't attempt installation - name: Setup ccache (if available, local only, no GitHub uploads) if: ${{ inputs.os == 'windows' && runner.environment == 'self-hosted' }} shell: bash run: | # Check if ccache is available if ! command -v ccache &> /dev/null; then echo "⚠️ ccache not found on this self-hosted runner" echo " Skipping ccache setup to avoid permission issues" echo " Build will proceed without ccache acceleration" echo " To enable ccache: manually install it on the runner with admin rights" exit 0 fi echo "✅ ccache found on self-hosted runner - setting up persistent caching" # Set ccache directory to a persistent location outside workspace if [[ "${{ inputs.os }}" == "windows" ]]; then ccache_base_dir="C:/ccache-slang" else # Linux/macOS: Use home directory for persistence ccache_base_dir="$HOME/.ccache-slang" fi ccache_dir="$ccache_base_dir/${{ inputs.os }}-${{ inputs.compiler }}-${{ inputs.platform }}" mkdir -p "$ccache_dir" echo "CCACHE_DIR=$ccache_dir" >> $GITHUB_ENV echo "🔧 Using persistent ccache directory: $ccache_dir" # Configure ccache settings for local use only ccache --set-config=max_size=20G ccache --set-config=compression=true ccache --set-config=compression_level=6 ccache --set-config=sloppiness=pch_defines,time_macros ccache --set-config=cache_dir="$ccache_dir" # Enable ccache for CMake (set environment variables) # Get the full path to ccache executable ccache_path=$(which ccache) echo "ccache_symlinks_path=$ccache_path" >> $GITHUB_ENV