# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindRuby
--------

Find Ruby

This module finds if Ruby is installed and determines where the
include files and libraries are.  Ruby 1.8, 1.9, 2.0 and 2.1 are
supported.

The minimum required version of Ruby can be specified using the
standard syntax, e.g.  find_package(Ruby 1.8)

It also determines what the name of the library is.  This code sets
the following variables:

``RUBY_EXECUTABLE``
  full path to the ruby binary
``RUBY_INCLUDE_DIRS``
  include dirs to be used when using the ruby library
``RUBY_LIBRARY``
  full path to the ruby library
``RUBY_VERSION``
  the version of ruby which was found, e.g. "1.8.7"
``RUBY_FOUND``
  set to true if ruby ws found successfully

Also:

``RUBY_INCLUDE_PATH``
  same as RUBY_INCLUDE_DIRS, only provided for compatibility reasons, don't use it
#]=======================================================================]

#   RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
#   RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
#   RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
#   RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
#   RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`

# uncomment the following line to get debug output for this file
# set(_RUBY_DEBUG_OUTPUT TRUE)

# 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 1.9 is required, don't look for ruby18 and ruby1.8, default to version 1.8
if(DEFINED Ruby_FIND_VERSION_MAJOR AND DEFINED Ruby_FIND_VERSION_MINOR)
   set(Ruby_FIND_VERSION_SHORT_NODOT "${Ruby_FIND_VERSION_MAJOR}${RUBY_FIND_VERSION_MINOR}")
   # we can't construct that if only major version is given
   set(_RUBY_POSSIBLE_EXECUTABLE_NAMES
       ruby${Ruby_FIND_VERSION_MAJOR}.${Ruby_FIND_VERSION_MINOR}
       ruby${Ruby_FIND_VERSION_MAJOR}${Ruby_FIND_VERSION_MINOR}
       ${_RUBY_POSSIBLE_EXECUTABLE_NAMES})
else()
   set(Ruby_FIND_VERSION_SHORT_NODOT "18")
endif()

if(NOT Ruby_FIND_VERSION_EXACT)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.4 ruby24)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.3 ruby23)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.2 ruby22)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.1 ruby21)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.0 ruby20)
  list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.9 ruby19)

  # if we want a version below 1.9, also look for ruby 1.8
  if("${Ruby_FIND_VERSION_SHORT_NODOT}" VERSION_LESS "19")
    list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.8 ruby18)
  endif()

  list(REMOVE_DUPLICATES _RUBY_POSSIBLE_EXECUTABLE_NAMES)
endif()

find_program(RUBY_EXECUTABLE NAMES ${_RUBY_POSSIBLE_EXECUTABLE_NAMES})

