From c858e254948f261940fd35b83039e7aa4d17538e Mon Sep 17 00:00:00 2001 From: Gatefixer <313497061+lancedb-gatefixer[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 04:48:31 +0000 Subject: [PATCH] fix(node): enforce x86-64-v2 artifact baseline --- nodejs/.cargo/config.toml | 7 +++++-- nodejs/build.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/nodejs/.cargo/config.toml b/nodejs/.cargo/config.toml index c2f1a2a91..c59e407f7 100644 --- a/nodejs/.cargo/config.toml +++ b/nodejs/.cargo/config.toml @@ -1,11 +1,14 @@ # Keep Node's Linux x64 addons compatible with pre-Haswell CPUs. # lance-linalg dispatches hot vector kernels to newer SIMD tiers at runtime. +[env] +LANCEDB_NODE_ENFORCE_X86_64_V2 = "1" + [target.x86_64-unknown-linux-gnu] rustflags = [ "-C", "target-cpu=x86-64-v2", "-C", - "target-feature=-avx2,-fma,-f16c", + "target-feature=-avx,-avx2,-fma,-f16c", ] # Preserve the workspace's dynamic C runtime configuration for musl. @@ -14,5 +17,5 @@ rustflags = [ "-C", "target-cpu=x86-64-v2", "-C", - "target-feature=-crt-static,-avx2,-fma,-f16c", + "target-feature=-crt-static,-avx,-avx2,-fma,-f16c", ] diff --git a/nodejs/build.rs b/nodejs/build.rs index a5c27e88d..17d24b9ba 100644 --- a/nodejs/build.rs +++ b/nodejs/build.rs @@ -3,6 +3,35 @@ extern crate napi_build; +use std::env; + +const ENFORCE_BASELINE: &str = "LANCEDB_NODE_ENFORCE_X86_64_V2"; +const UNSUPPORTED_FEATURES: [&str; 4] = ["avx", "avx2", "fma", "f16c"]; + fn main() { napi_build::setup(); + println!("cargo:rerun-if-env-changed={ENFORCE_BASELINE}"); + + let is_linux_x64 = env::var("CARGO_CFG_TARGET_ARCH").as_deref() == Ok("x86_64") + && env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("linux"); + let is_release = env::var("PROFILE").as_deref() == Ok("release"); + let is_node_build = env::var(ENFORCE_BASELINE).as_deref() == Ok("1"); + + if !is_linux_x64 || (!is_release && !is_node_build) { + return; + } + + let target_features = env::var("CARGO_CFG_TARGET_FEATURE").unwrap_or_default(); + let enabled_features = target_features.split(',').collect::>(); + let leaked_features = UNSUPPORTED_FEATURES + .iter() + .filter(|feature| enabled_features.contains(feature)) + .copied() + .collect::>(); + + assert!( + leaked_features.is_empty(), + "Linux x64 Node addons must use the x86-64-v2 baseline; unsupported target features: {}", + leaked_features.join(", ") + ); }