summaryrefslogtreecommitdiff
path: root/tool/rbinstall.rb
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 01:00:07 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-24 01:00:07 +0000
commitad6e91def4f1fc5b8fabe98e7be28749406c7c2b (patch)
treef2cb801bf2b2518f87266d709cb8587bd4b8c29d /tool/rbinstall.rb
parent283b3d8f99c01a13e727b2edf0a7643a67d16361 (diff)
merge revision(s) 66867: [Backport #15500]
Revert r58345 and r58371. These changes break the behavior of default gems. Bug #13428 says r58345 is reasonable because gemspec file is installed by `to_ruby_for_cache` method. But I revert `to_ruby_for_cache` in rbinstall.rb at r58403. There is no reason that we apply r58345 now. But I'm not sure about gemspec of default gems affects standalone gems. I'm going to investigate it on rubygems/rubygems. [Bug #15500][ruby-core:90867] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@66913 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool/rbinstall.rb')
-rwxr-xr-xtool/rbinstall.rb83
1 files changed, 70 insertions, 13 deletions
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
index 3338f1ef1c..b99d9ca364 100755
--- a/tool/rbinstall.rb
+++ b/tool/rbinstall.rb
@@ -637,6 +637,69 @@ install?(:local, :comm, :man) do
end
module RbInstall
+ module Specs
+ class FileCollector
+ def initialize(gemspec)
+ @gemspec = gemspec
+ @base_dir = File.dirname(gemspec)
+ end
+
+ def collect
+ (ruby_libraries + built_libraries).sort
+ end
+
+ private
+ def type
+ /\/(ext|lib)?\/.*?\z/ =~ @base_dir
+ $1
+ end
+
+ def ruby_libraries
+ case type
+ when "ext"
+ prefix = "#{$extout}/common/"
+ base = "#{prefix}#{relative_base}"
+ when "lib"
+ base = @base_dir
+ prefix = base.sub(/lib\/.*?\z/, "") + "lib/"
+ end
+
+ if base
+ Dir.glob("#{base}{.rb,/**/*.rb}").collect do |ruby_source|
+ remove_prefix(prefix, ruby_source)
+ end
+ else
+ [remove_prefix(File.dirname(@gemspec) + '/', @gemspec.gsub(/gemspec/, 'rb'))]
+ end
+ end
+
+ def built_libraries
+ case type
+ when "ext"
+ prefix = "#{$extout}/#{CONFIG['arch']}/"
+ base = "#{prefix}#{relative_base}"
+ dlext = CONFIG['DLEXT']
+ Dir.glob("#{base}{.#{dlext},/**/*.#{dlext}}").collect do |built_library|
+ remove_prefix(prefix, built_library)
+ end
+ when "lib"
+ []
+ else
+ []
+ end
+ end
+
+ def relative_base
+ /\/#{Regexp.escape(type)}\/(.*?)\z/ =~ @base_dir
+ $1
+ end
+
+ def remove_prefix(prefix, string)
+ string.sub(/\A#{Regexp.escape(prefix)}/, "")
+ end
+ end
+ end
+
class UnpackedInstaller < Gem::Installer
module DirPackage
def extract_files(destination_dir, pattern = "*")
@@ -726,17 +789,7 @@ install?(:ext, :comm, :gem, :'default-gems', :'default-gems-comm') do
install_default_gem('lib', srcdir)
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
- success = false
- begin
- IO.foreach(File.dirname(path[(srcdir.size+1)..-1]) + "/Makefile") do |l|
- break success = true if /^TARGET\s*=/ =~ l
- end
- rescue Errno::ENOENT
- end
- success
- end
+ install_default_gem('ext', srcdir)
end
def load_gemspec(file)
@@ -762,8 +815,12 @@ def install_default_gem(dir, srcdir)
makedirs(default_spec_dir)
gems = Dir.glob("#{srcdir}/#{dir}/**/*.gemspec").map {|src|
- next if block_given? and !yield(src)
- load_gemspec(src)
+ spec = load_gemspec(src)
+ file_collector = RbInstall::Specs::FileCollector.new(src)
+ files = file_collector.collect
+ next if files.empty?
+ spec.files = files
+ spec
}
gems.compact.sort_by(&:name).each do |gemspec|
full_name = "#{gemspec.name}-#{gemspec.version}"