commit:     6e2686448ec8ff2355fecee39426a20bac4cb61f
Author:     Hans de Graaff <graaff <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 27 18:21:12 2018 +0000
Commit:     Hans de Graaff <graaff <AT> gentoo <DOT> org>
CommitDate: Thu Dec 27 19:06:33 2018 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=6e268644

dev-lang/ruby: fix various install issues

Properly unbundle rdoc and bundler which we install via the gems.
Fix install path for default bundled gemspec, fixing file collisions
without FEATURES=userpriv.
Add USE flag for jit, but note that this does not fully disable jit, and
jit does not work due to issues with the .pch file generated for it.
Add missing PDEPEND on bundler since we now unbundle it properly.

Fixes: https://bugs.gentoo.org/673760
Signed-off-by: Hans de Graaff <graaff <AT> gentoo.org>
Package-Manager: Portage-2.3.51, Repoman-2.3.11

 dev-lang/ruby/files/2.6/009_no-gems.patch      |  88 ++-------
 dev-lang/ruby/files/2.6/010-libressl_2.7.patch |  15 --
 dev-lang/ruby/ruby-2.6.0-r1.ebuild             | 236 +++++++++++++++++++++++++
 3 files changed, 252 insertions(+), 87 deletions(-)

diff --git a/dev-lang/ruby/files/2.6/009_no-gems.patch 
b/dev-lang/ruby/files/2.6/009_no-gems.patch
index e12429a4324..f98801d5031 100644
--- a/dev-lang/ruby/files/2.6/009_no-gems.patch
+++ b/dev-lang/ruby/files/2.6/009_no-gems.patch
@@ -1,12 +1,8 @@
---- a/tool/rbinstall.rb.~1~    2017-10-30 06:45:20.000000000 +0100
-+++ b/tool/rbinstall.rb        2017-12-25 11:06:53.340432435 +0100
-@@ -700,20 +700,10 @@
+--- a/tool/rbinstall.rb.~1~    2018-12-27 07:43:59.938638174 +0100
++++ b/tool/rbinstall.rb        2018-12-27 07:51:09.096382161 +0100
+@@ -723,17 +723,7 @@
  # :startdoc:
  
- install?(:ext, :comm, :gem, :'default-gems', :'default-gems-comm') do
--  install_default_gem('lib', srcdir)
-+  # Gems are unbundled in Gentoo
- end
  install?(:ext, :arch, :gem, :'default-gems', :'default-gems-arch') do
 -  install_default_gem('ext', srcdir) do |path|
 -    # assume that gemspec and extconf.rb are placed in the same directory
@@ -23,73 +19,21 @@
  end
  
  def load_gemspec(file)
-@@ -765,68 +755,7 @@
+@@ -743,7 +743,7 @@
  end
  
- install?(:ext, :comm, :gem, :'bundled-gems') do
+ def install_default_gem(dir, srcdir)
 -  gem_dir = Gem.default_dir
--  directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
--  prepare "bundled gems", gem_dir, directories
--  install_dir = with_destdir(gem_dir)
--  installed_gems = {}
--  options = {
--    :install_dir => install_dir,
--    :bin_dir => with_destdir(bindir),
--    :domain => :local,
--    :ignore_dependencies => true,
--    :dir_mode => $dir_mode,
--    :data_mode => $data_mode,
--    :prog_mode => $prog_mode,
--    :wrappers => true,
--    :format_executable => true,
--  }
--  gem_ext_dir = "#$extout/gems/#{CONFIG['arch']}"
--  extensions_dir = Gem::StubSpecification.gemspec_stub("", gem_dir, 
gem_dir).extensions_dir
--  Gem::Specification.each_gemspec([srcdir+'/gems/*']) do |path|
--    spec = load_gemspec(path)
--    next unless spec.platform == Gem::Platform::RUBY
--    next unless spec.full_name == path[srcdir.size..-1][/\A\/gems\/([^\/]+)/, 
1]
--    spec.extension_dir = "#{extensions_dir}/#{spec.full_name}"
--    if File.directory?(ext = "#{gem_ext_dir}/#{spec.full_name}")
--      spec.extensions[0] ||= "-"
--    end
--    ins = RbInstall::UnpackedInstaller.new(spec, options)
--    puts "#{INDENT}#{spec.name} #{spec.version}"
--    ins.install
--    File.chmod($data_mode, File.join(install_dir, "specifications", 
"#{spec.full_name}.gemspec"))
--    unless spec.extensions.empty?
--      install_recursive(ext, spec.extension_dir)
--    end
--    installed_gems[spec.full_name] = true
--  end
--  installed_gems, gems = Dir.glob(srcdir+'/gems/*.gem').partition {|gem| 
installed_gems.key?(File.basename(gem, '.gem'))}
--  unless installed_gems.empty?
--    install installed_gems, gem_dir+"/cache"
--  end
--  next if gems.empty?
--  if defined?(Zlib)
--    Gem.instance_variable_set(:@ruby, with_destdir(File.join(bindir, 
ruby_install_name)))
--    silent = Gem::SilentUI.new
--    gems.each do |gem|
--      inst = Gem::Installer.new(gem, options)
--      inst.spec.extension_dir = with_destdir(inst.spec.extension_dir)
--      begin
--        Gem::DefaultUserInteraction.use_ui(silent) {inst.install}
--      rescue Gem::InstallError => e
--        next
--      end
--      gemname = File.basename(gem)
--      puts "#{INDENT}#{gemname}"
--    end
--    # fix directory permissions
--    # TODO: Gem.install should accept :dir_mode option or something
--    File.chmod($dir_mode, *Dir.glob(install_dir+"/**/"))
--    # fix .gemspec permissions
--    File.chmod($data_mode, *Dir.glob(install_dir+"/specifications/*.gemspec"))
--  else
--    puts "skip installing bundled gems because of lacking zlib"
--  end
-+  # Gems are unbundled in Gentoo
++  gem_dir = ENV['GEM_DESTDIR'] ; puts "gem_dir for default gems = #{gem_dir}"
+   directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
+   prepare "default gems from #{dir}", gem_dir, directories
+ 
+@@ -777,7 +777,7 @@
  end
  
- parse_args()
+ install?(:ext, :comm, :gem, :'bundled-gems') do
+-  gem_dir = Gem.default_dir
++  gem_dir = ENV['GEM_DESTDIR']
+   directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode)
+   prepare "bundled gems", gem_dir, directories
+   install_dir = with_destdir(gem_dir)

diff --git a/dev-lang/ruby/files/2.6/010-libressl_2.7.patch 
b/dev-lang/ruby/files/2.6/010-libressl_2.7.patch
deleted file mode 100644
index 150f43c9e55..00000000000
--- a/dev-lang/ruby/files/2.6/010-libressl_2.7.patch
+++ /dev/null
@@ -1,15 +0,0 @@
---- a/ext/openssl/extconf.rb.orig      2018-04-02 09:57:14 UTC
-+++ b/ext/openssl/extconf.rb
-@@ -122,8 +122,11 @@ OpenSSL.check_func_or_macro("SSL_get_ser
- have_func("SSL_is_server")
- 
- # added in 1.1.0
-+if !have_struct_member("SSL", "ctx", "openssl/ssl.h") ||
-+    try_static_assert("LIBRESSL_VERSION_NUMBER >= 0x2070000fL", 
"openssl/opensslv.h")
-+  $defs.push("-DHAVE_OPAQUE_OPENSSL")
-+end
- have_func("CRYPTO_lock") || $defs.push("-DHAVE_OPENSSL_110_THREADING_API")
--have_struct_member("SSL", "ctx", "openssl/ssl.h") || 
$defs.push("-DHAVE_OPAQUE_OPENSSL")
- have_func("BN_GENCB_new")
- have_func("BN_GENCB_free")
- have_func("BN_GENCB_get_arg")

diff --git a/dev-lang/ruby/ruby-2.6.0-r1.ebuild 
b/dev-lang/ruby/ruby-2.6.0-r1.ebuild
new file mode 100644
index 00000000000..ccaa7a4cae2
--- /dev/null
+++ b/dev-lang/ruby/ruby-2.6.0-r1.ebuild
@@ -0,0 +1,236 @@
+# Copyright 1999-2018 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+inherit autotools flag-o-matic multilib
+
+MY_P="${PN}-$(ver_cut 1-3)"
+S=${WORKDIR}/${MY_P}
+
+SLOT=$(ver_cut 1-2)
+MY_SUFFIX=$(ver_rs 1 '' ${SLOT})
+RUBYVERSION=${SLOT}.0
+
+DESCRIPTION="An object-oriented scripting language"
+HOMEPAGE="https://www.ruby-lang.org/";
+SRC_URI="mirror://ruby/${SLOT}/${MY_P}.tar.xz"
+
+LICENSE="|| ( Ruby-BSD BSD-2 )"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh 
~sparc ~x86 ~amd64-fbsd ~x86-fbsd"
+IUSE="berkdb debug doc examples gdbm ipv6 jemalloc jit libressl +rdoc 
rubytests socks5 +ssl static-libs tk xemacs"
+
+RDEPEND="
+       berkdb? ( sys-libs/db:= )
+       gdbm? ( sys-libs/gdbm:= )
+       jemalloc? ( dev-libs/jemalloc )
+       jit? ( || ( sys-devel/gcc:* sys-devel/clang:* ) )
+       ssl? (
+               !libressl? ( dev-libs/openssl:0= )
+               libressl? ( dev-libs/libressl )
+       )
+       socks5? ( >=net-proxy/dante-1.1.13 )
+       tk? (
+               dev-lang/tcl:0=[threads]
+               dev-lang/tk:0=[threads]
+       )
+       dev-libs/libyaml
+       virtual/libffi:=
+       sys-libs/zlib
+       >=app-eselect/eselect-ruby-20171225
+"
+
+DEPEND="${RDEPEND}"
+
+BUNDLED_GEMS="
+       >=dev-ruby/did_you_mean-1.2.1[ruby_targets_ruby26]
+       >=dev-ruby/minitest-5.11.3[ruby_targets_ruby26]
+       >=dev-ruby/net-telnet-0.2.0[ruby_targets_ruby26]
+       >=dev-ruby/power_assert-1.1.3[ruby_targets_ruby26]
+       >=dev-ruby/rake-12.3.2[ruby_targets_ruby26]
+       >=dev-ruby/test-unit-3.2.9[ruby_targets_ruby26]
+       >=dev-ruby/xmlrpc-0.3.0[ruby_targets_ruby26]
+"
+
+PDEPEND="
+       ${BUNDLED_GEMS}
+       virtual/rubygems[ruby_targets_ruby26]
+       >=dev-ruby/bundler-1.17.2[ruby_targets_ruby26]
+       >=dev-ruby/json-2.0.2[ruby_targets_ruby26]
+       rdoc? ( >=dev-ruby/rdoc-5.1.0[ruby_targets_ruby26] )
+       xemacs? ( app-xemacs/ruby-modes )"
+
+src_prepare() {
+       # 005 does not compile bigdecimal and is questionable because it
+       # compiles ruby in a non-standard way, may be dropped
+       eapply "${FILESDIR}"/2.6/009*.patch
+
+       einfo "Unbundling gems..."
+       cd "$S"
+       # Remove bundled gems that we will install via PDEPEND, bug
+       # 539700.
+       rm -fr gems/* || die
+
+       einfo "Removing bundled libraries..."
+       rm -fr ext/fiddle/libffi-3.2.1 || die
+
+       eapply_user
+
+       eautoreconf
+}
+
+src_configure() {
+       local modules= myconf=
+
+       # -fomit-frame-pointer makes ruby segfault, see bug #150413.
+       filter-flags -fomit-frame-pointer
+       # In many places aliasing rules are broken; play it safe
+       # as it's risky with newer compilers to leave it as it is.
+       append-flags -fno-strict-aliasing
+       # SuperH needs this
+       use sh && append-flags -mieee
+
+       # Socks support via dante
+       if use socks5 ; then
+               # Socks support can't be disabled as long as SOCKS_SERVER is
+               # set and socks library is present, so need to unset
+               # SOCKS_SERVER in that case.
+               unset SOCKS_SERVER
+       fi
+
+       # Increase GC_MALLOC_LIMIT if set (default is 8000000)
+       if [ -n "${RUBY_GC_MALLOC_LIMIT}" ] ; then
+               append-flags "-DGC_MALLOC_LIMIT=${RUBY_GC_MALLOC_LIMIT}"
+       fi
+
+       # ipv6 hack, bug 168939. Needs --enable-ipv6.
+       use ipv6 || myconf="${myconf} --with-lookup-order-hack=INET"
+
+       # Determine which modules *not* to build depending in the USE flags.
+       if ! use berkdb ; then
+               modules="${modules},dbm"
+       fi
+       if ! use gdbm ; then
+               modules="${modules},gdbm"
+       fi
+       if ! use ssl ; then
+               modules="${modules},openssl"
+       fi
+       if ! use tk ; then
+               modules="${modules},tk"
+       fi
+
+       # Provide an empty LIBPATHENV because we disable rpath but we do not
+       # need LD_LIBRARY_PATH by default since that breaks USE=multitarget
+       # #564272
+       INSTALL="${EPREFIX}/usr/bin/install -c" LIBPATHENV="" econf \
+               --program-suffix=${MY_SUFFIX} \
+               --with-soname=ruby${MY_SUFFIX} \
+               --docdir=${EPREFIX}/usr/share/doc/${P} \
+               --enable-shared \
+               --enable-pthread \
+               --disable-rpath \
+               --with-out-ext="${modules}" \
+               $(use_with jemalloc jemalloc) \
+               $(use_enable jit jit-support ) \
+               $(use_enable socks5 socks) \
+               $(use_enable doc install-doc) \
+               --enable-ipv6 \
+               $(use_enable static-libs static) \
+               $(use_enable static-libs install-static-library) \
+               $(use_with static-libs static-linked-ext) \
+               $(use_enable debug) \
+               ${myconf} \
+               --enable-option-checking=no \
+               || die "econf failed"
+
+       # Makefile is broken because it lacks -ldl
+       rm -rf ext/-test-/popen_deadlock || die
+}
+
+src_compile() {
+       emake V=1 EXTLDFLAGS="${LDFLAGS}" MJIT_CFLAGS="${CFLAGS}" 
MJIT_OPTFLAGS="" MJIT_DEBUGFLAGS="" || die "emake failed"
+}
+
+src_test() {
+       emake -j1 V=1 test || die "make test failed"
+
+       elog "Ruby's make test has been run. Ruby also ships with a make check"
+       elog "that cannot be run until after ruby has been installed."
+       elog
+       if use rubytests; then
+               elog "You have enabled rubytests, so they will be installed to"
+               elog "/usr/share/${PN}-${SLOT}/test. To run them you must be a 
user other"
+               elog "than root, and you must place them into a writeable 
directory."
+               elog "Then call: "
+               elog
+               elog "ruby${MY_SUFFIX} -C /location/of/tests runner.rb"
+       else
+               elog "Enable the rubytests USE flag to install the make check 
tests"
+       fi
+}
+
+src_install() {
+       # Remove the remaining bundled gems. We do this late in the process
+       # since they are used during the build to e.g. create the
+       # documentation.
+       rm -rf ext/json || die
+       rm -rf lib/bundler* lib/rdoc/rdoc.gemspec || die
+
+       # Ruby is involved in the install process, we don't want interference 
here.
+       unset RUBYOPT
+
+       local MINIRUBY=$(echo -e 'include Makefile\ngetminiruby:\n\t@echo 
$(MINIRUBY)'|make -f - getminiruby)
+
+       
LD_LIBRARY_PATH="${S}:${ED}/usr/$(get_libdir)${LD_LIBRARY_PATH+:}${LD_LIBRARY_PATH}"
+       RUBYLIB="${S}:${ED}/usr/$(get_libdir)/ruby/${RUBYVERSION}"
+       for d in $(find "${S}/ext" -type d) ; do
+               RUBYLIB="${RUBYLIB}:$d"
+       done
+       export LD_LIBRARY_PATH RUBYLIB
+
+       # Create directory for the default gems
+       local gem_home="/usr/$(get_libdir)/ruby/gems/${RUBYVERSION}"
+       mkdir -p "${D}/${gem_home}" || die "mkdir gem home failed"
+
+       emake V=1 DESTDIR="${D}" GEM_DESTDIR=${gem_home} install || die "make 
install failed"
+
+       # Remove installed rubygems and rdoc copy
+       rm -rf "${ED}/usr/$(get_libdir)/ruby/${RUBYVERSION}/rubygems" || die 
"rm rubygems failed"
+       rm -rf "${ED}/usr/bin/"gem"${MY_SUFFIX}" || die "rm rdoc bins failed"
+       rm -rf "${ED}/usr/$(get_libdir)/ruby/${RUBYVERSION}"/rdoc* || die "rm 
rdoc failed"
+       rm -rf "${ED}/usr/bin/"{bundle,bundler,ri,rdoc}"${MY_SUFFIX}" || die 
"rm rdoc bins failed"
+
+       if use doc; then
+               emake DESTDIR="${D}" GEM_DESTDIR=${gem_home} install-doc || die 
"make install-doc failed"
+       fi
+
+       if use examples; then
+               insinto /usr/share/doc/${PF}
+               doins -r sample
+       fi
+
+       dodoc ChangeLog NEWS doc/NEWS* README* || die
+
+       if use rubytests; then
+               pushd test
+               insinto /usr/share/${PN}-${SLOT}/test
+               doins -r .
+               popd
+       fi
+}
+
+pkg_postinst() {
+       if [[ ! -n $(readlink "${EROOT}"usr/bin/ruby) ]] ; then
+               eselect ruby set ruby${MY_SUFFIX}
+       fi
+
+       elog
+       elog "To switch between available Ruby profiles, execute as root:"
+       elog "\teselect ruby set ruby(23|24|...)"
+       elog
+}
+
+pkg_postrm() {
+       eselect ruby cleanup
+}

Reply via email to