From 6f3dd93a6894a35227c0280442e2d1a80ffd0ce9 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Sun, 18 Jan 2026 17:09:27 -0800 Subject: [PATCH 1/2] Add integration test for external relative path deps (issue #3089) This test reproduces the bug where crate_universe fails when a Cargo workspace member has a path dependency pointing outside the Cargo workspace root (but still inside the Bazel workspace). The test is expected to fail until the bug is fixed. --- .bazelci/presubmit.yml | 6 + .../external_relative_path_deps/.bazelversion | 1 + .../external_relative_path_deps/.gitignore | 1 + .../external_relative_path_deps/BUILD.bazel | 1 + .../external_relative_path_deps/MODULE.bazel | 38 ++ .../MODULE.bazel.lock | 382 ++++++++++++++++++ .../external_relative_path_deps/README.md | 40 ++ .../WORKSPACE.bazel | 1 + .../cargo_workspace/BUILD.bazel | 4 + .../cargo_workspace/Cargo.lock | 14 + .../cargo_workspace/Cargo.toml | 3 + .../cargo_workspace/member/BUILD.bazel | 16 + .../cargo_workspace/member/Cargo.toml | 11 + .../cargo_workspace/member/src/lib.rs | 6 + .../external_crate/Cargo.toml | 6 + .../external_crate/src/lib.rs | 4 + 16 files changed, 534 insertions(+) create mode 100644 test/integration/external_relative_path_deps/.bazelversion create mode 100644 test/integration/external_relative_path_deps/.gitignore create mode 100644 test/integration/external_relative_path_deps/BUILD.bazel create mode 100644 test/integration/external_relative_path_deps/MODULE.bazel create mode 100644 test/integration/external_relative_path_deps/MODULE.bazel.lock create mode 100644 test/integration/external_relative_path_deps/README.md create mode 100644 test/integration/external_relative_path_deps/WORKSPACE.bazel create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/BUILD.bazel create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/Cargo.lock create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/Cargo.toml create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/member/BUILD.bazel create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/member/Cargo.toml create mode 100644 test/integration/external_relative_path_deps/cargo_workspace/member/src/lib.rs create mode 100644 test/integration/external_relative_path_deps/external_crate/Cargo.toml create mode 100644 test/integration/external_relative_path_deps/external_crate/src/lib.rs diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 6d07b7e2af..7766343a4d 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -658,6 +658,12 @@ tasks: build_targets: - "@rust_toolchains//:all" - "//..." + external_relative_path_deps: + name: External relative path deps (issue 3089) + platform: ubuntu2204 + working_directory: test/integration/external_relative_path_deps + build_targets: + - "//..." android_examples_ubuntu2204: name: Android Examples platform: ubuntu2204 diff --git a/test/integration/external_relative_path_deps/.bazelversion b/test/integration/external_relative_path_deps/.bazelversion new file mode 100644 index 0000000000..ae9a76b924 --- /dev/null +++ b/test/integration/external_relative_path_deps/.bazelversion @@ -0,0 +1 @@ +8.0.0 diff --git a/test/integration/external_relative_path_deps/.gitignore b/test/integration/external_relative_path_deps/.gitignore new file mode 100644 index 0000000000..a6ef824c1f --- /dev/null +++ b/test/integration/external_relative_path_deps/.gitignore @@ -0,0 +1 @@ +/bazel-* diff --git a/test/integration/external_relative_path_deps/BUILD.bazel b/test/integration/external_relative_path_deps/BUILD.bazel new file mode 100644 index 0000000000..820fa8f26d --- /dev/null +++ b/test/integration/external_relative_path_deps/BUILD.bazel @@ -0,0 +1 @@ +# Empty BUILD file for workspace root diff --git a/test/integration/external_relative_path_deps/MODULE.bazel b/test/integration/external_relative_path_deps/MODULE.bazel new file mode 100644 index 0000000000..e6da5e5f1e --- /dev/null +++ b/test/integration/external_relative_path_deps/MODULE.bazel @@ -0,0 +1,38 @@ +"""Test for external relative path dependencies (issue #3089)""" + +module( + name = "external_relative_path_deps_test", + version = "0.0.0", +) + +bazel_dep(name = "rules_rust", version = "0.0.0") +local_path_override( + module_name = "rules_rust", + path = "../../..", +) + +rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") +rust.toolchain(edition = "2021") +use_repo(rust, "rust_toolchains") + +register_toolchains("@rust_toolchains//:all") + +# Test: crate_universe with Cargo workspace where a member has a path dependency +# that goes OUTSIDE the Cargo workspace root (but still inside the Bazel workspace). +# +# Structure: +# external_crate/ <- Outside Cargo workspace +# cargo_workspace/ <- Cargo workspace root +# Cargo.toml <- [workspace] members = ["member"] +# member/ +# Cargo.toml <- external_crate = { path = "../../external_crate" } +# +# This should work but currently fails because crate_universe doesn't copy +# the external path dependency into the temp splicing directory. +crate = use_extension("@rules_rust//crate_universe:extensions.bzl", "crate") +crate.from_cargo( + name = "crates", + cargo_lockfile = "//cargo_workspace:Cargo.lock", + manifests = ["//cargo_workspace:Cargo.toml"], +) +use_repo(crate, "crates") diff --git a/test/integration/external_relative_path_deps/MODULE.bazel.lock b/test/integration/external_relative_path_deps/MODULE.bazel.lock new file mode 100644 index 0000000000..3f76cb589e --- /dev/null +++ b/test/integration/external_relative_path_deps/MODULE.bazel.lock @@ -0,0 +1,382 @@ +{ + "lockFileVersion": 16, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/apple_support/1.24.1/MODULE.bazel": "f46e8ddad60aef170ee92b2f3d00ef66c147ceafea68b6877cb45bd91737f5f8", + "https://bcr.bazel.build/modules/apple_support/1.24.1/source.json": "cf725267cbacc5f028ef13bb77e7f2c2e0066923a4dab1025e4a0511b1ed258a", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65", + "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", + "https://bcr.bazel.build/modules/bazel_features/1.32.0/MODULE.bazel": "095d67022a58cb20f7e20e1aefecfa65257a222c18a938e2914fd257b5f1ccdc", + "https://bcr.bazel.build/modules/bazel_features/1.32.0/source.json": "2546c766986a6541f0bacd3e8542a1f621e2b14a80ea9e88c6f89f7eedf64ae1", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/MODULE.bazel": "69ad6927098316848b34a9142bcc975e018ba27f08c4ff403f50c1b6e646ca67", + "https://bcr.bazel.build/modules/bazel_skylib/1.8.2/source.json": "34a3c8bcf233b835eb74be9d628899bb32999d3e0eadef1947a0a562a2b16ffb", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580", + "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.2.4/MODULE.bazel": "1ff1223dfd24f3ecf8f028446d4a27608aa43c3f41e346d22838a4223980b8cc", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/MODULE.bazel": "f1df20f0bf22c28192a794f29b501ee2018fa37a3862a1a2132ae2940a23a642", + "https://bcr.bazel.build/modules/rules_cc/0.2.8/source.json": "85087982aca15f31307bd52698316b28faa31bd2c3095a41f456afec0131344c", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", + "https://bcr.bazel.build/modules/rules_java/8.6.1/source.json": "f18d9ad3c4c54945bf422ad584fa6c5ca5b3116ff55a5b1bc77e5c1210be5960", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", + "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", + "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", + "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", + "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/MODULE.bazel": "72e76b0eea4e81611ef5452aa82b3da34caca0c8b7b5c0c9584338aa93bae26b", + "https://bcr.bazel.build/modules/rules_shell/0.6.1/source.json": "20ec05cd5e592055e214b2da8ccb283c7f2a421ea0dc2acbf1aa792e11c03d0c", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@rules_java+//java:rules_java_deps.bzl%compatibility_proxy": { + "general": { + "bzlTransitiveDigest": "84xJEZ1jnXXwo8BXMprvBm++rRt4jsTu9liBxz0ivps=", + "usagesDigest": "jTQDdLDxsS43zuRmg1faAjIEPWdLAbDAowI1pInQSoo=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "compatibility_proxy": { + "repoRuleId": "@@rules_java+//java:rules_java_deps.bzl%_compatibility_proxy_repo_rule", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_java+", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin+", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { + "general": { + "bzlTransitiveDigest": "h9wcsupr1TvM+IjSqO1m9hZWrBFbgwAqak9LCEhtav8=", + "usagesDigest": "oUK0ytEbfl+CaIzEjRqZCnsb5eUCZOx9usreQy09/3o=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "cargo_bazel_bootstrap": { + "repoRuleId": "@@rules_rust+//cargo/private:cargo_bootstrap.bzl%cargo_bootstrap_repository", + "attributes": { + "srcs": [ + "@@rules_rust+//crate_universe:src/api.rs", + "@@rules_rust+//crate_universe:src/api/lockfile.rs", + "@@rules_rust+//crate_universe:src/cli.rs", + "@@rules_rust+//crate_universe:src/cli/generate.rs", + "@@rules_rust+//crate_universe:src/cli/query.rs", + "@@rules_rust+//crate_universe:src/cli/render.rs", + "@@rules_rust+//crate_universe:src/cli/splice.rs", + "@@rules_rust+//crate_universe:src/cli/vendor.rs", + "@@rules_rust+//crate_universe:src/config.rs", + "@@rules_rust+//crate_universe:src/context.rs", + "@@rules_rust+//crate_universe:src/context/crate_context.rs", + "@@rules_rust+//crate_universe:src/context/platforms.rs", + "@@rules_rust+//crate_universe:src/lib.rs", + "@@rules_rust+//crate_universe:src/lockfile.rs", + "@@rules_rust+//crate_universe:src/main.rs", + "@@rules_rust+//crate_universe:src/metadata.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_bin.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_resolver.rs", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.bat", + "@@rules_rust+//crate_universe:src/metadata/cargo_tree_rustc_wrapper.sh", + "@@rules_rust+//crate_universe:src/metadata/dependency.rs", + "@@rules_rust+//crate_universe:src/metadata/metadata_annotation.rs", + "@@rules_rust+//crate_universe:src/rendering.rs", + "@@rules_rust+//crate_universe:src/rendering/template_engine.rs", + "@@rules_rust+//crate_universe:src/rendering/templates/module_bzl.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/header.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/aliases_map.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/deps_map.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_git.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/partials/module/repo_http.j2", + "@@rules_rust+//crate_universe:src/rendering/templates/vendor_module.j2", + "@@rules_rust+//crate_universe:src/rendering/verbatim/alias_rules.bzl", + "@@rules_rust+//crate_universe:src/select.rs", + "@@rules_rust+//crate_universe:src/splicing.rs", + "@@rules_rust+//crate_universe:src/splicing/cargo_config.rs", + "@@rules_rust+//crate_universe:src/splicing/crate_index_lookup.rs", + "@@rules_rust+//crate_universe:src/splicing/splicer.rs", + "@@rules_rust+//crate_universe:src/test.rs", + "@@rules_rust+//crate_universe:src/utils.rs", + "@@rules_rust+//crate_universe:src/utils/starlark.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/glob.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/label.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_dict.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_list.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_scalar.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/select_set.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/serialize.rs", + "@@rules_rust+//crate_universe:src/utils/starlark/target_compatible_with.rs", + "@@rules_rust+//crate_universe:src/utils/symlink.rs", + "@@rules_rust+//crate_universe:src/utils/target_triple.rs" + ], + "binary": "cargo-bazel", + "cargo_lockfile": "@@rules_rust+//crate_universe:Cargo.lock", + "cargo_toml": "@@rules_rust+//crate_universe:Cargo.toml", + "version": "1.86.0", + "timeout": 900, + "rust_toolchain_cargo_template": "@rust_host_tools//:bin/{tool}", + "rust_toolchain_rustc_template": "@rust_host_tools//:bin/{tool}", + "compressed_windows_toolchain_names": false + } + } + }, + "moduleExtensionMetadata": { + "explicitRootModuleDirectDeps": [ + "cargo_bazel_bootstrap" + ], + "explicitRootModuleDirectDevDeps": [], + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "bazel_features+", + "bazel_features_globals", + "bazel_features++version_extension+bazel_features_globals" + ], + [ + "bazel_features+", + "bazel_features_version", + "bazel_features++version_extension+bazel_features_version" + ], + [ + "rules_cc+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_cc+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "bazel_features", + "bazel_features+" + ], + [ + "rules_rust+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "rules_rust+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_rust+", + "cargo_bazel_bootstrap", + "rules_rust++cu_nr+cargo_bazel_bootstrap" + ], + [ + "rules_rust+", + "cui", + "rules_rust++cu+cui" + ], + [ + "rules_rust+", + "rrc", + "rules_rust++i2+rrc" + ], + [ + "rules_rust+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "rules_rust", + "rules_rust+" + ] + ] + } + } + } +} diff --git a/test/integration/external_relative_path_deps/README.md b/test/integration/external_relative_path_deps/README.md new file mode 100644 index 0000000000..6609bf7398 --- /dev/null +++ b/test/integration/external_relative_path_deps/README.md @@ -0,0 +1,40 @@ +# External Relative Path Dependencies Test (Issue #3089) + +This test validates that crate_universe correctly handles Cargo workspace members +with path dependencies that point **outside the Cargo workspace root** (but still +inside the Bazel workspace). + +## Structure + +``` +external_relative_path_deps/ # Bazel workspace root +├── MODULE.bazel +├── BUILD.bazel +├── external_crate/ # Outside Cargo workspace, inside Bazel workspace +│ ├── Cargo.toml +│ └── src/lib.rs +└── cargo_workspace/ # Cargo workspace root + ├── Cargo.toml # [workspace] with members = ["member"] + ├── Cargo.lock + └── member/ + ├── Cargo.toml # Has path = "../../external_crate" + └── src/lib.rs +``` + +## The Bug + +When `cargo_workspace/member/Cargo.toml` has: +```toml +[dependencies] +external_crate = { path = "../../external_crate" } +``` + +crate_universe fails because it doesn't copy `external_crate` into the temp +directory used for splicing. + +## Running the test + +```sh +cd test/integration/external_relative_path_deps +bazel build //cargo_workspace/member +``` diff --git a/test/integration/external_relative_path_deps/WORKSPACE.bazel b/test/integration/external_relative_path_deps/WORKSPACE.bazel new file mode 100644 index 0000000000..5e304c5b2b --- /dev/null +++ b/test/integration/external_relative_path_deps/WORKSPACE.bazel @@ -0,0 +1 @@ +# Empty WORKSPACE for Bazel compatibility diff --git a/test/integration/external_relative_path_deps/cargo_workspace/BUILD.bazel b/test/integration/external_relative_path_deps/cargo_workspace/BUILD.bazel new file mode 100644 index 0000000000..969e08488f --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/BUILD.bazel @@ -0,0 +1,4 @@ +exports_files([ + "Cargo.toml", + "Cargo.lock", +]) diff --git a/test/integration/external_relative_path_deps/cargo_workspace/Cargo.lock b/test/integration/external_relative_path_deps/cargo_workspace/Cargo.lock new file mode 100644 index 0000000000..72137c2db5 --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/Cargo.lock @@ -0,0 +1,14 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "external_crate" +version = "0.1.0" + +[[package]] +name = "member" +version = "0.1.0" +dependencies = [ + "external_crate", +] diff --git a/test/integration/external_relative_path_deps/cargo_workspace/Cargo.toml b/test/integration/external_relative_path_deps/cargo_workspace/Cargo.toml new file mode 100644 index 0000000000..515ce5ab6c --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +members = ["member"] +resolver = "2" diff --git a/test/integration/external_relative_path_deps/cargo_workspace/member/BUILD.bazel b/test/integration/external_relative_path_deps/cargo_workspace/member/BUILD.bazel new file mode 100644 index 0000000000..16ba0e1055 --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/member/BUILD.bazel @@ -0,0 +1,16 @@ +load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test") + +rust_library( + name = "member", + srcs = ["src/lib.rs"], + deps = [ + # The external_crate dependency should be resolved by crate_universe + # even though it's located outside the Cargo workspace via path = "../../external_crate" + "@crates//:external_crate", + ], +) + +rust_test( + name = "member_test", + crate = ":member", +) diff --git a/test/integration/external_relative_path_deps/cargo_workspace/member/Cargo.toml b/test/integration/external_relative_path_deps/cargo_workspace/member/Cargo.toml new file mode 100644 index 0000000000..fa32f4bbb8 --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/member/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "member" +version = "0.1.0" +edition = "2021" + +[lib] + +[dependencies] +# This path dependency goes OUTSIDE the Cargo workspace root. +# This is the scenario from issue #3089. +external_crate = { path = "../../external_crate" } diff --git a/test/integration/external_relative_path_deps/cargo_workspace/member/src/lib.rs b/test/integration/external_relative_path_deps/cargo_workspace/member/src/lib.rs new file mode 100644 index 0000000000..eab873163a --- /dev/null +++ b/test/integration/external_relative_path_deps/cargo_workspace/member/src/lib.rs @@ -0,0 +1,6 @@ +use external_crate; + +/// Re-exports the greeting from external_crate. +pub fn say_hello() -> &'static str { + external_crate::greet() +} diff --git a/test/integration/external_relative_path_deps/external_crate/Cargo.toml b/test/integration/external_relative_path_deps/external_crate/Cargo.toml new file mode 100644 index 0000000000..dfe317bef3 --- /dev/null +++ b/test/integration/external_relative_path_deps/external_crate/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "external_crate" +version = "0.1.0" +edition = "2021" + +[lib] diff --git a/test/integration/external_relative_path_deps/external_crate/src/lib.rs b/test/integration/external_relative_path_deps/external_crate/src/lib.rs new file mode 100644 index 0000000000..6f1c19bc03 --- /dev/null +++ b/test/integration/external_relative_path_deps/external_crate/src/lib.rs @@ -0,0 +1,4 @@ +/// Returns a greeting from the external crate. +pub fn greet() -> &'static str { + "Hello from external_crate!" +} From ef8bcc64e969ce0a04d5fef3daf7c0252b0d76d9 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Sun, 18 Jan 2026 17:21:59 -0800 Subject: [PATCH 2/2] Fix external relative path dependencies (issue #3089) When a Cargo workspace member has a path dependency pointing outside the Cargo workspace root (but still inside the Bazel workspace), crate_universe now correctly symlinks the external crate to the appropriate location in the temporary splicing directory. The fix: 1. Added symlink_external_path_deps() function in splicer.rs that extracts path dependencies from manifests and symlinks external ones 2. Call this function from splice_workspace and splice_package 3. Also call it from cargo_tree_resolver's copy_project_with_explicit_deps_on_all_transitive_proc_macros to handle the tree resolver's temp directory --- .../src/metadata/cargo_tree_resolver.rs | 51 +++++ crate_universe/src/splicing/splicer.rs | 212 ++++++++++++++++++ .../MODULE.bazel.lock | 98 ++++++++ .../external_crate/BUILD.bazel | 67 ++++++ 4 files changed, 428 insertions(+) create mode 100644 test/integration/external_relative_path_deps/external_crate/BUILD.bazel diff --git a/crate_universe/src/metadata/cargo_tree_resolver.rs b/crate_universe/src/metadata/cargo_tree_resolver.rs index e4f571e292..44e9061f87 100644 --- a/crate_universe/src/metadata/cargo_tree_resolver.rs +++ b/crate_universe/src/metadata/cargo_tree_resolver.rs @@ -16,6 +16,7 @@ use url::Url; use crate::config::CrateId; use crate::metadata::cargo_bin::Cargo; use crate::select::{Select, SelectableScalar}; +use crate::splicing::symlink_external_path_deps; use crate::utils::symlink::symlink; use crate::utils::target_triple::TargetTriple; @@ -515,6 +516,56 @@ impl TreeResolver { })?; } } + + // Handle external path dependencies in the root manifest and workspace members + let root_manifest = cargo_toml::Manifest::from_path(pristine_manifest_path.as_std_path()) + .with_context(|| { + format!( + "Failed to read manifest at {} for external path deps", + pristine_manifest_path + ) + })?; + + symlink_external_path_deps( + &root_manifest, + pristine_root.as_std_path(), + pristine_root.as_std_path(), + output_dir, + )?; + + // Handle workspace members + if let Some(workspace) = &root_manifest.workspace { + for member_glob in &workspace.members { + let member_paths = glob::glob(pristine_root.join(member_glob).as_str()) + .with_context(|| format!("Invalid glob pattern for workspace member: {}", member_glob))? + .filter_map(|r| r.ok()); + + for member_path in member_paths { + let member_manifest_path = if member_path.is_dir() { + member_path.join("Cargo.toml") + } else { + member_path + }; + + if member_manifest_path.exists() { + if let Ok(member_manifest) = + cargo_toml::Manifest::from_path(&member_manifest_path) + { + let member_dir = member_manifest_path + .parent() + .expect("Member manifest should have a parent directory"); + symlink_external_path_deps( + &member_manifest, + member_dir, + pristine_root.as_std_path(), + output_dir, + )?; + } + } + } + } + } + std::fs::copy( pristine_root.join("Cargo.lock"), output_dir.join("Cargo.lock"), diff --git a/crate_universe/src/splicing/splicer.rs b/crate_universe/src/splicing/splicer.rs index e465158d6e..5c418ba80e 100644 --- a/crate_universe/src/splicing/splicer.rs +++ b/crate_universe/src/splicing/splicer.rs @@ -165,6 +165,46 @@ impl<'a> SplicerKind<'a> { Some(IGNORE_LIST), )?; + // Handle external path dependencies in the root manifest + symlink_external_path_deps( + &manifest, + manifest_dir.as_std_path(), + manifest_dir.as_std_path(), + workspace_dir.as_std_path(), + )?; + + // Handle external path dependencies in workspace members + if let Some(workspace) = &manifest.workspace { + for member_glob in &workspace.members { + // Resolve glob patterns to actual paths + let member_paths = glob::glob(manifest_dir.join(member_glob).as_str()) + .with_context(|| format!("Invalid glob pattern for workspace member: {}", member_glob))? + .filter_map(|r| r.ok()); + + for member_path in member_paths { + let member_manifest_path = if member_path.is_dir() { + member_path.join("Cargo.toml") + } else { + member_path + }; + + if member_manifest_path.exists() { + if let Ok(member_manifest) = Manifest::from_path(&member_manifest_path) { + let member_dir = member_manifest_path + .parent() + .expect("Member manifest should have a parent directory"); + symlink_external_path_deps( + &member_manifest, + member_dir, + manifest_dir.as_std_path(), + workspace_dir.as_std_path(), + )?; + } + } + } + } + } + // Optionally install the cargo config after contents have been symlinked Self::setup_cargo_config(&splicing_manifest.cargo_config, workspace_dir.as_std_path())?; @@ -210,6 +250,14 @@ impl<'a> SplicerKind<'a> { Some(IGNORE_LIST), )?; + // Handle external path dependencies + symlink_external_path_deps( + manifest, + manifest_dir.as_std_path(), + manifest_dir.as_std_path(), + workspace_dir.as_std_path(), + )?; + // Optionally install the cargo config after contents have been symlinked Self::setup_cargo_config(&splicing_manifest.cargo_config, workspace_dir.as_std_path())?; @@ -618,6 +666,170 @@ pub(crate) fn write_manifest(path: &Path, manifest: &cargo_toml::Manifest) -> Re fs::write(path, content).context(format!("Failed to write manifest to {}", path.display())) } +/// Extract all path dependencies from a Cargo manifest's dependency map. +fn extract_path_deps_from_deps(deps: &cargo_toml::DepsSet) -> Vec { + deps.iter() + .filter_map(|(_, dep)| dep.detail().and_then(|d| d.path.clone())) + .collect() +} + +/// Extract all path dependencies from a manifest (dependencies, dev-dependencies, +/// build-dependencies, and patches). +fn extract_path_deps_from_manifest(manifest: &Manifest) -> Vec { + let mut paths = Vec::new(); + + // Regular dependencies + paths.extend(extract_path_deps_from_deps(&manifest.dependencies)); + + // Dev dependencies + paths.extend(extract_path_deps_from_deps(&manifest.dev_dependencies)); + + // Build dependencies + paths.extend(extract_path_deps_from_deps(&manifest.build_dependencies)); + + // Target-specific dependencies + for (_, target) in &manifest.target { + paths.extend(extract_path_deps_from_deps(&target.dependencies)); + paths.extend(extract_path_deps_from_deps(&target.dev_dependencies)); + paths.extend(extract_path_deps_from_deps(&target.build_dependencies)); + } + + // Patch sections + for (_, patches) in &manifest.patch { + paths.extend(extract_path_deps_from_deps(patches)); + } + + paths +} + +/// Symlink external path dependencies that are outside the workspace root. +/// +/// When a Cargo workspace member has a path dependency pointing outside the workspace +/// (e.g., `path = "../../external_crate"`), we need to symlink that external crate +/// into the spliced workspace at the same relative location. +pub(crate) fn symlink_external_path_deps( + manifest: &Manifest, + manifest_dir: &Path, + workspace_root: &Path, + dest_workspace_dir: &Path, +) -> Result<()> { + let path_deps = extract_path_deps_from_manifest(manifest); + + for path_dep in path_deps { + let path_dep_path = Path::new(&path_dep); + + // Skip absolute paths - they should work as-is + if path_dep_path.is_absolute() { + continue; + } + + // Compute the relative path from workspace_root to manifest_dir + // This tells us where the manifest is within the workspace + let manifest_rel_to_workspace = match pathdiff::diff_paths(manifest_dir, workspace_root) { + Some(p) => p, + None => continue, + }; + + // The resolved path relative to workspace_root + // e.g., if manifest is at workspace_root/member/ and path_dep is ../../external_crate, + // this gives member/../../external_crate which normalizes to ../external_crate + let resolved_rel_path = manifest_rel_to_workspace.join(path_dep_path); + + // Normalize the path by resolving .. components + let mut normalized_components = Vec::new(); + for component in resolved_rel_path.components() { + match component { + std::path::Component::ParentDir => { + if normalized_components + .last() + .map_or(false, |c| *c != std::path::Component::ParentDir) + { + normalized_components.pop(); + } else { + normalized_components.push(component); + } + } + std::path::Component::CurDir => {} + _ => normalized_components.push(component), + } + } + + // Check if the normalized path goes outside the workspace (starts with ..) + let is_external = normalized_components + .first() + .map_or(false, |c| *c == std::path::Component::ParentDir); + + if is_external { + // This is an external path dependency + // The dest_path is at the same relative position from dest_workspace_dir + let normalized_path: std::path::PathBuf = normalized_components.iter().collect(); + let dest_path = dest_workspace_dir.join(&normalized_path); + + // Get the actual source path by resolving against the original manifest_dir + let source_path = manifest_dir.join(path_dep_path); + let canonical_source = match source_path.canonicalize() { + Ok(p) => p, + Err(_) => { + // Path doesn't exist, skip it (Cargo will report the error) + continue; + } + }; + + // Create parent directories if needed + if let Some(parent) = dest_path.parent() { + if !parent.exists() { + fs::create_dir_all(parent).with_context(|| { + format!( + "Failed to create parent directories for external path dep: {}", + parent.display() + ) + })?; + } + } + + // Handle existing symlinks - verify they point to the correct target + if dest_path.exists() || dest_path.symlink_metadata().is_ok() { + if dest_path.symlink_metadata().map(|m| m.file_type().is_symlink()).unwrap_or(false) { + // It's a symlink - check if it points to the right place + let current_target = dest_path.read_link().ok().and_then(|p| p.canonicalize().ok()); + if current_target.as_ref() == Some(&canonical_source) { + // Already correct, skip + continue; + } + // Wrong target, remove and recreate + remove_symlink(&dest_path).with_context(|| { + format!( + "Failed to remove stale symlink for external path dep: {}", + dest_path.display() + ) + })?; + } else { + // Not a symlink but exists - this shouldn't happen in normal operation + bail!( + "Cannot create symlink at {} - path already exists as a non-symlink", + dest_path.display() + ); + } + } + + symlink(&canonical_source, &dest_path).with_context(|| { + format!( + "Failed to symlink external path dependency: {} -> {}", + canonical_source.display(), + dest_path.display() + ) + })?; + debug!( + "Symlinked external path dependency: {} -> {}", + canonical_source.display(), + dest_path.display() + ); + } + } + + Ok(()) +} + /// Symlinks the root contents of a source directory into a destination directory pub(crate) fn symlink_roots( source: &Path, diff --git a/test/integration/external_relative_path_deps/MODULE.bazel.lock b/test/integration/external_relative_path_deps/MODULE.bazel.lock index 3f76cb589e..56818a64f4 100644 --- a/test/integration/external_relative_path_deps/MODULE.bazel.lock +++ b/test/integration/external_relative_path_deps/MODULE.bazel.lock @@ -231,6 +231,104 @@ ] } }, + "@@rules_rust+//crate_universe:extensions.bzl%crate": { + "general": { + "bzlTransitiveDigest": "Z3UXOuKTh02JcLc34E7oxg7KTPo5qjMSn0cwCuuW/7c=", + "usagesDigest": "spplNi12vKpaHZyBACoNn+tfZvPvTSW47sD/59HoN+4=", + "recordedFileInputs": { + "@@//cargo_workspace/Cargo.lock": "a3f6d5f1b25a3231b58f82e4571ec2f4dc855067115daf152cd953a1968e0340", + "@@//cargo_workspace/Cargo.toml": "b3f7f8979a41f6e1ef265af45f3fe272590c1380049a7ffdf95088c535f84241", + "@@//cargo_workspace/member/Cargo.toml": "5315da5bd9e3a318f9fb86e20a6d355e0804688b40796ddc4fd2313e75065f08" + }, + "recordedDirentsInputs": {}, + "envVariables": { + "CARGO_BAZEL_DEBUG": null, + "CARGO_BAZEL_GENERATOR_SHA256": null, + "CARGO_BAZEL_GENERATOR_URL": null, + "CARGO_BAZEL_ISOLATED": null, + "CARGO_BAZEL_REPIN": null, + "CARGO_BAZEL_REPIN_ONLY": null, + "CARGO_BAZEL_TIMEOUT": null, + "REPIN": null + }, + "generatedRepoSpecs": { + "crates": { + "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", + "attributes": { + "contents": { + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'external_relative_path_deps_test'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"external_crate-0.1.0\",\n actual = \"@crates__external_crate-0.1.0//:external_crate\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"external_crate\",\n actual = \"@crates__external_crate-0.1.0//:external_crate\",\n tags = [\"manual\"],\n)\n", + "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'external_relative_path_deps_test'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n _COMMON_CONDITION: {\n \"external_crate\": Label(\"@crates//:external_crate-0.1.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"cargo_workspace/member\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"cargo_workspace/member\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n\n local_crate_mirror(\n name = \"crates__external_crate-0.1.0\",\n options_json = \"{\\\"config\\\":{\\\"repository_name\\\":\\\"crates\\\",\\\"build_file_template\\\":\\\"@crates//crates:BUILD.{name}-{version}.bazel\\\",\\\"crate_label_template\\\":\\\"@{repository}__{name}-{version}//:{target}\\\",\\\"crate_alias_template\\\":\\\"@{repository}//:{name}-{version}\\\",\\\"crates_module_template\\\":\\\"@crates//crates:{file}\\\",\\\"crate_repository_template\\\":\\\"{repository}__{name}-{version}\\\",\\\"default_alias_rule\\\":\\\"alias\\\",\\\"default_package_name\\\":null,\\\"generate_target_compatible_with\\\":true,\\\"platforms_template\\\":\\\"@rules_rust//rust/platform:{triple}\\\",\\\"regen_command\\\":\\\"bazel mod show_repo 'external_relative_path_deps_test'\\\",\\\"vendor_mode\\\":\\\"remote\\\",\\\"generate_rules_license_metadata\\\":false,\\\"generate_cargo_toml_env_vars\\\":true},\\\"supported_platform_triples\\\":[\\\"aarch64-apple-darwin\\\",\\\"aarch64-unknown-linux-gnu\\\",\\\"wasm32-unknown-unknown\\\",\\\"wasm32-wasip1\\\",\\\"x86_64-pc-windows-msvc\\\",\\\"x86_64-unknown-linux-gnu\\\",\\\"x86_64-unknown-nixos-gnu\\\"],\\\"platform_conditions\\\":{\\\"aarch64-apple-darwin\\\":[\\\"aarch64-apple-darwin\\\"],\\\"aarch64-unknown-linux-gnu\\\":[\\\"aarch64-unknown-linux-gnu\\\"],\\\"wasm32-unknown-unknown\\\":[\\\"wasm32-unknown-unknown\\\"],\\\"wasm32-wasip1\\\":[\\\"wasm32-wasip1\\\"],\\\"x86_64-pc-windows-msvc\\\":[\\\"x86_64-pc-windows-msvc\\\"],\\\"x86_64-unknown-linux-gnu\\\":[\\\"x86_64-unknown-linux-gnu\\\"],\\\"x86_64-unknown-nixos-gnu\\\":[\\\"x86_64-unknown-nixos-gnu\\\"]},\\\"crate_context\\\":{\\\"name\\\":\\\"external_crate\\\",\\\"version\\\":\\\"0.1.0\\\",\\\"package_url\\\":null,\\\"repository\\\":{\\\"Path\\\":{\\\"path\\\":\\\"/var/folders/22/0y4z1fs56xvbmz97mvh2zvv40000gn/T/external_crate\\\"}},\\\"targets\\\":[{\\\"Library\\\":{\\\"crate_name\\\":\\\"external_crate\\\",\\\"crate_root\\\":\\\"src/lib.rs\\\",\\\"srcs\\\":{\\\"allow_empty\\\":true,\\\"include\\\":[\\\"**/*.rs\\\"]}}}],\\\"library_target_name\\\":\\\"external_crate\\\",\\\"common_attrs\\\":{\\\"compile_data_glob\\\":[\\\"**\\\"],\\\"edition\\\":\\\"2021\\\",\\\"version\\\":\\\"0.1.0\\\"},\\\"license\\\":null,\\\"license_ids\\\":[],\\\"license_file\\\":null}}\",\n path = \"/var/folders/22/0y4z1fs56xvbmz97mvh2zvv40000gn/T/external_crate\",\n )\n return [\n struct(repo=\"crates__external_crate-0.1.0\", is_dev_dep = False),\n ]\n" + } + } + }, + "crates__external_crate-0.1.0": { + "repoRuleId": "@@rules_rust+//crate_universe/private:local_crate_mirror.bzl%local_crate_mirror", + "attributes": { + "options_json": "{\"config\":{\"build_file_template\":\"@crates//crates:BUILD.{name}-{version}.bazel\",\"crate_alias_template\":\"@{repository}//:{name}-{version}\",\"crate_label_template\":\"@{repository}__{name}-{version}//:{target}\",\"crate_repository_template\":\"{repository}__{name}-{version}\",\"crates_module_template\":\"@crates//crates:{file}\",\"default_alias_rule\":\"alias\",\"default_package_name\":null,\"generate_cargo_toml_env_vars\":true,\"generate_rules_license_metadata\":false,\"generate_target_compatible_with\":true,\"platforms_template\":\"@rules_rust//rust/platform:{triple}\",\"regen_command\":\"bazel mod show_repo 'external_relative_path_deps_test'\",\"repository_name\":\"crates\",\"vendor_mode\":\"remote\"},\"crate_context\":{\"common_attrs\":{\"compile_data_glob\":[\"**\"],\"edition\":\"2021\",\"version\":\"0.1.0\"},\"library_target_name\":\"external_crate\",\"license\":null,\"license_file\":null,\"license_ids\":[],\"name\":\"external_crate\",\"package_url\":null,\"repository\":{\"Path\":{\"path\":\"/var/folders/22/0y4z1fs56xvbmz97mvh2zvv40000gn/T/external_crate\"}},\"targets\":[{\"Library\":{\"crate_name\":\"external_crate\",\"crate_root\":\"src/lib.rs\",\"srcs\":{\"allow_empty\":true,\"include\":[\"**/*.rs\"]}}}],\"version\":\"0.1.0\"},\"platform_conditions\":{\"aarch64-apple-darwin\":[\"aarch64-apple-darwin\"],\"aarch64-unknown-linux-gnu\":[\"aarch64-unknown-linux-gnu\"],\"wasm32-unknown-unknown\":[\"wasm32-unknown-unknown\"],\"wasm32-wasip1\":[\"wasm32-wasip1\"],\"x86_64-pc-windows-msvc\":[\"x86_64-pc-windows-msvc\"],\"x86_64-unknown-linux-gnu\":[\"x86_64-unknown-linux-gnu\"],\"x86_64-unknown-nixos-gnu\":[\"x86_64-unknown-nixos-gnu\"]},\"supported_platform_triples\":[\"aarch64-apple-darwin\",\"aarch64-unknown-linux-gnu\",\"wasm32-unknown-unknown\",\"wasm32-wasip1\",\"x86_64-pc-windows-msvc\",\"x86_64-unknown-linux-gnu\",\"x86_64-unknown-nixos-gnu\"]}", + "path": "/var/folders/22/0y4z1fs56xvbmz97mvh2zvv40000gn/T/external_crate", + "generator": "@cargo_bazel_bootstrap//:cargo-bazel" + } + } + }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "bazel_features+", + "bazel_features_globals", + "bazel_features++version_extension+bazel_features_globals" + ], + [ + "bazel_features+", + "bazel_features_version", + "bazel_features++version_extension+bazel_features_version" + ], + [ + "rules_cc+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_cc+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "bazel_features", + "bazel_features+" + ], + [ + "rules_rust+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "rules_rust+", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_rust+", + "cargo_bazel_bootstrap", + "rules_rust++cu_nr+cargo_bazel_bootstrap" + ], + [ + "rules_rust+", + "rules_cc", + "rules_cc+" + ], + [ + "rules_rust+", + "rules_rust", + "rules_rust+" + ] + ] + } + }, "@@rules_rust+//crate_universe/private:internal_extensions.bzl%cu_nr": { "general": { "bzlTransitiveDigest": "h9wcsupr1TvM+IjSqO1m9hZWrBFbgwAqak9LCEhtav8=", diff --git a/test/integration/external_relative_path_deps/external_crate/BUILD.bazel b/test/integration/external_relative_path_deps/external_crate/BUILD.bazel new file mode 100644 index 0000000000..5b539dc7c8 --- /dev/null +++ b/test/integration/external_relative_path_deps/external_crate/BUILD.bazel @@ -0,0 +1,67 @@ +############################################################################### +# @generated +# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To +# regenerate this file, run the following: +# +# bazel mod show_repo 'external_relative_path_deps_test' +############################################################################### + +load("@rules_rust//cargo:defs.bzl", "cargo_toml_env_vars") + +load("@rules_rust//rust:defs.bzl", "rust_library") + +# buildifier: disable=bzl-visibility +load("@rules_rust//crate_universe/private:selects.bzl", "selects") + +package(default_visibility = ["//visibility:public"]) + +cargo_toml_env_vars( + name = "cargo_toml_env_vars", + src = "Cargo.toml", +) + +rust_library( + name = "external_crate", + compile_data = glob( + allow_empty = True, + include = ["**"], + exclude = [ + "**/* *", + ".tmp_git_root/**/*", + "BUILD", + "BUILD.bazel", + "WORKSPACE", + "WORKSPACE.bazel", + ], + ), + crate_root = "src/lib.rs", + edition = "2021", + rustc_env_files = [ + ":cargo_toml_env_vars", + ], + rustc_flags = [ + "--cap-lints=allow", + ], + srcs = glob( + allow_empty = True, + include = ["**/*.rs"], + ), + tags = [ + "cargo-bazel", + "crate-name=external_crate", + "manual", + "noclippy", + "norustfmt", + ], + target_compatible_with = select({ + "@rules_rust//rust/platform:aarch64-apple-darwin": [], + "@rules_rust//rust/platform:aarch64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "@rules_rust//rust/platform:wasm32-wasip1": [], + "@rules_rust//rust/platform:x86_64-pc-windows-msvc": [], + "@rules_rust//rust/platform:x86_64-unknown-linux-gnu": [], + "@rules_rust//rust/platform:x86_64-unknown-nixos-gnu": [], + "//conditions:default": ["@platforms//:incompatible"], + }), + version = "0.1.0", +)