Closed sonwh98 closed 2 years ago
it seems it was fixed with this PR https://github.com/rust-lang/rust/pull/85806
however, it doesn't seem to work for me. I'm running
rustc 1.56.1 (59eed8a2a 2021-11-01)
@sonwh98 thanks for the report. I'm sorry that I haven't much to advise: it looks like you're running into a Rust-specific issue with the very modern NDK version you're trying to use, and not something to do with rust-android-gradle
. If your project does compile fine without the plugin, you could try to narrow down the exact cargo
commands failing and how rust-android-gradle
is impacting the cargo
environment.
If you do get to the bottom of this, please let us know what's going on in this ticket!
@ncalexan I think there maybe a problem with calling the script make_standalone_toolchain.py
This script is obsolete according to this document. https://developer.android.com/ndk/guides/standalone_toolchain
@ncalexan I think there maybe a problem with calling the script make_standalone_toolchain.py
This script is obsolete according to this document. https://developer.android.com/ndk/guides/standalone_toolchain
Indeed. And I see that the pre-built toolchains are not yet default: https://github.com/mozilla/rust-android-gradle#prebuilttoolchains. Could you try with the pre-built toolchains and see if this is still an issue? We might mutate this ticket to be "make pre-built the default".
@ncalexan actually make_standalone_toolchain.py
is never called. The problem is NDK 23.1.7779620 has stop distributing libgcc . I got around this by hacking linker-wrapper.py to statically linking libgcc.a from NDK 22.1.7171670
args.remove("-lgcc")
args.append("/home/sto/android/ndk/22.1.7171670/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a")
published this plugin locally with
gradle publishToMavenLocal
then rebuild my project with
gradle cargoBuild
then tested it with
sto@big:~/workspace/gossipy$ adb push ./app/src/main/rust/target/armv7-linux-androideabi/debug/hello-rust /data/local/tmp
./app/src/main/rust/target/armv7-linux-androideabi/debug/hello-rust: 1 file pushed, 0 skipped. 250.7 MB/s (3264536 bytes in 0.012s)
sto@big:~/workspace/gossipy$ adb shell /data/local/tmp/hello-rust
Hello, rust world!
is there a better way to do this? the plugin should have a way of including static libraries
there should also be an option to change the linker-wrapper.py to not link -lgcc and use static version instead
linker-wrapper.py
just passes through the arguments its given. So it's the cargo
invocation that needs to be fixed: that's what determines those arguments.
It's not a good idea to allow monkeying with those arguments (any more than we do in linker-wrapper.py
, I guess). Again, you need to track down where the mismatches are here and fix them at the Rust layer. This isn't a rust-android-gradle
issue (AFAICT).
This isn't a rust-android-gradle issue (AFAICT)
@ncalexan rustc is invoked with this param
-C linker=/home/sto/workspace/gossipy/build/linker-wrapper/linker-wrapper.sh
linker-wrapper.py is called from linker-wrapper.sh . Is there a way the plugin allows me to over ride -C linker with my own custom shell script?
No, I don't think we have a method to change the linker wrapper. In fact, we'd like to remove it: see #49, IIRC.
Again: don't solve this by monkeying with these plugin details. Fix the problem at the right level, which is teaching cargo
and the NDK toolchain and the specific packages you're using (backtrace
, it looks like) to know what the right libraries.
I am new to Rust and Cargo. Can you give some guidance?
It seems libgcc is a required dependency and its linked as a shared library but since the latest NDK has stop distributing libgcc linking it as a shared library will fail. libgcc.a from an previous version of NDK should be used to statically link to satisfy rust dependency.
The logic is if NDK version "23.1.7779620" is used, statically link libgcc
Or remove libgcc as a dependency in Rust. Why is Rust dependent on gcc? it can't be built using LLVM?
This could be challenging to address. If you look at the Rust patch, it's actually patching one of the build scripts: https://github.com/rust-lang/rust/pull/85806/commits/965997b369a3c5c46e998e522333aadb7881237b. The first thing to do is to dig into the build failures you're seeing and figure out which build scripts is injecting the -lgcc
argument. It's that dependency (or possibly those dependencies) that need to be bumped.
Can you share the underlying Rust project? I may be able to help you track down what's asking for libgcc
. As to why... it's because libgcc
implements stack unwinding in a general way. IIRC, clang
uses it itself, but don't quote me on that.
@ncalexan https://github.com/sonwh98/gossipy/tree/master/app/src/main/rust
its just a simple hello world just to test
thanks for any help!
@ncalexan https://github.com/sonwh98/gossipy/tree/master/app/src/main/rust
its just a simple hello world just to test
Yeah, no dependencies at all! Isn't the question then: why not use an NDK that Rust supports? Can you set ndkVersion = "22.1.7171670"
and simplify your life?
yes its possible. I am just experimenting . I have a solution by hacking the python script if i need to use the latest NDK. However, Rust should work with the latest NDK. Rust is an official supported language for developing android right?
yes its possible. I am just experimenting . I have a solution by hacking the python script if i need to use the latest NDK. However, Rust should work with the latest NDK. Rust is an official supported language for developing android right?
What does that even mean? Google (or AOSP) gives no support for building Android applications that I am aware of. Rust does support targeting Android, but the android-*
platforms are Tier 2: https://doc.rust-lang.org/nightly/rustc/platform-support.html.
You're at the bleeding edge and bleeding. I suggest you move back from the edge. In any case, there is no indication that this is a rust-android-gradle
issue.
What does that even mean? Google (or AOSP) gives no support for building Android applications that I am aware of
https://source.android.com/setup/build/rust/building-rust-modules/overview
What does that even mean? Google (or AOSP) gives no support for building Android applications that I am aware of
https://source.android.com/setup/build/rust/building-rust-modules/overview
TIL! All very new, and very cool.
@ncalexan can this plugin support modern NDK version (e.g. 23r version)?
@mercurydaihui no. the most recently supported NDK is 22.1.7171670
with NDK 23 and greater, libgcc has to be statically linked because libgcc has been removed from NDK 23.
if you must use NDK 23+, see my work around by hacking the python script https://github.com/mozilla/rust-android-gradle/issues/75#issuecomment-964368185 . Its not recommended but it worked for me
@ncalexan can this plugin support modern NDK version (e.g. 23r version)?
Following up to what @sonwh98 said -- thanks, Sonny! -- there's nothing specific to the plugin in the NDK 23 failures you are seeing. Once Rust works with NDK 23, the plugin should work too.
I am just trying to get a simple hello world to compile with gradle. there's no linking with java
but running
gradle cargoBuild
results in
note: ld: error: unable to find library -lgcc
Cargo.toml
app/build.gradle
My output-bin-hello-rust