|
| 1 | +# Copyright 1999-2024 Gentoo Authors |
| 2 | +# Distributed under the terms of the GNU General Public License v2 |
| 3 | + |
| 4 | +EAPI=8 |
| 5 | + |
| 6 | +# PREFIX LOCAL changes: |
| 7 | +# - Solaris memset_s fix, that depends on coreutils pulling gnulib |
| 8 | +# https://github.com/coreutils/gnulib/commit/4438332396e6e1f950862a32a71df511865b4069 |
| 9 | +# coreutils 9.6 probably has it as this commit suggests they updated |
| 10 | +# https://github.com/coreutils/coreutils/commit/ea1fe48b91bfa9e8c4f952faf6b44fc1946e817b |
| 11 | +# - Darwin libstdbuf cruft to fix during bootstrap, and use a correct |
| 12 | +# install_name |
| 13 | + |
| 14 | +# Try to keep an eye on Fedora's packaging: https://src.fedoraproject.org/rpms/coreutils |
| 15 | +# The upstream coreutils maintainers also maintain the package in Fedora and may |
| 16 | +# backport fixes which we want to pick up. |
| 17 | +# |
| 18 | +# Also recommend subscribing to the coreutils and bug-coreutils MLs. |
| 19 | + |
| 20 | +PYTHON_COMPAT=( python3_{10..12} ) |
| 21 | +VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/coreutils.asc |
| 22 | +inherit flag-o-matic python-any-r1 toolchain-funcs verify-sig |
| 23 | + |
| 24 | +MY_PATCH="${PN}-9.5-patches" |
| 25 | +DESCRIPTION="Standard GNU utilities (chmod, cp, dd, ls, sort, tr, head, wc, who,...)" |
| 26 | +HOMEPAGE="https://www.gnu.org/software/coreutils/" |
| 27 | + |
| 28 | +if [[ ${PV} == 9999 ]] ; then |
| 29 | + EGIT_REPO_URI="https://git.savannah.gnu.org/git/coreutils.git" |
| 30 | + inherit git-r3 |
| 31 | +elif [[ ${PV} == *_p* ]] ; then |
| 32 | + # Note: could put this in devspace, but if it's gone, we don't want |
| 33 | + # it in tree anyway. It's just for testing. |
| 34 | + MY_SNAPSHOT="$(ver_cut 1-2).185-541b02" |
| 35 | + SRC_URI="https://www.pixelbeat.org/cu/coreutils-${MY_SNAPSHOT}.tar.xz -> ${P}.tar.xz" |
| 36 | + SRC_URI+=" verify-sig? ( https://www.pixelbeat.org/cu/coreutils-${MY_SNAPSHOT}.tar.xz.sig -> ${P}.tar.xz.sig )" |
| 37 | + S="${WORKDIR}"/${PN}-${MY_SNAPSHOT} |
| 38 | +else |
| 39 | + SRC_URI=" |
| 40 | + mirror://gnu/${PN}/${P}.tar.xz |
| 41 | + verify-sig? ( mirror://gnu/${PN}/${P}.tar.xz.sig ) |
| 42 | + " |
| 43 | + |
| 44 | + KEYWORDS="~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos ~x64-macos ~x64-solaris" |
| 45 | +fi |
| 46 | + |
| 47 | +SRC_URI+=" !vanilla? ( https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}/${MY_PATCH}.tar.xz )" |
| 48 | + |
| 49 | +LICENSE="GPL-3+" |
| 50 | +SLOT="0" |
| 51 | +IUSE="acl caps gmp hostname kill multicall nls +openssl selinux +split-usr static test vanilla xattr" |
| 52 | +RESTRICT="!test? ( test )" |
| 53 | + |
| 54 | +LIB_DEPEND=" |
| 55 | + acl? ( sys-apps/acl[static-libs] ) |
| 56 | + caps? ( sys-libs/libcap ) |
| 57 | + gmp? ( dev-libs/gmp:=[static-libs] ) |
| 58 | + openssl? ( dev-libs/openssl:=[static-libs] ) |
| 59 | + xattr? ( sys-apps/attr[static-libs] ) |
| 60 | +" |
| 61 | +RDEPEND=" |
| 62 | + !static? ( ${LIB_DEPEND//\[static-libs]} ) |
| 63 | + selinux? ( sys-libs/libselinux ) |
| 64 | + nls? ( virtual/libintl ) |
| 65 | +" |
| 66 | +DEPEND=" |
| 67 | + ${RDEPEND} |
| 68 | + static? ( ${LIB_DEPEND} ) |
| 69 | +" |
| 70 | +BDEPEND=" |
| 71 | + app-arch/xz-utils |
| 72 | + dev-lang/perl |
| 73 | + test? ( |
| 74 | + dev-debug/strace |
| 75 | + dev-lang/perl |
| 76 | + dev-perl/Expect |
| 77 | + ${PYTHON_DEPS} |
| 78 | + ) |
| 79 | + verify-sig? ( sec-keys/openpgp-keys-coreutils ) |
| 80 | +" |
| 81 | +RDEPEND+=" |
| 82 | + hostname? ( !sys-apps/net-tools[hostname] ) |
| 83 | + kill? ( |
| 84 | + !sys-apps/util-linux[kill] |
| 85 | + !sys-process/procps[kill] |
| 86 | + ) |
| 87 | + !<sys-apps/util-linux-2.13 |
| 88 | + !<sys-apps/sandbox-2.10-r4 |
| 89 | + !sys-apps/stat |
| 90 | + !net-mail/base64 |
| 91 | + !sys-apps/mktemp |
| 92 | + !<app-forensics/tct-1.18-r1 |
| 93 | + !<net-fs/netatalk-2.0.3-r4 |
| 94 | +" |
| 95 | + |
| 96 | +QA_CONFIG_IMPL_DECL_SKIP=( |
| 97 | + # gnulib FPs (bug #898370) |
| 98 | + unreachable MIN alignof static_assert |
| 99 | + # ... and on musl |
| 100 | + _exit fpurge statvfs64 re_set_syntax re_compile_pattern re_search re_match |
| 101 | +) |
| 102 | + |
| 103 | +pkg_setup() { |
| 104 | + if use test ; then |
| 105 | + python-any-r1_pkg_setup |
| 106 | + fi |
| 107 | +} |
| 108 | + |
| 109 | +src_unpack() { |
| 110 | + if [[ ${PV} == 9999 ]] ; then |
| 111 | + git-r3_src_unpack |
| 112 | + |
| 113 | + cd "${S}" || die |
| 114 | + ./bootstrap || die |
| 115 | + |
| 116 | + sed -i -e "s:submodule-checks ?= no-submodule-changes public-submodule-commit:submodule-checks ?= no-submodule-changes:" gnulib/top/maint.mk || die |
| 117 | + elif use verify-sig ; then |
| 118 | + # Needed for downloaded patch (which is unsigned, which is fine) |
| 119 | + verify-sig_verify_detached "${DISTDIR}"/${P}.tar.xz{,.sig} |
| 120 | + fi |
| 121 | + |
| 122 | + default |
| 123 | +} |
| 124 | + |
| 125 | +src_prepare() { |
| 126 | + # TODO: past 2025, we may need to add our own hack for bug #907474. |
| 127 | + local PATCHES=( |
| 128 | + # Upstream patches |
| 129 | + ) |
| 130 | + |
| 131 | + if ! use vanilla && [[ -d "${WORKDIR}"/${MY_PATCH} ]] ; then |
| 132 | + PATCHES+=( |
| 133 | + "${WORKDIR}"/${MY_PATCH} |
| 134 | + "${FILESDIR}"/${PN}-9.5-skip-readutmp-test.patch |
| 135 | + ) |
| 136 | + fi |
| 137 | + |
| 138 | + default |
| 139 | + |
| 140 | + # fixup libstdbuf non-libtool stuff |
| 141 | + if [[ ${CHOST} == *-darwin* ]] ; then |
| 142 | + # we need replacement libs from libcoreutils.a here in order |
| 143 | + # to finish the linking (they try to avoid this, but it doesn't |
| 144 | + # during bootstrap, a re-install is fine though) |
| 145 | + sed -i \ |
| 146 | + -e "/src_libstdbuf_so_LDADD/s:$: lib/libcoreutils.a:" \ |
| 147 | + Makefile.in \ |
| 148 | + || die |
| 149 | + # and we need serial building :( |
| 150 | + export MAKEOPTS+=" -j1" |
| 151 | + # set a proper install_name |
| 152 | + sed -i \ |
| 153 | + -e "/src_libstdbuf_so_LDFLAGS = -shared/s:-shared:-dynamiclib -install_name ${EPREFIX}/usr/libexec/coreutils/libstdbuf.dylib:" \ |
| 154 | + Makefile.in \ |
| 155 | + || die |
| 156 | + |
| 157 | + sed -i \ |
| 158 | + -e "s/libstdbuf\\.so/libstdbuf$(get_libname)/" \ |
| 159 | + src/stdbuf.c \ |
| 160 | + Makefile.in \ |
| 161 | + configure \ |
| 162 | + || die |
| 163 | + fi |
| 164 | + |
| 165 | + # should be gone on next release, for memset_s breakage |
| 166 | + [[ ${CHOST} == *-solaris* ]] && append-cppflags -D__STDC_WANT_LIB_EXT1__=1 |
| 167 | + |
| 168 | + # Since we've patched many .c files, the make process will try to |
| 169 | + # re-build the manpages by running `./bin --help`. When doing a |
| 170 | + # cross-compile, we can't do that since 'bin' isn't a native bin. |
| 171 | + # |
| 172 | + # Also, it's not like we changed the usage on any of these things, |
| 173 | + # so let's just update the timestamps and skip the help2man step. |
| 174 | + set -- man/*.x |
| 175 | + touch ${@/%x/1} || die |
| 176 | + |
| 177 | + # Avoid perl dep for compiled in dircolors default (bug #348642) |
| 178 | + if ! has_version dev-lang/perl ; then |
| 179 | + touch src/dircolors.h || die |
| 180 | + touch ${@/%x/1} || die |
| 181 | + fi |
| 182 | +} |
| 183 | + |
| 184 | +src_configure() { |
| 185 | + # TODO: in future (>9.4?), we may want to wire up USE=systemd: |
| 186 | + # still experimental at the moment, but: |
| 187 | + # https://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=85edb4afbd119fb69a0d53e1beb71f46c9525dd0 |
| 188 | + local myconf=( |
| 189 | + --with-packager="Gentoo" |
| 190 | + --with-packager-version="${PVR} (p${PATCH_VER:-0})" |
| 191 | + --with-packager-bug-reports="https://bugs.gentoo.org/" |
| 192 | + # kill/uptime - procps |
| 193 | + # groups/su - shadow |
| 194 | + # hostname - net-tools |
| 195 | + --enable-install-program="arch,$(usev hostname),$(usev kill)" |
| 196 | + --enable-no-install-program="groups,$(usev !hostname),$(usev !kill),su,uptime" |
| 197 | + $(usev !caps --disable-libcap) |
| 198 | + $(use_enable nls) |
| 199 | + $(use_enable acl) |
| 200 | + $(use_enable multicall single-binary) |
| 201 | + $(use_enable xattr) |
| 202 | + $(use_with gmp libgmp) |
| 203 | + $(use_with openssl) |
| 204 | + ) |
| 205 | + |
| 206 | + if use gmp ; then |
| 207 | + myconf+=( --with-libgmp-prefix="${ESYSROOT}"/usr ) |
| 208 | + fi |
| 209 | + |
| 210 | + if tc-is-cross-compiler && [[ ${CHOST} == *linux* ]] ; then |
| 211 | + # bug #311569 |
| 212 | + export fu_cv_sys_stat_statfs2_bsize=yes |
| 213 | + # bug #416629 |
| 214 | + export gl_cv_func_realpath_works=yes |
| 215 | + fi |
| 216 | + |
| 217 | + # bug #409919 |
| 218 | + export gl_cv_func_mknod_works=yes |
| 219 | + |
| 220 | + if use static ; then |
| 221 | + append-ldflags -static |
| 222 | + # bug #321821 |
| 223 | + sed -i '/elf_sys=yes/s:yes:no:' configure || die |
| 224 | + fi |
| 225 | + |
| 226 | + if ! use selinux ; then |
| 227 | + # bug #301782 |
| 228 | + export ac_cv_{header_selinux_{context,flash,selinux}_h,search_setfilecon}=no |
| 229 | + fi |
| 230 | + |
| 231 | + econf "${myconf[@]}" |
| 232 | +} |
| 233 | + |
| 234 | +src_test() { |
| 235 | + # Non-root tests will fail if the full path isn't |
| 236 | + # accessible to non-root users |
| 237 | + chmod -R go-w "${WORKDIR}" || die |
| 238 | + chmod a+rx "${WORKDIR}" || die |
| 239 | + |
| 240 | + # coreutils tests like to do `mount` and such with temp dirs, |
| 241 | + # so make sure: |
| 242 | + # - /etc/mtab is writable (bug #265725) |
| 243 | + # - /dev/loop* can be mounted (bug #269758) |
| 244 | + mkdir -p "${T}"/mount-wrappers || die |
| 245 | + mkwrap() { |
| 246 | + local w ww |
| 247 | + for w in "${@}" ; do |
| 248 | + ww="${T}/mount-wrappers/${w}" |
| 249 | + cat <<-EOF > "${ww}" |
| 250 | + #!${EPREFIX}/bin/sh |
| 251 | + exec env SANDBOX_WRITE="\${SANDBOX_WRITE}:/etc/mtab:/dev/loop" $(type -P ${w}) "\$@" |
| 252 | + EOF |
| 253 | + chmod a+rx "${ww}" || die |
| 254 | + done |
| 255 | + } |
| 256 | + mkwrap mount umount |
| 257 | + |
| 258 | + addwrite /dev/full |
| 259 | + |
| 260 | + #local -x RUN_EXPENSIVE_TESTS="yes" |
| 261 | + #local -x COREUTILS_GROUPS="portage wheel" |
| 262 | + local -x PATH="${T}/mount-wrappers:${PATH}" |
| 263 | + local -x gl_public_submodule_commit= |
| 264 | + |
| 265 | + local xfail_tests=( |
| 266 | + # bug #675802 |
| 267 | + tests/env/env-S |
| 268 | + tests/env/env-S.pl |
| 269 | + |
| 270 | + # bug #413621 and bug #548250 |
| 271 | + tests/du/long-from-unreadable.sh |
| 272 | + tests/ls/removed-directory |
| 273 | + tests/ls/removed-directory.sh |
| 274 | + tests/ls/stat-free-symlinks |
| 275 | + tests/ls/stat-free-symlinks.sh |
| 276 | + tests/rm/deep-2 |
| 277 | + tests/rm/deep-2.sh |
| 278 | + |
| 279 | + # We have a patch which fixes this (bug #259876) |
| 280 | + #tests/touch/not-owner |
| 281 | + #tests/touch/not-owner.sh |
| 282 | + ) |
| 283 | + |
| 284 | + # This test is flaky (bug #629660, bug #935367). |
| 285 | + cat > tests/dd/no-allocate.sh <<-EOF || die |
| 286 | + #!/bin/sh |
| 287 | + exit 77; |
| 288 | + EOF |
| 289 | + |
| 290 | + # This test is flaky (bug #910640). |
| 291 | + cat > tests/tty/tty-eof.pl <<-EOF || die |
| 292 | + #!/usr/bin/perl |
| 293 | + exit 77; |
| 294 | + EOF |
| 295 | + |
| 296 | + # We set DISABLE_HARD_ERRORS because some of the tests hard error-out |
| 297 | + # because of sandbox. They're skipped above but DISABLE_HARD_ERRORS is needed |
| 298 | + # to downgrade them to FAIL. |
| 299 | + emake -k check \ |
| 300 | + VERBOSE=yes \ |
| 301 | + DISABLE_HARD_ERRORS=yes \ |
| 302 | + XFAIL_TESTS="${xfail_tests[*]}" |
| 303 | +} |
| 304 | + |
| 305 | +src_install() { |
| 306 | + default |
| 307 | + |
| 308 | + insinto /etc |
| 309 | + newins src/dircolors.hin DIR_COLORS |
| 310 | + |
| 311 | + if use split-usr ; then |
| 312 | + cd "${ED}"/usr/bin || die |
| 313 | + dodir /bin |
| 314 | + |
| 315 | + # Move critical binaries into /bin (required by FHS) |
| 316 | + local fhs="cat chgrp chmod chown cp date dd df echo false ln ls |
| 317 | + mkdir mknod mv pwd rm rmdir stty sync true uname" |
| 318 | + mv ${fhs} ../../bin/ || die "Could not move FHS bins!" |
| 319 | + |
| 320 | + if use hostname ; then |
| 321 | + mv hostname ../../bin/ || die |
| 322 | + fi |
| 323 | + |
| 324 | + if use kill ; then |
| 325 | + mv kill ../../bin/ || die |
| 326 | + fi |
| 327 | + |
| 328 | + # Move critical binaries into /bin (common scripts) |
| 329 | + # (Why are these required for booting?) |
| 330 | + local com="basename chroot cut dir dirname du env expr head mkfifo |
| 331 | + mktemp readlink seq sleep sort tail touch tr tty vdir wc yes" |
| 332 | + mv ${com} ../../bin/ || die "Could not move common bins!" |
| 333 | + |
| 334 | + # Create a symlink for uname in /usr/bin/ since autotools require it. |
| 335 | + # (Other than uname, we need to figure out why we are |
| 336 | + # creating symlinks for these in /usr/bin instead of leaving |
| 337 | + # the files there in the first place...) |
| 338 | + local x |
| 339 | + for x in ${com} uname ; do |
| 340 | + dosym ../../bin/${x} /usr/bin/${x} |
| 341 | + done |
| 342 | + fi |
| 343 | +} |
| 344 | + |
| 345 | +pkg_postinst() { |
| 346 | + ewarn "Make sure you run 'hash -r' in your active shells." |
| 347 | + ewarn "You should also re-source your shell settings for LS_COLORS" |
| 348 | + ewarn " changes, such as: source /etc/profile" |
| 349 | +} |
0 commit comments