From 8efc02b2d42f4bc28cba3cdb4c82ca7bc25d4e43 Mon Sep 17 00:00:00 2001 From: Niq Dudfield Date: Tue, 25 Nov 2025 13:23:41 +0700 Subject: [PATCH] refactor(ci): fix caching and improve [ci-] tag handling (#633) --- .../actions/xahau-configure-ccache/action.yml | 63 -------- .github/actions/xahau-ga-build/action.yml | 107 +++++++++++-- .../actions/xahau-ga-cache-restore/action.yml | 146 ++++++++++++++++++ .../actions/xahau-ga-dependencies/action.yml | 119 +++++++++----- .../xahau-ga-get-commit-message/action.yml | 74 +++++++++ .github/workflows/xahau-ga-macos.yml | 54 +++---- .github/workflows/xahau-ga-nix.yml | 83 +++++----- 7 files changed, 450 insertions(+), 196 deletions(-) delete mode 100644 .github/actions/xahau-configure-ccache/action.yml create mode 100644 .github/actions/xahau-ga-cache-restore/action.yml create mode 100644 .github/actions/xahau-ga-get-commit-message/action.yml diff --git a/.github/actions/xahau-configure-ccache/action.yml b/.github/actions/xahau-configure-ccache/action.yml deleted file mode 100644 index 44414b98a..000000000 --- a/.github/actions/xahau-configure-ccache/action.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: 'Configure ccache' -description: 'Sets up ccache with consistent configuration' - -inputs: - max_size: - description: 'Maximum cache size' - required: false - default: '2G' - hash_dir: - description: 'Whether to include directory paths in hash' - required: false - default: 'true' - compiler_check: - description: 'How to check compiler for changes' - required: false - default: 'content' - is_main_branch: - description: 'Whether the current branch is the main branch' - required: false - default: 'false' - main_cache_dir: - description: 'Path to the main branch cache directory' - required: false - default: '~/.ccache-main' - current_cache_dir: - description: 'Path to the current branch cache directory' - required: false - default: '~/.ccache-current' - -runs: - using: 'composite' - steps: - - name: Configure ccache - shell: bash - run: | - # Create cache directories - mkdir -p ${{ inputs.main_cache_dir }} ${{ inputs.current_cache_dir }} - - # Set compiler check globally - ccache -o compiler_check=${{ inputs.compiler_check }} - - # Use a single config file location - mkdir -p ~/.ccache - export CONF_PATH="$HOME/.ccache/ccache.conf" - - # Apply common settings - echo "max_size = ${{ inputs.max_size }}" > "$CONF_PATH" - echo "hash_dir = ${{ inputs.hash_dir }}" >> "$CONF_PATH" - echo "compiler_check = ${{ inputs.compiler_check }}" >> "$CONF_PATH" - - if [ "${{ inputs.is_main_branch }}" == "true" ]; then - # Main branch: use main branch cache - ccache --set-config=cache_dir="${{ inputs.main_cache_dir }}" - echo "CCACHE_DIR=${{ inputs.main_cache_dir }}" >> $GITHUB_ENV - else - # Feature branch: use current branch cache with main as secondary - ccache --set-config=cache_dir="${{ inputs.current_cache_dir }}" - ccache --set-config=secondary_storage="file:${{ inputs.main_cache_dir }}" - echo "CCACHE_DIR=${{ inputs.current_cache_dir }}" >> $GITHUB_ENV - fi - - ccache -p # Print config for verification - ccache -z # Zero statistics before the build \ No newline at end of file diff --git a/.github/actions/xahau-ga-build/action.yml b/.github/actions/xahau-ga-build/action.yml index 41731620d..c522fff79 100644 --- a/.github/actions/xahau-ga-build/action.yml +++ b/.github/actions/xahau-ga-build/action.yml @@ -47,6 +47,18 @@ inputs: description: 'GCC version to use for Clang toolchain (e.g. 11, 13)' required: false default: '' + ccache_max_size: + description: 'Maximum ccache size' + required: false + default: '2G' + ccache_hash_dir: + description: 'Whether to include directory paths in hash' + required: false + default: 'true' + ccache_compiler_check: + description: 'How to check compiler for changes' + required: false + default: 'content' runs: using: 'composite' @@ -59,21 +71,22 @@ runs: SAFE_BRANCH=$(echo "${{ github.ref_name }}" | tr -c 'a-zA-Z0-9_.-' '-') echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT - - name: Restore ccache directory for default branch + - name: Restore ccache directory for main branch if: inputs.ccache_enabled == 'true' id: ccache-restore - uses: actions/cache/restore@v4 + uses: ./.github/actions/xahau-ga-cache-restore with: path: ~/.ccache-main key: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }} restore-keys: | ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}- ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- + cache-type: ccache-main - name: Restore ccache directory for current branch if: inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch id: ccache-restore-current-branch - uses: actions/cache/restore@v4 + uses: ./.github/actions/xahau-ga-cache-restore with: path: ~/.ccache-current key: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ steps.safe-branch.outputs.name }} @@ -81,6 +94,40 @@ runs: ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}-${{ inputs.main_branch }} ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ inputs.configuration }}- ${{ runner.os }}-ccache-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- + cache-type: ccache-current + + - name: Configure ccache + if: inputs.ccache_enabled == 'true' + shell: bash + run: | + # Create cache directories + mkdir -p ~/.ccache-main ~/.ccache-current + + # Configure ccache settings AFTER cache restore (prevents stale cached config) + ccache --set-config=max_size=${{ inputs.ccache_max_size }} + ccache --set-config=hash_dir=${{ inputs.ccache_hash_dir }} + ccache --set-config=compiler_check=${{ inputs.ccache_compiler_check }} + + # Determine if we're on the main branch + if [ "${{ steps.safe-branch.outputs.name }}" = "${{ inputs.main_branch }}" ]; then + # Main branch: use main branch cache only + ccache --set-config=cache_dir="$HOME/.ccache-main" + echo "CCACHE_DIR=$HOME/.ccache-main" >> $GITHUB_ENV + echo "đŸ“Ļ Main branch: using ~/.ccache-main" + else + # Feature branch: use current branch cache with main as secondary (read-only fallback) + ccache --set-config=cache_dir="$HOME/.ccache-current" + ccache --set-config=secondary_storage="file:$HOME/.ccache-main" + echo "CCACHE_DIR=$HOME/.ccache-current" >> $GITHUB_ENV + echo "đŸ“Ļ Feature branch: using ~/.ccache-current with ~/.ccache-main as secondary" + fi + + # Print config for verification + echo "=== ccache configuration ===" + ccache -p + + # Zero statistics before the build + ccache -z - name: Configure project shell: bash @@ -96,14 +143,27 @@ runs: if [ -n "${{ inputs.cxx }}" ]; then export CXX="${{ inputs.cxx }}" fi - - - # Configure ccache launcher args - CCACHE_ARGS="" + + # Create wrapper toolchain that overlays ccache on top of Conan's toolchain + # This enables ccache for the main app build without affecting Conan dependency builds if [ "${{ inputs.ccache_enabled }}" = "true" ]; then - CCACHE_ARGS="-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" + cat > wrapper_toolchain.cmake <<'EOF' + # Include Conan's generated toolchain first (sets compiler, flags, etc.) + # Note: CMAKE_CURRENT_LIST_DIR is the directory containing this wrapper (.build/) + include(${CMAKE_CURRENT_LIST_DIR}/build/generators/conan_toolchain.cmake) + + # Overlay ccache configuration for main application build + # This does NOT affect Conan dependency builds (already completed) + set(CMAKE_C_COMPILER_LAUNCHER ccache CACHE STRING "C compiler launcher" FORCE) + set(CMAKE_CXX_COMPILER_LAUNCHER ccache CACHE STRING "C++ compiler launcher" FORCE) + EOF + TOOLCHAIN_FILE="wrapper_toolchain.cmake" + echo "✅ Created wrapper toolchain with ccache enabled" + else + TOOLCHAIN_FILE="build/generators/conan_toolchain.cmake" + echo "â„šī¸ Using Conan toolchain directly (ccache disabled)" fi - + # Configure C++ standard library if specified # libstdcxx used for clang-14/16 to work around missing lexicographical_compare_three_way in libc++ # libcxx can be used with clang-17+ which has full C++20 support @@ -143,31 +203,48 @@ runs: # So we get: .build/build/generators/ with our non-standard folder name cmake .. \ -G "${{ inputs.generator }}" \ - $CCACHE_ARGS \ ${CMAKE_CXX_FLAGS:+-DCMAKE_CXX_FLAGS="$CMAKE_CXX_FLAGS"} \ - -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${TOOLCHAIN_FILE} \ -DCMAKE_BUILD_TYPE=${{ inputs.configuration }} + - name: Show ccache config before build + if: inputs.ccache_enabled == 'true' + shell: bash + run: | + echo "==========================================" + echo "ccache configuration before build" + echo "==========================================" + ccache -p + echo "" + - name: Build project shell: bash run: | cd ${{ inputs.build_dir }} - cmake --build . --config ${{ inputs.configuration }} --parallel $(nproc) + + # Check for verbose build flag in commit message + VERBOSE_FLAG="" + if echo "${XAHAU_GA_COMMIT_MSG}" | grep -q '\[ci-ga-cmake-verbose\]'; then + echo "🔊 [ci-ga-cmake-verbose] detected - enabling verbose output" + VERBOSE_FLAG="-- -v" + fi + + cmake --build . --config ${{ inputs.configuration }} --parallel $(nproc) ${VERBOSE_FLAG} - name: Show ccache statistics if: inputs.ccache_enabled == 'true' shell: bash run: ccache -s - - name: Save ccache directory for default branch - if: always() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch + - name: Save ccache directory for main branch + if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch uses: actions/cache/save@v4 with: path: ~/.ccache-main key: ${{ steps.ccache-restore.outputs.cache-primary-key }} - name: Save ccache directory for current branch - if: always() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch + if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch uses: actions/cache/save@v4 with: path: ~/.ccache-current diff --git a/.github/actions/xahau-ga-cache-restore/action.yml b/.github/actions/xahau-ga-cache-restore/action.yml new file mode 100644 index 000000000..de7b8c2fa --- /dev/null +++ b/.github/actions/xahau-ga-cache-restore/action.yml @@ -0,0 +1,146 @@ +name: 'Cache Restore' +description: 'Restores cache with optional clearing based on commit message tags' + +inputs: + path: + description: 'A list of files, directories, and wildcard patterns to cache' + required: true + key: + description: 'An explicit key for restoring the cache' + required: true + restore-keys: + description: 'An ordered list of prefix-matched keys to use for restoring stale cache if no cache hit occurred for key' + required: false + default: '' + cache-type: + description: 'Type of cache (for logging purposes, e.g., "ccache-main", "Conan")' + required: false + default: 'cache' + fail-on-cache-miss: + description: 'Fail the workflow if cache entry is not found' + required: false + default: 'false' + lookup-only: + description: 'Check if a cache entry exists for the given input(s) without downloading it' + required: false + default: 'false' + additional-clear-keys: + description: 'Additional cache keys to clear (newline separated)' + required: false + default: '' + +outputs: + cache-hit: + description: 'A boolean value to indicate an exact match was found for the primary key' + value: ${{ steps.restore-cache.outputs.cache-hit }} + cache-primary-key: + description: 'The key that was used to restore the cache' + value: ${{ steps.restore-cache.outputs.cache-primary-key }} + cache-matched-key: + description: 'The key that was used to restore the cache (exact or prefix match)' + value: ${{ steps.restore-cache.outputs.cache-matched-key }} + +runs: + using: 'composite' + steps: + - name: Clear cache if requested via commit message + shell: bash + env: + GH_TOKEN: ${{ github.token }} + run: | + echo "==========================================" + echo "${{ inputs.cache-type }} cache clear tag detection" + echo "==========================================" + echo "Searching for: [ci-ga-clear-cache] or [ci-ga-clear-cache:*]" + echo "" + + CACHE_KEY="${{ inputs.key }}" + + # Extract search terms if present (e.g., "ccache" from "[ci-ga-clear-cache:ccache]") + SEARCH_TERMS=$(echo "${XAHAU_GA_COMMIT_MSG}" | grep -o '\[ci-ga-clear-cache:[^]]*\]' | sed 's/\[ci-ga-clear-cache://;s/\]//' || echo "") + + SHOULD_CLEAR=false + + if [ -n "${SEARCH_TERMS}" ]; then + # Search terms provided - check if THIS cache key matches ALL terms (AND logic) + echo "🔍 [ci-ga-clear-cache:${SEARCH_TERMS}] detected" + echo "Checking if cache key matches search terms..." + echo " Cache key: ${CACHE_KEY}" + echo " Search terms: ${SEARCH_TERMS}" + echo "" + + MATCHES=true + for term in ${SEARCH_TERMS}; do + if ! echo "${CACHE_KEY}" | grep -q "${term}"; then + MATCHES=false + echo " ✗ Key does not contain '${term}'" + break + else + echo " ✓ Key contains '${term}'" + fi + done + + if [ "${MATCHES}" = "true" ]; then + echo "" + echo "✅ Cache key matches all search terms - will clear cache" + SHOULD_CLEAR=true + else + echo "" + echo "â­ī¸ Cache key doesn't match search terms - skipping cache clear" + fi + elif echo "${XAHAU_GA_COMMIT_MSG}" | grep -q '\[ci-ga-clear-cache\]'; then + # No search terms - always clear this job's cache + echo "đŸ—‘ī¸ [ci-ga-clear-cache] detected in commit message" + echo "Clearing ${{ inputs.cache-type }} cache for key: ${CACHE_KEY}" + SHOULD_CLEAR=true + fi + + if [ "${SHOULD_CLEAR}" = "true" ]; then + echo "" + echo "Deleting ${{ inputs.cache-type }} caches via GitHub API..." + + # Delete primary cache key + echo "Checking for cache: ${CACHE_KEY}" + if gh cache list --key "${CACHE_KEY}" --json key --jq '.[].key' | grep -q "${CACHE_KEY}"; then + echo " Deleting: ${CACHE_KEY}" + gh cache delete "${CACHE_KEY}" || true + echo " ✓ Deleted" + else + echo " â„šī¸ Not found" + fi + + # Delete additional keys if provided + if [ -n "${{ inputs.additional-clear-keys }}" ]; then + echo "" + echo "Checking additional keys..." + while IFS= read -r key; do + [ -z "${key}" ] && continue + echo "Checking for cache: ${key}" + if gh cache list --key "${key}" --json key --jq '.[].key' | grep -q "${key}"; then + echo " Deleting: ${key}" + gh cache delete "${key}" || true + echo " ✓ Deleted" + else + echo " â„šī¸ Not found" + fi + done <<< "${{ inputs.additional-clear-keys }}" + fi + + echo "" + echo "✅ ${{ inputs.cache-type }} cache cleared successfully" + echo "Build will proceed from scratch" + else + echo "" + echo "â„šī¸ No ${{ inputs.cache-type }} cache clear requested" + fi + echo "==========================================" + + - name: Restore cache + id: restore-cache + uses: actions/cache/restore@v4 + with: + path: ${{ inputs.path }} + key: ${{ inputs.key }} + restore-keys: ${{ inputs.restore-keys }} + fail-on-cache-miss: ${{ inputs.fail-on-cache-miss }} + lookup-only: ${{ inputs.lookup-only }} diff --git a/.github/actions/xahau-ga-dependencies/action.yml b/.github/actions/xahau-ga-dependencies/action.yml index 38307c4be..1e0c49945 100644 --- a/.github/actions/xahau-ga-dependencies/action.yml +++ b/.github/actions/xahau-ga-dependencies/action.yml @@ -25,6 +25,28 @@ inputs: description: 'Main branch name for restore keys' required: false default: 'dev' + os: + description: 'Operating system (Linux, Macos)' + required: false + default: 'Linux' + arch: + description: 'Architecture (x86_64, armv8)' + required: false + default: 'x86_64' + compiler: + description: 'Compiler type (gcc, clang, apple-clang)' + required: true + compiler_version: + description: 'Compiler version (11, 13, 14, etc.)' + required: true + cc: + description: 'C compiler executable (gcc-13, clang-14, etc.), empty for macOS' + required: false + default: '' + cxx: + description: 'C++ compiler executable (g++-14, clang++-14, etc.), empty for macOS' + required: false + default: '' stdlib: description: 'C++ standard library for Conan configuration (note: also in compiler-id)' required: true @@ -41,47 +63,70 @@ outputs: 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 + uses: ./.github/actions/xahau-ga-cache-restore with: - path: | - ~/.conan - ~/.conan2 + path: ~/.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 }} + key: ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-${{ hashFiles('**/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 }}-${{ hashFiles('**/conanfile.py') }}- ${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}- + cache-type: Conan + + - name: Configure Conan + shell: bash + run: | + # Create the default profile directory if it doesn't exist + mkdir -p ~/.conan2/profiles + + # Determine the correct libcxx based on stdlib parameter + if [ "${{ inputs.stdlib }}" = "libcxx" ]; then + LIBCXX="libc++" + else + LIBCXX="libstdc++11" + fi + + # Create profile with our specific settings + # This overwrites any cached profile to ensure fresh configuration + cat > ~/.conan2/profiles/default <> ~/.conan2/profiles/default <> ~/.conan2/profiles/default < ~/.conan2/profiles/default <> $GITHUB_OUTPUT + echo "Detected Apple Clang version: ${COMPILER_VERSION}" - name: Install dependencies uses: ./.github/actions/xahau-ga-dependencies @@ -133,6 +113,11 @@ jobs: compiler-id: clang cache_version: ${{ env.CACHE_VERSION }} main_branch: ${{ env.MAIN_BRANCH_NAME }} + os: Macos + arch: armv8 + compiler: apple-clang + compiler_version: ${{ steps.detect-compiler.outputs.compiler_version }} + stdlib: libcxx - name: Build uses: ./.github/actions/xahau-ga-build @@ -143,6 +128,7 @@ jobs: compiler-id: clang cache_version: ${{ env.CACHE_VERSION }} main_branch: ${{ env.MAIN_BRANCH_NAME }} + stdlib: libcxx - name: Test run: | diff --git a/.github/workflows/xahau-ga-nix.yml b/.github/workflows/xahau-ga-nix.yml index 8e5c4c4c6..d58009d87 100644 --- a/.github/workflows/xahau-ga-nix.yml +++ b/.github/workflows/xahau-ga-nix.yml @@ -22,10 +22,13 @@ jobs: - name: Generate build matrix id: set-matrix shell: python + env: + GH_TOKEN: ${{ github.token }} run: | import json import os - + import urllib.request + # Full matrix with all 6 compiler configurations # Each configuration includes all parameters needed by the build job full_matrix = [ @@ -99,13 +102,31 @@ jobs: ref = "${{ github.ref }}" base_ref = "${{ github.base_ref }}" # For PRs, this is the target branch event_name = "${{ github.event_name }}" - commit_message = """${{ github.event.head_commit.message }}""" pr_title = """${{ github.event.pull_request.title }}""" - + pr_head_sha = "${{ github.event.pull_request.head.sha }}" + + # Get commit message - for PRs, fetch via API since head_commit.message is empty + if event_name == "pull_request" and pr_head_sha: + try: + url = f"https://api.github.com/repos/${{ github.repository }}/commits/{pr_head_sha}" + req = urllib.request.Request(url, headers={ + "Accept": "application/vnd.github.v3+json", + "Authorization": f"Bearer {os.environ.get('GH_TOKEN', '')}" + }) + with urllib.request.urlopen(req) as response: + data = json.load(response) + commit_message = data["commit"]["message"] + except Exception as e: + print(f"Failed to fetch commit message: {e}") + commit_message = "" + else: + commit_message = """${{ github.event.head_commit.message }}""" + # Debug logging print(f"Event: {event_name}") print(f"Ref: {ref}") print(f"Base ref: {base_ref}") + print(f"PR head SHA: {pr_head_sha}") print(f"PR title: {pr_title}") print(f"Commit message: {commit_message}") @@ -156,12 +177,20 @@ jobs: env: build_dir: .build # Bump this number to invalidate all caches globally. - CACHE_VERSION: 2 + CACHE_VERSION: 3 MAIN_BRANCH_NAME: dev steps: - name: Checkout uses: actions/checkout@v4 + - name: Get commit message + id: get-commit-message + uses: ./.github/actions/xahau-ga-get-commit-message + with: + event-name: ${{ github.event_name }} + head-commit-message: ${{ github.event.head_commit.message }} + pr-head-sha: ${{ github.event.pull_request.head.sha }} + - name: Install build dependencies run: | sudo apt-get update @@ -231,48 +260,6 @@ jobs: # Install Conan 2 pip install --upgrade "conan>=2.0,<3" - - name: Configure ccache - uses: ./.github/actions/xahau-configure-ccache - with: - max_size: 2G - hash_dir: true - compiler_check: content - is_main_branch: ${{ github.ref_name == env.MAIN_BRANCH_NAME }} - - - name: Configure Conan - run: | - # Create the default profile directory if it doesn't exist - mkdir -p ~/.conan2/profiles - - # Determine the correct libcxx based on stdlib parameter - if [ "${{ matrix.stdlib }}" = "libcxx" ]; then - LIBCXX="libc++" - else - LIBCXX="libstdc++11" - fi - - # Create profile with our specific settings - cat > ~/.conan2/profiles/default <