tree: 08ab938f06b3672c8264b5b42ef28a2272716cd8 [path history] [tgz]
  1. BUILD
  2. d.bzl
  3. README.md
tools/build_defs/d/README.md

D rules

Rules

Setup

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()

Roadmap

d_library

d_library(name, srcs, deps, includes, linkopts, versions)

Example

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

d_source_library(name, srcs, deps, includes, linkopts, versions)

Example

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

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

d_test(name, srcs, deps, includes, linkopts, versions)

Example

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

d_docs(name, dep)

Example

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.