# $Id$
# TODO (release-critical prefixed with !, non release-critical with *)
#
NAME = ruby30

SHORTVER = 3.0
DISTVERSION = $(SHORTVER).3

VERSION = $(DISTVERSION)
API_VERSION = $(VERSION)

DISTNAME = ruby-$(DISTVERSION)

GARTYPE = v2

BUILD64 = 1
ISAEXEC = 1

MASTER_SITES = https://cache.ruby-lang.org/pub/ruby/$(SHORTVER)/
DISTFILES = ruby-$(DISTVERSION).tar.gz

PATCHFILES += 0001-add-csw-path-to-dln.c.patch
PATCHFILES += 0002-added-opt-csw-bin-to-find_exectuable0.patch
PATCHFILES += 0003-Add-csw-path-to-dln_find.c.patch
PATCHFILES += 0004-Disable-statement-expressions-for-Oracle-Developer-S.patch

DESCRIPTION = An object-oriented language for quick and easy programming.
define BLURB
  Ruby is a language for quick and easy programming. Similar in scope to Perl
  and Python, it has high-level data types, automatic memory management,
  dynamic typing, a module system, exceptions, and a rich standard library.
  What sets Ruby apart is a clean and consistent language design where
  everything is an object. Other distinguishing features are CLU-style
  iterators for loop abstraction, singleton classes/methods and lexical
  closures.
endef

PACKAGES = CSWruby30 
SPKG_DESC_CSWruby30 = $(DESCRIPTION)
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibssl1-0-0
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibffi6
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibtk8-5
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibtcl8-5
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibyaml0-2
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibncurses6
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibz1
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibgdbm4
RUNTIME_DEP_PKGS_CSWruby30 += CSWlibreadline7

PACKAGES += CSWruby30-dev
SPKG_DESC_CSWruby30-dev = Ruby $(SHORTVER) Extension Development Files
PKGFILES_CSWruby30-dev = $(includedir)/.* 
RUNTIME_DEP_PKGS_CSWruby30-dev = CSWruby30

PACKAGES += CSWruby30-ri 
SPKG_DESC_CSWruby30-ri = Documentation for Ruby $(SHORTVER)
PKGFILES_CSWruby30-ri  =  $(datadir)/ri/.* $(bindir)/ri$(API_SHORT)
ARCHALL_CSWruby30-ri = 1

BUILD_DEP_PKGS += CSWlibssl-dev
BUILD_DEP_PKGS += CSWlibgdbm-dev
BUILD_DEP_PKGS += CSWlibreadline-dev
BUILD_DEP_PKGS += CSWlibncurses-dev
BUILD_DEP_PKGS += CSWlibz-dev
BUILD_DEP_PKGS += CSWlibyaml-dev

# checkpkg just supports ruby18 and ruby19 and ruby30 clearly does not depend on these packages
CHECKPKG_OVERRIDES_CSWruby30 += missing-dependency|CSWlibruby1-9-1-1|or|CSWruby|or|CSWruby18|or|CSWruby191

# the files dln.c and dln_find.c contain a reference to /usr/local
# we've added /opt/csw/bin and /opt/csw/lib to the path where
# ruby searches for loadable modules.
# also we do not provide a separate package for libruby
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/libruby$(SHORTVER).so.3
CHECKPKG_OVERRIDES_CSWruby30 += shared-lib-package-contains-so-symlink|file=/opt/csw/lib/libruby$(SHORTVER).so
CHECKPKG_OVERRIDES_CSWruby30 += shared-lib-pkgname-mismatch|file=opt/csw/lib/libruby$(SHORTVER).so.3|soname=libruby$(SHORTVER).so.3|pkgname=CSWruby30|expected=CSWlibruby3-0-3
CHECKPKG_OVERRIDES_CSWruby30 += shared-lib-package-contains-so-symlink|file=/opt/csw/lib/libruby$(SHORTVER).so

# these files contain a reference to /usr/local just in comments
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/share|root/opt/csw/lib/ruby/$(SHORTVER).0/tk/dialog.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/share|root/opt/csw/lib/ruby/$(SHORTVER).0/open3.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/tkextlib/itcl/setup.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/tkextlib/itk/setup.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/rubygems/specification.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/rubygems/installer.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/shell.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/fileutils.rb
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/pathname.rb

# we've added /opt/csw/bin to find_executable0
CHECKPKG_OVERRIDES_CSWruby30 += file-with-bad-content|/usr/local|root/opt/csw/lib/ruby/$(SHORTVER).0/mkmf.rb

CHECKPKG_OVERRIDES_CSWruby30-dev += surplus-dependency|CSWruby30

