python@3.7: add Linux build
parent
f7c3c5df5a
commit
3d5dd46be5
|
@ -20,12 +20,14 @@ class PythonAT37 < Formula
|
|||
# setuptools remembers the build flags python is built with and uses them to
|
||||
# build packages later. Xcode-only systems need different flags.
|
||||
pour_bottle? do
|
||||
reason <<~EOS
|
||||
The bottle needs the Apple Command Line Tools to be installed.
|
||||
You can install them, if desired, with:
|
||||
xcode-select --install
|
||||
EOS
|
||||
satisfy { MacOS::CLT.installed? }
|
||||
on_macos do
|
||||
reason <<~EOS
|
||||
The bottle needs the Apple Command Line Tools to be installed.
|
||||
You can install them, if desired, with:
|
||||
xcode-select --install
|
||||
EOS
|
||||
satisfy { MacOS::CLT.installed? }
|
||||
end
|
||||
end
|
||||
|
||||
keg_only :versioned_formula
|
||||
|
@ -42,6 +44,7 @@ class PythonAT37 < Formula
|
|||
uses_from_macos "bzip2"
|
||||
uses_from_macos "libffi"
|
||||
uses_from_macos "ncurses"
|
||||
uses_from_macos "xz"
|
||||
uses_from_macos "zlib"
|
||||
|
||||
skip_clean "bin/pip3", "bin/pip-3.4", "bin/pip-3.5", "bin/pip-3.6", "bin/pip-3.7"
|
||||
|
@ -88,6 +91,24 @@ class PythonAT37 < Formula
|
|||
sha256 "aa9a3002420079a7d2c6033d80b49038d490984a9ddb3d1195bb48ca7fb4a1f0"
|
||||
end
|
||||
|
||||
def lib_cellar
|
||||
on_macos do
|
||||
return prefix/"Frameworks/Python.framework/Versions/#{version.major_minor}/lib/python#{version.major_minor}"
|
||||
end
|
||||
on_linux do
|
||||
return prefix/"lib/python#{version.major_minor}"
|
||||
end
|
||||
end
|
||||
|
||||
def site_packages_cellar
|
||||
lib_cellar/"site-packages"
|
||||
end
|
||||
|
||||
# The HOMEBREW_PREFIX location of site-packages.
|
||||
def site_packages
|
||||
HOMEBREW_PREFIX/"lib/python#{version.major_minor}/site-packages"
|
||||
end
|
||||
|
||||
def install
|
||||
# Unset these so that installing pip and setuptools puts them where we want
|
||||
# and not into some other Python the user has installed.
|
||||
|
@ -99,24 +120,32 @@ class PythonAT37 < Formula
|
|||
ENV["PYTHON_DECIMAL_WITH_MACHINE"] = "x64"
|
||||
end
|
||||
|
||||
xy = (buildpath/"configure.ac").read.slice(/PYTHON_VERSION, (3\.\d)/, 1)
|
||||
lib_cellar = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}"
|
||||
|
||||
args = %W[
|
||||
--prefix=#{prefix}
|
||||
--enable-ipv6
|
||||
--datarootdir=#{share}
|
||||
--datadir=#{share}
|
||||
--enable-framework=#{frameworks}
|
||||
--enable-loadable-sqlite-extensions
|
||||
--without-ensurepip
|
||||
--with-dtrace
|
||||
--with-openssl=#{Formula["openssl@1.1"].opt_prefix}
|
||||
--with-system-libmpdec
|
||||
]
|
||||
|
||||
args << "--without-gcc" if ENV.compiler == :clang
|
||||
|
||||
on_macos do
|
||||
args << "--enable-framework=#{frameworks}"
|
||||
args << "--with-dtrace"
|
||||
end
|
||||
|
||||
on_linux do
|
||||
args << "--enable-shared"
|
||||
|
||||
# Required for the _ctypes module
|
||||
# see https://github.com/Linuxbrew/homebrew-core/pull/1007#issuecomment-252421573
|
||||
args << "--with-system-ffi"
|
||||
end
|
||||
|
||||
cflags = []
|
||||
ldflags = []
|
||||
cppflags = []
|
||||
|
@ -134,6 +163,14 @@ class PythonAT37 < Formula
|
|||
# Avoid linking to libgcc https://mail.python.org/pipermail/python-dev/2012-February/116205.html
|
||||
args << "MACOSX_DEPLOYMENT_TARGET=#{MacOS.version}"
|
||||
|
||||
# Python's setup.py parses CPPFLAGS and LDFLAGS to learn search
|
||||
# paths for the dependencies of the compiled extension modules.
|
||||
# See Linuxbrew/linuxbrew#420, Linuxbrew/linuxbrew#460, and Linuxbrew/linuxbrew#875
|
||||
on_linux do
|
||||
cppflags << ENV.cppflags << " -I#{HOMEBREW_PREFIX}/include"
|
||||
ldflags << ENV.ldflags << " -L#{HOMEBREW_PREFIX}/lib"
|
||||
end
|
||||
|
||||
# We want our readline! This is just to outsmart the detection code,
|
||||
# superenv makes cc always find includes/libs!
|
||||
inreplace "setup.py",
|
||||
|
@ -164,33 +201,45 @@ class PythonAT37 < Formula
|
|||
ENV.deparallelize do
|
||||
# Tell Python not to install into /Applications (default for framework builds)
|
||||
system "make", "install", "PYTHONAPPSDIR=#{prefix}"
|
||||
system "make", "frameworkinstallextras", "PYTHONAPPSDIR=#{pkgshare}"
|
||||
on_macos do
|
||||
system "make", "frameworkinstallextras", "PYTHONAPPSDIR=#{pkgshare}"
|
||||
end
|
||||
end
|
||||
|
||||
# Any .app get a " 3" attached, so it does not conflict with python 2.x.
|
||||
Dir.glob("#{prefix}/*.app") { |app| mv app, app.sub(/\.app$/, " 3.app") }
|
||||
|
||||
# Prevent third-party packages from building against fragile Cellar paths
|
||||
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py",
|
||||
lib_cellar/"config*/Makefile",
|
||||
frameworks/"Python.framework/Versions/3*/lib/pkgconfig/python-3.?.pc"],
|
||||
prefix, opt_prefix
|
||||
on_macos do
|
||||
# Prevent third-party packages from building against fragile Cellar paths
|
||||
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py",
|
||||
lib_cellar/"config*/Makefile",
|
||||
frameworks/"Python.framework/Versions/3*/lib/pkgconfig/python-3.?.pc"],
|
||||
prefix, opt_prefix
|
||||
|
||||
# Help third-party packages find the Python framework
|
||||
inreplace Dir[lib_cellar/"config*/Makefile"],
|
||||
/^LINKFORSHARED=(.*)PYTHONFRAMEWORKDIR(.*)/,
|
||||
"LINKFORSHARED=\\1PYTHONFRAMEWORKINSTALLDIR\\2"
|
||||
# Help third-party packages find the Python framework
|
||||
inreplace Dir[lib_cellar/"config*/Makefile"],
|
||||
/^LINKFORSHARED=(.*)PYTHONFRAMEWORKDIR(.*)/,
|
||||
"LINKFORSHARED=\\1PYTHONFRAMEWORKINSTALLDIR\\2"
|
||||
|
||||
# Fix for https://github.com/Homebrew/homebrew-core/issues/21212
|
||||
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py"],
|
||||
%r{('LINKFORSHARED': .*?)'(Python.framework/Versions/3.\d+/Python)'}m,
|
||||
"\\1'#{opt_prefix}/Frameworks/\\2'"
|
||||
# Fix for https://github.com/Homebrew/homebrew-core/issues/21212
|
||||
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_darwin_darwin.py"],
|
||||
%r{('LINKFORSHARED': .*?)'(Python.framework/Versions/3.\d+/Python)'}m,
|
||||
"\\1'#{opt_prefix}/Frameworks/\\2'"
|
||||
end
|
||||
|
||||
on_linux do
|
||||
# Prevent third-party packages from building against fragile Cellar paths
|
||||
inreplace Dir[lib_cellar/"**/_sysconfigdata_m_linux_x86_64-*.py",
|
||||
lib_cellar/"config*/Makefile",
|
||||
lib/"pkgconfig/python-3.?.pc"],
|
||||
prefix, opt_prefix
|
||||
end
|
||||
|
||||
# Symlink the pkgconfig files into HOMEBREW_PREFIX so they're accessible.
|
||||
(lib/"pkgconfig").install_symlink Dir["#{frameworks}/Python.framework/Versions/#{xy}/lib/pkgconfig/*"]
|
||||
(lib/"pkgconfig").install_symlink Dir["#{frameworks}/Python.framework/Versions/#{version.major_minor}/lib/pkgconfig/*"]
|
||||
|
||||
# Remove the site-packages that Python created in its Cellar.
|
||||
(prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/site-packages").rmtree
|
||||
site_packages_cellar.rmtree
|
||||
|
||||
%w[setuptools pip wheel importlib-metadata zipp].each do |r|
|
||||
(libexec/r).install resource(r)
|
||||
|
@ -215,14 +264,10 @@ class PythonAT37 < Formula
|
|||
def post_install
|
||||
ENV.delete "PYTHONPATH"
|
||||
|
||||
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
|
||||
site_packages = HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"
|
||||
site_packages_cellar = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/site-packages"
|
||||
|
||||
# Fix up the site-packages so that user-installed Python software survives
|
||||
# minor updates, such as going from 3.3.2 to 3.3.3:
|
||||
|
||||
# Create a site-packages in HOMEBREW_PREFIX/lib/python#{xy}/site-packages
|
||||
# Create a site-packages in HOMEBREW_PREFIX/lib/python#{version.major_minor}/site-packages
|
||||
site_packages.mkpath
|
||||
|
||||
# Symlink the prefix site-packages into the cellar.
|
||||
|
@ -268,7 +313,7 @@ class PythonAT37 < Formula
|
|||
library_dirs = [HOMEBREW_PREFIX/"lib", Formula["openssl@1.1"].opt_lib,
|
||||
Formula["sqlite"].opt_lib]
|
||||
|
||||
cfg = prefix/"Frameworks/Python.framework/Versions/#{xy}/lib/python#{xy}/distutils/distutils.cfg"
|
||||
cfg = lib_cellar/"distutils/distutils.cfg"
|
||||
|
||||
cfg.atomic_write <<~EOS
|
||||
[install]
|
||||
|
@ -281,8 +326,6 @@ class PythonAT37 < Formula
|
|||
end
|
||||
|
||||
def sitecustomize
|
||||
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
|
||||
|
||||
<<~EOS
|
||||
# This file is created by Homebrew and is executed on each python startup.
|
||||
# Don't print from here, or else python command line scripts may fail!
|
||||
|
@ -304,7 +347,7 @@ class PythonAT37 < Formula
|
|||
# Only do this for a brewed python:
|
||||
if os.path.realpath(sys.executable).startswith('#{rack}'):
|
||||
# Shuffle /Library site-packages to the end of sys.path
|
||||
library_site = '/Library/Python/#{xy}/site-packages'
|
||||
library_site = '/Library/Python/#{version.major_minor}/site-packages'
|
||||
library_packages = [p for p in sys.path if p.startswith(library_site)]
|
||||
sys.path = [p for p in sys.path if not p.startswith(library_site)]
|
||||
# .pth files have already been processed so don't use addsitedir
|
||||
|
@ -312,22 +355,17 @@ class PythonAT37 < Formula
|
|||
|
||||
# the Cellar site-packages is a symlink to the HOMEBREW_PREFIX
|
||||
# site_packages; prefer the shorter paths
|
||||
long_prefix = re.compile(r'#{rack}/[0-9\._abrc]+/Frameworks/Python\.framework/Versions/#{xy}/lib/python#{xy}/site-packages')
|
||||
sys.path = [long_prefix.sub('#{HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"}', p) for p in sys.path]
|
||||
long_prefix = re.compile(r'#{rack}/[0-9\._abrc]+/Frameworks/Python\.framework/Versions/#{version.major_minor}/lib/python#{version.major_minor}/site-packages')
|
||||
sys.path = [long_prefix.sub('#{site_packages}', p) for p in sys.path]
|
||||
|
||||
# Set the sys.executable to use the opt_prefix. Only do this if PYTHONEXECUTABLE is not
|
||||
# explicitly set and we are not in a virtualenv:
|
||||
if 'PYTHONEXECUTABLE' not in os.environ and sys.prefix == sys.base_prefix:
|
||||
sys.executable = '#{opt_bin}/python#{xy}'
|
||||
sys.executable = '#{opt_bin}/python#{version.major_minor}'
|
||||
EOS
|
||||
end
|
||||
|
||||
def caveats
|
||||
xy = if prefix.exist?
|
||||
(prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
|
||||
else
|
||||
version.to_s.slice(/(3\.\d)/) || "3.7"
|
||||
end
|
||||
<<~EOS
|
||||
Python has been installed as
|
||||
#{opt_bin}/python3
|
||||
|
@ -339,26 +377,27 @@ class PythonAT37 < Formula
|
|||
You can install Python packages with
|
||||
#{opt_bin}/pip3 install <package>
|
||||
They will install into the site-package directory
|
||||
#{HOMEBREW_PREFIX/"lib/python#{xy}/site-packages"}
|
||||
#{HOMEBREW_PREFIX/"lib/python#{version.major_minor}/site-packages"}
|
||||
|
||||
See: https://docs.brew.sh/Homebrew-and-Python
|
||||
EOS
|
||||
end
|
||||
|
||||
test do
|
||||
xy = (prefix/"Frameworks/Python.framework/Versions").children.min.basename.to_s
|
||||
# Check if sqlite is ok, because we build with --enable-loadable-sqlite-extensions
|
||||
# and it can occur that building sqlite silently fails if OSX's sqlite is used.
|
||||
system "#{bin}/python#{xy}", "-c", "import sqlite3"
|
||||
system "#{bin}/python#{version.major_minor}", "-c", "import sqlite3"
|
||||
# Check if some other modules import. Then the linked libs are working.
|
||||
|
||||
# Temporary failure on macOS 11.1 due to https://bugs.python.org/issue42480
|
||||
# Reenable unconditionnaly once Apple fixes the Tcl/Tk issue
|
||||
system "#{bin}/python#{xy}", "-c", "import tkinter; root = tkinter.Tk()" if MacOS.full_version < "11.1"
|
||||
on_macos do
|
||||
# Temporary failure on macOS 11.1 due to https://bugs.python.org/issue42480
|
||||
# Reenable unconditionnaly once Apple fixes the Tcl/Tk issue
|
||||
system "#{bin}/python#{version.major_minor}", "-c", "import tkinter; root = tkinter.Tk()" if MacOS.full_version < "11.1"
|
||||
end
|
||||
|
||||
system "#{bin}/python#{xy}", "-c", "import _decimal"
|
||||
system "#{bin}/python#{xy}", "-c", "import _gdbm"
|
||||
system "#{bin}/python#{xy}", "-c", "import zlib"
|
||||
system "#{bin}/python#{version.major_minor}", "-c", "import _decimal"
|
||||
system "#{bin}/python#{version.major_minor}", "-c", "import _gdbm"
|
||||
system "#{bin}/python#{version.major_minor}", "-c", "import zlib"
|
||||
system bin/"pip3", "list", "--format=columns"
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue