diff mbox series

[v3] bitbake.conf: Extend distro feature usrmerge to merge bin+sbin

Message ID 5fff22004037096d27276023cf29c473c8c8ce85.1787575546.git.joerg.sommer@navimatix.de
State Under Review
Headers show
Series [v3] bitbake.conf: Extend distro feature usrmerge to merge bin+sbin | expand

Commit Message

joerg.sommer@navimatix.de Aug. 24, 2026, 12:48 p.m. UTC
From: Randolph Sapp <rs@ti.com>

The split of bin and sbin became more artificial over time, and it is no
longer clear why programmes goes into the one or the other directory; e.g.
forever normal users have used sendmail in /usr/sbin, and fdisk and mkfs
learned to operate on files to create images long ago.

Because systemd drives this movement to have only /usr/bin and symlink /bin,
/sbin and /usr/sbin to there, the usrmerge feature (started by systemd too)
should be extended to include the binmerge. For a system with split bin/sbin
`systemctl status` reports the system as tainted for *unmerged-bin.*

Override most sbin variables to point to their bin equivalent when
usermerge is enabled, with the exception being base_sbindir_native and
sbindir_native. There is no guarantee the host machine is using this
filesystem scheme.

This check was added to systemd back in 2024 [2].

[1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-/blob/main/PKGBUILD
[2] https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e4a6aa6d9f0d

Signed-off-by: Randolph Sapp <rs@ti.com>
Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
---
Changes in v3:

* rebase on systemd 261.2

Changes in v2:

* I took Randolph's version and reworked it a bit. But the idea stays the same.

Reference to v1:

* https://lists.openembedded.org/g/openembedded-core/message/234858

 meta/classes-recipe/populate_sdk_base.bbclass | 2 ++
 meta/conf/bitbake.conf                        | 8 ++++----
 meta/recipes-core/systemd/systemd_261.2.bb    | 6 +++---
 3 files changed, 9 insertions(+), 7 deletions(-)

Comments

Marko, Peter Aug. 24, 2026, 1:11 p.m. UTC | #1
systemd recipe has:
REQUIRED_DISTRO_FEATURES += "usrmerge"
So the changes in systemd recipe can be made unconditional.

Peter

> -----Original Message-----
> From: openembedded-core@lists.openembedded.org <openembedded-
> core@lists.openembedded.org> On Behalf Of Jörg Sommer via
> lists.openembedded.org
> Sent: Monday, August 24, 2026 2:48 PM
> To: openembedded-core@lists.openembedded.org; mathieu.dubois-
> briand@bootlin.com; rs@ti.com; joerg.sommer@navimatix.de
> Cc: mathieu.dubois-briand@bootlin.com; Randolph Sapp <rs@ti.com>; Jörg
> Sommer <joerg.sommer@navimatix.de>
> Subject: [OE-core] [PATCH v3] bitbake.conf: Extend distro feature usrmerge to
> merge bin+sbin
> 
> From: Randolph Sapp <rs@ti.com>
> 
> The split of bin and sbin became more artificial over time, and it is no
> longer clear why programmes goes into the one or the other directory; e.g.
> forever normal users have used sendmail in /usr/sbin, and fdisk and mkfs
> learned to operate on files to create images long ago.
> 
> Because systemd drives this movement to have only /usr/bin and symlink /bin,
> /sbin and /usr/sbin to there, the usrmerge feature (started by systemd too)
> should be extended to include the binmerge. For a system with split bin/sbin
> `systemctl status` reports the system as tainted for *unmerged-bin.*
> 
> Override most sbin variables to point to their bin equivalent when
> usermerge is enabled, with the exception being base_sbindir_native and
> sbindir_native. There is no guarantee the host machine is using this
> filesystem scheme.
> 
> This check was added to systemd back in 2024 [2].
> 
> [1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-
> /blob/main/PKGBUILD
> [2]
> https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e
> 4a6aa6d9f0d
> 
> Signed-off-by: Randolph Sapp <rs@ti.com>
> Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
> ---
> Changes in v3:
> 
> * rebase on systemd 261.2
> 
> Changes in v2:
> 
> * I took Randolph's version and reworked it a bit. But the idea stays the same.
> 
> Reference to v1:
> 
> * https://lists.openembedded.org/g/openembedded-core/message/234858
> 
>  meta/classes-recipe/populate_sdk_base.bbclass | 2 ++
>  meta/conf/bitbake.conf                        | 8 ++++----
>  meta/recipes-core/systemd/systemd_261.2.bb    | 6 +++---
>  3 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-
> recipe/populate_sdk_base.bbclass
> index f32e9add01..f9367d0d17 100644
> --- a/meta/classes-recipe/populate_sdk_base.bbclass
> +++ b/meta/classes-recipe/populate_sdk_base.bbclass
> @@ -188,6 +188,8 @@ create_merged_usr_symlinks() {
>      install -d $root${base_bindir} $root${base_sbindir} $root${base_libdir}
>      ln -rs $root${base_bindir} $root/bin
>      ln -rs $root${base_sbindir} $root/sbin
> +    # if base_sbindir == base_bindir, aka binmerge
> +    test -e $root/usr/sbin || ln -rs $root${base_bindir} $root/usr/sbin
>      ln -rs $root${base_libdir} $root/${baselib}
> 
>      if [ "${nonarch_base_libdir}" != "${base_libdir}" ]; then
> diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> index 41e98ce629..a6833f98de 100644
> --- a/meta/conf/bitbake.conf
> +++ b/meta/conf/bitbake.conf
> @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES',
> 'usrmerge', '${exec_prefi
> 
>  # Base paths
>  export base_bindir = "${root_prefix}/bin"
> -export base_sbindir = "${root_prefix}/sbin"
> +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> '${base_bindir}', '${root_prefix}/sbin', d)}"
>  export base_libdir = "${root_prefix}/${baselib}"
>  export nonarch_base_libdir = "${root_prefix}/lib"
> 
> @@ -44,7 +44,7 @@ firmwaredir = "${nonarch_base_libdir}/firmware"
> 
>  # Architecture dependent paths
>  export bindir = "${exec_prefix}/bin"
> -export sbindir = "${exec_prefix}/sbin"
> +export sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> '${bindir}', '${exec_prefix}/sbin', d)}"
>  export libdir = "${exec_prefix}/${baselib}"
>  export libexecdir = "${exec_prefix}/libexec"
>  export includedir = "${exec_prefix}/include"
> @@ -66,9 +66,9 @@ bindir_cross = "/bin"
>  bindir_crossscripts = "${bindir}/crossscripts"
>  prefix_nativesdk = "/usr"
>  bindir_nativesdk = "${prefix_nativesdk}/bin"
> -sbindir_nativesdk = "${prefix_nativesdk}/sbin"
> +sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> '${bindir_nativesdk}', '${prefix_nativesdk}/sbin', d)}"
>  base_bindir_nativesdk = "/bin"
> -base_sbindir_nativesdk = "/sbin"
> +base_sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES',
> 'usrmerge', '${base_bindir_nativesdk}', '/sbin', d)}"
>  includedir_nativesdk = "${prefix_nativesdk}/include"
>  libdir_nativesdk = "${prefix_nativesdk}/lib"
>  base_libdir_nativesdk = "/lib"
> diff --git a/meta/recipes-core/systemd/systemd_261.2.bb b/meta/recipes-
> core/systemd/systemd_261.2.bb
> index 8237b040a5..4475fb2514 100644
> --- a/meta/recipes-core/systemd/systemd_261.2.bb
> +++ b/meta/recipes-core/systemd/systemd_261.2.bb
> @@ -196,7 +196,6 @@ def build_epoch(d):
>  PACKAGECONFIG[set-time-epoch] = "${@build_epoch(d)},-Dtime-epoch=0"
>  PACKAGECONFIG[timedated] = "-Dtimedated=true,-Dtimedated=false"
>  PACKAGECONFIG[timesyncd] = "-Dtimesyncd=true,-Dtimesyncd=false"
> -PACKAGECONFIG[sbinmerge] = "-Dsplit-bin=false,-Dsplit-bin=true"
>  PACKAGECONFIG[userdb] = "-Duserdb=true,-Duserdb=false"
>  PACKAGECONFIG[utmp] = "-Dutmp=true,-Dutmp=false"
>  PACKAGECONFIG[valgrind] = "-DVALGRIND=1,,valgrind"
> @@ -227,6 +226,7 @@ EXTRA_OEMESON += "-Dnobody-user=nobody \
>                    -Dtranslations=${@'false' if d.getVar('USE_NLS') == 'no' else 'true'} \
>                    ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', '-Ddefault-
> mdns=no -Ddefault-llmnr=no', '', d)} \
>                    -Ddbus=disabled \
> +                  -Dsplit-bin=${@'false' if '${bindir}' == '${sbindir}' else 'true'} \
>                    -Dtests=false \
>                    -Dlibc=${TCLIBC} \
>                    "
> @@ -343,8 +343,8 @@ do_install() {
>  		install -m 0644
> ${UNPACKDIR}/org.freedesktop.hostname1_no_polkit.conf ${D}${datadir}/dbus-
> 1/system.d/
>  	fi
> 
> -	# create link for existing udev rules
> -	ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
> +	# create link for old udev rules
> +	test -e ${D}${base_sbindir}/udevadm || ln -s ${base_bindir}/udevadm
> ${D}${base_sbindir}/udevadm
> 
>  	# install default policy for presets
>  	# https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto
> --
> 2.53.0
joerg.sommer@navimatix.de Aug. 24, 2026, 3:17 p.m. UTC | #2
Marko, Peter schrieb am Mo 24. Aug, 13:11 (+0000):
> [You don't often get email from peter.marko@siemens.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> systemd recipe has:
> REQUIRED_DISTRO_FEATURES += "usrmerge"
> So the changes in systemd recipe can be made unconditional.

I can update the commit, but with the current version, if someone doesn't
like the bin-merge he can revert it and stay with usr-merge only.

But does really someone want this? Maybe somewhen systemd will require the
bin-merge, too.

Any votes for or against hard-coding bin-merge?

> > -----Original Message-----
> > From: openembedded-core@lists.openembedded.org <openembedded-
> > core@lists.openembedded.org> On Behalf Of Jörg Sommer via
> > lists.openembedded.org
> > Sent: Monday, August 24, 2026 2:48 PM
> > To: openembedded-core@lists.openembedded.org; mathieu.dubois-
> > briand@bootlin.com; rs@ti.com; joerg.sommer@navimatix.de
> > Cc: mathieu.dubois-briand@bootlin.com; Randolph Sapp <rs@ti.com>; Jörg
> > Sommer <joerg.sommer@navimatix.de>
> > Subject: [OE-core] [PATCH v3] bitbake.conf: Extend distro feature usrmerge to
> > merge bin+sbin
> >
> > From: Randolph Sapp <rs@ti.com>
> >
> > The split of bin and sbin became more artificial over time, and it is no
> > longer clear why programmes goes into the one or the other directory; e.g.
> > forever normal users have used sendmail in /usr/sbin, and fdisk and mkfs
> > learned to operate on files to create images long ago.
> >
> > Because systemd drives this movement to have only /usr/bin and symlink /bin,
> > /sbin and /usr/sbin to there, the usrmerge feature (started by systemd too)
> > should be extended to include the binmerge. For a system with split bin/sbin
> > `systemctl status` reports the system as tainted for *unmerged-bin.*
> >
> > Override most sbin variables to point to their bin equivalent when
> > usermerge is enabled, with the exception being base_sbindir_native and
> > sbindir_native. There is no guarantee the host machine is using this
> > filesystem scheme.
> >
> > This check was added to systemd back in 2024 [2].
> >
> > [1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-
> > /blob/main/PKGBUILD
> > [2]
> > https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e
> > 4a6aa6d9f0d
> >
> > Signed-off-by: Randolph Sapp <rs@ti.com>
> > Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
> > ---
> > Changes in v3:
> >
> > * rebase on systemd 261.2
> >
> > Changes in v2:
> >
> > * I took Randolph's version and reworked it a bit. But the idea stays the same.
> >
> > Reference to v1:
> >
> > * https://lists.openembedded.org/g/openembedded-core/message/234858
> >
> >  meta/classes-recipe/populate_sdk_base.bbclass | 2 ++
> >  meta/conf/bitbake.conf                        | 8 ++++----
> >  meta/recipes-core/systemd/systemd_261.2.bb    | 6 +++---
> >  3 files changed, 9 insertions(+), 7 deletions(-)
> >
> > diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-
> > recipe/populate_sdk_base.bbclass
> > index f32e9add01..f9367d0d17 100644
> > --- a/meta/classes-recipe/populate_sdk_base.bbclass
> > +++ b/meta/classes-recipe/populate_sdk_base.bbclass
> > @@ -188,6 +188,8 @@ create_merged_usr_symlinks() {
> >      install -d $root${base_bindir} $root${base_sbindir} $root${base_libdir}
> >      ln -rs $root${base_bindir} $root/bin
> >      ln -rs $root${base_sbindir} $root/sbin
> > +    # if base_sbindir == base_bindir, aka binmerge
> > +    test -e $root/usr/sbin || ln -rs $root${base_bindir} $root/usr/sbin
> >      ln -rs $root${base_libdir} $root/${baselib}
> >
> >      if [ "${nonarch_base_libdir}" != "${base_libdir}" ]; then
> > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> > index 41e98ce629..a6833f98de 100644
> > --- a/meta/conf/bitbake.conf
> > +++ b/meta/conf/bitbake.conf
> > @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES',
> > 'usrmerge', '${exec_prefi
> >
> >  # Base paths
> >  export base_bindir = "${root_prefix}/bin"
> > -export base_sbindir = "${root_prefix}/sbin"
> > +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > '${base_bindir}', '${root_prefix}/sbin', d)}"
> >  export base_libdir = "${root_prefix}/${baselib}"
> >  export nonarch_base_libdir = "${root_prefix}/lib"
> >
> > @@ -44,7 +44,7 @@ firmwaredir = "${nonarch_base_libdir}/firmware"
> >
> >  # Architecture dependent paths
> >  export bindir = "${exec_prefix}/bin"
> > -export sbindir = "${exec_prefix}/sbin"
> > +export sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > '${bindir}', '${exec_prefix}/sbin', d)}"
> >  export libdir = "${exec_prefix}/${baselib}"
> >  export libexecdir = "${exec_prefix}/libexec"
> >  export includedir = "${exec_prefix}/include"
> > @@ -66,9 +66,9 @@ bindir_cross = "/bin"
> >  bindir_crossscripts = "${bindir}/crossscripts"
> >  prefix_nativesdk = "/usr"
> >  bindir_nativesdk = "${prefix_nativesdk}/bin"
> > -sbindir_nativesdk = "${prefix_nativesdk}/sbin"
> > +sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > '${bindir_nativesdk}', '${prefix_nativesdk}/sbin', d)}"
> >  base_bindir_nativesdk = "/bin"
> > -base_sbindir_nativesdk = "/sbin"
> > +base_sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES',
> > 'usrmerge', '${base_bindir_nativesdk}', '/sbin', d)}"
> >  includedir_nativesdk = "${prefix_nativesdk}/include"
> >  libdir_nativesdk = "${prefix_nativesdk}/lib"
> >  base_libdir_nativesdk = "/lib"
> > diff --git a/meta/recipes-core/systemd/systemd_261.2.bb b/meta/recipes-
> > core/systemd/systemd_261.2.bb
> > index 8237b040a5..4475fb2514 100644
> > --- a/meta/recipes-core/systemd/systemd_261.2.bb
> > +++ b/meta/recipes-core/systemd/systemd_261.2.bb
> > @@ -196,7 +196,6 @@ def build_epoch(d):
> >  PACKAGECONFIG[set-time-epoch] = "${@build_epoch(d)},-Dtime-epoch=0"
> >  PACKAGECONFIG[timedated] = "-Dtimedated=true,-Dtimedated=false"
> >  PACKAGECONFIG[timesyncd] = "-Dtimesyncd=true,-Dtimesyncd=false"
> > -PACKAGECONFIG[sbinmerge] = "-Dsplit-bin=false,-Dsplit-bin=true"
> >  PACKAGECONFIG[userdb] = "-Duserdb=true,-Duserdb=false"
> >  PACKAGECONFIG[utmp] = "-Dutmp=true,-Dutmp=false"
> >  PACKAGECONFIG[valgrind] = "-DVALGRIND=1,,valgrind"
> > @@ -227,6 +226,7 @@ EXTRA_OEMESON += "-Dnobody-user=nobody \
> >                    -Dtranslations=${@'false' if d.getVar('USE_NLS') == 'no' else 'true'} \
> >                    ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', '-Ddefault-
> > mdns=no -Ddefault-llmnr=no', '', d)} \
> >                    -Ddbus=disabled \
> > +                  -Dsplit-bin=${@'false' if '${bindir}' == '${sbindir}' else 'true'} \
> >                    -Dtests=false \
> >                    -Dlibc=${TCLIBC} \
> >                    "
> > @@ -343,8 +343,8 @@ do_install() {
> >               install -m 0644
> > ${UNPACKDIR}/org.freedesktop.hostname1_no_polkit.conf ${D}${datadir}/dbus-
> > 1/system.d/
> >       fi
> >
> > -     # create link for existing udev rules
> > -     ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
> > +     # create link for old udev rules
> > +     test -e ${D}${base_sbindir}/udevadm || ln -s ${base_bindir}/udevadm
> > ${D}${base_sbindir}/udevadm
> >
> >       # install default policy for presets
> >       # https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto
> > --
> > 2.53.0
>
Marko, Peter Aug. 24, 2026, 4:18 p.m. UTC | #3
> -----Original Message-----
> From: joerg.sommer@navimatix.de <joerg.sommer@navimatix.de>
> Sent: Monday, August 24, 2026 5:18 PM
> To: Marko, Peter (FT D EU SK BFS1) <Peter.Marko@siemens.com>
> Cc: openembedded-core@lists.openembedded.org; mathieu.dubois-
> briand@bootlin.com; rs@ti.com
> Subject: Re: [OE-core] [PATCH v3] bitbake.conf: Extend distro feature usrmerge to
> merge bin+sbin
> 
> Marko, Peter schrieb am Mo 24. Aug, 13:11 (+0000):
> > [You don't often get email from peter.marko@siemens.com. Learn why this is
> important at https://aka.ms/LearnAboutSenderIdentification ]
> >
> > systemd recipe has:
> > REQUIRED_DISTRO_FEATURES += "usrmerge"
> > So the changes in systemd recipe can be made unconditional.
> 
> I can update the commit, but with the current version, if someone doesn't
> like the bin-merge he can revert it and stay with usr-merge only.

I failed to find a way how to revert bin-merge with systemd as INIT_MANAGER.
I think you can control this only for mdev-busybox or systemv init managers and in those you can't build system recipe...

Peter

> 
> But does really someone want this? Maybe somewhen systemd will require the
> bin-merge, too.
> 
> Any votes for or against hard-coding bin-merge?
> 
> > > -----Original Message-----
> > > From: openembedded-core@lists.openembedded.org <openembedded-
> > > core@lists.openembedded.org> On Behalf Of Jörg Sommer via
> > > lists.openembedded.org
> > > Sent: Monday, August 24, 2026 2:48 PM
> > > To: openembedded-core@lists.openembedded.org; mathieu.dubois-
> > > briand@bootlin.com; rs@ti.com; joerg.sommer@navimatix.de
> > > Cc: mathieu.dubois-briand@bootlin.com; Randolph Sapp <rs@ti.com>; Jörg
> > > Sommer <joerg.sommer@navimatix.de>
> > > Subject: [OE-core] [PATCH v3] bitbake.conf: Extend distro feature usrmerge to
> > > merge bin+sbin
> > >
> > > From: Randolph Sapp <rs@ti.com>
> > >
> > > The split of bin and sbin became more artificial over time, and it is no
> > > longer clear why programmes goes into the one or the other directory; e.g.
> > > forever normal users have used sendmail in /usr/sbin, and fdisk and mkfs
> > > learned to operate on files to create images long ago.
> > >
> > > Because systemd drives this movement to have only /usr/bin and symlink /bin,
> > > /sbin and /usr/sbin to there, the usrmerge feature (started by systemd too)
> > > should be extended to include the binmerge. For a system with split bin/sbin
> > > `systemctl status` reports the system as tainted for *unmerged-bin.*
> > >
> > > Override most sbin variables to point to their bin equivalent when
> > > usermerge is enabled, with the exception being base_sbindir_native and
> > > sbindir_native. There is no guarantee the host machine is using this
> > > filesystem scheme.
> > >
> > > This check was added to systemd back in 2024 [2].
> > >
> > > [1] https://gitlab.archlinux.org/archlinux/packaging/packages/filesystem/-
> > > /blob/main/PKGBUILD
> > > [2]
> > > https://github.com/systemd/systemd/commit/844863c61e7b501097da84a1e4d1e
> > > 4a6aa6d9f0d
> > >
> > > Signed-off-by: Randolph Sapp <rs@ti.com>
> > > Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de>
> > > ---
> > > Changes in v3:
> > >
> > > * rebase on systemd 261.2
> > >
> > > Changes in v2:
> > >
> > > * I took Randolph's version and reworked it a bit. But the idea stays the same.
> > >
> > > Reference to v1:
> > >
> > > * https://lists.openembedded.org/g/openembedded-core/message/234858
> > >
> > >  meta/classes-recipe/populate_sdk_base.bbclass | 2 ++
> > >  meta/conf/bitbake.conf                        | 8 ++++----
> > >  meta/recipes-core/systemd/systemd_261.2.bb    | 6 +++---
> > >  3 files changed, 9 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-
> > > recipe/populate_sdk_base.bbclass
> > > index f32e9add01..f9367d0d17 100644
> > > --- a/meta/classes-recipe/populate_sdk_base.bbclass
> > > +++ b/meta/classes-recipe/populate_sdk_base.bbclass
> > > @@ -188,6 +188,8 @@ create_merged_usr_symlinks() {
> > >      install -d $root${base_bindir} $root${base_sbindir} $root${base_libdir}
> > >      ln -rs $root${base_bindir} $root/bin
> > >      ln -rs $root${base_sbindir} $root/sbin
> > > +    # if base_sbindir == base_bindir, aka binmerge
> > > +    test -e $root/usr/sbin || ln -rs $root${base_bindir} $root/usr/sbin
> > >      ln -rs $root${base_libdir} $root/${baselib}
> > >
> > >      if [ "${nonarch_base_libdir}" != "${base_libdir}" ]; then
> > > diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> > > index 41e98ce629..a6833f98de 100644
> > > --- a/meta/conf/bitbake.conf
> > > +++ b/meta/conf/bitbake.conf
> > > @@ -22,7 +22,7 @@ root_prefix = "${@bb.utils.contains('DISTRO_FEATURES',
> > > 'usrmerge', '${exec_prefi
> > >
> > >  # Base paths
> > >  export base_bindir = "${root_prefix}/bin"
> > > -export base_sbindir = "${root_prefix}/sbin"
> > > +export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > > '${base_bindir}', '${root_prefix}/sbin', d)}"
> > >  export base_libdir = "${root_prefix}/${baselib}"
> > >  export nonarch_base_libdir = "${root_prefix}/lib"
> > >
> > > @@ -44,7 +44,7 @@ firmwaredir = "${nonarch_base_libdir}/firmware"
> > >
> > >  # Architecture dependent paths
> > >  export bindir = "${exec_prefix}/bin"
> > > -export sbindir = "${exec_prefix}/sbin"
> > > +export sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > > '${bindir}', '${exec_prefix}/sbin', d)}"
> > >  export libdir = "${exec_prefix}/${baselib}"
> > >  export libexecdir = "${exec_prefix}/libexec"
> > >  export includedir = "${exec_prefix}/include"
> > > @@ -66,9 +66,9 @@ bindir_cross = "/bin"
> > >  bindir_crossscripts = "${bindir}/crossscripts"
> > >  prefix_nativesdk = "/usr"
> > >  bindir_nativesdk = "${prefix_nativesdk}/bin"
> > > -sbindir_nativesdk = "${prefix_nativesdk}/sbin"
> > > +sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge',
> > > '${bindir_nativesdk}', '${prefix_nativesdk}/sbin', d)}"
> > >  base_bindir_nativesdk = "/bin"
> > > -base_sbindir_nativesdk = "/sbin"
> > > +base_sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES',
> > > 'usrmerge', '${base_bindir_nativesdk}', '/sbin', d)}"
> > >  includedir_nativesdk = "${prefix_nativesdk}/include"
> > >  libdir_nativesdk = "${prefix_nativesdk}/lib"
> > >  base_libdir_nativesdk = "/lib"
> > > diff --git a/meta/recipes-core/systemd/systemd_261.2.bb b/meta/recipes-
> > > core/systemd/systemd_261.2.bb
> > > index 8237b040a5..4475fb2514 100644
> > > --- a/meta/recipes-core/systemd/systemd_261.2.bb
> > > +++ b/meta/recipes-core/systemd/systemd_261.2.bb
> > > @@ -196,7 +196,6 @@ def build_epoch(d):
> > >  PACKAGECONFIG[set-time-epoch] = "${@build_epoch(d)},-Dtime-epoch=0"
> > >  PACKAGECONFIG[timedated] = "-Dtimedated=true,-Dtimedated=false"
> > >  PACKAGECONFIG[timesyncd] = "-Dtimesyncd=true,-Dtimesyncd=false"
> > > -PACKAGECONFIG[sbinmerge] = "-Dsplit-bin=false,-Dsplit-bin=true"
> > >  PACKAGECONFIG[userdb] = "-Duserdb=true,-Duserdb=false"
> > >  PACKAGECONFIG[utmp] = "-Dutmp=true,-Dutmp=false"
> > >  PACKAGECONFIG[valgrind] = "-DVALGRIND=1,,valgrind"
> > > @@ -227,6 +226,7 @@ EXTRA_OEMESON += "-Dnobody-user=nobody \
> > >                    -Dtranslations=${@'false' if d.getVar('USE_NLS') == 'no' else 'true'} \
> > >                    ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', '-Ddefault-
> > > mdns=no -Ddefault-llmnr=no', '', d)} \
> > >                    -Ddbus=disabled \
> > > +                  -Dsplit-bin=${@'false' if '${bindir}' == '${sbindir}' else 'true'} \
> > >                    -Dtests=false \
> > >                    -Dlibc=${TCLIBC} \
> > >                    "
> > > @@ -343,8 +343,8 @@ do_install() {
> > >               install -m 0644
> > > ${UNPACKDIR}/org.freedesktop.hostname1_no_polkit.conf ${D}${datadir}/dbus-
> > > 1/system.d/
> > >       fi
> > >
> > > -     # create link for existing udev rules
> > > -     ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
> > > +     # create link for old udev rules
> > > +     test -e ${D}${base_sbindir}/udevadm || ln -s ${base_bindir}/udevadm
> > > ${D}${base_sbindir}/udevadm
> > >
> > >       # install default policy for presets
> > >       # https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto
> > > --
> > > 2.53.0
> >
> --
> Navimatix GmbH           T: 03641 - 327 99 0
> Tatzendpromenade 2       F: 03641 - 526 306
> 07745 Jena               www.navimatix.de
> 
> Geschäftsführer: Steffen Späthe, Jan Rommeley
> Registergericht: Amtsgericht Jena, HRB 501480
Richard Purdie Aug. 24, 2026, 5:10 p.m. UTC | #4
On Mon, 2026-08-24 at 17:17 +0200, Jörg Sommer via lists.openembedded.org wrote:
> Marko, Peter schrieb am Mo 24. Aug, 13:11 (+0000):
> > [You don't often get email from peter.marko@siemens.com. Learn why this is important at https://aka.ms/LearnAboutSenderIdentification ]
> > 
> > systemd recipe has:
> > REQUIRED_DISTRO_FEATURES += "usrmerge"
> > So the changes in systemd recipe can be made unconditional.
> 
> I can update the commit, but with the current version, if someone doesn't
> like the bin-merge he can revert it and stay with usr-merge only.
> 
> But does really someone want this? Maybe somewhen systemd will require the
> bin-merge, too.
> 
> Any votes for or against hard-coding bin-merge?

I have wondered about changing the sdk layout (i.e. nativesdk) to merge
all the bin directories. That should really be independent of any of
the target layout/sysroot options.

I'm not sure where the patch would stand with regard to that...

Cheers,

Richard
diff mbox series

Patch

diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-recipe/populate_sdk_base.bbclass
index f32e9add01..f9367d0d17 100644
--- a/meta/classes-recipe/populate_sdk_base.bbclass
+++ b/meta/classes-recipe/populate_sdk_base.bbclass
@@ -188,6 +188,8 @@  create_merged_usr_symlinks() {
     install -d $root${base_bindir} $root${base_sbindir} $root${base_libdir}
     ln -rs $root${base_bindir} $root/bin
     ln -rs $root${base_sbindir} $root/sbin
+    # if base_sbindir == base_bindir, aka binmerge
+    test -e $root/usr/sbin || ln -rs $root${base_bindir} $root/usr/sbin
     ln -rs $root${base_libdir} $root/${baselib}
 
     if [ "${nonarch_base_libdir}" != "${base_libdir}" ]; then
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index 41e98ce629..a6833f98de 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -22,7 +22,7 @@  root_prefix = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${exec_prefi
 
 # Base paths
 export base_bindir = "${root_prefix}/bin"
-export base_sbindir = "${root_prefix}/sbin"
+export base_sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir}', '${root_prefix}/sbin', d)}"
 export base_libdir = "${root_prefix}/${baselib}"
 export nonarch_base_libdir = "${root_prefix}/lib"
 
@@ -44,7 +44,7 @@  firmwaredir = "${nonarch_base_libdir}/firmware"
 
 # Architecture dependent paths
 export bindir = "${exec_prefix}/bin"
-export sbindir = "${exec_prefix}/sbin"
+export sbindir = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${bindir}', '${exec_prefix}/sbin', d)}"
 export libdir = "${exec_prefix}/${baselib}"
 export libexecdir = "${exec_prefix}/libexec"
 export includedir = "${exec_prefix}/include"
@@ -66,9 +66,9 @@  bindir_cross = "/bin"
 bindir_crossscripts = "${bindir}/crossscripts"
 prefix_nativesdk = "/usr"
 bindir_nativesdk = "${prefix_nativesdk}/bin"
-sbindir_nativesdk = "${prefix_nativesdk}/sbin"
+sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${bindir_nativesdk}', '${prefix_nativesdk}/sbin', d)}"
 base_bindir_nativesdk = "/bin"
-base_sbindir_nativesdk = "/sbin"
+base_sbindir_nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '${base_bindir_nativesdk}', '/sbin', d)}"
 includedir_nativesdk = "${prefix_nativesdk}/include"
 libdir_nativesdk = "${prefix_nativesdk}/lib"
 base_libdir_nativesdk = "/lib"
diff --git a/meta/recipes-core/systemd/systemd_261.2.bb b/meta/recipes-core/systemd/systemd_261.2.bb
index 8237b040a5..4475fb2514 100644
--- a/meta/recipes-core/systemd/systemd_261.2.bb
+++ b/meta/recipes-core/systemd/systemd_261.2.bb
@@ -196,7 +196,6 @@  def build_epoch(d):
 PACKAGECONFIG[set-time-epoch] = "${@build_epoch(d)},-Dtime-epoch=0"
 PACKAGECONFIG[timedated] = "-Dtimedated=true,-Dtimedated=false"
 PACKAGECONFIG[timesyncd] = "-Dtimesyncd=true,-Dtimesyncd=false"
-PACKAGECONFIG[sbinmerge] = "-Dsplit-bin=false,-Dsplit-bin=true"
 PACKAGECONFIG[userdb] = "-Duserdb=true,-Duserdb=false"
 PACKAGECONFIG[utmp] = "-Dutmp=true,-Dutmp=false"
 PACKAGECONFIG[valgrind] = "-DVALGRIND=1,,valgrind"
@@ -227,6 +226,7 @@  EXTRA_OEMESON += "-Dnobody-user=nobody \
                   -Dtranslations=${@'false' if d.getVar('USE_NLS') == 'no' else 'true'} \
                   ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', '-Ddefault-mdns=no -Ddefault-llmnr=no', '', d)} \
                   -Ddbus=disabled \
+                  -Dsplit-bin=${@'false' if '${bindir}' == '${sbindir}' else 'true'} \
                   -Dtests=false \
                   -Dlibc=${TCLIBC} \
                   "
@@ -343,8 +343,8 @@  do_install() {
 		install -m 0644 ${UNPACKDIR}/org.freedesktop.hostname1_no_polkit.conf ${D}${datadir}/dbus-1/system.d/
 	fi
 
-	# create link for existing udev rules
-	ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
+	# create link for old udev rules
+	test -e ${D}${base_sbindir}/udevadm || ln -s ${base_bindir}/udevadm ${D}${base_sbindir}/udevadm
 
 	# install default policy for presets
 	# https://www.freedesktop.org/wiki/Software/systemd/Preset/#howto