Module: SharedEnvExtension

Included in:
Superenv
Defined in:
Library/Homebrew/extend/ENV/shared.rb,
Library/Homebrew/extend/os/mac/extend/ENV/shared.rb

Overview

Homebrew extends Ruby's ENV to make our code more readable. Implemented in SharedEnvExtension and either Superenv or Stdenv (depending on the build mode).

See Also:

Instance Method Summary collapse

Instance Method Details

#append(keys, value, separator = " ") ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
# File 'Library/Homebrew/extend/ENV/shared.rb', line 58

def append(keys, value, separator = " ")
  value = value.to_s
  Array(keys).each do |key|
    old = self[key]
    if old.nil? || old.empty?
      self[key] = value
    else
      self[key] += separator + value
    end
  end
end

#append_path(key, path) ⇒ Object



82
83
84
# File 'Library/Homebrew/extend/ENV/shared.rb', line 82

def append_path(key, path)
  append key, path, File::PATH_SEPARATOR if File.directory? path
end

#append_to_cflags(newflags) ⇒ Object



50
51
52
# File 'Library/Homebrew/extend/ENV/shared.rb', line 50

def append_to_cflags(newflags)
  append(CC_FLAG_VARS, newflags)
end

#ccObject



113
114
115
# File 'Library/Homebrew/extend/ENV/shared.rb', line 113

def cc
  self["CC"]
end

#cflagsObject



121
122
123
# File 'Library/Homebrew/extend/ENV/shared.rb', line 121

def cflags
  self["CFLAGS"]
end

#compilerSymbol

Outputs the current compiler.

# Do something only for clang
if ENV.compiler == :clang
  # modify CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS in one go:
  ENV.append_to_cflags "-I ./missing/includes"
end

Returns:



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'Library/Homebrew/extend/ENV/shared.rb', line 156

def compiler
  @compiler ||= if (cc = ARGV.cc)
    warn_about_non_apple_gcc($&) if cc =~ GNU_GCC_REGEXP
    fetch_compiler(cc, "--cc")
  elsif (cc = homebrew_cc)
    warn_about_non_apple_gcc($&) if cc =~ GNU_GCC_REGEXP
    compiler = fetch_compiler(cc, "HOMEBREW_CC")

    if @formula
      compilers = [compiler] + CompilerSelector.compilers
      compiler = CompilerSelector.select_for(@formula, compilers)
    end

    compiler
  elsif @formula
    CompilerSelector.select_for(@formula)
  else
    DevelopmentTools.default_compiler
  end
end

#cppflagsObject



129
130
131
# File 'Library/Homebrew/extend/ENV/shared.rb', line 129

def cppflags
  self["CPPFLAGS"]
end

#cxxObject



117
118
119
# File 'Library/Homebrew/extend/ENV/shared.rb', line 117

def cxx
  self["CXX"]
end

#cxxflagsObject



125
126
127
# File 'Library/Homebrew/extend/ENV/shared.rb', line 125

def cxxflags
  self["CXXFLAGS"]
end

#fcObject



137
138
139
# File 'Library/Homebrew/extend/ENV/shared.rb', line 137

def fc
  self["FC"]
end

#fcflagsObject



145
146
147
# File 'Library/Homebrew/extend/ENV/shared.rb', line 145

def fcflags
  self["FCFLAGS"]
end

#fflagsObject



141
142
143
# File 'Library/Homebrew/extend/ENV/shared.rb', line 141

def fflags
  self["FFLAGS"]
end

#fortranObject



217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'Library/Homebrew/extend/ENV/shared.rb', line 217

def fortran
  # Ignore repeated calls to this function as it will misleadingly warn about
  # building with an alternative Fortran compiler without optimization flags,
  # despite it often being the Homebrew-provided one set up in the first call.
  return if @fortran_setup_done
  @fortran_setup_done = true

  flags = []

  if fc
    ohai "Building with an alternative Fortran compiler"
    puts "This is unsupported."
    self["F77"] ||= fc

    if ARGV.include? "--default-fortran-flags"
      flags = FC_FLAG_VARS.reject { |key| self[key] }
    elsif values_at(*FC_FLAG_VARS).compact.empty?
      opoo <<-EOS.undent
        No Fortran optimization information was provided.  You may want to consider
        setting FCFLAGS and FFLAGS or pass the `--default-fortran-flags` option to
        `brew install` if your compiler is compatible with GCC.

        If you like the default optimization level of your compiler, ignore this
        warning.
      EOS
    end

  else
    if (gfortran = which("gfortran", (HOMEBREW_PREFIX/"bin").to_s))
      ohai "Using Homebrew-provided fortran compiler."
    elsif (gfortran = which("gfortran", ORIGINAL_PATHS.join(File::PATH_SEPARATOR)))
      ohai "Using a fortran compiler found at #{gfortran}."
    end
    if gfortran
      puts "This may be changed by setting the FC environment variable."
      self["FC"] = self["F77"] = gfortran
      flags = FC_FLAG_VARS
    end
  end

  flags.each { |key| self[key] = cflags }
  set_cpu_flags(flags)
