diff options
| author | Samuel John | 2013-06-17 09:06:38 +0200 | 
|---|---|---|
| committer | Samuel John | 2013-06-18 10:30:17 +0200 | 
| commit | 2c8c8d07f6f108533f5b6d9650e1fcdf9929a937 (patch) | |
| tree | eb5c7af52cbd6cdaf88a79951ab52ce70cf2c3c3 /Library/Homebrew/python_helper.rb | |
| parent | f393f6da8c34b91910fa2d1fe5ca5931a5004241 (diff) | |
| download | homebrew-2c8c8d07f6f108533f5b6d9650e1fcdf9929a937.tar.bz2 | |
Python module deps, ext. python fix and 10.6 fix
* Fixes #20572 by tweaking the logic that decides
  which python is used by the `python` object
  inside a formula. There was a bug when on 10.6
  there is no Python 2.7 but a :recommended
  Python was still treated as being available.
* Use the user's PATH when looking for an external
  Python. Until now only brewed or OS X system's
  python have been found by `depends_on :python`.
  But now we support any Python in PATH (e.g.
  pyenv's python).
* Further, instead of handling python modules
  and import tests in LanguageModuleDependency,
  these are now handled by:
        depends_on :python => 'numpy'  # for example
  The old style
        depends_on 'numpy' => :python
  is still supported and is only an alias
  for the newer style (only for :python, the
  other languages are not altered by this commit).
  The reasoning is that if a formula requires
  a python module, it basically also needs
  python itself - and further that specific
  version of python has to provide the module.
  So the `PythonInstalled` is the natural place
  to check for the availability of a python
  module.
  Using a python module and other tags like
  :optional or :recommended is done like so:
        depends_on :python => [:optional, 'numpy']
  Specifying another PyPi (Python Package index)
  name than the module import name is seldom used
  but supported, too:
         depends_on :python => ['enchant'=>'pyenchant']
  A last note: For clarity, you can define
  multiple depends_on statements with different
  modules to be importable.`
Diffstat (limited to 'Library/Homebrew/python_helper.rb')
| -rw-r--r-- | Library/Homebrew/python_helper.rb | 25 | 
1 files changed, 15 insertions, 10 deletions
diff --git a/Library/Homebrew/python_helper.rb b/Library/Homebrew/python_helper.rb index dcb698c9d..3db59b334 100644 --- a/Library/Homebrew/python_helper.rb +++ b/Library/Homebrew/python_helper.rb @@ -29,25 +29,30 @@ def python_helper(options={:allowed_major_versions => [2, 3]}, &block)      if python_reqs.empty?        raise "If you use python in the formula, you have to add `depends_on :python` (or :python3)!"      end -    # Now select those that are satisfied and matching the version.major -    python_reqs = python_reqs.select do |p| -      p.satisfied? && -      options[:allowed_major_versions].include?(p.version.major) && -      if p.optional? || p.recommended? -        self.build.with?(p.name) -      else -        true +    # Now select those that are satisfied and matching the version.major and +    # check that no two python binaries are the same (which could be the case +    # because more than one `depends_on :python => 'module_name' may be present). +    filtered_python_reqs = [] +    while !python_reqs.empty? +      py = python_reqs.shift +      # this is ulgy but Ruby 1.8 has no `uniq! { }` +      if !filtered_python_reqs.map{ |fpr| fpr.binary }.include?(py.binary) && +         py.satisfied? && +         options[:allowed_major_versions].include?(py.version.major) && +         self.build.with?(py.name) || !(py.optional? || py.recommended?) +      then +        filtered_python_reqs << py        end      end      # Allow to use an else-branch like so: `if python do ... end; else ... end` -    return false if python_reqs.empty? +    return false if filtered_python_reqs.empty?      # Sort by version, so the older 2.x will be used first and if no      # block_given? then 2.x is preferred because it is returned.      # Further note, having 3.x last allows us to run `2to3 --write .`      # which modifies the sources in-place (for some packages that need this). -    python_reqs.sort_by{ |py| py.version }.map do |py| +    filtered_python_reqs.sort_by{ |py| py.version }.map do |py|        # Now is the time to set the site_packages to the correct value        py.site_packages = lib/py.xy/'site-packages'        if !block_given?  | 
