aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Formula/python3.rb
diff options
context:
space:
mode:
authorsamueljohn2012-10-04 14:47:14 +0200
committerAdam Vandenberg2012-10-19 18:56:36 -0700
commit0f4a4af5023618b23c8c451a1c7cf0b42629de71 (patch)
tree18ddddb557a90c3634f4d2803c0c1aa610277168 /Library/Formula/python3.rb
parent240deab361f5b1424f1d32356f724cb91f6bc8ce (diff)
downloadhomebrew-0f4a4af5023618b23c8c451a1c7cf0b42629de71.tar.bz2
python3: Supverenv and no need for x11
- Added --with-brewed-openssl - Added back again --universal - Builds with superenv and env :std (For Tkinter-support, needs the superenv build) - Write a sitecustomize.py with the fixes already applied to python 2.7: - Support pip uninstall of scripts - Better virtualenv compatibility - Clean up of caveats. Signed-off-by: Adam Vandenberg <flangy@gmail.com>
Diffstat (limited to 'Library/Formula/python3.rb')
-rw-r--r--Library/Formula/python3.rb227
1 files changed, 156 insertions, 71 deletions
diff --git a/Library/Formula/python3.rb b/Library/Formula/python3.rb
index 3a19995c7..d51043564 100644
--- a/Library/Formula/python3.rb
+++ b/Library/Formula/python3.rb
@@ -11,35 +11,35 @@ class Distribute < Formula
sha1 '709bd97d46050d69865d4b588c7707768dfe6711'
end
-# Recommended way of installing python modules (http://pypi.python.org/pypi)
class Pip < Formula
- url 'http://pypi.python.org/packages/source/p/pip/pip-1.1.tar.gz'
- sha1 '3b002db66890880ee776bbe199c3d326d8fe3d6f'
+ url 'http://pypi.python.org/packages/source/p/pip/pip-1.2.1.tar.gz'
+ sha1 '35db84983ef3f66a8a161d320e61d192afc233d9'
end
class Python3 < Formula
homepage 'http://www.python.org/'
url 'http://python.org/ftp/python/3.2.3/Python-3.2.3.tar.bz2'
sha1 '4c2d562a0681ba27bc920500050e2f08de224311'
-
- env :std
+ VER='3.2' # The <major>.<minor> is used so often.
depends_on TkCheck.new
depends_on 'pkg-config' => :build
depends_on 'readline' => :recommended
depends_on 'sqlite' => :recommended
depends_on 'gdbm' => :recommended
- depends_on :x11 # tk.h includes X11/Xlib.h and X11/X.h
+ depends_on 'openssl' if build.include? 'with-brewed-openssl'
+ option :universal
option 'quicktest', 'Run `make quicktest` after the build'
+ option 'with-brewed-openssl', "Use Homebrew's openSSL instead of the one from OS X"
def site_packages_cellar
- prefix/"Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages"
+ prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/site-packages"
end
# The HOMEBREW_PREFIX location of site-packages.
def site_packages
- HOMEBREW_PREFIX/"lib/python3.2/site-packages"
+ HOMEBREW_PREFIX/"lib/python#{VER}/site-packages"
end
# Where distribute/pip will install executable scripts.
@@ -48,7 +48,7 @@ class Python3 < Formula
end
def effective_lib
- prefix/"Frameworks/Python.framework/Versions/3.2/lib"
+ prefix/"Frameworks/Python.framework/Versions/#{VER}/lib"
end
def install
@@ -66,37 +66,30 @@ class Python3 < Formula
args << '--without-gcc' if ENV.compiler == :clang
- # Further, Python scans all "-I" dirs but not "-isysroot", so we add
- # the needed includes with "-I" here to avoid this err:
- # building dbm using ndbm
- # error: /usr/include/zlib.h: No such file or directory
- ENV.append 'CPPFLAGS', "-I#{MacOS.sdk_path}/usr/include" unless MacOS::CLT.installed?
-
- # Don't use optimizations other than "-Os" here, because Python's distutils
- # remembers (hint: `python-config --cflags`) and reuses them for C
- # extensions which can break software (such as scipy 0.11 fails when
- # "-msse4" is present.)
- ENV.minimal_optimization
-
- # We need to enable warnings because the configure.in uses -Werror to detect
- # "whether gcc supports ParseTuple" (https://github.com/mxcl/homebrew/issues/12194)
- ENV.enable_warnings
- if ENV.compiler == :clang
- # http://docs.python.org/devguide/setup.html#id8 suggests to disable some Warnings.
- ENV.append_to_cflags '-Wno-unused-value'
- ENV.append_to_cflags '-Wno-empty-body'
- ENV.append_to_cflags '-Qunused-arguments'
+ if build.universal?
+ ENV.universal_binary
+ args << "--enable-universalsdk" << "--with-universal-archs=intel"
end
- # Allow sqlite3 module to load extensions:
- # http://docs.python.org/library/sqlite3.html#f1
+ distutils_fix_superenv(args)
+ distutils_fix_stdenv
+
+ # Python does not need all of X11, these bundled Headers are enough
+ ENV.append 'CPPFLAGS', "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers" unless MacOS::CLT.installed?
+
+ # Allow sqlite3 module to load extensions: http://docs.python.org/library/sqlite3.html#f1
inreplace "setup.py", 'sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))', 'pass'
system "./configure", *args
+
system "make"
+
ENV.deparallelize # Installs must be serialized
# Tell Python not to install into /Applications (default for framework builds)
system "make", "install", "PYTHONAPPSDIR=#{prefix}"
+ # Demos and Tools
+ (HOMEBREW_PREFIX/'share/python3').mkpath
+ system "make", "frameworkinstallextras", "PYTHONAPPSDIR=#{share}/python3"
system "make", "quicktest" if build.include? "quicktest"
# Any .app get a " 3" attached, so it does not conflict with python 2.x.
@@ -106,83 +99,175 @@ class Python3 < Formula
# Post-install, fix up the site-packages and install-scripts folders
# so that user-installed Python software survives minor updates, such
- # as going from 3.2.2 to 3.2.3.
+ # as going from 3.3.0 to 3.3.1:
# Remove the site-packages that Python created in its Cellar.
site_packages_cellar.rmtree
- # Create a site-packages in HOMEBREW_PREFIX/lib/python3/site-packages
+ # Create a site-packages in HOMEBREW_PREFIX/lib/python#{VER}/site-packages
site_packages.mkpath
# Symlink the prefix site-packages into the cellar.
ln_s site_packages, site_packages_cellar
+ # Teach python not to use things from /System
+ # and tell it about the correct site-package dir because we moved it
+ sitecustomize = site_packages_cellar/"sitecustomize.py"
+ rm sitecustomize if File.exist? sitecustomize
+ sitecustomize.write(sitecustomize_content)
+
# "python3" and executable is forgotten for framework builds.
# Make sure homebrew symlinks it to HOMEBREW_PREFIX/bin.
- ln_s "#{bin}/python3.2", "#{bin}/python3" unless (bin/"python3").exist?
+ ln_s "#{bin}/python#{VER}", "#{bin}/python3" unless (bin/"python3").exist?
- # Tell distutils-based installers where to put scripts
+ # Install distribute for python3 and assure there's no name clash
+ # with what the python (2.x) formula installs.
scripts_folder.mkpath
- (effective_lib/"python3.2/distutils/distutils.cfg").write <<-EOF.undent
+ setup_args = ["-s", "setup.py", "install", "--force", "--verbose", "--install-lib=#{site_packages_cellar}", "--install-scripts=#{bin}" ]
+ Distribute.new.brew { system "#{bin}/python#{VER}", *setup_args }
+ mv bin/'easy_install', bin/'easy_install3'
+ Pip.new.brew { system "#{bin}/python#{VER}", *setup_args }
+ mv bin/'pip', bin/'pip3'
+
+ # Tell distutils-based installers where to put scripts
+ (prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/distutils/distutils.cfg").write <<-EOF.undent
[install]
install-scripts=#{scripts_folder}
+ install-lib=#{site_packages}
EOF
- # Install distribute for python3
- Distribute.new.brew do
- system "#{bin}/python3.2", "setup.py", "install", "--force", "--verbose"
- # Symlink to easy_install3 to match python3 command.
- unless (scripts_folder/'easy_install3').exist?
- ln_s scripts_folder/"easy_install", scripts_folder/"easy_install3"
+ unless MacOS::CLT.installed?
+ makefile = prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/config-#{VER}m/Makefile"
+ inreplace makefile do |s|
+ s.gsub!(/^CC=.*$/, "CC=xcrun clang")
+ s.gsub!(/^CXX=.*$/, "CXX=xcrun clang++")
+ s.gsub!(/^AR=.*$/, "AR=xcrun ar")
+ s.gsub!(/^RANLIB=.*$/, "RANLIB=xcrun ranlib")
end
end
- # Install pip-3.2 for python3
- Pip.new.brew { system "#{bin}/python3.2", "setup.py", "install", "--force", "--verbose" }
+
+ end
+
+ def distutils_fix_superenv(args)
+ if superenv?
+ # To allow certain Python bindings to find brewed software:
+ cflags = "CFLAGS=-I#{HOMEBREW_PREFIX}/include"
+ ldflags = "LDFLAGS=-L#{HOMEBREW_PREFIX}/lib"
+ unless MacOS::CLT.installed?
+ # Help Python's build system (distribute/pip) to build things on Xcode-only systems
+ # The setup.py looks at "-isysroot" to get the sysroot (and not at --sysroot)
+ cflags += " -isysroot #{MacOS.sdk_path}"
+ ldflags += " -isysroot #{MacOS.sdk_path}"
+ # Same zlib.h-not-found-bug as in env :std (see below)
+ args << "CPPFLAGS=-I#{MacOS.sdk_path}/usr/include"
+ end
+ args << cflags
+ args << ldflags
+ # Avoid linking to libgcc http://code.activestate.com/lists/python-dev/112195/
+ args << "MACOSX_DEPLOYMENT_TARGET=#{MacOS.version}"
+ # We want our readline! This is just to outsmart the detection code,
+ # superenv makes cc always find includes/libs!
+ inreplace "setup.py",
+ "do_readline = self.compiler.find_library_file(lib_dirs, 'readline')",
+ "do_readline = '#{HOMEBREW_PREFIX}/opt/readline/lib/libhistory.dylib'"
+ end
+ end
+
+ def distutils_fix_stdenv()
+ if not superenv?
+ # Python scans all "-I" dirs but not "-isysroot", so we add
+ # the needed includes with "-I" here to avoid this err:
+ # building dbm using ndbm
+ # error: /usr/include/zlib.h: No such file or directory
+ ENV.append 'CPPFLAGS', "-I#{MacOS.sdk_path}/usr/include" unless MacOS::CLT.installed?
+
+ # Don't use optimizations other than "-Os" here, because Python's distutils
+ # remembers (hint: `python3-config --cflags`) and reuses them for C
+ # extensions which can break software (such as scipy 0.11 fails when
+ # "-msse4" is present.)
+ ENV.minimal_optimization
+
+ # We need to enable warnings because the configure.in uses -Werror to detect
+ # "whether gcc supports ParseTuple" (https://github.com/mxcl/homebrew/issues/12194)
+ ENV.enable_warnings
+ if ENV.compiler == :clang
+ # http://docs.python.org/devguide/setup.html#id8 suggests to disable some Warnings.
+ ENV.append_to_cflags '-Wno-unused-value'
+ ENV.append_to_cflags '-Wno-empty-body'
+ ENV.append_to_cflags '-Qunused-arguments'
+ end
+ end
+ end
+
+ def sitecustomize_content
+ <<-EOF.undent
+ # This file is created by `brew install python3` and is executed on each
+ # python#{VER} startup. Don't print from here, or else universe will collapse.
+ import sys
+ import site
+
+ # Only do fix 1 and 2, if the currently run python is a brewed one.
+ if sys.executable.startswith('#{HOMEBREW_PREFIX}'):
+ # Fix 1)
+ # A setuptools.pth and/or easy-install.pth sitting either in
+ # /Library/Python/2.7/site-packages or in
+ # ~/Library/Python/2.7/site-packages can inject the
+ # /System's Python site-packages. People then report
+ # "OSError: [Errno 13] Permission denied" because pip/easy_install
+ # attempts to install into
+ # /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
+ # See: https://github.com/mxcl/homebrew/issues/14712
+ sys.path = [ p for p in sys.path if not p.startswith('/System') ]
+
+ # Fix 2)
+ # Remove brewed Python's hard-coded site-packages
+ sys.path.remove('#{site_packages_cellar}')
+
+ # Fix 3)
+ # For all Pythons: Tell about homebrew's site-packages location.
+ # This is needed for Python to parse *.pth files.
+ site.addsitedir('#{site_packages}')
+ EOF
end
def caveats
text = <<-EOS.undent
- The Python framework is located at:
+ Homebrew's Python3 framework
#{prefix}/Frameworks/Python.framework
- You can `brew linkapps` to symlink "Idle 3" and the "Python Launcher 3".
- EOS
-
- # Tk warning only for 10.6
- tk_caveats = <<-EOS.undent
+ Distribute and Pip have been installed. To update them
+ pip3 install --upgrade distribute
+ pip3 install --upgrade pip
- Apple's Tcl/Tk is not recommended for use with Python on Mac OS X 10.6.
- For more information see: http://www.python.org/download/mac/tcltk/
- EOS
+ To symlink "Idle 3" and the "Python Launcher 3" to ~/Applications
+ `brew linkapps`
- general_caveats = <<-EOS.undent
+ You can install Python packages with
+ `pip3 install <your_favorite_package>`
- A "distutils.cfg" has been written, specifying the install-scripts directory as:
+ They will install into the site-package directory
+ #{site_packages}
+ Executable python scripts will be put in:
#{scripts_folder}
+ so you may want to put "#{scripts_folder}" in your PATH, too.
- If you install Python packages via "pip-3.2 install x" or "python3 setup.py install"
- (or the outdated easy_install3), any provided scripts will go into the
- install-scripts folder above, so you may want to add it to your PATH.
-
- The site-package directory for brewed Python:
- #{site_packages}
+ See: https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python
+ EOS
- Distribute and Pip have been installed. To update them:
- #{scripts_folder}/pip-3.2 install --upgrade distribute
- #{scripts_folder}/pip-3.2 install --upgrade pip
+ # Tk warning only for 10.6
+ tk_caveats = <<-EOS.undent
- See: https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python
+ Apple's Tcl/Tk is not recommended for use with Python on Mac OS X 10.6.
+ For more information see: http://www.python.org/download/mac/tcltk/
EOS
text += tk_caveats unless MacOS.version >= :lion
- text += general_caveats
return text
end
def test
# Check if sqlite is ok, because we build with --enable-loadable-sqlite-extensions
- # and it can occur that building sqlite silently fails.
- system "#{bin}/python3", "-c", "import sqlite3"
- # See: https://github.com/mxcl/homebrew/pull/10487
- # Fixed [upstream](http://bugs.python.org/issue11149), but still nice to have.
- `#{bin}/python3 -c 'from decimal import Decimal; print(Decimal(4) / Decimal(2))'`.chomp == '2'
+ # and it can occur that building sqlite silently fails if OSX's sqlite is used.
+ system "#{bin}/python#{VER}", "-c", "import sqlite3"
+ # Check if some other modules import. Then the linked libs are working.
+ system "#{bin}/python#{VER}", "-c", "import tkinter"
end
end