diff --git a/Cargo.lock b/Cargo.lock index 6f1c9b9d..5d5297a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -951,7 +951,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fbuild-bench-fastled-examples" -version = "2.5.12" +version = "2.5.13" dependencies = [ "fbuild-core", "fbuild-library-select", @@ -965,7 +965,7 @@ dependencies = [ [[package]] name = "fbuild-build" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "blake3", @@ -1002,7 +1002,7 @@ dependencies = [ [[package]] name = "fbuild-build-arm" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "blake3", @@ -1036,7 +1036,7 @@ dependencies = [ [[package]] name = "fbuild-build-engine" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "blake3", @@ -1069,7 +1069,7 @@ dependencies = [ [[package]] name = "fbuild-build-esp" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "blake3", @@ -1103,7 +1103,7 @@ dependencies = [ [[package]] name = "fbuild-build-mcu" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "blake3", @@ -1137,7 +1137,7 @@ dependencies = [ [[package]] name = "fbuild-cli" -version = "2.5.12" +version = "2.5.13" dependencies = [ "blake3", "clap", @@ -1170,7 +1170,7 @@ dependencies = [ [[package]] name = "fbuild-config" -version = "2.5.12" +version = "2.5.13" dependencies = [ "fbuild-core", "fbuild-paths", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "fbuild-core" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "fs2", @@ -1206,7 +1206,7 @@ dependencies = [ [[package]] name = "fbuild-daemon" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "axum", @@ -1246,7 +1246,7 @@ dependencies = [ [[package]] name = "fbuild-deploy" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "espflash", @@ -1275,7 +1275,7 @@ dependencies = [ [[package]] name = "fbuild-header-scan" -version = "2.5.12" +version = "2.5.13" dependencies = [ "criterion", "fbuild-paths", @@ -1286,7 +1286,7 @@ dependencies = [ [[package]] name = "fbuild-library" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "axum", @@ -1316,7 +1316,7 @@ dependencies = [ [[package]] name = "fbuild-library-select" -version = "2.5.12" +version = "2.5.13" dependencies = [ "bincode", "blake3", @@ -1336,7 +1336,7 @@ dependencies = [ [[package]] name = "fbuild-packages" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "axum", @@ -1368,7 +1368,7 @@ dependencies = [ [[package]] name = "fbuild-packages-fetch" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "axum", @@ -1397,7 +1397,7 @@ dependencies = [ [[package]] name = "fbuild-paths" -version = "2.5.12" +version = "2.5.13" dependencies = [ "fbuild-core", "serde", @@ -1408,7 +1408,7 @@ dependencies = [ [[package]] name = "fbuild-python" -version = "2.5.12" +version = "2.5.13" dependencies = [ "base64", "fbuild-core", @@ -1430,7 +1430,7 @@ dependencies = [ [[package]] name = "fbuild-serial" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "base64", @@ -1454,7 +1454,7 @@ dependencies = [ [[package]] name = "fbuild-test-support" -version = "2.5.12" +version = "2.5.13" dependencies = [ "fbuild-config", "fbuild-core", @@ -1474,7 +1474,7 @@ dependencies = [ [[package]] name = "fbuild-toolchain" -version = "2.5.12" +version = "2.5.13" dependencies = [ "async-trait", "axum", diff --git a/Cargo.toml b/Cargo.toml index c4d072f7..0116f00b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -69,7 +69,7 @@ exclude = [ libraries = [{ path = "dylints/*" }] [workspace.package] -version = "2.5.12" +version = "2.5.13" edition = "2021" rust-version = "1.94.1" license = "MIT OR Apache-2.0" diff --git a/crates/fbuild-library/src/library/library_manager.rs b/crates/fbuild-library/src/library/library_manager.rs index 71fafd68..aa9fc8df 100644 --- a/crates/fbuild-library/src/library/library_manager.rs +++ b/crates/fbuild-library/src/library/library_manager.rs @@ -31,6 +31,36 @@ fn fallback_runtime() -> Result<&'static Runtime> { Ok(RT.get_or_init(|| rt)) } +/// Resolve a local dependency relative to its project and return a canonical +/// absolute root. Compiler invocations use a separate build directory as +/// their working directory, so preserving a relative `lib_deps` path here +/// would make its include directories resolve against the wrong directory. +fn resolve_local_library_dir(project_dir: &Path, local_path: &Path, name: &str) -> Result { + let lib_dir = if local_path.is_absolute() { + local_path.to_path_buf() + } else { + project_dir.join(local_path) + }; + if !lib_dir.is_dir() { + return Err(FbuildError::PackageError(format!( + "local library '{}' does not exist or is not a directory: {}", + name, + lib_dir.display() + ))); + } + lib_dir + .canonicalize() + .map(|path| fbuild_core::path::strip_unc_prefix(&path)) + .map_err(|e| { + FbuildError::PackageError(format!( + "failed to canonicalize local library '{}': {} ({})", + name, + lib_dir.display(), + e + )) + }) +} + /// Result of library resolution and compilation. pub struct LibraryResult { /// All include directories from all libraries (for compiler `-I` flags). @@ -97,18 +127,7 @@ pub async fn ensure_libraries( > = tokio::task::JoinSet::new(); for spec in &specs { if let Some(local_path) = &spec.local_path { - let lib_dir = if local_path.is_absolute() { - local_path.clone() - } else { - project_dir.join(local_path) - }; - if !lib_dir.is_dir() { - return Err(FbuildError::PackageError(format!( - "local library '{}' does not exist or is not a directory: {}", - spec.name, - lib_dir.display() - ))); - } + let lib_dir = resolve_local_library_dir(project_dir, local_path, &spec.name)?; let sanitized = spec.sanitized_name(); installed.push(InstalledLibrary::with_build_dir( &lib_dir, @@ -413,15 +432,16 @@ mod tests { } #[test] - fn test_named_local_symlink_adds_include_dir() { + fn test_named_relative_local_symlink_adds_include_dir() { let tmp = tempfile::TempDir::new().unwrap(); - let local = tmp.path().join("local"); + let project = tmp.path().join("project"); + let local = project.join("local"); let local_src = local.join("src"); std::fs::create_dir_all(&local_src).unwrap(); std::fs::write(local_src.join("Local.h"), "").unwrap(); let libs_dir = tmp.path().join("build").join("libs"); let result = ensure_libraries_sync( - &[format!("Local=symlink://{}", local.display())], + &["Local=symlink://local".to_string()], &[], Path::new("/gcc"), Path::new("/g++"), @@ -429,7 +449,7 @@ mod tests { &[], &[], &[], - tmp.path(), + &project, &libs_dir, false, 1, diff --git a/pyproject.toml b/pyproject.toml index 355a89eb..2bc3d62d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "fbuild" -version = "2.5.12" +version = "2.5.13" description = "PlatformIO-compatible embedded build tool (Rust implementation)" readme = "README.md" requires-python = ">=3.10"