Module: OS::Mac

Extended by:
T::Sig
Defined in:
brew/Library/Homebrew/os/mac.rb,
brew/Library/Homebrew/os/linux.rb,
brew/Library/Homebrew/cask/macos.rb,
brew/Library/Homebrew/os/mac/sdk.rb,
brew/Library/Homebrew/os/mac/xcode.rb,
brew/Library/Homebrew/os/mac/version.rb,
brew/Library/Homebrew/os/mac/xquartz.rb

Defined Under Namespace

Modules: CLT, XQuartz, Xcode Classes: CLTSDKLocator, SDK, Version, XcodeSDKLocator

Class Method Summary collapse

Class Method Details

.active_developer_dirObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



80
81
82
# File 'brew/Library/Homebrew/os/mac.rb', line 80

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

.app_with_bundle_id(*ids) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



186
187
188
189
190
191
# File 'brew/Library/Homebrew/os/mac.rb', line 186

def app_with_bundle_id(*ids)
  path = mdfind(*ids)
         .reject { |p| p.include?("/Backups.backupdb/") }
         .first
  Pathname.new(path) if path.present?
end

.full_versionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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



33
34
35
# File 'brew/Library/Homebrew/os/mac.rb', line 33

def full_version
  @full_version ||= Version.new((ENV["HOMEBREW_MACOS_VERSION"]).chomp)
end

.full_version=(version) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



37
38
39
40
# File 'brew/Library/Homebrew/os/mac.rb', line 37

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

.languageObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



76
77
78
# File 'brew/Library/Homebrew/os/mac.rb', line 76

def language
  languages.first
end

.languagesObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



63
64
65
66
67
68
69
70
71
72
73
74
# File 'brew/Library/Homebrew/os/mac.rb', line 63

def languages
  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 = os_langs.scan(/[^ \n"(),]+/)

  @languages = os_langs
end

.latest_sdk_versionVersion

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:



43
44
45
46
# File 'brew/Library/Homebrew/os/mac.rb', line 43

def latest_sdk_version
  # TODO: bump version when new Xcode macOS SDK is released
  ::Version.new("11.1")
end

.macports_or_finkObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

See these issues for some history:



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'brew/Library/Homebrew/os/mac.rb', line 157

def macports_or_fink
  paths = []

  # First look in the path because MacPorts is relocatable and Fink
  # may become relocatable in the future.
  %w[port fink].each do |ponk|
    path = which(ponk)
    paths << path unless path.nil?
  end

  # Look in the standard locations, because even if port or fink are
  # not in the path they can still break builds if the build scripts
  # have these paths baked in.
  %w[/sw/bin/fink /opt/local/bin/port].each do |ponk|
    path = Pathname.new(ponk)
    paths << path if path.exist?
  end

  # Finally, some users make their MacPorts or Fink directories
  # read-only in order to try out Homebrew, but this doesn't work as
  # some build scripts error out when trying to read from these now
  # unreadable paths.
  %w[/sw /opt/local].map { |p| Pathname.new(p) }.each do |path|
    paths << path if path.exist? && !path.readable?
  end

  paths.uniq
end

.mdfind(*ids) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



193
194
195
196
197
# File 'brew/Library/Homebrew/os/mac.rb', line 193

def mdfind(*ids)
  (@mdfind ||= {}).fetch(ids) do
    @mdfind[ids] = Utils.popen_read("/usr/bin/mdfind", mdfind_query(*ids)).split("\n")
  end
end

.mdfind_query(*ids) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



205
206
207
# File 'brew/Library/Homebrew/os/mac.rb', line 205

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

.outdated_release?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


49
50
51
52
53
54
# File 'brew/Library/Homebrew/os/mac.rb', line 49

def outdated_release?
  # TODO: bump version when new macOS is released and also update
  # references in docs/Installation.md and
  # https://github.com/Homebrew/install/blob/HEAD/install.sh
  version < "10.14"
end

.pkgutil_info(id) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



199
200
201
202
203
# File 'brew/Library/Homebrew/os/mac.rb', line 199

def pkgutil_info(id)
  (@pkginfo ||= {}).fetch(id) do |key|
    @pkginfo[key] = Utils.popen_read("/usr/sbin/pkgutil", "--pkg-info", key).strip
  end
end

.prerelease?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


56
57
58
59
60
61
# File 'brew/Library/Homebrew/os/mac.rb', line 56

def prerelease?
  # TODO: bump version when new macOS is released or announced
  # and also update references in docs/Installation.md and
  # https://github.com/Homebrew/install/blob/HEAD/install.sh
  version >= "12"
end

.sdk(v = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



114
115
116
# File 'brew/Library/Homebrew/os/mac.rb', line 114

def sdk(v = nil)
  sdk_locator.sdk_if_applicable(v)
end

.sdk_for_formula(f, v = nil, check_only_runtime_requirements: false) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'brew/Library/Homebrew/os/mac.rb', line 118

def sdk_for_formula(f, v = 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 requirment.
  return Xcode.sdk if f.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(v)
end

.sdk_locatorObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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.



106
107
108
109
110
111
112
# File 'brew/Library/Homebrew/os/mac.rb', line 106

def sdk_locator
  if CLT.installed? && CLT.provides_sdk?
    CLT.sdk_locator
  else
    Xcode.sdk_locator
  end
end

.sdk_pathObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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



133
134
135
136
# File 'brew/Library/Homebrew/os/mac.rb', line 133

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

.sdk_path_if_needed(_v = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'brew/Library/Homebrew/os/mac.rb', line 138

def sdk_path_if_needed(v = nil)
  # Prefer CLT SDK when both Xcode and the CLT are installed.
  # Expected results:
  # 1. On Xcode-only systems, return the Xcode SDK.
  # 2. On Xcode-and-CLT systems where headers are provided by the system, return nil.
  # 3. On CLT-only systems with no CLT SDK, return nil.
  # 4. On CLT-only systems with a CLT SDK, where headers are provided by the system, return nil.
  # 5. On CLT-only systems with a CLT SDK, where headers are not provided by the system, return the CLT SDK.

  return unless sdk_root_needed?

  sdk_path(v)
end

.sdk_root_needed?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


85
86
87
88
89
90
91
92
93
94
# File 'brew/Library/Homebrew/os/mac.rb', line 85

def sdk_root_needed?
  if MacOS::CLT.installed?
    # If there's no CLT SDK, return false
    return false unless MacOS::CLT.provides_sdk?
    # If the CLT is installed and headers are provided by the system, return false
    return false unless MacOS::CLT.separate_header_package?
  end

  true
end

.system_dir?(dir) ⇒ Boolean

Returns:

  • (Boolean)


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

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

.undeletable?(path) ⇒ Boolean

Returns:

  • (Boolean)


391
392
393
# File 'brew/Library/Homebrew/cask/macos.rb', line 391

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

.versionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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



27
28
29
# File 'brew/Library/Homebrew/os/mac.rb', line 27

def version
  @version ||= Version.from_symbol(full_version.to_sym)
end