Skip to content

Commit 76a0f1f

Browse files
committed
feat: Add imports and string_imports attributes to support non-Bazel directory layouts.
1 parent 4f5a31e commit 76a0f1f

File tree

7 files changed

+74
-25
lines changed

7 files changed

+74
-25
lines changed

d/private/providers.bzl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,35 @@
33
def _dinfo_init(
44
*,
55
compile_flags = None,
6-
import_paths = None,
76
imports = None,
7+
interface_srcs = None,
88
libraries = None,
99
linker_flags = None,
1010
source_only = False,
11-
string_import_paths = None,
11+
string_imports = None,
1212
versions = None):
1313
"""Initializes the DInfo provider."""
1414
return {
1515
"compile_flags": compile_flags or [],
16-
"import_paths": import_paths or depset(),
1716
"imports": imports or depset(),
17+
"interface_srcs": interface_srcs or depset(),
1818
"libraries": libraries or depset(),
1919
"linker_flags": linker_flags or [],
2020
"source_only": source_only,
21-
"string_import_paths": string_import_paths or depset(),
21+
"string_imports": string_imports or depset(),
2222
"versions": versions or depset(),
2323
}
2424

2525
DInfo, _new_dinfo = provider(
2626
doc = "Provider containing D compilation information",
2727
fields = {
2828
"compile_flags": "List of compiler flags.",
29-
"import_paths": "A depset of import paths.",
30-
"imports": "A depset of imported D files, transitive import included.",
29+
"imports": "A depset of import paths.",
30+
"interface_srcs": "A depset of interface source files, transitive sources included.",
3131
"libraries": "A depset of libraries, transitive libraries too.",
3232
"linker_flags": "List of linker flags, passed directly to the linker.",
3333
"source_only": "If true, the source files are compiled, but no library is produced.",
34-
"string_import_paths": "A depset of string import paths.",
34+
"string_imports": "A depset of string import paths.",
3535
"versions": "A depset of version identifiers.",
3636
},
3737
init = _dinfo_init,

d/private/rules/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ bzl_library(
2424
],
2525
deps = [
2626
"//d/private:providers",
27+
"@bazel_skylib//lib:paths",
2728
"@rules_cc//cc/common",
2829
],
2930
)

d/private/rules/common.bzl

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""Common definitions for D rules."""
22

3+
load("@bazel_skylib//lib:paths.bzl", "paths")
34
load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
45
load("//d/private:providers.bzl", "DInfo")
56

@@ -18,6 +19,8 @@ common_attrs = {
1819
allow_empty = False,
1920
),
2021
"deps": attr.label_list(doc = "List of dependencies.", providers = [[CcInfo], [DInfo]]),
22+
"imports": attr.string_list(doc = "List of import paths."),
23+
"string_imports": attr.string_list(doc = "List of string import paths."),
2124
"string_srcs": attr.label_list(doc = "List of string import source files."),
2225
"versions": attr.string_list(doc = "List of version identifiers."),
2326
"_linux_constraint": attr.label(default = "@platforms//os:linux", doc = "Linux platform constraint"),
@@ -97,17 +100,21 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
97100
for lib in li.libraries
98101
])
99102
d_deps = [d[DInfo] for d in ctx.attr.deps if DInfo in d]
100-
import_paths = depset(transitive = [d.import_paths for d in d_deps])
101-
string_import_paths = depset(
102-
["."] if ctx.files.string_srcs else [],
103-
transitive = [d.string_import_paths for d in d_deps],
103+
imports = depset(
104+
[paths.join(ctx.label.package, imp) for imp in ctx.attr.imports],
105+
transitive = [d.imports for d in d_deps],
106+
)
107+
string_imports = depset(
108+
([ctx.label_package] if ctx.files.string_srcs else []) +
109+
[paths.join(ctx.label.package, imp) for imp in ctx.attr.string_imports],
110+
transitive = [d.string_imports for d in d_deps],
104111
)
105112
versions = depset(ctx.attr.versions, transitive = [d.versions for d in d_deps])
106113
args = ctx.actions.args()
107114
args.add_all(COMPILATION_MODE_FLAGS[ctx.var["COMPILATION_MODE"]])
108115
args.add_all(ctx.files.srcs)
109-
args.add_all(import_paths.to_list(), format_each = "-I=%s")
110-
args.add_all(string_import_paths.to_list(), format_each = "-J=%s")
116+
args.add_all(imports.to_list(), format_each = "-I=%s")
117+
args.add_all(string_imports.to_list(), format_each = "-J=%s")
111118
args.add_all(toolchain.compiler_flags)
112119
args.add_all(versions.to_list(), format_each = "-version=%s")
113120
args.add_all(toolchain.linker_flags)
@@ -131,7 +138,7 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
131138
inputs = depset(
132139
ctx.files.srcs + ctx.files.string_srcs,
133140
transitive = [toolchain.d_compiler[DefaultInfo].default_runfiles.files] +
134-
[d.imports for d in d_deps] +
141+
[d.interface_srcs for d in d_deps] +
135142
[d.libraries for d in d_deps] +
136143
[c_libraries],
137144
),
@@ -147,23 +154,25 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
147154
return [
148155
DefaultInfo(files = depset([output])),
149156
DInfo(
150-
import_paths = depset(
151-
[ctx.label.package],
152-
transitive = [d.import_paths for d in d_deps],
153-
),
154157
imports = depset(
155-
ctx.files.srcs + ctx.files.string_srcs,
158+
[ctx.label.package] +
159+
[paths.join(ctx.label.package, imp) for imp in ctx.attr.imports],
156160
transitive = [d.imports for d in d_deps],
157161
),
162+
interface_srcs = depset(
163+
ctx.files.srcs + ctx.files.string_srcs,
164+
transitive = [d.interface_srcs for d in d_deps],
165+
),
158166
libraries = depset(
159167
[] if ctx.attr.source_only else [output],
160168
order = "topological",
161169
transitive = [d.libraries for d in d_deps] +
162170
[c_libraries],
163171
),
164-
string_import_paths = depset(
165-
[ctx.label.package] if ctx.files.string_srcs else [],
166-
transitive = [d.string_import_paths for d in d_deps],
172+
string_imports = depset(
173+
([ctx.label.package] if ctx.files.string_srcs else []) +
174+
[paths.join(ctx.label.package, imp) for imp in ctx.attr.string_imports],
175+
transitive = [d.string_imports for d in d_deps],
167176
),
168177
versions = versions,
169178
),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
load("@bazel_skylib//rules:build_test.bzl", "build_test")
2+
load("@rules_d//d:defs.bzl", "d_binary", "d_library")
3+
4+
d_library(
5+
name = "no_prefix_import",
6+
srcs = ["path1/no_prefix_import.d"],
7+
imports = ["path1"],
8+
)
9+
10+
d_binary(
11+
name = "imports_attribute",
12+
srcs = [
13+
"main.d",
14+
],
15+
deps = [":no_prefix_import"],
16+
)
17+
18+
build_test(
19+
name = "imports_attribute_test",
20+
targets = [":imports_attribute"],
21+
)

d/tests/imports_attribute/main.d

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import no_prefix_import;
2+
3+
void main()
4+
{
5+
no_prefix_import.foo();
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import std.stdio;
2+
3+
void foo()
4+
{
5+
writeln("Hello without prefix!");
6+
}

docs/rules.md

Lines changed: 9 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)