[RFC,02/26] setuptools: refactor for no distutils bbclasses

Message ID ccb8f5e5b91450066e8cd677ba7552b0518df760.1637900380.git.timothy.t.orling@intel.com
State New
Headers show
Series [RFC,01/26] classes/distutils-*: add warning of deprecation | expand

Commit Message

Tim Orling Nov. 26, 2021, 4:35 a.m. UTC
Signed-off-by: Tim Orling <timothy.t.orling@intel.com>
---
 meta/classes/setuptools3-base.bbclass | 31 +++++++++++++
 meta/classes/setuptools3.bbclass      | 67 ++++++++++++++++++++++++++-
 2 files changed, 97 insertions(+), 1 deletion(-)
 create mode 100644 meta/classes/setuptools3-base.bbclass

Comments

Konrad Weihmann Nov. 26, 2021, 7:37 a.m. UTC | #1
On 26.11.21 05:35, Tim Orling wrote:
> Signed-off-by: Tim Orling <timothy.t.orling@intel.com>
> ---
>   meta/classes/setuptools3-base.bbclass | 31 +++++++++++++
>   meta/classes/setuptools3.bbclass      | 67 ++++++++++++++++++++++++++-
>   2 files changed, 97 insertions(+), 1 deletion(-)
>   create mode 100644 meta/classes/setuptools3-base.bbclass
> 
> diff --git a/meta/classes/setuptools3-base.bbclass b/meta/classes/setuptools3-base.bbclass
> new file mode 100644
> index 00000000000..5098ae9d64e
> --- /dev/null
> +++ b/meta/classes/setuptools3-base.bbclass
> @@ -0,0 +1,31 @@
> +DEPENDS:append:class-target = " ${PYTHON_PN}-native ${PYTHON_PN}"
> +DEPENDS:append:class-nativesdk = " ${PYTHON_PN}-native ${PYTHON_PN}"
> +RDEPENDS:${PN} += "${@['', '${PYTHON_PN}-core']['${CLASSOVERRIDE}' == 'class-target']}"
> +
> +export STAGING_INCDIR
> +export STAGING_LIBDIR
> +
> +# LDSHARED is the ld *command* used to create shared library
> +export LDSHARED  = "${CCLD} -shared"
> +# LDXXSHARED is the ld *command* used to create shared library of C++
> +# objects
> +export LDCXXSHARED  = "${CXX} -shared"
> +# CCSHARED are the C *flags* used to create objects to go into a shared
> +# library (module)
> +export CCSHARED  = "-fPIC -DPIC"
> +# LINKFORSHARED are the flags passed to the $(CC) command that links
> +# the python executable
> +export LINKFORSHARED = "${SECURITY_CFLAGS} -Xlinker -export-dynamic"
> +
> +FILES:${PN} += "${libdir}/* ${libdir}/${PYTHON_DIR}/*"
> +
> +FILES:${PN}-staticdev += "\
> +  ${PYTHON_SITEPACKAGES_DIR}/*.a \
> +"
> +FILES:${PN}-dev += "\
> +  ${datadir}/pkgconfig \
> +  ${libdir}/pkgconfig \
> +  ${PYTHON_SITEPACKAGES_DIR}/*.la \
> +"
> +inherit python3native python3targetconfig
> +
> diff --git a/meta/classes/setuptools3.bbclass b/meta/classes/setuptools3.bbclass
> index 8ca66ee708e..4b8eca3f96e 100644
> --- a/meta/classes/setuptools3.bbclass
> +++ b/meta/classes/setuptools3.bbclass
> @@ -1,4 +1,69 @@
> -inherit distutils3
> +inherit setuptools3-base
>   
> +B = "${WORKDIR}/build"
> +distutils_do_configure[cleandirs] = "${B}"

I hope this will be removed in a later patch, as the function name 
doesn't match the rest of the class code function naming.
Or this here deserves a in code explantion

