From 21714d63a42bc0933d3b423ec0e1e8b60b41cf65 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 14:53:34 +0100 Subject: [PATCH 1/7] formula: add std_zig_args --- Library/Homebrew/formula.rb | 13 +++++++++++++ Library/Homebrew/formula_creator.rb | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 5ebe184eff..945fc21482 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1946,6 +1946,17 @@ class Formula args end + # Standard parameters for zig builds. + # + # @api public + sig { + params(prefix: T.any(String, Pathname), + release_mode: String).returns(T::Array[String]) + } + def std_zig_args(prefix: self.prefix, release_mode: "fast") + ["--prefix", prefix.to_s, "--release=#{release_mode}", "--summary", "all"] + end + # Shared library names according to platform conventions. # # Optionally specify a `version` to restrict the shared library to a specific @@ -3029,6 +3040,8 @@ class Formula pretty_args -= std_go_args when "meson" pretty_args -= std_meson_args + when "zig" + pretty_args -= std_zig_args when %r{(^|/)(pip|python)(?:[23](?:\.\d{1,2})?)?$} pretty_args -= std_pip_args end diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb index 7aea843537..609d23e8d7 100644 --- a/Library/Homebrew/formula_creator.rb +++ b/Library/Homebrew/formula_creator.rb @@ -151,6 +151,8 @@ module Homebrew uses_from_macos "ruby" <% elsif @mode == :rust %> depends_on "rust" => :build + <% elsif @mode == :zig %> + depends_on "zig" => :build <% elsif @mode.nil? %> # depends_on "cmake" => :build <% end %> @@ -217,6 +219,8 @@ module Homebrew bin.env_script_all_files(libexec/"bin", GEM_HOME: ENV["GEM_HOME"]) <% elsif @mode == :rust %> system "cargo", "install", *std_cargo_args + <% elsif @mode == :zig %> + system "zig", "build", *std_zig_args <% else %> # Remove unrecognized options if they cause configure to fail # https://rubydoc.brew.sh/Formula.html#std_configure_args-instance_method From 35dcf8e3623f0b663599f3961935244324ead669 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 15:05:42 +0100 Subject: [PATCH 2/7] creator: add zig option --- Library/Homebrew/dev-cmd/create.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/dev-cmd/create.rb b/Library/Homebrew/dev-cmd/create.rb index ad73d5b4ee..830d995c8f 100644 --- a/Library/Homebrew/dev-cmd/create.rb +++ b/Library/Homebrew/dev-cmd/create.rb @@ -40,6 +40,8 @@ module Homebrew description: "Create a basic template for a Ruby build." switch "--rust", description: "Create a basic template for a Rust build." + switch "--zig", + description: "Create a basic template for a Zig build." switch "--no-fetch", description: "Homebrew will not download to the cache and will thus not add its SHA-256 " \ "to the formula for you, nor will it check the GitHub API for GitHub projects " \ @@ -58,7 +60,7 @@ module Homebrew description: "Ignore errors for disallowed formula names and names that shadow aliases." conflicts "--autotools", "--cmake", "--crystal", "--go", "--meson", "--node", - "--perl", "--python", "--ruby", "--rust", "--cask" + "--perl", "--python", "--ruby", "--rust", "--zig", "--cask" conflicts "--cask", "--HEAD" conflicts "--cask", "--set-license" @@ -173,6 +175,8 @@ module Homebrew :ruby elsif args.rust? :rust + elsif args.zig? + :zig end fc = FormulaCreator.new( From 4adb910a8b593eb1ebf33b687bbb304260b8ea4a Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 15:17:55 +0100 Subject: [PATCH 3/7] create.rbi: add `zig` --- Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi index 3d94822e23..66126dd6b2 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/create.rbi @@ -56,6 +56,9 @@ class Homebrew::DevCmd::Create::Args < Homebrew::CLI::Args sig { returns(T::Boolean) } def rust?; end + sig { returns(T::Boolean) } + def zig?; end + sig { returns(T.nilable(String)) } def set_license; end From 1e5414c6ac6365e0680aaf482edab3b4324b6448 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 15:57:36 +0100 Subject: [PATCH 4/7] formula: include `-Doptimize` flag for Zig std args --- Library/Homebrew/formula.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 945fc21482..8b4a0ad4be 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1954,7 +1954,12 @@ class Formula release_mode: String).returns(T::Array[String]) } def std_zig_args(prefix: self.prefix, release_mode: "fast") - ["--prefix", prefix.to_s, "--release=#{release_mode}", "--summary", "all"] + release_mode = release_mode.downcase + args = ["--prefix", prefix.to_s, "--release=#{release_mode}"] + release_mode_uc = release_mode.capitalize + args << "-Doptimize=Release#{release_mode_uc}" + args += ["--summary", "all"] + args end # Shared library names according to platform conventions. From bfdfdc9489d68e5d6c05c3996d461dd0a69ad057 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 16:49:11 +0100 Subject: [PATCH 5/7] `-fno-rosetta` flag --- Library/Homebrew/extend/os/mac/formula.rb | 14 ++++++++++++++ Library/Homebrew/formula.rb | 14 ++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Library/Homebrew/extend/os/mac/formula.rb b/Library/Homebrew/extend/os/mac/formula.rb index c802e31806..fee25ff019 100644 --- a/Library/Homebrew/extend/os/mac/formula.rb +++ b/Library/Homebrew/extend/os/mac/formula.rb @@ -32,6 +32,20 @@ module OS args end + + sig { + params( + prefix: T.any(String, Pathname), + release_mode: String + ).returns(T::Array[String]) + } + def std_zig_args(prefix: self.prefix, release_mode: "fast") + args = super + # it is probably better to add this flag only on arm macs + # my attempts with `MacOS::Hardware::CPU.arm?` and its variations didn't work out + args << "-fno-rosetta" + args + end end end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 8b4a0ad4be..44b03f2a23 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1954,12 +1954,14 @@ class Formula release_mode: String).returns(T::Array[String]) } def std_zig_args(prefix: self.prefix, release_mode: "fast") - release_mode = release_mode.downcase - args = ["--prefix", prefix.to_s, "--release=#{release_mode}"] - release_mode_uc = release_mode.capitalize - args << "-Doptimize=Release#{release_mode_uc}" - args += ["--summary", "all"] - args + release_mode_downcased = release_mode.downcase + release_mode_capitalized = release_mode.capitalize + [ + "--prefix", prefix.to_s, + "--release=#{release_mode_downcased}", + "-Doptimize=Release#{release_mode_capitalized}", + "--summary", "all", + ] end # Shared library names according to platform conventions. From c5d78f33476c98d35fefa68fcec4477a11103e48 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 17:07:29 +0100 Subject: [PATCH 6/7] zig std args: use symbols for compilation options --- Library/Homebrew/extend/os/mac/formula.rb | 4 ++-- Library/Homebrew/formula.rb | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Library/Homebrew/extend/os/mac/formula.rb b/Library/Homebrew/extend/os/mac/formula.rb index fee25ff019..c278a32674 100644 --- a/Library/Homebrew/extend/os/mac/formula.rb +++ b/Library/Homebrew/extend/os/mac/formula.rb @@ -36,10 +36,10 @@ module OS sig { params( prefix: T.any(String, Pathname), - release_mode: String + release_mode: Symbol, ).returns(T::Array[String]) } - def std_zig_args(prefix: self.prefix, release_mode: "fast") + def std_zig_args(prefix: self.prefix, release_mode: :fast) args = super # it is probably better to add this flag only on arm macs # my attempts with `MacOS::Hardware::CPU.arm?` and its variations didn't work out diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 44b03f2a23..c8a3e2debe 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1951,16 +1951,18 @@ class Formula # @api public sig { params(prefix: T.any(String, Pathname), - release_mode: String).returns(T::Array[String]) + release_mode: Symbol).returns(T::Array[String]) } - def std_zig_args(prefix: self.prefix, release_mode: "fast") - release_mode_downcased = release_mode.downcase - release_mode_capitalized = release_mode.capitalize + def std_zig_args(prefix: self.prefix, release_mode: :fast) + raise ArgumentError, "Invalid Zig release mode: #{release_mode}" if [:safe, :fast, :small].exclude?(release_mode) + + release_mode_downcased = release_mode.to_s.downcase + release_mode_capitalized = release_mode.to_s.capitalize [ "--prefix", prefix.to_s, "--release=#{release_mode_downcased}", "-Doptimize=Release#{release_mode_capitalized}", - "--summary", "all", + "--summary", "all" ] end From 68f8798821f7a61cb6c3e844d4f3777dc1296427 Mon Sep 17 00:00:00 2001 From: botantony Date: Fri, 21 Feb 2025 19:10:41 +0100 Subject: [PATCH 7/7] zig std args: apply `-fno-rosetta` on macs with arm --- Library/Homebrew/extend/os/mac/formula.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Library/Homebrew/extend/os/mac/formula.rb b/Library/Homebrew/extend/os/mac/formula.rb index c278a32674..506ed41426 100644 --- a/Library/Homebrew/extend/os/mac/formula.rb +++ b/Library/Homebrew/extend/os/mac/formula.rb @@ -41,9 +41,7 @@ module OS } def std_zig_args(prefix: self.prefix, release_mode: :fast) args = super - # it is probably better to add this flag only on arm macs - # my attempts with `MacOS::Hardware::CPU.arm?` and its variations didn't work out - args << "-fno-rosetta" + args << "-fno-rosetta" if ::Hardware::CPU.arm? args end end