ALTERNATIVES_CSWruby30 = ruby30
ALTERNATIVE_ruby30 += $(bindir)/ruby ruby $(bindir)/ruby$(SHORTVER) 30 
ALTERNATIVE_ruby30 += $(bindir)/irb irb $(bindir)/irb$(SHORTVER)
ALTERNATIVE_ruby30 += $(bindir)/erb erb $(bindir)/erb$(API_SORT)
ALTERNATIVE_ruby30 += $(bindir)/rdoc rdoc $(bindir)/rdoc$(SHORTVER)
ALTERNATIVE_ruby30 += $(bindir)/ri ri $(bindir)/ri$(SHORTVER)
ALTERNATIVE_ruby30 += $(bindir)/testrb testrb $(bindir)/testrb$(SHORTVER)
ALTERNATIVE_ruby30 += $(bindir)/gem gem $(bindir)/gem$(SHORTVER)
ALTERNATIVE_ruby30 += $(bindir)/rake rake $(bindir)/rake$(SHORTVER)
ALTERNATIVE_ruby30 += $(mandir)/man1/ruby.1 ruby.1 $(mandir)/man1/ruby$(SHORTVER).1
ALTERNATIVE_ruby30 += $(mandir)/man1/erb.1 erb.1 $(mandir)/man1/erb$(SHORTVER).1
ALTERNATIVE_ruby30 += $(mandir)/man1/irb.1 irb.1 $(mandir)/man1/irb$(SHORTVER).1
ALTERNATIVE_ruby30 += $(mandir)/man1/rake.1 rake.1 $(mandir)/man1/rake$(SHORTVER).1
ALTERNATIVE_ruby30 += $(mandir)/man1/ri.1 ri.1 $(mandir)/man1/ri$(SHORTVER).1

EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/ruby
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/irb
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/erb
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/rdoc
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/ri
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/testrb
EXTRA_MERGE_EXCLUDE_FILES += $(bindir)/rake
EXTRA_MERGE_EXCLUDE_FILES += $(mandir)/man1/ruby.1
EXTRA_MERGE_EXCLUDE_FILES += $(mandir)/man1/erb.1
EXTRA_MERGE_EXCLUDE_FILES += $(mandir)/man1/irb.1
EXTRA_MERGE_EXCLUDE_FILES += $(mandir)/man1/rake.1
EXTRA_MERGE_EXCLUDE_FILES += $(mandir)/man1/ri.1

#
# Here we try to be compatible with the output of the 64-bit system ruby-2.6
#
#    /usr/bin/ruby -e 'puts RUBY_PLATFORM' => sparcv9-solaris2.11
#
# on Solaris 11. Unfortunately there is no way to only set the target CPU,
# so we have to setup target OS to what config.guess/config.sub expect.
#
CONFIGURE_HOSTTARGET_OS-5.10 = solaris2.10
CONFIGURE_HOSTTARGET_OS-5.11 = solaris2.11
CONFIGURE_HOSTTARGET_CPU-sparc-64 = sparcv9
CONFIGURE_HOSTTARGET_CPU-i386-64 = x86_64

CONFIGURE_HOSTTARGET-64 = $(CONFIGURE_HOSTTARGET_CPU-$(GARCH)-$(MEMORYMODEL))-$(CONFIGURE_HOSTTARGET_OS-$(GAROSREL))

CONFIGURE_ARGS += $(DIRPATHS)
CONFIGURE_ARGS += --program-suffix=$(SHORTVER)
CONFIGURE_ARGS += --with-soname=ruby$(SHORTVER)
CONFIGURE_ARGS += --enable-shared
CONFIGURE_ARGS += --disable-install-capi
CONFIGURE_ARGS += --with-baseruby=no
CONFIGURE_ARGS += $(if $(CONFIGURE_HOSTTARGET-$(MEMORYMODEL)),--build=$(CONFIGURE_HOSTTARGET-$(MEMORYMODEL)) --host=$(CONFIGURE_HOSTTARGET-$(MEMORYMODEL)) --target=$(CONFIGURE_HOSTTARGET-$(MEMORYMODEL)))

# make test works, but there are tests failing with make check
TEST_TARGET = test

POSTMSG = $(docdir)/$(NAME)/README.$(NAME)
DISTFILES +=$(notdir $(POSTMSG))

# There is no fix for objcopy available yet and both Oracle /usr/gnu/bin/objcopy and also our own
# /opt/csw/gnu/objcopy is affected, so disable objcopy completely for now:
EXTRA_CONFIGURE_ENV += OBJCOPY=/bin/true

include gar/category.mk

SPKG_VERSION := $(SPKG_VERSION)

install-custom:
	ginstall -Dm 644 $(FILEDIR)/README.$(NAME) \
		$(DESTDIR)$(docdir)/$(NAME)/README.$(NAME)

post-install:
	find $(DESTDIR)$(bindir) -type f -depth -print | xargs -n 1 gsed -i -e '1 s|ruby$$|ruby$(SHORTVER)|g'

post-install-modulated:
ifeq ($(MEMORYMODEL),64)
	@echo " ===> Installing 64-bit architecture specific headers"
	gcp -av $(DESTDIR)$(includedir)/ruby-$(SHORTVER).0/$(CONFIGURE_HOSTTARGET-$(MEMORYMODEL)) $(PKGROOT)$(includedir)/ruby-$(SHORTVER).0/
endif
	@$(MAKECOOKIE)
