Skip to content

Commit

Permalink
gfortran: 4.7, builds from source.
Browse files Browse the repository at this point in the history
A modification of the gcc formula that builds gcc and rips of
everything except gfortran.

- For maintainers added the `--check` option to run
  make check-fortran right after build.
- We have `brew test gfortran` now.

Closes Homebrew#15941.

Signed-off-by: Mike McQuaid <[email protected]>
  • Loading branch information
samueljohn authored and MikeMcQuaid committed Nov 18, 2012
1 parent 9df67eb commit 536ef17
Showing 1 changed file with 95 additions and 99 deletions.
194 changes: 95 additions & 99 deletions Library/Formula/gfortran.rb
Original file line number Diff line number Diff line change
@@ -1,117 +1,113 @@
require 'formula'

class GfortranPkgDownloadStrategy < CurlDownloadStrategy
def stage
# The 4.2.4 compiler is distributed as a OS X 10.5
# package- a single flat xar archive instead of a
# bundle.
safe_system '/usr/bin/xar', '-xf', @tarball_path
chdir

# Clean up.
safe_system "mv *.pkg/Payload Payload.gz"
safe_system "ls | grep -v Payload | xargs rm -r"
end
end
# todo: Use graphite loop optimizations? (would depends_on 'cloog')

class Gfortran < Formula
if MacOS.version == :leopard
url 'http://r.research.att.com/gfortran-42-5577.pkg'
md5 '30fb495c93cf514003cdfcb7846dc701'
version "4.2.4-5577"
elsif MacOS.version == :snow_leopard
case MacOS.gcc_42_build_version
when 5659
url 'http://r.research.att.com/gfortran-42-5659.pkg'
md5 '71bd546baa45c9c0fb4943cdd72ee274'
version "4.2.4-5659"
else
# This version works for XCode 3.2.3-4.0 on Snow Leopard.
url 'http://r.research.att.com/gfortran-42-5664.pkg'
md5 'eb64ba9f8507da22e582814a69fbb7ca'
version "4.2.4-5664"
end
else
# Lion
if MacOS::Xcode.version >= '4.2'
# This version contains an entire Apple-GCC 4.2 (i386/x86_64) build for
# Lion. After installation, we will remove all compilers other than
# GFortran.
url 'http://r.research.att.com/tools/gcc-42-5666.3-darwin11.pkg'
md5 '3ccf46da27aaba17706b420711fb997e'
version '4.2.4-5666.3'
else
url 'http://r.research.att.com/gfortran-lion-5666-3.pkg'
md5 '7eb140822c89bec17db5666859868b3b'
version "4.2.4-5666.3"
end
end
homepage 'http://gcc.gnu.org/wiki/GFortran'
url 'http://ftpmirror.gnu.org/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2'
mirror 'http://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2'
sha1 'a464ba0f26eef24c29bcd1e7489421117fb9ee35'

# For more information about GFortran, see:
#
# http://gcc.gnu.org/wiki/GFortran
#
# The homepage points to r.research.att.com because this site contains
# specific information about the binary distribution that we use.
homepage 'http://r.research.att.com/tools/'
depends_on 'gmp'
depends_on 'libmpc'
depends_on 'mpfr'

def download_strategy
GfortranPkgDownloadStrategy
option 'enable-profiled-build', 'Make use of profile guided optimization when bootstrapping GCC'
option 'check', 'Run the make check fortran. This is for maintainers.'

begin
depends_on 'dejagnu'
depends_on 'expect'
end if build.include? 'check' # http://gcc.gnu.org/install/test.html

fails_with :clang do
build 421
cause <<-EOS.undent
"fatal error: error in backend: ran out of registers during register allocation"
If you have any knowledge to share or can provide a fix, please open an issue.
Thanks!
EOS
end

def install
if MacOS::Xcode.version >= '4.2' and MacOS.version >= :lion
ohai "Installing gfortran 4.2.4 for XCode 4.2 (build 5666) or higher"
safe_system "pax --insecure -rz -f Payload.gz -s ',./usr,#{prefix},'"

# This package installs a whole GCC suite. Remove non-fortran
# components.
bin.children.reject{|p| p.basename.to_s.match /gfortran/}.each{|p| rm p}
man1.children.reject{|p| p.basename.to_s.match /gfortran/}.each{|p| rm p}
(include + 'gcc').rmtree

# This package does not contain the gfortran->gfortran-4.2 symlink
safe_system "ln -sf #{bin}/gfortran-4.2 #{bin}/gfortran"
else
# Break installation down by GCC build as there are some slight
# variations in packaging.
case gcc_42_build
when 5577
ohai "Installing gfortran 4.2.4 for XCode 3.1.4 (build 5577)"
safe_system "pax -rz -f Payload.gz -s ',./usr,#{prefix},'"
# The 5577 package does not contain the gfortran->gfortran-4.2 symlink
safe_system "ln -sf #{bin}/gfortran-4.2 #{bin}/gfortran"
when 5659
ohai "Installing gfortran 4.2.4 for XCode 3.2.2 (build 5659)"
# The version of pax jumped 16 years in development between OS X 10.5
# and OS X 10.6. In that time it became security conscious.
safe_system "pax --insecure -rz -f Payload.gz -s ',./usr,#{prefix},'"
when 5664
ohai "Installing gfortran 4.2.4 for XCode 3.2.3 (build 5664)"
safe_system "pax --insecure -rz -f Payload.gz -s ',./usr,#{prefix},'"
when 5666
ohai "Installing gfortran 4.2.4 for XCode 3.2.6--4.1 (build 5666)"
safe_system "pax --insecure -rz -f Payload.gz -s ',./usr,#{prefix},'"
else
onoe <<-EOS.undent
Currently the gfortran compiler provided by this brew is only supports
the following versions of XCode:
# Sandbox the GCC lib, libexec and include directories so they don't wander
# around telling small children there is no Santa Claus. This results in a
# partially keg-only brew following suggestions outlined in the "How to
# install multiple versions of GCC" section of the GCC FAQ:
# http://gcc.gnu.org/faq.html#multiple
gfortran_prefix = prefix/'gfortran'

- XCode 3.1.4 on OS X 10.5.x
- XCode 3.2.2/3.2.3 -- 4.0 on OS X 10.6.x
- XCode 4.1 or newer on OS X 10.7.x
args = [
# Sandbox everything...
"--prefix=#{gfortran_prefix}",
# ...except the stuff in share...
"--datarootdir=#{share}",
# ...and the binaries...
"--bindir=#{bin}",
"--with-system-zlib",
# ...opt_prefix survives upgrades and works even if `brew unlink gmp`
"--with-gmp=#{Formula.factory('gmp').opt_prefix}",
"--with-mpfr=#{Formula.factory('mpfr').opt_prefix}",
"--with-mpc=#{Formula.factory('libmpc').opt_prefix}",
# ...we build the stage 1 gcc with clang (which is know to fail checks)
"--enable-checking=release",
"--disable-stage1-checking",
# ...speed up build by ignoring cxx
"--disable-build-poststage1-with-cxx",
"--disable-libstdcxx-pc",
# ...disable translations avoid conflict with brew install gcc --enable-nls
'--disable-nls'
]

The AppStore and Software Update can help upgrade your copy of XCode.
The latest version of XCode is also available from:
mkdir 'build' do
unless MacOS::CLT.installed?
# For Xcode-only systems, we need to tell the sysroot path.
# 'native-system-header's will be appended
args << "--with-native-system-header-dir=/usr/include"
args << "--with-sysroot=#{MacOS.sdk_path}"
end

system '../configure', "--enable-languages=fortran", *args

http://developer.apple.com/technologies/xcode.html
EOS
exit
if build.include? 'enable-profiled-build'
# Takes longer to build, may bug out. Provided for those who want to
# optimise all the way to 11.
system 'make profiledbootstrap'
else
system 'make bootstrap'
end

system "make"
system "make check-fortran" if build.include? 'check'
system 'make install'
end

# Alias the manpage so it will be available via `man gfortran`
safe_system "ln -sf #{man1}/gfortran-4.2.1 #{man1}/gfortran.1"
# This package installs a whole GCC suite. Removing non-fortran components:
bin.children.reject{ |p| p.basename.to_s.match(/gfortran/) }.each{ |p| rm p }
man1.children.reject{ |p| p.basename.to_s.match(/gfortran/) }.each{ |p| rm p }
man7.rmtree # dupes: fsf fundraising and gpl will be added by gcc formula
# (share/'locale').rmtree
end

def test
mktemp do
fixture = <<-EOS.undent
integer,parameter::m=10000
real::a(m), b(m)
real::fact=0.5
do concurrent (i=1:m)
a(i) = a(i) + fact*b(i)
end do
print *, "done"
end
EOS
Pathname('in.f90').write(fixture)
system "#{bin}/gfortran -c in.f90"
system "#{bin}/gfortran -o test in.o"
`./test`.strip =='done'
end
end

def caveats; <<-EOS.undent
Expand Down

0 comments on commit 536ef17

Please sign in to comment.