11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'lib/prebake/extractor.rb', line 11
def self.install(gem_path, spec)
Logger.debug "Extracting precompiled binaries from #{File.basename(gem_path)}"
= 0
Dir.mktmpdir("prebake-extract") do |tmpdir|
Gem::Package.new(gem_path).(tmpdir)
Dir.glob(File.join(tmpdir, "**/*.{so,bundle,dll}")).each do |binary|
next if File.symlink?(binary)
next if File.size(binary).zero?
real_binary = File.realpath(binary)
real_tmpdir = File.realpath(tmpdir)
next unless real_binary.start_with?("#{real_tmpdir}/")
relative = binary.sub("#{tmpdir}/", "")
relative = relative.sub(%r{\Aext/[^/]+/}, "") if relative.start_with?("ext/")
relative = relative.sub(%r{\Alib/}, "") if relative.start_with?("lib/")
relative = relative.sub(%r{\Aextensions?/[^/]+/[^/]+/}, "") if relative.start_with?("extension/", "extensions/")
dest = File.join(spec.extension_dir, relative)
FileUtils.mkdir_p(File.dirname(dest))
FileUtils.cp(binary, dest)
+= 1
end
end
FileUtils.touch(File.join(spec.extension_dir, ".prebake")) if > 0
Logger.info "Installed precompiled #{File.basename(gem_path)} " \
"(#{} binary files)"
rescue StandardError => e
Logger.warn "Extraction failed for #{File.basename(gem_path)}: #{e.message}"
raise
end
|