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

Revert "refactor(build): better handle old glibc (#16238)"

This reverts commit fa22956a86.
This commit is contained in:
Divy Srivastava 2022-10-16 10:43:59 +05:30 committed by GitHub
parent 7d78f58187
commit f18fa728e3
12 changed files with 61 additions and 350 deletions

10
Cargo.lock generated
View file

@ -843,7 +843,6 @@ dependencies = [
"flaky_test", "flaky_test",
"flate2", "flate2",
"fwdansi", "fwdansi",
"glibc_version",
"google-storage1", "google-storage1",
"http", "http",
"import_map", "import_map",
@ -2048,15 +2047,6 @@ dependencies = [
"polyval", "polyval",
] ]
[[package]]
name = "glibc_version"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "803ff7635f1ab4e2c064b68a0c60da917d3d18dc8d086130f689d62ce4f1c33e"
dependencies = [
"regex",
]
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.0" version = "0.3.0"

View file

@ -43,7 +43,6 @@ regex = "=1.6.0"
serde = { version = "=1.0.144", features = ["derive"] } serde = { version = "=1.0.144", features = ["derive"] }
serde_json = "1.0.64" serde_json = "1.0.64"
zstd = '=0.11.2' zstd = '=0.11.2'
glibc_version = "0.1.2"
[target.'cfg(windows)'.build-dependencies] [target.'cfg(windows)'.build-dependencies]
winapi = "=0.3.9" winapi = "=0.3.9"

View file

@ -332,40 +332,56 @@ fn main() {
panic!("Cross compiling with snapshot is not supported."); panic!("Cross compiling with snapshot is not supported.");
} }
let symbols_path = std::path::Path::new(
format!("generated_symbol_exports_list_{}.def", env::consts::OS).as_str(),
)
.canonicalize()
.expect(
"Missing symbols list! Generate using tools/napi/generate_symbols_lists.js",
);
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
println!( println!(
"cargo:rustc-link-arg-bin=deno=/DEF:{}", "cargo:rustc-link-arg-bin=deno=/DEF:{}",
symbols_path.display() std::path::Path::new("exports.def")
.canonicalize()
.expect(
"Missing exports.def! Generate using tools/napi/generate_link_win.js"
)
.display(),
); );
#[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)]
struct Symbols {
symbols: Vec<String>,
}
let symbols_json =
std::fs::read_to_string("./napi_sym/symbol_exports.json").expect(
"Missing ./napi_sym/symbol_exports.json! This is a bug in napi_sym",
);
let symbols: Symbols = serde_json::from_str(&symbols_json)
.expect("./napi_sym/symbol_exports.json is not valid JSON");
// Don't export all symbols into the dynamic symbol table. -rdynamic exports *all* symbols introducing binary bloat.
// We only need to export Node API symbols.
for symbol in symbols.symbols {
// TODO(@littledivy): We _might_ hit an argument size limit?
// Maybe use `--export-dynamic-symbol-list` / `--exported_symbols_list` instead? https://reviews.llvm.org/D107317
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
println!( println!(
"cargo:rustc-link-arg-bin=deno=-Wl,-exported_symbols_list,{}", "cargo:rustc-link-arg-bin=deno=-Wl,-exported_symbol,_{}",
symbols_path.display() symbol
); );
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{
let ver = glibc_version::get_version().unwrap();
if ver.major <= 2 && ver.minor < 35 {
println!("cargo:warning=Compiling with all symbols exported, this will result in a larger binary. Please use glibc 2.35 or later for an optimised build.");
println!("cargo:rustc-link-arg-bin=deno=-rdynamic");
} else {
println!( println!(
"cargo:rustc-link-arg-bin=deno=-Wl,--export-dynamic-symbol-list={}", "cargo:rustc-link-arg-bin=deno=-Wl,--export-dynamic-symbol={}",
symbols_path.display() symbol
); );
} }
} }
// 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: // To debug snapshot issues uncomment:
// op_fetch_asset::trace_serializer(); // op_fetch_asset::trace_serializer();

