Class: DevelopmentTools

Inherits:
Object show all
Defined in:
development_tools.rb

Overview

Helper class for gathering information about development tools.

Class Method Summary collapse

Class Method Details

.build_system_infoHash{String => String, nil}

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:



178
179
180
181
182
183
184
# File 'development_tools.rb', line 178

def build_system_info
  {
    "os"         => HOMEBREW_SYSTEM,
    "os_version" => OS_VERSION,
    "cpu_family" => Hardware::CPU.family.to_s,
  }
end

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


150
151
152
153
154
# File 'development_tools.rb', line 150

def ca_file_handles_most_https_certificates?
  # The system CA file is too old for some modern HTTPS certificates on
  # older OS versions.
  ENV["HOMEBREW_SYSTEM_CA_CERTIFICATES_TOO_OLD"].nil?
end

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


162
163
164
165
# File 'development_tools.rb', line 162

def ca_file_substitution_required?
  (!ca_file_handles_most_https_certificates? || ENV["HOMEBREW_FORCE_BREWED_CA_CERTIFICATES"].present?) &&
    !(HOMEBREW_PREFIX/"etc/ca-certificates/cert.pem").exist?
end

.clang_build_versionVersion

Get the Clang build version.

Returns:



79
80
81
82
83
84
85
86
87
88
# File 'development_tools.rb', line 79

def clang_build_version
  @clang_build_version ||= T.let(
    if (path = locate("clang")) &&
      (build_version = `#{path} --version`[%r{clang(-| version [^ ]+ \(tags/RELEASE_)(\d{2,})}, 2])
      Version.new(build_version)
    else
      Version::NULL
    end, T.nilable(Version)
  )
end

.clang_versionVersion

Get the Clang version.

Returns:



64
65
66
67
68
69
70
71
72
73
# File 'development_tools.rb', line 64

def clang_version
  @clang_version ||= T.let(
    if (path = locate("clang")) &&
       (build_version = `#{path} --version`[/(?:clang|LLVM) version (\d+\.\d(?:\.\d)?)/, 1])
      Version.new(build_version)
    else
      Version::NULL
    end, T.nilable(Version)
  )
end

.clear_version_cachevoid

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.



129
130
131
132
# File 'development_tools.rb', line 129

def clear_version_cache
  @clang_version = @clang_build_version = T.let(nil, T.nilable(Version))
  @gcc_version = T.let({}, T.nilable(T::Hash[String, Version]))
end

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


157
158
159
# File 'development_tools.rb', line 157

def curl_handles_most_https_certificates?
  true
end

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


168
169
170
# File 'development_tools.rb', line 168

def curl_substitution_required?
  !curl_handles_most_https_certificates? && !HOMEBREW_BREWED_CURL_PATH.exist?
end

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



40
41
42
# File 'development_tools.rb', line 40

def custom_installation_instructions
  installation_instructions
end

.default_compilerSymbol

Get the default C compiler.

Returns:



56
57
58
# File 'development_tools.rb', line 56

def default_compiler
  :clang
end

.gcc_version(cc) ⇒ Version

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.

Get the GCC version.

Parameters:

Returns:



114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'development_tools.rb', line 114

def gcc_version(cc)
  (@gcc_version ||= T.let({}, T.nilable(T::Hash[String, Version]))).fetch(cc) do
    path = HOMEBREW_PREFIX/"opt/#{CompilerSelector.preferred_gcc}/bin"/cc
    path = locate(cc) unless path.exist?
    version = if path &&
                 (build_version = `#{path} --version`[/gcc(?:(?:-\d+(?:\.\d)?)? \(.+\))? (\d+\.\d\.\d)/, 1])
      Version.new(build_version)
    else
      Version::NULL
    end
    @gcc_version[cc] = version
  end
end

.host_gcc_pathPathname

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:



106
107
108
# File 'development_tools.rb', line 106

def host_gcc_path
  Pathname.new("/usr/bin/gcc")
end

.insecure_download_warning(resource) ⇒ 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:



45
46
47
48
49
50
# File 'development_tools.rb', line 45

def insecure_download_warning(resource)
  package = curl_handles_most_https_certificates? ? "ca-certificates" : "curl"
  "Using `--insecure` with curl to download #{resource} because we need it to run " \
    "`brew install #{package}` in order to download securely from now on. " \
    "Checksums will still be verified."
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:



35
36
37
# File 'development_tools.rb', line 35

def installation_instructions
  "Install Clang or run `brew install gcc`."
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:

  • (Boolean)


30
31
32
# File 'development_tools.rb', line 30

def installed?
  locate("clang").present? || locate("gcc").present?
end

.llvm_clang_build_versionVersion

Get the LLVM Clang build version.

Returns:



94
95
96
97
98
99
100
101
102
103
# File 'development_tools.rb', line 94

def llvm_clang_build_version
  @llvm_clang_build_version ||= T.let(begin
    path = Formulary.factory("llvm").opt_prefix/"bin/clang"
    if path.executable? && (build_version = `#{path} --version`[/clang version (\d+\.\d\.\d)/, 1])
      Version.new(build_version)
    else
      Version::NULL
    end
  end, T.nilable(Version))
end

.locate(tool) ⇒ Pathname?

Locate a development tool.

Parameters:

Returns:



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'development_tools.rb', line 15

def locate(tool)
  # Don't call tools (cc, make, strip, etc.) directly!
  # Give the name of the binary you look for as a string to this method
  # in order to get the full path back as a Pathname.
  (@locate ||= T.let({}, T.nilable(T::Hash[T.any(String, Symbol), T.untyped]))).fetch(tool) do |key|
    @locate[key] = if File.executable?((path = "/usr/bin/#{tool}"))
      Pathname.new path
    # Homebrew GCCs most frequently; much faster to check this before xcrun
    elsif (path = HOMEBREW_PREFIX/"bin/#{tool}").executable?
      path
    end
  end
end

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


135
136
137
# File 'development_tools.rb', line 135

def needs_build_formulae?
  needs_libc_formula? || needs_compiler_formula?
end

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


145
146
147
# File 'development_tools.rb', line 145

def needs_compiler_formula?
  false
end

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


140
141
142
# File 'development_tools.rb', line 140

def needs_libc_formula?
  false
end

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


173
174
175
# File 'development_tools.rb', line 173

def subversion_handles_most_https_certificates?
  true
end