diff --git a/Library/Formula/python3.rb b/Library/Formula/python3.rb index 3a19995c72f5..d510435640c0 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 . 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 @@ def scripts_folder 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 @@ def install 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 @@ def install # 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 ` - 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