From a2488ae79200abfcbad0f0f8b084a3ff8e183880 Mon Sep 17 00:00:00 2001 From: Luke Channings <461449+LukeChannings@users.noreply.github.com> Date: Mon, 10 Oct 2022 03:29:31 +0100 Subject: [PATCH] fix(npm): support compiling on linux/aarch64 (#16208) Changes introduced in #13633 have broken the ability to compile for linux/aarch64 - specifically the use of a `i8` as a char type, which is an `u8` on linux/aarch64. This PR: - Replaces instances of `i8` with the architecture-aware wrapper type `c_char` - Skips the use of `--export-dynamic-symbol` on linux-aarch64, because the target environments often rely on older libc/binutils versions --- cli/bench/http.rs | 3 +++ cli/build.rs | 9 ++++++++- cli/napi/env.rs | 3 ++- test_napi/src/async.rs | 4 ++-- test_napi/src/lib.rs | 2 +- test_napi/src/object_wrap.rs | 4 ++-- test_napi/src/properties.rs | 9 +++++---- third_party | 2 +- 8 files changed, 24 insertions(+), 12 deletions(-) diff --git a/cli/bench/http.rs b/cli/bench/http.rs index 0af2b5393a..a656ee7087 100644 --- a/cli/bench/http.rs +++ b/cli/bench/http.rs @@ -67,6 +67,9 @@ pub fn benchmark( #[cfg(target_vendor = "apple")] #[cfg(target_arch = "aarch64")] let bun_exe = test_util::prebuilt_tool_path("bun-aarch64"); + #[cfg(target_os = "linux")] + #[cfg(target_arch = "aarch64")] + let bun_exe = test_util::prebuilt_tool_path("bun-aarch64"); // bun res.insert( diff --git a/cli/build.rs b/cli/build.rs index 77c95fb17b..0d683780f2 100644 --- a/cli/build.rs +++ b/cli/build.rs @@ -343,7 +343,10 @@ fn main() { .display(), ); - #[cfg(not(target_os = "windows"))] + #[cfg(all( + not(target_os = "windows"), + not(all(target_os = "linux", target_arch = "aarch64")) + ))] { // Load the symbols file generated by the `napi_sym` macro. #[derive(serde::Deserialize)] @@ -375,6 +378,10 @@ fn main() { } } + // Linux + aarch64 does not support a glibc version that supports `--export-dynamic-symbol`. + #[cfg(all(target_os = "linux", target_arch = "aarch64"))] + println!("cargo:rustc-link-arg-bin=deno=-rdynamic"); + // To debug snapshot issues uncomment: // op_fetch_asset::trace_serializer(); diff --git a/cli/napi/env.rs b/cli/napi/env.rs index 24dc8af81e..df9af522fe 100644 --- a/cli/napi/env.rs +++ b/cli/napi/env.rs @@ -1,6 +1,7 @@ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. use deno_runtime::deno_napi::*; +use std::os::raw::c_char; /// # Safety /// @@ -125,7 +126,7 @@ const NODE_VERSION: napi_node_version = napi_node_version { major: 17, minor: 4, patch: 0, - release: "Deno\0".as_ptr() as *const i8, + release: "Deno\0".as_ptr() as *const c_char, }; #[napi_sym::napi_sym] diff --git a/test_napi/src/async.rs b/test_napi/src/async.rs index d14871a7cd..53432de7cb 100644 --- a/test_napi/src/async.rs +++ b/test_napi/src/async.rs @@ -3,7 +3,7 @@ use napi_sys::Status::napi_ok; use napi_sys::ValueType::napi_function; use napi_sys::*; -use std::os::raw::c_void; +use std::os::raw::{c_char, c_void}; use std::ptr; pub struct Baton { @@ -62,7 +62,7 @@ extern "C" fn test_async_work( unsafe { napi_create_string_utf8( env, - "test_async_resource\0".as_ptr() as *const i8, + "test_async_resource\0".as_ptr() as *const c_char, usize::MAX, &mut resource_name, ) diff --git a/test_napi/src/lib.rs b/test_napi/src/lib.rs index dd0c7cbed2..569256a0b1 100644 --- a/test_napi/src/lib.rs +++ b/test_napi/src/lib.rs @@ -42,7 +42,7 @@ macro_rules! get_callback_info { macro_rules! new_property { ($env: expr, $name: expr, $value: expr) => { napi_property_descriptor { - utf8name: $name.as_ptr() as *const i8, + utf8name: $name.as_ptr() as *const std::os::raw::c_char, name: ptr::null_mut(), method: Some($value), getter: None, diff --git a/test_napi/src/object_wrap.rs b/test_napi/src/object_wrap.rs index 3b849b2dca..a38f97c9cd 100644 --- a/test_napi/src/object_wrap.rs +++ b/test_napi/src/object_wrap.rs @@ -3,7 +3,7 @@ use napi_sys::Status::napi_ok; use napi_sys::ValueType::napi_number; use napi_sys::*; -use std::os::raw::c_void; +use std::os::raw::{c_char, c_void}; use std::ptr; pub struct NapiObject { @@ -146,7 +146,7 @@ pub fn init(env: napi_env, exports: napi_value) { napi_set_named_property( env, exports, - "NapiObject\0".as_ptr() as *const i8, + "NapiObject\0".as_ptr() as *const c_char, cons, ) } == napi_ok diff --git a/test_napi/src/properties.rs b/test_napi/src/properties.rs index 89d95d6c6b..b245fd61d4 100644 --- a/test_napi/src/properties.rs +++ b/test_napi/src/properties.rs @@ -3,6 +3,7 @@ use napi_sys::PropertyAttributes::*; use napi_sys::Status::napi_ok; use napi_sys::*; +use std::os::raw::c_char; use std::ptr; pub fn init(env: napi_env, exports: napi_value) { @@ -15,7 +16,7 @@ pub fn init(env: napi_env, exports: napi_value) { unsafe { napi_create_string_utf8( env, - "key_v8_string".as_ptr() as *const i8, + "key_v8_string".as_ptr() as *const c_char, usize::MAX, &mut name_value, ) @@ -29,7 +30,7 @@ pub fn init(env: napi_env, exports: napi_value) { unsafe { napi_create_string_utf8( env, - "key_v8_symbol".as_ptr() as *const i8, + "key_v8_symbol".as_ptr() as *const c_char, usize::MAX, &mut symbol_description, ) @@ -42,7 +43,7 @@ pub fn init(env: napi_env, exports: napi_value) { let properties = &[ napi_property_descriptor { - utf8name: "test_property_rw\0".as_ptr() as *const i8, + utf8name: "test_property_rw\0".as_ptr() as *const c_char, name: ptr::null_mut(), method: None, getter: None, @@ -52,7 +53,7 @@ pub fn init(env: napi_env, exports: napi_value) { value: number, }, napi_property_descriptor { - utf8name: "test_property_r\0".as_ptr() as *const i8, + utf8name: "test_property_r\0".as_ptr() as *const c_char, name: ptr::null_mut(), method: None, getter: None, diff --git a/third_party b/third_party index 9f314cefb5..17fd391b8f 160000 --- a/third_party +++ b/third_party @@ -1 +1 @@ -Subproject commit 9f314cefb507e3b9de08edc6046353e4012279fc +Subproject commit 17fd391b8f305d1e74ce7508c824176f09ab63d0