From b4ba9792db90cf8d332d4d04917979e3278aa3bb Mon Sep 17 00:00:00 2001 From: frstrtr Date: Tue, 14 Jul 2026 18:51:26 +0000 Subject: [PATCH 1/2] ci: fix job-level CONAN_HOME (runner.temp invalid at job-env parse) runner.temp is only valid at step scope; setting CONAN_HOME as job-level env made build.yml + release.yml fail to parse -> zero jobs materialized (CI + release dark since #700/#702). Export it in an early step via $GITHUB_ENV (PowerShell Out-File on Windows) where RUNNER_TEMP is valid. Per-job/per-cell Boost cache isolation preserved; path matches the step-level cache. --- .github/workflows/build.yml | 12 +++++++----- .github/workflows/release.yml | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 322695221..2f861275c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,14 +40,16 @@ jobs: linux: name: Linux x86_64 runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && fromJSON('["self-hosted","Linux","X64","c2pool-build"]') || 'ubuntu-24.04' }} - # Private per-job Conan home: each job builds Boost into an ISOLATED cache, - # so concurrent jobs can never tear each other's ~/.conan2 (root cause of the - # 1.90.0 torn-header flakes). See ci-boost-stream.md. - env: - CONAN_HOME: ${{ runner.temp }}/conan2 steps: - uses: actions/checkout@v6 + # Private per-job Conan home: each job builds Boost into an ISOLATED cache, + # so concurrent jobs can never tear each other's ~/.conan2 (root cause of the + # 1.90.0 torn-header flakes). RUNNER_TEMP is only valid at step scope, so + # export it via $GITHUB_ENV -- a job-level `env: runner.temp` fails to parse. + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Install system dependencies if: runner.environment == 'github-hosted' run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3f735cf00..0a7bd8d79 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,12 +56,6 @@ jobs: linux: name: ${{ matrix.coin }} package (Linux x86_64) runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && fromJSON('["self-hosted","Linux","X64","c2pool-build"]') || 'ubuntu-24.04' }} - # Private per-job Conan home: each coin cell builds Boost into an ISOLATED - # cache, so the concurrent cells sharing the one c2pool-build self-hosted - # host can never tear each other's ~/.conan2 (root cause of the 1.90.0 - # torn-header flakes). Mirrors build.yml. See ci-boost-stream.md. - env: - CONAN_HOME: ${{ runner.temp }}/conan2 strategy: fail-fast: false matrix: @@ -91,6 +85,11 @@ jobs: echo "::warning::c2pool-${{ matrix.coin }} source not on this ref — no ${{ matrix.coin }} Linux package will be produced." fi + # Per-coin-cell Conan home; RUNNER_TEMP is step-scope only, so export via + # $GITHUB_ENV (job-level `env: runner.temp` fails to parse). See build.yml. + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Install system dependencies if: steps.presence.outputs.exists == '1' # Serialize apt across the concurrent coin package jobs sharing the one @@ -432,9 +431,6 @@ jobs: windows: name: ${{ matrix.coin }} package (Windows x86_64) runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && fromJSON('["self-hosted","Windows","X64","c2pool-build"]') || 'windows-2022' }} - # Private per-job Conan home (isolated per coin cell) — see the Linux lane. - env: - CONAN_HOME: ${{ runner.temp }}/conan2 defaults: run: # VM217 Windows PowerShell runs at ExecutionPolicy=Restricted and has no @@ -449,6 +445,11 @@ jobs: steps: - uses: actions/checkout@v6 + # Per-coin-cell Conan home; RUNNER_TEMP is step-scope only, so export via + # $GITHUB_ENV (job-level `env: runner.temp` fails to parse). PowerShell form. + - name: Set per-job Conan home + run: echo "CONAN_HOME=$env:RUNNER_TEMP/conan2" | Out-File -FilePath $env:GITHUB_ENV -Append + - name: Resolve version id: ver run: | From b971c7377da4eccb5fa18151e46e810cebb0e374 Mon Sep 17 00:00:00 2001 From: frstrtr Date: Tue, 14 Jul 2026 19:10:07 +0000 Subject: [PATCH 2/2] ci: extend per-job CONAN_HOME isolation to gate + smoke + codeql workflows Fold the runner.temp parse-fix into one CI-repair pass: convert every conan-building workflow that was still on the shared ~/.conan2 pattern (the root cause of the Boost 1.90.0 torn-cache flakes, e.g. b2/5.5.1 recipe loss) to the isolated per-job home used by build.yml/release.yml. Workflows (7): bch-gate-g3a, bch-gate-g3b, dash-gate-g1, dash-gate-g3a, dgb-phase-b-smoke, coin-matrix, codeql-analysis - add early step exporting CONAN_HOME=$RUNNER_TEMP/conan2 via GITHUB_ENV (runner.temp is step-scope only; job-level env fails to parse) - drop conan profile detect --force + cppstd sed; use committed ci/conan/linux-gcc13.profile - cache path -> runner.temp/conan2; key scoped by profile + conan.lock Gate scripts (5): bch_g3a, bch_g3b, dgb_phase_b_smoke, g1_byte_parity_kat, g3a_regtest_block_production - conan install now pins -pr:a= --lockfile=conan.lock --- .../bch-gate-g3a-regtest-block-production.yml | 13 +++++++------ .../workflows/bch-gate-g3b-genuine-activation.yml | 13 +++++++------ .github/workflows/codeql-analysis.yml | 15 +++++++++------ .github/workflows/coin-matrix.yml | 15 +++++++++------ .github/workflows/dash-gate-g1-byte-parity.yml | 13 +++++++------ .../dash-gate-g3a-regtest-block-production.yml | 13 +++++++------ .github/workflows/dgb-phase-b-smoke.yml | 13 +++++++------ tests/gates/bch_g3a_regtest_block_production.sh | 2 +- tests/gates/bch_g3b_genuine_activation.sh | 2 +- tests/gates/dgb_phase_b_smoke.sh | 2 +- tests/gates/g1_byte_parity_kat.sh | 2 +- tests/gates/g3a_regtest_block_production.sh | 2 +- 12 files changed, 58 insertions(+), 47 deletions(-) diff --git a/.github/workflows/bch-gate-g3a-regtest-block-production.yml b/.github/workflows/bch-gate-g3a-regtest-block-production.yml index 2e620d17c..1b14c6bc1 100644 --- a/.github/workflows/bch-gate-g3a-regtest-block-production.yml +++ b/.github/workflows/bch-gate-g3a-regtest-block-production.yml @@ -33,6 +33,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check gate entrypoint presence id: presence run: | @@ -65,18 +68,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-bch-g3a-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-bch-g3a-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-bch-g3a- conan2-ubuntu24-gcc13- diff --git a/.github/workflows/bch-gate-g3b-genuine-activation.yml b/.github/workflows/bch-gate-g3b-genuine-activation.yml index ddd094d40..afa628f5e 100644 --- a/.github/workflows/bch-gate-g3b-genuine-activation.yml +++ b/.github/workflows/bch-gate-g3b-genuine-activation.yml @@ -30,6 +30,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check gate entrypoint presence id: presence run: | @@ -62,18 +65,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-bch-g3b-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-bch-g3b-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-bch-g3b- conan2-ubuntu24-gcc13- diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 246ab01a7..556b6d0ee 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -47,6 +47,10 @@ jobs: build-mode: ${{ matrix.build-mode }} queries: security-and-quality + - if: matrix.build-mode == 'manual' + name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + # ── C++ build (manual mode only) ───────────────────────────────────── - if: matrix.build-mode == 'manual' && runner.environment == 'github-hosted' name: Install system dependencies @@ -73,17 +77,14 @@ jobs: else conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' \ - "$(conan profile path default)" - if: matrix.build-mode == 'manual' name: Restore Conan package cache uses: actions/cache@v5 with: - path: ~/.conan2 - # Share cache with build.yml (same Release profile) - key: conan2-ubuntu24-gcc13-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + # Isolated per-job Conan home; keyed by profile + lockfile. + key: conan2-ubuntu24-gcc13-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: conan2-ubuntu24-gcc13- - if: matrix.build-mode == 'manual' && runner.environment != 'github-hosted' @@ -94,6 +95,8 @@ jobs: name: Install Conan dependencies run: | conan install . \ + -pr:a=ci/conan/linux-gcc13.profile \ + --lockfile=conan.lock \ --build=missing \ --output-folder=build_codeql \ --settings=build_type=Release diff --git a/.github/workflows/coin-matrix.yml b/.github/workflows/coin-matrix.yml index 5e39b4220..17bfc054b 100644 --- a/.github/workflows/coin-matrix.yml +++ b/.github/workflows/coin-matrix.yml @@ -37,6 +37,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check source presence id: presence run: | @@ -69,18 +72,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-${{ matrix.coin }}-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-${{ matrix.coin }}-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-${{ matrix.coin }}- conan2-ubuntu24-gcc13- @@ -102,6 +103,8 @@ jobs: if: steps.presence.outputs.exists == '1' run: | conan install . \ + -pr:a=ci/conan/linux-gcc13.profile \ + --lockfile=conan.lock \ --build=missing \ --output-folder=build_${{ matrix.coin }} \ --settings=build_type=Release diff --git a/.github/workflows/dash-gate-g1-byte-parity.yml b/.github/workflows/dash-gate-g1-byte-parity.yml index 6b25e7dde..5a5d299fc 100644 --- a/.github/workflows/dash-gate-g1-byte-parity.yml +++ b/.github/workflows/dash-gate-g1-byte-parity.yml @@ -31,6 +31,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check gate entrypoint presence id: presence run: | @@ -63,18 +66,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-dash-g1-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-dash-g1-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-dash-g1- conan2-ubuntu24-gcc13- diff --git a/.github/workflows/dash-gate-g3a-regtest-block-production.yml b/.github/workflows/dash-gate-g3a-regtest-block-production.yml index b6591390e..260986106 100644 --- a/.github/workflows/dash-gate-g3a-regtest-block-production.yml +++ b/.github/workflows/dash-gate-g3a-regtest-block-production.yml @@ -34,6 +34,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check gate entrypoint presence id: presence run: | @@ -66,18 +69,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-dash-g3a-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-dash-g3a-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-dash-g3a- conan2-ubuntu24-gcc13- diff --git a/.github/workflows/dgb-phase-b-smoke.yml b/.github/workflows/dgb-phase-b-smoke.yml index 9d5544d74..af2398f26 100644 --- a/.github/workflows/dgb-phase-b-smoke.yml +++ b/.github/workflows/dgb-phase-b-smoke.yml @@ -26,6 +26,9 @@ jobs: steps: - uses: actions/checkout@v6 + - name: Set per-job Conan home + run: echo "CONAN_HOME=$RUNNER_TEMP/conan2" >> "$GITHUB_ENV" + - name: Check DGB Phase-B source presence id: presence run: | @@ -57,18 +60,16 @@ jobs: conan --version # pre-provisioned at /usr/local/bin on self-hosted fi - - name: Detect Conan profile + - name: Show committed Conan profile if: steps.presence.outputs.exists == '1' - run: | - conan profile detect --force - sed -i 's/compiler.cppstd=.*/compiler.cppstd=20/' "$(conan profile path default)" + run: conan profile show -pr:a=ci/conan/linux-gcc13.profile - name: Restore Conan cache if: steps.presence.outputs.exists == '1' uses: actions/cache@v5 with: - path: ~/.conan2 - key: conan2-ubuntu24-gcc13-dgb-smoke-${{ hashFiles('conanfile.txt') }} + path: ${{ runner.temp }}/conan2 + key: conan2-ubuntu24-gcc13-dgb-smoke-${{ hashFiles('conanfile.txt', 'ci/conan/linux-gcc13.profile', 'conan.lock') }} restore-keys: | conan2-ubuntu24-gcc13-dgb-smoke- conan2-ubuntu24-gcc13- diff --git a/tests/gates/bch_g3a_regtest_block_production.sh b/tests/gates/bch_g3a_regtest_block_production.sh index 7d4515e30..72b60fcbb 100755 --- a/tests/gates/bch_g3a_regtest_block_production.sh +++ b/tests/gates/bch_g3a_regtest_block_production.sh @@ -36,7 +36,7 @@ BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build_bch}" # 1. Ensure the targets exist (configure+build only if the CI cache is cold). if [ ! -f "$BUILD_DIR/CMakeCache.txt" ]; then echo "[$GATE] no build dir at $BUILD_DIR — configuring (conan + cmake -DCOIN_BCH=ON)" - conan install "$REPO_ROOT" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release + conan install "$REPO_ROOT" -pr:a="$REPO_ROOT/ci/conan/linux-gcc13.profile" --lockfile="$REPO_ROOT/conan.lock" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \ -DCMAKE_TOOLCHAIN_FILE="$BUILD_DIR/conan_toolchain.cmake" \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/tests/gates/bch_g3b_genuine_activation.sh b/tests/gates/bch_g3b_genuine_activation.sh index ce65262ae..ca796b024 100755 --- a/tests/gates/bch_g3b_genuine_activation.sh +++ b/tests/gates/bch_g3b_genuine_activation.sh @@ -46,7 +46,7 @@ BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build_bch}" # 1. Ensure the targets exist (configure+build only if the CI cache is cold). if [ ! -f "$BUILD_DIR/CMakeCache.txt" ]; then echo "[$GATE] no build dir at $BUILD_DIR — configuring (conan + cmake -DCOIN_BCH=ON)" - conan install "$REPO_ROOT" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release + conan install "$REPO_ROOT" -pr:a="$REPO_ROOT/ci/conan/linux-gcc13.profile" --lockfile="$REPO_ROOT/conan.lock" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \ -DCMAKE_TOOLCHAIN_FILE="$BUILD_DIR/conan_toolchain.cmake" \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/tests/gates/dgb_phase_b_smoke.sh b/tests/gates/dgb_phase_b_smoke.sh index acb0ffd7c..4b3d6cd9f 100755 --- a/tests/gates/dgb_phase_b_smoke.sh +++ b/tests/gates/dgb_phase_b_smoke.sh @@ -23,7 +23,7 @@ BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build}" # 1. Configure (conan + cmake) only if the CI cache is cold. if [ ! -f "$BUILD_DIR/CMakeCache.txt" ]; then echo "[$GATE] no build dir at $BUILD_DIR — configuring (conan + cmake)" - conan install "$REPO_ROOT" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release + conan install "$REPO_ROOT" -pr:a="$REPO_ROOT/ci/conan/linux-gcc13.profile" --lockfile="$REPO_ROOT/conan.lock" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \ -DCMAKE_TOOLCHAIN_FILE="$BUILD_DIR/conan_toolchain.cmake" \ -DCMAKE_BUILD_TYPE=Release \ diff --git a/tests/gates/g1_byte_parity_kat.sh b/tests/gates/g1_byte_parity_kat.sh index fe39f80f0..49c51d6a7 100755 --- a/tests/gates/g1_byte_parity_kat.sh +++ b/tests/gates/g1_byte_parity_kat.sh @@ -17,7 +17,7 @@ BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build}" # 1. Ensure the target exists (configure+build only if the CI cache is cold). if [ ! -f "$BUILD_DIR/CMakeCache.txt" ]; then echo "[$GATE] no build dir at $BUILD_DIR — configuring (conan + cmake)" - conan install "$REPO_ROOT" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release + conan install "$REPO_ROOT" -pr:a="$REPO_ROOT/ci/conan/linux-gcc13.profile" --lockfile="$REPO_ROOT/conan.lock" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \ -DCMAKE_TOOLCHAIN_FILE="$BUILD_DIR/conan_toolchain.cmake" \ -DCMAKE_BUILD_TYPE=Release diff --git a/tests/gates/g3a_regtest_block_production.sh b/tests/gates/g3a_regtest_block_production.sh index 40db08148..ead770c5a 100755 --- a/tests/gates/g3a_regtest_block_production.sh +++ b/tests/gates/g3a_regtest_block_production.sh @@ -21,7 +21,7 @@ BUILD_DIR="${BUILD_DIR:-$REPO_ROOT/build}" # 1. Ensure the targets exist (configure+build only if the CI cache is cold). if [ ! -f "$BUILD_DIR/CMakeCache.txt" ]; then echo "[$GATE] no build dir at $BUILD_DIR — configuring (conan + cmake)" - conan install "$REPO_ROOT" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release + conan install "$REPO_ROOT" -pr:a="$REPO_ROOT/ci/conan/linux-gcc13.profile" --lockfile="$REPO_ROOT/conan.lock" --build=missing --output-folder="$BUILD_DIR" --settings=build_type=Release cmake -S "$REPO_ROOT" -B "$BUILD_DIR" \ -DCMAKE_TOOLCHAIN_FILE="$BUILD_DIR/conan_toolchain.cmake" \ -DCMAKE_BUILD_TYPE=Release