diff mbox series

[V2] procps: support ptest when TCLIBC is glibc

Message ID 20260116092704.2465341-1-changqing.li@windriver.com
State New
Headers show
Series [V2] procps: support ptest when TCLIBC is glibc | expand

Commit Message

Changqing Li Jan. 16, 2026, 9:27 a.m. UTC
From: Changqing Li <changqing.li@windriver.com>

* support ptest for procps TCLIBC is glibc. The configure.ac only match
  LINUX as "linux-gnu", we can patch it to make test can run on musl lib
system, but the upstream testsuite should only run on gnu libc host,
some test cases only suitable for glibc, eg: Some of the error messages
for free command on musl system is not the same as glibc system, which
will make test failed. In order to avoid some other unexpected failure,
just support ptest for glibc.

* procps's testsuite use DejaGnu test framework.  The testsuite is
  expected to run during build time, this implementation create the same
folder structure as the testsuite expected to make it can work well.

Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
 .../distro/include/ptest-packagelists.inc     |  2 +
 meta/recipes-extended/procps/procps/run-ptest |  7 +++
 meta/recipes-extended/procps/procps_4.0.5.bb  | 51 ++++++++++++++++++-
 3 files changed, 58 insertions(+), 2 deletions(-)
 create mode 100644 meta/recipes-extended/procps/procps/run-ptest

Comments

Ross Burton Jan. 26, 2026, 1:01 p.m. UTC | #1
On 16 Jan 2026, at 09:27, Changqing Li via lists.openembedded.org <changqing.li=windriver.com@lists.openembedded.org> wrote:
> +SRC_URI:append:libc-glibc = " file://run-ptest"

Keep things simple and just add this to SRC_URI, it won’t cause any problems in musl builds.

> +    DEJATOOL=$(make -C testsuite -s -f Makefile -f - <<'EOF'
> +all:
> + $(info $(DEJATOOL))
> +EOF
> +)

You can use makefile-getvar (oe-core/scripts) for this, and do it later.

> +     rm -rf ${D}${PTEST_PATH}/testsuite/Makefile*
> +     rm -rf ${D}${PTEST_PATH}/testsuite/README
> +     find ${D}${PTEST_PATH}/testsuite/ -type f -name "*.o" -exec rm -f {} +
> +     find ${D}${PTEST_PATH}/src/ -type f -name "*.o" -exec rm -f {} +

Might be easier to use makefile-getvar to get the list of tests and then install them directly, instead of copying * and then deleting files.

Also find has a -delete option which is better than -exec rm.

> +     DEJATOOL=$(cat ${B}/testsuite/.dejatool)

Just use makefile-getvar here?

> +     sed -i -e "s#@DEJATOOL@#$DEJATOOL#g" ${D}${PTEST_PATH}/run-ptest
> +     for p in $DEJATOOL; do
> +        if [ "$p" = "ps" ]; then
> +            install -d ${D}${PTEST_PATH}/src/ps
> +            ln -sf ${base_bindir}/ps ${D}${PTEST_PATH}/src/ps/pscommand
> +        elif [ "$p" = "sysctl" ]; then
> +            ln -sf ${base_sbindir}/$p ${D}${PTEST_PATH}/src/$p
> +        elif [ "$p" = "kill" ] || [ "$p" = "pidof" ] || [ "$p" = "watch" ]; then
> +            ln -sf ${base_bindir}/$p ${D}${PTEST_PATH}/src/$p
> +        else
> +            ln -sf ${bindir}/$p ${D}${PTEST_PATH}/src/$p
> +        fi
> +     done

Not sure I understand the point of iterating a list and then switching off each item in the list. Why not just make all those symlinks without the loop and conditional?

> +RDEPENDS:${PN}-ptest += "dejagnu bash glibc-utils"

Have you verified that it _needs_ bash and we can’t send a little patch to use sh?