end

#java_cacheObject



261
262
263
# File 'Library/Homebrew/extend/ENV/shared.rb', line 261

def java_cache
  append "_JAVA_OPTIONS", "-Duser.home=#{HOMEBREW_CACHE}/java_cache"
end

#ldflagsObject



133
134
135
# File 'Library/Homebrew/extend/ENV/shared.rb', line 133

def ldflags
  self["LDFLAGS"]
end

#ncurses_defineObject

Snow Leopard defines an NCURSES value the opposite of most distros. See: https://bugs.python.org/issue6848 Currently only used by aalib in core.



193
194
195
# File 'Library/Homebrew/extend/ENV/shared.rb', line 193

def ncurses_define
  append "CPPFLAGS", "-DNCURSES_OPAQUE=0"
end

#no_weak_imports_support?Boolean

Returns:

  • (Boolean)


2
3
4
5
6
7
8
9
# File 'Library/Homebrew/extend/os/mac/extend/ENV/shared.rb', line 2

def no_weak_imports_support?
  return false unless compiler == :clang

  return false if MacOS::Xcode.version && MacOS::Xcode.version < "8.0"
  return false if MacOS::CLT.version && MacOS::CLT.version < "8.0"

  true
end

#permit_arch_flagsObject



303
# File 'Library/Homebrew/extend/ENV/shared.rb', line 303

def permit_arch_flags; end

#permit_weak_importsObject

A no-op until we enable this by default again (which we may never do).



306
# File 'Library/Homebrew/extend/ENV/shared.rb', line 306

def permit_weak_imports; end

#prepend(keys, value, separator = " ") ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'Library/Homebrew/extend/ENV/shared.rb', line 70

def prepend(keys, value, separator = " ")
  value = value.to_s
  Array(keys).each do |key|
    old = self[key]
    if old.nil? || old.empty?
      self[key] = value
    else
      self[key] = value + separator + old
    end
  end
end

#prepend_create_path(key, path) ⇒ Object



98
99
100
101
102
# File 'Library/Homebrew/extend/ENV/shared.rb', line 98

def prepend_create_path(key, path)
  path = Pathname.new(path) unless path.is_a? Pathname
  path.mkpath
  prepend_path key, path
end

#prepend_path(key, path) ⇒ Object

Prepends a directory to PATH. Is the formula struggling to find the pkgconfig file? Point it to it. This is done automatically for keg_only formulae.

ENV.prepend_path "PKG_CONFIG_PATH", "#{Formula["glib"].opt_lib}/pkgconfig"

Prepending a system path such as /usr/bin is a no-op so that requirements don't accidentally override superenv shims or formulae's bin directories (e.g.

ENV.prepend_path "PATH", which("emacs").dirname
)



93
94
95
96
# File 'Library/Homebrew/extend/ENV/shared.rb', line 93

def prepend_path(key, path)
  return if %w[/usr/bin /bin /usr/sbin /sbin].include? path.to_s
  prepend key, path, File::PATH_SEPARATOR if File.directory? path
end

#remove(keys, value) ⇒ Object



104
105
106
107
108
109
110
111
# File 'Library/Homebrew/extend/ENV/shared.rb', line 104

def remove(keys, value)
  return if value.nil?
  Array(keys).each do |key|
    next unless self[key]
    self[key] = self[key].sub(value, "")
    delete(key) if self[key].empty?
  end
end

#remove_cc_etcObject



41
42
43
44
45
46
47
48
# File 'Library/Homebrew/extend/ENV/shared.rb', line 41

def remove_cc_etc
  keys = %w[CC CXX OBJC OBJCXX LD CPP CFLAGS CXXFLAGS OBJCFLAGS OBJCXXFLAGS LDFLAGS CPPFLAGS]
  removed = Hash[*keys.flat_map { |key| [key, self[key]] }]
  keys.each do |key|
    delete(key)
  end
  removed
end

#remove_from_cflags(val) ⇒ Object



54
55
56
# File 'Library/Homebrew/extend/ENV/shared.rb', line 54

def remove_from_cflags(val)
  remove CC_FLAG_VARS, val
end