| Cost | $0.228 |
| Total elapsed time | 5m39s |
| LLM inference time | 4m16s |
| Command execution time | 1m23s |
| Commands executed | 35 |
All details >
| Attempt ID | voe8esm42oiot | Attempt group | run-16-09-22-05 |
| Revision | fb5c74bd2fee | AWS Instance | m8i.2xlarge |
| Start time | 2025-09-16T20:16:23.376Z | End time | 2025-09-16T20:22:02.755Z |
| Task | coreutils-old-version | Environment | ubuntu-22.04-amd64-offline |
| Model | | OpenRouter slug | openai/gpt-5 |
| Temperature | 1 | Explicit prompt caching | false |
| User msg after tool call | false | Max tool calls | 90 |
| Total timeout seconds | 1200 | Single command timeout | 600 |
| Cost | $0.228 | Duration | 5m39s |
| LLM inference time | 4m16s | Command execution time | 1m23s |
| Final context tokens | 37,797 | Total output tokens | 8,739 |
| Output reasoning tokens | 6,144 | Messages | 73 |
| Assistant messages | 36 | User messages | 1 |
| System messages | 1 | Commands executed | 35 |
GNU coreutils 5.0 (from 2003) is a collection of Linux utilities like ls, cp, mv, etc.
Project link: gnu.org/software/coreutils
Task:
Compile and install all coreutils utilities to a specific location.
Difficulties:
The source is very old (2003) and requires heavy patching.
Environment:
Ubuntu 22.04 on amd64, without internet access.
You are a package-building specialist operating a Ubuntu 22.04 bash shell via one tool: run_terminal_cmd.
The current working directory of every run_terminal_cmd is /home/peter.
Execution rules:
- Always pass non-interactive flags for any command that could prompt (e.g., -y, --yes, DEBIAN_FRONTEND=noninteractive).
- Don't include any newlines in the command.
- The environment is offline, assume you have all the necessary tools already installed.
If you encounter any errors or issues while doing the user's request, you must fix them and continue the task.
At the end verify you did the user request correctly.
You are given a coreutils v5.0 source code at /home/peter/coreutils.tar.gz. Please compile the coreutils package and install it to /home/peter/result. Create symlinks for all coreutils utilities so they are available under /home/peter/result/
Show reasoning
Considering compilation challenges
Alright, this seems complex but doable. Since we're offline, I think we can edit files with sed to change compile flags to stop treating warnings as errors. The packaging environment has what we need, but coreutils 5.0 from 2003 might struggle with modern glibc or gcc due to updates. We may need to patch it, considering adjustments like CFLAGS="-D_GNU_SOURCE -O2 -fcommon" and other issues like defining PATH_MAX. I’ll try to navigate this!Planning extraction commands
I need to keep my commands to one line each for clarity and use run_terminal_cmd to execute them. First, I'll create the /home/peter/build directory and extract the tarball with: mkdir -p /home/peter/build && tar -xzf /home/peter/coreutils.tar.gz -C /home/peter/build. It’s a better idea to extract it into a subdirectory. I’ll check the contents of the tarball first with tar -tzf /home/peter/coreutils.tar.gz to determine directory names. After that, I'll navigate to the extracted folder using a wildcard: cd /home/peter/build/coreutils-*/.Outlining general steps
First, I'll create the result directory with mkdir -p /home/peter/result. Next, I’ll create the build directory and extract the tarball using: mkdir -p /home/peter/build && tar -xzf /home/peter/coreutils.tar.gz -C /home/peter/build. I want to find the source directory, which I can do with srcdir=$(find /home/peter/build -maxdepth 1 -type d -name "coreutils*" | head -n1). To maintain clarity, I prefer multiple run_terminal_cmd calls to navigate into the source directory and then run the ./configure command, ensuring the prefix is /home/peter/result.Reviewing coreutils installation options
Historically, coreutils comes with a --program-transform-name option for a "single binary" setup where each program links to the coreutils binary with ln -s. While I'm unsure about version 5.0 specifics, it seems that since version 8, there's been support for this. In version 5.0, there may be a src/Makefile target called "all" to build separate binaries. I’ll run make -j$(nproc) and then make install, using the prefix for installation. I should prepare for potential compile errors, which might arise from the use of dangerous functions or static declarations. I'll have to address these using sed or by defining macros like -Wno-error.Preparing for coreutils compilation
I need to ensure I’m avoiding any issues with the older code, possibly using CFLAGS to set various warning flags. I'm hesitant about whether -Werror is in use, so I'll use env FORCE_UNSAFE_CONFIGURE=1 since coreutils might refuse to configure as root, even though I'm likely not running as root. Next, I'll set multiple flags like -O2, -fcommon, and others for older GCC compatibility.
I should keep in mind that older code may have problems with the removal of gets, which means I might need to adapt my approach during the compilation process. After installation, I’ll create symlinks in /home/peter/result for all compiled utilities, making sure they point correctly to the binaries. I’ll also need to prepare for potential pitfalls like issues with man pages and double-defined functions. I’ll use run_terminal_cmd for each command, tackling errors as they arise once I get started.
compile-bench> set -euo pipefail; mkdir -p /home/peter/result /home/peter/build && tar -tzf /home/peter/coreutils.tar.gz | head -n 5 coreutils-5.0/
coreutils-5.0/config/
coreutils-5.0/config/ChangeLog
coreutils-5.0/config/config.guess
coreutils-5.0/config/config.rpath
↓ 6 lines
coreutils-5.0/ coreutils-5.0/config/ coreutils-5.0/config/ChangeLog coreutils-5.0/config/config.guess coreutils-5.0/config/config.rpath
Show reasoning
Extracting tarball content
I verified that the tarball contains "coreutils-5.0/", so now I need to proceed with extracting it. It's important to make sure everything goes smoothly and that no files are missed during the extraction. I should check if there are any specific commands or options to keep in mind while extracting to ensure everything is in the right place. Let's make sure to follow the best practices for a smooth extraction process!
compile-bench> set -euo pipefail; rm -rf /home/peter/build/coreutils-5.0 && tar -xzf /home/peter/coreutils.tar.gz -C /home/peter/build && ls -la /home/peter/build | sed -n '1,120p' total 12
drwxr-xr-x 3 peter peter 4096 Sep 16 20:16 .
drwxr-x--- 1 peter peter 4096 Sep 16 20:16 ..
drwxr-xr-x 11 peter peter 4096 Apr 2 2003 coreutils-5.0
↓ 5 lines
total 12 drwxr-xr-x 3 peter peter 4096 Sep 16 20:16 . drwxr-x--- 1 peter peter 4096 Sep 16 20:16 .. drwxr-xr-x 11 peter peter 4096 Apr 2 2003 coreutils-5.0
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && env FORCE_UNSAFE_CONFIGURE=1 CFLAGS='-O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow' CPPFLAGS='-D_GNU_SOURCE' ./configure --prefix=/home/peter/result --disable-nls checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for perl5.003 or newer... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking whether gcc needs -traditional... no
checking for ranlib... ranlib
checking whether ln -s works... yes
checking for AIX... no
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking for uname... yes
checking for chroot... yes
checking for gethostid... yes
checking for strerror in -lcposix... no
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking for _LARGE_FILES value needed for large files... no
checking for gcc option to accept ANSI C... none needed
checking for function prototypes... yes
checking for ANSI C header files... (cached) yes
checking for string.h... (cached) yes
checking whether byte ordering is bigendian... no
checking for an ANSI C-conforming const... yes
checking for working volatile... yes
checking for inline... inline
checking for working long double with more range or precision than double... no
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking float.h usability... yes
checking float.h presence... yes
checking for float.h... yes
checking hurd.h usability... no
checking hurd.h presence... no
checking for hurd.h... no
checking limits.h usability... yes
checking limits.h presence... yes
checking for limits.h... yes
checking for memory.h... (cached) yes
[command output truncated]
checking shadow.h usability... yes
checking shadow.h presence... yes
checking for shadow.h... yes
checking for struct spwd.sp_pwdp... yes
checking for getspnam... yes
checking for library containing crypt... -lcrypt
checking for msgfmt... no
checking for gmsgfmt... :
checking for xgettext... no
checking for msgmerge... no
checking whether NLS is requested... no
configure: creating ./config.status
config.status: creating Makefile
config.status: creating doc/Makefile
config.status: creating lib/Makefile
config.status: creating man/Makefile
config.status: creating m4/Makefile
config.status: creating po/Makefile.in
config.status: creating src/Makefile
config.status: creating tests/Makefile
config.status: creating tests/basename/Makefile
config.status: creating tests/chgrp/Makefile
config.status: creating tests/chmod/Makefile
config.status: creating tests/chown/Makefile
config.status: creating tests/cp/Makefile
config.status: creating tests/cut/Makefile
config.status: creating tests/date/Makefile
config.status: creating tests/dd/Makefile
config.status: creating tests/dircolors/Makefile
config.status: creating tests/du/Makefile
config.status: creating tests/expr/Makefile
config.status: creating tests/factor/Makefile
config.status: creating tests/fmt/Makefile
config.status: creating tests/head/Makefile
config.status: creating tests/install/Makefile
config.status: creating tests/join/Makefile
config.status: creating tests/ln/Makefile
config.status: creating tests/ls-2/Makefile
config.status: creating tests/ls/Makefile
config.status: creating tests/md5sum/Makefile
config.status: creating tests/misc/Makefile
config.status: creating tests/mkdir/Makefile
config.status: creating tests/mv/Makefile
config.status: creating tests/od/Makefile
config.status: creating tests/pr/Makefile
config.status: creating tests/rm/Makefile
config.status: creating tests/rmdir/Makefile
config.status: creating tests/seq/Makefile
config.status: creating tests/sha1sum/Makefile
config.status: creating tests/shred/Makefile
config.status: creating tests/sort/Makefile
config.status: creating tests/stty/Makefile
config.status: creating tests/sum/Makefile
config.status: creating tests/tac/Makefile
config.status: creating tests/tail-2/Makefile
config.status: creating tests/tail/Makefile
config.status: creating tests/test/Makefile
config.status: creating tests/touch/Makefile
config.status: creating tests/tr/Makefile
config.status: creating tests/tsort/Makefile
config.status: creating tests/unexpand/Makefile
config.status: creating tests/uniq/Makefile
config.status: creating tests/wc/Makefile
config.status: creating config.h
config.status: linking ./lib/ftw_.h to lib/ftw.h
config.status: executing depfiles commands
config.status: executing default-1 commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
↓ 141 lines
checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for gawk... no checking for mawk... mawk checking whether make sets $(MAKE)... yes checking for perl5.003 or newer... yes checking for gcc... gcc checking for C compiler default output... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking how to run the C preprocessor... gcc -E checking for egrep... grep -E checking whether gcc needs -traditional... no checking for ranlib... ranlib checking whether ln -s works... yes checking for AIX... no checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking for uname... yes checking for chroot... yes checking for gethostid... yes checking for strerror in -lcposix... no checking for special C compiler options needed for large files... no checking for _FILE_OFFSET_BITS value needed for large files... no checking for _LARGE_FILES value needed for large files... no checking for gcc option to accept ANSI C... none needed checking for function prototypes... yes checking for ANSI C header files... (cached) yes checking for string.h... (cached) yes checking whether byte ordering is bigendian... no checking for an ANSI C-conforming const... yes checking for working volatile... yes checking for inline... inline checking for working long double with more range or precision than double... no checking errno.h usability... yes checking errno.h presence... yes checking for errno.h... yes checking fcntl.h usability... yes checking fcntl.h presence... yes checking for fcntl.h... yes checking float.h usability... yes checking float.h presence... yes checking for float.h... yes checking hurd.h usability... no checking hurd.h presence... no checking for hurd.h... no checking limits.h usability... yes checking limits.h presence... yes checking for limits.h... yes checking for memory.h... (cached) yes [command output truncated] checking shadow.h usability... yes checking shadow.h presence... yes checking for shadow.h... yes checking for struct spwd.sp_pwdp... yes checking for getspnam... yes checking for library containing crypt... -lcrypt checking for msgfmt... no checking for gmsgfmt... : checking for xgettext... no checking for msgmerge... no checking whether NLS is requested... no configure: creating ./config.status config.status: creating Makefile config.status: creating doc/Makefile config.status: creating lib/Makefile config.status: creating man/Makefile config.status: creating m4/Makefile config.status: creating po/Makefile.in config.status: creating src/Makefile config.status: creating tests/Makefile config.status: creating tests/basename/Makefile config.status: creating tests/chgrp/Makefile config.status: creating tests/chmod/Makefile config.status: creating tests/chown/Makefile config.status: creating tests/cp/Makefile config.status: creating tests/cut/Makefile config.status: creating tests/date/Makefile config.status: creating tests/dd/Makefile config.status: creating tests/dircolors/Makefile config.status: creating tests/du/Makefile config.status: creating tests/expr/Makefile config.status: creating tests/factor/Makefile config.status: creating tests/fmt/Makefile config.status: creating tests/head/Makefile config.status: creating tests/install/Makefile config.status: creating tests/join/Makefile config.status: creating tests/ln/Makefile config.status: creating tests/ls-2/Makefile config.status: creating tests/ls/Makefile config.status: creating tests/md5sum/Makefile config.status: creating tests/misc/Makefile config.status: creating tests/mkdir/Makefile config.status: creating tests/mv/Makefile config.status: creating tests/od/Makefile config.status: creating tests/pr/Makefile config.status: creating tests/rm/Makefile config.status: creating tests/rmdir/Makefile config.status: creating tests/seq/Makefile config.status: creating tests/sha1sum/Makefile config.status: creating tests/shred/Makefile config.status: creating tests/sort/Makefile config.status: creating tests/stty/Makefile config.status: creating tests/sum/Makefile config.status: creating tests/tac/Makefile config.status: creating tests/tail-2/Makefile config.status: creating tests/tail/Makefile config.status: creating tests/test/Makefile config.status: creating tests/touch/Makefile config.status: creating tests/tr/Makefile config.status: creating tests/tsort/Makefile config.status: creating tests/unexpand/Makefile config.status: creating tests/uniq/Makefile config.status: creating tests/wc/Makefile config.status: creating config.h config.status: linking ./lib/ftw_.h to lib/ftw.h config.status: executing depfiles commands config.status: executing default-1 commands config.status: creating po/POTFILES config.status: creating po/Makefile
Show reasoning
Configuring the build process
Alright, the configuration completed successfully, so now it's time to move on to the "make" step. I plan to run it with multiple jobs using -j$(nproc). It seems like providing MAKEFLAGS could help. I also need to ensure that the environment is proper. Should I set DEBIAN_FRONTEND=noninteractive? Oh wait, that's not needed for the make step. I'll just focus on compiling now and see how it goes!
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make -j"$(nproc)" make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT acl.o -MD -MP -MF ".deps/acl.Tpo" \
-c -o acl.o `test -f 'acl.c' || echo './'`acl.c; \
then mv ".deps/acl.Tpo" ".deps/acl.Po"; \
else rm -f ".deps/acl.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT getdate.o -MD -MP -MF ".deps/getdate.Tpo" \
-c -o getdate.o `test -f 'getdate.c' || echo './'`getdate.c; \
then mv ".deps/getdate.Tpo" ".deps/getdate.Po"; \
else rm -f ".deps/getdate.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT posixtm.o -MD -MP -MF ".deps/posixtm.Tpo" \
-c -o posixtm.o `test -f 'posixtm.c' || echo './'`posixtm.c; \
then mv ".deps/posixtm.Tpo" ".deps/posixtm.Po"; \
else rm -f ".deps/posixtm.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT posixver.o -MD -MP -MF ".deps/posixver.Tpo" \
-c -o posixver.o `test -f 'posixver.c' || echo './'`posixver.c; \
then mv ".deps/posixver.Tpo" ".deps/posixver.Po"; \
else rm -f ".deps/posixver.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT strftime.o -MD -MP -MF ".deps/strftime.Tpo" \
-c -o strftime.o `test -f 'strftime.c' || echo './'`strftime.c; \
then mv ".deps/strftime.Tpo" ".deps/strftime.Po"; \
else rm -f ".deps/strftime.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT getopt.o -MD -MP -MF ".deps/getopt.Tpo" \
-c -o getopt.o `test -f 'getopt.c' || echo './'`getopt.c; \
then mv ".deps/getopt.Tpo" ".deps/getopt.Po"; \
else rm -f ".deps/getopt.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-misma
[command output truncated]
t -f 'whoami.c' || echo './'`whoami.c; \
then mv ".deps/whoami.Tpo" ".deps/whoami.Po"; \
else rm -f ".deps/whoami.Tpo"; exit 1; \
fi
tee.c:35:12: error: conflicting types for 'tee'; have 'int(int, const char **)'
35 | static int tee (int nfiles, const char **files);
| ^~~
In file included from /usr/include/x86_64-linux-gnu/bits/fcntl.h:61,
from /usr/include/fcntl.h:35,
from system.h:153,
from tee.c:26:
/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:429:18: note: previous declaration of 'tee' with type '__ssize_t(int, int, size_t, unsigned int)' {aka 'long int(int, int, long unsigned int, unsigned int)'}
429 | extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
| ^~~
test.c:142:1: error: static declaration of 'eaccess' follows non-static declaration
142 | eaccess (char const *file, int mode)
| ^~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
from /usr/include/signal.h:328,
from /usr/include/x86_64-linux-gnu/sys/param.h:28,
from system.h:33,
from test.c:41:
/usr/include/unistd.h:296:12: note: previous declaration of 'eaccess' with type 'int(const char *, int)'
296 | extern int eaccess (const char *__name, int __type)
| ^~~~~~~
make[3]: *** [Makefile:1263: tee.o] Error 1
make[3]: *** Waiting for unfinished jobs....
test.c: In function 'eaccess':
test.c:160:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
160 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:162:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
162 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:168:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
168 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:170:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
170 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: *** [Makefile:1263: test.o] Error 1
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
↓ 86 lines
make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT acl.o -MD -MP -MF ".deps/acl.Tpo" \
-c -o acl.o `test -f 'acl.c' || echo './'`acl.c; \
then mv ".deps/acl.Tpo" ".deps/acl.Po"; \
else rm -f ".deps/acl.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT getdate.o -MD -MP -MF ".deps/getdate.Tpo" \
-c -o getdate.o `test -f 'getdate.c' || echo './'`getdate.c; \
then mv ".deps/getdate.Tpo" ".deps/getdate.Po"; \
else rm -f ".deps/getdate.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT posixtm.o -MD -MP -MF ".deps/posixtm.Tpo" \
-c -o posixtm.o `test -f 'posixtm.c' || echo './'`posixtm.c; \
then mv ".deps/posixtm.Tpo" ".deps/posixtm.Po"; \
else rm -f ".deps/posixtm.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT posixver.o -MD -MP -MF ".deps/posixver.Tpo" \
-c -o posixver.o `test -f 'posixver.c' || echo './'`posixver.c; \
then mv ".deps/posixver.Tpo" ".deps/posixver.Po"; \
else rm -f ".deps/posixver.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT strftime.o -MD -MP -MF ".deps/strftime.Tpo" \
-c -o strftime.o `test -f 'strftime.c' || echo './'`strftime.c; \
then mv ".deps/strftime.Tpo" ".deps/strftime.Po"; \
else rm -f ".deps/strftime.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT getopt.o -MD -MP -MF ".deps/getopt.Tpo" \
-c -o getopt.o `test -f 'getopt.c' || echo './'`getopt.c; \
then mv ".deps/getopt.Tpo" ".deps/getopt.Po"; \
else rm -f ".deps/getopt.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-misma
[command output truncated]
t -f 'whoami.c' || echo './'`whoami.c; \
then mv ".deps/whoami.Tpo" ".deps/whoami.Po"; \
else rm -f ".deps/whoami.Tpo"; exit 1; \
fi
tee.c:35:12: error: conflicting types for 'tee'; have 'int(int, const char **)'
35 | static int tee (int nfiles, const char **files);
| ^~~
In file included from /usr/include/x86_64-linux-gnu/bits/fcntl.h:61,
from /usr/include/fcntl.h:35,
from system.h:153,
from tee.c:26:
/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:429:18: note: previous declaration of 'tee' with type '__ssize_t(int, int, size_t, unsigned int)' {aka 'long int(int, int, long unsigned int, unsigned int)'}
429 | extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
| ^~~
test.c:142:1: error: static declaration of 'eaccess' follows non-static declaration
142 | eaccess (char const *file, int mode)
| ^~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
from /usr/include/signal.h:328,
from /usr/include/x86_64-linux-gnu/sys/param.h:28,
from system.h:33,
from test.c:41:
/usr/include/unistd.h:296:12: note: previous declaration of 'eaccess' with type 'int(const char *, int)'
296 | extern int eaccess (const char *__name, int __type)
| ^~~~~~~
make[3]: *** [Makefile:1263: tee.o] Error 1
make[3]: *** Waiting for unfinished jobs....
test.c: In function 'eaccess':
test.c:160:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
160 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:162:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
162 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:168:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
168 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:170:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
170 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: *** [Makefile:1263: test.o] Error 1
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
compile-bench> set -euo pipefail; sed -n '1,220p' /home/peter/build/coreutils-5.0/src/system.h | sed -n '1,200p' /* system-dependent definitions for fileutils, textutils, and sh-utils packages.
Copyright (C) 1989, 1991-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Include sys/types.h before this file. */
#if 2 <= __GLIBC__ && 2 <= __GLIBC_MINOR__
# if ! defined _SYS_TYPES_H
you must include <sys/types.h> before including this file
# endif
#endif
#include <sys/stat.h>
#if !defined HAVE_MKFIFO
# define mkfifo(path, mode) (mknod ((path), (mode) | S_IFIFO, 0))
#endif
#if HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
/* <unistd.h> should be included before any preprocessor test
of _POSIX_VERSION. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifndef STDIN_FILENO
# define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif
#if HAVE_LIMITS_H
/* limits.h must come before pathmax.h because limits.h on some systems
undefs PATH_MAX, whereas pathmax.h sets PATH_MAX. */
# include <limits.h>
#endif
#include "pathmax.h"
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
[command output truncated]
#endif
#if HAVE_STDLIB_H
# define getopt system_getopt
# include <stdlib.h>
# undef getopt
#endif
/* The following test is to work around the gross typo in
systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
is defined to 0, not 1. */
#if !EXIT_FAILURE
# undef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
#if HAVE_FCNTL_H
# include <fcntl.h>
#else
# include <sys/file.h>
#endif
#if !defined SEEK_SET
# define SEEK_SET 0
# define SEEK_CUR 1
# define SEEK_END 2
#endif
#ifndef F_OK
# define F_OK 0
# define X_OK 1
# define W_OK 2
# define R_OK 4
#endif
/* For systems that distinguish between text and binary I/O.
O_BINARY is usually declared in fcntl.h */
#if !defined O_BINARY && defined _O_BINARY
/* For MSC-compatible compilers. */
# define O_BINARY _O_BINARY
# define O_TEXT _O_TEXT
#endif
#ifdef __BEOS__
/* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
# undef O_BINARY
# undef O_TEXT
#endif
#if O_BINARY
# ifndef __DJGPP__
# define setmode _setmode
# define fileno(_fp) _fileno (_fp)
# endif /* not DJGPP */
# define SET_MODE(_f, _m) setmode (_f, _m)
# define SET_BINARY(_f) do {if (!isatty(_f)) setmode (_f, O_BINARY);} while (0)
# define SET_BINARY2(_f1, _f2) \
do { \
if (!isatty (_f1)) \
{ \
setmode (_f1, O_BINARY); \
if (!isatty (_f2)) \
setmode (_f2, O_BINARY); \
} \
} while(0)
#else
↓ 141 lines
/* system-dependent definitions for fileutils, textutils, and sh-utils packages.
Copyright (C) 1989, 1991-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Include sys/types.h before this file. */
#if 2 <= __GLIBC__ && 2 <= __GLIBC_MINOR__
# if ! defined _SYS_TYPES_H
you must include <sys/types.h> before including this file
# endif
#endif
#include <sys/stat.h>
#if !defined HAVE_MKFIFO
# define mkfifo(path, mode) (mknod ((path), (mode) | S_IFIFO, 0))
#endif
#if HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
/* <unistd.h> should be included before any preprocessor test
of _POSIX_VERSION. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
#ifndef STDIN_FILENO
# define STDIN_FILENO 0
#endif
#ifndef STDOUT_FILENO
# define STDOUT_FILENO 1
#endif
#ifndef STDERR_FILENO
# define STDERR_FILENO 2
#endif
#if HAVE_LIMITS_H
/* limits.h must come before pathmax.h because limits.h on some systems
undefs PATH_MAX, whereas pathmax.h sets PATH_MAX. */
# include <limits.h>
#endif
#include "pathmax.h"
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
[command output truncated]
#endif
#if HAVE_STDLIB_H
# define getopt system_getopt
# include <stdlib.h>
# undef getopt
#endif
/* The following test is to work around the gross typo in
systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
is defined to 0, not 1. */
#if !EXIT_FAILURE
# undef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
#if HAVE_FCNTL_H
# include <fcntl.h>
#else
# include <sys/file.h>
#endif
#if !defined SEEK_SET
# define SEEK_SET 0
# define SEEK_CUR 1
# define SEEK_END 2
#endif
#ifndef F_OK
# define F_OK 0
# define X_OK 1
# define W_OK 2
# define R_OK 4
#endif
/* For systems that distinguish between text and binary I/O.
O_BINARY is usually declared in fcntl.h */
#if !defined O_BINARY && defined _O_BINARY
/* For MSC-compatible compilers. */
# define O_BINARY _O_BINARY
# define O_TEXT _O_TEXT
#endif
#ifdef __BEOS__
/* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
# undef O_BINARY
# undef O_TEXT
#endif
#if O_BINARY
# ifndef __DJGPP__
# define setmode _setmode
# define fileno(_fp) _fileno (_fp)
# endif /* not DJGPP */
# define SET_MODE(_f, _m) setmode (_f, _m)
# define SET_BINARY(_f) do {if (!isatty(_f)) setmode (_f, O_BINARY);} while (0)
# define SET_BINARY2(_f1, _f2) \
do { \
if (!isatty (_f1)) \
{ \
setmode (_f1, O_BINARY); \
if (!isatty (_f2)) \
setmode (_f2, O_BINARY); \
} \
} while(0)
#else
compile-bench> set -euo pipefail; sed -n '220,800p' /home/peter/build/coreutils-5.0/src/system.h # if HAVE_NDIR_H
# include <ndir.h>
# endif /* HAVE_NDIR_H */
#endif /* HAVE_DIRENT_H */
#if CLOSEDIR_VOID
/* Fake a return value. */
# define CLOSEDIR(d) (closedir (d), 0)
#else
# define CLOSEDIR(d) closedir (d)
#endif
/* Get or fake the disk device blocksize.
Usually defined by sys/param.h (if at all). */
#if !defined DEV_BSIZE && defined BSIZE
# define DEV_BSIZE BSIZE
#endif
#if !defined DEV_BSIZE && defined BBSIZE /* SGI */
# define DEV_BSIZE BBSIZE
#endif
#ifndef DEV_BSIZE
# define DEV_BSIZE 4096
#endif
/* Extract or fake data from a `struct stat'.
ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS. */
#ifndef HAVE_STRUCT_STAT_ST_BLOCKS
# define ST_BLKSIZE(statbuf) DEV_BSIZE
# if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE. */
# define ST_NBLOCKS(statbuf) \
((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
# else /* !_POSIX_SOURCE && BSIZE */
# define ST_NBLOCKS(statbuf) \
(S_ISREG ((statbuf).st_mode) \
|| S_ISDIR ((statbuf).st_mode) \
? st_blocks ((statbuf).st_size) : 0)
# endif /* !_POSIX_SOURCE && BSIZE */
#else /* HAVE_STRUCT_STAT_ST_BLOCKS */
/* Some systems, like Sequents, return st_blksize of 0 on pipes.
Also, when running `rsh hpux11-system cat any-file', cat would
determine that the output stream had an st_blksize of 2147421096.
So here we arbitrarily limit the `optimal' block size to 4MB.
If anyone knows of a system for which the legitimate value for
st_blksize can exceed 4MB, please report it as a bug in this code. */
# define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
&& (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \
? (statbuf).st_blksize : DEV_BSIZE)
# if defined hpux || defined __hpux__ || defined __hpux
/* HP-UX counts st_blocks in 1024-byte units.
This loses when mixing HP-UX and BSD filesystems with NFS. */
# define ST_NBLOCKSIZE 1024
# else /* !hpux */
# if defined _AIX && defined _I386
/* AIX PS/2 counts st_blocks in 4K units. */
# define ST_NBLOCKSIZE (4 * 1024)
# else /* not AIX PS/2 */
# if defined _CRAY
# define ST_NBLOCKS(statbuf) \
(S_ISREG ((statbuf).st_mode) \
|| S_ISDIR ((statbuf).st_mode) \
? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0)
# endif /* _CRAY */
# endif /* not AIX PS/2 */
# endif /* !hpux */
#endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
#ifndef ST_NBLOCKS
# define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
#endif
#ifndef ST_NBLOCKSIZE
# define ST_NBLOCKSIZE 512
#endif
#include "sys2.h"
↓ 78 lines
# if HAVE_NDIR_H # include <ndir.h> # endif /* HAVE_NDIR_H */ #endif /* HAVE_DIRENT_H */ #if CLOSEDIR_VOID /* Fake a return value. */ # define CLOSEDIR(d) (closedir (d), 0) #else # define CLOSEDIR(d) closedir (d) #endif /* Get or fake the disk device blocksize. Usually defined by sys/param.h (if at all). */ #if !defined DEV_BSIZE && defined BSIZE # define DEV_BSIZE BSIZE #endif #if !defined DEV_BSIZE && defined BBSIZE /* SGI */ # define DEV_BSIZE BBSIZE #endif #ifndef DEV_BSIZE # define DEV_BSIZE 4096 #endif /* Extract or fake data from a `struct stat'. ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes. ST_NBLOCKS: Number of blocks in the file, including indirect blocks. ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS. */ #ifndef HAVE_STRUCT_STAT_ST_BLOCKS # define ST_BLKSIZE(statbuf) DEV_BSIZE # if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE. */ # define ST_NBLOCKS(statbuf) \ ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0)) # else /* !_POSIX_SOURCE && BSIZE */ # define ST_NBLOCKS(statbuf) \ (S_ISREG ((statbuf).st_mode) \ || S_ISDIR ((statbuf).st_mode) \ ? st_blocks ((statbuf).st_size) : 0) # endif /* !_POSIX_SOURCE && BSIZE */ #else /* HAVE_STRUCT_STAT_ST_BLOCKS */ /* Some systems, like Sequents, return st_blksize of 0 on pipes. Also, when running `rsh hpux11-system cat any-file', cat would determine that the output stream had an st_blksize of 2147421096. So here we arbitrarily limit the `optimal' block size to 4MB. If anyone knows of a system for which the legitimate value for st_blksize can exceed 4MB, please report it as a bug in this code. */ # define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \ && (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \ ? (statbuf).st_blksize : DEV_BSIZE) # if defined hpux || defined __hpux__ || defined __hpux /* HP-UX counts st_blocks in 1024-byte units. This loses when mixing HP-UX and BSD filesystems with NFS. */ # define ST_NBLOCKSIZE 1024 # else /* !hpux */ # if defined _AIX && defined _I386 /* AIX PS/2 counts st_blocks in 4K units. */ # define ST_NBLOCKSIZE (4 * 1024) # else /* not AIX PS/2 */ # if defined _CRAY # define ST_NBLOCKS(statbuf) \ (S_ISREG ((statbuf).st_mode) \ || S_ISDIR ((statbuf).st_mode) \ ? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0) # endif /* _CRAY */ # endif /* not AIX PS/2 */ # endif /* !hpux */ #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */ #ifndef ST_NBLOCKS # define ST_NBLOCKS(statbuf) ((statbuf).st_blocks) #endif #ifndef ST_NBLOCKSIZE # define ST_NBLOCKSIZE 512 #endif #include "sys2.h"
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make clean Making clean in tests
make[1]: Entering directory '/home/peter/build/coreutils-5.0/tests'
Making clean in wc
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
test -z "a0.O a0.E a1.O a1.E a2.O a2.E a3.O a3.E a4.O a4.E a5.O a5.E a6.O a6.E a7.O a7.E a8.O a8.E a9.O a9.E b0.O b0.E b1.O b1.E c0.O c0.E c1.O c1.E c2.O c2.E" || rm -f a0.O a0.E a1.O a1.E a2.O a2.E a3.O a3.E a4.O a4.E a5.O a5.E a6.O a6.E a7.O a7.E a8.O a8.E a9.O a9.E b0.O b0.E b1.O b1.E c0.O c0.E c1.O c1.E c2.O c2.E
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
Making clean in uniq
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
test -z "1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E 10.O 10.E 11.O 11.E 12.O 12.E 13.O 13.E 20.O 20.E 21.O 21.E 22.O 22.E 23.O 23.E obs30.O obs30.E 31.O 31.E 32.O 32.E 33.O 33.E 34.O 34.E 35.O 35.E obs40.O obs40.E obs41.O obs41.E 42.O 42.E 43.O 43.E obs44.O obs44.E obs45.O obs45.E 50.O 50.E 51.O 51.E 52.O 52.E 53.O 53.E 54.O 54.E 55.O 55.E 56.O 56.E 57.O 57.E 60.O 60.E 61.O 61.E 62.O 62.E 63.O 63.E 64.O 64.E 65.O 65.E 90.O 90.E 91.O 91.E 92.O 92.E 93.O 93.E 94.O 94.E 101.O 101.E 102.O 102.E 110.O 110.E 111.O 111.E 112.O 112.E 113.O 113.E 114.O 114.E 115.O 115.E 116.O 116.E 117.O 117.E 118.O 118.E 119.O 119.E" || rm -f 1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E 10.O 10.E 11.O 11.E 12.O 12.E 13.O 13.E 20.O 20.E 21.O 21.E 22.O 22.E 23.O 23.E obs30.O obs30.E 31.O 31.E 32.O 32.E 33.O 33.E 34.O 34.E 35.O 35.E obs40.O obs40.E obs41.O obs41.E 42.O 42.E 43.O 43.E obs44.O obs44.E obs45.O obs45.E 50.O 50.E 51.O 51.E 52.O 52.E 53.O 53.E 54.O 54.E 55.O 55.E 56.O 56.E 57.O 57.E 60.O 60.E 61.O 61.E 62.O 62.E 63.O 63.E 64.O 64.E 65.O 65.E 90.O 90.E 91.O 91.E 92.O 92.E 93.O 93.E 94.O 94.E 101.O 101.E 102.O 102.E 110.O 110.E 111.O 111.E 112.O 112.E 113.O 113.E 114.O 114.E 115.O 115.E 116.O 116.E 117.O 117.E 118.O 118.E 119.O 119.E
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
Making clean in unexpand
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[2]: Nothing to be done for 'clean'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
Making clean in tsort
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[2]: Nothing to be done for 'clean'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
Making clean in tr
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
test -z "1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E a.O a.E b.O b.E c.O c.E d.O d.E e.O e.E f.O f.E g.O g.E h.O h.E i.O i.E j.O j.E k.O k.E l.O l.E m.O m.E n.O n.E o.O o.E p.O p.E q.O q.E r.O r.E s.O s.E t.O t.E u.O u.E v.O v.E w.O w.E x.O x.E y.O y.E z.O z.E range-a-a.O range-a-a.E null.O null.E upcase.O upcase.E dncase.O dncase.E rep-cclass.O rep-cclass.E rep-1.O rep-1.E rep-2.O rep-2.E rep-3.O rep-3.
[command output truncated]
ng clean in m4
make[1]: Entering directory '/home/peter/build/coreutils-5.0/m4'
make[1]: Nothing to be done for 'clean'.
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/m4'
Making clean in man
make[1]: Entering directory '/home/peter/build/coreutils-5.0/man'
make[1]: Nothing to be done for 'clean'.
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/man'
Making clean in doc
make[1]: Entering directory '/home/peter/build/coreutils-5.0/doc'
rm -f coreutils.aux coreutils.cp coreutils.cps coreutils.fl coreutils.fn \
coreutils.ky coreutils.log coreutils.op coreutils.pg \
coreutils.tmp coreutils.toc coreutils.tp coreutils.tps \
coreutils.vr coreutils.dvi coreutils.pdf coreutils.ps
rm -f vti.tmp
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/doc'
Making clean in src
make[1]: Entering directory '/home/peter/build/coreutils-5.0/src'
test -z "chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df" || rm -f chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df > /dev/null 2>&1 || /bin/rm -f chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df
test -z "groups nohup su" || rm -f groups nohup su
rm -f *.o core *.core
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/src'
Making clean in lib
make[1]: Entering directory '/home/peter/build/coreutils-5.0/lib'
test -z "charset.alias ref-add.sed ref-del.sed" || rm -f charset.alias ref-add.sed ref-del.sed
test -z "libfetish.a" || rm -f libfetish.a
rm -f *.o core *.core
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making clean in .
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
make[1]: Nothing to be done for 'clean-am'.
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
↓ 55 lines
Making clean in tests make[1]: Entering directory '/home/peter/build/coreutils-5.0/tests' Making clean in wc make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc' test -z "a0.O a0.E a1.O a1.E a2.O a2.E a3.O a3.E a4.O a4.E a5.O a5.E a6.O a6.E a7.O a7.E a8.O a8.E a9.O a9.E b0.O b0.E b1.O b1.E c0.O c0.E c1.O c1.E c2.O c2.E" || rm -f a0.O a0.E a1.O a1.E a2.O a2.E a3.O a3.E a4.O a4.E a5.O a5.E a6.O a6.E a7.O a7.E a8.O a8.E a9.O a9.E b0.O b0.E b1.O b1.E c0.O c0.E c1.O c1.E c2.O c2.E make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc' Making clean in uniq make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq' test -z "1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E 10.O 10.E 11.O 11.E 12.O 12.E 13.O 13.E 20.O 20.E 21.O 21.E 22.O 22.E 23.O 23.E obs30.O obs30.E 31.O 31.E 32.O 32.E 33.O 33.E 34.O 34.E 35.O 35.E obs40.O obs40.E obs41.O obs41.E 42.O 42.E 43.O 43.E obs44.O obs44.E obs45.O obs45.E 50.O 50.E 51.O 51.E 52.O 52.E 53.O 53.E 54.O 54.E 55.O 55.E 56.O 56.E 57.O 57.E 60.O 60.E 61.O 61.E 62.O 62.E 63.O 63.E 64.O 64.E 65.O 65.E 90.O 90.E 91.O 91.E 92.O 92.E 93.O 93.E 94.O 94.E 101.O 101.E 102.O 102.E 110.O 110.E 111.O 111.E 112.O 112.E 113.O 113.E 114.O 114.E 115.O 115.E 116.O 116.E 117.O 117.E 118.O 118.E 119.O 119.E" || rm -f 1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E 10.O 10.E 11.O 11.E 12.O 12.E 13.O 13.E 20.O 20.E 21.O 21.E 22.O 22.E 23.O 23.E obs30.O obs30.E 31.O 31.E 32.O 32.E 33.O 33.E 34.O 34.E 35.O 35.E obs40.O obs40.E obs41.O obs41.E 42.O 42.E 43.O 43.E obs44.O obs44.E obs45.O obs45.E 50.O 50.E 51.O 51.E 52.O 52.E 53.O 53.E 54.O 54.E 55.O 55.E 56.O 56.E 57.O 57.E 60.O 60.E 61.O 61.E 62.O 62.E 63.O 63.E 64.O 64.E 65.O 65.E 90.O 90.E 91.O 91.E 92.O 92.E 93.O 93.E 94.O 94.E 101.O 101.E 102.O 102.E 110.O 110.E 111.O 111.E 112.O 112.E 113.O 113.E 114.O 114.E 115.O 115.E 116.O 116.E 117.O 117.E 118.O 118.E 119.O 119.E make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq' Making clean in unexpand make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand' make[2]: Nothing to be done for 'clean'. make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand' Making clean in tsort make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort' make[2]: Nothing to be done for 'clean'. make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort' Making clean in tr make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr' test -z "1.O 1.E 2.O 2.E 3.O 3.E 4.O 4.E 5.O 5.E 6.O 6.E 7.O 7.E 8.O 8.E 9.O 9.E a.O a.E b.O b.E c.O c.E d.O d.E e.O e.E f.O f.E g.O g.E h.O h.E i.O i.E j.O j.E k.O k.E l.O l.E m.O m.E n.O n.E o.O o.E p.O p.E q.O q.E r.O r.E s.O s.E t.O t.E u.O u.E v.O v.E w.O w.E x.O x.E y.O y.E z.O z.E range-a-a.O range-a-a.E null.O null.E upcase.O upcase.E dncase.O dncase.E rep-cclass.O rep-cclass.E rep-1.O rep-1.E rep-2.O rep-2.E rep-3.O rep-3. [command output truncated] ng clean in m4 make[1]: Entering directory '/home/peter/build/coreutils-5.0/m4' make[1]: Nothing to be done for 'clean'. make[1]: Leaving directory '/home/peter/build/coreutils-5.0/m4' Making clean in man make[1]: Entering directory '/home/peter/build/coreutils-5.0/man' make[1]: Nothing to be done for 'clean'. make[1]: Leaving directory '/home/peter/build/coreutils-5.0/man' Making clean in doc make[1]: Entering directory '/home/peter/build/coreutils-5.0/doc' rm -f coreutils.aux coreutils.cp coreutils.cps coreutils.fl coreutils.fn \ coreutils.ky coreutils.log coreutils.op coreutils.pg \ coreutils.tmp coreutils.toc coreutils.tp coreutils.tps \ coreutils.vr coreutils.dvi coreutils.pdf coreutils.ps rm -f vti.tmp make[1]: Leaving directory '/home/peter/build/coreutils-5.0/doc' Making clean in src make[1]: Entering directory '/home/peter/build/coreutils-5.0/src' test -z "chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df" || rm -f chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df > /dev/null 2>&1 || /bin/rm -f chgrp chown chmod cp dd dircolors du ginstall link ln dir vdir ls mkdir mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink cat cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc basename date dirname echo env expr factor false hostname id kill logname pathchk printenv printf pwd seq sleep tee test true tty whoami yes uname chroot hostid nice pinky users who uptime stty df test -z "groups nohup su" || rm -f groups nohup su rm -f *.o core *.core make[1]: Leaving directory '/home/peter/build/coreutils-5.0/src' Making clean in lib make[1]: Entering directory '/home/peter/build/coreutils-5.0/lib' test -z "charset.alias ref-add.sed ref-del.sed" || rm -f charset.alias ref-add.sed ref-del.sed test -z "libfetish.a" || rm -f libfetish.a rm -f *.o core *.core make[1]: Leaving directory '/home/peter/build/coreutils-5.0/lib' Making clean in . make[1]: Entering directory '/home/peter/build/coreutils-5.0' make[1]: Nothing to be done for 'clean-am'. make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
Show reasoning
Adjusting build flags
I'm thinking about rebuilding with CPPFLAGS set to empty. For CFLAGS, I'm considering minimal settings, and I plan to include -O2 and -fcommon while avoiding -D_GNU_SOURCE. This should streamline the process, making it more efficient. It's all about fine-tuning those flags to ensure the best performance. If I get this right, it’ll lead to better compilation results! Let's see how this plays out.
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make -j"$(nproc)" CFLAGS='-O2 -fcommon' CPPFLAGS='' make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT acl.o -MD -MP -MF ".deps/acl.Tpo" \
-c -o acl.o `test -f 'acl.c' || echo './'`acl.c; \
then mv ".deps/acl.Tpo" ".deps/acl.Po"; \
else rm -f ".deps/acl.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getdate.o -MD -MP -MF ".deps/getdate.Tpo" \
-c -o getdate.o `test -f 'getdate.c' || echo './'`getdate.c; \
then mv ".deps/getdate.Tpo" ".deps/getdate.Po"; \
else rm -f ".deps/getdate.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT posixtm.o -MD -MP -MF ".deps/posixtm.Tpo" \
-c -o posixtm.o `test -f 'posixtm.c' || echo './'`posixtm.c; \
then mv ".deps/posixtm.Tpo" ".deps/posixtm.Po"; \
else rm -f ".deps/posixtm.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT posixver.o -MD -MP -MF ".deps/posixver.Tpo" \
-c -o posixver.o `test -f 'posixver.c' || echo './'`posixver.c; \
then mv ".deps/posixver.Tpo" ".deps/posixver.Po"; \
else rm -f ".deps/posixver.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT strftime.o -MD -MP -MF ".deps/strftime.Tpo" \
-c -o strftime.o `test -f 'strftime.c' || echo './'`strftime.c; \
then mv ".deps/strftime.Tpo" ".deps/strftime.Po"; \
else rm -f ".deps/strftime.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getopt.o -MD -MP -MF ".deps/getopt.Tpo" \
-c -o getopt.o `test -f 'getopt.c' || echo './'`getopt.c; \
then mv ".deps/getopt.Tpo" ".deps/getopt.Po"; \
else rm -f ".deps/getopt.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getopt1.o -MD -MP -MF ".deps/getopt1.Tpo" \
-c -o getopt1.o `test -f 'getopt1.c' || echo './'`getopt1.c; \
then mv ".deps/getopt1.Tpo" ".deps/getopt1.Po"; \
else rm -f ".deps/getopt1.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT hash.o -MD -MP -MF ".deps/hash.Tpo" \
-c -o hash.o `test -f 'hash.c' || echo './'`hash.c; \
then mv ".deps/hash.Tpo" ".deps/hash.Po"; \
else rm -f ".deps/hash.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT hash-pjw.o -MD -MP -MF ".deps/hash-pjw.Tpo" \
-c -o hash-pjw.o `test -f 'hash-pjw.c' || echo './'`hash-pjw.c; \
then mv ".deps/hash-pjw.Tpo" ".deps/hash-pjw.Po"; \
else rm -f ".deps/hash-pjw.Tpo"; exit 1; \
fi
[command output truncated]
from /usr/include/fcntl.h:35,
from system.h:153,
from tee.c:26:
/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:429:18: note: previous declaration of 'tee' with type '__ssize_t(int, int, size_t, unsigned int)' {aka 'long int(int, int, long unsigned int, unsigned int)'}
429 | extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
| ^~~
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT whoami.o -MD -MP -MF ".deps/whoami.Tpo" \
-c -o whoami.o `test -f 'whoami.c' || echo './'`whoami.c; \
then mv ".deps/whoami.Tpo" ".deps/whoami.Po"; \
else rm -f ".deps/whoami.Tpo"; exit 1; \
fi
make[3]: *** [Makefile:1263: tee.o] Error 1
make[3]: *** Waiting for unfinished jobs....
test.c:142:1: error: static declaration of 'eaccess' follows non-static declaration
142 | eaccess (char const *file, int mode)
| ^~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
from /usr/include/signal.h:328,
from /usr/include/x86_64-linux-gnu/sys/param.h:28,
from system.h:33,
from test.c:41:
/usr/include/unistd.h:296:12: note: previous declaration of 'eaccess' with type 'int(const char *, int)'
296 | extern int eaccess (const char *__name, int __type)
| ^~~~~~~
test.c: In function 'eaccess':
test.c:160:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
160 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:162:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
162 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:168:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
168 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:170:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
170 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: *** [Makefile:1263: test.o] Error 1
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
↓ 97 lines
make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT acl.o -MD -MP -MF ".deps/acl.Tpo" \
-c -o acl.o `test -f 'acl.c' || echo './'`acl.c; \
then mv ".deps/acl.Tpo" ".deps/acl.Po"; \
else rm -f ".deps/acl.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getdate.o -MD -MP -MF ".deps/getdate.Tpo" \
-c -o getdate.o `test -f 'getdate.c' || echo './'`getdate.c; \
then mv ".deps/getdate.Tpo" ".deps/getdate.Po"; \
else rm -f ".deps/getdate.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT posixtm.o -MD -MP -MF ".deps/posixtm.Tpo" \
-c -o posixtm.o `test -f 'posixtm.c' || echo './'`posixtm.c; \
then mv ".deps/posixtm.Tpo" ".deps/posixtm.Po"; \
else rm -f ".deps/posixtm.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT posixver.o -MD -MP -MF ".deps/posixver.Tpo" \
-c -o posixver.o `test -f 'posixver.c' || echo './'`posixver.c; \
then mv ".deps/posixver.Tpo" ".deps/posixver.Po"; \
else rm -f ".deps/posixver.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT strftime.o -MD -MP -MF ".deps/strftime.Tpo" \
-c -o strftime.o `test -f 'strftime.c' || echo './'`strftime.c; \
then mv ".deps/strftime.Tpo" ".deps/strftime.Po"; \
else rm -f ".deps/strftime.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getopt.o -MD -MP -MF ".deps/getopt.Tpo" \
-c -o getopt.o `test -f 'getopt.c' || echo './'`getopt.c; \
then mv ".deps/getopt.Tpo" ".deps/getopt.Po"; \
else rm -f ".deps/getopt.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT getopt1.o -MD -MP -MF ".deps/getopt1.Tpo" \
-c -o getopt1.o `test -f 'getopt1.c' || echo './'`getopt1.c; \
then mv ".deps/getopt1.Tpo" ".deps/getopt1.Po"; \
else rm -f ".deps/getopt1.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT hash.o -MD -MP -MF ".deps/hash.Tpo" \
-c -o hash.o `test -f 'hash.c' || echo './'`hash.c; \
then mv ".deps/hash.Tpo" ".deps/hash.Po"; \
else rm -f ".deps/hash.Tpo"; exit 1; \
fi
if gcc -DLIBDIR=\"/home/peter/result/lib\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -O2 -fcommon -MT hash-pjw.o -MD -MP -MF ".deps/hash-pjw.Tpo" \
-c -o hash-pjw.o `test -f 'hash-pjw.c' || echo './'`hash-pjw.c; \
then mv ".deps/hash-pjw.Tpo" ".deps/hash-pjw.Po"; \
else rm -f ".deps/hash-pjw.Tpo"; exit 1; \
fi
[command output truncated]
from /usr/include/fcntl.h:35,
from system.h:153,
from tee.c:26:
/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h:429:18: note: previous declaration of 'tee' with type '__ssize_t(int, int, size_t, unsigned int)' {aka 'long int(int, int, long unsigned int, unsigned int)'}
429 | extern __ssize_t tee (int __fdin, int __fdout, size_t __len,
| ^~~
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT whoami.o -MD -MP -MF ".deps/whoami.Tpo" \
-c -o whoami.o `test -f 'whoami.c' || echo './'`whoami.c; \
then mv ".deps/whoami.Tpo" ".deps/whoami.Po"; \
else rm -f ".deps/whoami.Tpo"; exit 1; \
fi
make[3]: *** [Makefile:1263: tee.o] Error 1
make[3]: *** Waiting for unfinished jobs....
test.c:142:1: error: static declaration of 'eaccess' follows non-static declaration
142 | eaccess (char const *file, int mode)
| ^~~~~~~
In file included from /usr/include/x86_64-linux-gnu/bits/sigstksz.h:24,
from /usr/include/signal.h:328,
from /usr/include/x86_64-linux-gnu/sys/param.h:28,
from system.h:33,
from test.c:41:
/usr/include/unistd.h:296:12: note: previous declaration of 'eaccess' with type 'int(const char *, int)'
296 | extern int eaccess (const char *__name, int __type)
| ^~~~~~~
test.c: In function 'eaccess':
test.c:160:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
160 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:162:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
162 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:168:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
168 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:170:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
170 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: *** [Makefile:1263: test.o] Error 1
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
compile-bench> set -euo pipefail; sed -n '1,220p' /home/peter/build/coreutils-5.0/src/tee.c /* tee - read from standard input and write to standard output and files.
Copyright (C) 85,1990-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Mike Parker, Richard M. Stallman, and David MacKenzie */
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <getopt.h>
#include "system.h"
#include "closeout.h"
#include "error.h"
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "tee"
#define AUTHORS N_ ("Mike Parker, Richard M. Stallman, and David MacKenzie")
static int tee (int nfiles, const char **files);
/* If nonzero, append to output files rather than truncating them. */
static int append;
/* If nonzero, ignore interrupts. */
static int ignore_interrupts;
/* The name that this program was run with. */
char *program_name;
static struct option const long_options[] =
{
{"append", no_argument, NULL, 'a'},
{"ignore-interrupts", no_argument, NULL, 'i'},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{NULL, 0, NULL, 0}
};
void
usage (int status)
{
if (status != 0)
fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name);
else
{
printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
fputs (_("\
Copy standard input to each FILE, and also to standard output.\n\
\n\
-a, --append append to the given FILEs, do not overwrite\n\
-i, --ignore-interrupts ignore interrupt signals\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
[command output truncated]
exit (errs);
}
/* Copy the standard input into each of the NFILES files in FILES
and into the standard output.
Return 0 if successful, 1 if any errors occur. */
static int
tee (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
int bytes_read, i;
int ret = 0;
const char *mode_string = (append ? "a" : "w");
descriptors = (FILE **) xmalloc ((nfiles + 1) * sizeof (descriptors[0]));
/* Move all the names `up' one in the argv array to make room for
the entry for standard output. This writes into argv[argc]. */
for (i = nfiles; i >= 1; i--)
files[i] = files[i - 1];
SET_BINARY2 (0, 1);
/* In the array of NFILES + 1 descriptors, make
the first one correspond to standard output. */
descriptors[0] = stdout;
files[0] = _("standard output");
SETVBUF (stdout, NULL, _IONBF, 0);
for (i = 1; i <= nfiles; i++)
{
descriptors[i] = fopen (files[i], mode_string);
if (descriptors[i] == NULL)
{
error (0, errno, "%s", files[i]);
ret = 1;
}
else
{
SETVBUF (descriptors[i], NULL, _IONBF, 0);
SET_BINARY (fileno (descriptors[i]));
}
}
while (1)
{
bytes_read = read (0, buffer, sizeof buffer);
#ifdef EINTR
if (bytes_read < 0 && errno == EINTR)
continue;
#endif
if (bytes_read <= 0)
break;
/* Write to all NFILES + 1 descriptors.
Standard output is the first one. */
for (i = 0; i <= nfiles; i++)
{
if (descriptors[i] != NULL)
fwrite (buffer, bytes_read, 1, descriptors[i]);
}
}
if (bytes_read == -1)
{
error (0, errno, _("read error"));
↓ 141 lines
/* tee - read from standard input and write to standard output and files.
Copyright (C) 85,1990-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Mike Parker, Richard M. Stallman, and David MacKenzie */
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <getopt.h>
#include "system.h"
#include "closeout.h"
#include "error.h"
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "tee"
#define AUTHORS N_ ("Mike Parker, Richard M. Stallman, and David MacKenzie")
static int tee (int nfiles, const char **files);
/* If nonzero, append to output files rather than truncating them. */
static int append;
/* If nonzero, ignore interrupts. */
static int ignore_interrupts;
/* The name that this program was run with. */
char *program_name;
static struct option const long_options[] =
{
{"append", no_argument, NULL, 'a'},
{"ignore-interrupts", no_argument, NULL, 'i'},
{GETOPT_HELP_OPTION_DECL},
{GETOPT_VERSION_OPTION_DECL},
{NULL, 0, NULL, 0}
};
void
usage (int status)
{
if (status != 0)
fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name);
else
{
printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
fputs (_("\
Copy standard input to each FILE, and also to standard output.\n\
\n\
-a, --append append to the given FILEs, do not overwrite\n\
-i, --ignore-interrupts ignore interrupt signals\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
[command output truncated]
exit (errs);
}
/* Copy the standard input into each of the NFILES files in FILES
and into the standard output.
Return 0 if successful, 1 if any errors occur. */
static int
tee (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
int bytes_read, i;
int ret = 0;
const char *mode_string = (append ? "a" : "w");
descriptors = (FILE **) xmalloc ((nfiles + 1) * sizeof (descriptors[0]));
/* Move all the names `up' one in the argv array to make room for
the entry for standard output. This writes into argv[argc]. */
for (i = nfiles; i >= 1; i--)
files[i] = files[i - 1];
SET_BINARY2 (0, 1);
/* In the array of NFILES + 1 descriptors, make
the first one correspond to standard output. */
descriptors[0] = stdout;
files[0] = _("standard output");
SETVBUF (stdout, NULL, _IONBF, 0);
for (i = 1; i <= nfiles; i++)
{
descriptors[i] = fopen (files[i], mode_string);
if (descriptors[i] == NULL)
{
error (0, errno, "%s", files[i]);
ret = 1;
}
else
{
SETVBUF (descriptors[i], NULL, _IONBF, 0);
SET_BINARY (fileno (descriptors[i]));
}
}
while (1)
{
bytes_read = read (0, buffer, sizeof buffer);
#ifdef EINTR
if (bytes_read < 0 && errno == EINTR)
continue;
#endif
if (bytes_read <= 0)
break;
/* Write to all NFILES + 1 descriptors.
Standard output is the first one. */
for (i = 0; i <= nfiles; i++)
{
if (descriptors[i] != NULL)
fwrite (buffer, bytes_read, 1, descriptors[i]);
}
}
if (bytes_read == -1)
{
error (0, errno, _("read error"));
compile-bench> set -euo pipefail; sed -n '220,600p' /home/peter/build/coreutils-5.0/src/tee.c error (0, errno, _("read error"));
ret = 1;
}
/* Close the files, but not standard output. */
for (i = 1; i <= nfiles; i++)
if (descriptors[i] != NULL
&& (ferror (descriptors[i]) || fclose (descriptors[i]) == EOF))
{
error (0, errno, "%s", files[i]);
ret = 1;
}
free (descriptors);
return ret;
}
↓ 18 lines
error (0, errno, _("read error"));
ret = 1;
}
/* Close the files, but not standard output. */
for (i = 1; i <= nfiles; i++)
if (descriptors[i] != NULL
&& (ferror (descriptors[i]) || fclose (descriptors[i]) == EOF))
{
error (0, errno, "%s", files[i]);
ret = 1;
}
free (descriptors);
return ret;
}
Show reasoning
Resolving naming conflicts
I see that the internal function 'tee' conflicts with glibc's 'tee'. I need to rename both the function and its invocation. Now, where is that invocation? It’s probably in the main function of the same file where tee() is called. I should scroll earlier in tee.c near the main function and search for "main (" or any call to tee. That should help me find where to make the necessary adjustments.
grep: Unmatched ( or \(
compile-bench> set -euo pipefail; grep -n "main (" /home/peter/build/coreutils-5.0/src/tee.c || true 78:main (int argc, char **argv)
85: bindtextdomain (PACKAGE, LOCALEDIR);
86: textdomain (PACKAGE);
↓ 4 lines
78:main (int argc, char **argv) 85: bindtextdomain (PACKAGE, LOCALEDIR); 86: textdomain (PACKAGE);
compile-bench> set -euo pipefail; sed -n '60,120p' /home/peter/build/coreutils-5.0/src/tee.c program_name);
else
{
printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
fputs (_("\
Copy standard input to each FILE, and also to standard output.\n\
\n\
-a, --append append to the given FILEs, do not overwrite\n\
-i, --ignore-interrupts ignore interrupt signals\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
exit (status);
}
int
main (int argc, char **argv)
{
int errs;
int optc;
program_name = argv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
append = 0;
ignore_interrupts = 0;
while ((optc = getopt_long (argc, argv, "ai", long_options, NULL)) != -1)
{
switch (optc)
{
case 0:
break;
case 'a':
append = 1;
break;
case 'i':
ignore_interrupts = 1;
break;
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
default:
usage (EXIT_FAILURE);
}
}
if (ignore_interrupts)
{
#ifdef _POSIX_SOURCE
struct sigaction sigact;
↓ 62 lines
program_name);
else
{
printf (_("Usage: %s [OPTION]... [FILE]...\n"), program_name);
fputs (_("\
Copy standard input to each FILE, and also to standard output.\n\
\n\
-a, --append append to the given FILEs, do not overwrite\n\
-i, --ignore-interrupts ignore interrupt signals\n\
"), stdout);
fputs (HELP_OPTION_DESCRIPTION, stdout);
fputs (VERSION_OPTION_DESCRIPTION, stdout);
printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
}
exit (status);
}
int
main (int argc, char **argv)
{
int errs;
int optc;
program_name = argv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
append = 0;
ignore_interrupts = 0;
while ((optc = getopt_long (argc, argv, "ai", long_options, NULL)) != -1)
{
switch (optc)
{
case 0:
break;
case 'a':
append = 1;
break;
case 'i':
ignore_interrupts = 1;
break;
case_GETOPT_HELP_CHAR;
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
default:
usage (EXIT_FAILURE);
}
}
if (ignore_interrupts)
{
#ifdef _POSIX_SOURCE
struct sigaction sigact;
compile-bench> set -euo pipefail; sed -n '120,260p' /home/peter/build/coreutils-5.0/src/tee.c struct sigaction sigact;
sigact.sa_handler = SIG_IGN;
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (SIGINT, &sigact, NULL);
#else /* !_POSIX_SOURCE */
signal (SIGINT, SIG_IGN);
#endif /* _POSIX_SOURCE */
}
/* Don't let us be killed if one of the output files is a pipe that
doesn't consume all its input. */
#ifdef _POSIX_SOURCE
{
struct sigaction sigact;
sigact.sa_handler = SIG_IGN;
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (SIGPIPE, &sigact, NULL);
}
#else
signal (SIGPIPE, SIG_IGN);
#endif
/* Do *not* warn if tee is given no file arguments.
POSIX requires that it work when given no arguments. */
errs = tee (argc - optind, (const char **) &argv[optind]);
if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, _("standard input"));
exit (errs);
}
/* Copy the standard input into each of the NFILES files in FILES
and into the standard output.
Return 0 if successful, 1 if any errors occur. */
static int
tee (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
int bytes_read, i;
int ret = 0;
const char *mode_string = (append ? "a" : "w");
descriptors = (FILE **) xmalloc ((nfiles + 1) * sizeof (descriptors[0]));
/* Move all the names `up' one in the argv array to make room for
the entry for standard output. This writes into argv[argc]. */
for (i = nfiles; i >= 1; i--)
files[i] = files[i - 1];
SET_BINARY2 (0, 1);
/* In the array of NFILES + 1 descriptors, make
the first one correspond to standard output. */
descriptors[0] = stdout;
files[0] = _("standard output");
SETVBUF (stdout, NULL, _IONBF, 0);
for (i = 1; i <= nfiles; i++)
{
descriptors[i] = fopen (files[i], mode_string);
if (descriptors[i] == NULL)
{
error (0, errno, "%s", files[i]);
ret = 1;
}
else
{
SETVBUF (descriptors[i], NULL, _IONBF, 0);
SET_BINARY (fileno (descriptors[i]));
}
}
while (1)
{
bytes_read = read (0, buffer, sizeof buffer);
#ifdef EINTR
if (bytes_read < 0 && errno == EINTR)
continue;
#endif
if (bytes_read <= 0)
break;
/* Write to all NFILES + 1 descriptors.
Standard output is the first one. */
for (i = 0; i <= nfiles; i++)
{
if (descriptors[i] != NULL)
fwrite (buffer, bytes_read, 1, descriptors[i]);
}
}
if (bytes_read == -1)
{
error (0, errno, _("read error"));
ret = 1;
}
/* Close the files, but not standard output. */
for (i = 1; i <= nfiles; i++)
if (descriptors[i] != NULL
&& (ferror (descriptors[i]) || fclose (descriptors[i]) == EOF))
{
error (0, errno, "%s", files[i]);
ret = 1;
}
free (descriptors);
return ret;
}
↓ 118 lines
struct sigaction sigact;
sigact.sa_handler = SIG_IGN;
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (SIGINT, &sigact, NULL);
#else /* !_POSIX_SOURCE */
signal (SIGINT, SIG_IGN);
#endif /* _POSIX_SOURCE */
}
/* Don't let us be killed if one of the output files is a pipe that
doesn't consume all its input. */
#ifdef _POSIX_SOURCE
{
struct sigaction sigact;
sigact.sa_handler = SIG_IGN;
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (SIGPIPE, &sigact, NULL);
}
#else
signal (SIGPIPE, SIG_IGN);
#endif
/* Do *not* warn if tee is given no file arguments.
POSIX requires that it work when given no arguments. */
errs = tee (argc - optind, (const char **) &argv[optind]);
if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, _("standard input"));
exit (errs);
}
/* Copy the standard input into each of the NFILES files in FILES
and into the standard output.
Return 0 if successful, 1 if any errors occur. */
static int
tee (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
int bytes_read, i;
int ret = 0;
const char *mode_string = (append ? "a" : "w");
descriptors = (FILE **) xmalloc ((nfiles + 1) * sizeof (descriptors[0]));
/* Move all the names `up' one in the argv array to make room for
the entry for standard output. This writes into argv[argc]. */
for (i = nfiles; i >= 1; i--)
files[i] = files[i - 1];
SET_BINARY2 (0, 1);
/* In the array of NFILES + 1 descriptors, make
the first one correspond to standard output. */
descriptors[0] = stdout;
files[0] = _("standard output");
SETVBUF (stdout, NULL, _IONBF, 0);
for (i = 1; i <= nfiles; i++)
{
descriptors[i] = fopen (files[i], mode_string);
if (descriptors[i] == NULL)
{
error (0, errno, "%s", files[i]);
ret = 1;
}
else
{
SETVBUF (descriptors[i], NULL, _IONBF, 0);
SET_BINARY (fileno (descriptors[i]));
}
}
while (1)
{
bytes_read = read (0, buffer, sizeof buffer);
#ifdef EINTR
if (bytes_read < 0 && errno == EINTR)
continue;
#endif
if (bytes_read <= 0)
break;
/* Write to all NFILES + 1 descriptors.
Standard output is the first one. */
for (i = 0; i <= nfiles; i++)
{
if (descriptors[i] != NULL)
fwrite (buffer, bytes_read, 1, descriptors[i]);
}
}
if (bytes_read == -1)
{
error (0, errno, _("read error"));
ret = 1;
}
/* Close the files, but not standard output. */
for (i = 1; i <= nfiles; i++)
if (descriptors[i] != NULL
&& (ferror (descriptors[i]) || fclose (descriptors[i]) == EOF))
{
error (0, errno, "%s", files[i]);
ret = 1;
}
free (descriptors);
return ret;
}
compile-bench> set -euo pipefail; sed -n '1,260p' /home/peter/build/coreutils-5.0/src/test.c /* GNU test program (ksb and mjb) */
/* Modified to run with the GNU shell by bfox. */
/* Copyright (C) 1987-2003 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Define TEST_STANDALONE to get the /bin/test version. Otherwise, you get
the shell builtin version. */
/* #define TEST_STANDALONE */
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "test"
#define TEST_STANDALONE 1
#if !defined (TEST_STANDALONE)
# include "shell.h"
# include "posixstat.h"
# include "filecntl.h"
#else /* TEST_STANDALONE */
# include "system.h"
# include "error.h"
# include "euidaccess.h"
# if !defined (S_IXUGO)
# define S_IXUGO 0111
# endif /* S_IXUGO */
# if defined (_POSIX_VERSION)
# include <limits.h>
# else /* !_POSIX_VERSION */
# include <sys/param.h>
# endif /* _POSIX_VERSION */
# define whitespace(c) (((c) == ' ') || ((c) == '\t'))
# define digit(c) ((c) >= '0' && (c) <= '9')
# define digit_value(c) ((c) - '0')
char *program_name;
#endif /* TEST_STANDALONE */
#if !defined (_POSIX_VERSION)
# include <sys/file.h>
#endif /* !_POSIX_VERSION */
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#undef STREQ
#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp (a, b) == 0)
#if !defined (member)
[command output truncated]
advance (int f)
{
++pos;
if (f && pos >= argc)
beyond ();
}
#endif /* advance */
#define unary_advance() \
do \
{ \
advance (1); \
++pos; \
} \
while (0)
/*
* beyond - call when we're beyond the end of the argument list (an
* error condition)
*/
static void
beyond (void)
{
test_syntax_error (_("argument expected\n"), NULL);
}
/* Syntax error for when an integer argument was expected, but
something else was found. */
static void
integer_expected_error (char const *pch)
{
test_syntax_error (_("integer expression expected %s\n"), pch);
}
/* Return nonzero if the characters pointed to by STRING constitute a
valid number. Stuff the converted number into RESULT if RESULT is
not null. */
static int
isint (register char *string, intmax_t *result)
{
int sign;
intmax_t value;
sign = 1;
value = 0;
if (result)
*result = 0;
/* Skip leading whitespace characters. */
while (whitespace (*string))
string++;
if (!*string)
return (0);
/* We allow leading `-' or `+'. */
if (*string == '-' || *string == '+')
{
if (!digit (string[1]))
return (0);
if (*string == '-')
sign = -1;
string++;
}
↓ 140 lines
/* GNU test program (ksb and mjb) */
/* Modified to run with the GNU shell by bfox. */
/* Copyright (C) 1987-2003 Free Software Foundation, Inc.
This file is part of GNU Bash, the Bourne Again SHell.
Bash is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
Bash is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Define TEST_STANDALONE to get the /bin/test version. Otherwise, you get
the shell builtin version. */
/* #define TEST_STANDALONE */
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
/* The official name of this program (e.g., no `g' prefix). */
#define PROGRAM_NAME "test"
#define TEST_STANDALONE 1
#if !defined (TEST_STANDALONE)
# include "shell.h"
# include "posixstat.h"
# include "filecntl.h"
#else /* TEST_STANDALONE */
# include "system.h"
# include "error.h"
# include "euidaccess.h"
# if !defined (S_IXUGO)
# define S_IXUGO 0111
# endif /* S_IXUGO */
# if defined (_POSIX_VERSION)
# include <limits.h>
# else /* !_POSIX_VERSION */
# include <sys/param.h>
# endif /* _POSIX_VERSION */
# define whitespace(c) (((c) == ' ') || ((c) == '\t'))
# define digit(c) ((c) >= '0' && (c) <= '9')
# define digit_value(c) ((c) - '0')
char *program_name;
#endif /* TEST_STANDALONE */
#if !defined (_POSIX_VERSION)
# include <sys/file.h>
#endif /* !_POSIX_VERSION */
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#undef STREQ
#define STREQ(a, b) ((a)[0] == (b)[0] && strcmp (a, b) == 0)
#if !defined (member)
[command output truncated]
advance (int f)
{
++pos;
if (f && pos >= argc)
beyond ();
}
#endif /* advance */
#define unary_advance() \
do \
{ \
advance (1); \
++pos; \
} \
while (0)
/*
* beyond - call when we're beyond the end of the argument list (an
* error condition)
*/
static void
beyond (void)
{
test_syntax_error (_("argument expected\n"), NULL);
}
/* Syntax error for when an integer argument was expected, but
something else was found. */
static void
integer_expected_error (char const *pch)
{
test_syntax_error (_("integer expression expected %s\n"), pch);
}
/* Return nonzero if the characters pointed to by STRING constitute a
valid number. Stuff the converted number into RESULT if RESULT is
not null. */
static int
isint (register char *string, intmax_t *result)
{
int sign;
intmax_t value;
sign = 1;
value = 0;
if (result)
*result = 0;
/* Skip leading whitespace characters. */
while (whitespace (*string))
string++;
if (!*string)
return (0);
/* We allow leading `-' or `+'. */
if (*string == '-' || *string == '+')
{
if (!digit (string[1]))
return (0);
if (*string == '-')
sign = -1;
string++;
}
compile-bench> set -euo pipefail; sed -n '260,640p' /home/peter/build/coreutils-5.0/src/test.c
while (digit (*string))
{
if (result)
value = (value * 10) + digit_value (*string);
string++;
}
/* Skip trailing whitespace, if any. */
while (whitespace (*string))
string++;
/* Error if not at end of string. */
if (*string)
return (0);
if (result)
{
value *= sign;
*result = value;
}
return (1);
}
/* Find the modification time of FILE, and stuff it into *AGE.
Return 0 if successful, -1 if not. */
static int
age_of (char *filename, time_t *age)
{
struct stat finfo;
int r = stat (filename, &finfo);
if (r == 0)
*age = finfo.st_mtime;
return r;
}
/*
* term - parse a term and return 1 or 0 depending on whether the term
* evaluates to true or false, respectively.
*
* term ::=
* '-'('h'|'d'|'f'|'r'|'s'|'w'|'c'|'b'|'p'|'u'|'g'|'k') filename
* '-'('L'|'x') filename
* '-t' [ int ]
* '-'('z'|'n') string
* string
* string ('!='|'=') string
* <int> '-'(eq|ne|le|lt|ge|gt) <int>
* file '-'(nt|ot|ef) file
* '(' <expr> ')'
* int ::=
* '-l' string
* positive and negative integers
*/
static int
term (void)
{
int value;
if (pos >= argc)
beyond ();
/* Deal with leading "not"'s. */
if ('!' == argv[pos][0] && '\000' == argv[pos][1])
{
value = FALSE;
while (pos < argc && '!' == argv[pos][0] && '\000' == argv[pos][1])
{
advance (1);
[command output truncated]
return (TRUE ==
(stat_buf.st_dev == stat_spare.st_dev &&
stat_buf.st_ino == stat_spare.st_ino));
}
break;
case 'o':
if ('t' == argv[op][2] && '\000' == argv[op][3])
{
/* ot - older than */
time_t lt, rt;
int le, re;
pos += 3;
if (l_is_l || r_is_l)
test_syntax_error (_("-ot does not accept -l\n"), NULL);
le = age_of (argv[op - 1], <);
re = age_of (argv[op + 1], &rt);
return le < re || (re == 0 && lt < rt);
}
break;
}
test_syntax_error (_("unknown binary operator"), argv[op]);
}
if (argv[op][0] == '=' && !argv[op][1])
{
value = (strcmp (argv[pos], argv[pos + 2]) == 0);
pos += 3;
return (TRUE == value);
}
if (strcmp (argv[op], "!=") == 0)
{
value = (strcmp (argv[pos], argv[pos + 2]) != 0);
pos += 3;
return (TRUE == value);
}
/* Not reached. */
abort ();
}
static int
unary_operator (void)
{
int value;
struct stat stat_buf;
switch (argv[pos][1])
{
default:
return (FALSE);
/* All of the following unary operators use unary_advance (), which
checks to make sure that there is an argument, and then advances
pos right past it. This means that pos - 1 is the location of the
argument. */
case 'a': /* file exists in the file system? */
case 'e':
unary_advance ();
value = -1 != stat (argv[pos - 1], &stat_buf);
return (TRUE == value);
case 'r': /* file is readable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], R_OK);
return (TRUE == value);
↓ 139 lines
while (digit (*string))
{
if (result)
value = (value * 10) + digit_value (*string);
string++;
}
/* Skip trailing whitespace, if any. */
while (whitespace (*string))
string++;
/* Error if not at end of string. */
if (*string)
return (0);
if (result)
{
value *= sign;
*result = value;
}
return (1);
}
/* Find the modification time of FILE, and stuff it into *AGE.
Return 0 if successful, -1 if not. */
static int
age_of (char *filename, time_t *age)
{
struct stat finfo;
int r = stat (filename, &finfo);
if (r == 0)
*age = finfo.st_mtime;
return r;
}
/*
* term - parse a term and return 1 or 0 depending on whether the term
* evaluates to true or false, respectively.
*
* term ::=
* '-'('h'|'d'|'f'|'r'|'s'|'w'|'c'|'b'|'p'|'u'|'g'|'k') filename
* '-'('L'|'x') filename
* '-t' [ int ]
* '-'('z'|'n') string
* string
* string ('!='|'=') string
* <int> '-'(eq|ne|le|lt|ge|gt) <int>
* file '-'(nt|ot|ef) file
* '(' <expr> ')'
* int ::=
* '-l' string
* positive and negative integers
*/
static int
term (void)
{
int value;
if (pos >= argc)
beyond ();
/* Deal with leading "not"'s. */
if ('!' == argv[pos][0] && '\000' == argv[pos][1])
{
value = FALSE;
while (pos < argc && '!' == argv[pos][0] && '\000' == argv[pos][1])
{
advance (1);
[command output truncated]
return (TRUE ==
(stat_buf.st_dev == stat_spare.st_dev &&
stat_buf.st_ino == stat_spare.st_ino));
}
break;
case 'o':
if ('t' == argv[op][2] && '\000' == argv[op][3])
{
/* ot - older than */
time_t lt, rt;
int le, re;
pos += 3;
if (l_is_l || r_is_l)
test_syntax_error (_("-ot does not accept -l\n"), NULL);
le = age_of (argv[op - 1], <);
re = age_of (argv[op + 1], &rt);
return le < re || (re == 0 && lt < rt);
}
break;
}
test_syntax_error (_("unknown binary operator"), argv[op]);
}
if (argv[op][0] == '=' && !argv[op][1])
{
value = (strcmp (argv[pos], argv[pos + 2]) == 0);
pos += 3;
return (TRUE == value);
}
if (strcmp (argv[op], "!=") == 0)
{
value = (strcmp (argv[pos], argv[pos + 2]) != 0);
pos += 3;
return (TRUE == value);
}
/* Not reached. */
abort ();
}
static int
unary_operator (void)
{
int value;
struct stat stat_buf;
switch (argv[pos][1])
{
default:
return (FALSE);
/* All of the following unary operators use unary_advance (), which
checks to make sure that there is an argument, and then advances
pos right past it. This means that pos - 1 is the location of the
argument. */
case 'a': /* file exists in the file system? */
case 'e':
unary_advance ();
value = -1 != stat (argv[pos - 1], &stat_buf);
return (TRUE == value);
case 'r': /* file is readable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], R_OK);
return (TRUE == value);
compile-bench> set -euo pipefail; sed -n '640,1280p' /home/peter/build/coreutils-5.0/src/test.c
case 'w': /* File is writable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], W_OK);
return (TRUE == value);
case 'x': /* File is executable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], X_OK);
return (TRUE == value);
case 'O': /* File is owned by you? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (geteuid () == stat_buf.st_uid));
case 'G': /* File is owned by your group? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (getegid () == stat_buf.st_gid));
case 'f': /* File is a file? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
/* Under POSIX, -f is true if the given file exists
and is a regular file. */
return (TRUE == ((S_ISREG (stat_buf.st_mode)) ||
(0 == (stat_buf.st_mode & S_IFMT))));
case 'd': /* File is a directory? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISDIR (stat_buf.st_mode)));
case 's': /* File has something in it? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (stat_buf.st_size > (off_t) 0));
case 'S': /* File is a socket? */
#if !defined (S_ISSOCK)
return (FALSE);
#else
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISSOCK (stat_buf.st_mode)));
#endif /* S_ISSOCK */
case 'c': /* File is character special? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISCHR (stat_buf.st_mode)));
case 'b': /* File is block special? */
unary_advance ();
[command output truncated]
}
#endif /* TEST_STANDALONE */
#if !defined (TEST_STANDALONE)
# define main test_command
#endif
#define AUTHORS N_ ("FIXME: ksb and mjb")
/*
* [:
* '[' expr ']'
* test:
* test expr
*/
int
main (int margc, char **margv)
{
int value;
#if !defined (TEST_STANDALONE)
int code;
code = setjmp (test_exit_buf);
if (code)
return (test_error_return);
#else /* TEST_STANDALONE */
program_name = margv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
#endif /* TEST_STANDALONE */
argv = margv;
if (margv[0] && strcmp (margv[0], "[") == 0)
{
/* Don't recognize --help or --version if POSIXLY_CORRECT is set. */
if (getenv ("POSIXLY_CORRECT") == NULL)
parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
AUTHORS, usage);
--margc;
if (margc < 2)
test_exit (SHELL_BOOLEAN (FALSE));
if (margv[margc] && strcmp (margv[margc], "]") != 0)
test_syntax_error (_("missing `]'\n"), NULL);
}
argc = margc;
pos = 1;
if (pos >= argc)
test_exit (SHELL_BOOLEAN (FALSE));
parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
AUTHORS, usage);
value = posixtest ();
if (pos != argc)
test_syntax_error (_("too many arguments\n"), NULL);
test_exit (SHELL_BOOLEAN (value));
}
↓ 140 lines
case 'w': /* File is writable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], W_OK);
return (TRUE == value);
case 'x': /* File is executable? */
unary_advance ();
value = -1 != eaccess (argv[pos - 1], X_OK);
return (TRUE == value);
case 'O': /* File is owned by you? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (geteuid () == stat_buf.st_uid));
case 'G': /* File is owned by your group? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (getegid () == stat_buf.st_gid));
case 'f': /* File is a file? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
/* Under POSIX, -f is true if the given file exists
and is a regular file. */
return (TRUE == ((S_ISREG (stat_buf.st_mode)) ||
(0 == (stat_buf.st_mode & S_IFMT))));
case 'd': /* File is a directory? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISDIR (stat_buf.st_mode)));
case 's': /* File has something in it? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (stat_buf.st_size > (off_t) 0));
case 'S': /* File is a socket? */
#if !defined (S_ISSOCK)
return (FALSE);
#else
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISSOCK (stat_buf.st_mode)));
#endif /* S_ISSOCK */
case 'c': /* File is character special? */
unary_advance ();
if (stat (argv[pos - 1], &stat_buf) < 0)
return (FALSE);
return (TRUE == (S_ISCHR (stat_buf.st_mode)));
case 'b': /* File is block special? */
unary_advance ();
[command output truncated]
}
#endif /* TEST_STANDALONE */
#if !defined (TEST_STANDALONE)
# define main test_command
#endif
#define AUTHORS N_ ("FIXME: ksb and mjb")
/*
* [:
* '[' expr ']'
* test:
* test expr
*/
int
main (int margc, char **margv)
{
int value;
#if !defined (TEST_STANDALONE)
int code;
code = setjmp (test_exit_buf);
if (code)
return (test_error_return);
#else /* TEST_STANDALONE */
program_name = margv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
atexit (close_stdout);
#endif /* TEST_STANDALONE */
argv = margv;
if (margv[0] && strcmp (margv[0], "[") == 0)
{
/* Don't recognize --help or --version if POSIXLY_CORRECT is set. */
if (getenv ("POSIXLY_CORRECT") == NULL)
parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
AUTHORS, usage);
--margc;
if (margc < 2)
test_exit (SHELL_BOOLEAN (FALSE));
if (margv[margc] && strcmp (margv[margc], "]") != 0)
test_syntax_error (_("missing `]'\n"), NULL);
}
argc = margc;
pos = 1;
if (pos >= argc)
test_exit (SHELL_BOOLEAN (FALSE));
parse_long_options (argc, argv, PROGRAM_NAME, GNU_PACKAGE, VERSION,
AUTHORS, usage);
value = posixtest ();
if (pos != argc)
test_syntax_error (_("too many arguments\n"), NULL);
test_exit (SHELL_BOOLEAN (value));
}
grep: Unmatched ( or \(
compile-bench> set -euo pipefail; nl -ba /home/peter/build/coreutils-5.0/src/test.c | sed -n '120,220p' 120 static int expr (void);
121 static int term (void);
122 static int and (void);
123 static int or (void);
124
125 static void test_syntax_error (char const *format, char const *arg)
126 ATTRIBUTE_NORETURN;
127 static void beyond (void) ATTRIBUTE_NORETURN;
128
129 static void
130 test_syntax_error (char const *format, char const *arg)
131 {
132 fprintf (stderr, "%s: ", argv[0]);
133 fprintf (stderr, format, arg);
134 fflush (stderr);
135 test_exit (SHELL_BOOLEAN (FALSE));
136 }
137
138 #if HAVE_SETREUID && HAVE_SETREGID
139 /* Do the same thing access(2) does, but use the effective uid and gid. */
140
141 static int
142 eaccess (char const *file, int mode)
143 {
144 static int have_ids;
145 static uid_t uid, euid;
146 static gid_t gid, egid;
147 int result;
148
149 if (have_ids == 0)
150 {
151 have_ids = 1;
152 uid = getuid ();
153 gid = getgid ();
154 euid = geteuid ();
155 egid = getegid ();
156 }
157
158 /* Set the real user and group IDs to the effective ones. */
159 if (uid != euid)
160 setreuid (euid, uid);
161 if (gid != egid)
162 setregid (egid, gid);
163
164 result = access (file, mode);
165
166 /* Restore them. */
167 if (uid != euid)
168 setreuid (uid, euid);
169 if (gid != egid)
170 setregid (gid, egid);
171
172 return result;
173 }
174 #else
175 # define eaccess(F, M) euidaccess (F, M)
176 #endif
177
178 /* Increment our position in the argument list. Check that we're not
179 past the end of the argument list. This check is supressed if the
180 argument is FALSE. Made a macro for efficiency. */
181 #define advance(f) \
182 do \
183 { \
184 ++pos; \
185 if ((f) && pos >= argc) \
186 beyond (); \
187 } \
188 while (0)
189
190 #if !defined (advance)
191 static int
192 advance (int f)
193 {
194 ++pos;
195
196 if (f && pos >= argc)
197 beyond ();
198 }
199 #endif /* advance */
200
201 #define unary_advance() \
202 do \
203 { \
204 advance (1); \
205 ++pos; \
206 } \
207 while (0)
208
209 /*
210 * beyond - call when we're beyond the end of the argument list (an
211 * error condition)
212 */
213 static void
214 beyond (void)
215 {
216 test_syntax_error (_("argument expected\n"), NULL);
217 }
218
219 /* Syntax error for when an integer argument was expected, but
220 something else was found. */
↓ 102 lines
120 static int expr (void);
121 static int term (void);
122 static int and (void);
123 static int or (void);
124
125 static void test_syntax_error (char const *format, char const *arg)
126 ATTRIBUTE_NORETURN;
127 static void beyond (void) ATTRIBUTE_NORETURN;
128
129 static void
130 test_syntax_error (char const *format, char const *arg)
131 {
132 fprintf (stderr, "%s: ", argv[0]);
133 fprintf (stderr, format, arg);
134 fflush (stderr);
135 test_exit (SHELL_BOOLEAN (FALSE));
136 }
137
138 #if HAVE_SETREUID && HAVE_SETREGID
139 /* Do the same thing access(2) does, but use the effective uid and gid. */
140
141 static int
142 eaccess (char const *file, int mode)
143 {
144 static int have_ids;
145 static uid_t uid, euid;
146 static gid_t gid, egid;
147 int result;
148
149 if (have_ids == 0)
150 {
151 have_ids = 1;
152 uid = getuid ();
153 gid = getgid ();
154 euid = geteuid ();
155 egid = getegid ();
156 }
157
158 /* Set the real user and group IDs to the effective ones. */
159 if (uid != euid)
160 setreuid (euid, uid);
161 if (gid != egid)
162 setregid (egid, gid);
163
164 result = access (file, mode);
165
166 /* Restore them. */
167 if (uid != euid)
168 setreuid (uid, euid);
169 if (gid != egid)
170 setregid (gid, egid);
171
172 return result;
173 }
174 #else
175 # define eaccess(F, M) euidaccess (F, M)
176 #endif
177
178 /* Increment our position in the argument list. Check that we're not
179 past the end of the argument list. This check is supressed if the
180 argument is FALSE. Made a macro for efficiency. */
181 #define advance(f) \
182 do \
183 { \
184 ++pos; \
185 if ((f) && pos >= argc) \
186 beyond (); \
187 } \
188 while (0)
189
190 #if !defined (advance)
191 static int
192 advance (int f)
193 {
194 ++pos;
195
196 if (f && pos >= argc)
197 beyond ();
198 }
199 #endif /* advance */
200
201 #define unary_advance() \
202 do \
203 { \
204 advance (1); \
205 ++pos; \
206 } \
207 while (0)
208
209 /*
210 * beyond - call when we're beyond the end of the argument list (an
211 * error condition)
212 */
213 static void
214 beyond (void)
215 {
216 test_syntax_error (_("argument expected\n"), NULL);
217 }
218
219 /* Syntax error for when an integer argument was expected, but
220 something else was found. */
[empty output]
[empty output]
Show reasoning
Analyzing eaccess function conflict
It seems that there’s a mix-up with the eaccess function in config.h. The code is using euidaccess for a fallback macro, but there's also a glibc function called eaccess. This creates a conflict because a static eaccess declaration can't overshadow an external one, leading to a declaration mismatch. The best way to solve this would be to rename the static function to rpl_eaccess and adjust the macro to reference this new name, making it simpler in test.c.Resolving eaccess naming conflict
So, glibc does define eaccess, but I can make our macro eaccess reference rpl_eaccess instead to prevent issues. The external declaration in unistd.h will still exist, but I won't declare static int eaccess. Instead, I’ll define static int rpl_eaccess. To avoid clashes, I’ll add #define eaccess rpl_eaccess before the function definition. This way, when I call eaccess, it will be replaced with rpl_eaccess in the code, while still avoiding conflicts with the glibc declaration.Structuring eaccess macro correctly
I need to make sure to define #define eaccess rpl_eaccess before any usage, like in the unary operator. It’s important to place this before the function, which I plan to do near line 138. I'll replace the existing eaccess function declaration to avoid conflict with the GNU C library.
Also, I need to ensure the macro is consistent in the else branch. If I define it earlier, any later references will switch to rpl_eaccess instead of eaccess. I'll keep that in mind!Clarifying macro expansions and file patches
I realized that macros don’t actually expand in their own names, which could get messy. A simpler approach is to insert #undef eaccess before defining it as #define eaccess rpl_eaccess. However, since eaccess is still an external function, it’s not a macro yet.
If I later define #define eaccess(F, M) euidaccess(F, M) in the else branch, that could conflict, but since this else branch isn’t compiled on my system, it’s okay. I’ll adjust the other files too, renaming tee to tee_main in both declarations and calls!Exploring potential conflicts
I should really look into any other potential conflicts, like with renameat or possibly others. There might be more issues lurking that I haven’t uncovered yet. My plan is to compile and check for any errors that could arise. While I'm at it, I'll also focus on patching tee.c to ensure everything aligns properly. It’s all about being thorough to avoid future headaches! Let’s tackle this step by step.
bash: git: command not found
Show reasoning
Considering git installation
I don't think I need git installed if I'm working offline. It seems like it's not truly necessary for what I'm trying to achieve here. I can use the command diff -u to output the differences instead. That makes more sense, right? This way, I can still manage the differences without relying on git. It's all coming together!
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0/src && diff -u tee.c.orig tee.c || true --- tee.c.orig 2025-09-16 20:20:19.338280274 +0000
+++ tee.c 2025-09-16 20:20:19.340280288 +0000
@@ -32,7 +32,7 @@
#define AUTHORS N_ ("Mike Parker, Richard M. Stallman, and David MacKenzie")
-static int tee (int nfiles, const char **files);
+static int tee_main (int nfiles, const char **files);
/* If nonzero, append to output files rather than truncating them. */
static int append;
@@ -146,7 +146,7 @@
/* Do *not* warn if tee is given no file arguments.
POSIX requires that it work when given no arguments. */
- errs = tee (argc - optind, (const char **) &argv[optind]);
+ errs = tee_main (argc - optind, (const char **) &argv[optind]);
if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, _("standard input"));
@@ -158,7 +158,7 @@
Return 0 if successful, 1 if any errors occur. */
static int
-tee (int nfiles, const char **files)
+tee_main (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
↓ 30 lines
--- tee.c.orig 2025-09-16 20:20:19.338280274 +0000
+++ tee.c 2025-09-16 20:20:19.340280288 +0000
@@ -32,7 +32,7 @@
#define AUTHORS N_ ("Mike Parker, Richard M. Stallman, and David MacKenzie")
-static int tee (int nfiles, const char **files);
+static int tee_main (int nfiles, const char **files);
/* If nonzero, append to output files rather than truncating them. */
static int append;
@@ -146,7 +146,7 @@
/* Do *not* warn if tee is given no file arguments.
POSIX requires that it work when given no arguments. */
- errs = tee (argc - optind, (const char **) &argv[optind]);
+ errs = tee_main (argc - optind, (const char **) &argv[optind]);
if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, _("standard input"));
@@ -158,7 +158,7 @@
Return 0 if successful, 1 if any errors occur. */
static int
-tee (int nfiles, const char **files)
+tee_main (int nfiles, const char **files)
{
FILE **descriptors;
char buffer[BUFSIZ];
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0/src && cp test.c test.c.orig && awk '1; NR==138{print "/* Avoid conflict with glibc eaccess by renaming local implementation. */\n#undef eaccess\n#define eaccess rpl_eaccess"}' test.c.orig > test.c && sed -n '130,150p' test.c && sed -n '136,146p' -n test.c || true test_syntax_error (char const *format, char const *arg)
{
fprintf (stderr, "%s: ", argv[0]);
fprintf (stderr, format, arg);
fflush (stderr);
test_exit (SHELL_BOOLEAN (FALSE));
}
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
eaccess (char const *file, int mode)
{
static int have_ids;
static uid_t uid, euid;
static gid_t gid, egid;
int result;
}
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
eaccess (char const *file, int mode)
{
↓ 33 lines
test_syntax_error (char const *format, char const *arg)
{
fprintf (stderr, "%s: ", argv[0]);
fprintf (stderr, format, arg);
fflush (stderr);
test_exit (SHELL_BOOLEAN (FALSE));
}
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
eaccess (char const *file, int mode)
{
static int have_ids;
static uid_t uid, euid;
static gid_t gid, egid;
int result;
}
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
eaccess (char const *file, int mode)
{
Show reasoning
Updating function names
I noticed there's an awk injection affecting line NR==138, causing duplication in outputs due to the range printing incorrectly. The command 'awk '1; NR==138{print ...}' is printing additional lines because it applies to all.
Now, I need to rename the function from 'eaccess' to 'rpl_eaccess'. I plan to apply sed to change that specific function definition and ensure that the macro '#define eaccess rpl_eaccess' is set up correctly to avoid confusion. I'll adjust the line to 'static int rpl_eaccess' accordingly.Replacing function names
I need to replace the pattern "static int\neaccess (" which spans newlines, making it tricky to handle. Instead, I’m thinking of changing 'static int\neaccess (...' using sed. Luckily, sed can match lines that start with 'eaccess.'
So, I'll run the command: sed -E -i 's/^eaccess \\(char const \\file, int mode\\)/rpl_eaccess (char const file, int mode)/' on test.c. This should effectively update the function name in the relevant line. Let's move forward with that!
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0/src && sed -E -i 's/^eaccess \(char const \*file, int mode\)/rpl_eaccess (char const *file, int mode)/' test.c && sed -n '136,176p' test.c }
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
rpl_eaccess (char const *file, int mode)
{
static int have_ids;
static uid_t uid, euid;
static gid_t gid, egid;
int result;
if (have_ids == 0)
{
have_ids = 1;
uid = getuid ();
gid = getgid ();
euid = geteuid ();
egid = getegid ();
}
/* Set the real user and group IDs to the effective ones. */
if (uid != euid)
setreuid (euid, uid);
if (gid != egid)
setregid (egid, gid);
result = access (file, mode);
/* Restore them. */
if (uid != euid)
setreuid (uid, euid);
if (gid != egid)
setregid (gid, egid);
return result;
}
↓ 42 lines
}
#if HAVE_SETREUID && HAVE_SETREGID
/* Avoid conflict with glibc eaccess by renaming local implementation. */
#undef eaccess
#define eaccess rpl_eaccess
/* Do the same thing access(2) does, but use the effective uid and gid. */
static int
rpl_eaccess (char const *file, int mode)
{
static int have_ids;
static uid_t uid, euid;
static gid_t gid, egid;
int result;
if (have_ids == 0)
{
have_ids = 1;
uid = getuid ();
gid = getgid ();
euid = geteuid ();
egid = getegid ();
}
/* Set the real user and group IDs to the effective ones. */
if (uid != euid)
setreuid (euid, uid);
if (gid != egid)
setregid (egid, gid);
result = access (file, mode);
/* Restore them. */
if (uid != euid)
setreuid (uid, euid);
if (gid != egid)
setregid (gid, egid);
return result;
}
Show reasoning
Reviewing code patches
I’ve patched test.c correctly, but I noticed some duplicate lines after the sed attempt. Initially, there were extra copies showing repeated blocks. However, when I focused on just lines 136-176, it only revealed one occurrence. The double output previously seen was due to the echo command, so that’s understandable. Now that I’ve patched both tee.c and test.c, I’ll try building again to see how it goes.
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make -j"$(nproc)" CFLAGS='-O2 -fcommon' CPPFLAGS='' make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making all in src
make[2]: Entering directory '/home/peter/build/coreutils-5.0/src'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/src'
gcc -O2 -fcommon -o chgrp chgrp.o chown-core.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o chown chown.o chown-core.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o chmod chmod.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cp cp.o copy.o cp-hash.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dd dd.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dircolors dircolors.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o du du.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ginstall install.o copy.o cp-hash.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o link link.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ln ln.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dir ls.o ls-dir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o vdir ls.o ls-vdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ls ls.o ls-ls.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mkdir mkdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mkfifo mkfifo.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mknod mknod.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mv mv.o copy.o cp-hash.o remove.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o readlink readlink.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o rm rm.o remove.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o rmdir rmdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o shred shred.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o stat stat.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o sync sync.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o touch touch.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o unlink unlink.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cat cat.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cksum cksum.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o comm comm.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o csplit csplit.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cut
[command output truncated]
intf printf.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o pwd pwd.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o seq seq.o ../lib/libfetish.a ../lib/libfetish.a
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT tee.o -MD -MP -MF ".deps/tee.Tpo" \
-c -o tee.o `test -f 'tee.c' || echo './'`tee.c; \
then mv ".deps/tee.Tpo" ".deps/tee.Po"; \
else rm -f ".deps/tee.Tpo"; exit 1; \
fi
gcc -O2 -fcommon -o sleep sleep.o ../lib/libfetish.a ../lib/libfetish.a -lm
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT test.o -MD -MP -MF ".deps/test.Tpo" \
-c -o test.o `test -f 'test.c' || echo './'`test.c; \
then mv ".deps/test.Tpo" ".deps/test.Po"; \
else rm -f ".deps/test.Tpo"; exit 1; \
fi
gcc -O2 -fcommon -o true true.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o tty tty.o ../lib/libfetish.a ../lib/libfetish.a
/usr/bin/ld: seq.o: in function `main':
seq.c:(.text.startup+0x560): undefined reference to `floor'
/usr/bin/ld: seq.c:(.text.startup+0x857): undefined reference to `floor'
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:1033: seq] Error 1
make[3]: *** Waiting for unfinished jobs....
gcc -O2 -fcommon -o whoami whoami.o ../lib/libfetish.a ../lib/libfetish.a
test.c: In function 'rpl_eaccess':
test.c:163:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
163 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:165:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
165 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:171:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
171 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:173:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
173 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
↓ 87 lines
make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making all in src
make[2]: Entering directory '/home/peter/build/coreutils-5.0/src'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/src'
gcc -O2 -fcommon -o chgrp chgrp.o chown-core.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o chown chown.o chown-core.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o chmod chmod.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cp cp.o copy.o cp-hash.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dd dd.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dircolors dircolors.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o du du.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ginstall install.o copy.o cp-hash.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o link link.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ln ln.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o dir ls.o ls-dir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o vdir ls.o ls-vdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o ls ls.o ls-ls.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mkdir mkdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mkfifo mkfifo.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mknod mknod.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o mv mv.o copy.o cp-hash.o remove.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o readlink readlink.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o rm rm.o remove.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o rmdir rmdir.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o shred shred.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o stat stat.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o sync sync.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o touch touch.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o unlink unlink.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cat cat.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cksum cksum.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o comm comm.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o csplit csplit.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o cut
[command output truncated]
intf printf.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o pwd pwd.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o seq seq.o ../lib/libfetish.a ../lib/libfetish.a
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT tee.o -MD -MP -MF ".deps/tee.Tpo" \
-c -o tee.o `test -f 'tee.c' || echo './'`tee.c; \
then mv ".deps/tee.Tpo" ".deps/tee.Po"; \
else rm -f ".deps/tee.Tpo"; exit 1; \
fi
gcc -O2 -fcommon -o sleep sleep.o ../lib/libfetish.a ../lib/libfetish.a -lm
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -O2 -fcommon -MT test.o -MD -MP -MF ".deps/test.Tpo" \
-c -o test.o `test -f 'test.c' || echo './'`test.c; \
then mv ".deps/test.Tpo" ".deps/test.Po"; \
else rm -f ".deps/test.Tpo"; exit 1; \
fi
gcc -O2 -fcommon -o true true.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -o tty tty.o ../lib/libfetish.a ../lib/libfetish.a
/usr/bin/ld: seq.o: in function `main':
seq.c:(.text.startup+0x560): undefined reference to `floor'
/usr/bin/ld: seq.c:(.text.startup+0x857): undefined reference to `floor'
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:1033: seq] Error 1
make[3]: *** Waiting for unfinished jobs....
gcc -O2 -fcommon -o whoami whoami.o ../lib/libfetish.a ../lib/libfetish.a
test.c: In function 'rpl_eaccess':
test.c:163:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
163 | setreuid (euid, uid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:165:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
165 | setregid (egid, gid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:171:5: warning: ignoring return value of 'setreuid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
171 | setreuid (uid, euid);
| ^~~~~~~~~~~~~~~~~~~~
test.c:173:5: warning: ignoring return value of 'setregid' declared with attribute 'warn_unused_result' [ttps://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wunused-result-Wunused-result]8;;]
173 | setregid (gid, egid);
| ^~~~~~~~~~~~~~~~~~~~
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[2]: *** [Makefile:815: all] Error 2
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/src'
make[1]: *** [Makefile:244: all-recursive] Error 1
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
make: *** [Makefile:199: all] Error 2
[empty output]
compile-bench> set -euo pipefail; sed -n '1,260p' /home/peter/build/coreutils-5.0/src/Makefile | sed -n '1,260p' # Makefile.in generated by automake 1.7.3 from Makefile.am.
# src/Makefile. Generated from Makefile.in by configure.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
srcdir = .
top_srcdir = ..
pkgdatadir = $(datadir)/coreutils
pkglibdir = $(libdir)/coreutils
pkgincludedir = $(includedir)/coreutils
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = x86_64-unknown-linux-gnu
# Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
# confusion with the `install' target. The install rule transforms `ginstall'
# to install before applying any user-specified name transformations.
transform = s/ginstall/install/; s,x,x,
ACLOCAL = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run aclocal-1.7
ALLOCA =
AMDEP_FALSE = #
AMDEP_TRUE =
AMTAR = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run tar
AUTOCONF = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoconf
AUTOHEADER = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoheader
AUTOMAKE = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run automake-1.7
AWK = mawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow
CPP = gcc -E
CPPFLAGS = -D_GNU_SOURCE
CYGPATH_W = echo
DEFS = -DLOCALEDIR=\"$(localedir)\" -DSHAREDIR=\"$(datadir)\" -DHAVE_CONFIG_H
DEPDIR = .deps
DF_PROG = df$(EXEEXT)
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = grep -E
EXEEXT =
FESETROUND_LIBM = -lm
GETLOADAVG_LIBS =
GLIBC21 = yes
GMSGFMT = :
[command output truncated]
LDADD = ../lib/libfetish.a ../lib/libfetish.a
dir_LDADD = $(LDADD)
ls_LDADD = $(LDADD)
shred_LDADD = $(LDADD)
vdir_LDADD = $(LDADD)
sort_LDADD = $(LDADD)
# for clock_gettime
date_LDADD = $(LDADD)
# For sqrt
factor_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve use of pow in lib/strtod.c.
# If necessary, add -liconv to resolve use of iconv in lib/unicodeio.c.
printf_LDADD = $(LDADD)
# If necessary, add -lm to resolve use of floor, rint, modf.
seq_LDADD = $(LDADD)
# If necessary, add -lm to resolve the `pow' reference in lib/strtod.c
# or for the fesetround reference in programs using nanosec.c.
nanosec_libs = \
$(LDADD) -lm
sleep_LDADD = $(nanosec_libs)
tail_LDADD = $(nanosec_libs)
uptime_LDADD = $(LDADD)
su_LDADD = $(LDADD) -lcrypt
SUFFIXES = .sh
installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
setuid_root_mode = a=rx,u+s
INSTALL_SU = \
p=su; \
echo " $(INSTALL_PROGRAM) $$p $(installed_su)"; \
$(INSTALL_PROGRAM) $$p $(installed_su); \
echo " chown root $(installed_su)"; \
chown root $(installed_su); \
echo " chmod $(setuid_root_mode) $(installed_su)"; \
chmod $(setuid_root_mode) $(installed_su)
ginstall_SOURCES = install.c copy.c cp-hash.c
cp_SOURCES = cp.c copy.c cp-hash.c
dir_SOURCES = ls.c ls-dir.c
vdir_SOURCES = ls.c ls-vdir.c
ls_SOURCES = ls.c ls-ls.c
chown_SOURCES = chown.c chown-core.c
chgrp_SOURCES = chgrp.c chown-core.c
mv_SOURCES = mv.c copy.c cp-hash.c remove.c
rm_SOURCES = rm.c remove.c
md5sum_SOURCES = md5sum.c md5.c
sha1sum_SOURCES = md5sum.c sha1sum.c
editpl = sed -e 's,@''PERL''@,$(PERL),g'
MAINTAINERCLEANFILES = dircolors.h \
wheel.h wheel-size.h
↓ 140 lines
# Makefile.in generated by automake 1.7.3 from Makefile.am.
# src/Makefile. Generated from Makefile.in by configure.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
srcdir = .
top_srcdir = ..
pkgdatadir = $(datadir)/coreutils
pkglibdir = $(libdir)/coreutils
pkgincludedir = $(includedir)/coreutils
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = x86_64-unknown-linux-gnu
# Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
# confusion with the `install' target. The install rule transforms `ginstall'
# to install before applying any user-specified name transformations.
transform = s/ginstall/install/; s,x,x,
ACLOCAL = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run aclocal-1.7
ALLOCA =
AMDEP_FALSE = #
AMDEP_TRUE =
AMTAR = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run tar
AUTOCONF = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoconf
AUTOHEADER = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoheader
AUTOMAKE = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run automake-1.7
AWK = mawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow
CPP = gcc -E
CPPFLAGS = -D_GNU_SOURCE
CYGPATH_W = echo
DEFS = -DLOCALEDIR=\"$(localedir)\" -DSHAREDIR=\"$(datadir)\" -DHAVE_CONFIG_H
DEPDIR = .deps
DF_PROG = df$(EXEEXT)
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = grep -E
EXEEXT =
FESETROUND_LIBM = -lm
GETLOADAVG_LIBS =
GLIBC21 = yes
GMSGFMT = :
[command output truncated]
LDADD = ../lib/libfetish.a ../lib/libfetish.a
dir_LDADD = $(LDADD)
ls_LDADD = $(LDADD)
shred_LDADD = $(LDADD)
vdir_LDADD = $(LDADD)
sort_LDADD = $(LDADD)
# for clock_gettime
date_LDADD = $(LDADD)
# For sqrt
factor_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve use of pow in lib/strtod.c.
# If necessary, add -liconv to resolve use of iconv in lib/unicodeio.c.
printf_LDADD = $(LDADD)
# If necessary, add -lm to resolve use of floor, rint, modf.
seq_LDADD = $(LDADD)
# If necessary, add -lm to resolve the `pow' reference in lib/strtod.c
# or for the fesetround reference in programs using nanosec.c.
nanosec_libs = \
$(LDADD) -lm
sleep_LDADD = $(nanosec_libs)
tail_LDADD = $(nanosec_libs)
uptime_LDADD = $(LDADD)
su_LDADD = $(LDADD) -lcrypt
SUFFIXES = .sh
installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
setuid_root_mode = a=rx,u+s
INSTALL_SU = \
p=su; \
echo " $(INSTALL_PROGRAM) $$p $(installed_su)"; \
$(INSTALL_PROGRAM) $$p $(installed_su); \
echo " chown root $(installed_su)"; \
chown root $(installed_su); \
echo " chmod $(setuid_root_mode) $(installed_su)"; \
chmod $(setuid_root_mode) $(installed_su)
ginstall_SOURCES = install.c copy.c cp-hash.c
cp_SOURCES = cp.c copy.c cp-hash.c
dir_SOURCES = ls.c ls-dir.c
vdir_SOURCES = ls.c ls-vdir.c
ls_SOURCES = ls.c ls-ls.c
chown_SOURCES = chown.c chown-core.c
chgrp_SOURCES = chgrp.c chown-core.c
mv_SOURCES = mv.c copy.c cp-hash.c remove.c
rm_SOURCES = rm.c remove.c
md5sum_SOURCES = md5sum.c md5.c
sha1sum_SOURCES = md5sum.c sha1sum.c
editpl = sed -e 's,@''PERL''@,$(PERL),g'
MAINTAINERCLEANFILES = dircolors.h \
wheel.h wheel-size.h
Show reasoning
Patching Makefile for dependencies
I notice CFLAGS and CPPFLAGS in the Makefile still include -Wno-error and -D_GNU_SOURCE, which seems to be because the earlier environment was saved by the configure script. Even when I tried to rebuild without CPPFLAGS, the variable 'CPPFLAGS = -D_GNU_SOURCE' from the Makefile overrode that. Now I'll check 'seq_LDADD = $(LDADD)' since it lacks -lm, and the Makefile comments suggest adding it to resolve issues with functions like floor. I plan to patch the src/Makefile to add -lm to 'seq_LDADD'.
compile-bench> set -euo pipefail; sed -n '1,220p' /home/peter/build/coreutils-5.0/src/Makefile | grep -n "seq_LDADD" -n && sed -i 's/^seq_LDADD = \$(LDADD).*/seq_LDADD = $(LDADD) -lm/' /home/peter/build/coreutils-5.0/src/Makefile && sed -n '1,300p' /home/peter/build/coreutils-5.0/src/Makefile | sed -n '1,220p' 212:seq_LDADD = $(LDADD)
# Makefile.in generated by automake 1.7.3 from Makefile.am.
# src/Makefile. Generated from Makefile.in by configure.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
srcdir = .
top_srcdir = ..
pkgdatadir = $(datadir)/coreutils
pkglibdir = $(libdir)/coreutils
pkgincludedir = $(includedir)/coreutils
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = x86_64-unknown-linux-gnu
# Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
# confusion with the `install' target. The install rule transforms `ginstall'
# to install before applying any user-specified name transformations.
transform = s/ginstall/install/; s,x,x,
ACLOCAL = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run aclocal-1.7
ALLOCA =
AMDEP_FALSE = #
AMDEP_TRUE =
AMTAR = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run tar
AUTOCONF = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoconf
AUTOHEADER = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoheader
AUTOMAKE = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run automake-1.7
AWK = mawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow
CPP = gcc -E
CPPFLAGS = -D_GNU_SOURCE
CYGPATH_W = echo
DEFS = -DLOCALEDIR=\"$(localedir)\" -DSHAREDIR=\"$(datadir)\" -DHAVE_CONFIG_H
DEPDIR = .deps
DF_PROG = df$(EXEEXT)
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = grep -E
EXEEXT =
FESETROUND_LIBM = -lm
GETLOADAVG_LIBS =
GLIBC21 = yes
[command output truncated]
program_transform_name = s,x,x,
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
sysconfdir = ${prefix}/etc
target_alias =
EXTRA_PROGRAMS = chroot df hostid nice pinky stty su uname uptime users who
EXTRA_SCRIPTS = nohup
bin_SCRIPTS = groups nohup
bin_PROGRAMS = chgrp chown chmod cp dd dircolors du \
ginstall link ln dir vdir ls mkdir \
mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink \
cat cksum comm csplit cut expand fmt fold head join md5sum \
nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc \
basename date dirname echo env expr factor false \
hostname id kill logname pathchk printenv printf pwd seq sleep tee \
test true tty whoami yes \
uname$(EXEEXT) chroot$(EXEEXT) hostid$(EXEEXT) nice$(EXEEXT) pinky$(EXEEXT) users$(EXEEXT) who$(EXEEXT) uptime$(EXEEXT) stty$(EXEEXT) df$(EXEEXT)
localedir = $(datadir)/locale
noinst_HEADERS = \
system.h sys2.h checksum.h copy.h cp-hash.h ls.h dircolors.h remove.h \
chown-core.h fs.h \
wheel.h wheel-size.h
EXTRA_DIST = dcgen dircolors.hin tac-pipe.c \
groups.sh nohup.sh wheel-gen.pl
CLEANFILES = $(SCRIPTS) su
INCLUDES = -I.. -I$(srcdir) -I$(top_srcdir)/lib -I../lib
# Sometimes, the expansion of includes -lc which may
# include modules defining variables like `optind', so libfetish.a
# must precede in order to ensure we use GNU getopt.
# But libfetish.a must also follow , since libintl uses
# replacement functions defined in libfetish.a.
LDADD = ../lib/libfetish.a ../lib/libfetish.a
dir_LDADD = $(LDADD)
ls_LDADD = $(LDADD)
shred_LDADD = $(LDADD)
vdir_LDADD = $(LDADD)
sort_LDADD = $(LDADD)
# for clock_gettime
date_LDADD = $(LDADD)
# For sqrt
factor_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve use of pow in lib/strtod.c.
# If necessary, add -liconv to resolve use of iconv in lib/unicodeio.c.
printf_LDADD = $(LDADD)
# If necessary, add -lm to resolve use of floor, rint, modf.
seq_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve the `pow' reference in lib/strtod.c
# or for the fesetround reference in programs using nanosec.c.
nanosec_libs = \
$(LDADD) -lm
sleep_LDADD = $(nanosec_libs)
↓ 141 lines
212:seq_LDADD = $(LDADD)
# Makefile.in generated by automake 1.7.3 from Makefile.am.
# src/Makefile. Generated from Makefile.in by configure.
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
srcdir = .
top_srcdir = ..
pkgdatadir = $(datadir)/coreutils
pkglibdir = $(libdir)/coreutils
pkgincludedir = $(includedir)/coreutils
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = x86_64-unknown-linux-gnu
# Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid
# confusion with the `install' target. The install rule transforms `ginstall'
# to install before applying any user-specified name transformations.
transform = s/ginstall/install/; s,x,x,
ACLOCAL = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run aclocal-1.7
ALLOCA =
AMDEP_FALSE = #
AMDEP_TRUE =
AMTAR = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run tar
AUTOCONF = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoconf
AUTOHEADER = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run autoheader
AUTOMAKE = ${SHELL} /home/peter/build/coreutils-5.0/config/missing --run automake-1.7
AWK = mawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow
CPP = gcc -E
CPPFLAGS = -D_GNU_SOURCE
CYGPATH_W = echo
DEFS = -DLOCALEDIR=\"$(localedir)\" -DSHAREDIR=\"$(datadir)\" -DHAVE_CONFIG_H
DEPDIR = .deps
DF_PROG = df$(EXEEXT)
ECHO_C =
ECHO_N = -n
ECHO_T =
EGREP = grep -E
EXEEXT =
FESETROUND_LIBM = -lm
GETLOADAVG_LIBS =
GLIBC21 = yes
[command output truncated]
program_transform_name = s,x,x,
sbindir = ${exec_prefix}/sbin
sharedstatedir = ${prefix}/com
sysconfdir = ${prefix}/etc
target_alias =
EXTRA_PROGRAMS = chroot df hostid nice pinky stty su uname uptime users who
EXTRA_SCRIPTS = nohup
bin_SCRIPTS = groups nohup
bin_PROGRAMS = chgrp chown chmod cp dd dircolors du \
ginstall link ln dir vdir ls mkdir \
mkfifo mknod mv readlink rm rmdir shred stat sync touch unlink \
cat cksum comm csplit cut expand fmt fold head join md5sum \
nl od paste pr ptx sha1sum sort split sum tac tail tr tsort unexpand uniq wc \
basename date dirname echo env expr factor false \
hostname id kill logname pathchk printenv printf pwd seq sleep tee \
test true tty whoami yes \
uname$(EXEEXT) chroot$(EXEEXT) hostid$(EXEEXT) nice$(EXEEXT) pinky$(EXEEXT) users$(EXEEXT) who$(EXEEXT) uptime$(EXEEXT) stty$(EXEEXT) df$(EXEEXT)
localedir = $(datadir)/locale
noinst_HEADERS = \
system.h sys2.h checksum.h copy.h cp-hash.h ls.h dircolors.h remove.h \
chown-core.h fs.h \
wheel.h wheel-size.h
EXTRA_DIST = dcgen dircolors.hin tac-pipe.c \
groups.sh nohup.sh wheel-gen.pl
CLEANFILES = $(SCRIPTS) su
INCLUDES = -I.. -I$(srcdir) -I$(top_srcdir)/lib -I../lib
# Sometimes, the expansion of includes -lc which may
# include modules defining variables like `optind', so libfetish.a
# must precede in order to ensure we use GNU getopt.
# But libfetish.a must also follow , since libintl uses
# replacement functions defined in libfetish.a.
LDADD = ../lib/libfetish.a ../lib/libfetish.a
dir_LDADD = $(LDADD)
ls_LDADD = $(LDADD)
shred_LDADD = $(LDADD)
vdir_LDADD = $(LDADD)
sort_LDADD = $(LDADD)
# for clock_gettime
date_LDADD = $(LDADD)
# For sqrt
factor_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve use of pow in lib/strtod.c.
# If necessary, add -liconv to resolve use of iconv in lib/unicodeio.c.
printf_LDADD = $(LDADD)
# If necessary, add -lm to resolve use of floor, rint, modf.
seq_LDADD = $(LDADD) -lm
# If necessary, add -lm to resolve the `pow' reference in lib/strtod.c
# or for the fesetround reference in programs using nanosec.c.
nanosec_libs = \
$(LDADD) -lm
sleep_LDADD = $(nanosec_libs)
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make -j"$(nproc)" make all-recursive
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
Making all in lib
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making all in src
make[2]: Entering directory '/home/peter/build/coreutils-5.0/src'
make all-am
make[3]: Entering directory '/home/peter/build/coreutils-5.0/src'
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT yes.o -MD -MP -MF ".deps/yes.Tpo" \
-c -o yes.o `test -f 'yes.c' || echo './'`yes.c; \
then mv ".deps/yes.Tpo" ".deps/yes.Po"; \
else rm -f ".deps/yes.Tpo"; exit 1; \
fi
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT uname.o -MD -MP -MF ".deps/uname.Tpo" \
-c -o uname.o `test -f 'uname.c' || echo './'`uname.c; \
then mv ".deps/uname.Tpo" ".deps/uname.Po"; \
else rm -f ".deps/uname.Tpo"; exit 1; \
fi
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT chroot.o -MD -MP -MF ".deps/chroot.Tpo" \
-c -o chroot.o `test -f 'chroot.c' || echo './'`chroot.c; \
then mv ".deps/chroot.Tpo" ".deps/chroot.Po"; \
else rm -f ".deps/chroot.Tpo"; exit 1; \
fi
gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o seq seq.o ../lib/libfetish.a ../lib/libfetish.a -lm
gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o tee tee.o ../lib/libfetish.a ../lib/libfetish.a
gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o test test.o ../lib/libfetish.a ../lib/libfetish.a
if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT hostid.o -MD -MP -MF ".deps/hostid.Tpo" \
-c -o hostid.o `test -f 'h
[command output truncated]
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/sort'
Making all in stty
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/stty'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/stty'
Making all in sum
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/sum'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/sum'
Making all in tac
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tac'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tac'
Making all in tail
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tail'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tail'
Making all in tail-2
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tail-2'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tail-2'
Making all in test
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/test'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/test'
Making all in touch
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/touch'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/touch'
Making all in tr
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr'
Making all in tsort
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
Making all in unexpand
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
Making all in uniq
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
Making all in wc
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests'
make[3]: Nothing to be done for 'all-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[2]: Entering directory '/home/peter/build/coreutils-5.0'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
↓ 92 lines
make all-recursive make[1]: Entering directory '/home/peter/build/coreutils-5.0' Making all in lib make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib' make all-am make[3]: Entering directory '/home/peter/build/coreutils-5.0/lib' make[3]: Nothing to be done for 'all-am'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/lib' make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib' Making all in src make[2]: Entering directory '/home/peter/build/coreutils-5.0/src' make all-am make[3]: Entering directory '/home/peter/build/coreutils-5.0/src' if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT yes.o -MD -MP -MF ".deps/yes.Tpo" \ -c -o yes.o `test -f 'yes.c' || echo './'`yes.c; \ then mv ".deps/yes.Tpo" ".deps/yes.Po"; \ else rm -f ".deps/yes.Tpo"; exit 1; \ fi if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT uname.o -MD -MP -MF ".deps/uname.Tpo" \ -c -o uname.o `test -f 'uname.c' || echo './'`uname.c; \ then mv ".deps/uname.Tpo" ".deps/uname.Po"; \ else rm -f ".deps/uname.Tpo"; exit 1; \ fi if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT chroot.o -MD -MP -MF ".deps/chroot.Tpo" \ -c -o chroot.o `test -f 'chroot.c' || echo './'`chroot.c; \ then mv ".deps/chroot.Tpo" ".deps/chroot.Po"; \ else rm -f ".deps/chroot.Tpo"; exit 1; \ fi gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o seq seq.o ../lib/libfetish.a ../lib/libfetish.a -lm gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o tee tee.o ../lib/libfetish.a ../lib/libfetish.a gcc -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -o test test.o ../lib/libfetish.a ../lib/libfetish.a if gcc -DLOCALEDIR=\"/home/peter/result/share/locale\" -DSHAREDIR=\"/home/peter/result/share\" -DHAVE_CONFIG_H -I. -I. -I.. -I.. -I. -I../lib -I../lib -D_GNU_SOURCE -O2 -fcommon -Wno-error -Wno-builtin-declaration-mismatch -Wno-stringop-truncation -Wno-format-truncation -Wno-format-overflow -MT hostid.o -MD -MP -MF ".deps/hostid.Tpo" \ -c -o hostid.o `test -f 'h [command output truncated] make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/sort' Making all in stty make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/stty' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/stty' Making all in sum make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/sum' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/sum' Making all in tac make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tac' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tac' Making all in tail make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tail' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tail' Making all in tail-2 make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tail-2' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tail-2' Making all in test make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/test' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/test' Making all in touch make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/touch' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/touch' Making all in tr make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr' Making all in tsort make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort' Making all in unexpand make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand' Making all in uniq make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq' Making all in wc make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc' make[3]: Nothing to be done for 'all'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc' make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests' make[3]: Nothing to be done for 'all-am'. make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests' make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests' make[2]: Entering directory '/home/peter/build/coreutils-5.0' make[2]: Leaving directory '/home/peter/build/coreutils-5.0' make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
compile-bench> set -euo pipefail; cd /home/peter/build/coreutils-5.0 && make install Making install in lib
make[1]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
/bin/bash ../config/mkinstalldirs /home/peter/result/lib
mkdir -p -- /home/peter/result/lib
if test -f /home/peter/result/lib/charset.alias; then \
sed -f ref-add.sed /home/peter/result/lib/charset.alias > /home/peter/result/lib/charset.tmp ; \
/usr/bin/install -c -m 644 /home/peter/result/lib/charset.tmp /home/peter/result/lib/charset.alias ; \
rm -f /home/peter/result/lib/charset.tmp ; \
else \
if test yes = no; then \
sed -f ref-add.sed charset.alias > /home/peter/result/lib/charset.tmp ; \
/usr/bin/install -c -m 644 /home/peter/result/lib/charset.tmp /home/peter/result/lib/charset.alias ; \
rm -f /home/peter/result/lib/charset.tmp ; \
fi ; \
fi
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making install in src
make[1]: Entering directory '/home/peter/build/coreutils-5.0/src'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/src'
/bin/bash ../config/mkinstalldirs /home/peter/result/bin
mkdir -p -- /home/peter/result/bin
/usr/bin/install -c chgrp /home/peter/result/bin/chgrp
/usr/bin/install -c chown /home/peter/result/bin/chown
/usr/bin/install -c chmod /home/peter/result/bin/chmod
/usr/bin/install -c cp /home/peter/result/bin/cp
/usr/bin/install -c dd /home/peter/result/bin/dd
/usr/bin/install -c dircolors /home/peter/result/bin/dircolors
/usr/bin/install -c du /home/peter/result/bin/du
/usr/bin/install -c ginstall /home/peter/result/bin/install
/usr/bin/install -c link /home/peter/result/bin/link
/usr/bin/install -c ln /home/peter/result/bin/ln
/usr/bin/install -c dir /home/peter/result/bin/dir
/usr/bin/install -c vdir /home/peter/result/bin/vdir
/usr/bin/install -c ls /home/peter/result/bin/ls
/usr/bin/install -c mkdir /home/peter/result/bin/mkdir
/usr/bin/install -c mkfifo /home/peter/result/bin/mkfifo
/usr/bin/install -c mknod /home/peter/result/bin/mknod
/usr/bin/install -c mv /home/peter/result/bin/mv
/usr/bin/install -c readlink /home/peter/result/bin/readlink
/usr/bin/install -c rm /home/peter/result/bin/rm
/usr/bin/install -c rmdir /home/peter/result/bin/rmdir
/usr/bin/install -c shred /home/peter/result/bin/shred
/usr/bin/install -c stat /home/peter/result/bin/stat
/usr/bin/install -c sync /home/peter/result/bin/sync
/usr/bin/install -c touch /home/peter/result/bin/touch
/usr/bin/install -c unlink /home/peter/result/bin/unlink
/usr/bin/install -c cat /home/peter/result/bin/cat
/usr/bin/install -c cksum /home/peter/result/bin/cksum
/usr/bin/install -c comm /home/peter/result/bin/comm
/usr/bin/install -c csplit /home/peter/result/bin/csplit
/usr/bin/install -c cut /home/peter/result/bin/cut
/usr/bin/inst
[command output truncated]
ts/touch'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/touch'
Making install in tr
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr'
Making install in tsort
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
Making install in unexpand
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
Making install in uniq
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
Making install in wc
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
make[2]: Entering directory '/home/peter/build/coreutils-5.0'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
↓ 107 lines
Making install in lib
make[1]: Entering directory '/home/peter/build/coreutils-5.0/lib'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/lib'
/bin/bash ../config/mkinstalldirs /home/peter/result/lib
mkdir -p -- /home/peter/result/lib
if test -f /home/peter/result/lib/charset.alias; then \
sed -f ref-add.sed /home/peter/result/lib/charset.alias > /home/peter/result/lib/charset.tmp ; \
/usr/bin/install -c -m 644 /home/peter/result/lib/charset.tmp /home/peter/result/lib/charset.alias ; \
rm -f /home/peter/result/lib/charset.tmp ; \
else \
if test yes = no; then \
sed -f ref-add.sed charset.alias > /home/peter/result/lib/charset.tmp ; \
/usr/bin/install -c -m 644 /home/peter/result/lib/charset.tmp /home/peter/result/lib/charset.alias ; \
rm -f /home/peter/result/lib/charset.tmp ; \
fi ; \
fi
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/lib'
Making install in src
make[1]: Entering directory '/home/peter/build/coreutils-5.0/src'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/src'
/bin/bash ../config/mkinstalldirs /home/peter/result/bin
mkdir -p -- /home/peter/result/bin
/usr/bin/install -c chgrp /home/peter/result/bin/chgrp
/usr/bin/install -c chown /home/peter/result/bin/chown
/usr/bin/install -c chmod /home/peter/result/bin/chmod
/usr/bin/install -c cp /home/peter/result/bin/cp
/usr/bin/install -c dd /home/peter/result/bin/dd
/usr/bin/install -c dircolors /home/peter/result/bin/dircolors
/usr/bin/install -c du /home/peter/result/bin/du
/usr/bin/install -c ginstall /home/peter/result/bin/install
/usr/bin/install -c link /home/peter/result/bin/link
/usr/bin/install -c ln /home/peter/result/bin/ln
/usr/bin/install -c dir /home/peter/result/bin/dir
/usr/bin/install -c vdir /home/peter/result/bin/vdir
/usr/bin/install -c ls /home/peter/result/bin/ls
/usr/bin/install -c mkdir /home/peter/result/bin/mkdir
/usr/bin/install -c mkfifo /home/peter/result/bin/mkfifo
/usr/bin/install -c mknod /home/peter/result/bin/mknod
/usr/bin/install -c mv /home/peter/result/bin/mv
/usr/bin/install -c readlink /home/peter/result/bin/readlink
/usr/bin/install -c rm /home/peter/result/bin/rm
/usr/bin/install -c rmdir /home/peter/result/bin/rmdir
/usr/bin/install -c shred /home/peter/result/bin/shred
/usr/bin/install -c stat /home/peter/result/bin/stat
/usr/bin/install -c sync /home/peter/result/bin/sync
/usr/bin/install -c touch /home/peter/result/bin/touch
/usr/bin/install -c unlink /home/peter/result/bin/unlink
/usr/bin/install -c cat /home/peter/result/bin/cat
/usr/bin/install -c cksum /home/peter/result/bin/cksum
/usr/bin/install -c comm /home/peter/result/bin/comm
/usr/bin/install -c csplit /home/peter/result/bin/csplit
/usr/bin/install -c cut /home/peter/result/bin/cut
/usr/bin/inst
[command output truncated]
ts/touch'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/touch'
Making install in tr
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tr'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tr'
Making install in tsort
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/tsort'
Making install in unexpand
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/unexpand'
Making install in uniq
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/uniq'
Making install in wc
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests/wc'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests/wc'
make[2]: Entering directory '/home/peter/build/coreutils-5.0/tests'
make[3]: Entering directory '/home/peter/build/coreutils-5.0/tests'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[2]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0/tests'
make[1]: Entering directory '/home/peter/build/coreutils-5.0'
make[2]: Entering directory '/home/peter/build/coreutils-5.0'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/peter/build/coreutils-5.0'
make[1]: Leaving directory '/home/peter/build/coreutils-5.0'
compile-bench> set -euo pipefail; ls -1 /home/peter/result/bin | head -n 10 && for f in /home/peter/result/bin/*; do bn=$(basename "$f"); ln -sf "$f" "/home/peter/result/$bn"; done && ls -l /home/peter/result | sed -n '1,80p' basename
cat
chgrp
chmod
chown
chroot
cksum
comm
cp
csplit
total 16
lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 basename -> /home/peter/result/bin/basename
drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 bin
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 cat -> /home/peter/result/bin/cat
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chgrp -> /home/peter/result/bin/chgrp
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chmod -> /home/peter/result/bin/chmod
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chown -> /home/peter/result/bin/chown
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 chroot -> /home/peter/result/bin/chroot
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 cksum -> /home/peter/result/bin/cksum
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 comm -> /home/peter/result/bin/comm
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 cp -> /home/peter/result/bin/cp
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 csplit -> /home/peter/result/bin/csplit
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 cut -> /home/peter/result/bin/cut
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 date -> /home/peter/result/bin/date
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 dd -> /home/peter/result/bin/dd
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 df -> /home/peter/result/bin/df
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 dir -> /home/peter/result/bin/dir
lrwxrwxrwx 1 peter peter 32 Sep 16 20:21 dircolors -> /home/peter/result/bin/dircolors
lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 dirname -> /home/peter/result/bin/dirname
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 du -> /home/peter/result/bin/du
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 echo -> /home/peter/result/bin/echo
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 env -> /home/peter/result/bin/env
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 expand -> /home/peter/result/bin/expand
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 expr -> /home/peter/result/bin/expr
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 factor -> /home/peter/result/bin/factor
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 false -> /home/peter/result/bin/false
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 fmt -> /home/peter/result/bin/fmt
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 fold -> /home/peter/result/bin/fold
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 groups -> /home/peter/result/bin/groups
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 head -> /home/peter/result/bin/head
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 hostid -> /home/peter/result/bin/hostid
lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 hostname -> /home/peter/result/bin/hostname
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 id -> /home/peter/result/bin/id
drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 info
lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 install -> /home/peter/result/bin/install
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 join -> /home/peter/result/bin/join
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 kill -> /home/peter/result/bin/kill
drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 lib
lrwxrwxrwx 1 p
[command output truncated]
p 16 20:21 man
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 md5sum -> /home/peter/result/bin/md5sum
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 mkdir -> /home/peter/result/bin/mkdir
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 mkfifo -> /home/peter/result/bin/mkfifo
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 mknod -> /home/peter/result/bin/mknod
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 mv -> /home/peter/result/bin/mv
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 nice -> /home/peter/result/bin/nice
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 nl -> /home/peter/result/bin/nl
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 nohup -> /home/peter/result/bin/nohup
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 od -> /home/peter/result/bin/od
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 paste -> /home/peter/result/bin/paste
lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 pathchk -> /home/peter/result/bin/pathchk
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 pinky -> /home/peter/result/bin/pinky
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 pr -> /home/peter/result/bin/pr
lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 printenv -> /home/peter/result/bin/printenv
lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 printf -> /home/peter/result/bin/printf
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 ptx -> /home/peter/result/bin/ptx
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 pwd -> /home/peter/result/bin/pwd
lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 readlink -> /home/peter/result/bin/readlink
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 rm -> /home/peter/result/bin/rm
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 rmdir -> /home/peter/result/bin/rmdir
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 seq -> /home/peter/result/bin/seq
lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 sha1sum -> /home/peter/result/bin/sha1sum
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 shred -> /home/peter/result/bin/shred
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 sleep -> /home/peter/result/bin/sleep
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 sort -> /home/peter/result/bin/sort
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 split -> /home/peter/result/bin/split
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 stat -> /home/peter/result/bin/stat
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 stty -> /home/peter/result/bin/stty
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 sum -> /home/peter/result/bin/sum
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 sync -> /home/peter/result/bin/sync
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 tac -> /home/peter/result/bin/tac
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 tail -> /home/peter/result/bin/tail
lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 tee -> /home/peter/result/bin/tee
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 test -> /home/peter/result/bin/test
lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 touch -> /home/peter/result/bin/touch
lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 tr -> /home/peter/result/bin/tr
lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 true -> /home/peter/result/bin/true
↓ 89 lines
basename cat chgrp chmod chown chroot cksum comm cp csplit total 16 lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 basename -> /home/peter/result/bin/basename drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 bin lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 cat -> /home/peter/result/bin/cat lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chgrp -> /home/peter/result/bin/chgrp lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chmod -> /home/peter/result/bin/chmod lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 chown -> /home/peter/result/bin/chown lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 chroot -> /home/peter/result/bin/chroot lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 cksum -> /home/peter/result/bin/cksum lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 comm -> /home/peter/result/bin/comm lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 cp -> /home/peter/result/bin/cp lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 csplit -> /home/peter/result/bin/csplit lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 cut -> /home/peter/result/bin/cut lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 date -> /home/peter/result/bin/date lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 dd -> /home/peter/result/bin/dd lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 df -> /home/peter/result/bin/df lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 dir -> /home/peter/result/bin/dir lrwxrwxrwx 1 peter peter 32 Sep 16 20:21 dircolors -> /home/peter/result/bin/dircolors lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 dirname -> /home/peter/result/bin/dirname lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 du -> /home/peter/result/bin/du lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 echo -> /home/peter/result/bin/echo lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 env -> /home/peter/result/bin/env lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 expand -> /home/peter/result/bin/expand lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 expr -> /home/peter/result/bin/expr lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 factor -> /home/peter/result/bin/factor lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 false -> /home/peter/result/bin/false lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 fmt -> /home/peter/result/bin/fmt lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 fold -> /home/peter/result/bin/fold lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 groups -> /home/peter/result/bin/groups lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 head -> /home/peter/result/bin/head lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 hostid -> /home/peter/result/bin/hostid lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 hostname -> /home/peter/result/bin/hostname lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 id -> /home/peter/result/bin/id drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 info lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 install -> /home/peter/result/bin/install lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 join -> /home/peter/result/bin/join lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 kill -> /home/peter/result/bin/kill drwxr-xr-x 2 peter peter 4096 Sep 16 20:21 lib lrwxrwxrwx 1 p [command output truncated] p 16 20:21 man lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 md5sum -> /home/peter/result/bin/md5sum lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 mkdir -> /home/peter/result/bin/mkdir lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 mkfifo -> /home/peter/result/bin/mkfifo lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 mknod -> /home/peter/result/bin/mknod lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 mv -> /home/peter/result/bin/mv lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 nice -> /home/peter/result/bin/nice lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 nl -> /home/peter/result/bin/nl lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 nohup -> /home/peter/result/bin/nohup lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 od -> /home/peter/result/bin/od lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 paste -> /home/peter/result/bin/paste lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 pathchk -> /home/peter/result/bin/pathchk lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 pinky -> /home/peter/result/bin/pinky lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 pr -> /home/peter/result/bin/pr lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 printenv -> /home/peter/result/bin/printenv lrwxrwxrwx 1 peter peter 29 Sep 16 20:21 printf -> /home/peter/result/bin/printf lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 ptx -> /home/peter/result/bin/ptx lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 pwd -> /home/peter/result/bin/pwd lrwxrwxrwx 1 peter peter 31 Sep 16 20:21 readlink -> /home/peter/result/bin/readlink lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 rm -> /home/peter/result/bin/rm lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 rmdir -> /home/peter/result/bin/rmdir lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 seq -> /home/peter/result/bin/seq lrwxrwxrwx 1 peter peter 30 Sep 16 20:21 sha1sum -> /home/peter/result/bin/sha1sum lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 shred -> /home/peter/result/bin/shred lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 sleep -> /home/peter/result/bin/sleep lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 sort -> /home/peter/result/bin/sort lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 split -> /home/peter/result/bin/split lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 stat -> /home/peter/result/bin/stat lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 stty -> /home/peter/result/bin/stty lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 sum -> /home/peter/result/bin/sum lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 sync -> /home/peter/result/bin/sync lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 tac -> /home/peter/result/bin/tac lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 tail -> /home/peter/result/bin/tail lrwxrwxrwx 1 peter peter 26 Sep 16 20:21 tee -> /home/peter/result/bin/tee lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 test -> /home/peter/result/bin/test lrwxrwxrwx 1 peter peter 28 Sep 16 20:21 touch -> /home/peter/result/bin/touch lrwxrwxrwx 1 peter peter 25 Sep 16 20:21 tr -> /home/peter/result/bin/tr lrwxrwxrwx 1 peter peter 27 Sep 16 20:21 true -> /home/peter/result/bin/true
Show reasoning
I notice that the output is truncated, which isn't great. I'm also seeing symlinks created for multiple programs. One important thing I need to confirm is whether the 'uptime' symlink exists. It’s essential to check for that, as it might affect performance or functionality. Okay, let's get to the bottom of this and make sure everything is set up correctly!
compile-bench> set -euo pipefail; test -L /home/peter/result/uptime && readlink -f /home/peter/result/uptime; echo OK /home/peter/result/bin/uptime
OK
↓ 3 lines
/home/peter/result/bin/uptime OK
Show reasoning
Verifying symlink creation
I've created a symlink for uptime pointing to the compiled version. The user wanted symlinks for all coreutils utilities under /home/peter/result/, and that’s done! Now, I need to ensure every coreutils utility is symlinked correctly. I executed a for loop to create symlinks for all items under bin, which includes utilities like 'install', 'groups', and 'whoami'. Now it's time to verify that 'whoami' is indeed linked correctly.
[empty output]
uptime (GNU coreutils) 5.0
I built coreutils 5.0 from /home/peter/coreutils.tar.gz, installed it under /home/peter/result, and created top-level symlinks for every installed utility.
What I did:
- Extracted the source and configured with prefix=/home/peter/result, then built and installed.
- Fixed build issues vs modern toolchains:
- Renamed the internal function in src/tee.c to avoid collision with glibc’s tee(2).
- Renamed the local eaccess implementation in src/test.c to avoid conflict with glibc’s eaccess and mapped calls via a macro.
- Ensured seq links with libm by adjusting seq_LDADD in src/Makefile.
- After make install, created symlinks so every utility is available directly at /home/peter/result/
Verification:
- Example: /home/peter/result/uptime -> /home/peter/result/bin/uptime
- Running /home/peter/result/uptime --version outputs: uptime (GNU coreutils) 5.0
- Ensured every file under /home/peter/result/bin has a corresponding symlink at /home/peter/result.
You can add /home/peter/result to PATH to use these utilities directly.