From d008d01cce6f55a23c473ce819e64ce62150c578 Mon Sep 17 00:00:00 2001 From: happysalada Date: Mon, 25 Oct 2021 22:26:03 +0900 Subject: [PATCH] coreutils: use version 8 for darwin --- pkgs/tools/misc/coreutils/8.nix | 162 ++++++++++++++++++ .../coreutils/sys-getdents-undeclared.patch | 100 +++++++++++ pkgs/top-level/all-packages.nix | 8 +- 3 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 pkgs/tools/misc/coreutils/8.nix create mode 100644 pkgs/tools/misc/coreutils/sys-getdents-undeclared.patch diff --git a/pkgs/tools/misc/coreutils/8.nix b/pkgs/tools/misc/coreutils/8.nix new file mode 100644 index 000000000000..f22a7268fbc9 --- /dev/null +++ b/pkgs/tools/misc/coreutils/8.nix @@ -0,0 +1,162 @@ +{ stdenv, lib, buildPackages +, autoreconfHook, bison, texinfo, fetchurl, perl, xz, libiconv, gmp ? null +, aclSupport ? stdenv.isLinux, acl ? null +, attrSupport ? stdenv.isLinux, attr ? null +, selinuxSupport? false, libselinux ? null, libsepol ? null +# No openssl in default version, so openssl-induced rebuilds aren't too big. +# It makes *sum functions significantly faster. +, minimal ? true, withOpenssl ? !minimal, openssl ? null +, withPrefix ? false +, singleBinary ? "symlinks" # you can also pass "shebangs" or false +}: + +# Note: this package is used for bootstrapping fetchurl, and thus +# cannot use fetchpatch! All mutable patches (generated by GitHub or +# cgit) that are needed here should be included directly in Nixpkgs as +# files. + +assert aclSupport -> acl != null; +assert selinuxSupport -> libselinux != null && libsepol != null; + +with lib; + +stdenv.mkDerivation (rec { + pname = "coreutils"; + version = "8.32"; + + src = fetchurl { + url = "mirror://gnu/${pname}/${pname}-${version}.tar.xz"; + sha256 = "sha256-RFjY3nhJ30TMqxXhaxVIsoUiTbul8I+sBwwcDgvMTPo="; + }; + + patches = [ ./sys-getdents-undeclared.patch ] + ++ optional stdenv.hostPlatform.isCygwin ./coreutils-8.23-4.cygwin.patch + # fix gnulib tests on 32-bit ARM. Included on coreutils master. + # https://lists.gnu.org/r/bug-gnulib/2020-08/msg00225.html + ++ optional stdenv.hostPlatform.isAarch32 ./fix-gnulib-tests-arm.patch; + + postPatch = '' + # The test tends to fail on btrfs,f2fs and maybe other unusual filesystems. + sed '2i echo Skipping dd sparse test && exit 77' -i ./tests/dd/sparse.sh + sed '2i echo Skipping du threshold test && exit 77' -i ./tests/du/threshold.sh + sed '2i echo Skipping cp sparse test && exit 77' -i ./tests/cp/sparse.sh + sed '2i echo Skipping rm deep-2 test && exit 77' -i ./tests/rm/deep-2.sh + sed '2i echo Skipping du long-from-unreadable test && exit 77' -i ./tests/du/long-from-unreadable.sh + + # Depends on the mountpoints + sed '2i echo Skipping df df-symlink test && exit 77' -i ./tests/df/df-symlink.sh + + # Some target platforms, especially when building inside a container have + # issues with the inotify test. + sed '2i echo Skipping tail inotify dir recreate test && exit 77' -i ./tests/tail-2/inotify-dir-recreate.sh + + # sandbox does not allow setgid + sed '2i echo Skipping chmod setgid test && exit 77' -i ./tests/chmod/setgid.sh + substituteInPlace ./tests/install/install-C.sh \ + --replace 'mode3=2755' 'mode3=1755' + + sed '2i print "Skipping env -S test"; exit 77;' -i ./tests/misc/env-S.pl + + # Fails on systems with a rootfs. Looks like a bug in the test, see + # https://lists.gnu.org/archive/html/bug-coreutils/2019-12/msg00000.html + sed '2i print "Skipping df skip-rootfs test"; exit 77' -i ./tests/df/skip-rootfs.sh + + # these tests fail in the unprivileged nix sandbox (without nix-daemon) as we break posix assumptions + for f in ./tests/chgrp/{basic.sh,recurse.sh,default-no-deref.sh,no-x.sh,posix-H.sh}; do + sed '2i echo Skipping chgrp && exit 77' -i "$f" + done + for f in gnulib-tests/{test-chown.c,test-fchownat.c,test-lchown.c}; do + echo "int main() { return 77; }" > "$f" + done + + # tests try to access user 1000 which is forbidden in sandbox + sed '2i print "Skipping id uid test"; exit 77' -i ./tests/id/uid.sh + sed '2i print "Skipping id zero test"; exit 77' -i ./tests/id/zero.sh + sed '2i print "Skipping misc help-versiob test"; exit 77' -i ./tests/misc/help-version.sh + sed '2i print "Skipping chown separator test"; exit 77' -i ./tests/chown/separator.sh + '' + optionalString (stdenv.hostPlatform.libc == "musl") (lib.concatStringsSep "\n" [ + '' + echo "int main() { return 77; }" > gnulib-tests/test-parse-datetime.c + echo "int main() { return 77; }" > gnulib-tests/test-getlogin.c + '' + ]); + + outputs = [ "out" "info" ]; + + nativeBuildInputs = [ perl xz.bin ] + ++ optionals stdenv.hostPlatform.isCygwin [ autoreconfHook texinfo ]; # due to patch + configureFlags = [ "--with-packager=https://NixOS.org" ] + ++ optional (singleBinary != false) + ("--enable-single-binary" + optionalString (isString singleBinary) "=${singleBinary}") + ++ optional withOpenssl "--with-openssl" + ++ optional stdenv.hostPlatform.isSunOS "ac_cv_func_inotify_init=no" + ++ optional withPrefix "--program-prefix=g" + ++ optionals (stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.libc == "glibc") [ + # TODO(19b98110126fde7cbb1127af7e3fe1568eacad3d): Needed for fstatfs() I + # don't know why it is not properly detected cross building with glibc. + "fu_cv_sys_stat_statfs2_bsize=yes" + ]; + + + buildInputs = [ gmp ] + ++ optional aclSupport acl + ++ optional attrSupport attr + ++ optional withOpenssl openssl + ++ optionals selinuxSupport [ libselinux libsepol ] + # TODO(@Ericson2314): Investigate whether Darwin could benefit too + ++ optional (stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.libc != "glibc") libiconv; + + # The tests are known broken on Cygwin + # (http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/19025), + # Darwin (http://article.gmane.org/gmane.comp.gnu.core-utils.bugs/19351), + # and {Open,Free}BSD. + # With non-standard storeDir: https://github.com/NixOS/nix/issues/512 + doCheck = stdenv.hostPlatform == stdenv.buildPlatform + && (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.isMusl) + && !stdenv.isAarch32; + + # Prevents attempts of running 'help2man' on cross-built binaries. + PERL = if stdenv.hostPlatform == stdenv.buildPlatform then null else "missing"; + + # Saw random failures like ‘help2man: can't get '--help' info from + # man/sha512sum.td/sha512sum’. + enableParallelBuilding = false; + + NIX_LDFLAGS = optionalString selinuxSupport "-lsepol"; + FORCE_UNSAFE_CONFIGURE = optionalString stdenv.hostPlatform.isSunOS "1"; + + # Works around a bug with 8.26: + # Makefile:3440: *** Recursive variable 'INSTALL' references itself (eventually). Stop. + preInstall = optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' + sed -i Makefile -e 's|^INSTALL =.*|INSTALL = ${buildPackages.coreutils}/bin/install -c|' + ''; + + postInstall = optionalString (stdenv.hostPlatform != stdenv.buildPlatform && !minimal) '' + rm $out/share/man/man1/* + cp ${buildPackages.coreutils-full}/share/man/man1/* $out/share/man/man1 + '' + # du: 8.7 M locale + 0.4 M man pages + + optionalString minimal '' + rm -r "$out/share" + ''; + + meta = { + homepage = "https://www.gnu.org/software/coreutils/"; + description = "The basic file, shell and text manipulation utilities of the GNU operating system"; + longDescription = '' + The GNU Core Utilities are the basic file, shell and text + manipulation utilities of the GNU operating system. These are + the core utilities which are expected to exist on every + operating system. + ''; + license = licenses.gpl3Plus; + platforms = platforms.unix ++ platforms.windows; + priority = 10; + maintainers = [ maintainers.eelco ]; + }; +} // optionalAttrs stdenv.hostPlatform.isMusl { + # Work around a bogus warning in conjunction with musl. + NIX_CFLAGS_COMPILE = "-Wno-error"; +} // lib.optionalAttrs stdenv.hostPlatform.isAndroid { + NIX_CFLAGS_COMPILE = "-D__USE_FORTIFY_LEVEL=0"; +}) diff --git a/pkgs/tools/misc/coreutils/sys-getdents-undeclared.patch b/pkgs/tools/misc/coreutils/sys-getdents-undeclared.patch new file mode 100644 index 000000000000..0af5de68415a --- /dev/null +++ b/pkgs/tools/misc/coreutils/sys-getdents-undeclared.patch @@ -0,0 +1,100 @@ +From 10fcb97bd728f09d4a027eddf8ad2900f0819b0a Mon Sep 17 00:00:00 2001 +From: Paul Eggert +Date: Thu, 5 Mar 2020 17:25:29 -0800 +Subject: ls: restore 8.31 behavior on removed directories + +* NEWS: Mention this. +* src/ls.c: Do not include +(print_dir): Don't worry about whether the directory is removed. +* tests/ls/removed-directory.sh: Adjust to match new (i.e., old) +behavior. +--- + NEWS (removed diff in nixpkgs)| 6 ++++++ + src/ls.c | 22 ---------------------- + tests/ls/removed-directory.sh | 10 ++-------- + 3 files changed, 8 insertions(+), 30 deletions(-) + +diff --git a/src/ls.c b/src/ls.c +index 24b983287..4acf5f44d 100644 +--- a/src/ls.c ++++ b/src/ls.c +@@ -49,10 +49,6 @@ + # include + #endif + +-#ifdef __linux__ +-# include +-#endif +- + #include + #include + #include +@@ -2896,7 +2892,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) + struct dirent *next; + uintmax_t total_blocks = 0; + static bool first = true; +- bool found_any_entries = false; + + errno = 0; + dirp = opendir (name); +@@ -2972,7 +2967,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) + next = readdir (dirp); + if (next) + { +- found_any_entries = true; + if (! file_ignored (next->d_name)) + { + enum filetype type = unknown; +@@ -3018,22 +3012,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg) + if (errno != EOVERFLOW) + break; + } +-#ifdef __linux__ +- else if (! found_any_entries) +- { +- /* If readdir finds no directory entries at all, not even "." or +- "..", then double check that the directory exists. */ +- if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1 +- && errno != EINVAL) +- { +- /* We exclude EINVAL as that pertains to buffer handling, +- and we've passed NULL as the buffer for simplicity. +- ENOENT is returned if appropriate before buffer handling. */ +- file_failure (command_line_arg, _("reading directory %s"), name); +- } +- break; +- } +-#endif + else + break; + +diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh +index e8c835dab..fe8f929a1 100755 +--- a/tests/ls/removed-directory.sh ++++ b/tests/ls/removed-directory.sh +@@ -26,20 +26,14 @@ case $host_triplet in + *) skip_ 'non linux kernel' ;; + esac + +-LS_FAILURE=2 +- +-cat <<\EOF >exp-err || framework_failure_ +-ls: reading directory '.': No such file or directory +-EOF +- + cwd=$(pwd) + mkdir d || framework_failure_ + cd d || framework_failure_ + rmdir ../d || framework_failure_ + +-returns_ $LS_FAILURE ls >../out 2>../err || fail=1 ++ls >../out 2>../err || fail=1 + cd "$cwd" || framework_failure_ + compare /dev/null out || fail=1 +-compare exp-err err || fail=1 ++compare /dev/null err || fail=1 + + Exit $fail +-- +cgit v1.2.1 + diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 80f18b89ff48..94a798a5d737 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -4212,7 +4212,13 @@ with pkgs; cpcfs = callPackage ../tools/filesystems/cpcfs { }; - coreutils = callPackage ../tools/misc/coreutils { }; + # coreutils 9 messes up some binary format on darwin + # https://github.com/NixOS/nixpkgs/pull/141684 + # test by trying to build alacritty for example + coreutils = if !stdenv.isDarwin then + callPackage ../tools/misc/coreutils { } + else + callPackage ../tools/misc/coreutils/8.nix { }; coreutils-full = coreutils.override { minimal = false; }; coreutils-prefixed = coreutils.override { withPrefix = true; singleBinary = false; };