# frozen_string_literal: true class Gcc < Formula desc 'GNU compiler collection' homepage 'https://gcc.gnu.org/' url 'https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz' mirror 'https://ftpmirror.gnu.org/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz' sha256 'b8dd4368bb9c7f0b98188317ee0254dd8cc99d1e3a18d0ff146c855fe16c1d8c' license 'GPL-3.0' head 'https://gcc.gnu.org/git/gcc.git' bottle do sha256 '8dbccea194c20b1037b7e8180986e98a8ee3e37eaac12c7d223c89be3deaac6a' => :catalina sha256 '79d2293ce912dc46af961f30927b31eb06844292927be497015496f79ac41557' => :mojave sha256 '5ed870a39571614dc5d83be26d73a4164911f4356b80d9345258a4c1dc3f1b70' => :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 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 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