diff mbox series

python3-rpds-py: Create a symlink for cython module on musl

Message ID 20240603162525.2940419-1-raj.khem@gmail.com
State New
Headers show
Series python3-rpds-py: Create a symlink for cython module on musl | expand

Commit Message

Khem Raj June 3, 2024, 4:25 p.m. UTC
loader expects it to be called with 'linux-gnu' e.g
rpds.cpython-312-x86_64-linux-musl.so is created with musl
but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so

Lets create the symlink to please the loader.

Fixes
ImportError while importing test module '/usr/lib/python3-rpds-py/ptest/tests/test_hash_trie_map.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../../python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
tests/test_hash_trie_map.py:36: in <module>
    from rpds import HashTrieMap
../../python3.12/site-packages/rpds/__init__.py:1: in <module>
    from .rpds import *
E   ModuleNotFoundError: No module named 'rpds.rpds'
ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Richard Purdie June 3, 2024, 4:35 p.m. UTC | #1
On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via lists.openembedded.org
wrote:
> loader expects it to be called with 'linux-gnu' e.g
> rpds.cpython-312-x86_64-linux-musl.so is created with musl
> but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so
> 
> Lets create the symlink to please the loader.
> 
> Fixes
> ImportError while importing test module '/usr/lib/python3-rpds-
> py/ptest/tests/test_hash_trie_map.py'.
> Hint: make sure your test modules/packages have valid Python names.
> Traceback:
> ../../python3.12/importlib/__init__.py:90: in import_module
>     return _bootstrap._gcd_import(name[level:], package, level)
> tests/test_hash_trie_map.py:36: in <module>
>     from rpds import HashTrieMap
> ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
>     from .rpds import *
> E   ModuleNotFoundError: No module named 'rpds.rpds'
> ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> 
> Signed-off-by: Khem Raj <raj.khem@gmail.com>
> ---
>  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> index f46df1115c8..b1f0e100332 100644
> --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> @@ -27,4 +27,15 @@ do_install_ptest() {
>      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
>  }
>  
> +do_install:append() {
> +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> +    do
> +        fname=`basename $f`
> +        lname=`echo $fname | sed 's/musl/gnu/'`
> +        if [ "$fname" != "$lname" ]; then
> +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> +        fi
> +    done
> +}
> +
>  BBCLASSEXTEND = "native nativesdk"
> 

This feels like the kind of workaround that will live forever. Can we
not fix the loader to use the right name?

Also, there is not even a comment above saying why we need to do this.

Cheers,

Richard
Khem Raj June 3, 2024, 5:49 p.m. UTC | #2
On Mon, Jun 3, 2024 at 9:35 AM Richard Purdie
<richard.purdie@linuxfoundation.org> wrote:
>
> On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via lists.openembedded.org
> wrote:
> > loader expects it to be called with 'linux-gnu' e.g
> > rpds.cpython-312-x86_64-linux-musl.so is created with musl
> > but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so
> >
> > Lets create the symlink to please the loader.
> >
> > Fixes
> > ImportError while importing test module '/usr/lib/python3-rpds-
> > py/ptest/tests/test_hash_trie_map.py'.
> > Hint: make sure your test modules/packages have valid Python names.
> > Traceback:
> > ../../python3.12/importlib/__init__.py:90: in import_module
> >     return _bootstrap._gcd_import(name[level:], package, level)
> > tests/test_hash_trie_map.py:36: in <module>
> >     from rpds import HashTrieMap
> > ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
> >     from .rpds import *
> > E   ModuleNotFoundError: No module named 'rpds.rpds'
> > ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> >
> > Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > ---
> >  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> > +++++++++++
> >  1 file changed, 11 insertions(+)
> >
> > diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > index f46df1115c8..b1f0e100332 100644
> > --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > @@ -27,4 +27,15 @@ do_install_ptest() {
> >      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
> >  }
> >
> > +do_install:append() {
> > +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> > +    do
> > +        fname=`basename $f`
> > +        lname=`echo $fname | sed 's/musl/gnu/'`
> > +        if [ "$fname" != "$lname" ]; then
> > +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> > +        fi
> > +    done
> > +}
> > +
> >  BBCLASSEXTEND = "native nativesdk"
> >
>
> This feels like the kind of workaround that will live forever. Can we
> not fix the loader to use the right name?

