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( diff --git a/Library/Homebrew/extend/os/mac/formula.rb b/Library/Homebrew/extend/os/mac/formula.rb index c802e31806..506ed41426 100644 --- a/Library/Homebrew/extend/os/mac/formula.rb +++ b/Library/Homebrew/extend/os/mac/formula.rb @@ -32,6 +32,18 @@ module OS args end + + sig { + params( + prefix: T.any(String, Pathname), + release_mode: Symbol, + ).returns(T::Array[String]) + } + def std_zig_args(prefix: self.prefix, release_mode: :fast) + args = super + args << "-fno-rosetta" if ::Hardware::CPU.arm? + args + end end end end diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 5ebe184eff..c8a3e2debe 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1946,6 +1946,26 @@ class Formula args end + # Standard parameters for zig builds. + # + # @api public + sig { + params(prefix: T.any(String, Pathname), + release_mode: Symbol).returns(T::Array[String]) + } + 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" + ] + end + # Shared library names according to platform conventions. # # Optionally specify a `version` to restrict the shared library to a specific @@ -3029,6 +3049,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 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