include (${SWIG_USE_FILE})
include (LibAddMacros)

if (APPLE)
	set (CMAKE_FIND_FRAMEWORK "LAST") # try user environment first, then search for system libs  required on OSX under rvm

	# Prefer Ruby versions installed via Homebrew
	set (RUBY_DIRECTORIES "/usr/local/opt/ruby@2.6" "/usr/local/opt/ruby")
	foreach (directory ${RUBY_DIRECTORIES})
		if (EXISTS ${directory})
			list (APPEND CMAKE_PREFIX_PATH ${directory})
		endif (EXISTS ${directory})
	endforeach (directory ${RUBY_DIRECTORIES})
endif ()

find_package (Ruby QUIET)

if (NOT RUBY_FOUND)
	exclude_binding (ruby "ruby interpreter or ruby header files not found (package ruby-dev/ruby-devel installed?)")
elseif (SWIG_VERSION VERSION_LESS "4.0.2" AND (RUBY_VERSION VERSION_GREATER "2.7.0" OR RUBY_VERSION VERSION_EQUAL "2.7.0"))
	exclude_binding (ruby "SWIG <= 4.0.1 incompatible with Ruby >= 2.7")
elseif (SWIG_VERSION MATCHES "^([12]\\.)|(3\\.0\\.[01234567])$")
	exclude_binding (ruby "found SWIG version (${SWIG_VERSION}) is not suitable. SWIG version >= 3.0.8 required")
