Module: OS::Mac Private

Extended by:
Utils::Output::Mixin
Defined in:
os/mac.rb,
extend/os/mac/keg.rb,
extend/os/mac/tap.rb,
extend/os/mac/cleaner.rb,
extend/os/mac/cleanup.rb,
extend/os/mac/formula.rb,
extend/os/mac/readall.rb,
extend/os/mac/sandbox.rb,
extend/os/mac/cask/dsl.rb,
extend/os/mac/cmd/info.rb,
extend/os/mac/hardware.rb,
extend/os/mac/reinstall.rb,
extend/os/mac/diagnostic.rb,
extend/os/mac/hardware/cpu.rb,
extend/os/mac/keg_relocate.rb,
extend/os/mac/utils/socket.rb,
extend/os/mac/dev-cmd/tests.rb,
extend/os/mac/language/java.rb,
extend/os/mac/system_config.rb,
extend/os/mac/utils/bottles.rb,
extend/os/mac/bundle/skipper.rb,
extend/os/mac/dev-cmd/bottle.rb,
extend/os/mac/extend/ENV/std.rb,
extend/os/mac/extend/pathname.rb,
extend/os/mac/linkage_checker.rb,
extend/os/mac/missing_formula.rb,
extend/os/mac/simulate_system.rb,
extend/os/mac/extend/ENV/super.rb,
extend/os/mac/development_tools.rb,
extend/os/mac/extend/ENV/shared.rb,
extend/os/mac/formula_installer.rb,
extend/os/mac/cask/artifact/moved.rb,
extend/os/mac/dependency_collector.rb,
extend/os/mac/formula_cellar_checks.rb,
extend/os/mac/cask/artifact/symlinked.rb,
extend/os/mac/cask/artifact/abstract_uninstall.rb,
cask/macos.rb,
os/mac/sdk.rb,
os/mac/xcode.rb

Overview

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Helper module for querying system information on macOS.

Defined Under Namespace

Modules: Bottles, Bundle, CLT, Cask, Cleaner, Cleanup, Cmd, DependencyCollector, DevCmd, DevelopmentTools, Diagnostic, Formula, FormulaCellarChecks, FormulaInstaller, Hardware, Keg, Language, LinkageChecker, MissingFormula, Pathname, Readall, Reinstall, Sandbox, SharedEnvExtension, SimulateSystem, Stdenv, Superenv, SystemConfig, Tap, UNIXSocketExt, Xcode Classes: CLTSDKLocator, SDK, XcodeSDKLocator

Class Method Summary collapse

Methods included from Utils::Output::Mixin

odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, pretty_deprecated, pretty_disabled, pretty_duration, pretty_installed, pretty_outdated, pretty_uninstalled

Class Method Details

.active_developer_dirString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



98
99
100
101
102
103
# File 'os/mac.rb', line 98

def self.active_developer_dir
  @active_developer_dir ||= T.let(
    Utils.popen_read("/usr/bin/xcode-select", "-print-path").strip,
    T.nilable(String),
  )
end

.app_with_bundle_id(*ids) ⇒ ::Pathname?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



180
181
182
183
184
185
186
187
188
189
190
# File 'os/mac.rb', line 180

def self.app_with_bundle_id(*ids)
  require "bundle_version"

  paths = mdfind(*ids).filter_map do |bundle_path|
    ::Pathname.new(bundle_path) if bundle_path.exclude?("/Backups.backupdb/")
  end
  return paths.first unless paths.all? { |bp| (bp/"Contents/Info.plist").exist? }

  # Prefer newest one, if we can find it.
  paths.max_by { |bundle_path| Homebrew::BundleVersion.from_info_plist(bundle_path/"Contents/Info.plist") }
end

.full_versionMacOSVersion

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This can be compared to numerics, strings, or symbols using the standard Ruby Comparable methods.

Returns:



41
42
43
44
45
46
47
48
49
50
51
# File 'os/mac.rb', line 41

def self.full_version
  @full_version ||= T.let(nil, T.nilable(MacOSVersion))
  # HOMEBREW_FAKE_MACOS is set system-wide in the macOS 11-arm64-cross image
  # for building a macOS 11 Portable Ruby on macOS 12
  # odisabled: remove support for Big Sur September (or later) 2027
  @full_version ||= if (fake_macos = ENV.fetch("HOMEBREW_FAKE_MACOS", nil))
    MacOSVersion.new(fake_macos)
  else
    MacOSVersion.new(VERSION)
  end
end

.full_version=(version) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This method returns an undefined value.

Parameters:



54
55
56
57
# File 'os/mac.rb', line 54

def self.full_version=(version)
  @full_version = MacOSVersion.new(version.chomp)
  @version = nil
end

.languageString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



93
94
95
# File 'os/mac.rb', line 93

def self.language
  languages.first
end

.languagesArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'os/mac.rb', line 78

