From aee25ea2ebb285b424f3602f02a06f7e1e0f5a6a Mon Sep 17 00:00:00 2001 From: Andreas Herrmann Date: Mon, 15 Jun 2026 19:41:30 +0200 Subject: [PATCH] feat: add import_names attribute for per target dependency name override --- .bazelrc | 4 +-- docs/rules.md | 19 ++++++++----- e2e/workspace/import-names-attr/BUILD.bazel | 31 +++++++++++++++++++++ e2e/workspace/import-names-attr/greet.zig | 1 + e2e/workspace/import-names-attr/lib.zig | 3 ++ e2e/workspace/import-names-attr/main.zig | 17 +++++++++++ zig/private/common/zig_build.bzl | 23 +++++++++++++++ zig/private/providers/zig_module_info.bzl | 14 +++++++--- zig/private/zig_library.bzl | 21 ++++++++++++++ 9 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 e2e/workspace/import-names-attr/BUILD.bazel create mode 100644 e2e/workspace/import-names-attr/greet.zig create mode 100644 e2e/workspace/import-names-attr/lib.zig create mode 100644 e2e/workspace/import-names-attr/main.zig diff --git a/.bazelrc b/.bazelrc index d244032c..117762c5 100644 --- a/.bazelrc +++ b/.bazelrc @@ -18,8 +18,8 @@ build --workspace_status_command=$(pwd)/workspace_status.sh # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` # docs: https://bazel.build/reference/command-line-reference#flag--deleted_packages -build --deleted_packages=e2e/workspace,e2e/workspace/bazel_builtin,e2e/workspace/c-sources,e2e/workspace/canonical-name-module,e2e/workspace/canonical-name-module/other,e2e/workspace/cc-dependencies,e2e/workspace/cc-dependencies/shared-library,e2e/workspace/cc-dependencies/static-library,e2e/workspace/cc-dependencies/static-library-cdeps,e2e/workspace/configure-mode,e2e/workspace/configure-target,e2e/workspace/configure-threaded,e2e/workspace/configure-use_cc_common_link,e2e/workspace/configure-use_cc_common_link/shared-library,e2e/workspace/configure-use_cc_common_link/static-library,e2e/workspace/configure-version,e2e/workspace/data-dependencies,e2e/workspace/embed-file,e2e/workspace/env-attr,e2e/workspace/import-name-attr,e2e/workspace/include-dependencies,e2e/workspace/include-dependencies/zig-include,e2e/workspace/include-dependencies/zig-include-define,e2e/workspace/include-dependencies/zig-include-isystem,e2e/workspace/include-dependencies/zig-std-include,e2e/workspace/link-dependencies,e2e/workspace/link-dependencies/shared-library,e2e/workspace/link-dependencies/static-library,e2e/workspace/linker-script,e2e/workspace/linkopts-attr,e2e/workspace/location-expansion,e2e/workspace/multiple-sources-and-packages-test,e2e/workspace/multiple-sources-binary,e2e/workspace/root-module-from-single-dependency,e2e/workspace/runfiles-library,e2e/workspace/runfiles-library/dependency,e2e/workspace/runfiles-library/dependency/transitive-dependency,e2e/workspace/simple-binary,e2e/workspace/simple-cmake-library,e2e/workspace/simple-library,e2e/workspace/simple-shared-library,e2e/workspace/simple-test,e2e/workspace/test-runner-attr,e2e/workspace/third_party/arocc,e2e/workspace/third_party/translate-c,e2e/workspace/toolchain-glibc-version,e2e/workspace/transitive-zig-modules-binary,e2e/workspace/transitive-zig-modules-binary/hello-world,e2e/workspace/transitive-zig-modules-binary/hello-world/data,e2e/workspace/transitive-zig-modules-binary/hello-world/data/hello,e2e/workspace/transitive-zig-modules-binary/hello-world/data/world,e2e/workspace/transitive-zig-modules-binary/hello-world/io,e2e/workspace/translate-c/transitive-cc-library-zig-binary,e2e/workspace/zig-docs,e2e/workspace/zig-header,e2e/workspace/zig-module-binary,e2e/workspace/zig-module-binary/data,e2e/workspace/zig-module-binary/io,zig/tests/integration_tests/minimal,zig/tests/integration_tests/mirrors,zig/tests/integration_tests/workspace,zig/tests/integration_tests/workspace/custom_interpreter,zig/tests/integration_tests/workspace/env-attr,zig/tests/integration_tests/workspace/runfiles -query --deleted_packages=e2e/workspace,e2e/workspace/bazel_builtin,e2e/workspace/c-sources,e2e/workspace/canonical-name-module,e2e/workspace/canonical-name-module/other,e2e/workspace/cc-dependencies,e2e/workspace/cc-dependencies/shared-library,e2e/workspace/cc-dependencies/static-library,e2e/workspace/cc-dependencies/static-library-cdeps,e2e/workspace/configure-mode,e2e/workspace/configure-target,e2e/workspace/configure-threaded,e2e/workspace/configure-use_cc_common_link,e2e/workspace/configure-use_cc_common_link/shared-library,e2e/workspace/configure-use_cc_common_link/static-library,e2e/workspace/configure-version,e2e/workspace/data-dependencies,e2e/workspace/embed-file,e2e/workspace/env-attr,e2e/workspace/import-name-attr,e2e/workspace/include-dependencies,e2e/workspace/include-dependencies/zig-include,e2e/workspace/include-dependencies/zig-include-define,e2e/workspace/include-dependencies/zig-include-isystem,e2e/workspace/include-dependencies/zig-std-include,e2e/workspace/link-dependencies,e2e/workspace/link-dependencies/shared-library,e2e/workspace/link-dependencies/static-library,e2e/workspace/linker-script,e2e/workspace/linkopts-attr,e2e/workspace/location-expansion,e2e/workspace/multiple-sources-and-packages-test,e2e/workspace/multiple-sources-binary,e2e/workspace/root-module-from-single-dependency,e2e/workspace/runfiles-library,e2e/workspace/runfiles-library/dependency,e2e/workspace/runfiles-library/dependency/transitive-dependency,e2e/workspace/simple-binary,e2e/workspace/simple-cmake-library,e2e/workspace/simple-library,e2e/workspace/simple-shared-library,e2e/workspace/simple-test,e2e/workspace/test-runner-attr,e2e/workspace/third_party/arocc,e2e/workspace/third_party/translate-c,e2e/workspace/toolchain-glibc-version,e2e/workspace/transitive-zig-modules-binary,e2e/workspace/transitive-zig-modules-binary/hello-world,e2e/workspace/transitive-zig-modules-binary/hello-world/data,e2e/workspace/transitive-zig-modules-binary/hello-world/data/hello,e2e/workspace/transitive-zig-modules-binary/hello-world/data/world,e2e/workspace/transitive-zig-modules-binary/hello-world/io,e2e/workspace/translate-c/transitive-cc-library-zig-binary,e2e/workspace/zig-docs,e2e/workspace/zig-header,e2e/workspace/zig-module-binary,e2e/workspace/zig-module-binary/data,e2e/workspace/zig-module-binary/io,zig/tests/integration_tests/minimal,zig/tests/integration_tests/mirrors,zig/tests/integration_tests/workspace,zig/tests/integration_tests/workspace/custom_interpreter,zig/tests/integration_tests/workspace/env-attr,zig/tests/integration_tests/workspace/runfiles +build --deleted_packages=e2e/workspace,e2e/workspace/bazel_builtin,e2e/workspace/c-sources,e2e/workspace/canonical-name-module,e2e/workspace/canonical-name-module/other,e2e/workspace/cc-dependencies,e2e/workspace/cc-dependencies/shared-library,e2e/workspace/cc-dependencies/static-library,e2e/workspace/cc-dependencies/static-library-cdeps,e2e/workspace/configure-mode,e2e/workspace/configure-target,e2e/workspace/configure-threaded,e2e/workspace/configure-use_cc_common_link,e2e/workspace/configure-use_cc_common_link/shared-library,e2e/workspace/configure-use_cc_common_link/static-library,e2e/workspace/configure-version,e2e/workspace/data-dependencies,e2e/workspace/embed-file,e2e/workspace/env-attr,e2e/workspace/import-name-attr,e2e/workspace/import-names-attr,e2e/workspace/include-dependencies,e2e/workspace/include-dependencies/zig-include,e2e/workspace/include-dependencies/zig-include-define,e2e/workspace/include-dependencies/zig-include-isystem,e2e/workspace/include-dependencies/zig-std-include,e2e/workspace/link-dependencies,e2e/workspace/link-dependencies/shared-library,e2e/workspace/link-dependencies/static-library,e2e/workspace/linker-script,e2e/workspace/linkopts-attr,e2e/workspace/location-expansion,e2e/workspace/multiple-sources-and-packages-test,e2e/workspace/multiple-sources-binary,e2e/workspace/root-module-from-single-dependency,e2e/workspace/runfiles-library,e2e/workspace/runfiles-library/dependency,e2e/workspace/runfiles-library/dependency/transitive-dependency,e2e/workspace/simple-binary,e2e/workspace/simple-cmake-library,e2e/workspace/simple-library,e2e/workspace/simple-shared-library,e2e/workspace/simple-test,e2e/workspace/test-runner-attr,e2e/workspace/third_party/arocc,e2e/workspace/third_party/translate-c,e2e/workspace/toolchain-glibc-version,e2e/workspace/transitive-zig-modules-binary,e2e/workspace/transitive-zig-modules-binary/hello-world,e2e/workspace/transitive-zig-modules-binary/hello-world/data,e2e/workspace/transitive-zig-modules-binary/hello-world/data/hello,e2e/workspace/transitive-zig-modules-binary/hello-world/data/world,e2e/workspace/transitive-zig-modules-binary/hello-world/io,e2e/workspace/translate-c/transitive-cc-library-zig-binary,e2e/workspace/zig-docs,e2e/workspace/zig-header,e2e/workspace/zig-module-binary,e2e/workspace/zig-module-binary/data,e2e/workspace/zig-module-binary/io,zig/tests/integration_tests/minimal,zig/tests/integration_tests/mirrors,zig/tests/integration_tests/workspace,zig/tests/integration_tests/workspace/custom_interpreter,zig/tests/integration_tests/workspace/env-attr,zig/tests/integration_tests/workspace/runfiles +query --deleted_packages=e2e/workspace,e2e/workspace/bazel_builtin,e2e/workspace/c-sources,e2e/workspace/canonical-name-module,e2e/workspace/canonical-name-module/other,e2e/workspace/cc-dependencies,e2e/workspace/cc-dependencies/shared-library,e2e/workspace/cc-dependencies/static-library,e2e/workspace/cc-dependencies/static-library-cdeps,e2e/workspace/configure-mode,e2e/workspace/configure-target,e2e/workspace/configure-threaded,e2e/workspace/configure-use_cc_common_link,e2e/workspace/configure-use_cc_common_link/shared-library,e2e/workspace/configure-use_cc_common_link/static-library,e2e/workspace/configure-version,e2e/workspace/data-dependencies,e2e/workspace/embed-file,e2e/workspace/env-attr,e2e/workspace/import-name-attr,e2e/workspace/import-names-attr,e2e/workspace/include-dependencies,e2e/workspace/include-dependencies/zig-include,e2e/workspace/include-dependencies/zig-include-define,e2e/workspace/include-dependencies/zig-include-isystem,e2e/workspace/include-dependencies/zig-std-include,e2e/workspace/link-dependencies,e2e/workspace/link-dependencies/shared-library,e2e/workspace/link-dependencies/static-library,e2e/workspace/linker-script,e2e/workspace/linkopts-attr,e2e/workspace/location-expansion,e2e/workspace/multiple-sources-and-packages-test,e2e/workspace/multiple-sources-binary,e2e/workspace/root-module-from-single-dependency,e2e/workspace/runfiles-library,e2e/workspace/runfiles-library/dependency,e2e/workspace/runfiles-library/dependency/transitive-dependency,e2e/workspace/simple-binary,e2e/workspace/simple-cmake-library,e2e/workspace/simple-library,e2e/workspace/simple-shared-library,e2e/workspace/simple-test,e2e/workspace/test-runner-attr,e2e/workspace/third_party/arocc,e2e/workspace/third_party/translate-c,e2e/workspace/toolchain-glibc-version,e2e/workspace/transitive-zig-modules-binary,e2e/workspace/transitive-zig-modules-binary/hello-world,e2e/workspace/transitive-zig-modules-binary/hello-world/data,e2e/workspace/transitive-zig-modules-binary/hello-world/data/hello,e2e/workspace/transitive-zig-modules-binary/hello-world/data/world,e2e/workspace/transitive-zig-modules-binary/hello-world/io,e2e/workspace/translate-c/transitive-cc-library-zig-binary,e2e/workspace/zig-docs,e2e/workspace/zig-header,e2e/workspace/zig-module-binary,e2e/workspace/zig-module-binary/data,e2e/workspace/zig-module-binary/io,zig/tests/integration_tests/minimal,zig/tests/integration_tests/mirrors,zig/tests/integration_tests/workspace,zig/tests/integration_tests/workspace/custom_interpreter,zig/tests/integration_tests/workspace/env-attr,zig/tests/integration_tests/workspace/runfiles # Load any settings specific to the current user. # Place settings that should affect the integration tests into `.bazelrc.ic.user`. diff --git a/docs/rules.md b/docs/rules.md index e71e00bb..9d3bc7ee 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -14,7 +14,7 @@ the current target name or current repository name. load("@rules_zig//zig:defs.bzl", "zig_binary") zig_binary(name, deps, srcs, data, compiler_runtime, copts, csrcs, emit_asm, emit_llvm_bc, - emit_llvm_ir, env, extra_docs, extra_srcs, linker_script, linkopts, main, + emit_llvm_ir, env, extra_docs, extra_srcs, import_names, linker_script, linkopts, main, strip_debug_symbols, zigopts) @@ -61,6 +61,7 @@ zig_binary( | env | Additional environment variables to set when executed by `bazel run`. Subject to location expansion. NOTE: The environment variables are not set when you run the target outside of Bazel (for example, by manually executing the binary in bazel-bin/). | Dictionary: String -> String | optional | `{}` | | extra_docs | Other files required to generate documentation, e.g. guides referenced using `//!zig-autodoc-guide:`. | List of labels | optional | `[]` | | extra_srcs | Other files required to build the target, e.g. files embedded using `@embedFile`. | List of labels | optional | `[]` | +| import_names | Override the import name under which a dependency is imported.

