Module: OS::Mac::CLT Private

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)


381
382
383
384
385
# File 'os/mac/xcode.rb', line 381

def self.below_minimum_version?
  return false unless installed?

  version < minimum_version
end

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

Returns:



396
397
398
399
# File 'os/mac/xcode.rb', line 396

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

.detect_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:



420
421
422
423
424
425
426
427
428
429
430
# File 'os/mac/xcode.rb', line 420

def self.detect_version
  version = T.let(nil, T.nilable(String))
  [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_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:



402
403
404
# File 'os/mac/xcode.rb', line 402

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

.installation_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:



308
309
310
311
312
313
314
315
316
317
318
319
320
321
# File 'os/mac/xcode.rb', line 308

def self.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(MacOS::Xcode::APPLE_DEVELOPER_DOWNLOAD_URL)}
    EOS
  else
    <<~EOS
      Install the Command Line Tools:
        xcode-select --install
    EOS
  end
end

.installed?Boolean

Returns true even if outdated tools are installed.

Returns:

  • (Boolean)


110
111
112
113
# File 'os/linux.rb', line 110

def self.installed?
  odeprecated "`MacOS::CLT.installed?` on Linux"
  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:



349
350
351
352
353
354
355
356
357
358
359
360
# File 'os/mac/xcode.rb', line 349

def self.latest_clang_version
  case MacOS.version
  when "14", "13" then "1500.1.0.2.5"
  when "12"    then "1400.0.29.202"
  when "11"    then "1300.0.29.30"
  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"
  else              "800.0.42.1"
  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:



366
367
368
369
370
371
372
373
374
375
376
377
378
# File 'os/mac/xcode.rb', line 366

def self.minimum_version
  case MacOS.version
  when "14" then "15.0.0"
  when "13" then "14.0.0"
  when "12" then "13.0.0"
  when "11" then "12.5.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              "7.3.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)


388
389
390
391
392
393
# File 'os/mac/xcode.rb', line 388

def self.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)


288
289
290
# File 'os/mac/xcode.rb', line 288

def self.provides_sdk?
  version >= "8"
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.

Parameters:

Returns:



298
299
300
# File 'os/mac/xcode.rb', line 298

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

.sdk_locatorCLTSDKLocator

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:



293
294
295
# File 'os/mac/xcode.rb', line 293

def self.sdk_locator
  @sdk_locator ||= CLTSDKLocator.new
end

.sdk_path(version = nil) ⇒ 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:



303
304
305
# File 'os/mac/xcode.rb', line 303

def self.sdk_path(version = nil)
  sdk(version)&.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)


283
284
285
# File 'os/mac/xcode.rb', line 283

def self.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:



324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# File 'os/mac/xcode.rb', line 324

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

  <<~EOS
    Update them from Software Update in #{software_update_location}.

    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(MacOS::Xcode::APPLE_DEVELOPER_DOWNLOAD_URL)}.
    You should download the Command Line Tools for Xcode #{MacOS::Xcode.latest_version}.
  EOS
end

.version::Version

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

Returns:



105
106
107
108
# File 'os/linux.rb', line 105

def self.version
  odeprecated "`MacOS::CLT.version` on Linux"
  ::Version::NULL
end