| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648 |
- # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- # file LICENSE.rst or https://cmake.org/licensing for details.
- #[=======================================================================[.rst:
- FindRuby
- --------
- Finds Ruby installation and the locations of its include files and libraries:
- .. code-block:: cmake
- find_package(Ruby [<version>] [COMPONENTS <components>...] [...])
- Ruby is a general-purpose programming language. This module supports Ruby
- 2.0 through 4.0. Virtual environments, such as RVM or RBENV, are also
- supported.
- Components
- ^^^^^^^^^^
- .. versionadded:: 4.3
- This module supports the following components:
- ``Interpreter``
- The Ruby interpreter executable.
- ``Development``
- Headers and libraries needed to build Ruby extensions or embed Ruby.
- If no components are specified, both ``Interpreter`` and ``Development``
- are searched for.
- Imported Targets
- ^^^^^^^^^^^^^^^^
- .. versionadded:: 4.3
- This module defines the following :prop_tgt:`IMPORTED` targets:
- ``Ruby::Interpreter``
- Ruby interpreter. Target defined if component ``Interpreter`` is found.
- ``Ruby::Ruby``
- Ruby library for embedding Ruby in C/C++ applications.
- Target defined if component ``Development`` is found.
- ``Ruby::Module``
- Ruby library for building Ruby extension modules.
- Target defined if component ``Development`` is found.
- Use this target when creating native extensions that will be
- loaded into Ruby via ``require``. On most platforms, extension
- modules do not link directly to libruby. Includes appropriate
- symbol visibility settings.
- Result Variables
- ^^^^^^^^^^^^^^^^
- This module defines the following variables:
- ``Ruby_FOUND``
- .. versionadded:: 3.3
- Boolean indicating whether (the requested version of) ruby was found.
- ``Ruby_VERSION``
- The version of ruby which was found, e.g. ``3.2.6``.
- ``Ruby_VERSION_MAJOR``
- Ruby major version.
- ``Ruby_VERSION_MINOR``
- Ruby minor version.
- ``Ruby_VERSION_PATCH``
- Ruby patch version.
- ``Ruby_EXECUTABLE``
- The full path to the ruby binary.
- ``Ruby_INCLUDE_DIRS``
- Include dirs to be used when using the ruby library.
- ``Ruby_LIBRARIES``
- .. versionadded:: 3.18
- Libraries needed to use ruby from C.
- .. versionchanged:: 3.18
- Previous versions of CMake used the ``RUBY_`` prefix for all variables.
- Hints
- ^^^^^
- This module accepts the following variables:
- ``Ruby_FIND_VIRTUALENV``
- .. versionadded:: 3.18
- This variable defines the handling of virtual environments.
- It can be left empty or be set to one of the following values:
- * ``FIRST``: Virtual Ruby environments are searched for first,
- then the system Ruby installation.
- This is the default.
- * ``ONLY``: Only virtual environments are searched
- * ``STANDARD``: Only the system Ruby installation is searched.
- Virtual environments may be provided by:
- ``rvm``
- Requires that the ``MY_RUBY_HOME`` environment is defined.
- ``rbenv``
- Requires that ``rbenv`` is installed in ``~/.rbenv/bin``
- or that the ``RBENV_ROOT`` environment variable is defined.
- Deprecated Variables
- ^^^^^^^^^^^^^^^^^^^^
- The following variables are provided for backward compatibility:
- .. deprecated:: 4.0
- The following variables are deprecated. See policy :policy:`CMP0185`.
- ``RUBY_FOUND``
- Same as ``Ruby_FOUND``.
- ``RUBY_VERSION``
- Same as ``Ruby_VERSION``.
- ``RUBY_EXECUTABLE``
- Same as ``Ruby_EXECUTABLE``.
- ``RUBY_INCLUDE_DIRS``
- Same as ``Ruby_INCLUDE_DIRS``.
- ``RUBY_INCLUDE_PATH``
- Same as ``Ruby_INCLUDE_DIRS``.
- ``RUBY_LIBRARY``
- Same as ``Ruby_LIBRARY``.
- Examples
- ^^^^^^^^
- Finding Ruby and specifying the minimum required version:
- .. code-block:: cmake
- find_package(Ruby 3.2.6 EXACT REQUIRED)
- # or
- find_package(Ruby 3.2)
- #]=======================================================================]
- cmake_policy(GET CMP0185 _Ruby_CMP0185)
- if(NOT _Ruby_CMP0185 STREQUAL "NEW")
- # Backwards compatibility
- # Define camel case versions of input variables
- foreach (UPPER
- RUBY_EXECUTABLE
- RUBY_LIBRARY
- RUBY_INCLUDE_DIR
- RUBY_CONFIG_INCLUDE_DIR)
- if (DEFINED ${UPPER})
- string(REPLACE "RUBY_" "Ruby_" Camel ${UPPER})
- if (NOT DEFINED ${Camel})
- set(${Camel} ${${UPPER}})
- endif ()
- endif ()
- endforeach ()
- endif()
- # Uncomment the following line to get debug output for this file
- # set(CMAKE_MESSAGE_LOG_LEVEL DEBUG)
- # Determine the list of possible names of the ruby executable depending
- # on which version of ruby is required
- set(_Ruby_POSSIBLE_EXECUTABLE_NAMES ruby)
- # If the user has not specified a Ruby version, create a list of Ruby versions
- # to search (newest to oldest). Based on https://www.ruby-lang.org/en/downloads/releases/
- if (NOT Ruby_FIND_VERSION_EXACT)
- set(_Ruby_SUPPORTED_VERSIONS 40 34 33 32)
- set(_Ruby_UNSUPPORTED_VERSIONS 31 30 27 26 25 24 23 22 21 20)
- foreach (_ruby_version IN LISTS _Ruby_SUPPORTED_VERSIONS _Ruby_UNSUPPORTED_VERSIONS)
- string(SUBSTRING "${_ruby_version}" 0 1 _ruby_major_version)
- string(SUBSTRING "${_ruby_version}" 1 1 _ruby_minor_version)
- # Append both rubyX.Y and rubyXY (eg: ruby3.4 ruby34)
- list(APPEND _Ruby_POSSIBLE_EXECUTABLE_NAMES
- ruby${_ruby_major_version}.${_ruby_minor_version}
- ruby${_ruby_major_version}${_ruby_minor_version})
- endforeach ()
- endif ()
- # Virtual environment handling
- if (DEFINED Ruby_FIND_VIRTUALENV AND NOT Ruby_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY|STANDARD)$")
- message(AUTHOR_WARNING "FindRuby: ${Ruby_FIND_VIRTUALENV}: invalid value for 'Ruby_FIND_VIRTUALENV'. 'FIRST', 'ONLY' or 'STANDARD' expected. 'FIRST' will be used instead.")
- set(Ruby_FIND_VIRTUALENV "FIRST")
- elseif (NOT DEFINED Ruby_FIND_VIRTUALENV)
- # Default is to search for virtual environments first
- set(Ruby_FIND_VIRTUALENV "FIRST")
- endif ()
- # Validate the found Ruby interpreter to make sure that it is
- # callable and that its version matches the requested version
- function(_RUBY_VALIDATE_INTERPRETER result_var path)
- # Get the interpreter version
- execute_process(COMMAND "${path}" -e "puts RUBY_VERSION"
- RESULT_VARIABLE result
- OUTPUT_VARIABLE version
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if (NOT result EQUAL 0)
- set(_Ruby_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${path}\"")
- set(${result_var} FALSE PARENT_SCOPE)
- return()
- endif ()
- if (Ruby_FIND_VERSION)
- if (Ruby_FIND_VERSION_EXACT AND NOT version VERSION_EQUAL Ruby_FIND_VERSION)
- message(DEBUG "Incorrect Ruby found. Requested: ${Ruby_FIND_VERSION}. Found: ${version}. Path: \"${path}\"")
- set(${result_var} FALSE PARENT_SCOPE)
- return()
- elseif (version VERSION_LESS Ruby_FIND_VERSION)
- message(DEBUG "Ruby version is too old. Minimum: ${Ruby_FIND_VERSION}. Found: ${version}. Path: \"${path}\"")
- set(${result_var} FALSE PARENT_SCOPE)
- return()
- endif ()
- endif ()
- # Found valid Ruby interpreter!
- set(${result_var} TRUE PARENT_SCOPE)
- endfunction()
- # Query Ruby RBConfig module for the specified variable (_RUBY_CONFIG_VAR)
- function(_RUBY_CONFIG_VAR RBVAR OUTVAR)
- execute_process(COMMAND "${Ruby_EXECUTABLE}" -r rbconfig -e "print RbConfig::CONFIG['${RBVAR}']"
- RESULT_VARIABLE _Ruby_SUCCESS
- OUTPUT_VARIABLE _Ruby_OUTPUT
- ERROR_QUIET)
- set(${OUTVAR} "${_Ruby_OUTPUT}" PARENT_SCOPE)
- endfunction()
- # Check for RVM virtual environments
- function(_RUBY_CHECK_RVM)
- if (NOT DEFINED ENV{MY_RUBY_HOME})
- return()
- endif ()
- find_program(Ruby_EXECUTABLE
- NAMES ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}
- NAMES_PER_DIR
- PATHS ENV MY_RUBY_HOME
- PATH_SUFFIXES bin Scripts
- VALIDATOR _RUBY_VALIDATE_INTERPRETER
- NO_CMAKE_PATH
- NO_CMAKE_ENVIRONMENT_PATH
- NO_SYSTEM_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- if (Ruby_EXECUTABLE)
- set(Ruby_ENV "RVM" CACHE INTERNAL "Ruby environment")
- endif ()
- endfunction()
- # Check for RBENV virtual environments
- function(_RUBY_CHECK_RBENV)
- find_program(Ruby_RBENV_EXECUTABLE
- NAMES rbenv
- NAMES_PER_DIR
- PATHS "$ENV{HOME}/.rbenv/bin/rbenv" ENV RBENV_ROOT
- PATH_SUFFIXES bin Scripts
- NO_CACHE
- NO_CMAKE_PATH
- NO_CMAKE_ENVIRONMENT_PATH
- NO_CMAKE_SYSTEM_PATH)
- execute_process(COMMAND "${Ruby_RBENV_EXECUTABLE}" "which" "ruby"
- RESULT_VARIABLE result
- OUTPUT_VARIABLE ruby_exe
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- if (NOT result EQUAL 0)
- return()
- endif ()
- cmake_path(GET ruby_exe PARENT_PATH ruby_dir)
- find_program(Ruby_EXECUTABLE
- NAMES ruby
- NAMES_PER_DIR
- PATHS ${ruby_dir}
- VALIDATOR _RUBY_VALIDATE_INTERPRETER
- NO_DEFAULT_PATH)
- if (Ruby_EXECUTABLE)
- set(Ruby_ENV "RBENV" CACHE INTERNAL "Ruby environment")
- endif ()
- endfunction()
- # Check Ruby installed via Homebrew on macOS
- function(_RUBY_CHECK_BREW)
- # Try to locate brew in common locations and in PATH
- find_program(_BREW_EXECUTABLE
- NAMES brew
- NAMES_PER_DIR
- PATHS
- /opt/homebrew/bin # Apple Silicon default
- /usr/local/bin # Intel default
- ENV PATH
- NO_CACHE
- )
- if (NOT _BREW_EXECUTABLE)
- return()
- endif ()
- message(DEBUG "Found brew at: ${_BREW_EXECUTABLE}")
- # Query Homebrew for the prefix of the 'ruby' formula.
- # If Ruby is not installed via Homebrew, this will fail.
- execute_process(
- COMMAND "${_BREW_EXECUTABLE}" --prefix ruby
- RESULT_VARIABLE _Ruby_BREW_RESULT
- OUTPUT_VARIABLE _Ruby_BREW_DIR
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
- message(DEBUG "Ruby BREW is: ${_Ruby_BREW_DIR}")
- if (NOT _Ruby_BREW_RESULT EQUAL 0 OR _Ruby_BREW_DIR STREQUAL "")
- # No 'ruby' formula installed in Homebrew
- return()
- endif ()
- find_program(Ruby_EXECUTABLE
- NAMES ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}
- NAMES_PER_DIR
- PATHS "${_Ruby_BREW_DIR}/bin"
- VALIDATOR _RUBY_VALIDATE_INTERPRETER
- NO_DEFAULT_PATH
- )
- if (Ruby_EXECUTABLE)
- set(Ruby_ENV "BREW" CACHE INTERNAL "Ruby environment")
- endif ()
- endfunction()
- # Check system installed Ruby
- function(_RUBY_CHECK_SYSTEM)
- find_program(Ruby_EXECUTABLE
- NAMES ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}
- NAMES_PER_DIR
- VALIDATOR _RUBY_VALIDATE_INTERPRETER)
- if (Ruby_EXECUTABLE)
- set(Ruby_ENV "Standard" CACHE INTERNAL "Ruby environment")
- endif ()
- endfunction()
- # Find Ruby
- if (NOT Ruby_EXECUTABLE AND Ruby_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
- # First check for RVM virtual environments
- _RUBY_CHECK_RVM()
- # Second check for RBENV virtual environments
- if (NOT Ruby_EXECUTABLE)
- _RUBY_CHECK_RBENV()
- endif ()
- endif ()
- # Check for Homebrew Ruby (non-virtualenv, common on MacOS)
- if (NOT Ruby_EXECUTABLE AND NOT Ruby_FIND_VIRTUALENV STREQUAL "ONLY")
- _RUBY_CHECK_BREW()
- endif ()
- # Fallback to system installed Ruby
- if (NOT Ruby_EXECUTABLE AND NOT Ruby_FIND_VIRTUALENV STREQUAL "ONLY")
- _RUBY_CHECK_SYSTEM()
- endif ()
- # We found a new Ruby or a Ruby that is different than the last one we found.
- # So reload a number of variables by querying the Ruby interpreter.
- if (Ruby_EXECUTABLE AND NOT Ruby_EXECUTABLE STREQUAL "${_Ruby_EXECUTABLE_LAST_QUERIED}")
- # query the ruby version
- _RUBY_CONFIG_VAR("MAJOR" Ruby_VERSION_MAJOR)
- _RUBY_CONFIG_VAR("MINOR" Ruby_VERSION_MINOR)
- _RUBY_CONFIG_VAR("TEENY" Ruby_VERSION_PATCH)
- # Ruby extensions information
- _RUBY_CONFIG_VAR("arch" Ruby_ARCH) # x86_64-linux, arm64-darwin, x64-mswin64_140, etc
- # Extension directory where so/bundle files are stored
- _RUBY_CONFIG_VAR("archdir" Ruby_ARCH_DIR)
- # Extension suffix
- _RUBY_CONFIG_VAR("DLEXT" _Ruby_DLEXT) # so, bundle, *not* dll
- # Headers
- _RUBY_CONFIG_VAR("rubyhdrdir" Ruby_HDR_DIR)
- _RUBY_CONFIG_VAR("rubyarchhdrdir" Ruby_ARCHHDR_DIR)
- # Ruby library information
- _RUBY_CONFIG_VAR("libdir" _Ruby_POSSIBLE_LIB_DIR) # /usr/lib64
- _RUBY_CONFIG_VAR("RUBY_SO_NAME" _Ruby_SO_NAME) # ruby, x64-vcruntime140-ruby340, etc.
- # Ruby directory for ruby files (*.rb). TODO - not relevant should be removed
- _RUBY_CONFIG_VAR("rubylibdir" Ruby_RUBY_LIB_DIR)
- # site_ruby - TODO - not relevant and should be removed
- _RUBY_CONFIG_VAR("sitearchdir" Ruby_SITEARCH_DIR)
- _RUBY_CONFIG_VAR("sitelibdir" Ruby_SITELIB_DIR)
- # vendor_ruby - TODO - Not relevant and should be removed.
- execute_process(COMMAND "${Ruby_EXECUTABLE}" -r vendor-specific -e "print 'true'"
- OUTPUT_VARIABLE Ruby_HAS_VENDOR_RUBY ERROR_QUIET)
- if (Ruby_HAS_VENDOR_RUBY)
- _RUBY_CONFIG_VAR("vendorlibdir" Ruby_VENDORLIB_DIR)
- _RUBY_CONFIG_VAR("vendorarchdir" Ruby_VENDORARCH_DIR)
- endif ()
- # save the results in the cache so we don't have to run ruby the next time again
- set(_Ruby_EXECUTABLE_LAST_QUERIED "${Ruby_EXECUTABLE}" CACHE INTERNAL "The ruby executable last queried for version and path info")
- set(Ruby_VERSION_MAJOR ${Ruby_VERSION_MAJOR} CACHE STRING "The Ruby major version" FORCE)
- set(Ruby_VERSION_MINOR ${Ruby_VERSION_MINOR} CACHE STRING "The Ruby minor version" FORCE)
- set(Ruby_VERSION_PATCH ${Ruby_VERSION_PATCH} CACHE STRING "The Ruby patch version" FORCE)
- set(Ruby_ARCH_DIR ${Ruby_ARCH_DIR} CACHE INTERNAL "The Ruby arch dir" FORCE)
- set(Ruby_HDR_DIR ${Ruby_HDR_DIR} CACHE INTERNAL "The Ruby header dir (1.9+)" FORCE)
- set(Ruby_ARCHHDR_DIR ${Ruby_ARCHHDR_DIR} CACHE INTERNAL "The Ruby arch header dir (2.0+)" FORCE)
- set(_Ruby_POSSIBLE_LIB_DIR ${_Ruby_POSSIBLE_LIB_DIR} CACHE INTERNAL "The Ruby lib dir" FORCE)
- set(Ruby_RUBY_LIB_DIR ${Ruby_RUBY_LIB_DIR} CACHE INTERNAL "The Ruby ruby-lib dir" FORCE)
- set(_Ruby_SO_NAME ${_Ruby_SO_NAME} CACHE STRING "The Ruby shared library name" FORCE)
- set(_Ruby_DLEXT ${_Ruby_DLEXT} CACHE STRING "Ruby extensions extension" FORCE)
- set(Ruby_SITEARCH_DIR ${Ruby_SITEARCH_DIR} CACHE INTERNAL "The Ruby site arch dir" FORCE)
- set(Ruby_SITELIB_DIR ${Ruby_SITELIB_DIR} CACHE INTERNAL "The Ruby site lib dir" FORCE)
- set(Ruby_HAS_VENDOR_RUBY ${Ruby_HAS_VENDOR_RUBY} CACHE BOOL "Vendor Ruby is available" FORCE)
- set(Ruby_VENDORARCH_DIR ${Ruby_VENDORARCH_DIR} CACHE INTERNAL "The Ruby vendor arch dir" FORCE)
- set(Ruby_VENDORLIB_DIR ${Ruby_VENDORLIB_DIR} CACHE INTERNAL "The Ruby vendor lib dir" FORCE)
- mark_as_advanced(
- Ruby_ARCH_DIR
- Ruby_ARCH
- Ruby_HDR_DIR
- Ruby_ARCHHDR_DIR
- _Ruby_POSSIBLE_LIB_DIR
- Ruby_RUBY_LIB_DIR
- _Ruby_SO_NAME
- _Ruby_DLEXT
- Ruby_SITEARCH_DIR
- Ruby_SITELIB_DIR
- Ruby_HAS_VENDOR_RUBY
- Ruby_VENDORARCH_DIR
- Ruby_VENDORLIB_DIR
- Ruby_VERSION_MAJOR
- Ruby_VERSION_MINOR
- Ruby_VERSION_PATCH
- )
- endif ()
- if (Ruby_VERSION_MAJOR)
- set(Ruby_VERSION "${Ruby_VERSION_MAJOR}.${Ruby_VERSION_MINOR}.${Ruby_VERSION_PATCH}")
- set(_Ruby_VERSION_NODOT "${Ruby_VERSION_MAJOR}${Ruby_VERSION_MINOR}${Ruby_VERSION_PATCH}")
- set(_Ruby_VERSION_NODOT_ZERO_PATCH "${Ruby_VERSION_MAJOR}${Ruby_VERSION_MINOR}0")
- set(_Ruby_VERSION_SHORT "${Ruby_VERSION_MAJOR}.${Ruby_VERSION_MINOR}")
- set(_Ruby_VERSION_SHORT_NODOT "${Ruby_VERSION_MAJOR}${Ruby_VERSION_MINOR}")
- endif ()
- # Save CMAKE_FIND_FRAMEWORK
- set(_Ruby_CMAKE_FIND_FRAMEWORK_ORIGINAL ${CMAKE_FIND_FRAMEWORK})
- # Avoid finding the ancient Ruby framework included in macOS.
- set(CMAKE_FIND_FRAMEWORK LAST)
- find_path(Ruby_INCLUDE_DIR
- NAMES ruby.h
- HINTS ${Ruby_HDR_DIR})
- find_path(Ruby_CONFIG_INCLUDE_DIR
- NAMES ruby/config.h config.h
- HINTS ${Ruby_ARCHHDR_DIR})
- set(Ruby_INCLUDE_DIRS ${Ruby_INCLUDE_DIR} ${Ruby_CONFIG_INCLUDE_DIR})
- find_library(Ruby_LIBRARY
- NAMES "${_Ruby_SO_NAME}"
- HINTS ${_Ruby_POSSIBLE_LIB_DIR})
- # Restore CMAKE_FIND_FRAMEWORK
- set(CMAKE_FIND_FRAMEWORK ${_Ruby_CMAKE_FIND_FRAMEWORK_ORIGINAL})
- message(DEBUG "--------FindRuby.cmake debug------------")
- message(DEBUG "_Ruby_POSSIBLE_EXECUTABLE_NAMES: ${_Ruby_POSSIBLE_EXECUTABLE_NAMES}")
- message(DEBUG "_Ruby_POSSIBLE_LIB_DIR: ${_Ruby_POSSIBLE_LIB_DIR}")
- message(DEBUG "_Ruby_SO_NAME: ${_Ruby_SO_NAME}")
- message(DEBUG "_Ruby_DLEXT: ${_Ruby_DLEXT}")
- message(DEBUG "Ruby_FIND_VIRTUALENV=${Ruby_FIND_VIRTUALENV}")
- message(DEBUG "Ruby_ENV: ${Ruby_ENV}")
- message(DEBUG "Found Ruby_VERSION: \"${Ruby_VERSION}\"")
- message(DEBUG "Ruby_EXECUTABLE: ${Ruby_EXECUTABLE}")
- message(DEBUG "Ruby_LIBRARY: ${Ruby_LIBRARY}")
- message(DEBUG "Ruby_INCLUDE_DIR: ${Ruby_INCLUDE_DIR}")
- message(DEBUG "Ruby_CONFIG_INCLUDE_DIR: ${Ruby_CONFIG_INCLUDE_DIR}")
- message(DEBUG "Ruby_HDR_DIR: ${Ruby_HDR_DIR}")
- message(DEBUG "Ruby_ARCH_DIR: ${Ruby_ARCH_DIR}")
- message(DEBUG "Ruby_ARCHHDR_DIR: ${Ruby_ARCHHDR_DIR}")
- message(DEBUG "--------------------")
- # Components
- #
- # If the caller does not request components, preserve legacy behavior
- if (NOT Ruby_FIND_COMPONENTS)
- set(Ruby_FIND_COMPONENTS Interpreter Development)
- endif ()
- set(_Ruby_WANT_INTERPRETER FALSE)
- set(_Ruby_WANT_DEVELOPMENT FALSE)
- set(_Ruby_REQUIRED_VARS "")
- foreach (component IN LISTS Ruby_FIND_COMPONENTS)
- if (component STREQUAL "Interpreter")
- set(_Ruby_WANT_INTERPRETER TRUE)
- list(APPEND _Ruby_REQUIRED_VARS Ruby_EXECUTABLE)
- elseif (component STREQUAL "Development")
- set(_Ruby_WANT_DEVELOPMENT TRUE)
- list(APPEND _Ruby_REQUIRED_VARS Ruby_INCLUDE_DIR Ruby_CONFIG_INCLUDE_DIR)
- if (WIN32)
- list(APPEND _Ruby_REQUIRED_VARS Ruby_LIBRARY)
- endif ()
- else ()
- message(FATAL_ERROR
- "FindRuby: Unsupported component '${component}'. Supported components are: Interpreter, Development")
- endif ()
- endforeach ()
- # Set component found flags
- if (Ruby_EXECUTABLE)
- set(Ruby_Interpreter_FOUND TRUE)
- else ()
- set(Ruby_Interpreter_FOUND FALSE)
- endif ()
- if (Ruby_INCLUDE_DIR AND Ruby_CONFIG_INCLUDE_DIR AND (Ruby_LIBRARY OR NOT WIN32))
- set(Ruby_Development_FOUND TRUE)
- else ()
- set(Ruby_Development_FOUND FALSE)
- endif ()
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(Ruby
- REQUIRED_VARS ${_Ruby_REQUIRED_VARS}
- VERSION_VAR Ruby_VERSION
- HANDLE_COMPONENTS)
- if (Ruby_FOUND)
- if (NOT TARGET Ruby::Interpreter)
- add_executable(Ruby::Interpreter IMPORTED GLOBAL)
- set_target_properties(Ruby::Interpreter PROPERTIES
- IMPORTED_LOCATION "${Ruby_EXECUTABLE}"
- )
- endif ()
- if (Ruby_Development_FOUND)
- set(Ruby_LIBRARIES ${Ruby_LIBRARY})
- if (Ruby_LIBRARY AND NOT TARGET Ruby::Ruby)
- add_library(Ruby::Ruby UNKNOWN IMPORTED)
- set_target_properties(Ruby::Ruby PROPERTIES
- IMPORTED_LOCATION "${Ruby_LIBRARY}"
- INTERFACE_INCLUDE_DIRECTORIES "${Ruby_INCLUDE_DIRS}"
- # Custom property for extension suffix (with dot), e.g. ".so", ".bundle"
- INTERFACE_RUBY_EXTENSION_SUFFIX ".${_Ruby_DLEXT}"
- )
- endif ()
- # Ruby::Module - For building Ruby extension modules
- if (NOT TARGET Ruby::Module)
- if (WIN32)
- add_library(Ruby::Module UNKNOWN IMPORTED)
- set_target_properties(Ruby::Module PROPERTIES
- IMPORTED_LOCATION "${Ruby_LIBRARY}"
- )
- else ()
- add_library(Ruby::Module INTERFACE IMPORTED)
- endif ()
- set_target_properties(Ruby::Module PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${Ruby_INCLUDE_DIRS}"
- # Custom property for extension suffix (with dot), e.g. ".so", ".bundle"
- INTERFACE_RUBY_EXTENSION_SUFFIX ".${_Ruby_DLEXT}"
- INTERFACE_C_VISIBILITY_PRESET hidden
- INTERFACE_CXX_VISIBILITY_PRESET hidden
- INTERFACE_VISIBILITY_INLINES_HIDDEN ON
- )
- # macOS: allow unresolved Ruby API symbols; resolved when Ruby loads the bundle.
- if (APPLE)
- target_link_options(Ruby::Module INTERFACE
- "LINKER:-undefined,dynamic_lookup"
- )
- endif ()
- # Linux (and other ELF platforms):
- # Normally undefined Ruby API symbols are allowed in shared objects and resolved at dlopen().
- # But if the toolchain/preset adds -Wl,--no-undefined, linking will fail.
- # This counteracts that.
- if (UNIX AND NOT APPLE)
- target_link_options(Ruby::Module INTERFACE
- "LINKER:--unresolved-symbols=ignore-all"
- )
- endif ()
- endif ()
- endif ()
- endif ()
- mark_as_advanced(
- Ruby_EXECUTABLE
- Ruby_LIBRARY
- Ruby_INCLUDE_DIR
- Ruby_CONFIG_INCLUDE_DIR
- )
- if(NOT _Ruby_CMP0185 STREQUAL "NEW")
- # Set some variables for compatibility with previous version of this file (no need to provide a CamelCase version of that...)
- set(RUBY_POSSIBLE_LIB_PATH ${_Ruby_POSSIBLE_LIB_DIR})
- set(RUBY_RUBY_LIB_PATH ${Ruby_RUBY_LIB_DIR})
- set(RUBY_INCLUDE_PATH ${Ruby_INCLUDE_DIRS})
- # Backwards compatibility
- # Define upper case versions of output variables
- foreach (Camel
- Ruby_EXECUTABLE
- Ruby_INCLUDE_DIRS
- Ruby_LIBRARY
- Ruby_VERSION
- Ruby_VERSION_MAJOR
- Ruby_VERSION_MINOR
- Ruby_VERSION_PATCH
- Ruby_ARCH_DIR
- Ruby_ARCH
- Ruby_HDR_DIR
- Ruby_ARCHHDR_DIR
- Ruby_RUBY_LIB_DIR
- Ruby_SITEARCH_DIR
- Ruby_SITELIB_DIR
- Ruby_HAS_VENDOR_RUBY
- Ruby_VENDORARCH_DIR
- Ruby_VENDORLIB_DIR)
- string(TOUPPER ${Camel} UPPER)
- set(${UPPER} ${${Camel}})
- endforeach ()
- endif()
|