1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-21 15:04:11 -05:00

fix: android support (#19437)

<!--
Before submitting a PR, please read https://deno.com/manual/contributing

1. Give the PR a descriptive title.

  Examples of good title:
    - fix(std/http): Fix race condition in server
    - docs(console): Update docstrings
    - feat(doc): Handle nested reexports

  Examples of bad title:
    - fix #7123
    - update docs
    - fix bugs

2. Ensure there is a related issue and it is referenced in the PR text.
3. Ensure there are tests that cover the changes.
4. Ensure `cargo test` passes.
5. Ensure `./tools/format.js` passes without changing files.
6. Ensure `./tools/lint.js` passes.
7. Open as a draft PR if your work is still in progress. The CI won't
run
   all steps, but you can add '[ci]' to a commit message to force it to.
8. If you would like to run the benchmarks on the CI, add the 'ci-bench'
label.
-->

---------

Signed-off-by: Matt Mastracci <matthew@mastracci.com>
Co-authored-by: Matt Mastracci <matthew@mastracci.com>
This commit is contained in:
cions 2024-01-10 22:04:14 +09:00 committed by GitHub
parent 1bafde9cd0
commit 881a62869d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 69 additions and 24 deletions

View file

@ -374,13 +374,16 @@ fn main() {
panic!("Cross compiling with snapshot is not supported.");
}
let symbols_path = std::path::Path::new("napi").join(
format!("generated_symbol_exports_list_{}.def", env::consts::OS).as_str(),
)
.canonicalize()
.expect(
"Missing symbols list! Generate using tools/napi/generate_symbols_lists.js",
);
let symbols_file_name = match env::consts::OS {
"android" => "generated_symbol_exports_list_linux.def".to_string(),
os => format!("generated_symbol_exports_list_{}.def", os),
};
let symbols_path = std::path::Path::new("napi")
.join(symbols_file_name)
.canonicalize()
.expect(
"Missing symbols list! Generate using tools/napi/generate_symbols_lists.js",
);
#[cfg(target_os = "windows")]
println!(
@ -413,6 +416,12 @@ fn main() {
}
}
#[cfg(target_os = "android")]
println!(
"cargo:rustc-link-arg-bin=deno=-Wl,--export-dynamic-symbol-list={}",
symbols_path.display()
);
// To debug snapshot issues uncomment:
// op_fetch_asset::trace_serializer();

View file

@ -5933,7 +5933,7 @@ fn lsp_completions() {
json!({
"label": "build",
"kind": 6,
"detail": "const Deno.build: {\n target: string;\n arch: \"x86_64\" | \"aarch64\";\n os: \"darwin\" | \"linux\" | \"windows\" | \"freebsd\" | \"netbsd\" | \"aix\" | \"solaris\" | \"illumos\";\n vendor: string;\n env?: string | undefined;\n}",
"detail": "const Deno.build: {\n target: string;\n arch: \"x86_64\" | \"aarch64\";\n os: \"darwin\" | \"linux\" | \"android\" | \"windows\" | \"freebsd\" | \"netbsd\" | \"aix\" | \"solaris\" | \"illumos\";\n vendor: string;\n env?: string | undefined;\n}",
"documentation": {
"kind": "markdown",
"value": "Information related to the build of the current Deno runtime.\n\nUsers are discouraged from code branching based on this information, as\nassumptions about what is available in what build environment might change\nover time. Developers should specifically sniff out the features they\nintend to use.\n\nThe intended use for the information is for logging and debugging purposes.\n\n*@category* - Runtime Environment"

View file

@ -4958,6 +4958,7 @@ declare namespace Deno {
os:
| "darwin"
| "linux"
| "android"
| "windows"
| "freebsd"
| "netbsd"

View file

@ -260,7 +260,7 @@ function createByteStruct(types) {
// types can be "date", "bool" or "u64".
let offset = 0;
let str =
'const unix = Deno.build.os === "darwin" || Deno.build.os === "linux" || Deno.build.os === "openbsd" || Deno.build.os === "freebsd"; return {';
'const unix = Deno.build.os === "darwin" || Deno.build.os === "linux" || Deno.build.os === "android" || Deno.build.os === "openbsd" || Deno.build.os === "freebsd"; return {';
const typeEntries = ObjectEntries(types);
for (let i = 0; i < typeEntries.length; ++i) {
let { 0: name, 1: type } = typeEntries[i];
@ -325,8 +325,11 @@ const { 0: statStruct, 1: statBuf } = createByteStruct({
});
function parseFileInfo(response) {
const unix = core.build.os === "darwin" || core.build.os === "linux" ||
core.build.os === "freebsd" || core.build.os === "openbsd";
const unix = core.build.os === "darwin" ||
core.build.os === "linux" ||
core.build.os === "android" ||
core.build.os === "freebsd" ||
core.build.os === "openbsd";
return {
isFile: response.isFile,
isDirectory: response.isDirectory,

View file

@ -62,7 +62,7 @@ impl FileSystem for RealFs {
let _ = umask(prev);
prev
};
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
{
Ok(r.bits())
}

View file

@ -378,7 +378,7 @@ where
#[cfg(not(windows))]
socket.set_reuse_address(true)?;
if reuse_port {
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
socket.set_reuse_port(true)?;
}
let socket_addr = socket2::SockAddr::from(addr);
@ -429,7 +429,11 @@ where
// are different from the BSDs: it _shares_ the port rather than steal it
// from the current listener. While useful, it's not something we can
// emulate on other platforms so we don't enable it.
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(any(
target_os = "windows",
target_os = "android",
target_os = "linux"
))]
socket_tmp.set_reuse_address(true)?;
#[cfg(all(unix, not(target_os = "linux")))]
socket_tmp.set_reuse_port(true)?;

View file

@ -471,7 +471,7 @@ where
#[cfg(not(windows))]
socket.set_reuse_address(true)?;
if args.reuse_port {
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
socket.set_reuse_port(true)?;
}
let socket_addr = socket2::SockAddr::from(bind_addr);

View file

@ -236,7 +236,7 @@ pub fn cpu_info() -> Option<Vec<CpuInfo>> {
}
}
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
pub fn cpu_info() -> Option<Vec<CpuInfo>> {
use std::io::BufRead;

View file

@ -3,9 +3,15 @@
import { core } from "ext:core/mod.js";
const ops = core.ops;
export type OSType = "windows" | "linux" | "darwin" | "freebsd" | "openbsd";
export type OSType =
| "windows"
| "linux"
| "android"
| "darwin"
| "freebsd"
| "openbsd";
export const osType: OSType = ops.op_node_build_os();
export const isWindows = osType === "windows";
export const isLinux = osType === "linux";
export const isLinux = osType === "linux" || osType === "android";

View file

@ -330,7 +330,7 @@ if (buildOs === "darwin") {
PRIORITY_HIGHEST: -20,
},
};
} else if (buildOs === "linux") {
} else if (buildOs === "linux" || buildOs === "android") {
os = {
UV_UDP_REUSEADDR: 4,
dlopen: {

View file

@ -494,6 +494,8 @@ export const errorMap = new Map<number, [string, string]>(
? codeToErrorDarwin
: osType === "linux"
? codeToErrorLinux
: osType === "android"
? codeToErrorLinux
: osType === "freebsd"
? codeToErrorFreebsd
: osType === "openbsd"
@ -508,6 +510,8 @@ export const codeMap = new Map<string, number>(
? errorToCodeDarwin
: osType === "linux"
? errorToCodeLinux
: osType === "android"
? errorToCodeLinux
: osType === "freebsd"
? errorToCodeFreebsd
: osType === "openbsd"

View file

@ -151,7 +151,7 @@ export function endianness(): "BE" | "LE" {
/** Return free memory amount */
export function freemem(): number {
if (Deno.build.os === "linux") {
if (Deno.build.os === "linux" || Deno.build.os == "android") {
// On linux, use 'available' memory
// https://github.com/libuv/libuv/blob/a5c01d4de3695e9d9da34cfd643b5ff0ba582ea7/src/unix/linux.c#L2064
return Deno.systemMemoryInfo().available;
@ -176,6 +176,7 @@ export function homedir(): string | null {
case "windows":
return Deno.env.get("USERPROFILE") || null;
case "linux":
case "android":
case "darwin":
case "freebsd":
case "openbsd":
@ -310,6 +311,7 @@ export function type(): string {
case "windows":
return "Windows_NT";
case "linux":
case "android":
return "Linux";
case "darwin":
return "Darwin";

View file

@ -320,7 +320,7 @@ fn op_runtime_memory_usage(scope: &mut v8::HandleScope) -> MemoryUsage {
}
}
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
fn rss() -> usize {
// Inspired by https://github.com/Arc-blroth/memory-stats/blob/5364d0d09143de2a470d33161b2330914228fde9/src/linux.rs

View file

@ -6,7 +6,7 @@ type LoadAvg = (f64, f64, f64);
const DEFAULT_LOADAVG: LoadAvg = (0.0, 0.0, 0.0);
pub fn loadavg() -> LoadAvg {
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
{
use libc::SI_LOAD_SHIFT;
@ -57,6 +57,22 @@ pub fn os_release() -> String {
_ => String::from(""),
}
}
#[cfg(target_os = "android")]
{
let mut info = std::mem::MaybeUninit::uninit();
// SAFETY: `info` is a valid pointer to a `libc::utsname` struct.
let res = unsafe { libc::uname(info.as_mut_ptr()) };
if res != 0 {
return String::from("");
}
// SAFETY: `uname` returns 0 on success, and `info` is initialized.
let mut info = unsafe { info.assume_init() };
let len = info.release.len();
info.release[len - 1] = 0;
// SAFETY: `info.release` is a valid pointer and NUL-terminated.
let c_str = unsafe { std::ffi::CStr::from_ptr(info.release.as_ptr()) };
c_str.to_string_lossy().into_owned()
}
#[cfg(any(
target_vendor = "apple",
target_os = "freebsd",
@ -198,7 +214,7 @@ pub fn mem_info() -> Option<MemInfo> {
swap_total: 0,
swap_free: 0,
};
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
{
let mut info = std::mem::MaybeUninit::uninit();
// SAFETY: `info` is a valid pointer to a `libc::sysinfo` struct.
@ -343,7 +359,7 @@ pub fn mem_info() -> Option<MemInfo> {
pub fn os_uptime() -> u64 {
let uptime: u64;
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "android", target_os = "linux"))]
{
let mut info = std::mem::MaybeUninit::uninit();
// SAFETY: `info` is a valid pointer to a `libc::sysinfo` struct.