Re: kbd 2.9.0: build error (under fakeroot(1) environment)

Steffen Nurpmeso <[email protected]> Tue, 09 Sep 2025 23:18:18 +0200
Newsgroups dev.linux.lists.kbd
Message-ID <20250909211818.pSB8ayld@steffen%sdaoden.eu>
Hello.

Alexey Gladkov wrote in
 <[email protected]>:
 |On Tue, Sep 09, 2025 at 03:45:33PM +0200, Steffen Nurpmeso wrote:
 |> My distribution (CRUX) updated to 2.9.0, and the build failed via
 |> 
 |>   cp: failed to preserve ownership for /tmp/.pkgmk/pkg/usr/share/kbd/keym\
 |>   aps/i386/qwertz/sr-latin.map.gz: Operation not supported
 |> 
 |> Thing is that this seems to only work for real root user, but that
 |> is not who is doing it, really.
 |
 |cp -a is used in the makefile. The -a means no dereference and preserve
 |links and other attributes. This should not be a problem if you have
 |the same user.

GNU coreutils 9.7 cp(1) is of a different opinion:

  $ touch xa
  $ ln -s xa xb
  $ cp -a xb xc
  cp: failed to preserve ownership for xc: Operation not supported

 |> Problem is also that the build system uses "set -e", and cp(1) will exit
 |> error no matter what (-f etc) after the above.
 |> 
 |> From my superficial BSD-style-simple-filesystem-usage point of
 |> view symbolic links have no attributes to preserve, but that
 |> sounds dick.  Maybe it is a GNU coreutils cp(1) "exaggeration" to
 |> say and fail for the above for a symbolic link, as it seems to be
 |> only about ownership, not whatever attribute or security context,
 |> however, still.
 |
 |You can try to change "cp -a" by "cp -dPR". Maybe this will help with
 |fakeroot.

Yes, it does.
The CRUX team said (especially first note, yet they not have
committed that yet) [1]

  16:38 <farkuhar> Regarding stenur's failed build of kbd 2.9.0
  (presumably using fakeroot rather than building as the real
  root), it should be enough to insert this line just before
  `make`: sed -i "s/cp -ar/cp -r/; s/cp -a/cp /" data/Makefile

  16:49 <farkuhar> cp(1) is notable for its brevity, saying little
  about what the default action regarding symlinks will be, in the
  absence of an explicit flag like --no-dereference. In my tests,
  however, dropping the -a flag had no ill effects, and the
  resulting package kbd#2.9.0-1.pkg.tar.gz had the expected
  footprint.

  20:36 <farkuhar> cp(1p) goes into much more detail, but even the
  POSIX programmer's manual offers less than definitive guidance
  about what should be done for symbolic links. "If the -R option
  was specified ... [and] none of the options -H, -L, nor -P were
  specified, it is unspecified which of -H, -L, or -P will be used
  as a default."

  20:40 <farkuhar> Notably absent in the POSIX programmer's
  man-page is any indication that cp should behave differently
  depending on $UID. So there should be no need to safeguard the
  sed command on kbd-2.9.0/data/Makefile behind a test of $UID
  = 0, the resulting package will have the correct footprint
  regardless of whether fakeroot or real root was used for the
  build. 

    [1] https://libera.catirclogs.org/crux/2025-09-06#

 |> In data/Makefile.* a lot of work is done after these "cp -a"s,
 |> i wonder why beyond $(IGNORE_KEYMAPS) anything that is a symbolic
 |> link is not "simply" $(LN_S)d after $(DESTDIR) has been populated,
 |> as it is cd(1) entered for work anyway?  Ie, some kind of
 |> $(SYMLINK_KEYMAPS) or something.
 |
 |I didn't understand your point.
 |
 |Among the keymaps, there are symlinks to change the keymap name.
 |Previously, when compressing keymaps, symlinks were dereferenced and
 |a copy of the keymap appeared instead of the symlink.

Understandable you want to save that redundancy.

 |I don't want to create symlinks in Makefile at the time of install. This
 |is really hard to maintain.

I understand.
cp -dPr works here, the -p of tar(1) is not with busybox for
example, so

  (cd test; tar -cf - .) | (mkdir t2; cd t2; tar -xf -)

is not portable, and otherwise a more expensive find(1) iteration
is all that comes to my mind immediately.  But since cp -dPr
works, it seems overkill.

 --End of <[email protected]>

Ciao!

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)