| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  | require "digest" | 
					
						
							|  |  |  | require "erb" | 
					
						
							| 
									
										
										
										
											2025-06-18 15:07:44 +01:00
										 |  |  | require "utils/github" | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-08-17 05:53:46 +02:00
										 |  |  |   # Class for generating a formula from a template. | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |   class FormulaCreator | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |     sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2023-11-28 18:10:20 +00:00
										 |  |  |     attr_accessor :name | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |     sig { returns(Version) } | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |     attr_reader :version | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-23 12:23:46 +03:00
										 |  |  |     sig { returns(String) } | 
					
						
							|  |  |  |     attr_reader :url | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |     sig { returns(T::Boolean) } | 
					
						
							|  |  |  |     attr_reader :head | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-28 18:32:56 +00:00
										 |  |  |     sig { | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |       params(url: String, name: T.nilable(String), version: T.nilable(String), tap: T.nilable(String), | 
					
						
							| 
									
										
										
										
											2023-11-29 19:13:19 +00:00
										 |  |  |              mode: T.nilable(Symbol), license: T.nilable(String), fetch: T::Boolean, head: T::Boolean).void | 
					
						
							| 
									
										
										
										
											2023-11-28 18:32:56 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |     def initialize(url:, name: nil, version: nil, tap: nil, mode: nil, license: nil, fetch: false, head: false) | 
					
						
							| 
									
										
										
										
											2023-11-29 19:13:19 +00:00
										 |  |  |       @url = url | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |       @mode = mode | 
					
						
							|  |  |  |       @license = license | 
					
						
							|  |  |  |       @fetch = fetch | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |       tap = if tap.blank? | 
					
						
							|  |  |  |         CoreTap.instance | 
					
						
							| 
									
										
										
										
											2025-06-18 05:40:40 +03:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |         Tap.fetch(tap) | 
					
						
							| 
									
										
										
										
											2025-06-18 05:40:40 +03:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |       @tap = T.let(tap, Tap) | 
					
						
							| 
									
										
										
										
											2025-06-18 05:40:40 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (match_github = url.match %r{github\.com/(?<user>[^/]+)/(?<repo>[^/]+).*}) | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |         user = T.must(match_github[:user]) | 
					
						
							| 
									
										
										
										
											2025-06-18 05:40:40 +03:00
										 |  |  |         repository = T.must(match_github[:repo]) | 
					
						
							|  |  |  |         if repository.end_with?(".git") | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |           # e.g. https://github.com/Homebrew/brew.git | 
					
						
							|  |  |  |           repository.delete_suffix!(".git") | 
					
						
							| 
									
										
										
										
											2025-06-18 05:40:40 +03:00
										 |  |  |           head = true | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         odebug "github: #{user} #{repository} head:#{head}" | 
					
						
							|  |  |  |         if name.blank? | 
					
						
							|  |  |  |           name = repository | 
					
						
							|  |  |  |           odebug "name from github: #{name}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       elsif name.blank? | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |         stem = Pathname.new(url).stem | 
					
						
							|  |  |  |         name = if stem.start_with?("index.cgi") && stem.include?("=") | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |           # special cases first | 
					
						
							|  |  |  |           # gitweb URLs e.g. http://www.codesrc.com/gitweb/index.cgi?p=libzipper.git;a=summary | 
					
						
							|  |  |  |           stem.rpartition("=").last | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           # e.g. http://digit-labs.org/files/tools/synscan/releases/synscan-5.02.tar.gz | 
					
						
							|  |  |  |           pathver = Version.parse(stem).to_s | 
					
						
							|  |  |  |           stem.sub(/[-_.]?#{Regexp.escape(pathver)}$/, "") | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         odebug "name from url: #{name}" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |       @name = T.let(name, String) | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |       @head = head | 
					
						
							| 
									
										
										
										
											2023-12-01 19:19:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-19 16:18:41 +03:00
										 |  |  |       if version.present? | 
					
						
							|  |  |  |         version = Version.new(version) | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |         odebug "version from user: #{version}" | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2025-06-19 16:18:41 +03:00
										 |  |  |         version = Version.detect(url) | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |         odebug "version from url: #{version}" | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |       if fetch && user && repository | 
					
						
							|  |  |  |         github = GitHub.repository(user, repository) | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |         if version.null? && !head | 
					
						
							|  |  |  |           begin | 
					
						
							|  |  |  |             latest_release = GitHub.get_latest_release(user, repository) | 
					
						
							|  |  |  |             version = Version.new(latest_release.fetch("tag_name")) | 
					
						
							| 
									
										
										
										
											2025-06-19 16:18:41 +03:00
										 |  |  |             odebug "github: version from latest_release: #{version}" | 
					
						
							| 
									
										
										
										
											2025-06-23 12:23:46 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             @url = "https://github.com/#{user}/#{repository}/archive/refs/tags/#{version}.tar.gz" | 
					
						
							|  |  |  |             odebug "github: url changed to source archive #{@url}" | 
					
						
							| 
									
										
										
										
											2025-06-19 09:02:27 +01:00
										 |  |  |           rescue GitHub::API::HTTPNotFoundError | 
					
						
							|  |  |  |             odebug "github: latest_release lookup failed: #{url}" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @github = T.let(github, T.untyped) | 
					
						
							|  |  |  |       @version = T.let(version, Version) | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       @sha256 = T.let(nil, T.nilable(String)) | 
					
						
							|  |  |  |       @desc = T.let(nil, T.nilable(String)) | 
					
						
							|  |  |  |       @homepage = T.let(nil, T.nilable(String)) | 
					
						
							|  |  |  |       @license = T.let(nil, T.nilable(String)) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { void } | 
					
						
							|  |  |  |     def verify_tap_available! | 
					
						
							|  |  |  |       raise TapUnavailableError, @tap.name unless @tap.installed? | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-17 11:33:47 -04:00
										 |  |  |     sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2023-11-23 18:04:03 +03:00
										 |  |  |     def write_formula! | 
					
						
							| 
									
										
										
										
											2023-11-23 18:53:22 +03:00
										 |  |  |       raise ArgumentError, "name is blank!" if @name.blank? | 
					
						
							|  |  |  |       raise ArgumentError, "tap is blank!" if @tap.blank? | 
					
						
							| 
									
										
										
										
											2023-11-23 18:12:12 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-20 14:03:50 +00:00
										 |  |  |       path = @tap.new_formula_path(@name) | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |       raise "#{path} already exists" if path.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-28 15:39:04 +00:00
										 |  |  |       if @version.nil? || @version.null? | 
					
						
							| 
									
										
										
										
											2023-09-08 14:46:15 -04:00
										 |  |  |         odie "Version cannot be determined from URL. Explicitly set the version with `--set-version` instead." | 
					
						
							| 
									
										
										
										
											2024-02-16 14:55:09 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if @fetch | 
					
						
							| 
									
										
										
										
											2023-11-27 20:16:45 +00:00
										 |  |  |         unless @head | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           r = Resource.new | 
					
						
							| 
									
										
										
										
											2023-11-29 18:48:06 +00:00
										 |  |  |           r.url(@url) | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           r.owner = self | 
					
						
							| 
									
										
										
										
											2025-03-27 06:09:58 +03:00
										 |  |  |           filepath = r.fetch | 
					
						
							| 
									
										
										
										
											2025-03-28 06:59:02 +03:00
										 |  |  |           html_doctype_prefix = "<!doctype html" | 
					
						
							| 
									
										
										
										
											2025-05-30 10:57:53 +03:00
										 |  |  |           # Number of bytes to read from file start to ensure it is not HTML. | 
					
						
							|  |  |  |           # HTML may start with arbitrary number of whitespace lines. | 
					
						
							| 
									
										
										
										
											2025-05-30 14:55:50 +01:00
										 |  |  |           bytes_to_read = 100
 | 
					
						
							|  |  |  |           if File.read(filepath, bytes_to_read).strip.downcase.start_with?(html_doctype_prefix) | 
					
						
							| 
									
										
										
										
											2025-03-28 07:05:53 +03:00
										 |  |  |             raise "Downloaded URL is not archive" | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2025-03-27 06:09:58 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-15 15:28:43 +03:00
										 |  |  |           @sha256 = T.let(filepath.sha256, T.nilable(String)) | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 14:55:09 +03:00
										 |  |  |         if @github | 
					
						
							|  |  |  |           @desc = @github["description"] | 
					
						
							| 
									
										
										
										
											2025-03-30 18:15:00 +02:00
										 |  |  |           @homepage = @github["homepage"].presence || "https://github.com/#{@github["full_name"]}" | 
					
						
							| 
									
										
										
										
											2024-02-16 14:55:09 +03:00
										 |  |  |           @license = @github["license"]["spdx_id"] if @github["license"] | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-03 13:24:32 +01:00
										 |  |  |       path.dirname.mkpath | 
					
						
							| 
									
										
										
										
											2019-10-13 10:09:38 +01:00
										 |  |  |       path.write ERB.new(template, trim_mode: ">").result(binding) | 
					
						
							| 
									
										
										
										
											2023-11-20 14:03:50 +00:00
										 |  |  |       path | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-17 11:44:15 +01:00
										 |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-05 14:09:27 +08:00
										 |  |  |     sig { params(name: String).returns(String) } | 
					
						
							|  |  |  |     def latest_versioned_formula(name) | 
					
						
							|  |  |  |       name_prefix = "#{name}@" | 
					
						
							| 
									
										
										
										
											2025-02-10 14:55:20 +08:00
										 |  |  |       CoreTap.instance.formula_names | 
					
						
							|  |  |  |              .select { |f| f.start_with?(name_prefix) } | 
					
						
							|  |  |  |              .max_by { |v| Gem::Version.new(v.sub(name_prefix, "")) } || "python" | 
					
						
							| 
									
										
										
										
											2025-02-05 14:09:27 +08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |     def template | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       <<~ERB | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         # Documentation: https://docs.brew.sh/Formula-Cookbook | 
					
						
							| 
									
										
										
										
											2019-03-28 21:15:50 +00:00
										 |  |  |         #                https://rubydoc.brew.sh/Formula | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST! | 
					
						
							|  |  |  |         class #{Formulary.class_s(name)} < Formula | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% if  @mode == :python %> | 
					
						
							| 
									
										
										
										
											2019-09-24 19:34:34 +02:00
										 |  |  |           include Language::Python::Virtualenv | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <% end  %> | 
					
						
							| 
									
										
										
										
											2023-11-29 18:43:03 +00:00
										 |  |  |           desc "#{@desc}" | 
					
						
							|  |  |  |           homepage "#{@homepage}" | 
					
						
							| 
									
										
										
										
											2023-11-27 20:16:45 +00:00
										 |  |  |         <% unless  @head %> | 
					
						
							| 
									
										
										
										
											2023-11-29 18:48:06 +00:00
										 |  |  |           url "#{@url}" | 
					
						
							| 
									
										
										
										
											2023-11-28 15:39:04 +00:00
										 |  |  |         <% unless  @version.detected_from_url? %> | 
					
						
							| 
									
										
										
										
											2025-06-22 18:05:47 +03:00
										 |  |  |           version "#{@version.to_s.delete_prefix("v")}" | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         <% end  %> | 
					
						
							| 
									
										
										
										
											2023-11-29 18:43:03 +00:00
										 |  |  |           sha256 "#{@sha256}" | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         <% end  %> | 
					
						
							| 
									
										
										
										
											2023-11-28 15:46:01 +00:00
										 |  |  |           license "#{@license}" | 
					
						
							| 
									
										
										
										
											2023-11-27 20:16:45 +00:00
										 |  |  |         <% if  @head %> | 
					
						
							| 
									
										
										
										
											2023-11-29 18:48:06 +00:00
										 |  |  |           head "#{@url}" | 
					
						
							| 
									
										
										
										
											2020-07-14 17:37:55 -07:00
										 |  |  |         <% end  %> | 
					
						
							| 
									
										
										
										
											2019-07-17 14:26:32 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-14 11:12:25 +02:00
										 |  |  |         <% if  @mode == :cabal %> | 
					
						
							|  |  |  |           depends_on "cabal-install" => :build | 
					
						
							|  |  |  |           depends_on "ghc" => :build | 
					
						
							|  |  |  |         <% elsif  @mode == :cmake %> | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           depends_on "cmake" => :build | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :crystal %> | 
					
						
							| 
									
										
										
										
											2020-06-25 17:17:42 +02:00
										 |  |  |           depends_on "crystal" => :build | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :go %> | 
					
						
							| 
									
										
										
										
											2019-09-20 16:09:01 +02:00
										 |  |  |           depends_on "go" => :build | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :meson %> | 
					
						
							| 
									
										
										
										
											2019-05-12 09:14:25 +01:00
										 |  |  |           depends_on "meson" => :build | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           depends_on "ninja" => :build | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :node %> | 
					
						
							| 
									
										
										
										
											2020-07-12 21:25:01 -07:00
										 |  |  |           depends_on "node" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :perl %> | 
					
						
							| 
									
										
										
										
											2019-09-25 21:52:16 +02:00
										 |  |  |           uses_from_macos "perl" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :python %> | 
					
						
							| 
									
										
										
										
											2025-02-05 14:09:27 +08:00
										 |  |  |           depends_on "#{latest_versioned_formula("python")}" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :ruby %> | 
					
						
							| 
									
										
										
										
											2020-03-21 15:32:52 +01:00
										 |  |  |           uses_from_macos "ruby" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :rust %> | 
					
						
							| 
									
										
										
										
											2019-09-25 14:29:09 +02:00
										 |  |  |           depends_on "rust" => :build | 
					
						
							| 
									
										
										
										
											2025-02-21 14:53:34 +01:00
										 |  |  |         <% elsif  @mode == :zig %> | 
					
						
							|  |  |  |           depends_on "zig" => :build | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode.nil? %> | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           # depends_on "cmake" => :build | 
					
						
							|  |  |  |         <% end  %> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-30 12:51:58 +08:00
										 |  |  |         <% if  @mode == :perl || :python || :ruby %> | 
					
						
							| 
									
										
										
										
											2019-09-25 21:52:16 +02:00
										 |  |  |           # Additional dependency | 
					
						
							| 
									
										
										
										
											2019-09-25 13:41:56 +02:00
										 |  |  |           # resource "" do | 
					
						
							|  |  |  |           #   url "" | 
					
						
							|  |  |  |           #   sha256 "" | 
					
						
							|  |  |  |           # end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <% end  %> | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |           def install | 
					
						
							| 
									
										
										
										
											2025-05-14 11:12:25 +02:00
										 |  |  |         <% if  @mode == :cabal %> | 
					
						
							|  |  |  |             system "cabal", "v2-update" | 
					
						
							|  |  |  |             system "cabal", "v2-install", *std_cabal_v2_args | 
					
						
							|  |  |  |         <% elsif  @mode == :cmake %> | 
					
						
							| 
									
										
										
										
											2021-03-15 03:22:41 +00:00
										 |  |  |             system "cmake", "-S", ".", "-B", "build", *std_cmake_args | 
					
						
							|  |  |  |             system "cmake", "--build", "build" | 
					
						
							|  |  |  |             system "cmake", "--install", "build" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :autotools %> | 
					
						
							| 
									
										
										
										
											2023-12-28 15:55:22 -05:00
										 |  |  |             # Remove unrecognized options if they cause configure to fail | 
					
						
							| 
									
										
										
										
											2021-03-08 12:57:35 -08:00
										 |  |  |             # https://rubydoc.brew.sh/Formula.html#std_configure_args-instance_method | 
					
						
							| 
									
										
										
										
											2023-12-28 15:55:22 -05:00
										 |  |  |             system "./configure", "--disable-silent-rules", *std_configure_args | 
					
						
							| 
									
										
										
										
											2021-03-15 03:22:41 +00:00
										 |  |  |             system "make", "install" # if this fails, try separate make/make install steps | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :crystal %> | 
					
						
							| 
									
										
										
										
											2020-06-25 17:17:42 +02:00
										 |  |  |             system "shards", "build", "--release" | 
					
						
							|  |  |  |             bin.install "bin/#{name}" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :go %> | 
					
						
							| 
									
										
										
										
											2021-08-22 14:30:26 -04:00
										 |  |  |             system "go", "build", *std_go_args(ldflags: "-s -w") | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :meson %> | 
					
						
							| 
									
										
										
										
											2022-11-30 12:27:46 -08:00
										 |  |  |             system "meson", "setup", "build", *std_meson_args | 
					
						
							|  |  |  |             system "meson", "compile", "-C", "build", "--verbose" | 
					
						
							|  |  |  |             system "meson", "install", "-C", "build" | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :node %> | 
					
						
							| 
									
										
										
										
											2024-07-25 22:24:09 -07:00
										 |  |  |             system "npm", "install", *std_npm_args | 
					
						
							| 
									
										
										
										
											2020-07-12 21:25:01 -07:00
										 |  |  |             bin.install_symlink Dir["\#{libexec}/bin/*"] | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :perl %> | 
					
						
							| 
									
										
										
										
											2019-09-25 21:52:16 +02:00
										 |  |  |             ENV.prepend_create_path "PERL5LIB", libexec/"lib/perl5" | 
					
						
							|  |  |  |             ENV.prepend_path "PERL5LIB", libexec/"lib" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-30 11:10:23 +02:00
										 |  |  |             # Stage additional dependency (`Makefile.PL` style). | 
					
						
							| 
									
										
										
										
											2019-09-25 21:52:16 +02:00
										 |  |  |             # resource("").stage do | 
					
						
							|  |  |  |             #   system "perl", "Makefile.PL", "INSTALL_BASE=\#{libexec}" | 
					
						
							|  |  |  |             #   system "make" | 
					
						
							|  |  |  |             #   system "make", "install" | 
					
						
							|  |  |  |             # end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-30 11:10:23 +02:00
										 |  |  |             # Stage additional dependency (`Build.PL` style). | 
					
						
							| 
									
										
										
										
											2019-09-25 21:52:16 +02:00
										 |  |  |             # resource("").stage do | 
					
						
							|  |  |  |             #   system "perl", "Build.PL", "--install_base", libexec | 
					
						
							|  |  |  |             #   system "./Build" | 
					
						
							|  |  |  |             #   system "./Build", "install" | 
					
						
							|  |  |  |             # end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             bin.install name | 
					
						
							| 
									
										
										
										
											2020-12-28 14:17:36 -08:00
										 |  |  |             bin.env_script_all_files(libexec/"bin", PERL5LIB: ENV["PERL5LIB"]) | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :python %> | 
					
						
							| 
									
										
										
										
											2019-09-24 19:34:34 +02:00
										 |  |  |             virtualenv_install_with_resources | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :ruby %> | 
					
						
							| 
									
										
										
										
											2025-05-23 20:58:02 -07:00
										 |  |  |             ENV["BUNDLE_VERSION"] = "system" # Avoid installing Bundler into the keg | 
					
						
							| 
									
										
										
										
											2020-03-21 15:32:52 +01:00
										 |  |  |             ENV["GEM_HOME"] = libexec | 
					
						
							| 
									
										
										
										
											2025-01-30 12:51:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-23 20:58:02 -07:00
										 |  |  |             system "bundle", "config", "set", "without", "development", "test" | 
					
						
							|  |  |  |             system "bundle", "install" | 
					
						
							| 
									
										
										
										
											2020-03-21 15:32:52 +01:00
										 |  |  |             system "gem", "build", "\#{name}.gemspec" | 
					
						
							| 
									
										
										
										
											2025-01-30 12:51:58 +08:00
										 |  |  |             system "gem", "install", "\#{name}-\#{version}.gem" | 
					
						
							| 
									
										
										
										
											2025-05-23 20:58:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-21 15:32:52 +01:00
										 |  |  |             bin.install libexec/"bin/\#{name}" | 
					
						
							| 
									
										
										
										
											2020-12-28 14:17:36 -08:00
										 |  |  |             bin.env_script_all_files(libexec/"bin", GEM_HOME: ENV["GEM_HOME"]) | 
					
						
							| 
									
										
										
										
											2023-11-28 18:07:32 +00:00
										 |  |  |         <% elsif  @mode == :rust %> | 
					
						
							| 
									
										
										
										
											2020-06-22 13:24:41 +02:00
										 |  |  |             system "cargo", "install", *std_cargo_args | 
					
						
							| 
									
										
										
										
											2025-02-21 14:53:34 +01:00
										 |  |  |         <% elsif  @mode == :zig %> | 
					
						
							|  |  |  |             system "zig", "build", *std_zig_args | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         <% else  %> | 
					
						
							| 
									
										
										
										
											2023-12-28 15:55:22 -05:00
										 |  |  |             # Remove unrecognized options if they cause configure to fail | 
					
						
							| 
									
										
										
										
											2021-03-08 12:57:35 -08:00
										 |  |  |             # https://rubydoc.brew.sh/Formula.html#std_configure_args-instance_method | 
					
						
							| 
									
										
										
										
											2023-12-28 15:55:22 -05:00
										 |  |  |             system "./configure", "--disable-silent-rules", *std_configure_args | 
					
						
							| 
									
										
										
										
											2021-03-15 03:22:41 +00:00
										 |  |  |             # system "cmake", "-S", ".", "-B", "build", *std_cmake_args | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |         <% end  %> | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           test do | 
					
						
							|  |  |  |             # `test do` will create, run in and delete a temporary directory. | 
					
						
							|  |  |  |             # | 
					
						
							|  |  |  |             # This test will fail and we won't accept that! For Homebrew/homebrew-core | 
					
						
							|  |  |  |             # this will need to be a test that verifies the functionality of the | 
					
						
							|  |  |  |             # software. Run the test with `brew test #{name}`. Options passed | 
					
						
							|  |  |  |             # to `brew install` such as `--HEAD` also need to be provided to `brew test`. | 
					
						
							|  |  |  |             # | 
					
						
							|  |  |  |             # The installed folder is not in the path, so use the entire path to any | 
					
						
							| 
									
										
										
										
											2024-08-09 11:58:51 -07:00
										 |  |  |             # executables being tested: `system bin/"program", "do", "something"`. | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |             system "false" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2018-07-11 15:17:40 +02:00
										 |  |  |       ERB | 
					
						
							| 
									
										
										
										
											2018-06-03 15:28:48 +05:30
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |