Use external libstdbuf.so when building with make, as embedding the library
is only needed to work around "cargo install" limitations with shared libraries.
Also change default installation directory to /usr/local/libexec/coreutils/ for consistency
with GNU coreutils
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
Use external libstdbuf.so when building with make, as embedding the library
is only needed to work around "cargo install" limitations with shared libraries.
Also change default installation directory to /usr/local/libexec/coreutils/ for consistency
with GNU coreutils
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
Fixes https://github.com/uutils/coreutils/issues/6591
"feat_external_stdbuf": use an external libstdbuf.so for stdbuf instead of embedding it into
the stdbuf binary.
There are 2 use-cases:
1. Installation of uutils-coreutils using cargo install (e.g. from crates.io
which supports only "cargo install" as installation method). In this case,
installing libstdbuf.so is impossible, because "cargo install" installs
only binary programs (no cdylib), thus libstdbuf.so must be embedded into
stdbuf and written to /tmp at runtime. This is a hack, and may not work
on some platforms, e.g. because the SELinux permissions may not allow
stdbuf to write to /tmp, /tmp may be read-only, libstdbuf.so may not work
at all without SELinux labels, etc.
2. Installation of uutils-coreutils using an external tool, e.g. dpkg/apt on
debian. In this case, libstdbuf.so should be installed separately to its
correct location and the environment variable LIBSTDBUF_PATH configures the
installation path during the build. E.g. LIBSTDBUF_PATH="/lib/libstdbuf.so"
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
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 prevents unnecessary rebuilds when mixing runs of `cargo clippy` and other
cargo commands (e.g., `cargo c && cargo clippy && cargo c` no longer rebuilds).