Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
3 changed files
with
172 additions
and
2 deletions.
There are no files selected for viewing
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
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
class Gcc < Formula | ||
desc "GNU compiler collection" | ||
homepage "https://gcc.gnu.org/" | ||
url "https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.xz" | ||
mirror "https://ftpmirror.gnu.org/gcc/gcc-9.3.0/gcc-9.3.0.tar.xz" | ||
sha256 "71e197867611f6054aa1119b13a0c0abac12834765fe2d81f35ac57f84f742d1" | ||
revision 1 | ||
head "https://gcc.gnu.org/git/gcc.git" | ||
|
||
bottle do | ||
sha256 "57e53d66ad43fe05b5a2f93d6a7cfd472713ac03e9d9c9d0d0187cdc7a273153" => :catalina | ||
sha256 "de8319322428721741a0dc41dfdf2eece80e0215a7a4a861e0e206a9bfbca583" => :mojave | ||
sha256 "e50b9cfee063619515a8f164485b3f730077f21b49b7bb30cc5a600ddf577a83" => :high_sierra | ||
end | ||
|
||
# The bottles are built on systems with the CLT installed, and do not work | ||
# out of the box on Xcode-only systems due to an incorrect sysroot. | ||
pour_bottle? do | ||
reason "The bottle needs the Xcode CLT to be installed." | ||
satisfy { MacOS::CLT.installed? } | ||
end | ||
|
||
depends_on "gmp" | ||
depends_on "isl" | ||
depends_on "libmpc" | ||
depends_on "mpfr" | ||
|
||
uses_from_macos "zlib" | ||
|
||
# GCC bootstraps itself, so it is OK to have an incompatible C++ stdlib | ||
cxxstdlib_check :skip | ||
|
||
def version_suffix | ||
if build.head? | ||
"HEAD" | ||
else | ||
version.to_s.slice(/\d/) | ||
end | ||
end | ||
|
||
def install | ||
# GCC will suffer build errors if forced to use a particular linker. | ||
ENV.delete "LD" | ||
|
||
# We avoiding building: | ||
# - Ada, which requires a pre-existing GCC Ada compiler to bootstrap | ||
# - Go, currently not supported on macOS | ||
# - BRIG | ||
languages = %w[c c++ objc obj-c++ fortran jit] | ||
|
||
osmajor = `uname -r`.split(".").first | ||
pkgversion = "Homebrew GCC #{pkg_version} #{build.used_options*" "}".strip | ||
|
||
args = %W[ | ||
--build=x86_64-apple-darwin#{osmajor} | ||
--prefix=#{prefix} | ||
--libdir=#{lib}/gcc/#{version_suffix} | ||
--disable-nls | ||
--enable-checking=release | ||
--enable-languages=#{languages.join(",")} | ||
--program-suffix=-#{version_suffix} | ||
--with-gmp=#{Formula["gmp"].opt_prefix} | ||
--with-mpfr=#{Formula["mpfr"].opt_prefix} | ||
--with-mpc=#{Formula["libmpc"].opt_prefix} | ||
--with-isl=#{Formula["isl"].opt_prefix} | ||
--with-system-zlib | ||
--with-pkgversion=#{pkgversion} | ||
--with-bugurl=https://github.com/Homebrew/homebrew-core/issues | ||
--enable-host-shared | ||
] | ||
|
||
# Xcode 10 dropped 32-bit support | ||
args << "--disable-multilib" if DevelopmentTools.clang_build_version >= 1000 | ||
|
||
# System headers may not be in /usr/include | ||
sdk = MacOS.sdk_path_if_needed | ||
if sdk | ||
args << "--with-native-system-header-dir=/usr/include" | ||
args << "--with-sysroot=#{sdk}" | ||
end | ||
|
||
# Avoid reference to sed shim | ||
args << "SED=/usr/bin/sed" | ||
|
||
# Ensure correct install names when linking against libgcc_s; | ||
# see discussion in https://github.com/Homebrew/legacy-homebrew/pull/34303 | ||
inreplace "libgcc/config/t-slibgcc-darwin", "@shlib_slibdir@", "#{HOMEBREW_PREFIX}/lib/gcc/#{version_suffix}" | ||
|
||
mkdir "build" do | ||
system "../configure", *args | ||
|
||
# Use -headerpad_max_install_names in the build, | ||
# otherwise updated load commands won't fit in the Mach-O header. | ||
# This is needed because `gcc` avoids the superenv shim. | ||
system "make", "BOOT_LDFLAGS=-Wl,-headerpad_max_install_names" | ||
system "make", "install" | ||
|
||
bin.install_symlink bin/"gfortran-#{version_suffix}" => "gfortran" | ||
end | ||
|
||
# Handle conflicts between GCC formulae and avoid interfering | ||
# with system compilers. | ||
# Rename man7. | ||
Dir.glob(man7/"*.7") { |file| add_suffix file, version_suffix } | ||
# Even when we disable building info pages some are still installed. | ||
info.rmtree | ||
end | ||
|
||
def add_suffix(file, suffix) | ||
dir = File.dirname(file) | ||
ext = File.extname(file) | ||
base = File.basename(file, ext) | ||
File.rename file, "#{dir}/#{base}-#{suffix}#{ext}" | ||
end | ||
|
||
test do | ||
(testpath/"hello-c.c").write <<~EOS | ||
#include <stdio.h> | ||
int main() | ||
{ | ||
puts("Hello, world!"); | ||
return 0; | ||
} | ||
EOS | ||
system "#{bin}/gcc-#{version_suffix}", "-o", "hello-c", "hello-c.c" | ||
assert_equal "Hello, world!\n", `./hello-c` | ||
|
||
(testpath/"hello-cc.cc").write <<~EOS | ||
#include <iostream> | ||
int main() | ||
{ | ||
std::cout << "Hello, world!" << std::endl; | ||
return 0; | ||
} | ||
EOS | ||
system "#{bin}/g++-#{version_suffix}", "-o", "hello-cc", "hello-cc.cc" | ||
assert_equal "Hello, world!\n", `./hello-cc` | ||
|
||
(testpath/"test.f90").write <<~EOS | ||
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 | ||
write(*,"(A)") "Done" | ||
end | ||
EOS | ||
system "#{bin}/gfortran", "-o", "test", "test.f90" | ||
assert_equal "Done\n", `./test` | ||
end | ||
end |