To use the D rules, add the following to your WORKSPACE file to add the external repositories for the D toolchain:
load("@bazel_tools//tools/build_defs/d:d.bzl", "d_repositories") d_repositories()
ddox for d_docs rule.d_library(name, srcs, deps, includes, linkopts, versions)
Suppose you have the following directory structure for a D project:
[workspace]/
WORKSPACE
foo/
BUILD
foo.d
bar.d
baz.d
The library foo is built using a d_library target:
foo/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_library") d_binary( name = "foo", srcs = [ "foo.d", "bar.d", "baz.d", ], )
d_source_library(name, srcs, deps, includes, linkopts, versions)
Suppose you have the following directory structure for a project building a C library and a D interface for the C library:
[workspace]/
WORKSPACE
greeter/
BUILD
native_greeter.c
native_greeter.h
native_greeter.d
hello_world
BUILD
hello_world.d
Build the C library using the cc_library rule and then use the d_source_library to define the target for the D interface for the C native_greeter library:
greeter/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_source_library") cc_library( name = "native_greeter_lib", srcs = ["native_greeter.c"], hdrs = ["native_greeter.h"], ) d_source_library( name = "native_greeter", srcs = ["native_greeter.d"], deps = [":native_greeter_lib"], )
Other targets can directly depend on the d_source_library target to link the C library:
hello_world/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_source_library") d_binary( name = "hello_world", srcs = ["hello_world.d"], deps = ["//greeter:native_greeter"], )
d_binary(name, srcs, deps, includes, linkopts, versions)
Suppose you have the following directory structure for a D project:
[workspace]/
WORKSPACE
hello_lib/
BUILD
greeter.d
hello_world
BUILD
hello_world.d
The source file hello_lib/greeter.d defines a module greeter:
module greeter; ...
The hello_lib library is built using a d_library target:
hello_lib/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_library") d_library( name = "hello_lib", srcs = ["greeter.d"], )
By default, import paths are from the root of the workspace. Thus, the source for the hello_world binary, hello_world.d, would import the greeter module as follows:
import hello_lib.greeter;
However, this can be changed via the imports attribute on the d_library rule.
The hello_world binary is built using a d_binary target:
hello_world/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_library") d_binary( name = "hello_world", srcs = ["hello_world.d"], deps = ["//hello_lib"], )
d_test(name, srcs, deps, includes, linkopts, versions)
Suppose you have the following directory structure for a D project:
[workspace]/
WORKSPACE
hello_lib/
BUILD
greeter.d
greeter_test.d
hello_lib/greeter.d:
module greeter; import std.stdio; import std.string; class Greeter { private string greeting; public: this(in string greeting) { this.greeting = greeting.dup; } string makeGreeting(in immutable string thing) { return format("%s %s!", this.greeting, thing); } void greet(in immutable string thing) { writeln(makeGreeting(thing)); } }
hello_lib/greeter_test.d:
import hello_lib.greeter; unittest { auto greeter = new Greeter("Hello"); assert(greeter.makeGreeting("world") == "Hello world!"); } void main() {}
To build the library and unit test:
hello_lib/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_library", "d_test") d_library( name = "greeter", srcs = ["greeter.d"], ) d_test( name = "greeter_test", srcs = ["greeter_test.d"], deps = [":greeter"], )
The unit test can then be run using:
bazel test //hello_lib:greeter_test
d_docs(name, dep)
Suppose you have the following directory structure for a D project:
[workspace]/
WORKSPACE
foo/
BUILD
foo.d
bar.d
baz.d
The foo/ directory contains the sources for the d_library foo. To generate HTML documentation for the foo library, define a d_docs target that takes the d_library foo as its dependency:
foo/BUILD:
load("@bazel_tools//tools/build_defs/d/d", "d_library", "d_docs") d_library( name = "foo", srcs = [ "foo.d", "bar.d", "baz.d", ], ) d_docs( name = "foo_docs", dep = ":foo", )
Running bazel build //foo:foo_docs will generate a zip file containing the HTML documentation generated from the source files. See the official D language documentation on the Documentation Generator for more information on the conventions for source documentation.