else ()
	if (NOT BUILD_SHARED)
		exclude_binding (ruby "it can only be built if `BUILD_SHARED` is enabled")
		return ()
	endif (NOT BUILD_SHARED)

	add_binding (ruby)

	add_headers (HDR_FILES)
	add_cppheaders (HDR_FILES)
	add_toolheaders (HDR_FILES)

	include_directories (${CMAKE_CURRENT_SOURCE_DIR})

	# minimal replacement for Ruby's mkmf.create_makefile
	execute_process (COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['vendorarchdir']"
			 OUTPUT_VARIABLE RUBY_VENDOR_ARCH_DIR)
	execute_process (COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['vendordir']" OUTPUT_VARIABLE RUBY_VENDOR_DIR)

	execute_process (COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['sitearchdir']"
			 OUTPUT_VARIABLE RUBY_SITE_ARCH_DIR)
	execute_process (COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['sitedir']" OUTPUT_VARIABLE RUBY_SITE_DIR)

	include_directories (SYSTEM ${RUBY_VENDOR_ARCH_DIR})
	include_directories (SYSTEM ${RUBY_INCLUDE_DIRS})

	# ~~~
	# message (STATUS "Ruby executable: ${RUBY_EXECUTABLE}")
	# message (STATUS "Ruby library: ${RUBY_LIBRARY}")
	# message (STATUS "Ruby version: ${RUBY_VERSION}")
	# to print RUBY_* variables for debugging build run cmake with -D_RUBY_DEBUG_OUTPUT=1
	# ~~~

	set_source_files_properties (kdb.i kdbtools.i PROPERTIES CPLUSPLUS ON)

	set_source_files_properties (kdb.i PROPERTIES SWIG_FLAGS "-initname;_kdb")
	set_source_files_properties (kdbtools.i PROPERTIES SWIG_FLAGS "-initname;_kdbtools;-minherit")

	set (CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}")
	set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SWIG_OUTDIR}")
	set (CMAKE_SWIG_FLAGS "-O;-autorename;-DSWIG_NO_EXPORT_ITERATOR_METHODS;-DSWIG_WITHOUT_OVERRIDE")

	# specify the SWIG_TYPE_TABLE to use (has to be in sync with the ruby plugin)
	set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -DSWIG_TYPE_TABLE=kdb")

	# disable certain compiler warnings for SWIG generated files
	set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-unused-parameter")
	set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-sign-compare")
	if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-unused-but-set-variable")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-catch-value")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-class-memaccess")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-maybe-uninitialized")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-attributes")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-pedantic")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-conversion-null")
	elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-dynamic-class-memaccess")

		# ~~~
		# TODO: Reenable the following warning after we add a virtual destructor to `PluginDatabase`, and its subclasses.
		# See also:
		# - https://github.com/ElektraInitiative/libelektra/pull/1841
		# - https://github.com/ElektraInitiative/libelektra/commit/15d67328
		# ~~~
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-delete-non-virtual-dtor")

		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-deprecated-register")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-gnu-zero-variadic-macro-arguments")
		set (SWIG_COMPILE_FLAGS "${SWIG_COMPILE_FLAGS} -Wno-zero-length-array")
	endif ()

	# add 'kdb' module
	if (CMAKE_VERSION VERSION_LESS 3.8)
		swig_add_module (swig-ruby ruby kdb.i)
	else (CMAKE_VERSION VERSION_LESS 3.8)
		swig_add_library (
			swig-ruby
			LANGUAGE
			ruby
			SOURCES
			kdb.i
			TYPE
			MODULE)
	endif (CMAKE_VERSION VERSION_LESS 3.8) # set the compiler settings for the generated file  (has to be done for each module
	# separately)
	set_source_files_properties (${swig_generated_file_fullname} PROPERTIES COMPILE_FLAGS "${SWIG_COMPILE_FLAGS}")

	# add the 'kdbtools' module
	if (CMAKE_VERSION VERSION_LESS 3.8)
		swig_add_module (swig-ruby-tools ruby kdbtools.i)
	else (CMAKE_VERSION VERSION_LESS 3.8)
		swig_add_library (
			swig-ruby-tools
			LANGUAGE
			ruby
			SOURCES
			kdbtools.i
			TYPE
			MODULE)
	endif (CMAKE_VERSION VERSION_LESS 3.8)
	set_source_files_properties (${swig_generated_file_fullname} PROPERTIES COMPILE_FLAGS "${SWIG_COMPILE_FLAGS}")

	swig_link_libraries (swig-ruby ${RUBY_LIBRARY} elektra-core elektra-kdb)
	set_target_properties (swig-ruby PROPERTIES OUTPUT_NAME _kdb PREFIX "")

	swig_link_libraries (swig-ruby-tools ${RUBY_LIBRARY} elektra-core elektra-kdb elektratools)
	set_target_properties (swig-ruby-tools PROPERTIES OUTPUT_NAME _kdbtools PREFIX "")

	# ~~~
	# CMAKE_INSTALL_PREFIX dependent install location
	# if we hit one of the usual cases (/usr/local or /usr) install the lib
	# in Ruby default include path
	# ~~~
	if (${CMAKE_INSTALL_PREFIX} MATCHES "^/usr/local/?$") # should be under /usr/local/lib/...
		set (RUBY_LIB_INSTALL_DIR "${RUBY_SITE_ARCH_DIR}")
		set (RUBY_MODULE_INSTALL_DIR "${RUBY_SITE_DIR}")
	elseif (${CMAKE_INSTALL_PREFIX} MATCHES "^/usr/?$") # should be under /usr/lib/...
		set (RUBY_LIB_INSTALL_DIR "${RUBY_VENDOR_ARCH_DIR}")
		set (RUBY_MODULE_INSTALL_DIR "${RUBY_VENDOR_DIR}")
	else () # fallback, define a custom location
		set (RUBY_LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/ruby/site_ruby")
		set (RUBY_MODULE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib/ruby/site_ruby")
	endif ()

	if (_RUBY_DEBUG_OUTPUT)
		message (STATUS "Ruby lib install path: ${RUBY_LIB_INSTALL_DIR}")
		message (STATUS "Ruby module install path: ${RUBY_MODULE_INSTALL_DIR}")
	endif ()

	install (TARGETS swig-ruby swig-ruby-tools LIBRARY DESTINATION ${RUBY_LIB_INSTALL_DIR})
	install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/kdb.rb ${CMAKE_CURRENT_SOURCE_DIR}/kdbtools.rb DESTINATION ${RUBY_MODULE_INSTALL_DIR})

	include_directories (${CMAKE_CURRENT_SOURCE_DIR})
	if (BUILD_TESTING)
		add_subdirectory (tests)
	endif (BUILD_TESTING)
endif ()