Ross
Changqing Li Jan. 27, 2026, 8:57 a.m. UTC | #2
On 1/26/26 21:01, Ross Burton wrote:
> CAUTION: This email comes from a non Wind River email account!
> Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
> On 16 Jan 2026, at 09:27, Changqing Li via lists.openembedded.org<changqing.li=windriver.com@lists.openembedded.org> wrote:
>> +SRC_URI:append:libc-glibc =" file://run-ptest"
> Keep things simple and just add this to SRC_URI, it won’t cause any problems in musl builds.
OK
>
>> +    DEJATOOL=$(make -C testsuite -s -f Makefile -f - <<'EOF'
>> +all:
>> + $(info $(DEJATOOL))
>> +EOF
>> +)
> You can use makefile-getvar (oe-core/scripts) for this, and do it later.
Corrected in V3,  this script is much better.
>
>> +     rm -rf ${D}${PTEST_PATH}/testsuite/Makefile*
>> +     rm -rf ${D}${PTEST_PATH}/testsuite/README
>> +     find ${D}${PTEST_PATH}/testsuite/ -type f -name "*.o" -exec rm -f {} +
>> +     find ${D}${PTEST_PATH}/src/ -type f -name "*.o" -exec rm -f {} +
> Might be easier to use makefile-getvar to get the list of tests and then install them directly, instead of copying * and then deleting files.
>
> Also find has a -delete option which is better than -exec rm.
>
>> +     DEJATOOL=$(cat ${B}/testsuite/.dejatool)
> Just use makefile-getvar here?

All changed to use makefile-getvar in V3, but for sources under 
${S}/testsuites still cp them all, but don't remove unless Makefile.am/in,

because we not only need to install something can be got by 
makefile-getvar, but also some config files/folder that only directly 
used by *.exp.

>
>> +     sed -i -e "s#@DEJATOOL@#$DEJATOOL#g" ${D}${PTEST_PATH}/run-ptest
>> +     for p in $DEJATOOL; do
>> +        if [ "$p" = "ps" ]; then
>> +            install -d ${D}${PTEST_PATH}/src/ps
>> +            ln -sf ${base_bindir}/ps ${D}${PTEST_PATH}/src/ps/pscommand
>> +        elif [ "$p" = "sysctl" ]; then
>> +            ln -sf ${base_sbindir}/$p ${D}${PTEST_PATH}/src/$p
>> +        elif [ "$p" = "kill" ] || [ "$p" = "pidof" ] || [ "$p" = "watch" ]; then
>> +            ln -sf ${base_bindir}/$p ${D}${PTEST_PATH}/src/$p
>> +        else
>> +            ln -sf ${bindir}/$p ${D}${PTEST_PATH}/src/$p
>> +        fi
>> +     done
> Not sure I understand the point of iterating a list and then switching off each item in the list. Why not just make all those symlinks without the loop and conditional?

Because most of the DEJATOOL should match the else branch, but 
sysctl/kill/pidof/watch has different install path, not binddir, but 
base_sbindir/base_bindir.

For ps, the ps.exp want to run "src/ps/pscommand", but not src/ps like 
other programs, so I need to make the link different with others.

>
>> +RDEPENDS:${PN}-ptest += "dejagnu bash glibc-utils"
> Have you verified that it _needs_ bash and we can’t send a little patch to use sh?

I added this since I met error that reminds this depends,  but it seems 
not need any more, maybe the depends has been removed during rework this 
patch.


Thanks

Changqing

>
> Ross
Changqing Li Jan. 27, 2026, 9:06 a.m. UTC | #3
CC  antonin and Richard to remind there is a V3,  because V2 is on 
master-next.

//Changqing

