Make stdbuf search for libstdbuf first in the directory where stdbuf is running. This matches GNU coreutils behavior.
Add a symlink to deps/libstdbuf in order to make it easier to run the stdbuf tests with feat_external_stdbuf enabled.
Remove tests which are assuming that libstdbuf is not found. Those tests are now always failing, because the build
directory contains a symlink to deps/libstdbuf and libstdbuf is always found.
Fixes https://github.com/uutils/coreutils/issues/10345
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
- Replace get_many().unwrap() with ok_or_else() to handle missing command
- Replace next().unwrap() with pattern matching for safety
- Replace tempdir().unwrap() with map_err() to handle temp dir failures
All stdbuf internal errors now properly exit with code 125 per GNU specification:
https://www.gnu.org/s/coreutils/manual/html_node/stdbuf-invocation.html
Add test coverage for cat and stdbuf broken pipe handling:
**cat tests:**
- test_cat_broken_pipe_nonzero_and_message: Verify cat handles SIGPIPE
without hanging or crashing and exits with nonzero status
**stdbuf tests:**
- test_permission_external_missing_lib: Handle missing external libstdbuf
- test_no_such_external_missing_lib: Error handling in external lib mode
- Guard existing tests with #[cfg(not(feature = "feat_external_libstdbuf"))]
These tests address write-errors.sh from GNU test suite (#4627) and improve
cross-platform robustness for stdbuf feat_external_libstdbuf builds.
Summary:
Partial fix for https://github.com/uutils/coreutils/issues/6591
The current code declare libstdbuf as a build-dependency of stdbuf as a
workaround to enforce that libstdbuf is compiled before stdbuf. This breaks
cross-compilation, because build-dependencies were compiled for the host
architecture, and not for the target architecture.
The reason this workaround is necessary is that bindeps is available only in nightly at the moment:
https://rust-lang.github.io/rfcs/3028-cargo-binary-dependencies.html
This commit replaces the "build-dependency" workaround with another workaround:
calling cargo manually to build libstdbuf in the build.rs of stdbuf, in order to ensure that libstdbuf is built before stdbuf.
Changes:
- Removed cpp/cpp_build dependencies:
The cpp, cpp_build, and related dependencies were removed because they made cross-compilation in a build.rs file very complex, since you need
to pass proper CXX env variables for cross-compilation, whereas cross-compiling rust code using cargo is quite simple.
Provided Rust implementations for getting stdin, stdout, and stderr pointers.
Switched from C++/cpp macro-based initialization to using the Rust ctor crate for library initialization.
- Remove "feat_require_crate_cpp" which is not needed any more, since stdbuf was the only utility using the cpp crate.
Tests:
This commit fixes e.g. this test:
cross test --target aarch64-unknown-linux-gnu --features stdbuf test_stdbuf::test_libstdbuf_preload -- --nocapture
- The "i686" build of stdbuf was also broken (stdbuf 32 bits, but libstdbuf 64 bits) and test_stdbuf::test_libstdbuf_preload of the i686 builds in github CI serves as regression
test for this issue, no need to add a cross-rs test for aarch64.
- The x86_64 musl build of stdbuf was also broken and was passing tests in CI only because it was compiled with the wrong libc (glibc instead of musl)
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
This test verifies that libstdbuf correctly gets preloaded, and that there are no architecture mismatch errors.
At the moment the test passes when compiled normally, but fails when compiled with cross-rs, due to https://github.com/uutils/coreutils/issues/6591
This passes:
```
cargo test --features stdbuf test_stdbuf::test_libstdbuf_preload -- --nocapture
```
This fails:
```
cross test --target aarch64-unknown-linux-gnu --features stdbuf test_stdbuf::test_libstdbuf_preload -- --nocapture
```
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
* stdbuf: remove crash! macro
* stdbuf: change target_vendor back to apple
* tests/stdbuf: change stderr_only to usage_error in test_stdbuf_invalid_mode_fails
* stdbuf: add exit code to check_option
* stdbuf: remove set_exit_code line from error