class Fpc < Formula desc "Free Pascal: multi-architecture Pascal compiler" homepage "https://www.freepascal.org/" url "https://downloads.sourceforge.net/project/freepascal/Source/3.2.2/fpc-3.2.2.source.tar.gz" sha256 "d542e349de246843d4f164829953d1f5b864126c5b62fd17c9b45b33e23d2f44" license "GPL-2.0-or-later" revision 1 # fpc releases involve so many files that the tarball is pushed out of the # RSS feed and we can't rely on the SourceForge strategy. livecheck do url "https://sourceforge.net/projects/freepascal/files/Source/" strategy :page_match regex(%r{href=(?:["']|.*?Source/)?v?(\d+(?:\.\d+)+)/?["' >]}i) end bottle do sha256 cellar: :any, arm64_big_sur: "b4efbb9f568afadfb27aab8ca80895b7f306f58c7ff8a0623f2bd8418338b745" sha256 cellar: :any, big_sur: "4c3a012398b6136776358206b0cac52ec1096484c27a08c142e7f51afc713956" sha256 cellar: :any, catalina: "1bbaa4c1b6a616f8a56554b30c69cae267d22849074eb628d77c23af2e911e6e" sha256 cellar: :any, mojave: "314265a7bff5c2f8a613d1c04db8856f6523d8d00d33435892260ef3fa9cc604" sha256 cellar: :any_skip_relocation, x86_64_linux: "3491933cdf5782d3c4b9b1188757cb3846b5d823a6db75c8fb56f13b23bc6747" end on_macos do resource "bootstrap" do url "https://downloads.sourceforge.net/project/freepascal/Mac%20OS%20X/3.2.2/fpc-3.2.2.intelarm64-macosx.dmg" sha256 "05d4510c8c887e3c68de20272abf62171aa5b2ef1eba6bce25e4c0bc41ba8b7d" end end on_linux do # mesa is needed to test GL unit depends_on "mesa" => :test resource "bootstrap" do url "https://downloads.sourceforge.net/project/freepascal/Linux/3.2.2/fpc-3.2.2.x86_64-linux.tar" sha256 "5adac308a5534b6a76446d8311fc340747cbb7edeaacfe6b651493ff3fe31e83" end end def install fpc_bootstrap = buildpath/"bootstrap" compiler_name = Hardware::CPU.arm? ? "ppca64" : "ppcx64" fpc_compiler = fpc_bootstrap/"bin"/compiler_name resource("bootstrap").stage do if OS.mac? pkg_path = "fpc-3.2.2-intelarm64-macosx.mpkg/Contents/Packages/fpc-3.2.2-intelarm64-macosx.pkg" system "pkgutil", "--expand-full", pkg_path, "contents" fpc_bootstrap.install Dir["contents/Payload/usr/local/*"] else mkdir "packages" system "tar", "-xf", "binary.x86_64-linux.tar", "-C", "packages" mkdir_p fpc_bootstrap Dir["packages/*.tar.gz"].each do |tarball| system "tar", "-xzf", tarball, "-C", fpc_bootstrap end (fpc_bootstrap/"bin").install_symlink fpc_bootstrap/"lib/fpc/3.2.2"/compiler_name end end # Help fpc find the startup files (crt1.o and friends) sdk = MacOS.sdk_path_if_needed args = sdk ? %W[OPT="-XR#{sdk}"] : [] system "make", "build", "PP=#{fpc_compiler}", *args system "make", "install", "PP=#{fpc_compiler}", "PREFIX=#{prefix}" bin.install_symlink lib/name/version/compiler_name # Prevent non-executable audit warning rm_f Dir[bin/"*.rsj"] # Generate a default fpc.cfg to set up unit search paths system "#{bin}/fpcmkcfg", "-p", "-d", "basepath=#{lib}/fpc/#{version}", "-o", "#{prefix}/etc/fpc.cfg" if OS.linux? # On Linux, non-executable IDE support files get built and end up in bin. # Put them somewhere else instead. (pkgshare/"ide").install Dir[bin/"*.{ans,tdf,pt}"] # On Linux, config path is hard-coded to #{lib/name/version/compiler_name/"../etc"} # (or home directory or system-level /etc, neither of which are suitable for Homebrew) # so link #{prefix}/etc to where it can be found. (lib/"fpc").install_symlink prefix/"etc" end end test do hello = <<~EOS program Hello; uses GL; begin writeln('Hello Homebrew') end. EOS (testpath/"hello.pas").write(hello) system "#{bin}/fpc", "hello.pas" assert_equal "Hello Homebrew", shell_output("./hello").strip end end