-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
stdbuf: fix cross-compilation #7972
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
22ae62b
to
b73f9be
Compare
GNU testsuite comparison:
|
b73f9be
to
bea271b
Compare
GNU testsuite comparison:
|
5c306bb
to
da00ce9
Compare
70112e5
to
58228b7
Compare
GNU testsuite comparison:
|
58228b7
to
21d8570
Compare
21d8570
to
7861de9
Compare
GNU testsuite comparison:
|
34c6d3f
to
379478b
Compare
GNU testsuite comparison:
|
254a667
to
bc9c169
Compare
GNU testsuite comparison:
|
bf115e3
to
de124c7
Compare
GNU testsuite comparison:
|
de124c7
to
82f0bda
Compare
GNU testsuite comparison:
|
73b509f
to
5fa7727
Compare
GNU testsuite comparison:
|
5fa7727
to
b091393
Compare
@sylvestre the branch should be ready for review. There is some intermittent issue with the CI jobs not related to the branch, but everything except cargo-deny was green before my latest rebase. My last commit fixes the cargo-deny error. |
ff73bdf
to
73c2fb0
Compare
GNU testsuite comparison:
|
73c2fb0
to
cf83d01
Compare
GNU testsuite comparison:
|
// for include_bytes!(..."/libstdbuf.so") to work. | ||
// In the future, "bindeps" should be used to simplify the code and avoid the manual cargo call, | ||
// however this is available only in cargo nightly at the moment. | ||
let mut cmd = Command::new(&cargo); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i really don't like Command calls, they are to debug, can break dependencies analysis, etc :(
about bindeps, could you please add a link to the issue? thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it is ugly, but I haven't found a more elegant solution :-/
I was surprised that cargo does not support something like bindeps yet. It seems quite a basic requirement to be able to say "build A before B".
I added a link to rust-lang/cargo#9096 in the comment.
At least the good thing is that once bindeps is stabilized, the Command call can be removed, and something like this added to the Cargo.toml of stdbuf:
[dependencies]
libstdbuf = { ..., artifact = "cdylib" }
cf83d01
to
bf8abac
Compare
GNU testsuite comparison:
|
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 uutils#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 <[email protected]>
Summary: Partial fix for uutils#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 <[email protected]>
bf8abac
to
35634b4
Compare
GNU testsuite comparison:
|
I am not very happy with the command but I don't have a better solution to propose. Let's see if it sticks. |
Commit 2:
Commit 1: