name: dependencies description: 'Installs build dependencies with caching' inputs: configuration: description: 'Build configuration (Debug, Release, etc.)' required: true build_dir: description: 'Directory to build dependencies in' required: false default: '.build' compiler-id: description: 'Unique identifier: compiler-version-stdlib[-gccversion] (e.g. clang-14-libstdcxx-gcc11, gcc-13-libstdcxx)' required: false default: '' cache_version: description: 'Cache version for invalidation' required: false default: '1' cache_enabled: description: 'Whether to use caching' required: false default: 'true' main_branch: description: 'Main branch name for restore keys' required: false default: 'dev' stdlib: description: 'C++ standard library for Conan configuration (note: also in compiler-id)' required: true type: choice options: - libstdcxx - libcxx outputs: cache-hit: description: 'Whether there was a cache hit' value: ${{ steps.cache-restore-conan.outputs.cache-hit }} runs: using: 'composite' steps: - name: Generate safe branch name if: inputs.cache_enabled == 'true' id: safe-branch shell: bash run: | SAFE_BRANCH=$(echo "${{ github.ref_name }}" | tr -c 'a-zA-Z0-9_.-' '-') echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT - name: Check conanfile changes if: inputs.cache_enabled == 'true' id: check-conanfile-changes shell: bash run: | # Check if we're on the main branch if [ "${{ github.ref_name }}" == "${{ inputs.main_branch }}" ]; then echo "should-save-conan-cache=true" >> $GITHUB_OUTPUT else # Fetch main branch for comparison git fetch origin ${{ inputs.main_branch }} # Check if conanfile.txt or conanfile.py has changed compared to main branch if git diff --quiet origin/${{ inputs.main_branch }}..HEAD -- '**/conanfile.txt' '**/conanfile.py'; then echo "should-save-conan-cache=false" >> $GITHUB_OUTPUT else echo "should-save-conan-cache=true" >> $GITHUB_OUTPUT fi fi - name: Restore Conan cache if: inputs.cache_enabled == 'true' id: cache-restore-conan uses: actions/cache/restore@v4 with: path: | ~/.conan ~/.conan2 # Note: compiler-id format is compiler-version-stdlib[-gccversion] key: ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ hashFiles('**/conanfile.txt', '**/conanfile.py') }}-${{ inputs.configuration }} restore-keys: | ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ hashFiles('**/conanfile.txt', '**/conanfile.py') }}- ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- - name: Export custom recipes shell: bash run: | conan export external/snappy --version 1.1.10 --user xahaud --channel stable conan export external/soci --version 4.0.3 --user xahaud --channel stable conan export external/wasmedge --version 0.11.2 --user xahaud --channel stable - name: Install dependencies shell: bash env: CONAN_REQUEST_TIMEOUT: 180 # Increase timeout to 3 minutes for slow mirrors run: | # Create build directory mkdir -p ${{ inputs.build_dir }} cd ${{ inputs.build_dir }} # Install dependencies using conan conan install \ --output-folder . \ --build missing \ --settings build_type=${{ inputs.configuration }} \ .. - name: Save Conan cache if: always() && inputs.cache_enabled == 'true' && steps.cache-restore-conan.outputs.cache-hit != 'true' && steps.check-conanfile-changes.outputs.should-save-conan-cache == 'true' uses: actions/cache/save@v4 with: path: | ~/.conan ~/.conan2 key: ${{ steps.cache-restore-conan.outputs.cache-primary-key }}