View file

@ -1,144 +0,0 @@
node_api_create_syntax_error
napi_make_callback
napi_has_named_property
napi_async_destroy
napi_coerce_to_object
napi_get_arraybuffer_info
napi_detach_arraybuffer
napi_get_undefined
napi_reference_unref
napi_fatal_error
napi_open_callback_scope
napi_close_callback_scope
napi_get_value_uint32
napi_create_function
napi_create_arraybuffer
napi_get_value_int64
napi_get_all_property_names
napi_resolve_deferred
napi_is_detached_arraybuffer
napi_create_string_utf8
napi_create_threadsafe_function
node_api_throw_syntax_error
napi_create_bigint_int64
napi_wrap
napi_set_property
napi_get_value_bigint_int64
napi_open_handle_scope
napi_create_error
napi_create_buffer
napi_cancel_async_work
napi_is_exception_pending
napi_acquire_threadsafe_function
napi_create_external
napi_get_threadsafe_function_context
napi_get_null
napi_create_string_utf16
napi_get_value_bigint_uint64
napi_module_register
napi_is_typedarray
napi_create_external_buffer
napi_get_new_target
napi_get_instance_data
napi_close_handle_scope
napi_get_value_string_utf16
napi_get_property_names
napi_is_arraybuffer
napi_get_cb_info
napi_define_properties
napi_add_env_cleanup_hook
node_api_get_module_file_name
napi_get_node_version
napi_create_int64
napi_create_double
napi_get_and_clear_last_exception
napi_create_reference
napi_get_typedarray_info
napi_call_threadsafe_function
napi_get_last_error_info
napi_create_array_with_length
napi_coerce_to_number
napi_get_global
napi_is_error
napi_set_instance_data
napi_create_typedarray
napi_throw_type_error
napi_has_property
napi_get_value_external
napi_create_range_error
napi_typeof
napi_ref_threadsafe_function
napi_create_bigint_uint64
napi_get_prototype
napi_adjust_external_memory
napi_release_threadsafe_function
napi_delete_async_work
napi_create_string_latin1
napi_is_array
napi_unref_threadsafe_function
napi_throw_error
napi_has_own_property
napi_get_reference_value
napi_remove_env_cleanup_hook
napi_get_value_string_utf8
napi_is_promise
napi_get_boolean
napi_run_script
napi_get_element
napi_get_named_property
napi_get_buffer_info
napi_get_value_bool
napi_reference_ref
napi_create_object
napi_create_promise
napi_create_int32
napi_escape_handle
napi_open_escapable_handle_scope
napi_throw
napi_get_value_double
napi_set_named_property
napi_call_function
napi_create_date
napi_object_freeze
napi_get_uv_event_loop
napi_get_value_string_latin1
napi_reject_deferred
napi_add_finalizer
napi_create_array
napi_delete_reference
napi_get_date_value
napi_create_dataview
napi_get_version
napi_define_class
napi_is_date
napi_remove_wrap
napi_delete_property
napi_instanceof
napi_create_buffer_copy
napi_delete_element
napi_object_seal
napi_queue_async_work
napi_get_value_bigint_words
napi_is_buffer
napi_get_array_length
napi_get_property
napi_new_instance
napi_set_element
napi_create_bigint_words
napi_strict_equals
napi_is_dataview
napi_close_escapable_handle_scope
napi_get_dataview_info
napi_get_value_int32
napi_unwrap
napi_throw_range_error
napi_coerce_to_bool
napi_create_uint32
napi_has_element
napi_create_external_arraybuffer
napi_create_symbol
napi_coerce_to_string
napi_create_type_error
napi_fatal_exception
napi_create_async_work
napi_async_init

View file

