Module: OS::Mac::CLT Private

Extended by:
T::Sig
Defined in:
os/mac/xcode.rb,
os/linux.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 macOS Command Line Tools information.

Constant Summary collapse

EXECUTABLE_PKG_ID =

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

The original Mavericks CLT package ID

"com.apple.pkg.CLTools_Executables"
MAVERICKS_NEW_PKG_ID =

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

obsolete

"com.apple.pkg.CLTools_Base"
PKG_PATH =

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

"/Library/Developer/CommandLineTools"

Class Method Summary collapse

Class Method Details

.below_minimum_version?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)


348
349
350
351
352
# File 'os/mac/xcode.rb', line 348

def below_minimum_version?
  return false unless installed?

  version < minimum_version
end

.detect_clang_versionObject

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.



362
363
364
365
# File 'os/mac/xcode.rb', line 362

def detect_clang_version
  version_output = Utils.popen_read("#{PKG_PATH}/usr/bin/clang", "--version")
  version_output[/clang-(\d+\.\d+\.\d+(\.\d+)?)/, 1]
end

.detect_versionObject

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.



382
383
384
385
386
387
388
389
390
391
392
# File 'os/mac/xcode.rb', line 382

def detect_version
  version = nil
  [EXECUTABLE_PKG_ID, MAVERICKS_NEW_PKG_ID].each do |id|
    next unless File.exist?("#{PKG_PATH}/usr/bin/clang")

    version = MacOS.pkgutil_info(id)[/version: (.+)$/, 1]
    return version if version
  end

  detect_version_from_clang_version
end

.detect_version_from_clang_versionObject

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.



367
368
369
# File 'os/mac/xcode.rb', line 367

def detect_version_from_clang_version
  detect_clang_version&.sub(/^(\d+)0(\d)\./, "\\1.\\2.")
end

.installation_instructionsObject

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.



278
279
280
281
282
283
284
285
286
287
288
289
290
291
# File 'os/mac/xcode.rb', line 278

def installation_instructions
  if MacOS.version == "10.14"
    # This is not available from `xcode-select`
    <<~EOS
      Install the Command Line Tools for Xcode 11.3.1 from:
        #{Formatter.url("https://developer.apple.com/download/more/")}
    EOS
  else
    <<~EOS
      Install the Command Line Tools:
        xcode-select --install
    EOS
  end
end

.installed?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 true even if outdated tools are installed.

Returns:

  • (Boolean)


254
255
256
# File 'os/mac/xcode.rb', line 254

def installed?
  false
end

.latest_clang_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.

Bump these when the new version is distributed through Software Update and our CI systems have been updated.

Returns:



318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'os/mac/xcode.rb', line 318

def latest_clang_version
  case MacOS.version
  when "12"    then "1300.0.18.6"
  when "11"    then "1205.0.22.9"
  when "10.15" then "1200.0.32.29"
  when "10.14" then "1100.0.33.17"
  when "10.13" then "1000.10.44.2"
  when "10.12" then "900.0.39.2"
  when "10.11" then "800.0.42.1"
  when "10.10" then "700.1.81"
  else              "600.0.57"
  end
end

.minimum_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.

Bump these if things are badly broken (e.g. no SDK for this macOS) without this. Generally this will be the first stable CLT release on that macOS version.

Returns:



336
337
338
339
340
341
342
343
344
345
346
# File 'os/mac/xcode.rb', line 336

def minimum_version
  case MacOS.version
  when "12" then "13.0.0"
  when "11" then "12.0.0"
  when "10.15" then "11.0.0"
  when "10.14" then "10.0.0"
  when "10.13" then "9.0.0"
  when "10.12" then "8.0.0"
  else              "1.0.0"
  end
end

.outdated?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)


355
356
357
358
359
360
# File 'os/mac/xcode.rb', line 355

def outdated?
  clang_version = detect_clang_version
  return false unless clang_version

  ::Version.new(clang_version) < latest_clang_version
end

.provides_sdk?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)


262
263
264
# File 'os/mac/xcode.rb', line 262

def provides_sdk?
  version >= "8"
end

.sdk(v = nil) ⇒ Object

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.



270
271
272
# File 'os/mac/xcode.rb', line 270

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

.sdk_locatorObject

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.



266
267
268
# File 'os/mac/xcode.rb', line 266

def sdk_locator
  @sdk_locator ||= CLTSDKLocator.new
end

.sdk_path(v = nil) ⇒ Object

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.



274
275
276
# File 'os/mac/xcode.rb', line 274

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

.separate_header_package?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)


258
259
260
# File 'os/mac/xcode.rb', line 258

def separate_header_package?
  version >= "10" && MacOS.version >= "10.14"
end

.update_instructionsString

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:



294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
# File 'os/mac/xcode.rb', line 294

def update_instructions
  software_update_location = if MacOS.version >= "10.14"
    "System Preferences"
  else
    "the App Store"
  end

  <<~EOS
    Update them from Software Update in #{software_update_location} or run:
      softwareupdate --all --install --force

    If that doesn't show you any updates, run:
      sudo rm -rf /Library/Developer/CommandLineTools
      sudo xcode-select --install

    Alternatively, manually download them from:
      #{Formatter.url("https://developer.apple.com/download/more/")}.
    You should download the Command Line Tools for Xcode #{MacOS::Xcode.latest_version}.
  EOS
end

.versionObject

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.

Version string (a pretty long one) of the CLT package. Note that the different ways of installing the CLTs lead to different version numbers.



374
375
376
# File 'os/mac/xcode.rb', line 374

def version
  Version::NULL
end