bazelbuild / rules_rust

Rust rules for Bazel
https://bazelbuild.github.io/rules_rust/
Apache License 2.0
661 stars 426 forks source link

crate_universe: cannot define two variants of the same library #1337

Open roman-kashitsyn opened 2 years ago

roman-kashitsyn commented 2 years ago

I need to use different variants of a library in the same workspace, depending on the target platform. However, when I add the same package with different aliases to the packages section of crates_repository rule, the package disappears from the workspace. Minimal example:

WORKSPACE.bazel

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_rust",
    sha256 = "e074f1e203607c5fcd549929d956170346f8807d2bbaeb98b2ed213c37e0870f",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/rules_rust/releases/download/0.3.1/rules_rust-v0.3.1.tar.gz",
        "https://github.com/bazelbuild/rules_rust/releases/download/0.3.1/rules_rust-v0.3.1.tar.gz",
    ],
)

load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")

rules_rust_dependencies()

rust_register_toolchains(version = "1.60.0")

load("@rules_rust//crate_universe:defs.bzl", "crate", "crates_repository", "splicing_config")

crates_repository(
    name = "crate_index",
    lockfile = "//:Cargo.Bazel.lock",
    packages = {
        "getrandom": crate.spec(
            package = "getrandom",
            version = "0.2.6",
        ),
        "getrandom_custom": crate.spec(
            features = ["custom"],
            package = "getrandom",
            version = "0.2.6",
        ),
    },
    splicing_config = splicing_config(
        resolver_version = "2",
    ),
)

load("@crate_index//:defs.bzl", "crate_repositories")

crate_repositories()
bazel query @crate_index//...
@crate_index//:srcs

The Cargo.Bazel.lock file is empty as well:

{
  "checksum": "9058ba895bb4665566607200bccedaa5623580eb7c8440bc9ea8dc2414703d73",
  "crates": {
    "direct-cargo-bazel-deps 0.0.1": {
      "name": "direct-cargo-bazel-deps",
      "version": "0.0.1",
      "repository": null,
      "targets": [
        {
          "Library": {
            "crate_name": "direct_cargo_bazel_deps",
            "crate_root": ".direct_cargo_bazel_deps.rs",
            "srcs": {
              "include": [
                "**/*.rs"
              ],
              "exclude": []
            }
          }
        }
      ],
      "library_target_name": "direct_cargo_bazel_deps",
      "common_attrs": {
        "compile_data_glob": [
          "**"
        ],
        "edition": "2018",
        "version": "0.0.1"
      },
      "license": null
    }
  },
  "binary_crates": [],
  "workspace_members": {
    "direct-cargo-bazel-deps 0.0.1": ""
  },
  "conditions": {}
}

If I remove either of the library variants, the build works as expected.

roman-kashitsyn commented 2 years ago

I've added a bit of logging to see what's going on in the cargo-bazel generate function: https://github.com/bazelbuild/rules_rust/blob/3aa6de3c63e4b0600521ecc0ac191505b1e4e747/crate_universe/src/cli/generate.rs#L108-L124 below are the values of cargo_metadata, annotations, and context:

Cargo metadata: Metadata {
    packages: [
        Package {
            name: "direct-cargo-bazel-deps",
            version: Version {
                major: 0,
                minor: 0,
                patch: 1,
            },
            authors: [],
            id: PackageId {
                repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
            },
            source: None,
            description: None,
            dependencies: [
                Dependency {
                    name: "getrandom",
                    source: Some(
                        "registry+https://github.com/rust-lang/crates.io-index",
                    ),
                    req: VersionReq {
                        comparators: [
                            Comparator {
                                op: Caret,
                                major: 0,
                                minor: Some(
                                    2,
                                ),
                                patch: Some(
                                    6,
                                ),
                                pre: Prerelease(""),
                            },
                        ],
                    },
                    kind: Normal,
                    optional: false,
                    uses_default_features: true,
                    features: [],
                    target: None,
                    rename: Some(
                        "getrandom",
                    ),
                    registry: None,
                    path: None,
                },
                Dependency {
                    name: "getrandom",
                    source: Some(
                        "registry+https://github.com/rust-lang/crates.io-index",
                    ),
                    req: VersionReq {
                        comparators: [
                            Comparator {
                                op: Caret,
                                major: 0,
                                minor: Some(
                                    2,
                                ),
                                patch: Some(
                                    6,
                                ),
                                pre: Prerelease(""),
                            },
                        ],
                    },
                    kind: Normal,
                    optional: false,
                    uses_default_features: true,
                    features: [
                        "custom",
                    ],
                    target: None,
                    rename: Some(
                        "getrandom_custom",
                    ),
                    registry: None,
                    path: None,
                },
            ],
            license: None,
            license_file: None,
            targets: [
                Target {
                    name: "direct_cargo_bazel_deps",
                    kind: [
                        "lib",
                    ],
                    crate_types: [
                        "lib",
                    ],
                    required_features: [],
                    src_path: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69/.direct_cargo_bazel_deps.rs",
                    edition: "2018",
                    doctest: true,
                    test: true,
                    doc: true,
                },
            ],
            features: {},
            manifest_path: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69/Cargo.toml",
            categories: [],
            keywords: [],
            readme: None,
            repository: None,
            homepage: None,
            documentation: None,
            edition: "2018",
            metadata: Null,
            links: None,
            publish: None,
            default_run: None,
            rust_version: None,
        },
    ],
    workspace_members: [
        PackageId {
            repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
        },
    ],
    resolve: Some(
        Resolve {
            nodes: [
                Node {
                    id: PackageId {
                        repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
                    },
                    deps: [],
                    dependencies: [],
                    features: [],
                },
            ],
            root: Some(
                PackageId {
                    repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
                },
            ),
        },
    ),
    workspace_root: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69",
    target_directory: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69/target",
    workspace_metadata: Object({
        "cargo-bazel": Object({
            "package_prefixes": Object({}),
            "sources": Object({
                "cfg-if 1.0.0": Object({
                    "sha256": String(
                        "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd",
                    ),
                    "url": String(
                        "https://crates.io/api/v1/crates/cfg-if/1.0.0/download",
                    ),
                }),
                "getrandom 0.2.6": Object({
                    "sha256": String(
                        "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad",
                    ),
                    "url": String(
                        "https://crates.io/api/v1/crates/getrandom/0.2.6/download",
                    ),
                }),
                "libc 0.2.125": Object({
                    "sha256": String(
                        "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b",
                    ),
                    "url": String(
                        "https://crates.io/api/v1/crates/libc/0.2.125/download",
                    ),
                }),
                "wasi 0.10.2+wasi-snapshot-preview1": Object({
                    "sha256": String(
                        "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6",
                    ),
                    "url": String(
                        "https://crates.io/api/v1/crates/wasi/0.10.2+wasi-snapshot-preview1/download",
                    ),
                }),
            }),
        }),
    }),
    version: 1,
}
Annotations: Annotations {
    metadata: MetadataAnnotation {
        packages: {
            PackageId {
                repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
            }: Package {
                name: "direct-cargo-bazel-deps",
                version: Version {
                    major: 0,
                    minor: 0,
                    patch: 1,
                },
                authors: [],
                id: PackageId {
                    repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
                },
                source: None,
                description: None,
                dependencies: [
                    Dependency {
                        name: "getrandom",
                        source: Some(
                            "registry+https://github.com/rust-lang/crates.io-index",
                        ),
                        req: VersionReq {
                            comparators: [
                                Comparator {
                                    op: Caret,
                                    major: 0,
                                    minor: Some(
                                        2,
                                    ),
                                    patch: Some(
                                        6,
                                    ),
                                    pre: Prerelease(""),
                                },
                            ],
                        },
                        kind: Normal,
                        optional: false,
                        uses_default_features: true,
                        features: [],
                        target: None,
                        rename: Some(
                            "getrandom",
                        ),
                        registry: None,
                        path: None,
                    },
                    Dependency {
                        name: "getrandom",
                        source: Some(
                            "registry+https://github.com/rust-lang/crates.io-index",
                        ),
                        req: VersionReq {
                            comparators: [
                                Comparator {
                                    op: Caret,
                                    major: 0,
                                    minor: Some(
                                        2,
                                    ),
                                    patch: Some(
                                        6,
                                    ),
                                    pre: Prerelease(""),
                                },
                            ],
                        },
                        kind: Normal,
                        optional: false,
                        uses_default_features: true,
                        features: [
                            "custom",
                        ],
                        target: None,
                        rename: Some(
                            "getrandom_custom",
                        ),
                        registry: None,
                        path: None,
                    },
                ],
                license: None,
                license_file: None,
                targets: [
                    Target {
                        name: "direct_cargo_bazel_deps",
                        kind: [
                            "lib",
                        ],
                        crate_types: [
                            "lib",
                        ],
                        required_features: [],
                        src_path: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69/.direct_cargo_bazel_deps.rs",
                        edition: "2018",
                        doctest: true,
                        test: true,
                        doc: true,
                    },
                ],
                features: {},
                manifest_path: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69/Cargo.toml",
                categories: [],
                keywords: [],
                readme: None,
                repository: None,
                homepage: None,
                documentation: None,
                edition: "2018",
                metadata: Null,
                links: None,
                publish: None,
                default_run: None,
                rust_version: None,
            },
        },
        crates: {
            PackageId {
                repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
            }: CrateAnnotation {
                node: Node {
                    id: PackageId {
                        repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
                    },
                    deps: [],
                    dependencies: [],
                    features: [],
                },
                deps: DependencySet {
                    normal_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                    normal_dev_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                    proc_macro_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                    proc_macro_dev_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                    build_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                    build_proc_macro_deps: SelectList {
                        common: {},
                        selects: {},
                    },
                },
            },
        },
        workspace_members: {
            PackageId {
                repr: "direct-cargo-bazel-deps 0.0.1 (path+file:///var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69)",
            },
        },
        workspace_root: "/var/folders/vb/dfxkrs1j3dbgz7nytyhnch6r0000gn/T/.tmplK1v69",
        workspace_metadata: WorkspaceMetadata {
            sources: {
                CrateId {
                    name: "cfg-if",
                    version: "1.0.0",
                }: SourceInfo {
                    url: "https://crates.io/api/v1/crates/cfg-if/1.0.0/download",
                    sha256: "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd",
                },
                CrateId {
                    name: "getrandom",
                    version: "0.2.6",
                }: SourceInfo {
                    url: "https://crates.io/api/v1/crates/getrandom/0.2.6/download",
                    sha256: "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad",
                },
                CrateId {
                    name: "libc",
                    version: "0.2.125",
                }: SourceInfo {
                    url: "https://crates.io/api/v1/crates/libc/0.2.125/download",
                    sha256: "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b",
                },
                CrateId {
                    name: "wasi",
                    version: "0.10.2+wasi-snapshot-preview1",
                }: SourceInfo {
                    url: "https://crates.io/api/v1/crates/wasi/0.10.2+wasi-snapshot-preview1/download",
                    sha256: "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6",
                },
            },
            workspace_prefix: None,
            package_prefixes: {},
        },
    },
    lockfile: LockfileAnnotation {
        crates: {},
    },
    config: Config {
        generate_build_scripts: true,
        annotations: {},
        rendering: RenderConfig {
            repository_name: "crate_variants",
            build_file_template: "//:BUILD.{name}-{version}.bazel",
            crate_label_template: "@{repository}__{name}-{version}//:{target}",
            crates_module_template: "//:{file}",
            crate_repository_template: "{repository}__{name}-{version}",
            default_package_name: None,
            platforms_template: "@rules_rust//rust/platform:{triple}",
            vendor_mode: None,
        },
        cargo_config: None,
        supported_platform_triples: {
            "aarch64-apple-darwin",
            "aarch64-apple-ios",
            "aarch64-linux-android",
            "aarch64-unknown-linux-gnu",
            "arm-unknown-linux-gnueabi",
            "armv7-unknown-linux-gnueabi",
            "i686-apple-darwin",
            "i686-linux-android",
            "i686-pc-windows-msvc",
            "i686-unknown-freebsd",
            "i686-unknown-linux-gnu",
            "powerpc-unknown-linux-gnu",
            "s390x-unknown-linux-gnu",
            "wasm32-unknown-unknown",
            "wasm32-wasi",
            "x86_64-apple-darwin",
            "x86_64-apple-ios",
            "x86_64-linux-android",
            "x86_64-pc-windows-msvc",
            "x86_64-unknown-freebsd",
            "x86_64-unknown-linux-gnu",
        },
    },
    pairred_extras: {},
}
Context: Context {
    checksum: None,
    crates: {
        CrateId {
            name: "direct-cargo-bazel-deps",
            version: "0.0.1",
        }: CrateContext {
            name: "direct-cargo-bazel-deps",
            version: "0.0.1",
            repository: None,
            targets: [
                Library(
                    TargetAttributes {
                        crate_name: "direct_cargo_bazel_deps",
                        crate_root: Some(
                            ".direct_cargo_bazel_deps.rs",
                        ),
                        srcs: Glob {
                            include: [
                                "**/*.rs",
                            ],
                            exclude: [],
                        },
                    },
                ),
            ],
            library_target_name: Some(
                "direct_cargo_bazel_deps",
            ),
            common_attrs: CommonAttributes {
                compile_data: SelectList {
                    common: {},
                    selects: {},
                },
                compile_data_glob: {
                    "**",
                },
                crate_features: {},
                data: SelectList {
                    common: {},
                    selects: {},
                },
                data_glob: {},
                deps: SelectList {
                    common: {},
                    selects: {},
                },
                extra_deps: {},
                deps_dev: SelectList {
                    common: {},
                    selects: {},
                },
                edition: "2018",
                linker_script: None,
                proc_macro_deps: SelectList {
                    common: {},
                    selects: {},
                },
                extra_proc_macro_deps: {},
                proc_macro_deps_dev: SelectList {
                    common: {},
                    selects: {},
                },
                rustc_env: SelectDict {
                    common: {},
                    selects: {},
                },
                rustc_env_files: SelectList {
                    common: {},
                    selects: {},
                },
                rustc_flags: SelectList {
                    common: {},
                    selects: {},
                },
                version: "0.0.1",
                tags: [],
            },
            build_script_attrs: None,
            license: None,
            additive_build_file_content: None,
        },
    },
    binary_crates: {},
    workspace_members: {
        CrateId {
            name: "direct-cargo-bazel-deps",
            version: "0.0.1",
        }: "",
    },
    conditions: {},
}

It seems that the cargo_metadata object is already defective: annotations are constructed from the resolve field, but cargo_metadata doesn't mention getrandom in resolve.