OE's python interpreter is cross-built and we end up using OSABI which
is detected during build 'linux-gnu', this seems to work fine for most of
python modules since they get the OSABI from the sysconfigdata so it
all works even though the OSABI is called linux-gnu, however some modules
like this one which are using maturin to build, seems to get the OSABI
equivalent differently, I am no expert on maturin but maybe someone knows
how it happens. This problem is seen with several python modules built with
OE,  see

https://github.com/meta-homeassistant/meta-homeassistant/issues/89
https://github.com/pypa/auditwheel/issues/349

also see how it is fixed in python3-pydantic-core on meta-python
https://git.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb#n38

Hopefully musllinux ABI tag will be sorted in pypa and this will work better
however, we also need to see how we are encoding OSABI in python builds

e.g. on qemux86-64 musl target I get

root@qemux86-64:~# python3
Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 19.0.0
(/home/kraj/work/llvm-project 4152c5f5ae88d8d5fe99d20b525b35f14db2 on
linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> sysconfig.get_config_var('SOABI')
'cpython-312-x86_64-linux-gnu'

>
> Also, there is not even a comment above saying why we need to do this.
>

I added the log showing how it does not work, I thought that is showing how
it's not working at all when using musl. If you have better idea what I should
add to commit msg to make it better, let me know I will send a v2.

> Cheers,
>
> Richard
Alexander Kanavin June 3, 2024, 7:59 p.m. UTC | #3
I agree with RP, please get to the source of the mismatch. It’s a really
unpleasant workaround.

Alex

On Mon 3. Jun 2024 at 20.49, Khem Raj via lists.openembedded.org <raj.khem=
gmail.com@lists.openembedded.org> wrote:

> On Mon, Jun 3, 2024 at 9:35 AM Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
> >
> > On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via lists.openembedded.org
> > wrote:
> > > loader expects it to be called with 'linux-gnu' e.g
> > > rpds.cpython-312-x86_64-linux-musl.so is created with musl
> > > but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so
> > >
> > > Lets create the symlink to please the loader.
> > >
> > > Fixes
> > > ImportError while importing test module '/usr/lib/python3-rpds-
> > > py/ptest/tests/test_hash_trie_map.py'.
> > > Hint: make sure your test modules/packages have valid Python names.
> > > Traceback:
> > > ../../python3.12/importlib/__init__.py:90: in import_module
> > >     return _bootstrap._gcd_import(name[level:], package, level)
> > > tests/test_hash_trie_map.py:36: in <module>
> > >     from rpds import HashTrieMap
> > > ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
> > >     from .rpds import *
> > > E   ModuleNotFoundError: No module named 'rpds.rpds'
> > > ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> > >
> > > Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > > ---
> > >  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> > > +++++++++++
> > >  1 file changed, 11 insertions(+)
> > >
> > > diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > index f46df1115c8..b1f0e100332 100644
> > > --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > @@ -27,4 +27,15 @@ do_install_ptest() {
> > >      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
> > >  }
> > >
> > > +do_install:append() {
> > > +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> > > +    do
> > > +        fname=`basename $f`
> > > +        lname=`echo $fname | sed 's/musl/gnu/'`
> > > +        if [ "$fname" != "$lname" ]; then
> > > +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> > > +        fi
> > > +    done
> > > +}
> > > +
> > >  BBCLASSEXTEND = "native nativesdk"
> > >
> >
> > This feels like the kind of workaround that will live forever. Can we
> > not fix the loader to use the right name?
>
> OE's python interpreter is cross-built and we end up using OSABI which
> is detected during build 'linux-gnu', this seems to work fine for most of
> python modules since they get the OSABI from the sysconfigdata so it
> all works even though the OSABI is called linux-gnu, however some modules
> like this one which are using maturin to build, seems to get the OSABI
> equivalent differently, I am no expert on maturin but maybe someone knows
> how it happens. This problem is seen with several python modules built with
> OE,  see
>
> https://github.com/meta-homeassistant/meta-homeassistant/issues/89
> https://github.com/pypa/auditwheel/issues/349
>
> also see how it is fixed in python3-pydantic-core on meta-python
>
> https://git.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb#n38
>
> Hopefully musllinux ABI tag will be sorted in pypa and this will work
> better
> however, we also need to see how we are encoding OSABI in python builds
>
> e.g. on qemux86-64 musl target I get
>
> root@qemux86-64:~# python3
> Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 19.0.0
> (/home/kraj/work/llvm-project 4152c5f5ae88d8d5fe99d20b525b35f14db2 on
> linux
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import sysconfig
> >>> sysconfig.get_config_var('SOABI')
> 'cpython-312-x86_64-linux-gnu'
>
> >
> > Also, there is not even a comment above saying why we need to do this.
> >
>
> I added the log showing how it does not work, I thought that is showing how
> it's not working at all when using musl. If you have better idea what I
> should
> add to commit msg to make it better, let me know I will send a v2.
>
> > Cheers,
> >
> > Richard
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#200275):
> https://lists.openembedded.org/g/openembedded-core/message/200275
> Mute This Topic: https://lists.openembedded.org/mt/106465307/1686489
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
Khem Raj June 4, 2024, 4:56 a.m. UTC | #4
On Mon, Jun 3, 2024 at 10:49 AM Khem Raj <raj.khem@gmail.com> wrote:
>
> On Mon, Jun 3, 2024 at 9:35 AM Richard Purdie
> <richard.purdie@linuxfoundation.org> wrote:
> >
> > On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via lists.openembedded.org
> > wrote:
> > > loader expects it to be called with 'linux-gnu' e.g
> > > rpds.cpython-312-x86_64-linux-musl.so is created with musl
> > > but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so
> > >
> > > Lets create the symlink to please the loader.
> > >
> > > Fixes
> > > ImportError while importing test module '/usr/lib/python3-rpds-
> > > py/ptest/tests/test_hash_trie_map.py'.
> > > Hint: make sure your test modules/packages have valid Python names.
> > > Traceback:
> > > ../../python3.12/importlib/__init__.py:90: in import_module
> > >     return _bootstrap._gcd_import(name[level:], package, level)
> > > tests/test_hash_trie_map.py:36: in <module>
> > >     from rpds import HashTrieMap
> > > ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
> > >     from .rpds import *
> > > E   ModuleNotFoundError: No module named 'rpds.rpds'
> > > ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> > >
> > > Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > > ---
> > >  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> > > +++++++++++
> > >  1 file changed, 11 insertions(+)
> > >
> > > diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > index f46df1115c8..b1f0e100332 100644
> > > --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > @@ -27,4 +27,15 @@ do_install_ptest() {
> > >      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
> > >  }
> > >
> > > +do_install:append() {
> > > +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> > > +    do
> > > +        fname=`basename $f`
> > > +        lname=`echo $fname | sed 's/musl/gnu/'`
> > > +        if [ "$fname" != "$lname" ]; then
> > > +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> > > +        fi
> > > +    done
> > > +}
> > > +
> > >  BBCLASSEXTEND = "native nativesdk"
> > >
> >
> > This feels like the kind of workaround that will live forever. Can we
> > not fix the loader to use the right name?
>
> OE's python interpreter is cross-built and we end up using OSABI which
> is detected during build 'linux-gnu', this seems to work fine for most of
> python modules since they get the OSABI from the sysconfigdata so it
> all works even though the OSABI is called linux-gnu, however some modules
> like this one which are using maturin to build, seems to get the OSABI
> equivalent differently, I am no expert on maturin but maybe someone knows
> how it happens. This problem is seen with several python modules built with
> OE,  see
>
> https://github.com/meta-homeassistant/meta-homeassistant/issues/89
> https://github.com/pypa/auditwheel/issues/349
>
> also see how it is fixed in python3-pydantic-core on meta-python
> https://git.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb#n38
>
> Hopefully musllinux ABI tag will be sorted in pypa and this will work better
> however, we also need to see how we are encoding OSABI in python builds
>
> e.g. on qemux86-64 musl target I get
>
> root@qemux86-64:~# python3
> Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 19.0.0
> (/home/kraj/work/llvm-project 4152c5f5ae88d8d5fe99d20b525b35f14db2 on
> linux
> Type "help", "copyright", "credits" or "license" for more information.
> >>> import sysconfig
> >>> sysconfig.get_config_var('SOABI')
> 'cpython-312-x86_64-linux-gnu'
>

I looked further in pyo and maturin infrastructure and it is using
ustc --target=<tuple> --print cfg  to compute EXT_SUFFIX equivalent
value which is then used to build the C extension (if any) inside the
wheel, thats why we get  cpython-312-x86_64-linux-musl for suffix,
what pyo/maturin is doing is right, however how OE does it in python
itself seems to be wrong to me, its synthesizing the OSABI
incorrectly.
where 'environment' value is not right. However, this is same
everywhere so it works, so long as the modules are built using
setuptools.
since SOABI is part of "_sysconfigdata" and its an OE generated file,
Perhaps it can consider the musl/gnu difference and emit SOABI
accordingly. Something like below

https://snips.sh/f/L6QspcdxjL

might be able to fix the python interpreter's logic.

> >
> > Also, there is not even a comment above saying why we need to do this.
> >
>
> I added the log showing how it does not work, I thought that is showing how
> it's not working at all when using musl. If you have better idea what I should
> add to commit msg to make it better, let me know I will send a v2.
>
> > Cheers,
> >
> > Richard
Khem Raj June 5, 2024, 6:47 a.m. UTC | #5
On Mon, Jun 3, 2024 at 9:56 PM Khem Raj <raj.khem@gmail.com> wrote:
>
> On Mon, Jun 3, 2024 at 10:49 AM Khem Raj <raj.khem@gmail.com> wrote:
> >
> > On Mon, Jun 3, 2024 at 9:35 AM Richard Purdie
> > <richard.purdie@linuxfoundation.org> wrote:
> > >
> > > On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via lists.openembedded.org
> > > wrote:
> > > > loader expects it to be called with 'linux-gnu' e.g
> > > > rpds.cpython-312-x86_64-linux-musl.so is created with musl
> > > > but loader expects it to called rpds.cpython-312-x86_64-linux-gnu.so
> > > >
> > > > Lets create the symlink to please the loader.
> > > >
> > > > Fixes
> > > > ImportError while importing test module '/usr/lib/python3-rpds-
> > > > py/ptest/tests/test_hash_trie_map.py'.
> > > > Hint: make sure your test modules/packages have valid Python names.
> > > > Traceback:
> > > > ../../python3.12/importlib/__init__.py:90: in import_module
> > > >     return _bootstrap._gcd_import(name[level:], package, level)
> > > > tests/test_hash_trie_map.py:36: in <module>
> > > >     from rpds import HashTrieMap
> > > > ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
> > > >     from .rpds import *
> > > > E   ModuleNotFoundError: No module named 'rpds.rpds'
> > > > ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> > > >
> > > > Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > > > ---
> > > >  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> > > > +++++++++++
> > > >  1 file changed, 11 insertions(+)
> > > >
> > > > diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > index f46df1115c8..b1f0e100332 100644
> > > > --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > @@ -27,4 +27,15 @@ do_install_ptest() {
> > > >      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
> > > >  }
> > > >
> > > > +do_install:append() {
> > > > +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> > > > +    do
> > > > +        fname=`basename $f`
> > > > +        lname=`echo $fname | sed 's/musl/gnu/'`
> > > > +        if [ "$fname" != "$lname" ]; then
> > > > +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> > > > +        fi
> > > > +    done
> > > > +}
> > > > +
> > > >  BBCLASSEXTEND = "native nativesdk"
> > > >
> > >
> > > This feels like the kind of workaround that will live forever. Can we
> > > not fix the loader to use the right name?
> >
> > OE's python interpreter is cross-built and we end up using OSABI which
> > is detected during build 'linux-gnu', this seems to work fine for most of
> > python modules since they get the OSABI from the sysconfigdata so it
> > all works even though the OSABI is called linux-gnu, however some modules
> > like this one which are using maturin to build, seems to get the OSABI
> > equivalent differently, I am no expert on maturin but maybe someone knows
> > how it happens. This problem is seen with several python modules built with
> > OE,  see
> >
> > https://github.com/meta-homeassistant/meta-homeassistant/issues/89
> > https://github.com/pypa/auditwheel/issues/349
> >
> > also see how it is fixed in python3-pydantic-core on meta-python
> > https://git.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb#n38
> >
> > Hopefully musllinux ABI tag will be sorted in pypa and this will work better
> > however, we also need to see how we are encoding OSABI in python builds
> >
> > e.g. on qemux86-64 musl target I get
> >
> > root@qemux86-64:~# python3
> > Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 19.0.0
> > (/home/kraj/work/llvm-project 4152c5f5ae88d8d5fe99d20b525b35f14db2 on
> > linux
> > Type "help", "copyright", "credits" or "license" for more information.
> > >>> import sysconfig
> > >>> sysconfig.get_config_var('SOABI')
> > 'cpython-312-x86_64-linux-gnu'
> >
>
> I looked further in pyo and maturin infrastructure and it is using
> ustc --target=<tuple> --print cfg  to compute EXT_SUFFIX equivalent
> value which is then used to build the C extension (if any) inside the
> wheel, thats why we get  cpython-312-x86_64-linux-musl for suffix,
> what pyo/maturin is doing is right, however how OE does it in python
> itself seems to be wrong to me, its synthesizing the OSABI
> incorrectly.
> where 'environment' value is not right. However, this is same
> everywhere so it works, so long as the modules are built using
> setuptools.
> since SOABI is part of "_sysconfigdata" and its an OE generated file,
> Perhaps it can consider the musl/gnu difference and emit SOABI
> accordingly. Something like below
>
> https://snips.sh/f/L6QspcdxjL
>
> might be able to fix the python interpreter's logic.

To close this thread. I have sent an alternative patch which fixes it
in python3 itself.
https://lore.kernel.org/openembedded-core/20240605064317.1646597-1-raj.khem@gmail.com/T/#t

>
> > >
> > > Also, there is not even a comment above saying why we need to do this.
> > >
> >
> > I added the log showing how it does not work, I thought that is showing how
> > it's not working at all when using musl. If you have better idea what I should
> > add to commit msg to make it better, let me know I will send a v2.
> >
> > > Cheers,
> > >
> > > Richard
Alexander Kanavin June 5, 2024, 7:07 a.m. UTC | #6
Thanks for getting to the root of the issue.


Alex

On Wed 5. Jun 2024 at 9.47, Khem Raj via lists.openembedded.org <raj.khem=
gmail.com@lists.openembedded.org> wrote:

> On Mon, Jun 3, 2024 at 9:56 PM Khem Raj <raj.khem@gmail.com> wrote:
> >
> > On Mon, Jun 3, 2024 at 10:49 AM Khem Raj <raj.khem@gmail.com> wrote:
> > >
> > > On Mon, Jun 3, 2024 at 9:35 AM Richard Purdie
> > > <richard.purdie@linuxfoundation.org> wrote:
> > > >
> > > > On Mon, 2024-06-03 at 09:25 -0700, Khem Raj via
> lists.openembedded.org
> > > > wrote:
> > > > > loader expects it to be called with 'linux-gnu' e.g
> > > > > rpds.cpython-312-x86_64-linux-musl.so is created with musl
> > > > > but loader expects it to called
> rpds.cpython-312-x86_64-linux-gnu.so
> > > > >
> > > > > Lets create the symlink to please the loader.
> > > > >
> > > > > Fixes
> > > > > ImportError while importing test module '/usr/lib/python3-rpds-
> > > > > py/ptest/tests/test_hash_trie_map.py'.
> > > > > Hint: make sure your test modules/packages have valid Python names.
> > > > > Traceback:
> > > > > ../../python3.12/importlib/__init__.py:90: in import_module
> > > > >     return _bootstrap._gcd_import(name[level:], package, level)
> > > > > tests/test_hash_trie_map.py:36: in <module>
> > > > >     from rpds import HashTrieMap
> > > > > ../../python3.12/site-packages/rpds/__init__.py:1: in <module>
> > > > >     from .rpds import *
> > > > > E   ModuleNotFoundError: No module named 'rpds.rpds'
> > > > > ERROR: tests/test_hash_trie_map.py:tests/test_hash_trie_map.py
> > > > >
> > > > > Signed-off-by: Khem Raj <raj.khem@gmail.com>
> > > > > ---
> > > > >  .../recipes-devtools/python/python3-rpds-py_0.18.1.bb | 11
> > > > > +++++++++++
> > > > >  1 file changed, 11 insertions(+)
> > > > >
> > > > > diff --git a/meta/recipes-devtools/python/
> python3-rpds-py_0.18.1.bb
> > > > > b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > > index f46df1115c8..b1f0e100332 100644
> > > > > --- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > > +++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
> > > > > @@ -27,4 +27,15 @@ do_install_ptest() {
> > > > >      cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
> > > > >  }
> > > > >
> > > > > +do_install:append() {
> > > > > +    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
> > > > > +    do
> > > > > +        fname=`basename $f`
> > > > > +        lname=`echo $fname | sed 's/musl/gnu/'`
> > > > > +        if [ "$fname" != "$lname" ]; then
> > > > > +            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
> > > > > +        fi
> > > > > +    done
> > > > > +}
> > > > > +
> > > > >  BBCLASSEXTEND = "native nativesdk"
> > > > >
> > > >
> > > > This feels like the kind of workaround that will live forever. Can we
> > > > not fix the loader to use the right name?
> > >
> > > OE's python interpreter is cross-built and we end up using OSABI which
> > > is detected during build 'linux-gnu', this seems to work fine for most
> of
> > > python modules since they get the OSABI from the sysconfigdata so it
> > > all works even though the OSABI is called linux-gnu, however some
> modules
> > > like this one which are using maturin to build, seems to get the OSABI
> > > equivalent differently, I am no expert on maturin but maybe someone
> knows
> > > how it happens. This problem is seen with several python modules built
> with
> > > OE,  see
> > >
> > > https://github.com/meta-homeassistant/meta-homeassistant/issues/89
> > > https://github.com/pypa/auditwheel/issues/349
> > >
> > > also see how it is fixed in python3-pydantic-core on meta-python
> > >
> https://git.openembedded.org/meta-openembedded/tree/meta-python/recipes-devtools/python/python3-pydantic-core_2.16.3.bb#n38
> > >
> > > Hopefully musllinux ABI tag will be sorted in pypa and this will work
> better
> > > however, we also need to see how we are encoding OSABI in python builds
> > >
> > > e.g. on qemux86-64 musl target I get
> > >
> > > root@qemux86-64:~# python3
> > > Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 19.0.0
> > > (/home/kraj/work/llvm-project 4152c5f5ae88d8d5fe99d20b525b35f14db2 on
> > > linux
> > > Type "help", "copyright", "credits" or "license" for more information.
> > > >>> import sysconfig
> > > >>> sysconfig.get_config_var('SOABI')
> > > 'cpython-312-x86_64-linux-gnu'
> > >
> >
> > I looked further in pyo and maturin infrastructure and it is using
> > ustc --target=<tuple> --print cfg  to compute EXT_SUFFIX equivalent
> > value which is then used to build the C extension (if any) inside the
> > wheel, thats why we get  cpython-312-x86_64-linux-musl for suffix,
> > what pyo/maturin is doing is right, however how OE does it in python
> > itself seems to be wrong to me, its synthesizing the OSABI
> > incorrectly.
> > where 'environment' value is not right. However, this is same
> > everywhere so it works, so long as the modules are built using
> > setuptools.
> > since SOABI is part of "_sysconfigdata" and its an OE generated file,
> > Perhaps it can consider the musl/gnu difference and emit SOABI
> > accordingly. Something like below
> >
> > https://snips.sh/f/L6QspcdxjL
> >
> > might be able to fix the python interpreter's logic.
>
> To close this thread. I have sent an alternative patch which fixes it
> in python3 itself.
>
> https://lore.kernel.org/openembedded-core/20240605064317.1646597-1-raj.khem@gmail.com/T/#t
>
> >
> > > >
> > > > Also, there is not even a comment above saying why we need to do
> this.
> > > >
> > >
> > > I added the log showing how it does not work, I thought that is
> showing how
> > > it's not working at all when using musl. If you have better idea what
> I should
> > > add to commit msg to make it better, let me know I will send a v2.
> > >
> > > > Cheers,
> > > >
> > > > Richard
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#200355):
> https://lists.openembedded.org/g/openembedded-core/message/200355
> Mute This Topic: https://lists.openembedded.org/mt/106465307/1686489
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>
diff mbox series

Patch

diff --git a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
index f46df1115c8..b1f0e100332 100644
--- a/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
+++ b/meta/recipes-devtools/python/python3-rpds-py_0.18.1.bb
@@ -27,4 +27,15 @@  do_install_ptest() {
     cp -rf ${S}/tests/* ${D}${PTEST_PATH}/tests/
 }
 
+do_install:append() {
+    for f in ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/rpds.cpython*.so
+    do
+        fname=`basename $f`
+        lname=`echo $fname | sed 's/musl/gnu/'`
+        if [ "$fname" != "$lname" ]; then
+            mv $f ${D}/${PYTHON_SITEPACKAGES_DIR}/rpds/$lname
+        fi
+    done
+}
+
 BBCLASSEXTEND = "native nativesdk"