diff --git a/cli/build.rs b/cli/build.rs index f7efa8be7c..d3f428c508 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -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(); diff --git a/cli/tests/integration/lsp_tests.rs b/cli/tests/integration/lsp_tests.rs index 3053b2e64a..c287df5cdf 100644 --- a/cli/tests/integration/lsp_tests.rs +++ b/cli/tests/integration/lsp_tests.rs @@ -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" diff --git a/cli/tsc/dts/lib.deno.ns.d.ts b/cli/tsc/dts/lib.deno.ns.d.ts index 6d0b9e6243..9740668b39 100644 --- a/cli/tsc/dts/lib.deno.ns.d.ts +++ b/cli/tsc/dts/lib.deno.ns.d.ts @@ -4958,6 +4958,7 @@ declare namespace Deno { os: | "darwin" | "linux" + | "android" | "windows" | "freebsd" | "netbsd" diff --git a/ext/fs/30_fs.js b/ext/fs/30_fs.js index b0d3beeda4..3b4392006a 100644 --- a/ext/fs/30_fs.js +++ b/ext/fs/30_fs.js @@ -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, diff --git a/ext/fs/std_fs.rs b/ext/fs/std_fs.rs index d528793943..bb8d114a06 100644 --- a/ext/fs/std_fs.rs +++ b/ext/fs/std_fs.rs @@ -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()) } diff --git a/ext/net/ops.rs b/ext/net/ops.rs index 728c42bf68..4b24529355 100644 --- a/ext/net/ops.rs +++ b/ext/net/ops.rs @@ -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)?; diff --git a/ext/net/ops_tls.rs b/ext/net/ops_tls.rs index c0043c8958..a364439775 100644 --- a/ext/net/ops_tls.rs +++ b/ext/net/ops_tls.rs @@ -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); diff --git a/ext/node/ops/os/cpus.rs b/ext/node/ops/os/cpus.rs index 5db9299617..6c852dce7c 100644 --- a/ext/node/ops/os/cpus.rs +++ b/ext/node/ops/os/cpus.rs @@ -236,7 +236,7 @@ pub fn cpu_info() -> Option> { } } -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "android", target_os = "linux"))] pub fn cpu_info() -> Option> { use std::io::BufRead; diff --git a/ext/node/polyfills/_util/os.ts b/ext/node/polyfills/_util/os.ts index 2c01d5c6ec..239419d910 100644 --- a/ext/node/polyfills/_util/os.ts +++ b/ext/node/polyfills/_util/os.ts @@ -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"; diff --git a/ext/node/polyfills/internal_binding/constants.ts b/ext/node/polyfills/internal_binding/constants.ts index cb66ac5bd6..69a2dffeb8 100644 --- a/ext/node/polyfills/internal_binding/constants.ts +++ b/ext/node/polyfills/internal_binding/constants.ts @@ -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: { diff --git a/ext/node/polyfills/internal_binding/uv.ts b/ext/node/polyfills/internal_binding/uv.ts index 08315b0947..aa468a0a58 100644 --- a/ext/node/polyfills/internal_binding/uv.ts +++ b/ext/node/polyfills/internal_binding/uv.ts @@ -494,6 +494,8 @@ export const errorMap = new Map( ? codeToErrorDarwin : osType === "linux" ? codeToErrorLinux + : osType === "android" + ? codeToErrorLinux : osType === "freebsd" ? codeToErrorFreebsd : osType === "openbsd" @@ -508,6 +510,8 @@ export const codeMap = new Map( ? errorToCodeDarwin : osType === "linux" ? errorToCodeLinux + : osType === "android" + ? errorToCodeLinux : osType === "freebsd" ? errorToCodeFreebsd : osType === "openbsd" diff --git a/ext/node/polyfills/os.ts b/ext/node/polyfills/os.ts index af3e69d64a..5d354b38bf 100644 --- a/ext/node/polyfills/os.ts +++ b/ext/node/polyfills/os.ts @@ -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"; diff --git a/runtime/ops/os/mod.rs b/runtime/ops/os/mod.rs index ef98a7990b..7260308d53 100644 --- a/runtime/ops/os/mod.rs +++ b/runtime/ops/os/mod.rs @@ -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 diff --git a/runtime/ops/os/sys_info.rs b/runtime/ops/os/sys_info.rs index c735ab5ca0..40cdc52fae 100644 --- a/runtime/ops/os/sys_info.rs +++ b/runtime/ops/os/sys_info.rs @@ -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 { 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 { 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.