if(RUBY_EXECUTABLE  AND NOT  RUBY_VERSION_MAJOR)
  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)
    if(_RUBY_SUCCESS OR _RUBY_OUTPUT STREQUAL "")
      execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print Config::CONFIG['${RBVAR}']"
        RESULT_VARIABLE _RUBY_SUCCESS
        OUTPUT_VARIABLE _RUBY_OUTPUT
        ERROR_QUIET)
    endif()
    set(${OUTVAR} "${_RUBY_OUTPUT}" PARENT_SCOPE)
  endfunction()


  # 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)

   # query the different directories
   _RUBY_CONFIG_VAR("archdir" RUBY_ARCH_DIR)
   _RUBY_CONFIG_VAR("arch" RUBY_ARCH)
   _RUBY_CONFIG_VAR("rubyhdrdir" RUBY_HDR_DIR)
   _RUBY_CONFIG_VAR("rubyarchhdrdir" RUBY_ARCHHDR_DIR)
   _RUBY_CONFIG_VAR("libdir" RUBY_POSSIBLE_LIB_DIR)
   _RUBY_CONFIG_VAR("rubylibdir" RUBY_RUBY_LIB_DIR)

   # site_ruby
   _RUBY_CONFIG_VAR("sitearchdir" RUBY_SITEARCH_DIR)
   _RUBY_CONFIG_VAR("sitelibdir" RUBY_SITELIB_DIR)

   # vendor_ruby available ?
   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_VERSION_MAJOR    ${RUBY_VERSION_MAJOR}    CACHE PATH "The Ruby major version" FORCE)
   set(RUBY_VERSION_MINOR    ${RUBY_VERSION_MINOR}    CACHE PATH "The Ruby minor version" FORCE)
   set(RUBY_VERSION_PATCH    ${RUBY_VERSION_PATCH}    CACHE PATH "The Ruby patch version" FORCE)
   set(RUBY_ARCH_DIR         ${RUBY_ARCH_DIR}         CACHE PATH "The Ruby arch dir" FORCE)
   set(RUBY_HDR_DIR          ${RUBY_HDR_DIR}          CACHE PATH "The Ruby header dir (1.9+)" FORCE)
   set(RUBY_ARCHHDR_DIR      ${RUBY_ARCHHDR_DIR}      CACHE PATH "The Ruby arch header dir (2.0+)" FORCE)
   set(RUBY_POSSIBLE_LIB_DIR ${RUBY_POSSIBLE_LIB_DIR} CACHE PATH "The Ruby lib dir" FORCE)
   set(RUBY_RUBY_LIB_DIR     ${RUBY_RUBY_LIB_DIR}     CACHE PATH "The Ruby ruby-lib dir" FORCE)
   set(RUBY_SITEARCH_DIR     ${RUBY_SITEARCH_DIR}     CACHE PATH "The Ruby site arch dir" FORCE)
   set(RUBY_SITELIB_DIR      ${RUBY_SITELIB_DIR}      CACHE PATH "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 PATH "The Ruby vendor arch dir" FORCE)
   set(RUBY_VENDORLIB_DIR    ${RUBY_VENDORLIB_DIR}    CACHE PATH "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_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()

# In case RUBY_EXECUTABLE could not be executed (e.g. cross compiling)
# try to detect which version we found. This is not too good.
if(RUBY_EXECUTABLE AND NOT RUBY_VERSION_MAJOR)
   # by default assume 1.8.0
   set(RUBY_VERSION_MAJOR 1)
   set(RUBY_VERSION_MINOR 8)
   set(RUBY_VERSION_PATCH 0)
   # check whether we found 1.9.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby1\\.?9")
      set(RUBY_VERSION_MAJOR 1)
      set(RUBY_VERSION_MINOR 9)
   endif()
   # check whether we found 2.0.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?0")
      set(RUBY_VERSION_MAJOR 2)
      set(RUBY_VERSION_MINOR 0)
   endif()
   # check whether we found 2.1.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?1")
      set(RUBY_VERSION_MAJOR 2)
      set(RUBY_VERSION_MINOR 1)
   endif()
   # check whether we found 2.2.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?2")
      set(RUBY_VERSION_MAJOR 2)
      set(RUBY_VERSION_MINOR 2)
   endif()
   # check whether we found 2.3.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?3")
      set(RUBY_VERSION_MAJOR 2)
      set(RUBY_VERSION_MINOR 3)
   endif()
   # check whether we found 2.4.x
   if(${RUBY_EXECUTABLE} MATCHES "ruby2\\.?4")
      set(RUBY_VERSION_MAJOR 2)
      set(RUBY_VERSION_MINOR 4)
   endif()
endif()

if(RUBY_VERSION_MAJOR)
   set(RUBY_VERSION "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}")
   set(_RUBY_VERSION_SHORT "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}")
   set(_RUBY_VERSION_SHORT_NODOT "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}")
   set(_RUBY_NODOT_VERSION "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}${RUBY_VERSION_PATCH}")
endif()

find_path(RUBY_INCLUDE_DIR
   NAMES ruby.h
   HINTS
   ${RUBY_HDR_DIR}
   ${RUBY_ARCH_DIR}
   /usr/lib/ruby/${_RUBY_VERSION_SHORT}/i586-linux-gnu/ )

set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIR} )

# if ruby > 1.8 is required or if ruby > 1.8 was found, search for the config.h dir
if( "${Ruby_FIND_VERSION_SHORT_NODOT}" GREATER 18  OR  "${_RUBY_VERSION_SHORT_NODOT}" GREATER 18  OR  RUBY_HDR_DIR)
   find_path(RUBY_CONFIG_INCLUDE_DIR
     NAMES ruby/config.h  config.h
     HINTS
     ${RUBY_HDR_DIR}/${RUBY_ARCH}
     ${RUBY_ARCH_DIR}
     ${RUBY_ARCHHDR_DIR}
     )

   set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIRS} ${RUBY_CONFIG_INCLUDE_DIR} )
