From faf2182495e770041274c59e3b9ac80b98326fae Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 30 Dec 2017 18:57:23 +0000 Subject: gpg: move to compat. --- Library/Homebrew/compat.rb | 1 + Library/Homebrew/compat/gpg.rb | 49 ++++++++++++++++++++++++++++++++++++++++++ Library/Homebrew/formula.rb | 1 - Library/Homebrew/gpg.rb | 49 ------------------------------------------ 4 files changed, 50 insertions(+), 50 deletions(-) create mode 100644 Library/Homebrew/compat/gpg.rb delete mode 100644 Library/Homebrew/gpg.rb (limited to 'Library') diff --git a/Library/Homebrew/compat.rb b/Library/Homebrew/compat.rb index 8b3d72ec7..d829e900c 100644 --- a/Library/Homebrew/compat.rb +++ b/Library/Homebrew/compat.rb @@ -27,3 +27,4 @@ require "compat/ENV/std" require "compat/ENV/super" require "compat/utils/shell" require "compat/extend/string" +require "compat/gpg" diff --git a/Library/Homebrew/compat/gpg.rb b/Library/Homebrew/compat/gpg.rb new file mode 100644 index 000000000..01880f71e --- /dev/null +++ b/Library/Homebrew/compat/gpg.rb @@ -0,0 +1,49 @@ +require "utils" + +module Gpg + module_function + + def executable + which "gpg" + end + + def available? + File.executable?(executable.to_s) + end + + def create_test_key(path) + odie "No GPG present to test against!" unless available? + + (path/"batch.gpg").write <<~EOS + Key-Type: RSA + Key-Length: 2048 + Subkey-Type: RSA + Subkey-Length: 2048 + Name-Real: Testing + Name-Email: testing@foo.bar + Expire-Date: 1d + %no-protection + %commit + EOS + system executable, "--batch", "--gen-key", "batch.gpg" + end + + def cleanup_test_processes! + odie "No GPG present to test against!" unless available? + + gpgconf = Pathname.new(executable).parent/"gpgconf" + + system gpgconf, "--kill", "gpg-agent" + system gpgconf, "--homedir", "keyrings/live", "--kill", + "gpg-agent" + end + + def test(path) + create_test_key(path) + begin + yield + ensure + cleanup_test_processes! + end + end +end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index eec2c9045..8e4f80260 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -13,7 +13,6 @@ require "pkg_version" require "tap" require "keg" require "migrator" -require "gpg" require "extend/ENV" # A formula provides instructions and metadata for Homebrew to install a piece diff --git a/Library/Homebrew/gpg.rb b/Library/Homebrew/gpg.rb deleted file mode 100644 index 01880f71e..000000000 --- a/Library/Homebrew/gpg.rb +++ /dev/null @@ -1,49 +0,0 @@ -require "utils" - -module Gpg - module_function - - def executable - which "gpg" - end - - def available? - File.executable?(executable.to_s) - end - - def create_test_key(path) - odie "No GPG present to test against!" unless available? - - (path/"batch.gpg").write <<~EOS - Key-Type: RSA - Key-Length: 2048 - Subkey-Type: RSA - Subkey-Length: 2048 - Name-Real: Testing - Name-Email: testing@foo.bar - Expire-Date: 1d - %no-protection - %commit - EOS - system executable, "--batch", "--gen-key", "batch.gpg" - end - - def cleanup_test_processes! - odie "No GPG present to test against!" unless available? - - gpgconf = Pathname.new(executable).parent/"gpgconf" - - system gpgconf, "--kill", "gpg-agent" - system gpgconf, "--homedir", "keyrings/live", "--kill", - "gpg-agent" - end - - def test(path) - create_test_key(path) - begin - yield - ensure - cleanup_test_processes! - end - end -end -- cgit v1.2.3 From d54e670a6491ae3e6681448cfcf9332635149aa8 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 30 Dec 2017 18:58:30 +0000 Subject: requirements: move more to compat. --- Library/Homebrew/caveats.rb | 1 + Library/Homebrew/compat/dependency_collector.rb | 48 ++++++++++++--- Library/Homebrew/compat/requirements.rb | 6 ++ .../compat/requirements/emacs_requirement.rb | 35 +++++++++++ .../compat/requirements/fortran_requirement.rb | 13 +++++ .../compat/requirements/mpi_requirement.rb | 66 +++++++++++++++++++++ .../compat/requirements/perl_requirement.rb | 36 ++++++++++++ .../compat/requirements/python_requirement.rb | 68 ++++++++++++++++++++++ .../compat/requirements/ruby_requirement.rb | 56 ++++++++++++++++++ Library/Homebrew/dependency_collector.rb | 20 ------- Library/Homebrew/dev-cmd/audit.rb | 19 +----- .../Homebrew/extend/os/mac/dependency_collector.rb | 11 ---- Library/Homebrew/requirements.rb | 6 -- Library/Homebrew/requirements/emacs_requirement.rb | 35 ----------- .../Homebrew/requirements/fortran_requirement.rb | 13 ----- Library/Homebrew/requirements/java_requirement.rb | 2 +- Library/Homebrew/requirements/mpi_requirement.rb | 66 --------------------- Library/Homebrew/requirements/perl_requirement.rb | 36 ------------ .../Homebrew/requirements/python_requirement.rb | 68 ---------------------- Library/Homebrew/requirements/ruby_requirement.rb | 56 ------------------ Library/Homebrew/requirements/xcode_requirement.rb | 2 +- Library/Homebrew/test/dependency_collector_spec.rb | 2 +- Library/Homebrew/test/formula_installer_spec.rb | 2 +- Library/Homebrew/test/formula_spec.rb | 14 ++--- Library/Homebrew/test/mpi_requirement_spec.rb | 4 +- .../test/os/mac/dependency_collector_spec.rb | 12 ---- Library/Homebrew/test/rubocops/lines_cop_spec.rb | 13 ----- 27 files changed, 334 insertions(+), 376 deletions(-) create mode 100644 Library/Homebrew/compat/requirements/emacs_requirement.rb create mode 100644 Library/Homebrew/compat/requirements/fortran_requirement.rb create mode 100644 Library/Homebrew/compat/requirements/mpi_requirement.rb create mode 100644 Library/Homebrew/compat/requirements/perl_requirement.rb create mode 100644 Library/Homebrew/compat/requirements/python_requirement.rb create mode 100644 Library/Homebrew/compat/requirements/ruby_requirement.rb delete mode 100644 Library/Homebrew/requirements/emacs_requirement.rb delete mode 100644 Library/Homebrew/requirements/fortran_requirement.rb delete mode 100644 Library/Homebrew/requirements/mpi_requirement.rb delete mode 100644 Library/Homebrew/requirements/perl_requirement.rb delete mode 100644 Library/Homebrew/requirements/python_requirement.rb delete mode 100644 Library/Homebrew/requirements/ruby_requirement.rb (limited to 'Library') diff --git a/Library/Homebrew/caveats.rb b/Library/Homebrew/caveats.rb index ca1c2a9f8..8cd1053fb 100644 --- a/Library/Homebrew/caveats.rb +++ b/Library/Homebrew/caveats.rb @@ -1,4 +1,5 @@ require "forwardable" +require "language/python" class Caveats extend Forwardable diff --git a/Library/Homebrew/compat/dependency_collector.rb b/Library/Homebrew/compat/dependency_collector.rb index 2e97d9d7f..82511bcc7 100644 --- a/Library/Homebrew/compat/dependency_collector.rb +++ b/Library/Homebrew/compat/dependency_collector.rb @@ -22,31 +22,61 @@ class DependencyCollector case spec when :clt odeprecated "'depends_on :clt'" + when :tex + # odeprecated "'depends_on :tex'" + TeXRequirement.new(tags) when :autoconf, :automake, :bsdmake, :libtool output_deprecation(spec, tags) autotools_dep(spec, tags) when :cairo, :fontconfig, :freetype, :libpng, :pixman output_deprecation(spec, tags) Dependency.new(spec.to_s, tags) - when :apr - # output_deprecation(spec, tags, "apr-util") - Dependency.new("apr-util", tags) + when :ant, :expat + # output_deprecation(spec, tags) + Dependency.new(spec.to_s, tags) when :libltdl tags << :run output_deprecation("libtool", tags) Dependency.new("libtool", tags) + when :apr + # output_deprecation(spec, tags, "apr-util") + Dependency.new("apr-util", tags) + when :fortran + # output_deprecation(spec, tags, "gcc") + FortranRequirement.new(tags) + when :gpg + # output_deprecation(spec, tags, "gnupg") + GPG2Requirement.new(tags) + when :hg + # output_deprecation(spec, tags, "mercurial") + MercurialRequirement.new(tags) + when :mpi + # output_deprecation(spec, tags, "open-mpi") + MPIRequirement.new(*tags) + when :emacs + # output_deprecation(spec, tags) + EmacsRequirement.new(tags) when :mysql - # output_deprecation("mysql", tags) + # output_deprecation(spec, tags) MysqlRequirement.new(tags) + when :perl + # output_deprecation(spec, tags) + PerlRequirement.new(tags) when :postgresql - # output_deprecation("postgresql", tags) + # output_deprecation(spec, tags) PostgresqlRequirement.new(tags) - when :gpg - # output_deprecation("gnupg", tags) - GPG2Requirement.new(tags) + when :python, :python2 + # output_deprecation(spec, tags) + PythonRequirement.new(tags) + when :python3 + # output_deprecation(spec, tags) + Python3Requirement.new(tags) when :rbenv - # output_deprecation("rbenv", tags) + # output_deprecation(spec, tags) RbenvRequirement.new(tags) + when :ruby + # output_deprecation(spec, tags) + RubyRequirement.new(tags) else _parse_symbol_spec(spec, tags) end diff --git a/Library/Homebrew/compat/requirements.rb b/Library/Homebrew/compat/requirements.rb index da6d867b3..48911b52b 100644 --- a/Library/Homebrew/compat/requirements.rb +++ b/Library/Homebrew/compat/requirements.rb @@ -1,5 +1,11 @@ require "requirements" +require "compat/requirements/emacs_requirement" +require "compat/requirements/fortran_requirement" require "compat/requirements/language_module_requirement" +require "compat/requirements/mpi_requirement" +require "compat/requirements/perl_requirement" +require "compat/requirements/python_requirement" +require "compat/requirements/ruby_requirement" require "compat/requirements/tex_requirement" class MysqlRequirement < Requirement diff --git a/Library/Homebrew/compat/requirements/emacs_requirement.rb b/Library/Homebrew/compat/requirements/emacs_requirement.rb new file mode 100644 index 000000000..c8e2ec274 --- /dev/null +++ b/Library/Homebrew/compat/requirements/emacs_requirement.rb @@ -0,0 +1,35 @@ +class EmacsRequirement < Requirement + fatal true + default_formula "emacs" + + def initialize(tags) + @version = tags.shift if /\d+\.*\d*/ =~ tags.first + super + end + + satisfy build_env: false do + next false unless which "emacs" + next true unless @version + emacs_version = Utils.popen_read("emacs", "--batch", "--eval", "(princ emacs-version)") + Version.create(emacs_version) >= Version.create(@version) + end + + env do + ENV.prepend_path "PATH", which("emacs").dirname + ENV["EMACS"] = "emacs" + end + + def message + if @version + s = "Emacs #{@version} or later is required." + else + s = "Emacs is required." + end + s += super + s + end + + def inspect + "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" + end +end diff --git a/Library/Homebrew/compat/requirements/fortran_requirement.rb b/Library/Homebrew/compat/requirements/fortran_requirement.rb new file mode 100644 index 000000000..ba3fead6f --- /dev/null +++ b/Library/Homebrew/compat/requirements/fortran_requirement.rb @@ -0,0 +1,13 @@ +require "requirement" + +class FortranRequirement < Requirement + fatal true + + default_formula "gcc" + + env { ENV.fortran } + + satisfy build_env: false do + which(ENV["FC"] || "gfortran") + end +end diff --git a/Library/Homebrew/compat/requirements/mpi_requirement.rb b/Library/Homebrew/compat/requirements/mpi_requirement.rb new file mode 100644 index 000000000..065b56c8b --- /dev/null +++ b/Library/Homebrew/compat/requirements/mpi_requirement.rb @@ -0,0 +1,66 @@ +require "requirement" + +# There are multiple implementations of MPI-2 available. +# http://www.mpi-forum.org/ +# This requirement is used to find an appropriate one. +class MPIRequirement < Requirement + attr_reader :lang_list + + fatal true + + default_formula "open-mpi" + + env :userpaths + + # This method must accept varargs rather than an array for + # backwards compatibility with formulae that call it directly. + def initialize(*tags) + @non_functional = [] + @unknown_langs = [] + @lang_list = [:cc, :cxx, :f77, :f90] & tags + tags -= @lang_list + super(tags) + end + + def mpi_wrapper_works?(compiler) + compiler = which compiler + return false if compiler.nil? || !compiler.executable? + + # Some wrappers are non-functional and will return a non-zero exit code + # when invoked for version info. + # + # NOTE: A better test may be to do a small test compilation a la autotools. + quiet_system compiler, "--version" + end + + def inspect + "#<#{self.class.name}: #{name.inspect} #{tags.inspect} lang_list=#{@lang_list.inspect}>" + end + + satisfy do + @lang_list.each do |lang| + case lang + when :cc, :cxx, :f90, :f77 + compiler = "mpi" + lang.to_s + @non_functional << compiler unless mpi_wrapper_works? compiler + else + @unknown_langs << lang.to_s + end + end + @unknown_langs.empty? && @non_functional.empty? + end + + env do + # Set environment variables to help configure scripts find MPI compilers. + # Variable names taken from: + # https://www.gnu.org/software/autoconf-archive/ax_mpi.html + @lang_list.each do |lang| + compiler = "mpi" + lang.to_s + mpi_path = which compiler + + # Fortran 90 environment var has a different name + compiler = "MPIFC" if lang == :f90 + ENV[compiler.upcase] = mpi_path + end + end +end diff --git a/Library/Homebrew/compat/requirements/perl_requirement.rb b/Library/Homebrew/compat/requirements/perl_requirement.rb new file mode 100644 index 000000000..70eb2a36c --- /dev/null +++ b/Library/Homebrew/compat/requirements/perl_requirement.rb @@ -0,0 +1,36 @@ +class PerlRequirement < Requirement + fatal true + default_formula "perl" + + def initialize(tags) + @version = tags.shift if /^\d+\.\d+$/ =~ tags.first + raise "PerlRequirement requires a version!" unless @version + super + end + + satisfy(build_env: false) do + which_all("perl").detect do |perl| + perl_version = Utils.popen_read(perl, "--version")[/v(\d+\.\d+)(?:\.\d+)?/, 1] + next unless perl_version + Version.create(perl_version.to_s) >= Version.create(@version) + end + end + + def message + s = "Perl #{@version} is required to install this formula." + s += super + s + end + + def inspect + "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" + end + + def display_s + if @version + "#{name} >= #{@version}" + else + name + end + end +end diff --git a/Library/Homebrew/compat/requirements/python_requirement.rb b/Library/Homebrew/compat/requirements/python_requirement.rb new file mode 100644 index 000000000..3215d0a6c --- /dev/null +++ b/Library/Homebrew/compat/requirements/python_requirement.rb @@ -0,0 +1,68 @@ +require "language/python" + +class PythonRequirement < Requirement + fatal true + default_formula "python" + + satisfy build_env: false do + python = which_python + next unless python + next unless short_version + # Always use Python 2.7 for consistency on older versions of Mac OS X. + short_version == Version.create("2.7") + end + + env do + if !system_python? && short_version == Version.create("2.7") + ENV.prepend_path "PATH", which_python.dirname + end + + # Homebrew Python should take precedence over other Pythons in the PATH + ENV.prepend_path "PATH", Formula["python"].opt_bin + ENV.prepend_path "PATH", Formula["python"].opt_libexec/"bin" + + if system_python? + ENV["PYTHONPATH"] = "#{HOMEBREW_PREFIX}/lib/python#{short_version}/site-packages" + end + end + + private + + def short_version + @short_version ||= Language::Python.major_minor_version which_python + end + + def which_python + python = which python_binary + return unless python + Pathname.new Utils.popen_read(python, "-c", "import sys; print(sys.executable)").strip + end + + def system_python + "/usr/bin/#{python_binary}" + end + + def system_python? + system_python == which_python.to_s + end + + def python_binary + "python2.7" + end + + # Deprecated + alias to_s python_binary +end + +class Python3Requirement < PythonRequirement + fatal true + default_formula "python3" + + satisfy(build_env: false) { which_python } + + private + + def python_binary + "python3" + end +end diff --git a/Library/Homebrew/compat/requirements/ruby_requirement.rb b/Library/Homebrew/compat/requirements/ruby_requirement.rb new file mode 100644 index 000000000..a9ec8c42d --- /dev/null +++ b/Library/Homebrew/compat/requirements/ruby_requirement.rb @@ -0,0 +1,56 @@ +class RubyRequirement < Requirement + fatal true + default_formula "ruby" + + def initialize(tags) + @version = tags.shift if /(\d\.)+\d/ =~ tags.first + raise "RubyRequirement requires a version!" unless @version + super + end + + satisfy(build_env: false) { new_enough_ruby } + + env do + ENV.prepend_path "PATH", new_enough_ruby.dirname + end + + def message + s = "Ruby >= #{@version} is required to install this formula." + s += super + s + end + + def inspect + "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" + end + + def display_s + if @version + "#{name} >= #{@version}" + else + name + end + end + + private + + def new_enough_ruby + rubies.detect { |ruby| new_enough?(ruby) } + end + + def rubies + rubies = which_all("ruby") + ruby_formula = Formula["ruby"] + rubies.unshift ruby_formula.bin/"ruby" if ruby_formula&.installed? + rubies.uniq + end + + def new_enough?(ruby) + version = Utils.popen_read(ruby, "-e", "print RUBY_VERSION").strip + version =~ /^\d+\.\d+/ && Version.create(version) >= min_version + end + + def min_version + @min_version ||= Version.create(@version) + end +end diff --git a/Library/Homebrew/dependency_collector.rb b/Library/Homebrew/dependency_collector.rb index 2e955a5e2..3164d237e 100644 --- a/Library/Homebrew/dependency_collector.rb +++ b/Library/Homebrew/dependency_collector.rb @@ -53,10 +53,6 @@ class DependencyCollector parse_spec(spec, Array(tags)) end - def ant_dep_if_needed(tags) - Dependency.new("ant", tags) - end - def cvs_dep_if_needed(tags) Dependency.new("cvs", tags) end @@ -65,10 +61,6 @@ class DependencyCollector Dependency.new("xz", tags) end - def expat_dep_if_needed(tags) - Dependency.new("expat", tags) - end - def ld64_dep_if_needed(*) LD64Dependency.new end @@ -112,23 +104,11 @@ class DependencyCollector when :xcode then XcodeRequirement.new(tags) when :linux then LinuxRequirement.new(tags) when :macos then MacOSRequirement.new(tags) - when :fortran then FortranRequirement.new(tags) - when :mpi then MPIRequirement.new(*tags) - when :tex then TeXRequirement.new(tags) when :arch then ArchRequirement.new(tags) - when :hg then MercurialRequirement.new(tags) - when :python then PythonRequirement.new(tags) - when :python2 then PythonRequirement.new(tags) - when :python3 then Python3Requirement.new(tags) when :java then JavaRequirement.new(tags) - when :ruby then RubyRequirement.new(tags) when :osxfuse then OsxfuseRequirement.new(tags) - when :perl then PerlRequirement.new(tags) when :tuntap then TuntapRequirement.new(tags) - when :ant then ant_dep_if_needed(tags) - when :emacs then EmacsRequirement.new(tags) when :ld64 then ld64_dep_if_needed(tags) - when :expat then expat_dep_if_needed(tags) else raise ArgumentError, "Unsupported special dependency #{spec.inspect}" end diff --git a/Library/Homebrew/dev-cmd/audit.rb b/Library/Homebrew/dev-cmd/audit.rb index 6da591f1a..4982bfbc5 100644 --- a/Library/Homebrew/dev-cmd/audit.rb +++ b/Library/Homebrew/dev-cmd/audit.rb @@ -379,24 +379,7 @@ class FormulaAuditor case dep.name when "git" - problem "Don't use git as a dependency" - when "gfortran" - problem "Use `depends_on :fortran` instead of `depends_on 'gfortran'`" - when "ruby" - problem <<~EOS - Don't use "ruby" as a dependency. If this formula requires a - minimum Ruby version not provided by the system you should - use the RubyRequirement: - depends_on :ruby => "1.8" - where "1.8" is the minimum version of Ruby required. - EOS - when "open-mpi", "mpich" - problem <<~EOS - There are multiple conflicting ways to install MPI. Use an MPIRequirement: - depends_on :mpi => [] - Where is a comma delimited list that can include: - :cc, :cxx, :f77, :f90 - EOS + problem "Don't use git as a dependency (it's always available)" when *BUILD_TIME_DEPS next if dep.build? || dep.run? problem <<~EOS diff --git a/Library/Homebrew/extend/os/mac/dependency_collector.rb b/Library/Homebrew/extend/os/mac/dependency_collector.rb index 66dcf3afe..03534bab9 100644 --- a/Library/Homebrew/extend/os/mac/dependency_collector.rb +++ b/Library/Homebrew/extend/os/mac/dependency_collector.rb @@ -1,9 +1,4 @@ class DependencyCollector - def ant_dep_if_needed(tags) - return if MacOS.version < :mavericks - Dependency.new("ant", tags) - end - def cvs_dep_if_needed(tags) return if MacOS.version < :lion Dependency.new("cvs", tags) @@ -14,12 +9,6 @@ class DependencyCollector Dependency.new("xz", tags) end - def expat_dep_if_needed(tags) - # Tiger doesn't ship expat in /usr/lib - return if MacOS.version > :tiger - Dependency.new("expat", tags) - end - def ld64_dep_if_needed(*) # Tiger's ld is too old to properly link some software return if MacOS.version > :tiger diff --git a/Library/Homebrew/requirements.rb b/Library/Homebrew/requirements.rb index 456dabd0a..e8c33465b 100644 --- a/Library/Homebrew/requirements.rb +++ b/Library/Homebrew/requirements.rb @@ -1,18 +1,12 @@ require "requirement" -require "requirements/fortran_requirement" require "requirements/linux_requirement" require "requirements/macos_requirement" require "requirements/maximum_macos_requirement" -require "requirements/mpi_requirement" require "requirements/osxfuse_requirement" -require "requirements/perl_requirement" -require "requirements/python_requirement" require "requirements/java_requirement" -require "requirements/ruby_requirement" require "requirements/tuntap_requirement" require "requirements/unsigned_kext_requirement" require "requirements/x11_requirement" -require "requirements/emacs_requirement" require "requirements/arch_requirement" require "requirements/xcode_requirement" diff --git a/Library/Homebrew/requirements/emacs_requirement.rb b/Library/Homebrew/requirements/emacs_requirement.rb deleted file mode 100644 index c8e2ec274..000000000 --- a/Library/Homebrew/requirements/emacs_requirement.rb +++ /dev/null @@ -1,35 +0,0 @@ -class EmacsRequirement < Requirement - fatal true - default_formula "emacs" - - def initialize(tags) - @version = tags.shift if /\d+\.*\d*/ =~ tags.first - super - end - - satisfy build_env: false do - next false unless which "emacs" - next true unless @version - emacs_version = Utils.popen_read("emacs", "--batch", "--eval", "(princ emacs-version)") - Version.create(emacs_version) >= Version.create(@version) - end - - env do - ENV.prepend_path "PATH", which("emacs").dirname - ENV["EMACS"] = "emacs" - end - - def message - if @version - s = "Emacs #{@version} or later is required." - else - s = "Emacs is required." - end - s += super - s - end - - def inspect - "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" - end -end diff --git a/Library/Homebrew/requirements/fortran_requirement.rb b/Library/Homebrew/requirements/fortran_requirement.rb deleted file mode 100644 index ba3fead6f..000000000 --- a/Library/Homebrew/requirements/fortran_requirement.rb +++ /dev/null @@ -1,13 +0,0 @@ -require "requirement" - -class FortranRequirement < Requirement - fatal true - - default_formula "gcc" - - env { ENV.fortran } - - satisfy build_env: false do - which(ENV["FC"] || "gfortran") - end -end diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index c49fdcba9..213203ff3 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -10,7 +10,7 @@ class JavaRequirement < Requirement next true end - def initialize(tags) + def initialize(tags = []) @version = tags.shift if /(\d+\.)+\d/ =~ tags.first super end diff --git a/Library/Homebrew/requirements/mpi_requirement.rb b/Library/Homebrew/requirements/mpi_requirement.rb deleted file mode 100644 index 065b56c8b..000000000 --- a/Library/Homebrew/requirements/mpi_requirement.rb +++ /dev/null @@ -1,66 +0,0 @@ -require "requirement" - -# There are multiple implementations of MPI-2 available. -# http://www.mpi-forum.org/ -# This requirement is used to find an appropriate one. -class MPIRequirement < Requirement - attr_reader :lang_list - - fatal true - - default_formula "open-mpi" - - env :userpaths - - # This method must accept varargs rather than an array for - # backwards compatibility with formulae that call it directly. - def initialize(*tags) - @non_functional = [] - @unknown_langs = [] - @lang_list = [:cc, :cxx, :f77, :f90] & tags - tags -= @lang_list - super(tags) - end - - def mpi_wrapper_works?(compiler) - compiler = which compiler - return false if compiler.nil? || !compiler.executable? - - # Some wrappers are non-functional and will return a non-zero exit code - # when invoked for version info. - # - # NOTE: A better test may be to do a small test compilation a la autotools. - quiet_system compiler, "--version" - end - - def inspect - "#<#{self.class.name}: #{name.inspect} #{tags.inspect} lang_list=#{@lang_list.inspect}>" - end - - satisfy do - @lang_list.each do |lang| - case lang - when :cc, :cxx, :f90, :f77 - compiler = "mpi" + lang.to_s - @non_functional << compiler unless mpi_wrapper_works? compiler - else - @unknown_langs << lang.to_s - end - end - @unknown_langs.empty? && @non_functional.empty? - end - - env do - # Set environment variables to help configure scripts find MPI compilers. - # Variable names taken from: - # https://www.gnu.org/software/autoconf-archive/ax_mpi.html - @lang_list.each do |lang| - compiler = "mpi" + lang.to_s - mpi_path = which compiler - - # Fortran 90 environment var has a different name - compiler = "MPIFC" if lang == :f90 - ENV[compiler.upcase] = mpi_path - end - end -end diff --git a/Library/Homebrew/requirements/perl_requirement.rb b/Library/Homebrew/requirements/perl_requirement.rb deleted file mode 100644 index 70eb2a36c..000000000 --- a/Library/Homebrew/requirements/perl_requirement.rb +++ /dev/null @@ -1,36 +0,0 @@ -class PerlRequirement < Requirement - fatal true - default_formula "perl" - - def initialize(tags) - @version = tags.shift if /^\d+\.\d+$/ =~ tags.first - raise "PerlRequirement requires a version!" unless @version - super - end - - satisfy(build_env: false) do - which_all("perl").detect do |perl| - perl_version = Utils.popen_read(perl, "--version")[/v(\d+\.\d+)(?:\.\d+)?/, 1] - next unless perl_version - Version.create(perl_version.to_s) >= Version.create(@version) - end - end - - def message - s = "Perl #{@version} is required to install this formula." - s += super - s - end - - def inspect - "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" - end - - def display_s - if @version - "#{name} >= #{@version}" - else - name - end - end -end diff --git a/Library/Homebrew/requirements/python_requirement.rb b/Library/Homebrew/requirements/python_requirement.rb deleted file mode 100644 index 3215d0a6c..000000000 --- a/Library/Homebrew/requirements/python_requirement.rb +++ /dev/null @@ -1,68 +0,0 @@ -require "language/python" - -class PythonRequirement < Requirement - fatal true - default_formula "python" - - satisfy build_env: false do - python = which_python - next unless python - next unless short_version - # Always use Python 2.7 for consistency on older versions of Mac OS X. - short_version == Version.create("2.7") - end - - env do - if !system_python? && short_version == Version.create("2.7") - ENV.prepend_path "PATH", which_python.dirname - end - - # Homebrew Python should take precedence over other Pythons in the PATH - ENV.prepend_path "PATH", Formula["python"].opt_bin - ENV.prepend_path "PATH", Formula["python"].opt_libexec/"bin" - - if system_python? - ENV["PYTHONPATH"] = "#{HOMEBREW_PREFIX}/lib/python#{short_version}/site-packages" - end - end - - private - - def short_version - @short_version ||= Language::Python.major_minor_version which_python - end - - def which_python - python = which python_binary - return unless python - Pathname.new Utils.popen_read(python, "-c", "import sys; print(sys.executable)").strip - end - - def system_python - "/usr/bin/#{python_binary}" - end - - def system_python? - system_python == which_python.to_s - end - - def python_binary - "python2.7" - end - - # Deprecated - alias to_s python_binary -end - -class Python3Requirement < PythonRequirement - fatal true - default_formula "python3" - - satisfy(build_env: false) { which_python } - - private - - def python_binary - "python3" - end -end diff --git a/Library/Homebrew/requirements/ruby_requirement.rb b/Library/Homebrew/requirements/ruby_requirement.rb deleted file mode 100644 index a9ec8c42d..000000000 --- a/Library/Homebrew/requirements/ruby_requirement.rb +++ /dev/null @@ -1,56 +0,0 @@ -class RubyRequirement < Requirement - fatal true - default_formula "ruby" - - def initialize(tags) - @version = tags.shift if /(\d\.)+\d/ =~ tags.first - raise "RubyRequirement requires a version!" unless @version - super - end - - satisfy(build_env: false) { new_enough_ruby } - - env do - ENV.prepend_path "PATH", new_enough_ruby.dirname - end - - def message - s = "Ruby >= #{@version} is required to install this formula." - s += super - s - end - - def inspect - "#<#{self.class.name}: #{name.inspect} #{tags.inspect} version=#{@version.inspect}>" - end - - def display_s - if @version - "#{name} >= #{@version}" - else - name - end - end - - private - - def new_enough_ruby - rubies.detect { |ruby| new_enough?(ruby) } - end - - def rubies - rubies = which_all("ruby") - ruby_formula = Formula["ruby"] - rubies.unshift ruby_formula.bin/"ruby" if ruby_formula&.installed? - rubies.uniq - end - - def new_enough?(ruby) - version = Utils.popen_read(ruby, "-e", "print RUBY_VERSION").strip - version =~ /^\d+\.\d+/ && Version.create(version) >= min_version - end - - def min_version - @min_version ||= Version.create(@version) - end -end diff --git a/Library/Homebrew/requirements/xcode_requirement.rb b/Library/Homebrew/requirements/xcode_requirement.rb index ff167c6fd..a5f078c62 100644 --- a/Library/Homebrew/requirements/xcode_requirement.rb +++ b/Library/Homebrew/requirements/xcode_requirement.rb @@ -5,7 +5,7 @@ class XcodeRequirement < Requirement satisfy(build_env: false) { xcode_installed_version } - def initialize(tags) + def initialize(tags = []) @version = tags.find { |tag| tags.delete(tag) if tag =~ /(\d\.)+\d/ } super end diff --git a/Library/Homebrew/test/dependency_collector_spec.rb b/Library/Homebrew/test/dependency_collector_spec.rb index 5ba3c20bd..cfbd260b3 100644 --- a/Library/Homebrew/test/dependency_collector_spec.rb +++ b/Library/Homebrew/test/dependency_collector_spec.rb @@ -66,7 +66,7 @@ describe DependencyCollector do expect(dep).to be_optional end - specify "ant dependency" do + specify "ant dependency", :needs_compat do subject.add ant: :build expect(find_dependency("ant")).to eq(Dependency.new("ant", [:build])) end diff --git a/Library/Homebrew/test/formula_installer_spec.rb b/Library/Homebrew/test/formula_installer_spec.rb index b85e75b81..d3710a4cb 100644 --- a/Library/Homebrew/test/formula_installer_spec.rb +++ b/Library/Homebrew/test/formula_installer_spec.rb @@ -133,7 +133,7 @@ describe FormulaInstaller do }.to raise_error(CannotInstallFormulaError) end - describe "#install_requirement_formula?" do + describe "#install_requirement_formula?", :needs_compat do before do @requirement = Python3Requirement.new @requirement_dependency = @requirement.to_dependency diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index 6ba6af307..a9d09cb00 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -711,21 +711,21 @@ describe Formula do f1 = formula "f1" do url "f1-1" - depends_on :python + depends_on :java depends_on x11: :recommended depends_on xcode: ["1.0", :optional] end stub_formula_loader(f1) - python = PythonRequirement.new + java = JavaRequirement.new x11 = X11Requirement.new("x11", [:recommended]) xcode = XcodeRequirement.new(["1.0", :optional]) - expect(Set.new(f1.recursive_requirements)).to eq(Set[python, x11]) + expect(Set.new(f1.recursive_requirements)).to eq(Set[java, x11]) f1.build = BuildOptions.new(["--with-xcode", "--without-x11"], f1.options) - expect(Set.new(f1.recursive_requirements)).to eq(Set[python, xcode]) + expect(Set.new(f1.recursive_requirements)).to eq(Set[java, xcode]) f1.build = f1.stable.build f2 = formula "f2" do @@ -734,11 +734,11 @@ describe Formula do depends_on "f1" end - expect(Set.new(f2.recursive_requirements)).to eq(Set[python, x11]) - expect(Set.new(f2.recursive_requirements {})).to eq(Set[python, x11, xcode]) + expect(Set.new(f2.recursive_requirements)).to eq(Set[java, x11]) + expect(Set.new(f2.recursive_requirements {})).to eq(Set[java, x11, xcode]) requirements = f2.recursive_requirements do |_dependent, requirement| - Requirement.prune if requirement.is_a?(PythonRequirement) + Requirement.prune if requirement.is_a?(JavaRequirement) end expect(Set.new(requirements)).to eq(Set[x11, xcode]) diff --git a/Library/Homebrew/test/mpi_requirement_spec.rb b/Library/Homebrew/test/mpi_requirement_spec.rb index f32b27993..87f99eb3a 100644 --- a/Library/Homebrew/test/mpi_requirement_spec.rb +++ b/Library/Homebrew/test/mpi_requirement_spec.rb @@ -1,6 +1,6 @@ -require "requirements/mpi_requirement" +require "compat/requirements/mpi_requirement" -describe MPIRequirement do +describe MPIRequirement, :needs_compat do describe "::new" do subject { described_class.new(*(wrappers + tags)) } let(:wrappers) { [:cc, :cxx, :f77] } diff --git a/Library/Homebrew/test/os/mac/dependency_collector_spec.rb b/Library/Homebrew/test/os/mac/dependency_collector_spec.rb index 688149021..357c35c2d 100644 --- a/Library/Homebrew/test/os/mac/dependency_collector_spec.rb +++ b/Library/Homebrew/test/os/mac/dependency_collector_spec.rb @@ -22,18 +22,6 @@ describe DependencyCollector do expect(subject.build(:ld64)).to be nil end - specify "ant Mavericks or newer dependency" do - allow(MacOS).to receive(:version).and_return(MacOS::Version.new("10.9")) - subject.add ant: :build - expect(subject.deps.find { |dep| dep.name == "ant" }).to eq(Dependency.new("ant", [:build])) - end - - specify "ant pre-Mavericks dependency" do - allow(MacOS).to receive(:version).and_return(MacOS::Version.new("10.7")) - subject.add ant: :build - expect(subject.deps.find { |dep| dep.name == "ant" }).to be nil - end - specify "Resource xz pre-Mavericks dependency" do allow(MacOS).to receive(:version).and_return(MacOS::Version.new("10.8")) resource = Resource.new diff --git a/Library/Homebrew/test/rubocops/lines_cop_spec.rb b/Library/Homebrew/test/rubocops/lines_cop_spec.rb index 0d2146339..ee1de059c 100644 --- a/Library/Homebrew/test/rubocops/lines_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_cop_spec.rb @@ -717,19 +717,6 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do RUBY end - it "deprecated ENV.fortran usage" do - expect_offense(<<~RUBY) - class Foo < Formula - desc "foo" - url 'http://example.com/foo-1.0.tgz' - test do - ENV.fortran - ^^^^^^^^^^^ Use `depends_on :fortran` instead of `ENV.fortran` - end - end - RUBY - end - it "deprecated ARGV.include? (--HEAD) usage" do expect_offense(<<~RUBY) class Foo < Formula -- cgit v1.2.3 From 4fff56ca4f04c710db4000c65ec4e1502b50b62b Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 30 Dec 2017 18:58:41 +0000 Subject: lines_cop: check for more deprecated requirements. --- Library/Homebrew/rubocops/lines_cop.rb | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'Library') diff --git a/Library/Homebrew/rubocops/lines_cop.rb b/Library/Homebrew/rubocops/lines_cop.rb index c96efd0b1..fdeb165ed 100644 --- a/Library/Homebrew/rubocops/lines_cop.rb +++ b/Library/Homebrew/rubocops/lines_cop.rb @@ -6,12 +6,14 @@ module RuboCop # This cop checks for various miscellaneous Homebrew coding styles class Lines < FormulaCop def audit_formula(_node, _class_node, _parent_class_node, _body_node) - [:automake, :autoconf, :libtool, :mysql, :postgresql, :rbenv].each do |dependency| + [:automake, :ant, :autoconf, :emacs, :expat, :libtool, :mysql, :perl, + :postgresql, :python, :python3, :rbenv, :ruby].each do |dependency| next unless depends_on?(dependency) problem ":#{dependency} is deprecated. Usage should be \"#{dependency}\"." end - { apr: "apr-util", gpg: "gnupg" }.each do |requirement, dependency| + { apr: "apr-util", fortran: "gcc", gpg: "gnupg", hg: "mercurial", + mpi: "open-mpi", python2: "python" }.each do |requirement, dependency| next unless depends_on?(requirement) problem ":#{requirement} is deprecated. Usage should be \"#{dependency}\"." end @@ -239,11 +241,6 @@ module RuboCop problem "Use 'build.head?' instead of inspecting 'version'" end - find_instance_method_call(body_node, "ENV", :fortran) do - next if depends_on?(:fortran) - problem "Use `depends_on :fortran` instead of `ENV.fortran`" - end - find_instance_method_call(body_node, "ARGV", :include?) do |method| param = parameters(method).first next unless match = regex_match_group(param, /^--(HEAD|devel)/) -- cgit v1.2.3 From f9b6407110d7fb98a65b470d166fc5b7be6052ee Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 30 Dec 2017 19:15:52 +0000 Subject: lines_cop: deprecate 'needs :openmp'. --- Library/Homebrew/rubocops/lines_cop.rb | 4 ++++ Library/Homebrew/test/rubocops/lines_cop_spec.rb | 11 +++++++++++ 2 files changed, 15 insertions(+) (limited to 'Library') diff --git a/Library/Homebrew/rubocops/lines_cop.rb b/Library/Homebrew/rubocops/lines_cop.rb index fdeb165ed..4e7aa1adb 100644 --- a/Library/Homebrew/rubocops/lines_cop.rb +++ b/Library/Homebrew/rubocops/lines_cop.rb @@ -276,6 +276,10 @@ module RuboCop problem "'fails_with :llvm' is now a no-op so should be removed" end + find_method_with_args(body_node, :needs, :openmp) do + problem "'needs :openmp' should be replaced with 'depends_on \"gcc\"'" + end + find_method_with_args(body_node, :system, /^(otool|install_name_tool|lipo)/) do next if @formula_name == "cctools" problem "Use ruby-macho instead of calling #{@offensive_node.source}" diff --git a/Library/Homebrew/test/rubocops/lines_cop_spec.rb b/Library/Homebrew/test/rubocops/lines_cop_spec.rb index ee1de059c..19492c252 100644 --- a/Library/Homebrew/test/rubocops/lines_cop_spec.rb +++ b/Library/Homebrew/test/rubocops/lines_cop_spec.rb @@ -731,6 +731,17 @@ describe RuboCop::Cop::FormulaAudit::Miscellaneous do RUBY end + it "deprecated needs :openmp usage" do + expect_offense(<<~RUBY) + class Foo < Formula + desc "foo" + url 'http://example.com/foo-1.0.tgz' + needs :openmp + ^^^^^^^^^^^^^ 'needs :openmp' should be replaced with 'depends_on \"gcc\"' + end + RUBY + end + it "deprecated MACOS_VERSION const usage" do expect_offense(<<~RUBY) class Foo < Formula -- cgit v1.2.3