@ -1,144 +0,0 @@
_node_api_create_syntax_error
_napi_make_callback
_napi_has_named_property
_napi_async_destroy
_napi_coerce_to_object
_napi_get_arraybuffer_info
_napi_detach_arraybuffer
_napi_get_undefined
_napi_reference_unref
_napi_fatal_error
_napi_open_callback_scope
_napi_close_callback_scope
_napi_get_value_uint32
_napi_create_function
_napi_create_arraybuffer
_napi_get_value_int64
_napi_get_all_property_names
_napi_resolve_deferred
_napi_is_detached_arraybuffer
_napi_create_string_utf8
_napi_create_threadsafe_function
_node_api_throw_syntax_error
_napi_create_bigint_int64
_napi_wrap
_napi_set_property
_napi_get_value_bigint_int64
_napi_open_handle_scope
_napi_create_error
_napi_create_buffer
_napi_cancel_async_work
_napi_is_exception_pending
_napi_acquire_threadsafe_function
_napi_create_external
_napi_get_threadsafe_function_context
_napi_get_null
_napi_create_string_utf16
_napi_get_value_bigint_uint64
_napi_module_register
_napi_is_typedarray
_napi_create_external_buffer
_napi_get_new_target
_napi_get_instance_data
_napi_close_handle_scope
_napi_get_value_string_utf16
_napi_get_property_names
_napi_is_arraybuffer
_napi_get_cb_info
_napi_define_properties
_napi_add_env_cleanup_hook
_node_api_get_module_file_name
_napi_get_node_version
_napi_create_int64
_napi_create_double
_napi_get_and_clear_last_exception
_napi_create_reference
_napi_get_typedarray_info
_napi_call_threadsafe_function
_napi_get_last_error_info
_napi_create_array_with_length
_napi_coerce_to_number
_napi_get_global
_napi_is_error
_napi_set_instance_data
_napi_create_typedarray
_napi_throw_type_error
_napi_has_property
_napi_get_value_external
_napi_create_range_error
_napi_typeof
_napi_ref_threadsafe_function
_napi_create_bigint_uint64
_napi_get_prototype
_napi_adjust_external_memory
_napi_release_threadsafe_function
_napi_delete_async_work
_napi_create_string_latin1
_napi_is_array
_napi_unref_threadsafe_function
_napi_throw_error
_napi_has_own_property
_napi_get_reference_value
_napi_remove_env_cleanup_hook
_napi_get_value_string_utf8
_napi_is_promise
_napi_get_boolean
_napi_run_script
_napi_get_element
_napi_get_named_property
_napi_get_buffer_info
_napi_get_value_bool
_napi_reference_ref
_napi_create_object
_napi_create_promise
_napi_create_int32
_napi_escape_handle
_napi_open_escapable_handle_scope
_napi_throw
_napi_get_value_double
_napi_set_named_property
_napi_call_function
_napi_create_date
_napi_object_freeze
_napi_get_uv_event_loop
_napi_get_value_string_latin1
_napi_reject_deferred
_napi_add_finalizer
_napi_create_array
_napi_delete_reference
_napi_get_date_value
_napi_create_dataview
_napi_get_version
_napi_define_class
_napi_is_date
_napi_remove_wrap
_napi_delete_property
_napi_instanceof
_napi_create_buffer_copy
_napi_delete_element
_napi_object_seal
_napi_queue_async_work
_napi_get_value_bigint_words
_napi_is_buffer
_napi_get_array_length
_napi_get_property
_napi_new_instance
_napi_set_element
_napi_create_bigint_words
_napi_strict_equals
_napi_is_dataview
_napi_close_escapable_handle_scope
_napi_get_dataview_info
_napi_get_value_int32
_napi_unwrap
_napi_throw_range_error
_napi_coerce_to_bool
_napi_create_uint32
_napi_has_element
_napi_create_external_arraybuffer
_napi_create_symbol
_napi_coerce_to_string
_napi_create_type_error
_napi_fatal_exception
_napi_create_async_work
_napi_async_init

View file

@ -44,10 +44,10 @@ pub fn napi_get_boolean(
} }
``` ```
Update the generated symbol lists using the script: Update the Windows `.def` file using the script:
``` ```
deno run --allow-write tools/napi/generate_symbols_lists.js deno run --allow-write tools/napi/generate_link_win.js
``` ```
Add a test in [`/test_napi`](../../test_napi/). You can also refer to Node.js Add a test in [`/test_napi`](../../test_napi/). You can also refer to Node.js

View file

@ -7,13 +7,13 @@
//! Symbols to be exported are now defined in this JSON file. //! Symbols to be exported are now defined in this JSON file.
//! The `#[napi_sym]` macro checks for missing entries and panics. //! The `#[napi_sym]` macro checks for missing entries and panics.
//! //!
//! `./tools/napi/generate_symbols_list.js` is used to generate the LINK `cli/exports.def` on Windows, //! `./tools/napi/generate_link_win.js` is used to generate the LINK `cli/exports.def` on Windows,
//! which is also checked into git. //! which is also checked into git.
//! //!
//! To add a new napi function: //! To add a new napi function:
//! 1. Place `#[napi_sym]` on top of your implementation. //! 1. Place `#[napi_sym]` on top of your implementation.
//! 2. Add the function's identifier to this JSON list. //! 2. Add the function's identifier to this JSON list.
//! 3. Finally, run `./tools/napi/generate_symbols_list.js` to update `cli/generated_symbol_exports_list_*.def`. //! 3. Finally, run `./tools/napi/generate_link_win.js` to update `cli/exports.def`.
pub mod r#async; pub mod r#async;
pub mod env; pub mod env;

View file

@ -24,11 +24,11 @@ fn napi_get_boolean(
### `symbol_exports.json` ### `symbol_exports.json`
A file containing the symbols that need to be put into the executable's dynamic A file containing the symbols that need to be put into the exectable's dynamic
symbol table at link-time. symbol table at link-time.
This is done using `/DEF:` on Windows, `-exported_symbol,_` on macOS and This is done using `/DEF:` on Windows, `-exported_symbol,_` on macOS and
`--export-dynamic-symbol=` on Linux. See [`cli/build.rs`](../build.rs). `--export-dynamic-symbol=` on Linux. See [`cli/build.rs`](../build.rs).
On Windows, you need to generate the `.def` file by running On Windows, you need to generate the `.def` file by running
[`tools/napi/generate_symbols_lists.js`](../../tools/napi/generate_symbols_lists.js). [`tools/napi/generate_link_win.js`](../../tools/napi/generate_link_win.js).

View file

@ -130,7 +130,7 @@ pub fn init(env: napi_env, exports: napi_value) {
unsafe { unsafe {
napi_define_class( napi_define_class(
env, env,
"NapiObject\0".as_ptr() as *mut c_char, "NapiObject\0".as_ptr() as *mut i8,
usize::MAX, usize::MAX,
Some(NapiObject::new), Some(NapiObject::new),
ptr::null_mut(), ptr::null_mut(),

14
tools/napi/generate_link_win.js Executable file
View file

@ -0,0 +1,14 @@
#!/usr/bin/env -S deno run --unstable --allow-read --allow-write
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
import exports from "../../cli/napi_sym/symbol_exports.json" assert {
type: "json",
};
let def = "LIBRARY\nEXPORTS\n";
for (const symbol of exports.symbols) {
def += ` ${symbol}\n`;
}
const defUrl = new URL("../../cli/exports.def", import.meta.url);
await Deno.writeTextFile(defUrl.pathname, def, { create: true });

View file

@ -1,20 +0,0 @@
#!/usr/bin/env -S deno run --unstable --allow-read --allow-write
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
import exports from "../../cli/napi_sym/symbol_exports.json" assert {
type: "json",
};
for await (const os of ["linux", "macos", "windows"]) {
let def = os === "windows" ? "LIBRARY\nEXPORTS\n" : "";
const prefix = os === "windows" ? " " : os === "macos" ? "_" : "";
for (const symbol of exports.symbols) {
def += `${prefix}${symbol}\n`;
}
const defUrl = new URL(
`../../cli/generated_symbol_exports_list_${os}.def`,
import.meta.url,
);
await Deno.writeTextFile(defUrl.pathname, def, { create: true });
}