endif()


# Determine the list of possible names for the ruby library
set(_RUBY_POSSIBLE_LIB_NAMES ruby ruby-static ruby${_RUBY_VERSION_SHORT} ruby${_RUBY_VERSION_SHORT_NODOT} ruby-${_RUBY_VERSION_SHORT} ruby-${RUBY_VERSION})

if(WIN32)
   set( _RUBY_MSVC_RUNTIME "" )
   if( MSVC_VERSION EQUAL 1200 )
     set( _RUBY_MSVC_RUNTIME "60" )
   endif()
   if( MSVC_VERSION EQUAL 1300 )
     set( _RUBY_MSVC_RUNTIME "70" )
   endif()
   if( MSVC_VERSION EQUAL 1310 )
     set( _RUBY_MSVC_RUNTIME "71" )
   endif()
   if( MSVC_VERSION EQUAL 1400 )
     set( _RUBY_MSVC_RUNTIME "80" )
   endif()
   if( MSVC_VERSION EQUAL 1500 )
     set( _RUBY_MSVC_RUNTIME "90" )
   endif()

   set(_RUBY_ARCH_PREFIX "")
   if(CMAKE_SIZEOF_VOID_P EQUAL 8)
     set(_RUBY_ARCH_PREFIX "x64-")
   endif()

   list(APPEND _RUBY_POSSIBLE_LIB_NAMES
               "${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}"
               "${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}-static"
               "${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}"
               "${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}-static" )
endif()

find_library(RUBY_LIBRARY NAMES ${_RUBY_POSSIBLE_LIB_NAMES} HINTS ${RUBY_POSSIBLE_LIB_DIR} )

include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
set(_RUBY_REQUIRED_VARS RUBY_EXECUTABLE RUBY_INCLUDE_DIR RUBY_LIBRARY)
if(_RUBY_VERSION_SHORT_NODOT GREATER 18)
   list(APPEND _RUBY_REQUIRED_VARS RUBY_CONFIG_INCLUDE_DIR)
endif()

if(_RUBY_DEBUG_OUTPUT)
   message(STATUS "--------FindRuby.cmake debug------------")
   message(STATUS "_RUBY_POSSIBLE_EXECUTABLE_NAMES: ${_RUBY_POSSIBLE_EXECUTABLE_NAMES}")
   message(STATUS "_RUBY_POSSIBLE_LIB_NAMES: ${_RUBY_POSSIBLE_LIB_NAMES}")
   message(STATUS "RUBY_ARCH_DIR: ${RUBY_ARCH_DIR}")
   message(STATUS "RUBY_HDR_DIR: ${RUBY_HDR_DIR}")
   message(STATUS "RUBY_POSSIBLE_LIB_DIR: ${RUBY_POSSIBLE_LIB_DIR}")
   message(STATUS "Found RUBY_VERSION: \"${RUBY_VERSION}\" , short: \"${_RUBY_VERSION_SHORT}\", nodot: \"${_RUBY_VERSION_SHORT_NODOT}\"")
   message(STATUS "_RUBY_REQUIRED_VARS: ${_RUBY_REQUIRED_VARS}")
   message(STATUS "RUBY_EXECUTABLE: ${RUBY_EXECUTABLE}")
   message(STATUS "RUBY_LIBRARY: ${RUBY_LIBRARY}")
   message(STATUS "RUBY_INCLUDE_DIR: ${RUBY_INCLUDE_DIR}")
   message(STATUS "RUBY_CONFIG_INCLUDE_DIR: ${RUBY_CONFIG_INCLUDE_DIR}")
   message(STATUS "--------------------")
endif()

FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ruby  REQUIRED_VARS  ${_RUBY_REQUIRED_VARS}
                                        VERSION_VAR RUBY_VERSION )

mark_as_advanced(
  RUBY_EXECUTABLE
  RUBY_LIBRARY
  RUBY_INCLUDE_DIR
  RUBY_CONFIG_INCLUDE_DIR
  )

# Set some variables for compatibility with previous version of this file
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})
