-
-
Notifications
You must be signed in to change notification settings - Fork 38
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
240 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,240 @@ | ||
class MingwW64At10 < Formula | ||
desc "Minimalist GNU for Windows and GCC cross-compilers" | ||
homepage "https://sourceforge.net/projects/mingw-w64/" | ||
url "https://downloads.sourceforge.net/project/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v11.0.1.tar.bz2" | ||
sha256 "3f66bce069ee8bed7439a1a13da7cb91a5e67ea6170f21317ac7f5794625ee10" | ||
license "ZPL-2.1" | ||
|
||
livecheck do | ||
url :stable | ||
regex(%r{url=.*?release/mingw-w64[._-]v?(\d+(?:\.\d+)+)\.t}i) | ||
end | ||
|
||
keg_only :versioned_formula | ||
|
||
# binutils searches for zstd using pkg-config | ||
depends_on "pkg-config" => :build | ||
# Apple's makeinfo is old and has bugs | ||
depends_on "texinfo" => :build | ||
|
||
depends_on "gmp" | ||
depends_on "isl" | ||
depends_on "libmpc" | ||
depends_on "mpfr" | ||
depends_on "zstd" | ||
|
||
uses_from_macos "zlib" | ||
|
||
resource "binutils" do | ||
url "https://ftp.gnu.org/gnu/binutils/binutils-2.42.tar.xz" | ||
mirror "https://ftpmirror.gnu.org/binutils/binutils-2.42.tar.xz" | ||
sha256 "f6e4d41fd5fc778b06b7891457b3620da5ecea1006c6a4a41ae998109f85a800" | ||
end | ||
|
||
resource "gcc" do | ||
url "https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz" | ||
mirror "https://ftpmirror.gnu.org/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz" | ||
sha256 "e275e76442a6067341a27f04c5c6b83d8613144004c0413528863dc6b5c743da" | ||
|
||
# Backport fix for ctype build errors with Xcode 15.3 | ||
patch do | ||
url "https://gcc.gnu.org/git/?p=gcc.git;a=patch;h=9970b576b7e4ae337af1268395ff221348c4b34a" | ||
sha256 "968bfcb58f75d889470f2f815787f6aa254fb43f1e5516e04f577dad22259905" | ||
end | ||
|
||
# Backport fix for libcc1 std::vector build errors with Xcode 15.3 | ||
patch do | ||
url "https://gcc.gnu.org/git/?p=gcc.git;a=patch;h=5213047b1d50af63dfabb5e5649821a6cb157e33" | ||
sha256 "0d36d0d5556aefa59dbedf821f5c9dcda940a9c6f92cb3509423f524fd93351a" | ||
end | ||
end | ||
|
||
def target_archs | ||
["i686", "x86_64"].freeze | ||
end | ||
|
||
def install | ||
target_archs.each do |arch| | ||
arch_dir = "#{prefix}/toolchain-#{arch}" | ||
target = "#{arch}-w64-mingw32" | ||
|
||
resource("binutils").stage do | ||
args = %W[ | ||
--target=#{target} | ||
--with-sysroot=#{arch_dir} | ||
--prefix=#{arch_dir} | ||
--enable-targets=#{target} | ||
--disable-multilib | ||
--disable-nls | ||
--with-system-zlib | ||
--with-zstd | ||
] | ||
mkdir "build-#{arch}" do | ||
system "../configure", *args | ||
system "make" | ||
system "make", "install" | ||
end | ||
end | ||
|
||
# Put the newly built binutils into our PATH | ||
ENV.prepend_path "PATH", "#{arch_dir}/bin" | ||
|
||
mkdir "mingw-w64-headers/build-#{arch}" do | ||
system "../configure", "--host=#{target}", "--prefix=#{arch_dir}/#{target}" | ||
system "make" | ||
system "make", "install" | ||
end | ||
|
||
# Create a mingw symlink, expected by GCC | ||
ln_s "#{arch_dir}/#{target}", "#{arch_dir}/mingw" | ||
|
||
# Build the GCC compiler | ||
resource("gcc").stage buildpath/"gcc" | ||
args = %W[ | ||
--target=#{target} | ||
--with-sysroot=#{arch_dir} | ||
--prefix=#{arch_dir} | ||
--with-bugurl=#{tap.issues_url} | ||
--enable-languages=c,c++,objc,obj-c++,fortran | ||
--with-ld=#{arch_dir}/bin/#{target}-ld | ||
--with-as=#{arch_dir}/bin/#{target}-as | ||
--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-zstd | ||
--disable-multilib | ||
--disable-nls | ||
--enable-threads=posix | ||
] | ||
|
||
mkdir "#{buildpath}/gcc/build-#{arch}" do | ||
system "../configure", *args | ||
system "make", "all-gcc" | ||
system "make", "install-gcc" | ||
end | ||
|
||
# Build the mingw-w64 runtime | ||
args = %W[ | ||
CC=#{target}-gcc | ||
CXX=#{target}-g++ | ||
CPP=#{target}-cpp | ||
--host=#{target} | ||
--with-sysroot=#{arch_dir}/#{target} | ||
--prefix=#{arch_dir}/#{target} | ||
] | ||
|
||
case arch | ||
when "i686" | ||
args << "--enable-lib32" << "--disable-lib64" | ||
when "x86_64" | ||
args << "--disable-lib32" << "--enable-lib64" | ||
end | ||
|
||
mkdir "mingw-w64-crt/build-#{arch}" do | ||
system "../configure", *args | ||
# Resolves "Too many open files in system" | ||
# bfd_open failed open stub file dfxvs01181.o: Too many open files in system | ||
# bfd_open failed open stub file: dvxvs00563.o: Too many open files in systembfd_open | ||
# https://sourceware.org/bugzilla/show_bug.cgi?id=24723 | ||
# https://sourceware.org/bugzilla/show_bug.cgi?id=23573#c18 | ||
ENV.deparallelize do | ||
system "make" | ||
system "make", "install" | ||
end | ||
end | ||
|
||
# Build the winpthreads library | ||
# we need to build this prior to the | ||
# GCC runtime libraries, to have `-lpthread` | ||
# available, for `--enable-threads=posix` | ||
args = %W[ | ||
CC=#{target}-gcc | ||
CXX=#{target}-g++ | ||
CPP=#{target}-cpp | ||
--host=#{target} | ||
--with-sysroot=#{arch_dir}/#{target} | ||
--prefix=#{arch_dir}/#{target} | ||
] | ||
mkdir "mingw-w64-libraries/winpthreads/build-#{arch}" do | ||
system "../configure", *args | ||
system "make" | ||
system "make", "install" | ||
end | ||
|
||
args = %W[ | ||
--host=#{target} | ||
--with-sysroot=#{arch_dir}/#{target} | ||
--prefix=#{arch_dir} | ||
--program-prefix=#{target}- | ||
] | ||
mkdir "mingw-w64-tools/widl/build-#{arch}" do | ||
system "../configure", *args | ||
system "make" | ||
system "make", "install" | ||
end | ||
|
||
# Finish building GCC (runtime libraries) | ||
chdir "#{buildpath}/gcc/build-#{arch}" do | ||
system "make" | ||
system "make", "install" | ||
end | ||
|
||
# Symlinks all binaries into place | ||
mkdir_p bin | ||
Dir["#{arch_dir}/bin/*"].each { |f| ln_s f, bin } | ||
end | ||
end | ||
|
||
test do | ||
(testpath/"hello.c").write <<~EOS | ||
#include <stdio.h> | ||
#include <windows.h> | ||
int main() { puts("Hello world!"); | ||
MessageBox(NULL, TEXT("Hello GUI!"), TEXT("HelloMsg"), 0); return 0; } | ||
EOS | ||
(testpath/"hello.cc").write <<~EOS | ||
#include <iostream> | ||
int main() { std::cout << "Hello, world!" << std::endl; return 0; } | ||
EOS | ||
(testpath/"hello.f90").write <<~EOS | ||
program hello ; print *, "Hello, world!" ; end program hello | ||
EOS | ||
# https://docs.microsoft.com/en-us/windows/win32/rpc/using-midl | ||
(testpath/"example.idl").write <<~EOS | ||
[ | ||
uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45), | ||
version(1.0) | ||
] | ||
interface MyInterface | ||
{ | ||
const unsigned short INT_ARRAY_LEN = 100; | ||
void MyRemoteProc( | ||
[in] int param1, | ||
[out] int outArray[INT_ARRAY_LEN] | ||
); | ||
} | ||
EOS | ||
|
||
ENV["LC_ALL"] = "C" | ||
ENV.remove_macosxsdk if OS.mac? | ||
target_archs.each do |arch| | ||
target = "#{arch}-w64-mingw32" | ||
outarch = (arch == "i686") ? "i386" : "x86-64" | ||
|
||
system "#{bin}/#{target}-gcc", "-o", "test.exe", "hello.c" | ||
assert_match "file format pei-#{outarch}", shell_output("#{bin}/#{target}-objdump -a test.exe") | ||
|
||
system "#{bin}/#{target}-g++", "-o", "test.exe", "hello.cc" | ||
assert_match "file format pei-#{outarch}", shell_output("#{bin}/#{target}-objdump -a test.exe") | ||
|
||
system "#{bin}/#{target}-gfortran", "-o", "test.exe", "hello.f90" | ||
assert_match "file format pei-#{outarch}", shell_output("#{bin}/#{target}-objdump -a test.exe") | ||
|
||
system "#{bin}/#{target}-widl", "example.idl" | ||
assert_predicate testpath/"example_s.c", :exist?, "example_s.c should have been created" | ||
end | ||
end | ||
end |