[yocto] Cross-compiling python fails with new custom tuning

Michael Habibi mikehabibi at gmail.com
Wed Nov 25 14:58:39 PST 2015


Mark,

I ran the same command, including the offending PYTHONPATH, from the shell
without error. Any reason why that would work, despite it not working from
within the Makefile? I was thinking it was another environment variable
that was causing the issue (one that's not set in my bash environment by
default). My $PATH didn't have python-native so I called it using an
absolute path, but otherwise it's the same command run from the Makefile
(parsed, of course):

bash$
_PYTHON_PROJECT_BASE=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build
_PYTHON_HOST_PLATFORM=linux2-x86_64
PYTHONPATH=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build/build/lib.linux2-x86_64-2.7:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib/plat-linux2
/projects/yocto-git/build/tmp/sysroots/x86_64-linux/usr/bin/python-native/python2.7
-S -m sysconfig --generate-posix-vars
bash$ ls pybuilddir.txt
pybuilddir.txt

Maybe I'm missing something.


On Wed, Nov 25, 2015 at 4:38 PM, Mark Hatle <mark.hatle at windriver.com>
wrote:

> On 11/25/15 10:11 AM, Michael Habibi wrote:
> > Well, I'm wrong yet again. A 'which python2.7' shows that it's pointing
> to a
> > native version of Python:
> >
> > *| which python2.7*
> > *|
> >
> /projects/yocto-git/build/tmp/sysroots/x86_64-linux/usr/bin/python-native/python2.7*
> > |
> >
> _PYTHON_PROJECT_BASE=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build
> > _PYTHON_HOST_PLATFORM=linux2-x86_64
> >
> PYTHONPATH=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build/build/lib.linux2-x86_64-2.7:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib/plat-linux2
> > python2.7 -S -m sysconfig --generate-posix-vars ;\
> > |       if test $? -ne 0 ; then \
> > |               echo "generate-posix-vars failed" ; \
> > |               rm -f ./pybuilddir.txt ; \
> > |               exit 1 ; \
> > |       fi
> > | Illegal instruction (core dumped)
> > | make: *** [sharedmods] Error 132
> >
> > I guess one of the environmental variables being passed in is screwing
> up what
> > it's doing. Unfortunately I don't know enough about the inner workings
> of Python
> > to be of much help moving forward. I gave it my best shot!
>
> The problem I tracked down was:
>
>
> PYTHONPATH=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build/build/lib.linux2-x86_64-2.7
>
> This is full of .so objects when loaded cause the illegal instruction.
>
> I came up with a patch that I thought was going to fix it, but it's
> triggered
> other failures.
>
>
> http://lists.openembedded.org/pipermail/openembedded-core/2015-November/113341.html
>
> Just to be clear.. this does NOT work properly in many cases.  But might
> give
> you or someone else a clue as to how to possibly fix it.
>
> --Mark
>
> >
> > On Wed, Nov 25, 2015 at 10:01 AM, Michael Habibi <mikehabibi at gmail.com
> > <mailto:mikehabibi at gmail.com>> wrote:
> >
> >     Ah sorry, I misspoke. I walked through the Makefile and configure
> scripts a
> >     bit more, and $(PYTHON_FOR_BUILD) should in fact be a host version of
> >     Python. It seems it's not being configured correctly. Either the
> path is
> >     setup wrong and python2.7 is not pointing to the right version, or
> python2.7
> >     needs to be pointing to the absolute path instead of relying on
> $PATH.
> >
> >
> >
> >
> >     On Wed, Nov 25, 2015 at 9:45 AM, Michael Habibi <
> mikehabibi at gmail.com
> >     <mailto:mikehabibi at gmail.com>> wrote:
> >
> >         For what it's worth, this is the offending portion of
> Makefile.pre:452:
> >
> >         # Create build directory and generate the sysconfig build-time
> data there.
> >         # pybuilddir.txt contains the name of the build dir and is used
> for
> >         # sys.path fixup -- see Modules/getpath.c.
> >         # Since this step runs before shared modules are built, try to
> avoid
> >         bootstrap
> >         # problems by creating a dummy pybuilddir.txt just to allow
> interpreter
> >         # initialization to succeed.  It will be overwritten by
> generate-posix-vars
> >         # or removed in case of failure.
> >         pybuilddir.txt: $(BUILDPYTHON)
> >         → @echo "none" > ./pybuilddir.txt
> >         → $(RUNSHARED) $(PYTHON_FOR_BUILD) -S -m sysconfig
> --generate-posix-vars ;\
> >         → if test $$? -ne 0 ; then \
> >         → → echo "generate-posix-vars failed" ; \
> >         → → rm -f ./pybuilddir.txt ; \
> >         → → exit 1 ; \
> >         → fi
> >
> >         I don't know enough about the Python build to understand what
> it's
> >         trying to do, but perhaps replacing PYTHON_FOR_BUILD with
> HOSTPYTHON may
> >         be acceptable?
> >
> >         I'm surprised this seems to work for other people, since this
> should be
> >         failing for anyone using Python on a target platform different
> from
> >         their host.
> >
> >         On Wed, Nov 25, 2015 at 9:02 AM, Mark Hatle <
> mark.hatle at windriver.com
> >         <mailto:mark.hatle at windriver.com>> wrote:
> >
> >             On 11/24/15 3:23 PM, Mark Hatle wrote:
> >             > My guess is that there is a bug in the python integration
> where
> >             it's not
> >             > realizing the host and target are different systems, so
> it's
> >             trying to run a
> >             > target program on your host.  Your host isn't haswell,
> so...
> >             Illegal Instruction
> >             > -- and the system stops.
> >
> >             Just an FYI, I hit the same problem today.  I suspect it is
> the host
> >             trying to
> >             run target software and I'm looking into it.
> >
> >             --Mark
> >
> >             > The alternative would be something is running QEMU to
> execute a
> >             target binary
> >             > and QEMU doesn't have instruction support -- but that
> doesn't look
> >             like the case
> >             > here.
> >             >
> >             > --Mark
> >             >
> >             > On 11/24/15 3:06 PM, Michael Habibi wrote:
> >             >> All,
> >             >>
> >             >> I added a new machine definition with tuning parameters
> for haswell
> >             >> microarchitectures (basically just duplicated corei7 but
> tuned it
> >             for haswell).
> >             >> This seems to work correctly, but failed when running
> do_install
> >             for python
> >             >> toward the end of the build process. I am running with
> the Yocto
> >             2.0 framework,
> >             >> with very minimal changes to create a new distribution and
> >             machine for our
> >             >> custom embedded device. Note I had this distro
> configuration
> >             working before, and
> >             >> the only difference is I added a new machine with this
> tuning.
> >             >>
> >             >> I believe the issue is because, as part of the do_install
> step
> >             for Python, it
> >             >> attempts to run python on the local host, despite being
> >             cross-compiled. However,
> >             >> it is tuned for a processor that my host machine doesn't
> run, so
> >             I get an
> >             >> instruction exception.
> >             >>
> >             >> Did I do something weird? I figure python would be
> configured for
> >             >> cross-compiling and therefore wouldn't try to run the
> target
> >             version on the
> >             >> host, even for sanity tests. Here is the output of the
> failure:
> >             >>
> >             >> $ tail -20
> >             >>
> >
>  /projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/temp/log.do_install.17258
> >             >>
> >             >> x86_64-diags-linux-ar rc libpython2.7.a
> Modules/threadmodule.o
> >             >>  Modules/signalmodule.o  Modules/posixmodule.o
> Modules/errnomodule.o
> >             >>  Modules/pwdmodule.o  Modules/_sre.o
> Modules/_codecsmodule.o
> >             >>  Modules/_weakref.o  Modules/zipimport.o
> Modules/symtablemodule.o
> >             >>  Modules/md5module.o Modules/md5.o  Modules/xxsubtype.o
> >             >> x86_64-diags-linux-ranlib libpython2.7.a
> >             >> Modules/posixmodule.o: In function `posix_tmpnam':
> >             >>
> >
>  /projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Modules/posixmodule.c:7575:
> >             >> warning: the use of `tmpnam_r' is dangerous, better use
> `mkstemp'
> >             >> Modules/posixmodule.o: In function `posix_tempnam':
> >             >>
> >
>  /projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Modules/posixmodule.c:7522:
> >             >> warning: the use of `tempnam' is dangerous, better use
> `mkstemp'
> >             >> x86_64-diags-linux-gcc  -m64 -march=haswell -mtune=haswell
> >             -mfpmath=sse -mavx2
> >             >>
> --sysroot=/projects/yocto-git/build/tmp/sysroots/continental -Wl,-O1
> >             >> -Wl,--hash-style=gnu -Wl,--as-needed -Xlinker
> -export-dynamic -o
> >             python \
> >             >>                         Modules/python.o \
> >             >>                         -L. -lpython2.7 -lpthread -ldl
> -lpthread
> >             -lutil   -lm
> >             >>
> >
>  _PYTHON_PROJECT_BASE=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build
> >             >> _PYTHON_HOST_PLATFORM=linux2-x86_64
> >             >>
> >
>  PYTHONPATH=/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/build/build/lib.linux2-x86_64-2.7:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib:/projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/Python-2.7.9/Lib/plat-linux2
> >             >> python2.7 -S -m sysconfig --generate-posix-vars ;\
> >             >>         if test $? -ne 0 ; then \
> >             >>                 echo "generate-posix-vars failed" ; \
> >             >>                 rm -f ./pybuilddir.txt ; \
> >             >>                 exit 1 ; \
> >             >>         fi
> >             >> Illegal instruction (core dumped)
> >             >> make: *** [sharedmods] Error 132
> >             >> WARNING: exit code 1 from a shell command.
> >             >> ERROR: oe_runmake failed
> >             >> ERROR: Function failed: do_install (log file is located at
> >             >>
> >
>  /projects/yocto-git/build/tmp/work/haswell-diags-linux/python/2.7.9-r1/temp/log.do_install.17258)
> >             >>
> >             >> Here is my tune-haswell.inc (ignore some copy/paste
> comment
> >             issues right now =):
> >             >>
> >             >> # Settings for the GCC(1) cpu-type "haswell":
> >             >> #
> >             >> #     Intel Core i7 CPU with 64-bit extensions, MOVBE,
> MMX, SSE,
> >             SSE2, SSE3,·
> >             >> #     SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES,
> PCLMUL,
> >             FSGSBASE,
> >             >> #     RDRND, FMA, BMI, BMI2 and F16C instruction set
> support.
> >             >> #
> >             >> # This tune is recommended for Intel Nehalem and
> Silvermont (e.g.
> >             Bay Trail) CPUs
> >             >> # (and beyond).
> >             >> #
> >             >> DEFAULTTUNE ?= "haswell"
> >             >>
> >             >> # Pull in the previous tune in to pull in
> PACKAGE_EXTRA_ARCHS
> >             >> require conf/machine/include/tune-corei7.inc
> >             >>
> >             >> # Extra tune features
> >             >> TUNEVALID[haswell] = "Enable haswell specific processor
> >             optimizations"
> >             >> TUNE_CCARGS .= "${@bb.utils.contains("TUNE_FEATURES",
> "haswell", "
> >             >> -march=haswell -mtune=haswell -mfpmath=sse -mavx2", "",
> d)}"
> >             >>
> >             >> # Extra tune selections
> >             >> AVAILTUNES += "haswell"
> >             >> TUNE_FEATURES_tune-haswell =
> "${TUNE_FEATURES_tune-x86-64} haswell"
> >             >> BASE_LIB_tune-haswell = "lib"
> >             >> TUNE_PKGARCH_tune-haswell = "haswell"
> >             >> PACKAGE_EXTRA_ARCHS_tune-haswell =
> >             "${PACKAGE_EXTRA_ARCHS_tune-corei7} haswell"
> >             >>
> >             >>
> >             >>
> >             >
> >
> >             --
> >             _______________________________________________
> >             yocto mailing list
> >             yocto at yoctoproject.org <mailto:yocto at yoctoproject.org>
> >             https://lists.yoctoproject.org/listinfo/yocto
> >
> >
> >
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/yocto/attachments/20151125/f3f09796/attachment.html>


More information about the yocto mailing list