homebrew-core/Formula/pypy.rb
Tim D. Smith 79dec437ba pypy: build cffi extensions in lib_pypy
Fixes a problem reported on IRC where these modules can't be imported by
a different user than the user that installed Homebrew because building
the cffi extensions writes files to the Cellar. Pypy's packaging script
normally generates these but it's not invoked by Homebrew.

Closes Homebrew/homebrew#33725.
2014-11-02 07:39:08 -08:00

131 lines
4.5 KiB
Ruby

require "formula"
class Pypy < Formula
homepage "http://pypy.org/"
url "https://bitbucket.org/pypy/pypy/downloads/pypy-2.4.0-src.tar.bz2"
sha1 "e2e0bcf8457c0ae5a24f126a60aa921dabfe60fb"
bottle do
cellar :any
revision 1
sha1 "3473464c440ded1e99b5aaa40e5cc740aa3d7ef4" => :yosemite
sha1 "9d4eccd93b9af5814ce5d159bc4f16bbaf589418" => :mavericks
sha1 "06ee886537c517845fdec289839105c024689007" => :mountain_lion
end
revision 2
depends_on :arch => :x86_64
depends_on "pkg-config" => :build
depends_on "openssl"
resource "setuptools" do
url "https://pypi.python.org/packages/source/s/setuptools/setuptools-6.0.2.tar.gz"
sha1 "a29a81b7913151697cb15b069844af75d441408f"
end
resource "pip" do
url "https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz"
sha1 "e6cd9e6f2fd8d28c9976313632ef8aa8ac31249e"
end
# https://bugs.launchpad.net/ubuntu/+source/gcc-4.2/+bug/187391
fails_with :gcc
def install
# Having PYTHONPATH set can cause the build to fail if another
# Python is present, e.g. a Homebrew-provided Python 2.x
# See https://github.com/Homebrew/homebrew/issues/24364
ENV["PYTHONPATH"] = ""
ENV["PYPY_USESSION_DIR"] = buildpath
Dir.chdir "pypy/goal" do
system "python", buildpath/"rpython/bin/rpython",
"-Ojit", "--shared", "--cc", ENV["CC"], "--translation-verbose",
"--make-jobs", ENV.make_jobs, "targetpypystandalone.py"
system "install_name_tool", "-change", "libpypy-c.dylib", libexec/"lib/libpypy-c.dylib", "pypy-c"
system "install_name_tool", "-id", opt_libexec/"lib/libpypy-c.dylib", "libpypy-c.dylib"
(libexec/"bin").install "pypy-c" => "pypy"
(libexec/"lib").install "libpypy-c.dylib"
end
(libexec/"lib-python").install "lib-python/2.7"
libexec.install %w[include lib_pypy]
# The PyPy binary install instructions suggest installing somewhere
# (like /opt) and symlinking in binaries as needed. Specifically,
# we want to avoid putting PyPy's Python.h somewhere that configure
# scripts will find it.
bin.install_symlink libexec/"bin/pypy"
lib.install_symlink libexec/"lib/libpypy-c.dylib"
end
def post_install
# Precompile cffi extensions in lib_pypy
# list from create_cffi_import_libraries in pypy/tool/release/package.py
%w[_sqlite3 _curses syslog gdbm _tkinter].each do |module_name|
quiet_system bin/"pypy", "-c", "import #{module_name}"
end
# Post-install, fix up the site-packages and install-scripts folders
# so that user-installed Python software survives minor updates, such
# as going from 1.7.0 to 1.7.1.
# Create a site-packages in the prefix.
prefix_site_packages.mkpath
# Symlink the prefix site-packages into the cellar.
libexec.install_symlink prefix_site_packages
# Tell distutils-based installers where to put scripts
scripts_folder.mkpath
(distutils+"distutils.cfg").atomic_write <<-EOF.undent
[install]
install-scripts=#{scripts_folder}
EOF
resource("setuptools").stage { system "#{libexec}/bin/pypy", "setup.py", "install" }
resource("pip").stage { system "#{libexec}/bin/pypy", "setup.py", "install" }
# Symlinks to easy_install_pypy and pip_pypy
bin.install_symlink scripts_folder/"easy_install" => "easy_install_pypy"
bin.install_symlink scripts_folder/"pip" => "pip_pypy"
# post_install happens after linking
%w[easy_install_pypy pip_pypy].each { |e| (HOMEBREW_PREFIX/"bin").install_symlink bin/e }
end
def caveats; <<-EOS.undent
A "distutils.cfg" has been written to:
#{distutils}
specifying the install-scripts folder as:
#{scripts_folder}
If you install Python packages via "pypy setup.py install", easy_install_pypy,
or pip_pypy, any provided scripts will go into the install-scripts folder
above, so you may want to add it to your PATH *after* #{HOMEBREW_PREFIX}/bin
so you don't overwrite tools from CPython.
Setuptools and pip have been installed, so you can use easy_install_pypy and
pip_pypy.
To update setuptools and pip between pypy releases, run:
#{scripts_folder}/pip install --upgrade setuptools
See: https://github.com/Homebrew/homebrew/wiki/Homebrew-and-Python
EOS
end
# The HOMEBREW_PREFIX location of site-packages
def prefix_site_packages
HOMEBREW_PREFIX+"lib/pypy/site-packages"
end
# Where setuptools will install executable scripts
def scripts_folder
HOMEBREW_PREFIX+"share/pypy"
end
# The Cellar location of distutils
def distutils
libexec+"lib-python/2.7/distutils"
end
end