aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorCharlie Sharpsteen2012-07-06 11:47:45 -0800
committerCharlie Sharpsteen2012-07-28 09:12:44 -0700
commit0d3578b28d2d4d269d5ab6dcec521d60513f61c1 (patch)
treef3e790948593baeab8abba77c4f0246b9ee16585 /Library
parent96ee0e90ccaccb9a91dfbe53919998a0adc68cbd (diff)
downloadbrew-0d3578b28d2d4d269d5ab6dcec521d60513f61c1.tar.bz2
dependencies.rb: Add MPI compiler Requirement
All versions of OS X prior to Lion shipped with some version of Open-MPI, but without working compiler wrappers for Fortran. Homebrew currently has two formulae that can supply this software: open-mpi and mpich2. This commit adds a `MPIDependency` Requirement that can be passed one of four values when constructed: :cc, :cxx, :f90, :f77 This will ensure the `mpi<value>` compiler is available and working. For example, if `depends_on MPIDependency.new(:cc, :f90)` is used, the Requirement will search for working `mpicc` and `mpif90` wrappers. If the required wrappers cannot be found, an error message will be displayed that prompts the user to install one of the Homebrew formulae that provides MPI. For each language passed to a MPIDependency Requirement, environment variables be will set that point to the compilers. Signed-off-by: Charlie Sharpsteen <source@sharpsteen.net>
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/dependencies.rb83
1 files changed, 83 insertions, 0 deletions
diff --git a/Library/Homebrew/dependencies.rb b/Library/Homebrew/dependencies.rb
index 43596ad6c..de9ed9207 100644
--- a/Library/Homebrew/dependencies.rb
+++ b/Library/Homebrew/dependencies.rb
@@ -204,3 +204,86 @@ class X11Dependency < Requirement
end
end
+
+
+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