Created
March 29, 2018 17:25
-
-
Save Eric-Guo/c83b6b2875553bb708da08c8e5ff0e68 to your computer and use it in GitHub Desktop.
Ruby 2.4.4 Formula
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Ruby < Formula | |
desc "Powerful, clean, object-oriented scripting language" | |
homepage "https://www.ruby-lang.org/" | |
url "https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.4.tar.xz" | |
sha256 "1d0034071d675193ca769f64c91827e5f54cb3a7962316a41d5217c7bc6949f0" | |
revision 1 | |
bottle do | |
sha256 "f65d0a31c1149e479ec84c9953ac203d65c0f931b9ab346efae58faed468afda" => :high_sierra | |
sha256 "97d54b2626c04642997487f06819332c10a6eb62c700a1861d0c3535ce8a3411" => :sierra | |
sha256 "20280496ac72c4d0755272f176148d7826fa4a8205cace414beb3c7231563b5b" => :el_capitan | |
end | |
devel do | |
url "https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0-rc1.tar.xz" | |
sha256 "a479a1bce69b2cf656821f10104dcb8b426922b56d3d6cbdf48318842fae752c" | |
end | |
head do | |
url "https://svn.ruby-lang.org/repos/ruby/trunk/" | |
depends_on "autoconf" => :build | |
end | |
option "with-suffix", "Suffix commands with '24'" | |
option "with-doc", "Install documentation" | |
depends_on "pkg-config" => :build | |
depends_on "readline" => :recommended | |
depends_on "gdbm" => :optional | |
depends_on "gmp" => :optional | |
depends_on "libffi" => :optional | |
depends_on "libyaml" | |
depends_on "openssl" | |
# Should be updated only when Ruby is updated (if an update is available). | |
# The exception is Rubygem security fixes, which mandate updating this | |
# formula & the versioned equivalents and bumping the revisions. | |
resource "rubygems" do | |
url "https://rubygems.org/rubygems/rubygems-2.6.14.tgz" | |
sha256 "406a45d258707f52241843e9c7902bbdcf00e7edc3e88cdb79c46659b47851ec" | |
end | |
def program_suffix | |
build.with?("suffix") ? "24" : "" | |
end | |
def ruby | |
"#{bin}/ruby#{program_suffix}" | |
end | |
def api_version | |
Utils.popen_read("#{ruby} -e 'print Gem.ruby_api_version'") | |
end | |
def install | |
# otherwise `gem` command breaks | |
ENV.delete("SDKROOT") | |
system "autoconf" if build.head? | |
args = %W[ | |
--prefix=#{prefix} | |
--enable-shared | |
--disable-silent-rules | |
--with-sitedir=#{HOMEBREW_PREFIX}/lib/ruby/site_ruby | |
--with-vendordir=#{HOMEBREW_PREFIX}/lib/ruby/vendor_ruby | |
] | |
args << "--program-suffix=#{program_suffix}" if build.with? "suffix" | |
args << "--disable-install-doc" if build.without? "doc" | |
args << "--disable-dtrace" unless MacOS::CLT.installed? | |
args << "--without-gmp" if build.without? "gmp" | |
paths = [ | |
Formula["libyaml"].opt_prefix, | |
Formula["openssl"].opt_prefix, | |
] | |
%w[readline gdbm gmp libffi].each do |dep| | |
paths << Formula[dep].opt_prefix if build.with? dep | |
end | |
args << "--with-opt-dir=#{paths.join(":")}" | |
system "./configure", *args | |
# Ruby has been configured to look in the HOMEBREW_PREFIX for the | |
# sitedir and vendordir directories; however we don't actually want to create | |
# them during the install. | |
# | |
# These directories are empty on install; sitedir is used for non-rubygems | |
# third party libraries, and vendordir is used for packager-provided libraries. | |
inreplace "tool/rbinstall.rb" do |s| | |
s.gsub! 'prepare "extension scripts", sitelibdir', "" | |
s.gsub! 'prepare "extension scripts", vendorlibdir', "" | |
s.gsub! 'prepare "extension objects", sitearchlibdir', "" | |
s.gsub! 'prepare "extension objects", vendorarchlibdir', "" | |
end | |
system "make" | |
system "make", "install" | |
# A newer version of ruby-mode.el is shipped with Emacs | |
elisp.install Dir["misc/*.el"].reject { |f| f == "misc/ruby-mode.el" } | |
# This is easier than trying to keep both current & versioned Ruby | |
# formulae repeatedly updated with Rubygem patches. | |
resource("rubygems").stage do | |
ENV.prepend_path "PATH", bin | |
system ruby, "setup.rb", "--prefix=#{buildpath}/vendor_gem" | |
rg_in = lib/"ruby/#{api_version}" | |
# Remove bundled Rubygem version. | |
rm_rf rg_in/"rubygems" | |
rm_f rg_in/"rubygems.rb" | |
rm_f rg_in/"ubygems.rb" | |
rm_f bin/"gem#{program_suffix}" | |
# Drop in the new version. | |
rg_in.install Dir[buildpath/"vendor_gem/lib/*"] | |
bin.install buildpath/"vendor_gem/bin/gem" => "gem#{program_suffix}" | |
end | |
end | |
def post_install | |
# Customize rubygems to look/install in the global gem directory | |
# instead of in the Cellar, making gems last across reinstalls | |
config_file = lib/"ruby/#{api_version}/rubygems/defaults/operating_system.rb" | |
config_file.unlink if config_file.exist? | |
config_file.write rubygems_config(api_version) | |
# Create the sitedir and vendordir that were skipped during install | |
%w[sitearchdir vendorarchdir].each do |dir| | |
mkdir_p `#{ruby} -rrbconfig -e 'print RbConfig::CONFIG["#{dir}"]'` | |
end | |
end | |
def rubygems_bindir | |
"#{HOMEBREW_PREFIX}/bin" | |
end | |
def rubygems_config(api_version); <<~EOS | |
module Gem | |
class << self | |
alias :old_default_dir :default_dir | |
alias :old_default_path :default_path | |
alias :old_default_bindir :default_bindir | |
alias :old_ruby :ruby | |
end | |
def self.default_dir | |
path = [ | |
"#{HOMEBREW_PREFIX}", | |
"lib", | |
"ruby", | |
"gems", | |
"#{api_version}" | |
] | |
@default_dir ||= File.join(*path) | |
end | |
def self.private_dir | |
path = if defined? RUBY_FRAMEWORK_VERSION then | |
[ | |
File.dirname(RbConfig::CONFIG['sitedir']), | |
'Gems', | |
RbConfig::CONFIG['ruby_version'] | |
] | |
elsif RbConfig::CONFIG['rubylibprefix'] then | |
[ | |
RbConfig::CONFIG['rubylibprefix'], | |
'gems', | |
RbConfig::CONFIG['ruby_version'] | |
] | |
else | |
[ | |
RbConfig::CONFIG['libdir'], | |
ruby_engine, | |
'gems', | |
RbConfig::CONFIG['ruby_version'] | |
] | |
end | |
@private_dir ||= File.join(*path) | |
end | |
def self.default_path | |
if Gem.user_home && File.exist?(Gem.user_home) | |
[user_dir, default_dir, private_dir] | |
else | |
[default_dir, private_dir] | |
end | |
end | |
def self.default_bindir | |
"#{rubygems_bindir}" | |
end | |
def self.ruby | |
"#{opt_bin}/ruby#{program_suffix}" | |
end | |
end | |
EOS | |
end | |
test do | |
hello_text = shell_output("#{bin}/ruby#{program_suffix} -e 'puts :hello'") | |
assert_equal "hello\n", hello_text | |
ENV["GEM_HOME"] = testpath | |
system "#{bin}/gem#{program_suffix}", "install", "json" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
To install
After install
cd /usr/local/opt/ruby/lib ln -s libruby.2.4.4.dylib libruby.2.4.3.dylib brew cleanup brew pin ruby