PythonInstalled: Allow formulae to set/append PYTHONPATH
Improve robustness of `PYTHONPATH` by first unsetting it (during `satisfy`) so that the `PythonInstalled` can get the `python.version` and so forth and then, after that, setting the `PYTHONPATH` to our `global_site_packages`. In the `python_helper` we append to the `PYTHONPATH` so if that var has been set in a formula, it is respected. Brew audit does no longer complain about setting the `ENV['PYTHONPATH']`.
This commit is contained in:
parent
dbaac79f17
commit
5515fda59a
@ -568,13 +568,7 @@ class FormulaAuditor
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if f.requirements.any?{ |r| r.kind_of?(PythonInstalled) }
|
unless f.requirements.any?{ |r| r.kind_of?(PythonInstalled) }
|
||||||
# Don't check this for all formulae, because some are allowed to set the
|
|
||||||
# PYTHONPATH. E.g. python.rb itself needs to set it.
|
|
||||||
if text =~ /ENV\.append.*PYTHONPATH/ || text =~ /ENV\[['"]PYTHONPATH['"]\]\s*=[^=]/
|
|
||||||
problem "Don't set the PYTHONPATH, instead declare `depends_on :python`"
|
|
||||||
end
|
|
||||||
else
|
|
||||||
# So if there is no PythonInstalled requirement, we can check if the
|
# So if there is no PythonInstalled requirement, we can check if the
|
||||||
# formula still uses python and should add a `depends_on :python`
|
# formula still uses python and should add a `depends_on :python`
|
||||||
unless f.name.to_s =~ /(pypy[0-9]*)|(python[0-9]*)/
|
unless f.name.to_s =~ /(pypy[0-9]*)|(python[0-9]*)/
|
||||||
|
|||||||
@ -80,38 +80,44 @@ class PythonInstalled < Requirement
|
|||||||
# We look for a brewed python or an external Python and store the loc of
|
# We look for a brewed python or an external Python and store the loc of
|
||||||
# that binary for later usage. (See Formula#python)
|
# that binary for later usage. (See Formula#python)
|
||||||
satisfy :build_env => false do
|
satisfy :build_env => false do
|
||||||
ENV['PYTHONPATH'] = nil
|
begin
|
||||||
@unsatisfied_because = ''
|
# Unset the PYTHONPATH during these tests, but later ensure it is restored.
|
||||||
if binary.nil? || !binary.executable?
|
pythonpath = ENV['PYTHONPATH']
|
||||||
@unsatisfied_because += "No `#{@python}` found in your PATH! Consider to `brew install #{@python}`."
|
ENV['PYTHONPATH'] = nil
|
||||||
false
|
@unsatisfied_because = ''
|
||||||
elsif pypy?
|
if binary.nil? || !binary.executable?
|
||||||
@unsatisfied_because += "Your #{@python} executable appears to be a PyPy, which is not supported."
|
@unsatisfied_because += "No `#{@python}` found in your PATH! Consider to `brew install #{@python}`."
|
||||||
false
|
false
|
||||||
elsif version.major != @min_version.major
|
elsif pypy?
|
||||||
@unsatisfied_because += "No Python #{@min_version.major}.x found in your PATH! --> `brew install #{@python}`?"
|
@unsatisfied_because += "Your #{@python} executable appears to be a PyPy, which is not supported."
|
||||||
false
|
false
|
||||||
elsif version < @min_version
|
elsif version.major != @min_version.major
|
||||||
@unsatisfied_because += "Python version #{version} is too old (need at least #{@min_version})."
|
@unsatisfied_because += "No Python #{@min_version.major}.x found in your PATH! --> `brew install #{@python}`?"
|
||||||
false
|
false
|
||||||
elsif @min_version.major == 2 && `python -c "import sys; print(sys.version_info[0])"`.strip == "3"
|
elsif version < @min_version
|
||||||
@unsatisfied_because += "Your `python` points to a Python 3.x. This is not supported."
|
@unsatisfied_because += "Python version #{version} is too old (need at least #{@min_version})."
|
||||||
false
|
false
|
||||||
else
|
elsif @min_version.major == 2 && `python -c "import sys; print(sys.version_info[0])"`.strip == "3"
|
||||||
@imports.keys.all? do |module_name|
|
@unsatisfied_because += "Your `python` points to a Python 3.x. This is not supported."
|
||||||
if importable? module_name
|
false
|
||||||
true
|
else
|
||||||
else
|
@imports.keys.all? do |module_name|
|
||||||
@unsatisfied_because += "Unsatisfied dependency: #{module_name}\n"
|
if importable? module_name
|
||||||
@unsatisfied_because += "OS X System's " if from_osx?
|
true
|
||||||
@unsatisfied_because += "Brewed " if brewed?
|
else
|
||||||
@unsatisfied_because += "External " unless brewed? || from_osx?
|
@unsatisfied_because += "Unsatisfied dependency: #{module_name}\n"
|
||||||
@unsatisfied_because += "Python cannot `import #{module_name}`. Install with:\n "
|
@unsatisfied_because += "OS X System's " if from_osx?
|
||||||
@unsatisfied_because += "sudo easy_install pip\n " unless importable? 'pip'
|
@unsatisfied_because += "Brewed " if brewed?
|
||||||
@unsatisfied_because += "pip-#{version.major}.#{version.minor} install #{@imports[module_name]}"
|
@unsatisfied_because += "External " unless brewed? || from_osx?
|
||||||
false
|
@unsatisfied_because += "Python cannot `import #{module_name}`. Install with:\n "
|
||||||
|
@unsatisfied_because += "sudo easy_install pip\n " unless importable? 'pip'
|
||||||
|
@unsatisfied_because += "pip-#{version.major}.#{version.minor} install #{@imports[module_name]}"
|
||||||
|
false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
ensure
|
||||||
|
ENV['PYTHONPATH'] = pythonpath
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -196,7 +202,7 @@ class PythonInstalled < Requirement
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Is the brewed Python installed
|
# Is the brewed Python installed?
|
||||||
def brewed?
|
def brewed?
|
||||||
@brewed ||= begin
|
@brewed ||= begin
|
||||||
require 'formula'
|
require 'formula'
|
||||||
@ -245,6 +251,18 @@ class PythonInstalled < Requirement
|
|||||||
# Most methods fail if we don't have a binary.
|
# Most methods fail if we don't have a binary.
|
||||||
return if binary.nil?
|
return if binary.nil?
|
||||||
|
|
||||||
|
ENV['PYTHONHOME'] = nil # to avoid fuck-ups.
|
||||||
|
ENV['PYTHONPATH'] = nil # first unset, because global_site_packages may fail
|
||||||
|
ENV['PYTHONPATH'] = if brewed? then nil; else global_site_packages.to_s; end
|
||||||
|
|
||||||
|
# For non-system python's we add the opt_prefix/bin of python to the path.
|
||||||
|
ENV.prepend_path 'PATH', binary.dirname unless from_osx?
|
||||||
|
ENV.append_path 'CMAKE_INCLUDE_PATH', incdir
|
||||||
|
ENV.append_path 'PKG_CONFIG_PATH', pkg_config_path if pkg_config_path
|
||||||
|
# We don't set the -F#{framework} here, because if Python 2.x and 3.x are
|
||||||
|
# used, `Python.framework` is ambiguous. However, in the `python do` block
|
||||||
|
# we can set LDFLAGS+="-F#{framework}" because only one is temporarily set.
|
||||||
|
|
||||||
# Write our sitecustomize.py
|
# Write our sitecustomize.py
|
||||||
file = global_site_packages/"sitecustomize.py"
|
file = global_site_packages/"sitecustomize.py"
|
||||||
ohai "Writing #{file}" if ARGV.verbose? && ARGV.debug?
|
ohai "Writing #{file}" if ARGV.verbose? && ARGV.debug?
|
||||||
@ -256,17 +274,6 @@ class PythonInstalled < Requirement
|
|||||||
|
|
||||||
file.write(sitecustomize)
|
file.write(sitecustomize)
|
||||||
|
|
||||||
# For non-system python's we add the opt_prefix/bin of python to the path.
|
|
||||||
ENV.prepend_path 'PATH', binary.dirname unless from_osx?
|
|
||||||
|
|
||||||
ENV['PYTHONHOME'] = nil # to avoid fuck-ups.
|
|
||||||
ENV['PYTHONPATH'] = if brewed? then nil; else global_site_packages.to_s; end
|
|
||||||
ENV.append_path 'CMAKE_INCLUDE_PATH', incdir
|
|
||||||
ENV.append_path 'PKG_CONFIG_PATH', pkg_config_path if pkg_config_path
|
|
||||||
# We don't set the -F#{framework} here, because if Python 2.x and 3.x are
|
|
||||||
# used, `Python.framework` is ambiguous. However, in the `python do` block
|
|
||||||
# we can set LDFLAGS+="-F#{framework}" because only one is temporarily set.
|
|
||||||
|
|
||||||
# Udpate distutils.cfg (later we can remove this, but people still have
|
# Udpate distutils.cfg (later we can remove this, but people still have
|
||||||
# their old brewed pythons and we have to update it here)
|
# their old brewed pythons and we have to update it here)
|
||||||
# Todo: If Jack's formula revisions arrive, we can get rid of this here!
|
# Todo: If Jack's formula revisions arrive, we can get rid of this here!
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user