diff options
Diffstat (limited to 'Library/Formula/python3.rb')
| -rw-r--r-- | Library/Formula/python3.rb | 225 |
1 files changed, 104 insertions, 121 deletions
diff --git a/Library/Formula/python3.rb b/Library/Formula/python3.rb index e3e80211c..df7926625 100644 --- a/Library/Formula/python3.rb +++ b/Library/Formula/python3.rb @@ -15,22 +15,27 @@ class Pip < Formula sha1 '9c70d314e5dea6f41415af814056b0f63c3ffd14' end - class Python3 < Formula homepage 'http://www.python.org/' url 'http://python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2' sha1 'b28c36a9752b690059dc6df4fb9b4ec9d6c5708a' VER='3.3' # The <major>.<minor> is used so often. + 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" + option 'with-brewed-tk', "Use Homebrew's Tk (has optional Cocoa and threads support)" + depends_on 'pkg-config' => :build depends_on 'readline' => :recommended depends_on 'sqlite' => :recommended depends_on 'gdbm' => :recommended depends_on 'openssl' if build.include? 'with-brewed-openssl' + depends_on 'homebrew/dupes/tcl-tk' if build.include? 'with-brewed-tk' - 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 patches + DATA if build.include? 'with-brewed-tk' + end def site_packages_cellar prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/site-packages" @@ -41,15 +46,6 @@ class Python3 < Formula HOMEBREW_PREFIX/"lib/python#{VER}/site-packages" end - # Where distribute/pip will install executable scripts. - def scripts_folder - HOMEBREW_PREFIX/"share/python3" - end - - def effective_lib - prefix/"Frameworks/Python.framework/Versions/#{VER}/lib" - end - fails_with :llvm do build '2336' cause <<-EOS.undent @@ -66,7 +62,6 @@ class Python3 < Formula def install # Unset these so that installing pip and distribute puts them where we want # and not into some other Python the user has installed. - ENV['PYTHONPATH'] = nil ENV['PYTHONHOME'] = nil args = %W[ @@ -78,21 +73,27 @@ class Python3 < Formula args << '--without-gcc' if ENV.compiler == :clang + if superenv? + distutils_fix_superenv(args) + else + distutils_fix_stdenv + end + if build.universal? ENV.universal_binary args << "--enable-universalsdk" << "--with-universal-archs=intel" end - distutils_fix_superenv(args) - distutils_fix_stdenv - - # Python does not need all of X11, these bundled Headers are enough - unless MacOS::CLT.installed? - ENV.append 'CPPFLAGS', "-I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers" - end - # 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' + inreplace("setup.py", 'sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))', 'pass') if build.with? 'sqlite' + + # Allow python modules to use ctypes.find_library to find homebrew's stuff + # even if homebrew is not a /usr/local/lib. Try this with: + # `brew install enchant && pip install pyenchant` + inreplace "./Lib/ctypes/macholib/dyld.py" do |f| + f.gsub! 'DEFAULT_LIBRARY_FALLBACK = [', "DEFAULT_LIBRARY_FALLBACK = [ '#{HOMEBREW_PREFIX}/lib'," + f.gsub! 'DEFAULT_FRAMEWORK_FALLBACK = [', "DEFAULT_FRAMEWORK_FALLBACK = [ '#{HOMEBREW_PREFIX}/Frameworks'," + end system "./configure", *args @@ -122,32 +123,36 @@ class Python3 < Formula # 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}/python#{VER}", "#{bin}/python3" unless (bin/"python3").exist? - # Install distribute for python3 and assure there's no name clash + # Install distribute and pip for python3 and assure there's no name clash # with what the python (2.x) formula installs. - scripts_folder.mkpath - setup_args = ["-s", "setup.py", "install", "--force", "--verbose", "--install-lib=#{site_packages_cellar}", "--install-scripts=#{bin}"] + ENV['PYTHONPATH'] = site_packages + setup_args = ["-s", "setup.py", "install", "--force", "--verbose", + "--install-scripts=#{bin}", "--install-lib=#{site_packages}" ] 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 + # And now we write the distuitsl.cfg + cfg = prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/distutils/distutils.cfg" + cfg.delete if cfg.exist? + cfg.write <<-EOF.undent + [global] + verbose=1 [install] - install-scripts=#{scripts_folder} - install-lib=#{site_packages} + prefix=#{HOMEBREW_PREFIX} EOF + # Write our sitecustomize.py and distutils.cfg to tell python about the + # correct site-package dir because we moved it. + # We reuse the PythonInstalled requirement here. + ENV.prepend_path 'PATH', bin + PythonInstalled.new(VER).modify_build_environment + unless MacOS::CLT.installed? makefile = prefix/"Frameworks/Python.framework/Versions/#{VER}/lib/python#{VER}/config-#{VER}m/Makefile" inreplace makefile do |s| @@ -158,102 +163,64 @@ class Python3 < Formula end end - # A temporary fix, until a homebrew - # [issue on handling Frameworks](https://github.com/mxcl/homebrew/issues/15943) - # is resolved. `brew install python python3` failed to link because both - # provide `Python.framework`. Homebrew will need to be smarter about this, - # since Frameworks are built to support multiple versions. + # A fix, because python and python3 both want to install Python.framework + # https://github.com/mxcl/homebrew/issues/15943 ["Headers", "Python", "Resources"].each{ |f| rm(prefix/"Frameworks/Python.framework/#{f}") } end def distutils_fix_superenv(args) - if superenv? - # To allow certain Python bindings to find brewed software: - cflags = "CFLAGS=-I#{HOMEBREW_PREFIX}/include -I#{Formula.factory('sqlite').opt_prefix}/include" - ldflags = "LDFLAGS=-L#{HOMEBREW_PREFIX}/lib -L#{Formula.factory('sqlite').opt_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" + # To allow certain Python bindings to find brewed software: + cflags = "CFLAGS=-I#{HOMEBREW_PREFIX}/include -I#{Formula.factory('sqlite').opt_prefix}/include" + ldflags = "LDFLAGS=-L#{HOMEBREW_PREFIX}/lib -L#{Formula.factory('sqlite').opt_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" + unless build.include? 'with-brewed-tk' + cflags += " -I#{MacOS.sdk_path}/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers" 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 + 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 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 + # 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 - 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 - Homebrew's Python3 framework - #{prefix}/Frameworks/Python.framework - Distribute and Pip have been installed. To update them pip3 install --upgrade distribute pip3 install --upgrade pip @@ -266,9 +233,6 @@ class Python3 < Formula 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. See: https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python EOS @@ -289,6 +253,25 @@ class Python3 < Formula # 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" + system "#{bin}/python#{VER}", "-c", "import tkinter; root = tkinter.Tk()" end end + +__END__ +diff --git a/setup.py b/setup.py +index 9ddf2e9..60ab152 100644 +--- a/setup.py ++++ b/setup.py +@@ -1624,9 +1624,9 @@ class PyBuildExt(build_ext): + # Rather than complicate the code below, detecting and building + # AquaTk is a separate method. Only one Tkinter will be built on + # Darwin - either AquaTk, if it is found, or X11 based Tk. +- if (host_platform == 'darwin' and +- self.detect_tkinter_darwin(inc_dirs, lib_dirs)): +- return ++ # if (host_platform == 'darwin' and ++ # self.detect_tkinter_darwin(inc_dirs, lib_dirs)): ++ # return + + # Assume we haven't found any of the libraries or include files + # The versions with dots are used on Unix, and the versions without |
