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.5" "/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 (swig_ruby "ruby interpreter or ruby header files not found (package ruby-dev/ruby-devel installed?)")
elseif (SWIG_VERSION MATCHES "^([12]\\.)|(3\\.0\\.[01234567])$")
	exclude_binding (swig_ruby "found SWIG version (${SWIG_VERSION}) is not suitable. SWIG version >= 3.0.8 required")
else ()
	if (NOT BUILD_SHARED)
		exclude_binding (swig_ruby "it can only be built if `BUILD_SHARED` is enabled")
		return ()
	endif (NOT BUILD_SHARED)

	add_binding (swig_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 ()
