mirror of
https://git.yoctoproject.org/poky
synced 2026-02-05 16:28:43 +01:00
There are cases where target and host are of the same type and at such instances the target modules may be loaded if CROSSPYTHONPATH is not correct. This adds host library paths so that target modules are not loaded while cross compiling to avoid illegal instruction issues. (From OE-Core rev: 20c637ef40f2de9c2848ac1fb25240dea84cdb7b) Signed-off-by: Awais Belal <awais_belal@mentor.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
225 lines
8.6 KiB
BlitzBasic
225 lines
8.6 KiB
BlitzBasic
require recipes-devtools/python/python.inc
|
|
|
|
DEPENDS = "python3-native libffi bzip2 db gdbm openssl readline sqlite3 zlib virtual/libintl xz"
|
|
PR = "${INC_PR}.0"
|
|
PYTHON_MAJMIN = "3.5"
|
|
PYTHON_BINABI= "${PYTHON_MAJMIN}m"
|
|
DISTRO_SRC_URI ?= "file://sitecustomize.py"
|
|
DISTRO_SRC_URI_linuxstdbase = ""
|
|
SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
|
|
file://python-config.patch \
|
|
file://000-cross-compile.patch \
|
|
file://020-dont-compile-python-files.patch \
|
|
file://030-fixup-include-dirs.patch \
|
|
file://070-dont-clean-ipkg-install.patch \
|
|
file://080-distutils-dont_adjust_files.patch \
|
|
file://130-readline-setup.patch \
|
|
file://150-fix-setupterm.patch \
|
|
file://0001-h2py-Fix-issue-13032-where-it-fails-with-UnicodeDeco.patch \
|
|
file://tweak-MULTIARCH-for-powerpc-linux-gnuspe.patch \
|
|
${DISTRO_SRC_URI} \
|
|
"
|
|
|
|
SRC_URI += "\
|
|
file://03-fix-tkinter-detection.patch \
|
|
file://avoid_warning_about_tkinter.patch \
|
|
file://cgi_py.patch \
|
|
file://host_include_contamination.patch \
|
|
file://python-3.3-multilib.patch \
|
|
file://shutil-follow-symlink-fix.patch \
|
|
file://sysroot-include-headers.patch \
|
|
file://unixccompiler.patch \
|
|
file://avoid-ncursesw-include-path.patch \
|
|
file://python3-use-CROSSPYTHONPATH-for-PYTHON_FOR_BUILD.patch \
|
|
file://python3-setup.py-no-host-headers-libs.patch \
|
|
file://sysconfig.py-add-_PYTHON_PROJECT_SRC.patch \
|
|
file://setup.py-check-cross_compiling-when-get-FLAGS.patch \
|
|
file://setup.py-find-libraries-in-staging-dirs.patch \
|
|
file://use_packed_importlib.patch \
|
|
file://configure.ac-fix-LIBPL.patch \
|
|
"
|
|
SRC_URI[md5sum] = "e9ea6f2623fffcdd871b7b19113fde80"
|
|
SRC_URI[sha256sum] = "c6d57c0c366d9060ab6c0cdf889ebf3d92711d466cc0119c441dbf2746f725c9"
|
|
|
|
# exclude pre-releases for both python 2.x and 3.x
|
|
UPSTREAM_CHECK_REGEX = "[Pp]ython-(?P<pver>\d+(\.\d+)+).tar"
|
|
|
|
LIC_FILES_CHKSUM = "file://LICENSE;md5=dd98d01d471fac8d8dbdd975229dba03"
|
|
|
|
S = "${WORKDIR}/Python-${PV}"
|
|
|
|
inherit autotools multilib_header python3native pkgconfig
|
|
|
|
CONFIGUREOPTS += " --with-system-ffi "
|
|
|
|
CACHED_CONFIGUREVARS = "ac_cv_have_chflags=no \
|
|
ac_cv_have_lchflags=no \
|
|
ac_cv_have_long_long_format=yes \
|
|
ac_cv_buggy_getaddrinfo=no \
|
|
ac_cv_file__dev_ptmx=yes \
|
|
ac_cv_file__dev_ptc=no \
|
|
"
|
|
|
|
TARGET_CC_ARCH += "-DNDEBUG -fno-inline"
|
|
SDK_CC_ARCH += "-DNDEBUG -fno-inline"
|
|
EXTRA_OEMAKE += "CROSS_COMPILE=yes"
|
|
EXTRA_OECONF += "CROSSPYTHONPATH=${STAGING_LIBDIR_NATIVE}/python${PYTHON_MAJMIN}/lib-dynload/ --without-ensurepip"
|
|
|
|
export CROSS_COMPILE = "${TARGET_PREFIX}"
|
|
export _PYTHON_PROJECT_BASE = "${B}"
|
|
export _PYTHON_PROJECT_SRC = "${S}"
|
|
export CCSHARED = "-fPIC"
|
|
|
|
# Fix cross compilation of different modules
|
|
export CROSSPYTHONPATH = "${STAGING_LIBDIR_NATIVE}/python${PYTHON_MAJMIN}/lib-dynload/:${B}/build/lib.linux-${TARGET_ARCH}-${PYTHON_MAJMIN}:${S}/Lib:${S}/Lib/plat-linux"
|
|
|
|
# No ctypes option for python 3
|
|
PYTHONLSBOPTS = ""
|
|
|
|
do_configure_append() {
|
|
rm -f ${S}/Makefile.orig
|
|
autoreconf -Wcross --verbose --install --force --exclude=autopoint ../Python-${PV}/Modules/_ctypes/libffi
|
|
}
|
|
|
|
do_compile() {
|
|
# regenerate platform specific files, because they depend on system headers
|
|
cd ${S}/Lib/plat-linux*
|
|
include=${STAGING_INCDIR} ${STAGING_BINDIR_NATIVE}/python3-native/python3 \
|
|
${S}/Tools/scripts/h2py.py -i '(u_long)' \
|
|
${STAGING_INCDIR}/dlfcn.h \
|
|
${STAGING_INCDIR}/linux/cdrom.h \
|
|
${STAGING_INCDIR}/netinet/in.h \
|
|
${STAGING_INCDIR}/sys/types.h
|
|
sed -e 's,${STAGING_DIR_HOST},,g' -i *.py
|
|
cd -
|
|
|
|
|
|
# remove any bogus LD_LIBRARY_PATH
|
|
sed -i -e s,RUNSHARED=.*,RUNSHARED=, Makefile
|
|
|
|
if [ ! -f Makefile.orig ]; then
|
|
install -m 0644 Makefile Makefile.orig
|
|
fi
|
|
sed -i -e 's,^CONFIGURE_LDFLAGS=.*,CONFIGURE_LDFLAGS=-L. -L${STAGING_LIBDIR},g' \
|
|
-e 's,libdir=${libdir},libdir=${STAGING_LIBDIR},g' \
|
|
-e 's,libexecdir=${libexecdir},libexecdir=${STAGING_DIR_HOST}${libexecdir},g' \
|
|
-e 's,^LIBDIR=.*,LIBDIR=${STAGING_LIBDIR},g' \
|
|
-e 's,includedir=${includedir},includedir=${STAGING_INCDIR},g' \
|
|
-e 's,^INCLUDEDIR=.*,INCLUDE=${STAGING_INCDIR},g' \
|
|
-e 's,^CONFINCLUDEDIR=.*,CONFINCLUDE=${STAGING_INCDIR},g' \
|
|
Makefile
|
|
# save copy of it now, because if we do it in do_install and
|
|
# then call do_install twice we get Makefile.orig == Makefile.sysroot
|
|
install -m 0644 Makefile Makefile.sysroot
|
|
|
|
oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/python3-native/pgen \
|
|
HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
|
|
STAGING_LIBDIR=${STAGING_LIBDIR} \
|
|
STAGING_BASELIBDIR=${STAGING_BASELIBDIR} \
|
|
STAGING_INCDIR=${STAGING_INCDIR} \
|
|
LIB=${baselib} \
|
|
ARCH=${TARGET_ARCH} \
|
|
OPT="${CFLAGS}" libpython3.so
|
|
|
|
oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/python3-native/pgen \
|
|
HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
|
|
STAGING_LIBDIR=${STAGING_LIBDIR} \
|
|
STAGING_INCDIR=${STAGING_INCDIR} \
|
|
STAGING_BASELIBDIR=${STAGING_BASELIBDIR} \
|
|
LIB=${baselib} \
|
|
ARCH=${TARGET_ARCH} \
|
|
OPT="${CFLAGS}"
|
|
}
|
|
|
|
do_install() {
|
|
# make install needs the original Makefile, or otherwise the inclues would
|
|
# go to ${D}${STAGING...}/...
|
|
install -m 0644 Makefile.orig Makefile
|
|
|
|
install -d ${D}${libdir}/pkgconfig
|
|
install -d ${D}${libdir}/python${PYTHON_MAJMIN}/config
|
|
|
|
# rerun the build once again with original makefile this time
|
|
# run install in a separate step to avoid compile/install race
|
|
oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/python3-native/pgen \
|
|
HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
|
|
STAGING_LIBDIR=${STAGING_LIBDIR} \
|
|
STAGING_INCDIR=${STAGING_INCDIR} \
|
|
STAGING_BASELIBDIR=${STAGING_BASELIBDIR} \
|
|
LIB=${baselib} \
|
|
ARCH=${TARGET_ARCH} \
|
|
DESTDIR=${D} LIBDIR=${libdir}
|
|
|
|
oe_runmake HOSTPGEN=${STAGING_BINDIR_NATIVE}/python3-native/pgen \
|
|
HOSTPYTHON=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
|
|
STAGING_LIBDIR=${STAGING_LIBDIR} \
|
|
STAGING_INCDIR=${STAGING_INCDIR} \
|
|
STAGING_BASELIBDIR=${STAGING_BASELIBDIR} \
|
|
LIB=${baselib} \
|
|
ARCH=${TARGET_ARCH} \
|
|
DESTDIR=${D} LIBDIR=${libdir} install
|
|
|
|
# avoid conflict with 2to3 from Python 2
|
|
rm -f ${D}/${bindir}/2to3
|
|
|
|
install -m 0644 Makefile.sysroot ${D}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile
|
|
install -m 0644 Makefile.sysroot ${D}/${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}/Makefile
|
|
|
|
if [ -e ${WORKDIR}/sitecustomize.py ]; then
|
|
install -m 0644 ${WORKDIR}/sitecustomize.py ${D}/${libdir}/python${PYTHON_MAJMIN}
|
|
fi
|
|
|
|
oe_multilib_header python${PYTHON_BINABI}/pyconfig.h
|
|
}
|
|
|
|
do_install_append_class-nativesdk () {
|
|
create_wrapper ${D}${bindir}/python${PYTHON_MAJMIN} TERMINFO_DIRS='${sysconfdir}/terminfo:/etc/terminfo:/usr/share/terminfo:/usr/share/misc/terminfo:/lib/terminfo'
|
|
}
|
|
|
|
SSTATE_SCAN_FILES += "Makefile"
|
|
PACKAGE_PREPROCESS_FUNCS += "py_package_preprocess"
|
|
|
|
py_package_preprocess () {
|
|
# copy back the old Makefile to fix target package
|
|
install -m 0644 ${B}/Makefile.orig ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile
|
|
install -m 0644 ${B}/Makefile.orig ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}/Makefile
|
|
# Remove references to buildmachine paths in target Makefile and _sysconfigdata
|
|
sed -i -e 's:--sysroot=${STAGING_DIR_TARGET}::g' -e s:'--with-libtool-sysroot=${STAGING_DIR_TARGET}'::g \
|
|
${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config/Makefile \
|
|
${PKGD}/${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}/Makefile \
|
|
${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata.py
|
|
}
|
|
|
|
require python-${PYTHON_MAJMIN}-manifest.inc
|
|
|
|
# manual dependency additions
|
|
RPROVIDES_${PN}-core = "${PN}"
|
|
RRECOMMENDS_${PN}-core = "${PN}-readline"
|
|
RRECOMMENDS_${PN}-crypt = "openssl"
|
|
RRECOMMENDS_${PN}-crypt_class-nativesdk = "nativesdk-openssl"
|
|
|
|
FILES_${PN}-2to3 += "${bindir}/2to3-${PYTHON_MAJMIN}"
|
|
FILES_${PN}-pydoc += "${bindir}/pydoc${PYTHON_MAJMIN} ${bindir}/pydoc3"
|
|
FILES_${PN}-idle += "${bindir}/idle3 ${bindir}/idle${PYTHON_MAJMIN}"
|
|
|
|
PACKAGES =+ "${PN}-pyvenv"
|
|
FILES_${PN}-pyvenv += "${bindir}/pyvenv-${PYTHON_MAJMIN} ${bindir}/pyvenv"
|
|
|
|
# package libpython3
|
|
PACKAGES =+ "libpython3 libpython3-staticdev"
|
|
FILES_libpython3 = "${libdir}/libpython*.so.*"
|
|
FILES_libpython3-staticdev += "${libdir}/python${PYTHON_MAJMIN}/config-${PYTHON_BINABI}/libpython${PYTHON_BINABI}.a"
|
|
INSANE_SKIP_${PN}-dev += "dev-elf"
|
|
|
|
# catch all the rest (unsorted)
|
|
PACKAGES += "${PN}-misc"
|
|
RDEPENDS_${PN}-misc += "${PN}-core"
|
|
RDEPENDS_${PN}-modules += "${PN}-misc"
|
|
FILES_${PN}-misc = "${libdir}/python${PYTHON_MAJMIN}"
|
|
|
|
# catch manpage
|
|
PACKAGES += "${PN}-man"
|
|
FILES_${PN}-man = "${datadir}/man"
|
|
|
|
BBCLASSEXTEND = "nativesdk"
|