Maps a dependency in `deps` to the name used to `@import` it from this target's sources. By default a Zig module dependency is imported under its own `import_name` or its target name. | Dictionary: Label -> String | optional | `{}` | | linker_script | Custom linker script for the target.

Note, as of Zig version 0.15.1 linker-scripts require the LLVM/LLD backend to be enabled, see https://github.com/ziglang/zig/issues/25069. Set `zigopts=["-fllvm", "-flld"]` to that end. | Label | optional | `None` | | linkopts | Additional list of flags passed to the linker. Subject to location expansion. | List of strings | optional | `[]` | | main | The main source file.

If not set, deps must contain exactly one Zig module dependency which will be used as the root module. Note that in that case, 'srcs', 'extra_srcs' and 'csrcs' must also be empty as they are taken from the root module instead. | Label | optional | `None` | @@ -348,7 +349,7 @@ zig_configure_test(
 load("@rules_zig//zig:defs.bzl", "zig_library")
 
-zig_library(name, deps, srcs, data, extra_srcs, import_name, main, zigopts)
+zig_library(name, deps, srcs, data, extra_srcs, import_name, import_names, main, zigopts)
 
Defines a Zig library. @@ -388,6 +389,7 @@ zig_library( | data | Files required by the module during runtime. | List of labels | optional | `[]` | | extra_srcs | Other files required when building the module, e.g. files embedded using `@embedFile`. | List of labels | optional | `[]` | | import_name | The import name of the module. | String | optional | `""` | +| import_names | Override the import name under which a dependency is imported.

Maps a dependency in `deps` to the name used to `@import` it from this target's sources. By default a Zig module dependency is imported under its own `import_name` or its target name. | Dictionary: Label -> String | optional | `{}` | | main | The main source file. | Label | required | | | zigopts | Additional list of flags passed to the zig compiler for this module.

This is an advanced feature that can conflict with attributes, build settings, and other flags defined by the toolchain itself. Use this at your own risk of hitting undefined behaviors. | List of strings | optional | `[]` | @@ -400,7 +402,7 @@ zig_library( load("@rules_zig//zig:defs.bzl", "zig_shared_library") zig_shared_library(name, deps, srcs, data, compiler_runtime, copts, csrcs, emit_asm, emit_llvm_bc, - emit_llvm_ir, extra_docs, extra_srcs, linker_script, linkopts, main, + emit_llvm_ir, extra_docs, extra_srcs, import_names, linker_script, linkopts, main, shared_lib_name, strip_debug_symbols, zigopts) @@ -447,6 +449,7 @@ zig_shared_library( | emit_llvm_ir | Emit the LLVM IR in the `llvm_ir` output group. | Boolean | optional | `False` | | extra_docs | Other files required to generate documentation, e.g. guides referenced using `//!zig-autodoc-guide:`. | List of labels | optional | `[]` | | extra_srcs | Other files required to build the target, e.g. files embedded using `@embedFile`. | List of labels | optional | `[]` | +| import_names | Override the import name under which a dependency is imported.

Maps a dependency in `deps` to the name used to `@import` it from this target's sources. By default a Zig module dependency is imported under its own `import_name` or its target name. | Dictionary: Label -> String | optional | `{}` | | linker_script | Custom linker script for the target.

Note, as of Zig version 0.15.1 linker-scripts require the LLVM/LLD backend to be enabled, see https://github.com/ziglang/zig/issues/25069. Set `zigopts=["-fllvm", "-flld"]` to that end. | Label | optional | `None` | | linkopts | Additional list of flags passed to the linker. Subject to location expansion. | List of strings | optional | `[]` | | main | The main source file.

If not set, deps must contain exactly one Zig module dependency which will be used as the root module. Note that in that case, 'srcs', 'extra_srcs' and 'csrcs' must also be empty as they are taken from the root module instead. | Label | optional | `None` | @@ -463,8 +466,8 @@ zig_shared_library( load("@rules_zig//zig:defs.bzl", "zig_static_library") zig_static_library(name, deps, srcs, data, compiler_runtime, copts, csrcs, emit_asm, emit_bin, - emit_llvm_bc, emit_llvm_ir, extra_docs, extra_srcs, linker_script, linkopts, main, - strip_debug_symbols, zigopts) + emit_llvm_bc, emit_llvm_ir, extra_docs, extra_srcs, import_names, linker_script, + linkopts, main, strip_debug_symbols, zigopts) Builds a Zig library, produces a static archive. @@ -511,6 +514,7 @@ zig_static_library( | emit_llvm_ir | Emit the LLVM IR in the `llvm_ir` output group. | Boolean | optional | `False` | | extra_docs | Other files required to generate documentation, e.g. guides referenced using `//!zig-autodoc-guide:`. | List of labels | optional | `[]` | | extra_srcs | Other files required to build the target, e.g. files embedded using `@embedFile`. | List of labels | optional | `[]` | +| import_names | Override the import name under which a dependency is imported.

Maps a dependency in `deps` to the name used to `@import` it from this target's sources. By default a Zig module dependency is imported under its own `import_name` or its target name. | Dictionary: Label -> String | optional | `{}` | | linker_script | Custom linker script for the target.

Note, as of Zig version 0.15.1 linker-scripts require the LLVM/LLD backend to be enabled, see https://github.com/ziglang/zig/issues/25069. Set `zigopts=["-fllvm", "-flld"]` to that end. | Label | optional | `None` | | linkopts | Additional list of flags passed to the linker. Subject to location expansion. | List of strings | optional | `[]` | | main | The main source file.

If not set, deps must contain exactly one Zig module dependency which will be used as the root module. Note that in that case, 'srcs', 'extra_srcs' and 'csrcs' must also be empty as they are taken from the root module instead. | Label | optional | `None` | @@ -526,8 +530,8 @@ zig_static_library( load("@rules_zig//zig:defs.bzl", "zig_test") zig_test(name, deps, srcs, data, compiler_runtime, copts, csrcs, emit_asm, emit_llvm_bc, - emit_llvm_ir, env, env_inherit, extra_docs, extra_srcs, linker_script, linkopts, main, - strip_debug_symbols, test_runner, zigopts) + emit_llvm_ir, env, env_inherit, extra_docs, extra_srcs, import_names, linker_script, + linkopts, main, strip_debug_symbols, test_runner, zigopts) Builds a Zig test. @@ -573,6 +577,7 @@ zig_test( | env_inherit | Environment variables to inherit from external environment when executed by `bazel test`. | List of strings | optional | `[]` | | extra_docs | Other files required to generate documentation, e.g. guides referenced using `//!zig-autodoc-guide:`. | List of labels | optional | `[]` | | extra_srcs | Other files required to build the target, e.g. files embedded using `@embedFile`. | List of labels | optional | `[]` | +| import_names | Override the import name under which a dependency is imported.

Maps a dependency in `deps` to the name used to `@import` it from this target's sources. By default a Zig module dependency is imported under its own `import_name` or its target name. | Dictionary: Label -> String | optional | `{}` | | linker_script | Custom linker script for the target.

Note, as of Zig version 0.15.1 linker-scripts require the LLVM/LLD backend to be enabled, see https://github.com/ziglang/zig/issues/25069. Set `zigopts=["-fllvm", "-flld"]` to that end. | Label | optional | `None` | | linkopts | Additional list of flags passed to the linker. Subject to location expansion. | List of strings | optional | `[]` | | main | The main source file.

If not set, deps must contain exactly one Zig module dependency which will be used as the root module. Note that in that case, 'srcs', 'extra_srcs' and 'csrcs' must also be empty as they are taken from the root module instead. | Label | optional | `None` | diff --git a/e2e/workspace/import-names-attr/BUILD.bazel b/e2e/workspace/import-names-attr/BUILD.bazel new file mode 100644 index 00000000..346b2617 --- /dev/null +++ b/e2e/workspace/import-names-attr/BUILD.bazel @@ -0,0 +1,31 @@ +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@rules_zig//zig:defs.bzl", "zig_binary", "zig_library") + +zig_library( + name = "greet", + import_name = "greeting", + main = "greet.zig", +) + +zig_library( + name = "lib", + import_names = {":greet": "salutation"}, + main = "lib.zig", + deps = [":greet"], +) + +zig_binary( + name = "binary", + import_names = {":greet": "hello"}, + main = "main.zig", + deps = [ + ":greet", + ":lib", + ], +) + +build_test( + name = "output_test", + size = "small", + targets = [":binary"], +) diff --git a/e2e/workspace/import-names-attr/greet.zig b/e2e/workspace/import-names-attr/greet.zig new file mode 100644 index 00000000..19b96ada --- /dev/null +++ b/e2e/workspace/import-names-attr/greet.zig @@ -0,0 +1 @@ +pub const msg = "Hello World!\n"; diff --git a/e2e/workspace/import-names-attr/lib.zig b/e2e/workspace/import-names-attr/lib.zig new file mode 100644 index 00000000..46808c42 --- /dev/null +++ b/e2e/workspace/import-names-attr/lib.zig @@ -0,0 +1,3 @@ +const salutation = @import("salutation"); + +pub const msg = salutation.msg; diff --git a/e2e/workspace/import-names-attr/main.zig b/e2e/workspace/import-names-attr/main.zig new file mode 100644 index 00000000..aba80802 --- /dev/null +++ b/e2e/workspace/import-names-attr/main.zig @@ -0,0 +1,17 @@ +const builtin = @import("builtin"); +const std = @import("std"); +const lib = @import("lib"); + +const greet = @import("hello"); + +const is_zig_0_16_or_later = builtin.zig_version.major == 0 and builtin.zig_version.minor >= 16; + +pub const main = if (is_zig_0_16_or_later) main_016 else main_pre_016; + +fn main_pre_016() void { + std.fs.File.stdout().writeAll(lib.msg ++ greet.msg) catch unreachable; +} + +fn main_016(init: std.process.Init) void { + std.Io.File.writeStreamingAll(.stdout(), init.io, lib.msg ++ greet.msg) catch unreachable; +} diff --git a/zig/private/common/zig_build.bzl b/zig/private/common/zig_build.bzl index bdf285bb..b322d5bc 100644 --- a/zig/private/common/zig_build.bzl +++ b/zig/private/common/zig_build.bzl @@ -94,6 +94,17 @@ Note that in that case, 'srcs', 'extra_srcs' and 'csrcs' must also be empty as t mandatory = False, providers = [[ZigModuleInfo], [CcInfo]], ), + "import_names": attr.label_keyed_string_dict( + doc = """\ +Override the import name under which a dependency is imported. + +Maps a dependency in `deps` to the name used to `@import` it from this target's +sources. By default a Zig module dependency is imported under its own +`import_name` or its target name. +""", + mandatory = False, + providers = [[ZigModuleInfo]], + ), "compiler_runtime": attr.string( doc = """\ Whether to include Zig compiler runtime symbols in the generated output. @@ -391,13 +402,24 @@ def zig_build_impl(ctx, *, kind): zdeps = [] cdeps = [] + dep_canonical_names = {} for dep in ctx.attr.deps: if ZigModuleInfo in dep: zdeps.append(dep[ZigModuleInfo]) + dep_canonical_names[dep[ZigModuleInfo].canonical_name] = None elif CcInfo in dep: cdeps.append(dep[CcInfo]) + import_names = {} + for dep, import_name in ctx.attr.import_names.items(): + canonical_name = dep[ZigModuleInfo].canonical_name + if canonical_name not in dep_canonical_names: + fail("import_names: '{}' must also be listed in deps.".format(dep.label)) + import_names[canonical_name] = import_name + if root_module_is_only_dep: + if ctx.attr.import_names: + fail("import_names has no effect when a single dependency is used as the root module; set `main` to define a module.") root_module = ctx.attr.deps[0][ZigModuleInfo] else: root_module = zig_module_info( @@ -409,6 +431,7 @@ def zig_build_impl(ctx, *, kind): deps = zdeps + [bazel_builtin_module(ctx)], cdeps = cdeps, zigopts = zigopts, + import_names = import_names, ) zig_settings( diff --git a/zig/private/providers/zig_module_info.bzl b/zig/private/providers/zig_module_info.bzl index b025c8ad..416d064c 100644 --- a/zig/private/providers/zig_module_info.bzl +++ b/zig/private/providers/zig_module_info.bzl @@ -27,8 +27,11 @@ ZigModuleInfo = provider( doc = DOC, ) -def _zig_module_context(name, canonical_name, main, deps, cdeps, zigopts): - mappings = [struct(name = dep.name, canonical_name = dep.canonical_name) for dep in deps] +def _zig_module_context(name, canonical_name, main, deps, cdeps, zigopts, import_names): + mappings = [ + struct(name = import_names.get(dep.canonical_name, dep.name), canonical_name = dep.canonical_name) + for dep in deps + ] if any([need_translate_c(dep) for dep in cdeps]): # Global C module has a predefined name and canonical name since it is not defined yet here. mappings.append(struct(name = "c", canonical_name = "c")) @@ -40,7 +43,7 @@ def _zig_module_context(name, canonical_name, main, deps, cdeps, zigopts): dependency_mappings = tuple(mappings), ) -def zig_module_info(*, name, canonical_name, main, srcs = [], extra_srcs = [], deps = [], cdeps = [], zigopts = []): +def zig_module_info(*, name, canonical_name, main, srcs = [], extra_srcs = [], deps = [], cdeps = [], zigopts = [], import_names = {}): """Create `ZigModuleInfo` for a new Zig module. Args: @@ -52,6 +55,9 @@ def zig_module_info(*, name, canonical_name, main, srcs = [], extra_srcs = [], d deps: list of ZigModuleInfo, Import dependencies of this module. cdeps: list of CcInfo, C dependencies of this module. zigopts: list of string, Additional list of flags passed to the zig compiler. + import_names: dict of string to string, Override the import name of a + dependency, keyed by the dependency's canonical name. A dependency not + listed is imported under its own `name`. Returns: `ZigModuleInfo` @@ -59,7 +65,7 @@ def zig_module_info(*, name, canonical_name, main, srcs = [], extra_srcs = [], d cc_infos = cdeps + [dep.cc_info for dep in deps if dep.cc_info] cc_info = cc_common.merge_cc_infos(direct_cc_infos = cc_infos) - module_context = _zig_module_context(name, canonical_name, main, deps, cdeps, zigopts) + module_context = _zig_module_context(name, canonical_name, main, deps, cdeps, zigopts, import_names) module = ZigModuleInfo( name = name, diff --git a/zig/private/zig_library.bzl b/zig/private/zig_library.bzl index 669be48b..f5a98725 100644 --- a/zig/private/zig_library.bzl +++ b/zig/private/zig_library.bzl @@ -68,6 +68,17 @@ ATTRS = { mandatory = False, providers = [[ZigModuleInfo], [CcInfo]], ), + "import_names": attr.label_keyed_string_dict( + doc = """\ +Override the import name under which a dependency is imported. + +Maps a dependency in `deps` to the name used to `@import` it from this target's +sources. By default a Zig module dependency is imported under its own +`import_name` or its target name. +""", + mandatory = False, + providers = [[ZigModuleInfo]], + ), "data": attr.label_list( allow_files = True, doc = "Files required by the module during runtime.", @@ -105,12 +116,21 @@ def _zig_library_impl(ctx): zdeps = [] cdeps = [] + dep_canonical_names = {} for dep in ctx.attr.deps: if ZigModuleInfo in dep: zdeps.append(dep[ZigModuleInfo]) + dep_canonical_names[dep[ZigModuleInfo].canonical_name] = None elif CcInfo in dep: cdeps.append(dep[CcInfo]) + import_names = {} + for dep, override in ctx.attr.import_names.items(): + canonical_name = dep[ZigModuleInfo].canonical_name + if canonical_name not in dep_canonical_names: + fail("import_names: '{}' must also be listed in deps.".format(dep.label)) + import_names[canonical_name] = override + import_name = ctx.attr.import_name or ctx.label.name module = zig_module_info( name = import_name, @@ -124,6 +144,7 @@ def _zig_library_impl(ctx): deps = zdeps + [bazel_builtin_module(ctx)], cdeps = cdeps, zigopts = ctx.attr.zigopts, + import_names = import_names, ) return [default, module]