forked from mirrors/nixpkgs
a1460473cb
bundler for example needs to have the GEM_HOME being passed trough to function properly. For gems that are loading content dynamically, or can use plugins, use buildRubyGem. For executables that are wrapped in their own sealed thing use bundlerEnv.
82 lines
2.1 KiB
Ruby
82 lines
2.1 KiB
Ruby
require 'rbconfig'
|
|
require 'rubygems'
|
|
require 'rubygems/specification'
|
|
require 'fileutils'
|
|
|
|
ruby = File.join(ENV["ruby"], "bin", RbConfig::CONFIG['ruby_install_name'])
|
|
out = ENV["out"]
|
|
bin_path = File.join(ENV["out"], "bin")
|
|
gem_home = ENV["GEM_HOME"]
|
|
gem_path = ENV["GEM_PATH"].split(File::PATH_SEPARATOR)
|
|
install_path = Dir.glob("#{gem_home}/gems/*").first
|
|
gemspec_path = ARGV[0]
|
|
|
|
if defined?(Encoding.default_internal)
|
|
Encoding.default_internal = Encoding::UTF_8
|
|
Encoding.default_external = Encoding::UTF_8
|
|
end
|
|
|
|
gemspec_content = File.read(gemspec_path)
|
|
spec = nil
|
|
if gemspec_content[0..2] == "---" # YAML header
|
|
spec = Gem::Specification.from_yaml(gemspec_content)
|
|
else
|
|
spec = Gem::Specification.load(gemspec_path)
|
|
end
|
|
|
|
FileUtils.mkdir_p("#{out}/nix-support")
|
|
|
|
# write meta-data
|
|
meta = "#{out}/nix-support/gem-meta"
|
|
FileUtils.mkdir_p(meta)
|
|
FileUtils.ln_s(gemspec_path, "#{meta}/spec")
|
|
File.open("#{meta}/name", "w") do |f|
|
|
f.write(spec.name)
|
|
end
|
|
File.open("#{meta}/install-path", "w") do |f|
|
|
f.write(install_path)
|
|
end
|
|
File.open("#{meta}/require-paths", "w") do |f|
|
|
f.write(spec.require_paths.join(" "))
|
|
end
|
|
File.open("#{meta}/executables", "w") do |f|
|
|
f.write(spec.executables.join(" "))
|
|
end
|
|
|
|
# add this gem to the GEM_PATH for dependencies
|
|
File.open("#{out}/nix-support/setup-hook", "a") do |f|
|
|
f.puts("addToSearchPath GEM_PATH #{gem_home}")
|
|
spec.require_paths.each do |dir|
|
|
f.puts("addToSearchPath RUBYLIB #{install_path}/#{dir}")
|
|
end
|
|
end
|
|
|
|
# create regular rubygems binstubs
|
|
FileUtils.mkdir_p(bin_path)
|
|
spec.executables.each do |exe|
|
|
File.open("#{bin_path}/#{exe}", "w") do |f|
|
|
f.write(<<-EOF)
|
|
#!#{ruby}
|
|
#
|
|
# This file was generated by Nix.
|
|
#
|
|
# The application '#{exe}' is installed as part of a gem, and
|
|
# this file is here to facilitate running it.
|
|
#
|
|
|
|
require 'rubygems'
|
|
|
|
Gem.paths = {
|
|
'GEM_PATH' => (
|
|
ENV['GEM_PATH'].to_s.split(File::PATH_SEPARATOR) +
|
|
#{([gem_home] + gem_path).to_s}
|
|
).join(File::PATH_SEPARATOR)
|
|
}
|
|
|
|
load Gem.activate_bin_path(#{spec.name.inspect}, #{exe.inspect}, #{spec.version.to_s.inspect})
|
|
EOF
|
|
end
|
|
|
|
FileUtils.chmod("+x", "#{bin_path}/#{exe}")
|
|
end
|