cmake/Tests/RunCMake/FindRuby/RunCMakeTest.cmake
Brad King a436fbdbc2 Tests/RunCMake/FindRuby: Use environment as of test time, not configure time
Revise commit a9ded64779 (FindRuby: Convert tests to RunCMake, 2026-01-15).
2026-01-23 10:22:48 -05:00

162 lines
5.3 KiB
CMake

include(RunCMake)
# System Ruby tests
run_cmake(System/Ruby)
run_cmake(System/Fail)
run_cmake(System/FailExact)
# RBENV specific tests
if(CMake_TEST_FindRuby_RBENV)
set(RBENV_ROOT "$ENV{RBENV_ROOT}")
if(NOT IS_DIRECTORY "${RBENV_ROOT}")
message(FATAL_ERROR "RBENV_ROOT should be set to a valid rbenv ruby location")
endif()
# Test environment has RBENV_ROOT setup
find_program(rbenv
NAMES rbenv
NAMES_PER_DIR
PATHS "$ENV{HOME}/.rbenv/bin" ENV RBENV_ROOT
PATH_SUFFIXES bin Scripts
NO_CACHE)
execute_process(COMMAND "${rbenv}" which ruby
RESULT_VARIABLE result
OUTPUT_VARIABLE RBENV_RUBY
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
# Make sure we found a valid Ruby interpreter
if(NOT RBENV_RUBY)
message(FATAL_ERROR "Unable to find rbenv Ruby using RBENV_ROOT=${RBENV_ROOT}")
endif()
# Get the version of rbenv Ruby
execute_process(COMMAND "${RBENV_RUBY}" -e "puts RUBY_VERSION"
RESULT_VARIABLE result
OUTPUT_VARIABLE RBENV_RUBY_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(result)
message(FATAL_ERROR "Unable to detect rbenv ruby version from '${RBENV_RUBY}': ${RBENV_RUBY_VERSION}")
endif()
# Find system Ruby
execute_process(COMMAND "${CMAKE_COMMAND}" -E env PATH=/usr/bin:/bin which ruby
RESULT_VARIABLE result
OUTPUT_VARIABLE SYSTEM_RUBY
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(SYSTEM_RUBY STREQUAL RBENV_RUBY)
message(FATAL_ERROR "System Ruby (${SYSTEM_RUBY}) matches rbenv Ruby (${RBENV_RUBY})")
endif()
# Get version of the system Ruby
execute_process(COMMAND "${SYSTEM_RUBY}" -e "puts RUBY_VERSION"
RESULT_VARIABLE result
OUTPUT_VARIABLE SYSTEM_RUBY_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(result)
message(FATAL_ERROR "Unable to detect system ruby version from '${SYSTEM_RUBY}': ${SYSTEM_RUBY_VERSION}")
endif()
if(SYSTEM_RUBY_VERSION VERSION_EQUAL RBENV_RUBY_VERSION)
message(FATAL_ERROR "Your rbenv Ruby version and system Ruby version are the same (${RBENV_RUBY_VERSION}).")
endif()
message(STATUS "Found system Ruby (${SYSTEM_RUBY_VERSION}): ${SYSTEM_RUBY}")
message(STATUS "Found rbenv Ruby (${RBENV_RUBY_VERSION}): ${RBENV_RUBY}")
set(RunCMake_TEST_OPTIONS
"-DRBENV_RUBY=${RBENV_RUBY}"
"-DSYSTEM_RUBY=${SYSTEM_RUBY}"
"-DRBENV_RUBY_VERSION=${RBENV_RUBY_VERSION}"
"-DSYSTEM_RUBY_VERSION=${SYSTEM_RUBY_VERSION}")
run_cmake(Rbenv/RbenvDefault)
run_cmake(Rbenv/RbenvOnly)
run_cmake(Rbenv/RbenvStandard)
unset(RunCMake_TEST_OPTIONS)
endif()
# RVM specific tests
if(CMake_TEST_FindRuby_RVM)
# Properly using rvm would require sourcing a shell script, eg `source "$HOME/.rvm/scripts/rvm"`
# Instead, we just rely on the env variable MY_RUBY_HOME
set(MY_RUBY_HOME "$ENV{MY_RUBY_HOME}")
if(NOT IS_DIRECTORY "${MY_RUBY_HOME}")
message(FATAL_ERROR "MY_RUBY_HOME should be set to a valid RVM ruby location, or you should call `rvm use x.y.z` before")
endif()
execute_process(COMMAND "${MY_RUBY_HOME}/bin/ruby" -e "puts RUBY_VERSION"
RESULT_VARIABLE result
OUTPUT_VARIABLE RVM_RUBY_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(result)
message(FATAL_ERROR "Unable to detect RVM ruby version from '${MY_RUBY_HOME}/bin/ruby': ${RVM_RUBY_VERSION}")
endif()
execute_process(COMMAND "${CMAKE_COMMAND}" -E env --unset=MY_RUBY_HOME PATH=/usr/bin:/bin which ruby
RESULT_VARIABLE result
OUTPUT_VARIABLE SYSTEM_RUBY
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(SYSTEM_RUBY MATCHES "^${MY_RUBY_HOME}")
message(FATAL_ERROR "Unable to find system ruby, found ${SYSTEM_RUBY} which is part of MY_RUBY_HOME=${MY_RUBY_HOME}")
endif()
# Check version of the system ruby executable.
execute_process(COMMAND "${SYSTEM_RUBY}" -e "puts RUBY_VERSION"
RESULT_VARIABLE result
OUTPUT_VARIABLE SYSTEM_RUBY_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(result)
message(FATAL_ERROR "Unable to detect system ruby version from '${SYSTEM_RUBY}': ${SYSTEM_RUBY_VERSION}")
endif()
if(SYSTEM_RUBY_VERSION VERSION_EQUAL RVM_RUBY_VERSION)
message(FATAL_ERROR "Your RVM Ruby version and system Ruby version are the same (${RVM_RUBY_VERSION}).")
endif()
message(STATUS "Found system Ruby (${SYSTEM_RUBY_VERSION}): ${SYSTEM_RUBY}")
message(STATUS "Found RVM Ruby (${RVM_RUBY_VERSION}): ${MY_RUBY_HOME}/bin/ruby")
set(ORIGINAL_PATH "$ENV{PATH}")
# RvmDefault - just MY_RUBY_HOME set
set(RunCMake_TEST_OPTIONS "-DMY_RUBY_HOME=${MY_RUBY_HOME}")
run_cmake(Rvm/RvmDefault)
# RvmOnly - PATH unset, MY_RUBY_HOME set
unset(ENV{PATH})
set(RunCMake_TEST_OPTIONS
"-DMY_RUBY_HOME=${MY_RUBY_HOME}"
"-DRVM_RUBY_VERSION=${RVM_RUBY_VERSION}"
"-DSYSTEM_RUBY_VERSION=${SYSTEM_RUBY_VERSION}")
run_cmake(Rvm/RvmOnly)
# UnsetRvmOnly - MY_RUBY_HOME unset, PATH set to minimal
unset(ENV{MY_RUBY_HOME})
set(ENV{PATH} "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")
set(RunCMake_TEST_OPTIONS
"-DRVM_RUBY_VERSION=${RVM_RUBY_VERSION}"
"-DSYSTEM_RUBY_VERSION=${SYSTEM_RUBY_VERSION}")
run_cmake(Rvm/UnsetRvmOnly)
# RvmStandard - PATH minimal, MY_RUBY_HOME set
set(ENV{MY_RUBY_HOME} "${MY_RUBY_HOME}")
set(RunCMake_TEST_OPTIONS "-DMY_RUBY_HOME=${MY_RUBY_HOME}")
run_cmake(Rvm/RvmStandard)
# Restore PATH
set(ENV{PATH} "${ORIGINAL_PATH}")
unset(RunCMake_TEST_OPTIONS)
endif()