def self.languages
  @languages ||= T.let(nil, T.nilable(T::Array[String]))
  return @languages if @languages

  os_langs = Utils.popen_read("defaults", "read", "-g", "AppleLanguages")
  if os_langs.blank?
    # User settings don't exist so check the system-wide one.
    os_langs = Utils.popen_read("defaults", "read", "/Library/Preferences/.GlobalPreferences", "AppleLanguages")
  end
  os_langs = T.cast(os_langs.scan(/[^ \n"(),]+/), T::Array[String])

  @languages = os_langs
end

.latest_sdk_version::Version

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



60
61
62
63
64
# File 'os/mac.rb', line 60

def self.latest_sdk_version
  # TODO: bump version when new Xcode macOS SDK is released
  # NOTE: We only track the major version of the SDK.
  ::Version.new("26")
end

.mdfind(*ids) ⇒ Array<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



193
194
195
196
197
198
# File 'os/mac.rb', line 193

def self.mdfind(*ids)
  @mdfind ||= T.let(nil, T.nilable(T::Hash[T::Array[String], T::Array[String]]))
  (@mdfind ||= {}).fetch(ids) do
    @mdfind[ids] = Utils.popen_read("/usr/bin/mdfind", mdfind_query(*ids)).split("\n")
  end
end

.mdfind_query(*ids) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



209
210
211
# File 'os/mac.rb', line 209

def self.mdfind_query(*ids)
  ids.map! { |id| "kMDItemCFBundleIdentifier == #{id}" }.join(" || ")
end

.pkgutil_info(id) ⇒ String

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:



201
202
203
204
205
206
# File 'os/mac.rb', line 201

def self.pkgutil_info(id)
  @pkginfo ||= T.let(nil, T.nilable(T::Hash[String, String]))
  (@pkginfo ||= {}).fetch(id) do |key|
    @pkginfo[key] = Utils.popen_read("/usr/sbin/pkgutil", "--pkg-info", key).strip
  end
end

.preferred_perl_versionString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



67
68
69
70
71
72
73
74
75
# File 'os/mac.rb', line 67

def self.preferred_perl_version
  if version >= :sonoma
    "5.34"
  elsif version >= :big_sur
    "5.30"
  else
    "5.18"
  end
end

.sdk(version = nil) ⇒ SDK?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

If a specific SDK is requested:

1. The requested SDK is returned, if it's installed.
2. If the requested SDK is not installed, the newest SDK (if any SDKs
 are available) is returned.
3. If no SDKs are available, nil is returned.

If no specific SDK is requested, the SDK matching the OS version is returned, if available. Otherwise, the latest SDK is returned.

Parameters:

Returns:



130
131
132
# File 'os/mac.rb', line 130

def self.sdk(version = nil)
  sdk_locator.sdk_if_applicable(version)
end

.sdk_for_formula(formula, version = nil, check_only_runtime_requirements: false) ⇒ SDK?

Returns the path to the SDK needed based on the formula's requirements.

Parameters:

  • formula (Formula)
  • version (MacOSVersion, nil) (defaults to: nil)
  • check_only_runtime_requirements (Boolean) (defaults to: false)

Returns:



144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'os/mac.rb', line 144

def self.sdk_for_formula(formula, version = nil, check_only_runtime_requirements: false)
  # If the formula requires Xcode, don't return the CLT SDK
  # If check_only_runtime_requirements is true, don't necessarily return the
  # Xcode SDK if the XcodeRequirement is only a build or test requirement.
  return Xcode.sdk if formula.requirements.any? do |req|
    next false unless req.is_a? XcodeRequirement
    next false if check_only_runtime_requirements && req.build? && !req.test?

    true
  end

  sdk(version)
end

.sdk_locatorCLTSDKLocator, XcodeSDKLocator

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.



112
113
114
115
116
117
118
# File 'os/mac.rb', line 112

def self.sdk_locator
  if CLT.installed?
    CLT.sdk_locator
  else
    Xcode.sdk_locator
  end
end

.sdk_path(version = nil) ⇒ ::Pathname?

Returns the path to an SDK or nil, following the rules set by sdk.

Parameters:

Returns:



162
163
164
165
# File 'os/mac.rb', line 162

def self.sdk_path(version = nil)
  s = sdk(version)
  s&.path
end

.sdk_path_if_needed(version = nil) ⇒ ::Pathname?

Prefer CLT SDK when both Xcode and the CLT are installed. Expected results:

  1. On Xcode-only systems, return the Xcode SDK.
  2. On CLT-only systems, return the CLT SDK.

Parameters:

Returns:



174
175
176
177
# File 'os/mac.rb', line 174

def self.sdk_path_if_needed(version = nil)
  # odeprecated "MacOS.sdk_path_if_needed", "MacOS.sdk_path"
  sdk_path(version)
end

.sdk_root_needed?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


106
107
108
109
# File 'os/mac.rb', line 106

def self.sdk_root_needed?
  odisabled "OS::Mac.sdk_root_needed?"
  true
end

.system_dir?(dir) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Boolean)


382
383
384
# File 'cask/macos.rb', line 382

def self.system_dir?(dir)
  SYSTEM_DIRS.include?(::Pathname.new(dir).expand_path)
end

.undeletable?(path) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

Returns:

  • (Boolean)


387
388
389
# File 'cask/macos.rb', line 387

def self.undeletable?(path)
  UNDELETABLE_PATHS.include?(::Pathname.new(path).expand_path)
end

.versionMacOSVersion

This method is part of an internal API. This method may only be used internally in repositories owned by Homebrew, except in casks or formulae. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

This can be compared to numerics, strings, or symbols using the standard Ruby Comparable methods.

Returns:



32
33
34
# File 'os/mac.rb', line 32

def self.version
  @version ||= T.let(full_version.strip_patch, T.nilable(MacOSVersion))
end