diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb index 7c2ff7d1b0..16d2768f25 100644 --- a/Library/Homebrew/dependencies.rb +++ b/Library/Homebrew/dependencies.rb @@ -143,212 +143,4 @@ class Requirement end end - -# A dependency on a language-specific module. -class LanguageModuleDependency < Requirement - def initialize language, module_name, import_name=nil - @language = language - @module_name = module_name - @import_name = import_name || module_name - end - - def fatal?; true; end - - def satisfied? - quiet_system(*the_test) - end - - def message; <<-EOS.undent - Unsatisfied dependency: #{@module_name} - Homebrew does not provide #{@language.to_s.capitalize} dependencies; install with: - #{command_line} #{@module_name} - EOS - end - - def the_test - case @language - when :chicken then %W{/usr/bin/env csi -e (use #{@import_name})} - when :jruby then %W{/usr/bin/env jruby -rubygems -e require\ '#{@import_name}'} - when :lua then %W{/usr/bin/env luarocks show #{@import_name}} - when :node then %W{/usr/bin/env node -e require('#{@import_name}');} - when :perl then %W{/usr/bin/env perl -e use\ #{@import_name}} - when :python then %W{/usr/bin/env python -c import\ #{@import_name}} - when :ruby then %W{/usr/bin/env ruby -rubygems -e require\ '#{@import_name}'} - when :rbx then %W{/usr/bin/env rbx -rubygems -e require\ '#{@import_name}'} - end - end - - def command_line - case @language - when :chicken then "chicken-install" - when :jruby then "jruby -S gem install" - when :lua then "luarocks install" - when :node then "npm install" - when :perl then "cpan -i" - when :python then "pip install" - when :rbx then "rbx gem install" - when :ruby then "gem install" - end - end -end - - -# This requirement is used to require an X11 implementation, -# optionally with a minimum version number. -class X11Dependency < Requirement - include Comparable - attr_reader :min_version - - def initialize min_version=nil - @min_version = min_version - end - - def fatal?; true; end - - def satisfied? - MacOS::XQuartz.installed? and (@min_version.nil? or @min_version <= MacOS::XQuartz.version) - end - - def message; <<-EOS.undent - Unsatisfied dependency: XQuartz #{@min_version} - Homebrew does not package XQuartz. Installers may be found at: - https://xquartz.macosforge.org - EOS - end - - def modify_build_environment - ENV.x11 - end - - def <=> other - unless other.is_a? X11Dependency - raise TypeError, "expected X11Dependency" - end - - if other.min_version.nil? - 1 - elsif @min_version.nil? - -1 - else - @min_version <=> other.min_version - end - end - -end - - -# There are multiple implementations of MPI-2 available. -# http://www.mpi-forum.org/ -# This requirement is used to find an appropriate one. -class MPIDependency < Requirement - - attr_reader :lang_list - - def initialize *lang_list - @lang_list = lang_list - @non_functional = [] - @unknown_langs = [] - end - - def fatal?; true; end - - def mpi_wrapper_works? compiler - compiler = which compiler - return false if compiler.nil? or not 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 satisfied? - @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? and @non_functional.empty? - end - - def modify_build_environment - # Set environment variables to help configure scripts find MPI compilers. - # Variable names taken from: - # http://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 - - def message - if not @unknown_langs.empty? - <<-EOS.undent - There is no MPI compiler wrapper for: - #{@unknown_langs.join ', '} - - The following values are valid arguments to `MPIDependency.new`: - :cc, :cxx, :f90, :f77 - EOS - else - <<-EOS.undent - Homebrew could not locate working copies of the following MPI compiler - wrappers: - #{@non_functional.join ', '} - - If you have a MPI installation, please ensure the bin folder is on your - PATH and that all the wrappers are functional. Otherwise, a MPI - installation can be obtained from homebrew by *picking one* of the - following formulae: - open-mpi, mpich2 - EOS - end - end - -end - -# This requirement added by the `conflicts_with` DSL method. -class ConflictRequirement < Requirement - attr_reader :formula - - def initialize formula, message - @formula = formula - @message = message - end - - def message; @message; end - - def satisfied? - keg = Formula.factory(@formula).prefix - not keg.exist? && Keg.new(keg).linked? - end - - # The user can chose to force installation even in the face of conflicts. - def fatal? - not ARGV.force? - end -end - -class XCodeDependency < Requirement - def fatal?; true; end - - def satisfied? - MacOS::Xcode.installed? - end - - def message; <<-EOS.undent - A full installation of XCode.app is required to compile this software. - Installing just the Command Line Tools is not sufficent. - EOS - end -end +require 'requirements' diff --git a/Library/Homebrew/requirements.rb b/Library/Homebrew/requirements.rb new file mode 100644 index 0000000000..b7cc68a7c8 --- /dev/null +++ b/Library/Homebrew/requirements.rb @@ -0,0 +1,208 @@ +# A dependency on a language-specific module. +class LanguageModuleDependency < Requirement + def initialize language, module_name, import_name=nil + @language = language + @module_name = module_name + @import_name = import_name || module_name + end + + def fatal?; true; end + + def satisfied? + quiet_system(*the_test) + end + + def message; <<-EOS.undent + Unsatisfied dependency: #{@module_name} + Homebrew does not provide #{@language.to_s.capitalize} dependencies; install with: + #{command_line} #{@module_name} + EOS + end + + def the_test + case @language + when :chicken then %W{/usr/bin/env csi -e (use #{@import_name})} + when :jruby then %W{/usr/bin/env jruby -rubygems -e require\ '#{@import_name}'} + when :lua then %W{/usr/bin/env luarocks show #{@import_name}} + when :node then %W{/usr/bin/env node -e require('#{@import_name}');} + when :perl then %W{/usr/bin/env perl -e use\ #{@import_name}} + when :python then %W{/usr/bin/env python -c import\ #{@import_name}} + when :ruby then %W{/usr/bin/env ruby -rubygems -e require\ '#{@import_name}'} + when :rbx then %W{/usr/bin/env rbx -rubygems -e require\ '#{@import_name}'} + end + end + + def command_line + case @language + when :chicken then "chicken-install" + when :jruby then "jruby -S gem install" + when :lua then "luarocks install" + when :node then "npm install" + when :perl then "cpan -i" + when :python then "pip install" + when :rbx then "rbx gem install" + when :ruby then "gem install" + end + end +end + + +# This requirement is used to require an X11 implementation, +# optionally with a minimum version number. +class X11Dependency < Requirement + include Comparable + attr_reader :min_version + + def initialize min_version=nil + @min_version = min_version + end + + def fatal?; true; end + + def satisfied? + MacOS::XQuartz.installed? and (@min_version.nil? or @min_version <= MacOS::XQuartz.version) + end + + def message; <<-EOS.undent + Unsatisfied dependency: XQuartz #{@min_version} + Homebrew does not package XQuartz. Installers may be found at: + https://xquartz.macosforge.org + EOS + end + + def modify_build_environment + ENV.x11 + end + + def <=> other + unless other.is_a? X11Dependency + raise TypeError, "expected X11Dependency" + end + + if other.min_version.nil? + 1 + elsif @min_version.nil? + -1 + else + @min_version <=> other.min_version + end + end + +end + + +# There are multiple implementations of MPI-2 available. +# http://www.mpi-forum.org/ +# This requirement is used to find an appropriate one. +class MPIDependency < Requirement + + attr_reader :lang_list + + def initialize *lang_list + @lang_list = lang_list + @non_functional = [] + @unknown_langs = [] + end + + def fatal?; true; end + + def mpi_wrapper_works? compiler + compiler = which compiler + return false if compiler.nil? or not 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 satisfied? + @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? and @non_functional.empty? + end + + def modify_build_environment + # Set environment variables to help configure scripts find MPI compilers. + # Variable names taken from: + # http://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 + + def message + if not @unknown_langs.empty? + <<-EOS.undent + There is no MPI compiler wrapper for: + #{@unknown_langs.join ', '} + + The following values are valid arguments to `MPIDependency.new`: + :cc, :cxx, :f90, :f77 + EOS + else + <<-EOS.undent + Homebrew could not locate working copies of the following MPI compiler + wrappers: + #{@non_functional.join ', '} + + If you have a MPI installation, please ensure the bin folder is on your + PATH and that all the wrappers are functional. Otherwise, a MPI + installation can be obtained from homebrew by *picking one* of the + following formulae: + open-mpi, mpich2 + EOS + end + end + +end + +# This requirement added by the `conflicts_with` DSL method. +class ConflictRequirement < Requirement + attr_reader :formula + + def initialize formula, message + @formula = formula + @message = message + end + + def message; @message; end + + def satisfied? + keg = Formula.factory(@formula).prefix + not keg.exist? && Keg.new(keg).linked? + end + + # The user can chose to force installation even in the face of conflicts. + def fatal? + not ARGV.force? + end +end + +class XCodeDependency < Requirement + def fatal?; true; end + + def satisfied? + MacOS::Xcode.installed? + end + + def message; <<-EOS.undent + A full installation of XCode.app is required to compile this software. + Installing just the Command Line Tools is not sufficent. + EOS + end +end