std: Add compatibility with android-9
The Gecko folks currently use Android API level 9 for their builds, so they're requesting that we move back our minimum supported API level from 18 to 9. Turns out, ABI-wise at least, there's not that many changes we need to take care of. The `ftruncate64` API appeared in android-12 and the `log2` and `log2f` APIs appeared in android-18. We can have a simple shim for `ftruncate64` which falls back on `ftruncate` and the `log2` function can be approximated with just `ln(f) / ln(2)`. This should at least get the standard library building on API level 9, although the tests aren't quite happening there just yet. As we seem to be growing a number of Android compatibility shims, they're now centralized in a common `sys::android` module.
This commit is contained in:
parent
cfae4dea87
commit
c31e2e77ed
5 changed files with 138 additions and 36 deletions
|
@ -31,6 +31,7 @@ use ops::Neg;
|
|||
#[macro_use]
|
||||
pub mod weak;
|
||||
|
||||
pub mod android;
|
||||
pub mod backtrace;
|
||||
pub mod condvar;
|
||||
pub mod ext;
|
||||
|
@ -91,37 +92,8 @@ pub fn init() {
|
|||
unsafe fn reset_sigpipe() {}
|
||||
}
|
||||
|
||||
// Currently the minimum supported Android version of the standard library is
|
||||
// API level 18 (android-18). Back in those days [1] the `signal` function was
|
||||
// just an inline wrapper around `bsd_signal`, but starting in API level
|
||||
// android-20 the `signal` symbols was introduced [2]. Finally, in android-21
|
||||
// the API `bsd_signal` was removed [3].
|
||||
//
|
||||
// Basically this means that if we want to be binary compatible with multiple
|
||||
// Android releases (oldest being 18 and newest being 21) then we need to check
|
||||
// for both symbols and not actually link against either.
|
||||
//
|
||||
// Note that if we're not on android we just link against the `android` symbol
|
||||
// itself.
|
||||
//
|
||||
// [1]: https://chromium.googlesource.com/android_tools/+/20ee6d20/ndk/platforms
|
||||
// /android-18/arch-arm/usr/include/signal.h
|
||||
// [2]: https://chromium.googlesource.com/android_tools/+/fbd420/ndk_experimental
|
||||
// /platforms/android-20/arch-arm
|
||||
// /usr/include/signal.h
|
||||
// [3]: https://chromium.googlesource.com/android_tools/+/20ee6d/ndk/platforms
|
||||
// /android-21/arch-arm/usr/include/signal.h
|
||||
#[cfg(target_os = "android")]
|
||||
unsafe fn signal(signum: libc::c_int,
|
||||
handler: libc::sighandler_t) -> libc::sighandler_t {
|
||||
weak!(fn signal(libc::c_int, libc::sighandler_t) -> libc::sighandler_t);
|
||||
weak!(fn bsd_signal(libc::c_int, libc::sighandler_t) -> libc::sighandler_t);
|
||||
|
||||
let f = signal.get().or_else(|| bsd_signal.get());
|
||||
let f = f.expect("neither `signal` nor `bsd_signal` symbols found");
|
||||
f(signum, handler)
|
||||
}
|
||||
|
||||
pub use sys::android::signal;
|
||||
#[cfg(not(target_os = "android"))]
|
||||
pub use libc::signal;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue