commit 98b2cea9e41adf4af71e171e0572979aaabefa2f Author: Pavel Skrylev Date: Mon Aug 15 20:57:56 2022 +0300 feat: configure path to use system folders diff --git a/configure.ac b/configure.ac index 5a6b074f8a..2ab04193e7 100644 --- a/configure.ac +++ b/configure.ac @@ -3367,10 +3367,35 @@ AS_IF([test ${multiarch+set}], [ MJIT_HEADER_INSTALL_DIR=include/'${RUBY_VERSION_NAME}/${arch}' ]) -archlibdir='${libdir}/${arch}' -sitearchlibdir='${libdir}/${sitearch}' -archincludedir='${includedir}/${arch}' -sitearchincludedir='${includedir}/${sitearch}' +AC_ARG_WITH(sitearchlibdir, + AS_HELP_STRING([--with-sitearchlibdir=DIR], + [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]]]), + [sitearchlibdir=$withval], + [sitearchlibdir=${multiarch+'${rubysitearchprefix}/site_ruby'}${multiarch-'${libdir}/${sitearch}'}]) + +AC_ARG_WITH(archlibdir, + AS_HELP_STRING([--with-archlibdir=DIR], + [architecture dependent libraries in DIR [[LIBDIR/ARCH]]]), + [archlibdir=$withval], + [archlibdir='${libdir}/${arch}']) + +AC_ARG_WITH(archincludedir, + AS_HELP_STRING([--with-archincludedir=DIR], + [architecture dependent includes in DIR [[INCLUDEDIR/ARCH]]]), + [archincludedir=$withval], + [archincludedir='${includedir}/${arch}']) + +AC_ARG_WITH(sitearchincludedir, + AS_HELP_STRING([--with-sitearchincludedir=DIR], + [site architecture dependent includes in DIR [[INCLUDEDIR/SITEARCH]]]), + [sitearchincludedir=$withval], + [sitearchincludedir='${includedir}/${sitearch}']) + +use_system_dirs=no +AC_ARG_ENABLE(use-system-dirs, + AS_HELP_STRING([--enable-use-system-dirs], [use system folders for doc, ri, cache and vendor data]), + [use_system_dirs=$enableval], [use_system_dirs=no]) +AC_SUBST(use_system_dirs)dnl AC_ARG_WITH(soname, AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]), @@ -3978,14 +4001,18 @@ AS_CASE(["$target_os"], ]) rubylibdir='${rubylibprefix}/${ruby_version}' -rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'} -rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'} +AC_ARG_WITH(rubyarchdir, + AS_HELP_STRING([--with-rubyarchdir=DIR], + [folder for architecture dependent ruby libraries [[RUBYLIBDIR/ARCH]]]), + [rubyarchdir="$withval"], + [rubyarchdir=${multiarch+'${rubyarchprefix}'}${multiarch-'${rubylibdir}/${arch}'}]) + AC_ARG_WITH(rubyarchprefix, AS_HELP_STRING([--with-rubyarchprefix=DIR], [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]), - [rubyarchprefix="$withval"]) -AC_SUBST(rubyarchprefix) + [rubyarchprefix="$withval"], + [rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}]) rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'} AC_ARG_WITH(rubysitearchprefix, @@ -4151,6 +4178,11 @@ AC_ARG_WITH(vendorarchhdrdir, [vendorarchhdrdir=$withval], [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}]) +AC_ARG_WITH(cachedir, + AS_HELP_STRING([--with-cachedir=DIR], [specify ruby cache dir]), + [cachedir=$withval]) +AC_SUBST(cachedir)dnl + AC_SUBST(rubyhdrdir)dnl AC_SUBST(sitehdrdir)dnl AC_SUBST(vendorhdrdir)dnl @@ -4334,6 +4365,8 @@ config_summary "Installation prefix" "$prefix" config_summary "exec prefix" "$exec_prefix" config_summary "arch" "$arch" config_summary "site arch" "$sitearch" +config_summary "arch lib dir" "$archlibdir" +config_summary "ruby arch prefix" "$rubyarchprefix" config_summary "RUBY_BASE_NAME" "$RUBY_BASE_NAME" config_summary "enable shared" "$enable_shared" config_summary "ruby lib prefix" "$rubylibprefix" diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb index 39b69ddb1c..d9f7fab1e8 100644 --- a/lib/rubygems/defaults.rb +++ b/lib/rubygems/defaults.rb @@ -20,13 +20,17 @@ def self.default_sources # specified in the environment def self.default_spec_cache_dir - default_spec_cache_dir = File.join Gem.user_home, '.gem', 'specs' + if Gem.configuration.use_system_dirs? && RbConfig::CONFIG['cachedir'] + File.join(RbConfig::CONFIG['cachedir'], 'gemie') + else + default_spec_cache_dir = File.join Gem.user_home, '.gem', 'specs' - unless File.exist?(default_spec_cache_dir) - default_spec_cache_dir = File.join Gem.data_home, 'gem', 'specs' - end + unless File.exist?(default_spec_cache_dir) + default_spec_cache_dir = File.join Gem.data_home, 'gem', 'specs' + end - default_spec_cache_dir + default_spec_cache_dir + end end ## diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 0d72cee51d..cb8ee063b4 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -1524,7 +1524,12 @@ def authors # a full path. def bin_dir - @bin_dir ||= File.join gem_dir, bindir + @bin_dir ||= + if default_gem? + Gem.default_bindir + else + File.join(gem_dir, bindir) + end end ## @@ -1786,10 +1786,19 @@ def development_dependencies # spec.doc_dir 'ri' # => "/path/to/gem_repo/doc/a-1/ri" def doc_dir(type = nil) - @doc_dir ||= File.join base_dir, 'doc', full_name + @doc_dir ||= + if Gem.configuration.use_system_dirs? && RbConfig::CONFIG['docdir'] + File.join RbConfig::CONFIG['docdir'], full_name + else + File.join base_dir, 'doc', full_name + end if type - File.join @doc_dir, type + if Gem.configuration.use_system_dirs? && type == 'ri' + ri_dir + else + File.join @doc_dir, type + end else @doc_dir end @@ -2273,7 +2282,12 @@ def respond_to_missing?(m, include_private = false) # :nodoc: # Returns the full path to this spec's ri directory. def ri_dir - @ri_dir ||= File.join base_dir, 'ri', full_name + @ri_dir ||= + if Gem.configuration.use_system_dirs? && RbConfig::CONFIG['ridir'] + File.join RbConfig::CONFIG['ridir'], full_name + else + File.join base_dir, 'ri', full_name + end end ## --- a/lib/rubygems/config_file.rb 2022-08-15 20:14:46.821000000 +0000 +++ b/lib/rubygems/config_file.rb 2022-08-15 22:07:04.724000000 +0000 @@ -231,6 +231,13 @@ class Gem::ConfigFile end ## + # Has the ruby build single instantiated, defaulting to false/nil + + def use_system_dirs? + @use_system_dirs ||= RbConfig::CONFIG["use_system_dirs"] == 'yes' + end + + ## # Hash of RubyGems.org and alternate API keys def api_keys --- a/template/ruby.pc.in 2022-08-15 22:32:35.948000000 +0000 +++ b/template/ruby.pc.in 2022-08-16 10:29:49.008000000 +0000 @@ -23,6 +23,7 @@ sitearchincludedir=@sitearchincludedir@ ruby=${bindir}/${RUBY_INSTALL_NAME}@EXEEXT@ rubylibprefix=@rubylibprefix@ rubyarchprefix=@rubyarchprefix@ +use_system_dirs=@use_system_dirs@ rubysitearchprefix=@rubysitearchprefix@ rubylibdir=@rubylibdir@ vendordir=@vendordir@ --- a/tool/rbinstall.rb +++ b/tool/rbinstall.rb @@ -396,7 +396,6 @@ install?(:local, :arch, :lib, :'lib-arch end prepare "arch files", archlibdir - install "rbconfig.rb", archlibdir, :mode => $data_mode if CONFIG["ARCHFILE"] for file in CONFIG["ARCHFILE"].split install file, archlibdir, :mode => $data_mode @@ -436,6 +435,7 @@ install?(:ext, :arch, :hdr, :'arch-hdr', end install?(:ext, :comm, :'ext-comm') do prepare "extension scripts", rubylibdir + install "rbconfig.rb", rubylibdir, :mode => $data_mode install_recursive("#{$extout}/common", rubylibdir, :mode => $data_mode) prepare "extension scripts", sitelibdir prepare "extension scripts", vendorlibdir --- a/lib/rdoc/ri/paths.rb 2022-08-22 18:34:31.811000000 +0000 +++ b/lib/rdoc/ri/paths.rb 2022-08-22 18:35:05.594000000 +0000 @@ -59,7 +59,7 @@ module RDoc::RI::Paths spec = Gem::Specification.find_by_name name, req - File.join spec.doc_dir, 'ri' + spec.doc_dir('ri') end ## @@ -73,7 +73,7 @@ module RDoc::RI::Paths ri_paths = {} all = Gem::Specification.map do |spec| - [File.join(spec.doc_dir, 'ri'), spec.name, spec.version] + [spec.doc_dir('ri'), spec.name, spec.version] end if filter == :all then --- a/lib/rubygems/installer.rb 2022-04-12 11:11:15.000000000 +0000 +++ b/lib/rubygems/installer.rb 2022-09-22 20:42:18.985000000 +0000 @@ -780,11 +780,18 @@ if str end end -if Gem.respond_to?(:activate_bin_path) -load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version) +path = + if Gem.respond_to?(:activate_bin_path) + Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version) + else + gem #{spec.name.dump}, version + Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version) + end + +if __FILE__ == path +#{IO.read('libexec/' + bin_file_name)} else -gem #{spec.name.dump}, version -load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version) + load(path) end TEXT end