All of lore.kernel.org
 help / color / mirror / Atom feed
* Why python3 is build native in yocto ??? #python
@ 2020-11-06  8:23 william.jacob
  2020-11-06  8:47 ` [yocto] " Josef Holzmayr
  2020-11-06  8:51 ` Ross Burton
  0 siblings, 2 replies; 7+ messages in thread
From: william.jacob @ 2020-11-06  8:23 UTC (permalink / raw)
  To: yocto


[-- Attachment #1.1: Type: text/plain, Size: 415 bytes --]

Hi,
I am trying to compile python package for yocto and I found  python3 (python3.7) is  build native then it cross compiled.I want to know why it is done like this in python.

Basically I want python3 binary cross compiled for arm architecture should be available in recipe-sysroot and  recipe-sysroot-native directory . Right now it is available only in recipe-sysroot-native.

Thanks

William Jacob

[-- Attachment #1.2: Type: text/html, Size: 482 bytes --]

[-- Attachment #2: python3_3.7.2.bb --]
[-- Type: application/octet-stream, Size: 11909 bytes --]

zSUMMARY = "The Python Programming Language"
HOMEPAGE = "http://www.python.org"
LICENSE = "PSFv2"
SECTION = "devel/python"

LIC_FILES_CHKSUM = "file://LICENSE;md5=f257cc14f81685691652a3d3e1b5d754"

SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
           file://run-ptest \
           file://create_manifest3.py \
           file://get_module_deps3.py \
           file://python3-manifest.json \
           file://check_build_completeness.py \
           file://cgi_py.patch \
           file://0001-Do-not-add-usr-lib-termcap-to-linker-flags-to-avoid-.patch \
           ${@bb.utils.contains('PACKAGECONFIG', 'tk', '', 'file://avoid_warning_about_tkinter.patch', d)} \
           file://0001-Do-not-use-the-shell-version-of-python-config-that-w.patch \
           file://python-config.patch \
           file://0001-Makefile.pre-use-qemu-wrapper-when-gathering-profile.patch \
           file://0001-Do-not-hardcode-lib-as-location-for-site-packages-an.patch \
           file://0001-python3-use-cc_basename-to-replace-CC-for-checking-c.patch \
           file://0002-Don-t-do-runtime-test-to-get-float-byte-order.patch \
           file://0003-setup.py-pass-missing-libraries-to-Extension-for-mul.patch \
           file://ptesthack.patch \
           "

SRC_URI_append_class-native = " \
           file://0001-distutils-sysconfig-append-STAGING_LIBDIR-python-sys.patch \
           file://12-distutils-prefix-is-inside-staging-area.patch \
           "

SRC_URI[md5sum] = "df6ec36011808205beda239c72f947cb"
SRC_URI[sha256sum] = "d83fe8ce51b1bb48bbcf0550fd265b9a75cdfdfa93f916f9e700aef8444bf1bb"


# exclude pre-releases for both python 2.x and 3.x
UPSTREAM_CHECK_REGEX = "[Pp]ython-(?P<pver>\d+(\.\d+)+).tar"

CVE_PRODUCT = "python"

PYTHON_MAJMIN = "3.7"
PYTHON_BINABI = "${PYTHON_MAJMIN}m"

S = "${WORKDIR}/Python-${PV}"

BBCLASSEXTEND = "native nativesdk"

inherit autotools pkgconfig qemu ptest multilib_header update-alternatives

MULTILIB_SUFFIX = "${@d.getVar('base_libdir',1).split('/')[-1]}"

ALTERNATIVE_${PN}-dev = "python-config"
ALTERNATIVE_LINK_NAME[python-config] = "${bindir}/python${PYTHON_BINABI}-config"
ALTERNATIVE_TARGET[python-config] = "${bindir}/python${PYTHON_BINABI}-config-${MULTILIB_SUFFIX}"


DEPENDS = "bzip2-replacement-native libffi bzip2 gdbm openssl sqlite3 zlib virtual/libintl xz virtual/crypt util-linux libtirpc libnsl2"
DEPENDS_append_class-target = " python3-native"
DEPENDS_append_class-nativesdk = " python3-native"

EXTRA_OECONF = " --without-ensurepip --enable-shared"
EXTRA_OECONF_append_class-native = " --bindir=${bindir}/${PN}"


EXTRANATIVEPATH += "python3-native"

CACHED_CONFIGUREVARS = " \
                ac_cv_file__dev_ptmx=yes \
                ac_cv_file__dev_ptc=no \
                ac_cv_working_tzset=yes \
"

PACKAGECONFIG_class-target ??= "readline ${@bb.utils.contains('MACHINE_FEATURES', 'qemu-usermode', 'pgo', '', d)}"
PACKAGECONFIG_class-native ??= "readline"
PACKAGECONFIG_class-nativesdk ??= "readline"
PACKAGECONFIG[readline] = ",,readline"
# Use profile guided optimisation by running PyBench inside qemu-user
PACKAGECONFIG[pgo] = "--enable-optimizations,,qemu-native"
PACKAGECONFIG[tk] = ",,tk"

CPPFLAGS_append = " -I${STAGING_INCDIR}/ncursesw -I${STAGING_INCDIR}/uuid"

EXTRA_OEMAKE = '\
  STAGING_LIBDIR=${STAGING_LIBDIR} \
  STAGING_INCDIR=${STAGING_INCDIR} \
  LIB=${baselib} \
'

do_compile_prepend_class-target() {
       if ${@bb.utils.contains('PACKAGECONFIG', 'pgo', 'true', 'false', d)}; then
                qemu_binary="${@qemu_wrapper_cmdline(d, '${STAGING_DIR_TARGET}', ['${B}', '${STAGING_DIR_TARGET}/${base_libdir}'])}"
                cat >pgo-wrapper <<EOF
#!/bin/sh
cd ${B}
$qemu_binary "\$@"
EOF
                chmod +x pgo-wrapper
        fi
}

do_install_prepend() {
        ${WORKDIR}/check_build_completeness.py ${T}/log.do_compile
}

do_install_append_class-target() {
        oe_multilib_header python${PYTHON_BINABI}/pyconfig.h
}

do_install_append_class-native() {
        # Make sure we use /usr/bin/env python
        for PYTHSCRIPT in `grep -rIl ${bindir}/${PN}/python ${D}${bindir}/${PN}`; do
                sed -i -e '1s|^#!.*|#!/usr/bin/env python3|' $PYTHSCRIPT
        done
        # Add a symlink to the native Python so that scripts can just invoke
        # "nativepython" and get the right one without needing absolute paths
        # (these often end up too long for the #! parser in the kernel as the
        # buffer is 128 bytes long).
        ln -s python3-native/python3 ${D}${bindir}/nativepython3
}

do_install_append() {
        mkdir -p ${D}${libdir}/python-sysconfigdata
        sysconfigfile=`find ${D} -name _sysconfig*.py`
        cp $sysconfigfile ${D}${libdir}/python-sysconfigdata/_sysconfigdata.py

        sed -i  \
                -e "s,^ 'LIBDIR'.*, 'LIBDIR': '${STAGING_LIBDIR}'\,,g" \
                -e "s,^ 'INCLUDEDIR'.*, 'INCLUDEDIR': '${STAGING_INCDIR}'\,,g" \
                -e "s,^ 'CONFINCLUDEDIR'.*, 'CONFINCLUDEDIR': '${STAGING_INCDIR}'\,,g" \
                -e "/^ 'INCLDIRSTOMAKE'/{N; s,/usr/include,${STAGING_INCDIR},g}" \
                -e "/^ 'INCLUDEPY'/s,/usr/include,${STAGING_INCDIR},g" \
                ${D}${libdir}/python-sysconfigdata/_sysconfigdata.py
}

SSTATE_SCAN_FILES += "Makefile _sysconfigdata.py"
PACKAGE_PREPROCESS_FUNCS += "py_package_preprocess"

py_package_preprocess () {
        # 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 \
                -e 's|${DEBUG_PREFIX_MAP}||g' \
                -e 's:${HOSTTOOLS_DIR}/::g' \
                -e 's:${RECIPE_SYSROOT_NATIVE}::g' \
                -e 's:${RECIPE_SYSROOT}::g' \
                -e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \
                ${PKGD}/${prefix}/lib/python${PYTHON_MAJMIN}/config-${PYTHON_MAJMIN}${PYTHON_ABI}*/Makefile \
                ${PKGD}/${libdir}/python${PYTHON_MAJMIN}/_sysconfigdata*.py \
                ${PKGD}/${bindir}/python${PYTHON_BINABI}-config

        # Recompile _sysconfigdata after modifying it
        cd ${PKGD}
        sysconfigfile=`find . -name _sysconfigdata_*.py`
        #william modified to non native
        ${STAGING_BINDIR_NATIVE}/python3-native/python3 \
             -c "from py_compile import compile; compile('$sysconfigfile')"
        ${STAGING_BINDIR_NATIVE}/python3-native/python3 \
             -c "from py_compile import compile; compile('$sysconfigfile', optimize=1)"
        ${STAGING_BINDIR_NATIVE}/python3-native/python3 \
             -c "from py_compile import compile; compile('$sysconfigfile', optimize=2)"

        cd -

        mv ${PKGD}/${bindir}/python${PYTHON_BINABI}-config ${PKGD}/${bindir}/python${PYTHON_BINABI}-config-${MULTILIB_SUFFIX}
        
        #Remove the unneeded copy of target sysconfig data
        rm -rf ${PKGD}/${libdir}/python-sysconfigdata
}

# We want bytecode precompiled .py files (.pyc's) by default
# but the user may set it on their own conf
INCLUDE_PYCS ?= "1"

python(){
    import collections, json

    filename = os.path.join(d.getVar('THISDIR'), 'python3', 'python3-manifest.json')
    # This python changes the datastore based on the contents of a file, so mark
    # that dependency.
    bb.parse.mark_dependency(d, filename)

    with open(filename) as manifest_file:
        manifest_str =  manifest_file.read()
        json_start = manifest_str.find('# EOC') + 6
        manifest_file.seek(json_start)
        manifest_str = manifest_file.read()
        python_manifest = json.loads(manifest_str, object_pairs_hook=collections.OrderedDict)

    # First set RPROVIDES for -native case
    # Hardcoded since it cant be python3-native-foo, should be python3-foo-native
    pn = 'python3'
    rprovides = d.getVar('RPROVIDES').split()

    for key in python_manifest:
        pypackage = pn + '-' + key + '-native'
        if pypackage not in rprovides:
              rprovides.append(pypackage)

    d.setVar('RPROVIDES_class-native', ' '.join(rprovides))

    # Then work on the target
    include_pycs = d.getVar('INCLUDE_PYCS')

    packages = d.getVar('PACKAGES').split()
    pn = d.getVar('PN')

    newpackages=[]
    for key in python_manifest:
        pypackage= pn + '-' + key

        if pypackage not in packages:
            # We need to prepend, otherwise python-misc gets everything
            # so we use a new variable
            newpackages.append(pypackage)

        # "Build" python's manifest FILES, RDEPENDS and SUMMARY
        d.setVar('FILES_' + pypackage, '')
        for value in python_manifest[key]['files']:
            d.appendVar('FILES_' + pypackage, ' ' + value)

        # Add cached files
        if include_pycs == '1':
            for value in python_manifest[key]['cached']:
                    d.appendVar('FILES_' + pypackage, ' ' + value)

        for value in python_manifest[key]['rdepends']:
            # Make it work with or without $PN
            if '${PN}' in value:
                value=value.split('-')[1]
            d.appendVar('RDEPENDS_' + pypackage, ' ' + pn + '-' + value)
        d.setVar('SUMMARY_' + pypackage, python_manifest[key]['summary'])

    # Prepending so to avoid python-misc getting everything
    packages = newpackages + packages
    d.setVar('PACKAGES', ' '.join(packages))
    d.setVar('ALLOW_EMPTY_${PN}-modules', '1')
}

# Files needed to create a new manifest

do_create_manifest() {
    # This task should be run with every new release of Python.
    # We must ensure that PACKAGECONFIG enables everything when creating
    # a new manifest, this is to base our new manifest on a complete
    # native python build, containing all dependencies, otherwise the task
    # wont be able to find the required files.
    # e.g. BerkeleyDB is an optional build dependency so it may or may not
    # be present, we must ensure it is.

    cd ${WORKDIR}
    # This needs to be executed by python-native and NOT by HOST's python
    nativepython3 create_manifest3.py ${PYTHON_MAJMIN}
    cp python3-manifest.json.new ${THISDIR}/python3/python3-manifest#.json
}

# bitbake python -c create_manifest
addtask do_create_manifest

# Make sure we have native python ready when we create a new manifest
do_create_manifest[depends] += "${PN}:do_prepare_recipe_sysroot"
do_create_manifest[depends] += "${PN}:do_patch"

# manual dependency additions
RPROVIDES_${PN}-modules = "${PN}"
RRECOMMENDS_${PN}-core_append_class-nativesdk = " nativesdk-python3-modules"
RRECOMMENDS_${PN}-crypt_append_class-target = " openssl ca-certificates"
RRECOMMENDS_${PN}-crypt_append_class-nativesdk = " openssl ca-certificates"

FILES_${PN}-pydoc += "${bindir}/pydoc${PYTHON_MAJMIN} ${bindir}/pydoc3"
FILES_${PN}-idle += "${bindir}/idle3 ${bindir}/idle${PYTHON_MAJMIN}"

# provide python-pyvenv from python3-venv
RPROVIDES_${PN}-venv += "python3-pyvenv"

# package libpython3
PACKAGES =+ "libpython3 libpython3-staticdev"
FILES_libpython3 = "${libdir}/libpython*.so.*"
FILES_libpython3-staticdev += "${prefix}/lib/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 += "python3-core python3-email python3-codecs"
RDEPENDS_${PN}-modules_append_class-target = " python3-misc"
RDEPENDS_${PN}-modules_append_class-nativesdk = " python3-misc"
FILES_${PN}-misc = "${libdir}/python${PYTHON_MAJMIN} ${libdir}/python${PYTHON_MAJMIN}/lib-dynload"

# catch manpage
PACKAGES += "${PN}-man"
FILES_${PN}-man = "${datadir}/man"

RDEPENDS_${PN}-ptest = "${PN}-modules ${PN}-tests unzip bzip2 libgcc tzdata-europe coreutils sed"
RDEPENDS_${PN}-ptest_append_libc-glibc = " locale-base-tr-tr.iso-8859-9"
RDEPENDS_${PN}-tkinter += "${@bb.utils.contains('PACKAGECONFIG', 'tk', 'tk', '', d)}"
RDEPENDS_${PN}-dev = ""


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [yocto] Why python3 is build native in yocto ??? #python
  2020-11-06  8:23 Why python3 is build native in yocto ??? #python william.jacob
@ 2020-11-06  8:47 ` Josef Holzmayr
  2020-11-06  8:51 ` Ross Burton
  1 sibling, 0 replies; 7+ messages in thread
From: Josef Holzmayr @ 2020-11-06  8:47 UTC (permalink / raw)
  To: william.jacob; +Cc: yocto

Howdy!

Am Fr., 6. Nov. 2020 um 09:23 Uhr schrieb <william.jacob@sama.com.sg>:
>
> Hi,
> I am trying to compile python package for yocto and I found  python3 (python3.7) is  build native then it cross compiled.I want to know why it is done like this in python.
>
> Basically I want python3 binary cross compiled for arm architecture should be available in recipe-sysroot and  recipe-sysroot-native directory . Right now it is available only in recipe-sysroot-native.

I'm sorry, but I don't really understand the question. You say you
want python3 crosscompiled. This will happen if something that goes
into your image depends/rdepends on it, or if you explicitly add it to
said image via IMAGE_INSTALL. Does this not work for you?

Greetz

> Thanks
>
> William Jacob
>
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [yocto] Why python3 is build native in yocto ??? #python
  2020-11-06  8:23 Why python3 is build native in yocto ??? #python william.jacob
  2020-11-06  8:47 ` [yocto] " Josef Holzmayr
@ 2020-11-06  8:51 ` Ross Burton
  2020-11-06  9:34   ` william.jacob
  1 sibling, 1 reply; 7+ messages in thread
From: Ross Burton @ 2020-11-06  8:51 UTC (permalink / raw)
  To: william.jacob; +Cc: yocto

On Fri, 6 Nov 2020 at 08:23, <william.jacob@sama.com.sg> wrote:
> I am trying to compile python package for yocto and I found  python3 (python3.7) is  build native then it cross compiled.I want to know why it is done like this in python.

The python3 build for target doesn't directly depend on python3-native.

Some recipes do depend on python3-native (although by definition there
is a python3 on your host) as they need to run non-standard Python
modules as part of their build.  We don't want to assume that you've
installed all of these modules (as the list is ever growing) and we
don't want to assume that you've installed python3-dev on the host (as
we want to have minimal build requirements, and C modules are not
portable between Python versions).

> Basically I want python3 binary cross compiled for arm architecture should be available in recipe-sysroot and  recipe-sysroot-native directory . Right now it is available only in recipe-sysroot-native.

Please explain what you are actually trying to do.  For 99% of python
modules, simply inheriting setuptool3 or even better pypi is
sufficient.  If a package has hand-coded Python detection then it gets
a lot more complicated as Python doesn't have great support for
cross-compiling, and most people writing the build scripts don't
consider it at all.

Ross

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Why python3 is build native in yocto ??? #python
  2020-11-06  8:51 ` Ross Burton
@ 2020-11-06  9:34   ` william.jacob
  2020-11-09  9:14     ` [yocto] " Ross Burton
  0 siblings, 1 reply; 7+ messages in thread
From: william.jacob @ 2020-11-06  9:34 UTC (permalink / raw)
  To: yocto

[-- Attachment #1: Type: text/plain, Size: 379 bytes --]

I am sorry , I will explain in detail.

so what I required is that my python3 binary should be present in both recipe-sysroot and recipe-sysroot-native both as I need to build some python packages using python present in the recipe-sysroot directory.Currently my python binary is present only in recipe-sysroot-native directory.

If you want more details please let me know

[-- Attachment #2: Type: text/html, Size: 588 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [yocto] Why python3 is build native in yocto ??? #python
  2020-11-06  9:34   ` william.jacob
@ 2020-11-09  9:14     ` Ross Burton
  2020-11-09 10:29       ` Richard Purdie
  0 siblings, 1 reply; 7+ messages in thread
From: Ross Burton @ 2020-11-09  9:14 UTC (permalink / raw)
  To: william.jacob; +Cc: yocto

DEPEND on python3 and python3-native then.

Ross

On Fri, 6 Nov 2020 at 09:34, <william.jacob@sama.com.sg> wrote:
>
> I am sorry , I will explain in detail.
>
> so what I required is that my python3 binary should be present in both recipe-sysroot and recipe-sysroot-native both as I need to build some python packages using python present in the recipe-sysroot directory.Currently my python binary is present only in recipe-sysroot-native directory.
>
>
>
> If you want more details please let me know
>
>
> 
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [yocto] Why python3 is build native in yocto ??? #python
  2020-11-09  9:14     ` [yocto] " Ross Burton
@ 2020-11-09 10:29       ` Richard Purdie
  2020-11-09 13:23         ` william.jacob
  0 siblings, 1 reply; 7+ messages in thread
From: Richard Purdie @ 2020-11-09 10:29 UTC (permalink / raw)
  To: Ross Burton, william.jacob; +Cc: yocto

On Mon, 2020-11-09 at 09:14 +0000, Ross Burton wrote:
> DEPEND on python3 and python3-native then.

Note that whilst the python headers and library will be in recipe-
sysroot, the python3 binaries will not. This is because they're
designed to run on the target, not the host you're building on so we
don't bother putting them there.

Cheers,

Richard


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [yocto] Why python3 is build native in yocto ??? #python
  2020-11-09 10:29       ` Richard Purdie
@ 2020-11-09 13:23         ` william.jacob
  0 siblings, 0 replies; 7+ messages in thread
From: william.jacob @ 2020-11-09 13:23 UTC (permalink / raw)
  To: Richard Purdie, Ross Burton; +Cc: yocto

Understood but this is where it gets tricky for me .

I am trying to compile llvmlite which depends on llvm . The problem is 
that because native python is used it will give me OS Error when I link 
LLVM build for ARM The reason I get this error is because llvmlite is 
looking for LLVM built for x86 .


On 09/11/20 3:59 pm, Richard Purdie wrote:
> On Mon, 2020-11-09 at 09:14 +0000, Ross Burton wrote:
>> DEPEND on python3 and python3-native then.
> Note that whilst the python headers and library will be in recipe-
> sysroot, the python3 binaries will not. This is because they're
> designed to run on the target, not the host you're building on so we
> don't bother putting them there.
>
> Cheers,
>
> Richard
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-11-09 13:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-06  8:23 Why python3 is build native in yocto ??? #python william.jacob
2020-11-06  8:47 ` [yocto] " Josef Holzmayr
2020-11-06  8:51 ` Ross Burton
2020-11-06  9:34   ` william.jacob
2020-11-09  9:14     ` [yocto] " Ross Burton
2020-11-09 10:29       ` Richard Purdie
2020-11-09 13:23         ` william.jacob

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.