Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

move dev-cmd/bottle methods to extend/os #14479

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 10 additions & 32 deletions Library/Homebrew/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
require "erb"
require "utils/gzip"
require "api"
require "extend/os/dev-cmd/bottle"

BOTTLE_ERB = <<-EOS
bottle do
Expand Down Expand Up @@ -233,38 +234,26 @@ def sudo_purge
system "/usr/bin/sudo", "--non-interactive", "/usr/sbin/purge"
end

def setup_tar_and_args!(args, mtime)
def setup_tar_and_args!(_args, _mtime)
# Without --only-json-tab bottles are never reproducible
default_tar_args = ["tar", [].freeze].freeze
return default_tar_args unless args.only_json_tab?
["tar", [].freeze].freeze
end

alias generic_setup_tar_and_args! setup_tar_and_args!

def gnutar_args(mtime)
# Ensure tar is set up for reproducibility.
# https://reproducible-builds.org/docs/archives/
gnutar_args = [
[
"--format", "pax", "--owner", "0", "--group", "0", "--sort", "name", "--mtime=#{mtime}",
# Set exthdr names to exclude PID (for GNU tar <1.33). Also don't store atime and ctime.
"--pax-option", "globexthdr.name=/GlobalHead.%n,exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime"
].freeze

# TODO: Refactor and move to extend/os
return ["tar", gnutar_args].freeze if OS.linux? # rubocop:disable Homebrew/MoveToExtendOS

# Use gnu-tar on macOS as it can be set up for reproducibility better than libarchive.
begin
gnu_tar = Formula["gnu-tar"]
rescue FormulaUnavailableError
return default_tar_args
end

ensure_formula_installed!(gnu_tar, reason: "bottling")

["#{gnu_tar.opt_bin}/gtar", gnutar_args].freeze
end

def formula_ignores(f)
ignores = []
cellar_regex = Regexp.escape(HOMEBREW_CELLAR)
prefix_regex = Regexp.escape(HOMEBREW_PREFIX)

# Ignore matches to go keg, because all go binaries are statically linked.
any_go_deps = f.deps.any? do |dep|
Expand All @@ -275,22 +264,11 @@ def formula_ignores(f)
ignores << %r{#{cellar_regex}/#{go_regex}/[\d.]+/libexec}
end

# TODO: Refactor and move to extend/os
# rubocop:disable Homebrew/MoveToExtendOS
ignores << case f.name
# On Linux, GCC installation can be moved so long as the whole directory tree is moved together:
# https://gcc-help.gcc.gnu.narkive.com/GnwuCA7l/moving-gcc-from-the-installation-path-is-it-allowed.
when Version.formula_optionally_versioned_regex(:gcc)
Regexp.union(%r{#{cellar_regex}/gcc}, %r{#{prefix_regex}/opt/gcc}) if OS.linux?
# binutils is relocatable for the same reason: https://github.com/Homebrew/brew/pull/11899#issuecomment-906804451.
when Version.formula_optionally_versioned_regex(:binutils)
%r{#{cellar_regex}/binutils} if OS.linux?
end
# rubocop:enable Homebrew/MoveToExtendOS

ignores.compact
end

alias generic_formula_ignores formula_ignores

def bottle_formula(f, args:)
local_bottle_json = args.json? && f.local_bottle_path.present?

Expand Down
8 changes: 8 additions & 0 deletions Library/Homebrew/extend/os/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# typed: strict
# frozen_string_literal: true

if OS.mac?
require "extend/os/mac/dev-cmd/bottle"
elsif OS.linux?
require "extend/os/linux/dev-cmd/bottle"
end
34 changes: 34 additions & 0 deletions Library/Homebrew/extend/os/linux/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# typed: false
# frozen_string_literal: true

module Homebrew
extend T::Sig

module_function

def setup_tar_and_args!(args, mtime)
default_tar_args = generic_setup_tar_and_args!(args, mtime)
return default_tar_args unless args.only_json_tab?

["tar", gnutar_args(mtime)].freeze
end

def formula_ignores(f)
cellar_regex = Regexp.escape(HOMEBREW_CELLAR)
prefix_regex = Regexp.escape(HOMEBREW_PREFIX)

ignores = generic_formula_ignores(f)

ignores << case f.name
# On Linux, GCC installation can be moved so long as the whole directory tree is moved together:
# https://gcc-help.gcc.gnu.narkive.com/GnwuCA7l/moving-gcc-from-the-installation-path-is-it-allowed.
when Version.formula_optionally_versioned_regex(:gcc)
Regexp.union(%r{#{cellar_regex}/gcc}, %r{#{prefix_regex}/opt/gcc})
# binutils is relocatable for the same reason: https://github.com/Homebrew/brew/pull/11899#issuecomment-906804451.
when Version.formula_optionally_versioned_regex(:binutils)
%r{#{cellar_regex}/binutils}
end

ignores.compact
end
end
24 changes: 24 additions & 0 deletions Library/Homebrew/extend/os/mac/dev-cmd/bottle.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# typed: false
# frozen_string_literal: true

module Homebrew
extend T::Sig

module_function

def setup_tar_and_args!(args, mtime)
default_tar_args = generic_setup_tar_and_args!(args, mtime)
return default_tar_args unless args.only_json_tab?

# Use gnu-tar on macOS as it can be set up for reproducibility better than libarchive.
begin
gnu_tar = Formula["gnu-tar"]
rescue FormulaUnavailableError
return default_tar_args
end

ensure_formula_installed!(gnu_tar, reason: "bottling")

["#{gnu_tar.opt_bin}/gtar", gnutar_args(mtime)].freeze
end
end