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:



183
184
185
186
187
188
189
# File 'development_tools.rb', line 183

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)


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

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)


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

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:



84
85
86
87
88
89
90
91
92
93
# File 'development_tools.rb', line 84

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:



69
70
71
72
73
74
75
76
77
78
# File 'development_tools.rb', line 69

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.



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

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)


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

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)


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

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 = host_gcc_path.to_s) ⇒ Version

Get the GCC version.

Parameters:

  • cc (String) (defaults to: host_gcc_path.to_s)

Returns:



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'development_tools.rb', line 119

def gcc_version(cc = host_gcc_path.to_s)
  (@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:



111
112
113
# File 'development_tools.rb', line 111

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

.ld64_versionVersion

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:



61
62
63
# File 'development_tools.rb', line 61

def ld64_version
  Version::NULL
end

.llvm_clang_build_versionVersion

Get the LLVM Clang build version.

Returns:



99
100
101
102
103
104
105
106
107
108
# File 'development_tools.rb', line 99

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)


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

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)


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

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)


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

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)


178
179
180
# File 'development_tools.rb', line 178

def subversion_handles_most_https_certificates?
  true
end