> +
> +SETUPTOOLS_BUILD_ARGS ?= ""
> +SETUPTOOLS_INSTALL_ARGS ?= "--root=${D} \
> +    --prefix=${prefix} \
> +    --install-lib=${PYTHON_SITEPACKAGES_DIR} \
> +    --install-data=${datadir}"
> +
> +SETUPTOOLS_PYTHON = "python3"
> +SETUPTOOLS_PYTHON:class-native = "nativepython3"
> +
> +SETUPTOOLS_SETUP_PATH ?= "${S}"
> +
> +setuptools3_do_configure() {
> +    :
> +}

Why do we need to export an empty function?
Wouldn't it make sense to use noexec here?

> +
> +setuptools3_do_compile() {
> +        cd ${SETUPTOOLS_SETUP_PATH}
> +        NO_FETCH_BUILD=1 \
> +        STAGING_INCDIR=${STAGING_INCDIR} \
> +        STAGING_LIBDIR=${STAGING_LIBDIR} \
> +        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \
> +        build --build-base=${B} ${SETUPTOOLS_BUILD_ARGS} || \
> +        bbfatal_log "'${PYTHON_PN} setup.py build ${SETUPTOOLS_BUILD_ARGS}' execution failed."
> +}
> +setuptools3_do_compile[vardepsexclude] = "MACHINE"

Please append or += here otherwise manipulation done to this function 
vardepexclude done *before* the inherit in the recipe will be lost, 
without people noticing that easily

> +
> +setuptools3_do_install() {
> +        cd ${SETUPTOOLS_SETUP_PATH}
> +        install -d ${D}${PYTHON_SITEPACKAGES_DIR}
> +        STAGING_INCDIR=${STAGING_INCDIR} \
> +        STAGING_LIBDIR=${STAGING_LIBDIR} \
> +        PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \
> +        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \
> +        build --build-base=${B} install --skip-build ${SETUPTOOLS_INSTALL_ARGS} || \
> +        bbfatal_log "'${PYTHON_PN} setup.py install ${SETUPTOOLS_INSTALL_ARGS}' execution failed."
> +
> +        # support filenames with *spaces*
> +        find ${D} -name "*.py" -exec grep -q ${D} {} \; \
> +                               -exec sed -i -e s:${D}::g {} \;
> +
> +        for i in ${D}${bindir}/* ${D}${sbindir}/*; do
> +            if [ -f "$i" ]; then
> +                sed -i -e s:${PYTHON}:${USRBINPATH}/env\ ${SETUPTOOLS_PYTHON}:g $i
> +                sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
> +            fi
> +        done
> +
> +        rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/easy-install.pth
> +
> +        #
> +        # FIXME: Bandaid against wrong datadir computation
> +        #
> +        if [ -e ${D}${datadir}/share ]; then
> +            mv -f ${D}${datadir}/share/* ${D}${datadir}/
> +            rmdir ${D}${datadir}/share
> +        fi
> +}
> +setuptools3_do_install[vardepsexclude] = "MACHINE"

Same here about the vardepexclude

> +
> +EXPORT_FUNCTIONS do_configure do_compile do_install
> +
> +export LDSHARED="${CCLD} -shared"
>   DEPENDS += "python3-setuptools-native"
>   
> 
> 
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#158798): https://lists.openembedded.org/g/openembedded-core/message/158798
> Mute This Topic: https://lists.openembedded.org/mt/87313857/3647476
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [kweihmann@outlook.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Tim Orling Nov. 26, 2021, 4:07 p.m. UTC | #2
On Thu, Nov 25, 2021 at 11:37 PM Konrad Weihmann <kweihmann@outlook.com>
wrote:

>
>
> On 26.11.21 05:35, Tim Orling wrote:
> > Signed-off-by: Tim Orling <timothy.t.orling@intel.com>
> > ---
> >   meta/classes/setuptools3-base.bbclass | 31 +++++++++++++
> >   meta/classes/setuptools3.bbclass      | 67 ++++++++++++++++++++++++++-
> >   2 files changed, 97 insertions(+), 1 deletion(-)
> >   create mode 100644 meta/classes/setuptools3-base.bbclass
> >
> > diff --git a/meta/classes/setuptools3-base.bbclass
> b/meta/classes/setuptools3-base.bbclass
> > new file mode 100644
> > index 00000000000..5098ae9d64e
> > --- /dev/null
> > +++ b/meta/classes/setuptools3-base.bbclass
> > @@ -0,0 +1,31 @@
> > +DEPENDS:append:class-target = " ${PYTHON_PN}-native ${PYTHON_PN}"
> > +DEPENDS:append:class-nativesdk = " ${PYTHON_PN}-native ${PYTHON_PN}"
> > +RDEPENDS:${PN} += "${@['', '${PYTHON_PN}-core']['${CLASSOVERRIDE}' ==
> 'class-target']}"
> > +
> > +export STAGING_INCDIR
> > +export STAGING_LIBDIR
> > +
> > +# LDSHARED is the ld *command* used to create shared library
> > +export LDSHARED  = "${CCLD} -shared"
> > +# LDXXSHARED is the ld *command* used to create shared library of C++
> > +# objects
> > +export LDCXXSHARED  = "${CXX} -shared"
> > +# CCSHARED are the C *flags* used to create objects to go into a shared
> > +# library (module)
> > +export CCSHARED  = "-fPIC -DPIC"
> > +# LINKFORSHARED are the flags passed to the $(CC) command that links
> > +# the python executable
> > +export LINKFORSHARED = "${SECURITY_CFLAGS} -Xlinker -export-dynamic"
> > +
> > +FILES:${PN} += "${libdir}/* ${libdir}/${PYTHON_DIR}/*"
> > +
> > +FILES:${PN}-staticdev += "\
> > +  ${PYTHON_SITEPACKAGES_DIR}/*.a \
> > +"
> > +FILES:${PN}-dev += "\
> > +  ${datadir}/pkgconfig \
> > +  ${libdir}/pkgconfig \
> > +  ${PYTHON_SITEPACKAGES_DIR}/*.la \
> > +"
> > +inherit python3native python3targetconfig
> > +
> > diff --git a/meta/classes/setuptools3.bbclass
> b/meta/classes/setuptools3.bbclass
> > index 8ca66ee708e..4b8eca3f96e 100644
> > --- a/meta/classes/setuptools3.bbclass
> > +++ b/meta/classes/setuptools3.bbclass
> > @@ -1,4 +1,69 @@
> > -inherit distutils3
> > +inherit setuptools3-base
> >
> > +B = "${WORKDIR}/build"
> > +distutils_do_configure[cleandirs] = "${B}"
>
> I hope this will be removed in a later patch, as the function name
> doesn't match the rest of the class code function naming.
> Or this here deserves a in code explantion
>
> This was a copy-paste oversight and needs to be changed in a v2.
I believe I was trying to contemplate if it was still needed and forgot to
loop back.
 https://git.yoctoproject.org/poky/tree/meta/classes/distutils3.bbclass#n4

> +
> > +SETUPTOOLS_BUILD_ARGS ?= ""
> > +SETUPTOOLS_INSTALL_ARGS ?= "--root=${D} \
> > +    --prefix=${prefix} \
> > +    --install-lib=${PYTHON_SITEPACKAGES_DIR} \
> > +    --install-data=${datadir}"
> > +
> > +SETUPTOOLS_PYTHON = "python3"
> > +SETUPTOOLS_PYTHON:class-native = "nativepython3"
> > +
> > +SETUPTOOLS_SETUP_PATH ?= "${S}"
> > +
> > +setuptools3_do_configure() {
> > +    :
> > +}
>
> Why do we need to export an empty function?
> Wouldn't it make sense to use noexec here?
>
> This is what was in the original distutils3.bbclass
https://git.yoctoproject.org/poky/tree/meta/classes/distutils3.bbclass#n18
The colon (:) makes it a no-op (not empty). I believe this is our version
of defining an "interface" that can be implemented by subsequent recipes
inheriting the class.

> +
> > +setuptools3_do_compile() {
> > +        cd ${SETUPTOOLS_SETUP_PATH}
> > +        NO_FETCH_BUILD=1 \
> > +        STAGING_INCDIR=${STAGING_INCDIR} \
> > +        STAGING_LIBDIR=${STAGING_LIBDIR} \
> > +        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN}
> setup.py \
> > +        build --build-base=${B} ${SETUPTOOLS_BUILD_ARGS} || \
> > +        bbfatal_log "'${PYTHON_PN} setup.py build
> ${SETUPTOOLS_BUILD_ARGS}' execution failed."
> > +}
> > +setuptools3_do_compile[vardepsexclude] = "MACHINE"
>
> Please append or += here otherwise manipulation done to this function
> vardepexclude done *before* the inherit in the recipe will be lost,
> without people noticing that easily
>
> This is directly from the original distutils3.bbclass
 https://git.yoctoproject.org/poky/tree/meta/classes/distutils3.bbclass#n30

> +
> > +setuptools3_do_install() {
> > +        cd ${SETUPTOOLS_SETUP_PATH}
> > +        install -d ${D}${PYTHON_SITEPACKAGES_DIR}
> > +        STAGING_INCDIR=${STAGING_INCDIR} \
> > +        STAGING_LIBDIR=${STAGING_LIBDIR} \
> > +        PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \
> > +        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN}
> setup.py \
> > +        build --build-base=${B} install --skip-build
> ${SETUPTOOLS_INSTALL_ARGS} || \
> > +        bbfatal_log "'${PYTHON_PN} setup.py install
> ${SETUPTOOLS_INSTALL_ARGS}' execution failed."
> > +
> > +        # support filenames with *spaces*
> > +        find ${D} -name "*.py" -exec grep -q ${D} {} \; \
> > +                               -exec sed -i -e s:${D}::g {} \;
> > +
> > +        for i in ${D}${bindir}/* ${D}${sbindir}/*; do
> > +            if [ -f "$i" ]; then
> > +                sed -i -e s:${PYTHON}:${USRBINPATH}/env\
> ${SETUPTOOLS_PYTHON}:g $i
> > +                sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
> > +            fi
> > +        done
> > +
> > +        rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/easy-install.pth
> > +
> > +        #
> > +        # FIXME: Bandaid against wrong datadir computation
> > +        #
> > +        if [ -e ${D}${datadir}/share ]; then
> > +            mv -f ${D}${datadir}/share/* ${D}${datadir}/
> > +            rmdir ${D}${datadir}/share
> > +        fi
> > +}
> > +setuptools3_do_install[vardepsexclude] = "MACHINE"
>
> Same here about the vardepexclude
>
> Again, this is directly from the distutil3.bbclass
 https://git.yoctoproject.org/poky/tree/meta/classes/distutils3.bbclass#n63

> +
> > +EXPORT_FUNCTIONS do_configure do_compile do_install
> > +
> > +export LDSHARED="${CCLD} -shared"
> >   DEPENDS += "python3-setuptools-native"
> >
> >
> >
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#158798):
> https://lists.openembedded.org/g/openembedded-core/message/158798
> > Mute This Topic: https://lists.openembedded.org/mt/87313857/3647476
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> kweihmann@outlook.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
>

Patch

diff --git a/meta/classes/setuptools3-base.bbclass b/meta/classes/setuptools3-base.bbclass
new file mode 100644
index 00000000000..5098ae9d64e
--- /dev/null
+++ b/meta/classes/setuptools3-base.bbclass
@@ -0,0 +1,31 @@ 
+DEPENDS:append:class-target = " ${PYTHON_PN}-native ${PYTHON_PN}"
+DEPENDS:append:class-nativesdk = " ${PYTHON_PN}-native ${PYTHON_PN}"
+RDEPENDS:${PN} += "${@['', '${PYTHON_PN}-core']['${CLASSOVERRIDE}' == 'class-target']}"
+
+export STAGING_INCDIR
+export STAGING_LIBDIR
+
+# LDSHARED is the ld *command* used to create shared library
+export LDSHARED  = "${CCLD} -shared"
+# LDXXSHARED is the ld *command* used to create shared library of C++
+# objects
+export LDCXXSHARED  = "${CXX} -shared"
+# CCSHARED are the C *flags* used to create objects to go into a shared
+# library (module)
+export CCSHARED  = "-fPIC -DPIC"
+# LINKFORSHARED are the flags passed to the $(CC) command that links
+# the python executable
+export LINKFORSHARED = "${SECURITY_CFLAGS} -Xlinker -export-dynamic"
+
+FILES:${PN} += "${libdir}/* ${libdir}/${PYTHON_DIR}/*"
+
+FILES:${PN}-staticdev += "\
+  ${PYTHON_SITEPACKAGES_DIR}/*.a \
+"
+FILES:${PN}-dev += "\
+  ${datadir}/pkgconfig \
+  ${libdir}/pkgconfig \
+  ${PYTHON_SITEPACKAGES_DIR}/*.la \
+"
+inherit python3native python3targetconfig
+
diff --git a/meta/classes/setuptools3.bbclass b/meta/classes/setuptools3.bbclass
index 8ca66ee708e..4b8eca3f96e 100644
--- a/meta/classes/setuptools3.bbclass
+++ b/meta/classes/setuptools3.bbclass
@@ -1,4 +1,69 @@ 
-inherit distutils3
+inherit setuptools3-base
 
+B = "${WORKDIR}/build"
+distutils_do_configure[cleandirs] = "${B}"
+
+SETUPTOOLS_BUILD_ARGS ?= ""
+SETUPTOOLS_INSTALL_ARGS ?= "--root=${D} \
+    --prefix=${prefix} \
+    --install-lib=${PYTHON_SITEPACKAGES_DIR} \
+    --install-data=${datadir}"
+
+SETUPTOOLS_PYTHON = "python3"
+SETUPTOOLS_PYTHON:class-native = "nativepython3"
+
+SETUPTOOLS_SETUP_PATH ?= "${S}"
+
+setuptools3_do_configure() {
+    :
+}
+
+setuptools3_do_compile() {
+        cd ${SETUPTOOLS_SETUP_PATH}
+        NO_FETCH_BUILD=1 \
+        STAGING_INCDIR=${STAGING_INCDIR} \
+        STAGING_LIBDIR=${STAGING_LIBDIR} \
+        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \
+        build --build-base=${B} ${SETUPTOOLS_BUILD_ARGS} || \
+        bbfatal_log "'${PYTHON_PN} setup.py build ${SETUPTOOLS_BUILD_ARGS}' execution failed."
+}
+setuptools3_do_compile[vardepsexclude] = "MACHINE"
+
+setuptools3_do_install() {
+        cd ${SETUPTOOLS_SETUP_PATH}
+        install -d ${D}${PYTHON_SITEPACKAGES_DIR}
+        STAGING_INCDIR=${STAGING_INCDIR} \
+        STAGING_LIBDIR=${STAGING_LIBDIR} \
+        PYTHONPATH=${D}${PYTHON_SITEPACKAGES_DIR} \
+        ${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py \
+        build --build-base=${B} install --skip-build ${SETUPTOOLS_INSTALL_ARGS} || \
+        bbfatal_log "'${PYTHON_PN} setup.py install ${SETUPTOOLS_INSTALL_ARGS}' execution failed."
+
+        # support filenames with *spaces*
+        find ${D} -name "*.py" -exec grep -q ${D} {} \; \
+                               -exec sed -i -e s:${D}::g {} \;
+
+        for i in ${D}${bindir}/* ${D}${sbindir}/*; do
+            if [ -f "$i" ]; then
+                sed -i -e s:${PYTHON}:${USRBINPATH}/env\ ${SETUPTOOLS_PYTHON}:g $i
+                sed -i -e s:${STAGING_BINDIR_NATIVE}:${bindir}:g $i
+            fi
+        done
+
+        rm -f ${D}${PYTHON_SITEPACKAGES_DIR}/easy-install.pth
+
+        #
+        # FIXME: Bandaid against wrong datadir computation
+        #
+        if [ -e ${D}${datadir}/share ]; then
+            mv -f ${D}${datadir}/share/* ${D}${datadir}/
+            rmdir ${D}${datadir}/share
+        fi
+}
+setuptools3_do_install[vardepsexclude] = "MACHINE"
+
+EXPORT_FUNCTIONS do_configure do_compile do_install
+
+export LDSHARED="${CCLD} -shared"
 DEPENDS += "python3-setuptools-native"