From 11ab3d31fcf198b64b637ba7111d09cfe3c945aa Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Wed, 23 Sep 2026 20:46:46 -0400 Subject: [PATCH 01/26] Build GEOS on the macOS 26 arm64 runner. --- .github/workflows/macos.yml | 82 +++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 .github/workflows/macos.yml diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 00000000000..91f6f2b091d --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,82 @@ +name: macOS + +on: + push: + branches: + - ci/paludettomag1/macos + workflow_dispatch: + +jobs: + build_macos: + name: macOS 26 - Apple Clang (arm64) + runs-on: macos-26 + defaults: + run: + shell: bash + env: + HOMEBREW_NO_ANALYTICS: 1 + + steps: + - name: Checkout GEOS + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + submodules: true + lfs: false + + - name: Checkout thirdPartyLibs + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: GEOS-DEV/thirdPartyLibs + ref: ci/paludettomag1/macos + path: thirdPartyLibs + submodules: true + lfs: true + + - name: Set up Python for Uberenv + uses: actions/setup-python@v6 + with: + python-version: '3.12' + + - name: Set up build environment + run: | + python3 -m pip install clingo + echo "SPACK_PYTHON=$(command -v python3)" >> "$GITHUB_ENV" + echo "GEOSX_TPL_DIR=$RUNNER_TEMP/geos-tpls" >> "$GITHUB_ENV" + echo "SPACK_CONFIG=$RUNNER_TEMP/geosx-macos-spack.yaml" >> "$GITHUB_ENV" + echo "GEOS_BUILD_DIR=$RUNNER_TEMP/geos-build" >> "$GITHUB_ENV" + + - name: Prepare Homebrew dependencies + working-directory: thirdPartyLibs + run: | + unset HOMEBREW_NO_INSTALL_UPGRADE HOMEBREW_NO_INSTALL_CLEANUP + brew update + python3 - <<'PY' + import json + import subprocess + + with open('scripts/spack_configs/macOS/homebrew-manifest.json') as stream: + formulae = [entry['name'] for entry in json.load(stream)['formulae']] + installed = subprocess.check_output(['brew', 'list', '--formula'], text=True).split() + if 'mpich' in installed and 'open-mpi' in formulae: + formulae.remove('open-mpi') + subprocess.run(['brew', 'install', '--formula', *formulae], check=True) + PY + bash scripts/setupMacOS-TPL-deps.bash --spack-config-out "$SPACK_CONFIG" + + - name: Build macOS TPLs + working-directory: thirdPartyLibs + run: | + python3 scripts/uberenv/uberenv.py \ + --project-json="$GITHUB_WORKSPACE/thirdPartyLibs/.uberenv_config.json" \ + --package-source-dir="$GITHUB_WORKSPACE" \ + --spack-env-file="$SPACK_CONFIG" \ + --prefix="$GEOSX_TPL_DIR" \ + --spec="~pygeosx ~docs ~openmp %c,cxx=apple-clang %fortran=gcc@16.2.0" \ + -j 2 + + - name: Build GEOS + run: | + host_config=$(find "$GITHUB_WORKSPACE" -maxdepth 1 -name '*.cmake' -print -quit) + test -n "$host_config" + python3 scripts/config-build.py -hc "$host_config" -bt Release --buildpath "$GEOS_BUILD_DIR" + cmake --build "$GEOS_BUILD_DIR" -j 2 --target geosx From dc443b3dc61514c58cc869365ffc12dfc241e641 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Wed, 23 Sep 2026 20:53:30 -0400 Subject: [PATCH 02/26] Build macOS GEOS from the published TPL image. --- .github/workflows/ci_tests.yml | 42 ++++++++++++++++- .github/workflows/macos.yml | 82 ---------------------------------- 2 files changed, 40 insertions(+), 84 deletions(-) delete mode 100644 .github/workflows/macos.yml diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index f430d38c499..80bb6638193 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -484,6 +484,41 @@ jobs: REQUIRED_LABEL: "ci: run device builds" secrets: inherit + # Native macOS build. The TPL install comes from the published image + # geosx/macos-26-apple-clang:${GEOS_TPL_TAG}, the same tag the Linux jobs use. + macos_builds: + name: macOS 26 - Apple Clang (arm64) + needs: [is_not_draft_pull_request] + runs-on: macos-26 + steps: + - name: Checkout Repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + submodules: true + lfs: false + fetch-depth: 1 + - name: Load macOS TPL image + env: + DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} + run: | + set -euo pipefail + image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" + docker pull "$image" + container=$(docker create "$image") + sudo mkdir -p /opt/GEOS + sudo chown "$(id -un)" /opt/GEOS + docker cp "$container":/opt/GEOS/. /opt/GEOS/ + docker cp "$container":/spack-generated.cmake /opt/GEOS/spack-generated.cmake + docker rm "$container" + - name: Build GEOS + run: | + set -euo pipefail + python3 scripts/config-build.py \ + -hc /opt/GEOS/spack-generated.cmake \ + -bt Release \ + --buildpath "$RUNNER_TEMP/geos-build" + cmake --build "$RUNNER_TEMP/geos-build" -j 2 --target geosx + # Convenience job - passes when all substantive jobs have passed. A # submodule-sync failure is an allowed exception when testing submodule branches. check_that_all_jobs_succeeded: @@ -497,6 +532,7 @@ jobs: - cuda_builds - rocm_builds - run_integrated_tests + - macos_builds if: ${{ always() }} steps: - run: | @@ -506,7 +542,8 @@ jobs: echo "cpu_builds: ${{needs.cpu_builds.result}}" echo "cuda_builds: ${{needs.cuda_builds.result}}" echo "rocm_builds: ${{needs.rocm_builds.result}}" - echo "run_integrated_tests: ${{needs.run_integrated_tests.result}} " + echo "run_integrated_tests: ${{needs.run_integrated_tests.result}}" + echo "macos_builds: ${{needs.macos_builds.result}}" ${{ needs.if_not_unassigned_pull_request.result == 'success' && ( @@ -517,5 +554,6 @@ jobs: needs.cpu_builds.result == 'success' && needs.cuda_builds.result == 'success' && needs.rocm_builds.result == 'success' && - needs.run_integrated_tests.result == 'success' + needs.run_integrated_tests.result == 'success' && + needs.macos_builds.result == 'success' }} diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml deleted file mode 100644 index 91f6f2b091d..00000000000 --- a/.github/workflows/macos.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: macOS - -on: - push: - branches: - - ci/paludettomag1/macos - workflow_dispatch: - -jobs: - build_macos: - name: macOS 26 - Apple Clang (arm64) - runs-on: macos-26 - defaults: - run: - shell: bash - env: - HOMEBREW_NO_ANALYTICS: 1 - - steps: - - name: Checkout GEOS - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - submodules: true - lfs: false - - - name: Checkout thirdPartyLibs - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - repository: GEOS-DEV/thirdPartyLibs - ref: ci/paludettomag1/macos - path: thirdPartyLibs - submodules: true - lfs: true - - - name: Set up Python for Uberenv - uses: actions/setup-python@v6 - with: - python-version: '3.12' - - - name: Set up build environment - run: | - python3 -m pip install clingo - echo "SPACK_PYTHON=$(command -v python3)" >> "$GITHUB_ENV" - echo "GEOSX_TPL_DIR=$RUNNER_TEMP/geos-tpls" >> "$GITHUB_ENV" - echo "SPACK_CONFIG=$RUNNER_TEMP/geosx-macos-spack.yaml" >> "$GITHUB_ENV" - echo "GEOS_BUILD_DIR=$RUNNER_TEMP/geos-build" >> "$GITHUB_ENV" - - - name: Prepare Homebrew dependencies - working-directory: thirdPartyLibs - run: | - unset HOMEBREW_NO_INSTALL_UPGRADE HOMEBREW_NO_INSTALL_CLEANUP - brew update - python3 - <<'PY' - import json - import subprocess - - with open('scripts/spack_configs/macOS/homebrew-manifest.json') as stream: - formulae = [entry['name'] for entry in json.load(stream)['formulae']] - installed = subprocess.check_output(['brew', 'list', '--formula'], text=True).split() - if 'mpich' in installed and 'open-mpi' in formulae: - formulae.remove('open-mpi') - subprocess.run(['brew', 'install', '--formula', *formulae], check=True) - PY - bash scripts/setupMacOS-TPL-deps.bash --spack-config-out "$SPACK_CONFIG" - - - name: Build macOS TPLs - working-directory: thirdPartyLibs - run: | - python3 scripts/uberenv/uberenv.py \ - --project-json="$GITHUB_WORKSPACE/thirdPartyLibs/.uberenv_config.json" \ - --package-source-dir="$GITHUB_WORKSPACE" \ - --spack-env-file="$SPACK_CONFIG" \ - --prefix="$GEOSX_TPL_DIR" \ - --spec="~pygeosx ~docs ~openmp %c,cxx=apple-clang %fortran=gcc@16.2.0" \ - -j 2 - - - name: Build GEOS - run: | - host_config=$(find "$GITHUB_WORKSPACE" -maxdepth 1 -name '*.cmake' -print -quit) - test -n "$host_config" - python3 scripts/config-build.py -hc "$host_config" -bt Release --buildpath "$GEOS_BUILD_DIR" - cmake --build "$GEOS_BUILD_DIR" -j 2 --target geosx From 886d81dde579d526c42ae2ba57424ace5a969064 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Wed, 23 Sep 2026 20:59:42 -0400 Subject: [PATCH 03/26] Read GEOS_TPL_DIR from the TPL images. --- host-configs/Stanford/sherlock-gcc10.cmake | 4 +++- host-configs/environment.cmake | 6 +++++- scripts/ci_build_and_test_in_container.sh | 13 +++++++++---- src/docs/sphinx/buildGuide/BuildProcess.rst | 2 +- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/host-configs/Stanford/sherlock-gcc10.cmake b/host-configs/Stanford/sherlock-gcc10.cmake index 03f0047c522..1216df2f6ed 100644 --- a/host-configs/Stanford/sherlock-gcc10.cmake +++ b/host-configs/Stanford/sherlock-gcc10.cmake @@ -40,7 +40,9 @@ set(ENABLE_VALGRIND OFF CACHE BOOL "") set(ENABLE_CALIPER ON CACHE BOOL "") set(ENABLE_HYPREDRV ON CACHE BOOL "") -if (DEFINED ENV{GEOSX_TPL_DIR}) +if (DEFINED ENV{GEOS_TPL_DIR}) + set(GEOS_TPL_DIR "$ENV{GEOS_TPL_DIR}" CACHE PATH "" FORCE) +elseif (DEFINED ENV{GEOSX_TPL_DIR}) set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) endif() include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/host-configs/environment.cmake b/host-configs/environment.cmake index 5f72a9197a6..5df385a1dbe 100644 --- a/host-configs/environment.cmake +++ b/host-configs/environment.cmake @@ -88,5 +88,9 @@ if(DEFINED ENV{GEOS_BUILD_SHARED_LIBS}) set(GEOS_BUILD_SHARED_LIBS "$ENV{GEOS_BUILD_SHARED_LIBS}" CACHE BOOL "" FORCE) endif() -set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +if(DEFINED ENV{GEOS_TPL_DIR}) + set(GEOS_TPL_DIR "$ENV{GEOS_TPL_DIR}" CACHE PATH "" FORCE) +else() + set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +endif() include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 034699d5f92..fadd75b94de 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -3,6 +3,13 @@ set -o pipefail export PYTHONDONTWRITEBYTECODE=1 +# Current TPL images export GEOS_TPL_DIR. Images built before that export +# GEOSX_TPL_DIR, which the pinned tag still provides. +if [[ -z "${GEOS_TPL_DIR:-}" && -n "${GEOSX_TPL_DIR:-}" ]]; then + GEOS_TPL_DIR=${GEOSX_TPL_DIR} +fi +export GEOS_TPL_DIR + SCRIPT_NAME=$0 echo "Running CLI ${SCRIPT_NAME} $@" @@ -344,7 +351,7 @@ do --enable-trilinos) ENABLE_TRILINOS=$2; shift 2;; --exchange-dir) DATA_EXCHANGE_DIR=$2; shift 2;; --host-config) HOST_CONFIG=$2; shift 2;; - --install-dir-basename) GEOS_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; + --install-dir-basename) GEOS_DIR=${GEOS_TPL_DIR}/../$2; shift 2;; --makefile) BUILD_GENERATOR=""; shift;; --no-install-schema) GEOS_INSTALL_SCHEMA=false; shift;; --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; @@ -416,7 +423,7 @@ print_crypto_diagnostics # Always pass the requested state so a host-config cannot silently enable # hypredrive when the CI job requested OFF. Do not pass -DHYPREDRV_DIR: # TPL images install hypredrive under a compiler-prefixed hashed path, which -# /spack-generated.cmake already sets. ${GEOSX_TPL_DIR}/hypredrive does not +# /spack-generated.cmake already sets. ${GEOS_TPL_DIR}/hypredrive does not # exist and would override that host-config value (CMake -D wins over -C # set(... CACHE ...) without FORCE). HYPREDRV_CMAKE_ARGS=(-DENABLE_HYPREDRV=${ENABLE_HYPREDRV}) @@ -646,8 +653,6 @@ else echo "DATA_EXCHANGE_DIR=${DATA_EXCHANGE_DIR}" echo "DATA_BASENAME_WE=${DATA_BASENAME_WE}" echo "GEOS_TPL_DIR=${GEOS_TPL_DIR}" - echo "GEOSX_TPL_DIR=${GEOSX_TPL_DIR}" - GEOS_TPL_DIR=${GEOSX_TPL_DIR} echo tar czf ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar.gz --directory=${GEOS_TPL_DIR}/.. --transform "s|^./|${DATA_BASENAME_WE}/|" . or_die tar czf ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar.gz --directory=${GEOS_TPL_DIR}/.. --transform "s|^./|${DATA_BASENAME_WE}/|" . fi diff --git a/src/docs/sphinx/buildGuide/BuildProcess.rst b/src/docs/sphinx/buildGuide/BuildProcess.rst index 3fcff6c15b3..bc2634380be 100644 --- a/src/docs/sphinx/buildGuide/BuildProcess.rst +++ b/src/docs/sphinx/buildGuide/BuildProcess.rst @@ -15,7 +15,7 @@ Build steps This can be done in one of two ways: * Provide each path via a separate CMake variable (see :ref:`Dependencies` for path variable names). - * If you built TPLs from the ``tplMirror`` repository, you can set ``GEOSX_TPL_DIR`` variable in your host-config to point to the TPL installation path, and + * If you built TPLs from the ``tplMirror`` repository, you can set ``GEOS_TPL_DIR`` variable in your host-config to point to the TPL installation path, and .. code-block:: cmake From 4f905e33cf3b0d39070bd234d40959a41d9821cc Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Wed, 23 Sep 2026 21:01:04 -0400 Subject: [PATCH 04/26] Drop the GEOSX_TPL_DIR fallback. --- host-configs/Stanford/sherlock-gcc10.cmake | 2 -- host-configs/environment.cmake | 6 +----- scripts/ci_build_and_test_in_container.sh | 7 ------- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/host-configs/Stanford/sherlock-gcc10.cmake b/host-configs/Stanford/sherlock-gcc10.cmake index 1216df2f6ed..27a257b7675 100644 --- a/host-configs/Stanford/sherlock-gcc10.cmake +++ b/host-configs/Stanford/sherlock-gcc10.cmake @@ -42,7 +42,5 @@ set(ENABLE_HYPREDRV ON CACHE BOOL "") if (DEFINED ENV{GEOS_TPL_DIR}) set(GEOS_TPL_DIR "$ENV{GEOS_TPL_DIR}" CACHE PATH "" FORCE) -elseif (DEFINED ENV{GEOSX_TPL_DIR}) - set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) endif() include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/host-configs/environment.cmake b/host-configs/environment.cmake index 5df385a1dbe..40346cd06e3 100644 --- a/host-configs/environment.cmake +++ b/host-configs/environment.cmake @@ -88,9 +88,5 @@ if(DEFINED ENV{GEOS_BUILD_SHARED_LIBS}) set(GEOS_BUILD_SHARED_LIBS "$ENV{GEOS_BUILD_SHARED_LIBS}" CACHE BOOL "" FORCE) endif() -if(DEFINED ENV{GEOS_TPL_DIR}) - set(GEOS_TPL_DIR "$ENV{GEOS_TPL_DIR}" CACHE PATH "" FORCE) -else() - set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) -endif() +set(GEOS_TPL_DIR "$ENV{GEOS_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index fadd75b94de..4627b4a84c0 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -3,13 +3,6 @@ set -o pipefail export PYTHONDONTWRITEBYTECODE=1 -# Current TPL images export GEOS_TPL_DIR. Images built before that export -# GEOSX_TPL_DIR, which the pinned tag still provides. -if [[ -z "${GEOS_TPL_DIR:-}" && -n "${GEOSX_TPL_DIR:-}" ]]; then - GEOS_TPL_DIR=${GEOSX_TPL_DIR} -fi -export GEOS_TPL_DIR - SCRIPT_NAME=$0 echo "Running CLI ${SCRIPT_NAME} $@" From 1a183c35d678c7e493436d279c40523be0054afa Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Wed, 23 Sep 2026 21:02:05 -0400 Subject: [PATCH 05/26] Point LvArray at the GEOS_TPL_ROOT_DIR rename. --- src/coreComponents/LvArray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 36fa6757a8d..63b5e60976c 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 36fa6757a8d84f46cdb14082d18f8fc332cc3339 +Subproject commit 63b5e60976c6910ddf43c76cb0525f51ea47f806 From c9179ffef06f6ed5783bc92a7fb72511b6afda47 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 10:14:36 -0400 Subject: [PATCH 06/26] Pin GEOS_TPL_TAG to the published macOS TPL image. --- .devcontainer/devcontainer.json | 2 +- .github/workflows/ci_tests.yml | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4b3483ef6d2..c4d70880481 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "364-1112" + "GEOS_TPL_TAG": "370-1134" } }, "runArgs": [ diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 80bb6638193..e5a0dc1ca66 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -497,19 +497,18 @@ jobs: submodules: true lfs: false fetch-depth: 1 - - name: Load macOS TPL image + - name: Load TPL image env: DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} run: | set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/crane.tgz" \ + https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz + tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" - docker pull "$image" - container=$(docker create "$image") - sudo mkdir -p /opt/GEOS - sudo chown "$(id -un)" /opt/GEOS - docker cp "$container":/opt/GEOS/. /opt/GEOS/ - docker cp "$container":/spack-generated.cmake /opt/GEOS/spack-generated.cmake - docker rm "$container" + "$RUNNER_TEMP/crane" export "$image" - | sudo tar -C / -xf - + sudo mv /spack-generated.cmake /opt/GEOS/spack-generated.cmake + sudo chown -R "$(id -un)" /opt/GEOS - name: Build GEOS run: | set -euo pipefail From 59c9e022c44bff6fa3aea9dec12584204cef18a2 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 17:05:09 -0400 Subject: [PATCH 07/26] Extract the macOS TPL image without relying on BSD tar hardlinks. --- .github/workflows/ci_tests.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index e5a0dc1ca66..e5a79d8d716 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -506,7 +506,29 @@ jobs: https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" - "$RUNNER_TEMP/crane" export "$image" - | sudo tar -C / -xf - + "$RUNNER_TEMP/crane" export "$image" "$RUNNER_TEMP/tpl.tar" + sed 's/^ //' <<'PY' | sudo python3 - "$RUNNER_TEMP/tpl.tar" + import inspect + import os + import sys + import tarfile + + with tarfile.open(sys.argv[1]) as tar: + members = tar.getmembers() + kwargs = {} + if "filter" in inspect.signature(tar.extractall).parameters: + kwargs["filter"] = "fully_trusted" + tar.extractall("/", members=[member for member in members if not member.islnk()], **kwargs) + for member in members: + if not member.islnk(): + continue + destination = os.path.join("/", member.name) + source = os.path.join("/", member.linkname) + os.makedirs(os.path.dirname(destination), exist_ok=True) + if os.path.lexists(destination): + os.unlink(destination) + os.link(source, destination) + PY sudo mv /spack-generated.cmake /opt/GEOS/spack-generated.cmake sudo chown -R "$(id -un)" /opt/GEOS - name: Build GEOS From 43e2e40dbd42560b551a4783b697b2f4a07cbbc5 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 17:10:33 -0400 Subject: [PATCH 08/26] Write the macOS extract script to a file before running it. --- .github/workflows/build_and_test.yml | 3 +++ .github/workflows/ci_tests.yml | 32 +++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 991350b5a89..49ef7213237 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -375,6 +375,9 @@ jobs: EXIT_STATUS=$? echo "Received exit status ${EXIT_STATUS} from the build process." set -e + if [[ "$EXIT_STATUS" -ne 0 ]]; then + echo "::error title=Build failed::docker run exited ${EXIT_STATUS}" + fi echo "exit_status=${EXIT_STATUS}" >> "${GITHUB_OUTPUT}" echo "data_basename=${DATA_BASENAME}" >> "${GITHUB_OUTPUT}" diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index e5a79d8d716..99fa9372a6f 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -502,12 +502,17 @@ jobs: DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} run: | set -euo pipefail - curl -fsSL -o "$RUNNER_TEMP/crane.tgz" \ - https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz - tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane - image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" - "$RUNNER_TEMP/crane" export "$image" "$RUNNER_TEMP/tpl.tar" - sed 's/^ //' <<'PY' | sudo python3 - "$RUNNER_TEMP/tpl.tar" + log="$RUNNER_TEMP/load-tpl.log" + set +e + { + curl -fsSL -o "$RUNNER_TEMP/crane.tgz" \ + https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz + tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane + chmod +x "$RUNNER_TEMP/crane" + xattr -d com.apple.quarantine "$RUNNER_TEMP/crane" 2>/dev/null || true + image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" + "$RUNNER_TEMP/crane" export "$image" "$RUNNER_TEMP/tpl.tar" + cat > "$RUNNER_TEMP/extract_tpl.py" <<'PY' import inspect import os import sys @@ -529,8 +534,19 @@ jobs: os.unlink(destination) os.link(source, destination) PY - sudo mv /spack-generated.cmake /opt/GEOS/spack-generated.cmake - sudo chown -R "$(id -un)" /opt/GEOS + python3 -c 'from pathlib import Path; p=Path("'"$RUNNER_TEMP"'/extract_tpl.py"); t=p.read_text().splitlines(); n=len(t[0])-len(t[0].lstrip()); p.write_text("\n".join(line[n:] for line in t)+"\n")' + sudo /usr/bin/python3 "$RUNNER_TEMP/extract_tpl.py" "$RUNNER_TEMP/tpl.tar" + sudo mv /spack-generated.cmake /opt/GEOS/spack-generated.cmake + sudo chown -R "$(id -un)" /opt/GEOS + } >"$log" 2>&1 + status=$? + set -e + if [[ "$status" -ne 0 ]]; then + tail -n 40 "$log" | while IFS= read -r line; do + echo "::error title=Load TPL image::$line" + done + exit "$status" + fi - name: Build GEOS run: | set -euo pipefail From 0a6f31758dcb40db4222c464af774144950ac263 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 17:16:50 -0400 Subject: [PATCH 09/26] Skip the archive root when extracting the macOS TPL image. --- .github/workflows/ci_tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 99fa9372a6f..18167d6f6fa 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -523,7 +523,12 @@ jobs: kwargs = {} if "filter" in inspect.signature(tar.extractall).parameters: kwargs["filter"] = "fully_trusted" - tar.extractall("/", members=[member for member in members if not member.islnk()], **kwargs) + files = [member for member in members if not member.islnk() and member.name not in (".", "./")] + try: + tar.extractall("/", members=files, **kwargs) + except OSError as exc: + sys.stderr.write("EXTRACT_ERROR %s: %s\n" % (type(exc).__name__, exc)) + sys.exit(1) for member in members: if not member.islnk(): continue From 39a9e4d7ee6ec20a6df8db849bf49f87ee8c4231 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 17:22:27 -0400 Subject: [PATCH 10/26] Extract the macOS TPL image under /opt/GEOS. --- .github/workflows/build_and_test.yml | 8 +++++-- .github/workflows/ci_tests.yml | 35 ++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 49ef7213237..a382e1d0e22 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -371,12 +371,16 @@ jobs: -h=`hostname` \ ${{ inputs.DOCKER_REPOSITORY }}:${{ inputs.DOCKER_IMAGE_TAG }} \ ${GITHUB_WORKSPACE_MOUNT_POINT}/scripts/ci_build_and_test_in_container.sh \ - ${script_args[@]} + ${script_args[@]} \ + > "$RUNNER_TEMP/docker-run.log" 2>&1 EXIT_STATUS=$? + cat "$RUNNER_TEMP/docker-run.log" echo "Received exit status ${EXIT_STATUS} from the build process." set -e if [[ "$EXIT_STATUS" -ne 0 ]]; then - echo "::error title=Build failed::docker run exited ${EXIT_STATUS}" + tail -n 8 "$RUNNER_TEMP/docker-run.log" | while IFS= read -r line; do + echo "::error title=Build failed::$line" + done fi echo "exit_status=${EXIT_STATUS}" >> "${GITHUB_OUTPUT}" diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 18167d6f6fa..1270e7d7775 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -518,30 +518,55 @@ jobs: import sys import tarfile + def relocate(name): + name = name[2:] if name.startswith("./") else name + if name in ("", "."): + return None + if name == "spack-generated.cmake": + return name + prefix = "opt/GEOS/" + if name.startswith(prefix): + return name[len(prefix):] + return None + + root = "/opt/GEOS" with tarfile.open(sys.argv[1]) as tar: members = tar.getmembers() kwargs = {} if "filter" in inspect.signature(tar.extractall).parameters: kwargs["filter"] = "fully_trusted" - files = [member for member in members if not member.islnk() and member.name not in (".", "./")] + files = [] + for member in members: + if member.islnk(): + continue + relocated = relocate(member.name) + if relocated is None: + continue + member.name = relocated + files.append(member) try: - tar.extractall("/", members=files, **kwargs) + tar.extractall(root, members=files, **kwargs) except OSError as exc: sys.stderr.write("EXTRACT_ERROR %s: %s\n" % (type(exc).__name__, exc)) sys.exit(1) for member in members: if not member.islnk(): continue - destination = os.path.join("/", member.name) - source = os.path.join("/", member.linkname) + relocated = relocate(member.name) + link = relocate(member.linkname) + if relocated is None or link is None: + continue + destination = os.path.join(root, relocated) + source = os.path.join(root, link) os.makedirs(os.path.dirname(destination), exist_ok=True) if os.path.lexists(destination): os.unlink(destination) os.link(source, destination) PY python3 -c 'from pathlib import Path; p=Path("'"$RUNNER_TEMP"'/extract_tpl.py"); t=p.read_text().splitlines(); n=len(t[0])-len(t[0].lstrip()); p.write_text("\n".join(line[n:] for line in t)+"\n")' + sudo mkdir -p /opt/GEOS sudo /usr/bin/python3 "$RUNNER_TEMP/extract_tpl.py" "$RUNNER_TEMP/tpl.tar" - sudo mv /spack-generated.cmake /opt/GEOS/spack-generated.cmake + test -f /opt/GEOS/spack-generated.cmake sudo chown -R "$(id -un)" /opt/GEOS } >"$log" 2>&1 status=$? From aa8f6671bc2843b6d7845876e5160e255fb49f1a Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 17:38:47 -0400 Subject: [PATCH 11/26] Match CI to images that do not ship hypredrive. --- .github/workflows/ci_tests.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 1270e7d7775..375b8f23f32 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -275,7 +275,7 @@ jobs: DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} DOCKER_REPOSITORY: geosx/ubuntu24.04-gcc12 ENABLE_HYPRE: ON - ENABLE_HYPREDRV: ON + ENABLE_HYPREDRV: OFF ENABLE_TRILINOS: OFF GEOS_ENABLE_BOUNDS_CHECK: ON GCP_BUCKET: geosx/integratedTests @@ -456,7 +456,7 @@ jobs: DOCKER_REPOSITORY: geosx/ubuntu24.04-amdclang19.0.0-rocm6.4.3 ENABLE_HYPRE_DEVICE: HIP ENABLE_HYPRE: ON - ENABLE_HYPREDRV: ON + ENABLE_HYPREDRV: OFF ENABLE_TRILINOS: OFF GEOS_ENABLE_BOUNDS_CHECK: OFF RUNS_ON: streak2 @@ -580,6 +580,7 @@ jobs: - name: Build GEOS run: | set -euo pipefail + brew install cmake python3 scripts/config-build.py \ -hc /opt/GEOS/spack-generated.cmake \ -bt Release \ From 1ab2f4a9230d18346b91e40651bf5b6cd54fcd26 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 20:43:16 -0400 Subject: [PATCH 12/26] Pin the macOS TPL tag that contains the GEOS host-config. --- .devcontainer/devcontainer.json | 2 +- .github/workflows/build_and_test.yml | 2 +- .github/workflows/ci_tests.yml | 24 ++++++++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c4d70880481..bdbc1d8315e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "370-1134" + "GEOS_TPL_TAG": "370-1135" } }, "runArgs": [ diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index a382e1d0e22..e39b1ec40db 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -378,7 +378,7 @@ jobs: echo "Received exit status ${EXIT_STATUS} from the build process." set -e if [[ "$EXIT_STATUS" -ne 0 ]]; then - tail -n 8 "$RUNNER_TEMP/docker-run.log" | while IFS= read -r line; do + grep -E 'error:|CMake Error|fatal error' "$RUNNER_TEMP/docker-run.log" | tail -n 8 | while IFS= read -r line; do echo "::error title=Build failed::$line" done fi diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 375b8f23f32..9d29f4776e4 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -580,12 +580,24 @@ jobs: - name: Build GEOS run: | set -euo pipefail - brew install cmake - python3 scripts/config-build.py \ - -hc /opt/GEOS/spack-generated.cmake \ - -bt Release \ - --buildpath "$RUNNER_TEMP/geos-build" - cmake --build "$RUNNER_TEMP/geos-build" -j 2 --target geosx + brew install cmake open-mpi openblas python@3.14 binutils + log="$RUNNER_TEMP/geos-build.log" + set +e + { + python3 scripts/config-build.py \ + -hc /opt/GEOS/spack-generated.cmake \ + -bt Release \ + --buildpath "$RUNNER_TEMP/geos-build" + cmake --build "$RUNNER_TEMP/geos-build" -j 2 --target geosx + } >"$log" 2>&1 + status=$? + cat "$log" + if [[ "$status" -ne 0 ]]; then + grep -E 'error:|CMake Error' "$log" | tail -n 8 | while IFS= read -r line; do + echo "::error title=Build GEOS::$line" + done + exit "$status" + fi # Convenience job - passes when all substantive jobs have passed. A # submodule-sync failure is an allowed exception when testing submodule branches. From 3b0661fec269c82c749f8d5a0910af87a31ef422 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 21:53:21 -0400 Subject: [PATCH 13/26] Stream GEOS build output while the job is running. --- .github/workflows/build_and_test.yml | 9 +++++---- .github/workflows/ci_tests.yml | 7 ++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index e39b1ec40db..836f98b8a63 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -366,21 +366,22 @@ jobs: # GHA set `-e` to bash scripts by default to fail asap, # but for this precise call, we want to deal with it more precisely set +e + set -o pipefail docker run \ ${docker_args[@]} \ -h=`hostname` \ ${{ inputs.DOCKER_REPOSITORY }}:${{ inputs.DOCKER_IMAGE_TAG }} \ ${GITHUB_WORKSPACE_MOUNT_POINT}/scripts/ci_build_and_test_in_container.sh \ ${script_args[@]} \ - > "$RUNNER_TEMP/docker-run.log" 2>&1 + 2>&1 | tee "$RUNNER_TEMP/docker-run.log" EXIT_STATUS=$? - cat "$RUNNER_TEMP/docker-run.log" + set +o pipefail echo "Received exit status ${EXIT_STATUS} from the build process." set -e if [[ "$EXIT_STATUS" -ne 0 ]]; then - grep -E 'error:|CMake Error|fatal error' "$RUNNER_TEMP/docker-run.log" | tail -n 8 | while IFS= read -r line; do + grep -E 'error:|CMake Error|fatal error|FAIL!' "$RUNNER_TEMP/docker-run.log" | tail -n 12 | while IFS= read -r line; do echo "::error title=Build failed::$line" - done + done || true fi echo "exit_status=${EXIT_STATUS}" >> "${GITHUB_OUTPUT}" diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 9d29f4776e4..31f5f65b6d7 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -583,19 +583,20 @@ jobs: brew install cmake open-mpi openblas python@3.14 binutils log="$RUNNER_TEMP/geos-build.log" set +e + set -o pipefail { python3 scripts/config-build.py \ -hc /opt/GEOS/spack-generated.cmake \ -bt Release \ --buildpath "$RUNNER_TEMP/geos-build" cmake --build "$RUNNER_TEMP/geos-build" -j 2 --target geosx - } >"$log" 2>&1 + } 2>&1 | tee "$log" status=$? - cat "$log" + set +o pipefail if [[ "$status" -ne 0 ]]; then grep -E 'error:|CMake Error' "$log" | tail -n 8 | while IFS= read -r line; do echo "::error title=Build GEOS::$line" - done + done || true exit "$status" fi From d47fc161990d38cb79c1a807258c7cc58984a524 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 22:06:47 -0400 Subject: [PATCH 14/26] Drop Apple Clang flags that the host-config adds for every Clang. --- .github/workflows/ci_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 31f5f65b6d7..ed63f421d27 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -581,6 +581,8 @@ jobs: run: | set -euo pipefail brew install cmake open-mpi openblas python@3.14 binutils + # Apple Clang rejects -mtune=native, which the host-config adds for every Clang. + sed -i '' 's/ -march=native -mtune=native//' /opt/GEOS/spack-generated.cmake log="$RUNNER_TEMP/geos-build.log" set +e set -o pipefail From 95f0e273bb5cd6eb2df21ee6548b235ee97f34ac Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 22:20:52 -0400 Subject: [PATCH 15/26] Fix the macOS configure errors and the uncrustify check. --- .github/workflows/build_and_test.yml | 2 +- .github/workflows/ci_tests.yml | 7 +++++++ src/coreComponents/CMakeLists.txt | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 836f98b8a63..9c98e71a525 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -379,7 +379,7 @@ jobs: echo "Received exit status ${EXIT_STATUS} from the build process." set -e if [[ "$EXIT_STATUS" -ne 0 ]]; then - grep -E 'error:|CMake Error|fatal error|FAIL!' "$RUNNER_TEMP/docker-run.log" | tail -n 12 | while IFS= read -r line; do + grep -E 'error:|CMake Error|fatal error|FAIL!|FAIL:' "$RUNNER_TEMP/docker-run.log" | tail -n 12 | while IFS= read -r line; do echo "::error title=Build failed::$line" done || true fi diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index ed63f421d27..b6c5df32535 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -581,6 +581,13 @@ jobs: run: | set -euo pipefail brew install cmake open-mpi openblas python@3.14 binutils + /opt/homebrew/opt/python@3.14/bin/python3 -m pip install --upgrade --break-system-packages virtualenv + # Caliper records the Open MPI Cellar path from the TPL build. Homebrew on this + # runner may install a different version, so point that path at the one just installed. + if [[ ! -d /opt/homebrew/Cellar/open-mpi/5.0.11 ]]; then + sudo mkdir -p /opt/homebrew/Cellar/open-mpi + sudo ln -sfn "$(readlink -f /opt/homebrew/opt/open-mpi)" /opt/homebrew/Cellar/open-mpi/5.0.11 + fi # Apple Clang rejects -mtune=native, which the host-config adds for every Clang. sed -i '' 's/ -march=native -mtune=native//' /opt/GEOS/spack-generated.cmake log="$RUNNER_TEMP/geos-build.log" diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index c5c8a3780e3..9450e1c2081 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -83,7 +83,7 @@ else() endif() geosx_add_code_checks( PREFIX coreComponents - EXCLUDES cmake constitutive/HPCReact ) + EXCLUDES cmake constitutive/HPCReact LvArray/docs ) if( ENABLE_UNCRUSTIFY ) add_test( NAME testUncrustifyCheck From 98c4a38bc3a400208ad632f60e026648bdd244b7 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 24 Sep 2026 23:02:06 -0400 Subject: [PATCH 16/26] Use sccache for the macOS build. --- .github/workflows/ci_tests.yml | 36 +++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index b6c5df32535..055f688db97 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -577,10 +577,31 @@ jobs: done exit "$status" fi + - id: auth + uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0 + with: + credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' + create_credentials_file: true - name: Build GEOS run: | set -euo pipefail brew install cmake open-mpi openblas python@3.14 binutils + curl -fsSL -o "$RUNNER_TEMP/sccache.tgz" \ + https://github.com/mozilla/sccache/releases/download/v0.17.0/sccache-v0.17.0-aarch64-apple-darwin.tar.gz + tar -xzf "$RUNNER_TEMP/sccache.tgz" -C "$RUNNER_TEMP" --strip-components=1 \ + sccache-v0.17.0-aarch64-apple-darwin/sccache + chmod +x "$RUNNER_TEMP/sccache" + xattr -d com.apple.quarantine "$RUNNER_TEMP/sccache" 2>/dev/null || true + mkdir -p "${HOME}/.config/sccache" + cat > "${HOME}/.config/sccache/config" <&1 | tee "$log" status=$? set +o pipefail + mkdir -p "${GITHUB_WORKSPACE}/.sccache-runtime" + "$RUNNER_TEMP/sccache" --show-adv-stats > "${GITHUB_WORKSPACE}/.sccache-runtime/stats.txt" || true if [[ "$status" -ne 0 ]]; then grep -E 'error:|CMake Error' "$log" | tail -n 8 | while IFS= read -r line; do echo "::error title=Build GEOS::$line" done || true exit "$status" fi + - name: Show sccache summary + if: always() + run: | + SCCACHE_STATS_FILE="${GITHUB_WORKSPACE}/.sccache-runtime/stats.txt" + if [[ -f "${SCCACHE_STATS_FILE}" ]]; then + grep -E '^(Compile requests|Cache hits|Cache misses|Cache timeouts|Cache read errors|Cache write errors|Compilation failures|Cache errors|Non-cacheable compilations|Non-cacheable calls|Cache location|Cache size|Max cache size|Version \(client\))' "${SCCACHE_STATS_FILE}" || cat "${SCCACHE_STATS_FILE}" + else + echo "No sccache stats file was captured." + fi # Convenience job - passes when all substantive jobs have passed. A # submodule-sync failure is an allowed exception when testing submodule branches. From efb90009553cf988c7a5edbda3d1c42cf906cae6 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Fri, 25 Sep 2026 11:27:00 -0400 Subject: [PATCH 17/26] Point macOS sccache at the shared GCS cache. --- .github/workflows/ci_tests.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 055f688db97..13f0bdb056c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -592,15 +592,19 @@ jobs: sccache-v0.17.0-aarch64-apple-darwin/sccache chmod +x "$RUNNER_TEMP/sccache" xattr -d com.apple.quarantine "$RUNNER_TEMP/sccache" 2>/dev/null || true - mkdir -p "${HOME}/.config/sccache" - cat > "${HOME}/.config/sccache/config" < "$SCCACHE_CONF" < Date: Fri, 25 Sep 2026 13:21:08 -0400 Subject: [PATCH 18/26] Drop the LvArray docs exclusion from the style check. --- src/coreComponents/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index 9450e1c2081..c5c8a3780e3 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -83,7 +83,7 @@ else() endif() geosx_add_code_checks( PREFIX coreComponents - EXCLUDES cmake constitutive/HPCReact LvArray/docs ) + EXCLUDES cmake constitutive/HPCReact ) if( ENABLE_UNCRUSTIFY ) add_test( NAME testUncrustifyCheck From e9248d13f9604a90342ce1f32f5bcbf979cb3944 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Fri, 25 Sep 2026 14:15:25 -0400 Subject: [PATCH 19/26] Point LvArray at the commit that stops writing a generated header into the source tree. --- src/coreComponents/LvArray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 63b5e60976c..71cc186e9da 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 63b5e60976c6910ddf43c76cb0525f51ea47f806 +Subproject commit 71cc186e9dae4de4cbefc01f6ad7f80ee2e850df From 280331cbf36c48e7c56f10b3f945bf1a2a1afa9e Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Fri, 25 Sep 2026 14:18:48 -0400 Subject: [PATCH 20/26] Use the shared sccache bucket for every GEOS build, including streak2. --- .github/workflows/build_and_test.yml | 3 ++- scripts/ci_build_and_test_in_container.sh | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 9c98e71a525..ffefa965540 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -142,7 +142,7 @@ jobs: fetch-depth: 1 - id: 'auth' - if: ${{ (inputs.UPLOAD_TO_GCP && inputs.GCP_BUCKET) || (inputs.USE_SCCACHE && !startsWith(inputs.RUNS_ON, 'streak2')) }} + if: ${{ (inputs.UPLOAD_TO_GCP && inputs.GCP_BUCKET) || inputs.USE_SCCACHE }} uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0 with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' @@ -239,6 +239,7 @@ jobs: docker_args+=(-e SCCACHE_CACHE_SIZE) fi script_args+=(--use-sccache) + script_args+=(--sccache-credentials $(basename ${GOOGLE_GHA_CREDS_PATH})) ;; *) script_args+=(--sccache-credentials $(basename ${GOOGLE_GHA_CREDS_PATH})) diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 4627b4a84c0..c0cb9d32c0b 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -434,6 +434,7 @@ if [[ "${USE_SCCACHE}" == true ]]; then # We use this file since it's managed by the 'google-github-actions/auth' actions. or_die mkdir -p ${HOME}/.config/sccache or_die cat <> ${HOME}/.config/sccache/config +basedirs = ["${GEOS_SRC_DIR}"] [cache.gcs] rw_mode = "READ_WRITE" cred_path = "${GEOS_SRC_DIR}/${SCCACHE_CREDS}" @@ -497,6 +498,9 @@ if [[ "${ENABLE_HYPRE_DEVICE}" == "HIP" ]]; then if [[ -n "${HIP_CMAKE_COMPILER}" && -x "${HIP_CMAKE_COMPILER}" ]]; then echo "Using direct HIP compiler: ${HIP_CMAKE_COMPILER}" CMAKE_HIP_COMPILER_ARGS+=("-DCMAKE_HIP_COMPILER=${HIP_CMAKE_COMPILER}") + if [[ -n "${SCCACHE_BIN}" ]]; then + SCCACHE_CMAKE_ARGS+=" -DCMAKE_HIP_COMPILER_LAUNCHER=${SCCACHE_BIN}" + fi fi fi From 169c79f6e4f1ebccf6533142ebead7e341c33db9 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Fri, 25 Sep 2026 15:33:30 -0400 Subject: [PATCH 21/26] Turn hypredrive back on in the integrated and ROCm jobs. --- .github/workflows/ci_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 13f0bdb056c..4dab74a24e8 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -275,7 +275,7 @@ jobs: DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} DOCKER_REPOSITORY: geosx/ubuntu24.04-gcc12 ENABLE_HYPRE: ON - ENABLE_HYPREDRV: OFF + ENABLE_HYPREDRV: ON ENABLE_TRILINOS: OFF GEOS_ENABLE_BOUNDS_CHECK: ON GCP_BUCKET: geosx/integratedTests @@ -456,7 +456,7 @@ jobs: DOCKER_REPOSITORY: geosx/ubuntu24.04-amdclang19.0.0-rocm6.4.3 ENABLE_HYPRE_DEVICE: HIP ENABLE_HYPRE: ON - ENABLE_HYPREDRV: OFF + ENABLE_HYPREDRV: ON ENABLE_TRILINOS: OFF GEOS_ENABLE_BOUNDS_CHECK: OFF RUNS_ON: streak2 From 41f882ee99b75b42367fd2663a6f78b0d3dfb6ce Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Fri, 25 Sep 2026 19:41:19 -0400 Subject: [PATCH 22/26] Let sccache reach GCS from FIPS Ubuntu containers. --- scripts/ci_build_and_test_in_container.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index c0cb9d32c0b..6a450830f2d 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -454,6 +454,19 @@ EOT fi # Backend-specific credentials and endpoints are injected through the environment and/or config file. + # streak2 Ubuntu containers set OPENSSL_CONF so OpenSSL can start without a + # FIPS provider. sccache then rejects the Google token endpoint certificate + # as too weak and the server never starts. Launch sccache without that config. + sccache_real="${SCCACHE_BIN}" + SCCACHE_BIN=/tmp/sccache-launch + or_die cat > "${SCCACHE_BIN}" < Date: Sat, 26 Sep 2026 16:24:27 -0400 Subject: [PATCH 23/26] Point GEOS at TPL images that include hypredrive. --- .devcontainer/devcontainer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index bdbc1d8315e..7c97a6af2bb 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "370-1135" + "GEOS_TPL_TAG": "370-1138" } }, "runArgs": [ From cf95733e938c12248a7777286465ef3c8fdb03d4 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 22 Oct 2026 01:41:13 -0400 Subject: [PATCH 24/26] Extract macOS CI scripts --- .github/workflows/ci_tests.yml | 134 +-------------------------------- scripts/macos_build.sh | 56 ++++++++++++++ scripts/macos_extract_tpl.py | 52 +++++++++++++ scripts/macos_load_tpl.sh | 27 +++++++ 4 files changed, 138 insertions(+), 131 deletions(-) create mode 100755 scripts/macos_build.sh create mode 100644 scripts/macos_extract_tpl.py create mode 100755 scripts/macos_load_tpl.sh diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 4dab74a24e8..c45ffdfcb9e 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -486,6 +486,7 @@ jobs: # Native macOS build. The TPL install comes from the published image # geosx/macos-26-apple-clang:${GEOS_TPL_TAG}, the same tag the Linux jobs use. + # This job currently checks compilation only. macos_builds: name: macOS 26 - Apple Clang (arm64) needs: [is_not_draft_pull_request] @@ -500,143 +501,14 @@ jobs: - name: Load TPL image env: DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} - run: | - set -euo pipefail - log="$RUNNER_TEMP/load-tpl.log" - set +e - { - curl -fsSL -o "$RUNNER_TEMP/crane.tgz" \ - https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz - tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane - chmod +x "$RUNNER_TEMP/crane" - xattr -d com.apple.quarantine "$RUNNER_TEMP/crane" 2>/dev/null || true - image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" - "$RUNNER_TEMP/crane" export "$image" "$RUNNER_TEMP/tpl.tar" - cat > "$RUNNER_TEMP/extract_tpl.py" <<'PY' - import inspect - import os - import sys - import tarfile - - def relocate(name): - name = name[2:] if name.startswith("./") else name - if name in ("", "."): - return None - if name == "spack-generated.cmake": - return name - prefix = "opt/GEOS/" - if name.startswith(prefix): - return name[len(prefix):] - return None - - root = "/opt/GEOS" - with tarfile.open(sys.argv[1]) as tar: - members = tar.getmembers() - kwargs = {} - if "filter" in inspect.signature(tar.extractall).parameters: - kwargs["filter"] = "fully_trusted" - files = [] - for member in members: - if member.islnk(): - continue - relocated = relocate(member.name) - if relocated is None: - continue - member.name = relocated - files.append(member) - try: - tar.extractall(root, members=files, **kwargs) - except OSError as exc: - sys.stderr.write("EXTRACT_ERROR %s: %s\n" % (type(exc).__name__, exc)) - sys.exit(1) - for member in members: - if not member.islnk(): - continue - relocated = relocate(member.name) - link = relocate(member.linkname) - if relocated is None or link is None: - continue - destination = os.path.join(root, relocated) - source = os.path.join(root, link) - os.makedirs(os.path.dirname(destination), exist_ok=True) - if os.path.lexists(destination): - os.unlink(destination) - os.link(source, destination) - PY - python3 -c 'from pathlib import Path; p=Path("'"$RUNNER_TEMP"'/extract_tpl.py"); t=p.read_text().splitlines(); n=len(t[0])-len(t[0].lstrip()); p.write_text("\n".join(line[n:] for line in t)+"\n")' - sudo mkdir -p /opt/GEOS - sudo /usr/bin/python3 "$RUNNER_TEMP/extract_tpl.py" "$RUNNER_TEMP/tpl.tar" - test -f /opt/GEOS/spack-generated.cmake - sudo chown -R "$(id -un)" /opt/GEOS - } >"$log" 2>&1 - status=$? - set -e - if [[ "$status" -ne 0 ]]; then - tail -n 40 "$log" | while IFS= read -r line; do - echo "::error title=Load TPL image::$line" - done - exit "$status" - fi + run: scripts/macos_load_tpl.sh - id: auth uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0 with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true - name: Build GEOS - run: | - set -euo pipefail - brew install cmake open-mpi openblas python@3.14 binutils - curl -fsSL -o "$RUNNER_TEMP/sccache.tgz" \ - https://github.com/mozilla/sccache/releases/download/v0.17.0/sccache-v0.17.0-aarch64-apple-darwin.tar.gz - tar -xzf "$RUNNER_TEMP/sccache.tgz" -C "$RUNNER_TEMP" --strip-components=1 \ - sccache-v0.17.0-aarch64-apple-darwin/sccache - chmod +x "$RUNNER_TEMP/sccache" - xattr -d com.apple.quarantine "$RUNNER_TEMP/sccache" 2>/dev/null || true - # sccache reads SCCACHE_CONF first. On macOS the default is - # ~/Library/Application Support, so a Linux-style ~/.config file is ignored - # and the cache stays on the runner's local disk. - export SCCACHE_CONF="${HOME}/.config/sccache/config" - mkdir -p "$(dirname "$SCCACHE_CONF")" - cat > "$SCCACHE_CONF" <&1 | tee "$log" - status=$? - set +o pipefail - mkdir -p "${GITHUB_WORKSPACE}/.sccache-runtime" - "$RUNNER_TEMP/sccache" --show-adv-stats > "${GITHUB_WORKSPACE}/.sccache-runtime/stats.txt" || true - if [[ "$status" -ne 0 ]]; then - grep -E 'error:|CMake Error' "$log" | tail -n 8 | while IFS= read -r line; do - echo "::error title=Build GEOS::$line" - done || true - exit "$status" - fi + run: scripts/macos_build.sh - name: Show sccache summary if: always() run: | diff --git a/scripts/macos_build.sh b/scripts/macos_build.sh new file mode 100755 index 00000000000..334b7dc4af3 --- /dev/null +++ b/scripts/macos_build.sh @@ -0,0 +1,56 @@ +#!/bin/bash +# Run from the repository root in the macOS CI job. + +set -euo pipefail +brew install cmake open-mpi openblas python@3.14 binutils +curl -fsSL -o "$RUNNER_TEMP/sccache.tgz" \ + https://github.com/mozilla/sccache/releases/download/v0.17.0/sccache-v0.17.0-aarch64-apple-darwin.tar.gz +tar -xzf "$RUNNER_TEMP/sccache.tgz" -C "$RUNNER_TEMP" --strip-components=1 \ + sccache-v0.17.0-aarch64-apple-darwin/sccache +chmod +x "$RUNNER_TEMP/sccache" +xattr -d com.apple.quarantine "$RUNNER_TEMP/sccache" 2>/dev/null || true +# sccache reads SCCACHE_CONF first. On macOS the default is +# ~/Library/Application Support, so a Linux-style ~/.config file is ignored +# and the cache stays on the runner's local disk. +export SCCACHE_CONF="${HOME}/.config/sccache/config" +mkdir -p "$(dirname "$SCCACHE_CONF")" +cat > "$SCCACHE_CONF" <&1 | tee "$log" +status=$? +set +o pipefail +mkdir -p "${GITHUB_WORKSPACE}/.sccache-runtime" +"$RUNNER_TEMP/sccache" --show-adv-stats > "${GITHUB_WORKSPACE}/.sccache-runtime/stats.txt" || true +if [[ "$status" -ne 0 ]]; then + grep -E 'error:|CMake Error' "$log" | tail -n 8 | while IFS= read -r line; do + echo "::error title=Build GEOS::$line" + done || true + exit "$status" +fi diff --git a/scripts/macos_extract_tpl.py b/scripts/macos_extract_tpl.py new file mode 100644 index 00000000000..b0f5373e007 --- /dev/null +++ b/scripts/macos_extract_tpl.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +"""Extract a macOS TPL image archive into the given directory.""" + +import inspect +import os +import sys +import tarfile + +def relocate(name): + name = name[2:] if name.startswith("./") else name + if name in ("", "."): + return None + if name == "spack-generated.cmake": + return name + prefix = "opt/GEOS/" + if name.startswith(prefix): + return name[len(prefix):] + return None + +root = sys.argv[2] +with tarfile.open(sys.argv[1]) as tar: + members = tar.getmembers() + kwargs = {} + if "filter" in inspect.signature(tar.extractall).parameters: + kwargs["filter"] = "fully_trusted" + files = [] + for member in members: + if member.islnk(): + continue + relocated = relocate(member.name) + if relocated is None: + continue + member.name = relocated + files.append(member) + try: + tar.extractall(root, members=files, **kwargs) + except OSError as exc: + sys.stderr.write("EXTRACT_ERROR %s: %s\n" % (type(exc).__name__, exc)) + sys.exit(1) + for member in members: + if not member.islnk(): + continue + relocated = relocate(member.name) + link = relocate(member.linkname) + if relocated is None or link is None: + continue + destination = os.path.join(root, relocated) + source = os.path.join(root, link) + os.makedirs(os.path.dirname(destination), exist_ok=True) + if os.path.lexists(destination): + os.unlink(destination) + os.link(source, destination) diff --git a/scripts/macos_load_tpl.sh b/scripts/macos_load_tpl.sh new file mode 100755 index 00000000000..02770b75235 --- /dev/null +++ b/scripts/macos_load_tpl.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Run from the repository root in the macOS CI job. + +set -euo pipefail +log="$RUNNER_TEMP/load-tpl.log" +set +e +{ + curl -fsSL -o "$RUNNER_TEMP/crane.tgz" \ + https://github.com/google/go-containerregistry/releases/download/v0.20.6/go-containerregistry_Darwin_arm64.tar.gz + tar -xzf "$RUNNER_TEMP/crane.tgz" -C "$RUNNER_TEMP" crane + chmod +x "$RUNNER_TEMP/crane" + xattr -d com.apple.quarantine "$RUNNER_TEMP/crane" 2>/dev/null || true + image="geosx/macos-26-apple-clang:${DOCKER_IMAGE_TAG}" + "$RUNNER_TEMP/crane" export "$image" "$RUNNER_TEMP/tpl.tar" + sudo mkdir -p /opt/GEOS + sudo /usr/bin/python3 scripts/macos_extract_tpl.py "$RUNNER_TEMP/tpl.tar" /opt/GEOS + test -f /opt/GEOS/spack-generated.cmake + sudo chown -R "$(id -un)" /opt/GEOS +} >"$log" 2>&1 +status=$? +set -e +if [[ "$status" -ne 0 ]]; then + tail -n 40 "$log" | while IFS= read -r line; do + echo "::error title=Load TPL image::$line" + done + exit "$status" +fi From 2ded8283fc4ec8d5fa34a8b42b80a7f58fe44071 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 22 Oct 2026 01:56:59 -0400 Subject: [PATCH 25/26] Fix macOS Python path --- scripts/macos_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/macos_build.sh b/scripts/macos_build.sh index 334b7dc4af3..c67598dbf10 100755 --- a/scripts/macos_build.sh +++ b/scripts/macos_build.sh @@ -23,7 +23,7 @@ bucket = "geos-dev" key_prefix = "sccache" EOF "$RUNNER_TEMP/sccache" --show-stats || true -/opt/homebrew/opt/python@3.14/bin/python3 -m pip install --upgrade --break-system-packages virtualenv +"$(brew --prefix python@3.14)/bin/python3.14" -m pip install --upgrade --break-system-packages virtualenv # Caliper records the Open MPI Cellar path from the TPL build. Homebrew on this # runner may install a different version, so point that path at the one just installed. if [[ ! -d /opt/homebrew/Cellar/open-mpi/5.0.11 ]]; then From d21f589d045a67c13072fbc69ad55fb807169ff6 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" Date: Thu, 22 Oct 2026 02:03:36 -0400 Subject: [PATCH 26/26] Set macOS CMake Python interpreter --- scripts/macos_build.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/macos_build.sh b/scripts/macos_build.sh index c67598dbf10..b2977b419b8 100755 --- a/scripts/macos_build.sh +++ b/scripts/macos_build.sh @@ -3,6 +3,7 @@ set -euo pipefail brew install cmake open-mpi openblas python@3.14 binutils +python_bin="$(brew --prefix python@3.14)/bin/python3.14" curl -fsSL -o "$RUNNER_TEMP/sccache.tgz" \ https://github.com/mozilla/sccache/releases/download/v0.17.0/sccache-v0.17.0-aarch64-apple-darwin.tar.gz tar -xzf "$RUNNER_TEMP/sccache.tgz" -C "$RUNNER_TEMP" --strip-components=1 \ @@ -23,7 +24,7 @@ bucket = "geos-dev" key_prefix = "sccache" EOF "$RUNNER_TEMP/sccache" --show-stats || true -"$(brew --prefix python@3.14)/bin/python3.14" -m pip install --upgrade --break-system-packages virtualenv +"$python_bin" -m pip install --upgrade --break-system-packages virtualenv # Caliper records the Open MPI Cellar path from the TPL build. Homebrew on this # runner may install a different version, so point that path at the one just installed. if [[ ! -d /opt/homebrew/Cellar/open-mpi/5.0.11 ]]; then @@ -36,10 +37,11 @@ log="$RUNNER_TEMP/geos-build.log" set +e set -o pipefail { - python3 scripts/config-build.py \ + "$python_bin" scripts/config-build.py \ -hc /opt/GEOS/spack-generated.cmake \ -bt Release \ --buildpath "$RUNNER_TEMP/geos-build" \ + -DPython3_EXECUTABLE="$python_bin" \ -DCMAKE_C_COMPILER_LAUNCHER="$RUNNER_TEMP/sccache" \ -DCMAKE_CXX_COMPILER_LAUNCHER="$RUNNER_TEMP/sccache" cmake --build "$RUNNER_TEMP/geos-build" -j 2 --target geosx