forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Michał Górny <[email protected]>
- Loading branch information
Showing
2 changed files
with
325 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,324 @@ | ||
# Copyright 1999-2020 Gentoo Authors | ||
# Distributed under the terms of the GNU General Public License v2 | ||
|
||
EAPI="7" | ||
WANT_LIBTOOL="none" | ||
|
||
inherit autotools check-reqs flag-o-matic pax-utils python-utils-r1 \ | ||
toolchain-funcs | ||
|
||
MY_P="Python-${PV/_alpha/a}" | ||
PYVER=$(ver_cut 1-2) | ||
PATCHSET="python-gentoo-patches-3.9.0_alpha2" | ||
|
||
DESCRIPTION="An interpreted, interactive, object-oriented programming language" | ||
HOMEPAGE="https://www.python.org/" | ||
SRC_URI="https://www.python.org/ftp/python/${PV%_*}/${MY_P}.tar.xz | ||
https://dev.gentoo.org/~mgorny/dist/python/${PATCHSET}.tar.xz" | ||
S="${WORKDIR}/${MY_P}" | ||
|
||
LICENSE="PSF-2" | ||
SLOT="${PYVER}" | ||
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sh ~sparc ~x86" | ||
IUSE="bluetooth build examples gdbm hardened ipv6 libressl +ncurses +readline sqlite +ssl test tk wininst +xml" | ||
RESTRICT="!test? ( test )" | ||
|
||
# Do not add a dependency on dev-lang/python to this ebuild. | ||
# If you need to apply a patch which requires python for bootstrapping, please | ||
# run the bootstrap code on your dev box and include the results in the | ||
# patchset. See bug 447752. | ||
|
||
RDEPEND="app-arch/bzip2:= | ||
app-arch/xz-utils:= | ||
dev-libs/libffi:= | ||
sys-apps/util-linux:= | ||
>=sys-libs/zlib-1.1.3:= | ||
virtual/libcrypt:= | ||
virtual/libintl | ||
gdbm? ( sys-libs/gdbm:=[berkdb] ) | ||
ncurses? ( >=sys-libs/ncurses-5.2:= ) | ||
readline? ( >=sys-libs/readline-4.1:= ) | ||
sqlite? ( >=dev-db/sqlite-3.3.8:3= ) | ||
ssl? ( | ||
!libressl? ( dev-libs/openssl:= ) | ||
libressl? ( dev-libs/libressl:= ) | ||
) | ||
tk? ( | ||
>=dev-lang/tcl-8.0:= | ||
>=dev-lang/tk-8.0:= | ||
dev-tcltk/blt:= | ||
dev-tcltk/tix | ||
) | ||
xml? ( >=dev-libs/expat-2.1:= )" | ||
# bluetooth requires headers from bluez | ||
DEPEND="${RDEPEND} | ||
bluetooth? ( net-wireless/bluez ) | ||
test? ( app-arch/xz-utils[extra-filters(+)] ) | ||
virtual/pkgconfig | ||
!sys-devel/gcc[libffi(-)]" | ||
RDEPEND+=" !build? ( app-misc/mime-types )" | ||
PDEPEND=">=app-eselect/eselect-python-20140125-r1" | ||
|
||
# large file tests involve a 2.5G file being copied (duplicated) | ||
CHECKREQS_DISK_BUILD=5500M | ||
|
||
pkg_pretend() { | ||
use test && check-reqs_pkg_pretend | ||
|
||
ewarn "This is an early developer preview of Python 3.9. New features" | ||
ewarn "can still be added up to 2020-05-18. It's not suitable for production" | ||
ewarn "use, and it is not supported for Gentoo packages." | ||
} | ||
|
||
pkg_setup() { | ||
use test && check-reqs_pkg_setup | ||
} | ||
|
||
src_prepare() { | ||
# Ensure that internal copies of expat, libffi and zlib are not used. | ||
rm -fr Modules/expat || die | ||
rm -fr Modules/_ctypes/libffi* || die | ||
rm -fr Modules/zlib || die | ||
|
||
local PATCHES=( | ||
"${WORKDIR}/${PATCHSET}" | ||
) | ||
|
||
default | ||
|
||
sed -i -e "s:@@GENTOO_LIBDIR@@:$(get_libdir):g" \ | ||
setup.py || die "sed failed to replace @@GENTOO_LIBDIR@@" | ||
|
||
eautoreconf | ||
} | ||
|
||
src_configure() { | ||
local disable | ||
# disable automagic bluetooth headers detection | ||
use bluetooth || export ac_cv_header_bluetooth_bluetooth_h=no | ||
use gdbm || disable+=" gdbm" | ||
use ncurses || disable+=" _curses _curses_panel" | ||
use readline || disable+=" readline" | ||
use sqlite || disable+=" _sqlite3" | ||
use ssl || export PYTHON_DISABLE_SSL="1" | ||
use tk || disable+=" _tkinter" | ||
use xml || disable+=" _elementtree pyexpat" # _elementtree uses pyexpat. | ||
export PYTHON_DISABLE_MODULES="${disable}" | ||
|
||
if ! use xml; then | ||
ewarn "You have configured Python without XML support." | ||
ewarn "This is NOT a recommended configuration as you" | ||
ewarn "may face problems parsing any XML documents." | ||
fi | ||
|
||
if [[ -n "${PYTHON_DISABLE_MODULES}" ]]; then | ||
einfo "Disabled modules: ${PYTHON_DISABLE_MODULES}" | ||
fi | ||
|
||
if [[ "$(gcc-major-version)" -ge 4 ]]; then | ||
append-flags -fwrapv | ||
fi | ||
|
||
filter-flags -malign-double | ||
|
||
# https://bugs.gentoo.org/show_bug.cgi?id=50309 | ||
if is-flagq -O3; then | ||
is-flagq -fstack-protector-all && replace-flags -O3 -O2 | ||
use hardened && replace-flags -O3 -O2 | ||
fi | ||
|
||
# https://bugs.gentoo.org/700012 | ||
if is-flagq -flto || is-flagq '-flto=*'; then | ||
append-cflags $(test-flags-CC -ffat-lto-objects) | ||
fi | ||
|
||
# Export CXX so it ends up in /usr/lib/python3.X/config/Makefile. | ||
tc-export CXX | ||
|
||
# Set LDFLAGS so we link modules with -lpython3.2 correctly. | ||
# Needed on FreeBSD unless Python 3.2 is already installed. | ||
# Please query BSD team before removing this! | ||
append-ldflags "-L." | ||
|
||
# Fix implicit declarations on cross and prefix builds. Bug #674070. | ||
use ncurses && append-cppflags -I"${ESYSROOT}"/usr/include/ncursesw | ||
|
||
local dbmliborder | ||
if use gdbm; then | ||
dbmliborder+="${dbmliborder:+:}gdbm" | ||
fi | ||
|
||
local myeconfargs=( | ||
--enable-shared | ||
$(use_enable ipv6) | ||
--infodir='${prefix}/share/info' | ||
--mandir='${prefix}/share/man' | ||
--with-computed-gotos | ||
--with-dbmliborder="${dbmliborder}" | ||
--with-libc= | ||
--enable-loadable-sqlite-extensions | ||
--without-ensurepip | ||
--with-system-expat | ||
--with-system-ffi | ||
) | ||
|
||
OPT="" econf "${myeconfargs[@]}" | ||
} | ||
|
||
src_compile() { | ||
# Ensure sed works as expected | ||
# https://bugs.gentoo.org/594768 | ||
local -x LC_ALL=C | ||
|
||
emake CPPFLAGS= CFLAGS= LDFLAGS= | ||
|
||
# Work around bug 329499. See also bug 413751 and 457194. | ||
if has_version dev-libs/libffi[pax_kernel]; then | ||
pax-mark E python | ||
else | ||
pax-mark m python | ||
fi | ||
} | ||
|
||
src_test() { | ||
# Tests will not work when cross compiling. | ||
if tc-is-cross-compiler; then | ||
elog "Disabling tests due to crosscompiling." | ||
return | ||
fi | ||
|
||
# Skip failing tests. | ||
local skipped_tests="gdb" | ||
|
||
for test in ${skipped_tests}; do | ||
mv "${S}"/Lib/test/test_${test}.py "${T}" | ||
done | ||
|
||
# bug 660358 | ||
local -x COLUMNS=80 | ||
|
||
local -x PYTHONDONTWRITEBYTECODE= | ||
|
||
emake test EXTRATESTOPTS="-u-network" CPPFLAGS= CFLAGS= LDFLAGS= < /dev/tty | ||
local result=$? | ||
|
||
for test in ${skipped_tests}; do | ||
mv "${T}/test_${test}.py" "${S}"/Lib/test | ||
done | ||
|
||
elog "The following tests have been skipped:" | ||
for test in ${skipped_tests}; do | ||
elog "test_${test}.py" | ||
done | ||
|
||
elog "If you would like to run them, you may:" | ||
elog "cd '${EPREFIX}/usr/lib/python${PYVER}/test'" | ||
elog "and run the tests separately." | ||
|
||
if [[ ${result} -ne 0 ]]; then | ||
die "emake test failed" | ||
fi | ||
} | ||
|
||
src_install() { | ||
local libdir=${ED}/usr/lib/python${PYVER} | ||
|
||
emake DESTDIR="${D}" altinstall | ||
|
||
# Remove static library | ||
rm "${ED}"/usr/$(get_libdir)/libpython*.a || die | ||
|
||
sed \ | ||
-e "s/\(CONFIGURE_LDFLAGS=\).*/\1/" \ | ||
-e "s/\(PY_LDFLAGS=\).*/\1/" \ | ||
-i "${libdir}/config-${PYVER}"*/Makefile || die "sed failed" | ||
|
||
# Fix collisions between different slots of Python. | ||
rm "${ED}/usr/$(get_libdir)/libpython3.so" || die | ||
|
||
# Cheap hack to get version with ABIFLAGS | ||
local abiver=$(cd "${ED}/usr/include"; echo python*) | ||
if [[ ${abiver} != python${PYVER} ]]; then | ||
# Replace python3.X with a symlink to python3.Xm | ||
rm "${ED}/usr/bin/python${PYVER}" || die | ||
dosym "${abiver}" "/usr/bin/python${PYVER}" | ||
# Create python3.X-config symlink | ||
dosym "${abiver}-config" "/usr/bin/python${PYVER}-config" | ||
# Create python-3.5m.pc symlink | ||
dosym "python-${PYVER}.pc" "/usr/$(get_libdir)/pkgconfig/${abiver/${PYVER}/-${PYVER}}.pc" | ||
fi | ||
|
||
# python seems to get rebuilt in src_install (bug 569908) | ||
# Work around it for now. | ||
if has_version dev-libs/libffi[pax_kernel]; then | ||
pax-mark E "${ED}/usr/bin/${abiver}" | ||
else | ||
pax-mark m "${ED}/usr/bin/${abiver}" | ||
fi | ||
|
||
use sqlite || rm -r "${libdir}/"{sqlite3,test/test_sqlite*} || die | ||
use tk || rm -r "${ED}/usr/bin/idle${PYVER}" "${libdir}/"{idlelib,tkinter,test/test_tk*} || die | ||
|
||
dodoc Misc/{ACKS,HISTORY,NEWS} | ||
|
||
if use examples; then | ||
docinto examples | ||
find Tools -name __pycache__ -exec rm -fr {} + || die | ||
dodoc -r Tools | ||
fi | ||
insinto /usr/share/gdb/auto-load/usr/$(get_libdir) #443510 | ||
local libname=$(printf 'e:\n\t@echo $(INSTSONAME)\ninclude Makefile\n' | \ | ||
emake --no-print-directory -s -f - 2>/dev/null) | ||
newins "${S}"/Tools/gdb/libpython.py "${libname}"-gdb.py | ||
|
||
newconfd "${FILESDIR}/pydoc.conf" pydoc-${PYVER} | ||
newinitd "${FILESDIR}/pydoc.init" pydoc-${PYVER} | ||
sed \ | ||
-e "s:@PYDOC_PORT_VARIABLE@:PYDOC${PYVER/./_}_PORT:" \ | ||
-e "s:@PYDOC@:pydoc${PYVER}:" \ | ||
-i "${ED}/etc/conf.d/pydoc-${PYVER}" \ | ||
"${ED}/etc/init.d/pydoc-${PYVER}" || die "sed failed" | ||
|
||
# for python-exec | ||
local vars=( EPYTHON PYTHON_SITEDIR PYTHON_SCRIPTDIR ) | ||
|
||
# if not using a cross-compiler, use the fresh binary | ||
if ! tc-is-cross-compiler; then | ||
local -x PYTHON=./python | ||
local -x LD_LIBRARY_PATH=${LD_LIBRARY_PATH+${LD_LIBRARY_PATH}:}${PWD} | ||
else | ||
vars=( PYTHON "${vars[@]}" ) | ||
fi | ||
|
||
python_export "python${PYVER}" "${vars[@]}" | ||
echo "EPYTHON='${EPYTHON}'" > epython.py || die | ||
python_domodule epython.py | ||
|
||
# python-exec wrapping support | ||
local pymajor=${PYVER%.*} | ||
mkdir -p "${D}${PYTHON_SCRIPTDIR}" || die | ||
# python and pythonX | ||
ln -s "../../../bin/${abiver}" \ | ||
"${D}${PYTHON_SCRIPTDIR}/python${pymajor}" || die | ||
ln -s "python${pymajor}" "${D}${PYTHON_SCRIPTDIR}/python" || die | ||
# python-config and pythonX-config | ||
# note: we need to create a wrapper rather than symlinking it due | ||
# to some random dirname(argv[0]) magic performed by python-config | ||
cat > "${D}${PYTHON_SCRIPTDIR}/python${pymajor}-config" <<-EOF || die | ||
#!/bin/sh | ||
exec "${abiver}-config" "\${@}" | ||
EOF | ||
chmod +x "${D}${PYTHON_SCRIPTDIR}/python${pymajor}-config" || die | ||
ln -s "python${pymajor}-config" \ | ||
"${D}${PYTHON_SCRIPTDIR}/python-config" || die | ||
# 2to3, pydoc | ||
ln -s "../../../bin/2to3-${PYVER}" \ | ||
"${D}${PYTHON_SCRIPTDIR}/2to3" || die | ||
ln -s "../../../bin/pydoc${PYVER}" \ | ||
"${D}${PYTHON_SCRIPTDIR}/pydoc" || die | ||
# idle | ||
if use tk; then | ||
ln -s "../../../bin/idle${PYVER}" \ | ||
"${D}${PYTHON_SCRIPTDIR}/idle" || die | ||
fi | ||
} |