diff --git a/.cargo/config.toml b/.cargo/config.toml index fd372c95b84..8291bf467e4 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -21,5 +21,6 @@ checkout = true list_files = true internal_use_git2 = false -[env] -CARGO_WORKSPACE_DIR = { value = "", relative = true } +# Avoid globally injecting a checkout-specific workspace path. The version build script +# resolves the absolute workspace path from layout at build time; set CARGO_WORKSPACE_DIR +# explicitly when this repo is built as a submodule. diff --git a/src/common/meta/AGENTS.md b/src/common/meta/AGENTS.md index 3684f8f9db3..6c9710b9e45 100644 --- a/src/common/meta/AGENTS.md +++ b/src/common/meta/AGENTS.md @@ -41,3 +41,12 @@ cargo nextest run -p common-meta ``` Backend-specific coverage may also need `pg_kvbackend` or `mysql_kvbackend`. + +`test_util::etcd_certs_dir` and `test_util::test_certs_dir` resolve fixture +certificates using `CARGO_MANIFEST_DIR` at **run time** (`std::env::var`, not `env!`). +`cargo nextest run` sets it; direct test-binary execution requires setting the +variable to the crate directory. Run this example from the repository root: + +```bash +CARGO_MANIFEST_DIR="$PWD/src/common/meta" ./target/debug/deps/ +``` diff --git a/src/common/meta/src/test_util.rs b/src/common/meta/src/test_util.rs index 1009bc1c99a..d78dc815d09 100644 --- a/src/common/meta/src/test_util.rs +++ b/src/common/meta/src/test_util.rs @@ -322,8 +322,8 @@ macro_rules! maybe_skip_etcd_tls_integration_test { /// Returns the directory of the etcd TLS certs. pub fn etcd_certs_dir() -> PathBuf { - let project_path = env!("CARGO_MANIFEST_DIR"); - let project_path = PathBuf::from(project_path); + let project_path = + PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set")); let base = project_path.ancestors().nth(3).unwrap(); base.join("tests-integration") .join("fixtures") @@ -332,8 +332,8 @@ pub fn etcd_certs_dir() -> PathBuf { /// Returns the directory of the test certs. pub fn test_certs_dir() -> PathBuf { - let project_path = env!("CARGO_MANIFEST_DIR"); - let project_path = PathBuf::from(project_path); + let project_path = + PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set")); let base = project_path.ancestors().nth(3).unwrap(); base.join("tests-integration") .join("fixtures") diff --git a/src/common/version/build.rs b/src/common/version/build.rs index 81c805484b4..2037f826616 100644 --- a/src/common/version/build.rs +++ b/src/common/version/build.rs @@ -30,12 +30,21 @@ fn main() -> Result<(), Box> { println!("cargo:rerun-if-env-changed=RUSTC"); println!("cargo:rerun-if-env-changed=GREPTIME_PRODUCT_NAME"); + println!("cargo:rerun-if-env-changed=CARGO_WORKSPACE_DIR"); - // The "CARGO_WORKSPACE_DIR" is set manually (not by Rust itself) in Cargo config file, to - // solve the problem where the "CARGO_MANIFEST_DIR" is not what we want when this repo is - // made as a submodule in another repo. - let workspace_dir = - env::var("CARGO_WORKSPACE_DIR").or_else(|_| env::var("CARGO_MANIFEST_DIR"))?; + // Resolve the workspace root from CARGO_MANIFEST_DIR (this crate is + // src/common/version, three levels below the root). The path remains absolute + // and is used at build time. CARGO_WORKSPACE_DIR remains an explicit override + // for submodule builds; see https://github.com/rust-lang/cargo/issues/3946. + let workspace_dir = match env::var("CARGO_WORKSPACE_DIR") { + Ok(dir) if !dir.is_empty() => dir, + _ => env::var("CARGO_MANIFEST_DIR").map(|dir| { + PathBuf::from(dir) + .join("../../..") + .to_string_lossy() + .into_owned() + })?, + }; let workspace_root = PathBuf::from(&workspace_dir); println!( "cargo:rerun-if-changed={}", diff --git a/src/servers/AGENTS.md b/src/servers/AGENTS.md index d20704cf616..c3b712d3924 100644 --- a/src/servers/AGENTS.md +++ b/src/servers/AGENTS.md @@ -43,3 +43,13 @@ cargo nextest run -p servers Keep protocol translation here and permissions/database behavior in frontend. Async table batching returns storage-completion futures with its early acknowledgements. Keep completion reporting independent of the caller's lifetime. + +`prom_remote_write/decode.rs` and `benches/prom_decode.rs` resolve +`benches/write_request.pb.data` using `CARGO_MANIFEST_DIR` at **run time** +(`std::env::var`, not `env!`). `cargo nextest run` and `cargo bench` set it; +direct test/benchmark-binary execution requires setting it to the crate directory. +Run this example from the repository root: + +```bash +CARGO_MANIFEST_DIR="$PWD/src/servers" ./target/debug/deps/ +``` diff --git a/src/servers/benches/prom_decode.rs b/src/servers/benches/prom_decode.rs index 1cdc7d3782e..bbca7a4269f 100644 --- a/src/servers/benches/prom_decode.rs +++ b/src/servers/benches/prom_decode.rs @@ -27,7 +27,9 @@ use servers::prom_remote_write::validation::{PromValidationMode, validate_label_ use servers::prom_store::to_grpc_row_insert_requests; fn load_fixture_v1_bytes() -> Vec { - let mut d = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let mut d = std::path::PathBuf::from( + std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"), + ); d.push("benches"); d.push("write_request.pb.data"); std::fs::read(d).expect("read write_request.pb.data fixture") diff --git a/src/servers/src/prom_remote_write/decode.rs b/src/servers/src/prom_remote_write/decode.rs index 6f635c7caf1..f7324b4be6e 100644 --- a/src/servers/src/prom_remote_write/decode.rs +++ b/src/servers/src/prom_remote_write/decode.rs @@ -448,7 +448,9 @@ mod tests { #[test] fn test_decode_write_request() { - let mut d = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let mut d = std::path::PathBuf::from( + std::env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"), + ); d.push("benches"); d.push("write_request.pb.data"); let data = std::fs::read(d).unwrap();