build: add Homebrew fallback for googletest in sandboxed environments

Adds automatic detection of Homebrew-installed googletest to support
offline/sandboxed builds (e.g., Claude Code, restricted networks).

Changes:
- Add Homebrew detection logic to cmake/dependencies/testing.cmake
- Check /opt/homebrew/opt/googletest and /usr/local/opt/googletest
- Use brew --prefix googletest for dynamic detection
- Create target aliases (gtest -> GTest::gtest) for compatibility
- Only fetch from GitHub if no local installation found
- Update macOS build docs with yaml-cpp and googletest installation

Pattern mirrors existing yaml.cmake implementation. Complements the
pre-existing yaml-cpp Homebrew fallback to minimize network dependencies.

Tested with: brew install googletest (1.17.0, 2.4MB)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
scawful
2025-11-20 00:12:08 -05:00
parent 7391b00553
commit 405b542e98
2 changed files with 107 additions and 62 deletions

View File

@@ -10,17 +10,86 @@ include(cmake/dependencies.lock)
message(STATUS "Setting up testing dependencies with CPM.cmake")
# Google Test (includes GMock)
CPMAddPackage(
NAME googletest
VERSION ${GTEST_VERSION}
GITHUB_REPOSITORY google/googletest
GIT_TAG v${GTEST_VERSION}
OPTIONS
"BUILD_GMOCK ON"
"INSTALL_GTEST OFF"
"gtest_force_shared_crt ON"
)
set(_YAZE_USE_SYSTEM_GTEST ${YAZE_USE_SYSTEM_DEPS})
# Detect Homebrew installation automatically (helps offline builds)
if(APPLE AND NOT _YAZE_USE_SYSTEM_GTEST)
set(_YAZE_GTEST_PREFIX_CANDIDATES
/opt/homebrew/opt/googletest
/usr/local/opt/googletest)
foreach(_prefix IN LISTS _YAZE_GTEST_PREFIX_CANDIDATES)
if(EXISTS "${_prefix}")
list(APPEND CMAKE_PREFIX_PATH "${_prefix}")
message(STATUS "Added Homebrew googletest prefix: ${_prefix}")
set(_YAZE_USE_SYSTEM_GTEST ON)
break()
endif()
endforeach()
if(NOT _YAZE_USE_SYSTEM_GTEST)
find_program(HOMEBREW_EXECUTABLE brew)
if(HOMEBREW_EXECUTABLE)
execute_process(
COMMAND "${HOMEBREW_EXECUTABLE}" --prefix googletest
OUTPUT_VARIABLE HOMEBREW_GTEST_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE HOMEBREW_GTEST_RESULT
ERROR_QUIET)
if(HOMEBREW_GTEST_RESULT EQUAL 0 AND EXISTS "${HOMEBREW_GTEST_PREFIX}")
list(APPEND CMAKE_PREFIX_PATH "${HOMEBREW_GTEST_PREFIX}")
message(STATUS "Added Homebrew googletest prefix: ${HOMEBREW_GTEST_PREFIX}")
set(_YAZE_USE_SYSTEM_GTEST ON)
endif()
endif()
endif()
endif()
# Try to use system packages first
if(_YAZE_USE_SYSTEM_GTEST)
find_package(GTest QUIET)
if(GTest_FOUND)
message(STATUS "Using system googletest")
# GTest found, targets should already be available
# Verify targets exist
if(NOT TARGET GTest::gtest)
message(WARNING "GTest::gtest target not found despite GTest_FOUND=TRUE; falling back to CPM download")
set(_YAZE_USE_SYSTEM_GTEST OFF)
else()
# Create aliases to match CPM target names
if(NOT TARGET gtest)
add_library(gtest ALIAS GTest::gtest)
endif()
if(NOT TARGET gtest_main)
add_library(gtest_main ALIAS GTest::gtest_main)
endif()
if(TARGET GTest::gmock AND NOT TARGET gmock)
add_library(gmock ALIAS GTest::gmock)
endif()
if(TARGET GTest::gmock_main AND NOT TARGET gmock_main)
add_library(gmock_main ALIAS GTest::gmock_main)
endif()
# Skip CPM fetch
set(_YAZE_GTEST_SYSTEM_USED ON)
endif()
elseif(YAZE_USE_SYSTEM_DEPS)
message(WARNING "System googletest not found despite YAZE_USE_SYSTEM_DEPS=ON; falling back to CPM download")
endif()
endif()
# Use CPM to fetch googletest if not using system version
if(NOT _YAZE_GTEST_SYSTEM_USED)
CPMAddPackage(
NAME googletest
VERSION ${GTEST_VERSION}
GITHUB_REPOSITORY google/googletest
GIT_TAG v${GTEST_VERSION}
OPTIONS
"BUILD_GMOCK ON"
"INSTALL_GTEST OFF"
"gtest_force_shared_crt ON"
)
endif()
# Verify GTest and GMock targets are available
if(NOT TARGET gtest)