summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcions <gh.cions@gmail.com>2024-01-10 22:04:14 +0900
committerGitHub <noreply@github.com>2024-01-10 06:04:14 -0700
commit881a62869db13199eff30231d4299d36faf143df (patch)
treee739decaa38309910485c0808b25df9a1e560534
parent1bafde9cd03f42f490cf0e6e504a5606ac6b634e (diff)
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>
-rw-r--r--cli/build.rs23
-rw-r--r--cli/tests/integration/lsp_tests.rs2
-rw-r--r--cli/tsc/dts/lib.deno.ns.d.ts1
-rw-r--r--ext/fs/30_fs.js9
-rw-r--r--ext/fs/std_fs.rs2
-rw-r--r--ext/net/ops.rs8
-rw-r--r--ext/net/ops_tls.rs2
-rw-r--r--ext/node/ops/os/cpus.rs2
-rw-r--r--ext/node/polyfills/_util/os.ts10
-rw-r--r--ext/node/polyfills/internal_binding/constants.ts2
-rw-r--r--ext/node/polyfills/internal_binding/uv.ts4
-rw-r--r--ext/node/polyfills/os.ts4
-rw-r--r--runtime/ops/os/mod.rs2
-rw-r--r--runtime/ops/os/sys_info.rs22
14 files changed, 69 insertions, 24 deletions
diff --git a/cli/build.rs b/cli/build.rs
index f7efa8be7..d3f428c50 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 3053b2e64..c287df5cd 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 6d0b9e624..9740668b3 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 b0d3beeda..3b4392006 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 d52879394..bb8d114a0 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 728c42bf6..4b2452935 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 c0043c895..a36443977 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 5db929961..6c852dce7 100644
--- a/ext/node/ops/os/cpus.rs
+++ b/ext/node/ops/os/cpus.rs
@@ -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;
diff --git a/ext/node/polyfills/_util/os.ts b/ext/node/polyfills/_util/os.ts
index 2c01d5c6e..239419d91 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 cb66ac5bd..69a2dffeb 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 08315b094..aa468a0a5 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<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"
diff --git a/ext/node/polyfills/os.ts b/ext/node/polyfills/os.ts
index af3e69d64..5d354b38b 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 ef98a7990..7260308d5 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 c735ab5ca..40cdc52fa 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<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.