On 1/27/26 16:58, Changqing Li via lists.openembedded.org wrote:
> From: Changqing Li <changqing.li@windriver.com>
>
> * support ptest for procps TCLIBC is glibc. The configure.ac only match
>    LINUX as "linux-gnu", we can patch it to make test can run on musl lib
> system, but the upstream testsuite should only run on gnu libc host,
> some test cases only suitable for glibc, eg: Some of the error messages
> for free command on musl system is not the same as glibc system, which
> will make test failed. In order to avoid some other unexpected failure,
> just support ptest for glibc.
>
> * procps's testsuite use DejaGnu test framework.  The testsuite is
>    expected to run during build time, this implementation create the same
> folder structure as the testsuite expected to make it can work well.
>
> Signed-off-by: Changqing Li <changqing.li@windriver.com>
> ---
>   .../distro/include/ptest-packagelists.inc     |  2 +
>   meta/recipes-extended/procps/procps/run-ptest | 24 ++++++++
>   meta/recipes-extended/procps/procps_4.0.5.bb  | 57 ++++++++++++++++++-
>   3 files changed, 81 insertions(+), 2 deletions(-)
>   create mode 100644 meta/recipes-extended/procps/procps/run-ptest
>
> diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
> index fff2947177..2391224527 100644
> --- a/meta/conf/distro/include/ptest-packagelists.inc
> +++ b/meta/conf/distro/include/ptest-packagelists.inc
> @@ -57,6 +57,7 @@ PTESTS_FAST = "\
>       nettle \
>       opkg \
>       popt \
> +    procps \
>       python3-atomicwrites \
>       python3-attrs \
>       python3-bcrypt \
> @@ -97,6 +98,7 @@ PTESTS_FAST:remove:mips64 = "qemu"
>   PTESTS_PROBLEMS:append:mips64 = " qemu"
>   PTESTS_FAST:remove:riscv32 = "qemu"
>   PTESTS_PROBLEMS:append:riscv32 = " qemu"
> +PTESTS_FAST:remove:libc-musl = "procps"
>   
>   PTESTS_SLOW = "\
>       apr \
> diff --git a/meta/recipes-extended/procps/procps/run-ptest b/meta/recipes-extended/procps/procps/run-ptest
> new file mode 100644
> index 0000000000..7e132653b0
> --- /dev/null
> +++ b/meta/recipes-extended/procps/procps/run-ptest
> @@ -0,0 +1,24 @@
> +#!/bin/sh
> +
> +# Run testsuite which use dejagnu
> +cd ./testsuite
> +for tool in @DEJATOOL@; do
> +    runtest -a --tool $tool --outdir ../log
> +done
> +cd -
> +
> +# Run test programs not used by dejagnu but run directly
> +for p in @TESTS@; do
> +    ./src/tests/"$p" > ./log/"$p".log 2>&1
> +    case "$?" in
> +        0)
> +            echo "PASS: $p"
> +            ;;
> +        77)
> +            echo "SKIP: $p"
> +            ;;
> +        *)
> +            echo "FAIL: $p"
> +            ;;
> +    esac
> +done
> diff --git a/meta/recipes-extended/procps/procps_4.0.5.bb b/meta/recipes-extended/procps/procps_4.0.5.bb
> index 0e0e06f0d2..cddb79cf10 100644
> --- a/meta/recipes-extended/procps/procps_4.0.5.bb
> +++ b/meta/recipes-extended/procps/procps_4.0.5.bb
> @@ -10,11 +10,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
>   
>   DEPENDS = "ncurses"
>   
> -inherit autotools gettext pkgconfig update-alternatives
> +inherit autotools gettext pkgconfig update-alternatives ${@bb.utils.contains('TCLIBC', 'glibc', 'ptest', '', d)}
>   
>   SRC_URI = "git://gitlab.com/procps-ng/procps.git;protocol=https;branch=master;tag=v${PV} \
>              file://sysctl.conf \
>              file://top_large_pid_fix.patch \
> +           file://run-ptest \
>              "
>   SRCREV = "f46b2f7929cdfe2913ed0a7f585b09d6adbf994e"
>   
> @@ -47,8 +48,58 @@ do_install:append () {
>           fi
>   }
>   
> -CONFFILES:${PN} = "${sysconfdir}/sysctl.conf"
> +do_compile_ptest() {
> +    for p in $(makefile-getvar ${B}/Makefile check_PROGRAMS); do
> +        oe_runmake $p
> +    done
> +    oe_runmake -C testsuite site.exp
> +}
>   
> +do_install_ptest() {
> +     install -d ${D}${PTEST_PATH}/testsuite
> +     install -d ${D}${PTEST_PATH}/src/tests
> +     install -d ${D}${PTEST_PATH}/log
> +
> +     install -m644 ${B}/testsuite/site.exp ${D}${PTEST_PATH}/testsuite/
> +     for p in $(makefile-getvar ${B}/testsuite/Makefile noinst_PROGRAMS); do
> +         install -m755 ${B}/testsuite/$p ${D}${PTEST_PATH}/testsuite/
> +     done
> +     cp -r ${S}/testsuite/* ${D}${PTEST_PATH}/testsuite/
> +
> +     for p in $(makefile-getvar ${B}/Makefile check_PROGRAMS);do
> +         case "$p" in
> +             src/tests/*)
> +                 install -m 0755 ${B}/$p ${D}${PTEST_PATH}/src/tests/ ;;
> +             library/tests/*)
> +                 install -m 0755 ${B}/library/tests/.libs/$(basename $p)  ${D}${PTEST_PATH}/src/tests/ ;;
> +         esac
> +     done
> +
> +     tests=""
> +     for p in $(makefile-getvar ${B}/Makefile TESTS); do
> +         tests="$tests $(basename $p)"
> +     done
> +     sed -i -e "s#@TESTS@#$tests#" ${D}${PTEST_PATH}/run-ptest
> +
> +     sed -i -e "/set srcdir/c\set srcdir ${PTEST_PATH}/testsuite" \
> +            -e "/set objdir/c\set objdir ${PTEST_PATH}/testsuite" ${D}${PTEST_PATH}/testsuite/site.exp
> +
> +     sed -i -e "s#@DEJATOOL@#$(makefile-getvar ${B}/testsuite/Makefile DEJATOOL)#" ${D}${PTEST_PATH}/run-ptest
> +     for p in $(makefile-getvar ${B}/testsuite/Makefile DEJATOOL); do
> +        if [ "$p" = "ps" ]; then
> +            install -d ${D}${PTEST_PATH}/src/ps
> +            ln -sf ${base_bindir}/ps ${D}${PTEST_PATH}/src/ps/pscommand
> +        elif [ "$p" = "sysctl" ]; then
> +            ln -sf ${base_sbindir}/$p ${D}${PTEST_PATH}/src/$p
> +        elif [ "$p" = "kill" ] || [ "$p" = "pidof" ] || [ "$p" = "watch" ]; then
> +            ln -sf ${base_bindir}/$p ${D}${PTEST_PATH}/src/$p
> +        else
> +            ln -sf ${bindir}/$p ${D}${PTEST_PATH}/src/$p
> +        fi
> +     done
> +}
> +
> +CONFFILES:${PN} = "${sysconfdir}/sysctl.conf"
>   bindir_progs = "free pkill pmap pgrep pwdx skill snice top uptime w"
>   base_bindir_progs += "kill pidof ps watch"
>   base_sbindir_progs += "sysctl"
> @@ -80,6 +131,8 @@ RDEPENDS:${PN} += "${PROCPS_PACKAGES}"
>   RDEPENDS:${PN}-ps += "${PN}-lib"
>   RDEPENDS:${PN}-sysctl += "${PN}-lib"
>   
> +RDEPENDS:${PN}-ptest += "dejagnu glibc-utils"
> +
>   FILES:${PN}-lib = "${libdir}"
>   FILES:${PN}-ps = "${base_bindir}/ps.${BPN}"
>   FILES:${PN}-sysctl = "${base_sbindir}/sysctl.${BPN} ${sysconfdir}/sysctl.conf ${sysconfdir}/sysctl.d"
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#230032): https://lists.openembedded.org/g/openembedded-core/message/230032
> Mute This Topic: https://lists.openembedded.org/mt/117485471/3616873
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [changqing.li@windriver.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta/conf/distro/include/ptest-packagelists.inc b/meta/conf/distro/include/ptest-packagelists.inc
index fff2947177..2391224527 100644
--- a/meta/conf/distro/include/ptest-packagelists.inc
+++ b/meta/conf/distro/include/ptest-packagelists.inc
@@ -57,6 +57,7 @@  PTESTS_FAST = "\
     nettle \
     opkg \
     popt \
+    procps \
     python3-atomicwrites \
     python3-attrs \
     python3-bcrypt \
@@ -97,6 +98,7 @@  PTESTS_FAST:remove:mips64 = "qemu"
 PTESTS_PROBLEMS:append:mips64 = " qemu"
 PTESTS_FAST:remove:riscv32 = "qemu"
 PTESTS_PROBLEMS:append:riscv32 = " qemu"
+PTESTS_FAST:remove:libc-musl = "procps"
 
 PTESTS_SLOW = "\
     apr \
diff --git a/meta/recipes-extended/procps/procps/run-ptest b/meta/recipes-extended/procps/procps/run-ptest
new file mode 100644
index 0000000000..0a74907fcc
--- /dev/null
+++ b/meta/recipes-extended/procps/procps/run-ptest
@@ -0,0 +1,7 @@ 
+#!/bin/sh
+
+cd ./testsuite
+for tool in @DEJATOOL@;do
+    runtest -a --tool $tool --outdir ../log
+done
+
diff --git a/meta/recipes-extended/procps/procps_4.0.5.bb b/meta/recipes-extended/procps/procps_4.0.5.bb
index 0e0e06f0d2..d39bb5062f 100644
--- a/meta/recipes-extended/procps/procps_4.0.5.bb
+++ b/meta/recipes-extended/procps/procps_4.0.5.bb
@@ -10,12 +10,14 @@  LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
 
 DEPENDS = "ncurses"
 
-inherit autotools gettext pkgconfig update-alternatives
+inherit autotools gettext pkgconfig update-alternatives ${@bb.utils.contains('TCLIBC', 'glibc', 'ptest', '', d)}
 
 SRC_URI = "git://gitlab.com/procps-ng/procps.git;protocol=https;branch=master;tag=v${PV} \
            file://sysctl.conf \
            file://top_large_pid_fix.patch \
            "
+SRC_URI:append:libc-glibc = " file://run-ptest"
+
 SRCREV = "f46b2f7929cdfe2913ed0a7f585b09d6adbf994e"
 
 # Upstream has a custom autogen.sh which invokes po/update-potfiles as they
@@ -47,8 +49,51 @@  do_install:append () {
         fi
 }
 
-CONFFILES:${PN} = "${sysconfdir}/sysctl.conf"
+do_compile_ptest() {
+    oe_runmake -C testsuite site.exp
+    oe_runmake src/tests/test_process src/tests/test_strutils  src/tests/test_fileutils src/tests/test_shm
+    DEJATOOL=$(make -C testsuite -s -f Makefile -f - <<'EOF'
+all:
+	$(info $(DEJATOOL))
+EOF
+)
+    echo $DEJATOOL > ${B}/testsuite/.dejatool
+}
+
+do_install_ptest() {
+     install -d ${D}${PTEST_PATH}/testsuite
+     install -d ${D}${PTEST_PATH}/src
+     install -d ${D}${PTEST_PATH}/log
+
+     cp -r ${S}/testsuite/* ${D}${PTEST_PATH}/testsuite/
+     cp -r ${B}/testsuite/* ${D}${PTEST_PATH}/testsuite/
+     cp -r ${B}/src/tests ${D}${PTEST_PATH}/src/
+
+     rm -rf ${D}${PTEST_PATH}/testsuite/Makefile*
+     rm -rf ${D}${PTEST_PATH}/testsuite/README
+     find ${D}${PTEST_PATH}/testsuite/ -type f -name "*.o" -exec rm -f {} +
+     find ${D}${PTEST_PATH}/src/ -type f -name "*.o" -exec rm -f {} +
+
+     sed -i -e "/set srcdir/c\set srcdir ${PTEST_PATH}/testsuite" \
+            -e "/set objdir/c\set objdir ${PTEST_PATH}/testsuite" ${D}${PTEST_PATH}/testsuite/site.exp
+
+     DEJATOOL=$(cat ${B}/testsuite/.dejatool)
+     sed -i -e "s#@DEJATOOL@#$DEJATOOL#g" ${D}${PTEST_PATH}/run-ptest
+     for p in $DEJATOOL; do
+        if [ "$p" = "ps" ]; then
+            install -d ${D}${PTEST_PATH}/src/ps
+            ln -sf ${base_bindir}/ps ${D}${PTEST_PATH}/src/ps/pscommand
+        elif [ "$p" = "sysctl" ]; then
+            ln -sf ${base_sbindir}/$p ${D}${PTEST_PATH}/src/$p
+        elif [ "$p" = "kill" ] || [ "$p" = "pidof" ] || [ "$p" = "watch" ]; then
+            ln -sf ${base_bindir}/$p ${D}${PTEST_PATH}/src/$p
+        else
+            ln -sf ${bindir}/$p ${D}${PTEST_PATH}/src/$p
+        fi
+     done
+}
 
+CONFFILES:${PN} = "${sysconfdir}/sysctl.conf"
 bindir_progs = "free pkill pmap pgrep pwdx skill snice top uptime w"
 base_bindir_progs += "kill pidof ps watch"
 base_sbindir_progs += "sysctl"
@@ -80,6 +125,8 @@  RDEPENDS:${PN} += "${PROCPS_PACKAGES}"
 RDEPENDS:${PN}-ps += "${PN}-lib"
 RDEPENDS:${PN}-sysctl += "${PN}-lib"
 
+RDEPENDS:${PN}-ptest += "dejagnu bash glibc-utils"
+
 FILES:${PN}-lib = "${libdir}"
 FILES:${PN}-ps = "${base_bindir}/ps.${BPN}"
 FILES:${PN}-sysctl = "${base_sbindir}/sysctl.${BPN} ${sysconfdir}/sysctl.conf ${sysconfdir}/sysctl.d"