Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bazelbuild/rules_d
D rules for Bazel
https://github.com/bazelbuild/rules_d
bazel bazel-rules dlang dub
Last synced: 24 days ago
JSON representation
D rules for Bazel
- Host: GitHub
- URL: https://github.com/bazelbuild/rules_d
- Owner: bazelbuild
- License: apache-2.0
- Created: 2016-03-15T15:04:29.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2023-07-05T00:38:09.000Z (over 1 year ago)
- Last Synced: 2024-11-12T23:14:44.985Z (3 months ago)
- Topics: bazel, bazel-rules, dlang, dub
- Language: Starlark
- Size: 67.4 KB
- Stars: 24
- Watchers: 26
- Forks: 29
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.txt
- Codeowners: CODEOWNERS
- Authors: AUTHORS
Awesome Lists containing this project
- awesome-bazel - D
README
[![Build status](https://badge.buildkite.com/255dd622ff5647b60b08b6578e49df80f78c9b0d88f2758491.svg)](https://buildkite.com/bazel/rules-d)
# D rules
## Status
We make sure this repository works with the latest version of Bazel, but no
other development is planned.Volunteers are welcome. If you want to use the rules, consider contributing to
this repository and becoming a maintainer.## Rules
## Setup
To use the D rules, add the following to your `WORKSPACE` file to add the
external repositories for the D toolchain:```python
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "io_bazel_rules_d",
urls = ["https://github.com/bazelbuild/rules_d/archive/bcf137e3c9381545ce54715632bc1d31c51ee4da.tar.gz"],
sha256 = "a32847bf2ae634563dece49c4dc8353956b64ba5c2d01ce811ea243e1a21b5b7",
strip_prefix = "rules_d-bcf137e3c9381545ce54715632bc1d31c51ee4da",
)load("@io_bazel_rules_d//d:d.bzl", "d_repositories")
d_repositories()
```## Roadmap
* Generate documentation using [`ddox`](https://github.com/rejectedsoftware/ddox)
for `d_docs` rule.
* Support for other options as defined in the [Dub package
format](http://code.dlang.org/package-format?lang=json)
* Support for specifying different configurations of a library, closer to
[Dub's model for configurations](http://code.dlang.org/package-format?lang=json#configurations)
* Workspace rule for retrieving dependencies from [Dub](http://code.dlang.org/)```python
d_library(name, srcs, deps, includes, linkopts, versions)
```
Attributes
name
Name, required
A unique name for this rule.
This name will be used as the name of the library built by this rule.
srcs
List of labels, required
List of D
.d
source files used to build the library.
deps
List of labels, optional
List of libraries to be linked to this library target.
These can either be otherd_library
targets,
source-onlyd_source_library
targets, or
cc_library
targets if linking a native library.
imports
List of strings, optional
List of import dirs to add to the compile line.
These will be passed to the D compiler via-I
flags.
linkopts
List of strings, optional
List of flags that are added to the D linker command.
These will be passed to the D compiler via-L
flags.
versions
List of strings, optional
List of versions to be defined during compilation.
Versions are used for conditional compilation and are enabled in the
code usingversion
condition blocks. These versions
listed here will be passed to the D compiler using
-version
flags.
### 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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "d_library")d_library(
name = "foo",
srcs = [
"foo.d",
"bar.d",
"baz.d",
],
)
``````python
d_source_library(name, srcs, deps, includes, linkopts, versions)
```
Attributes
name
Name, required
A unique name for this rule.
srcs
List of labels, required
List of D.d
source files that comprises this source
library target.
deps
List of labels, optional
List of library targets depended on by this target.
These can either be otherd_source_library
targets or
cc_library
targets, such as when this source library
target implements the D interface for a native library. Any native
libraries will be linked byd_library
targets that
depend on this target.
imports
List of strings, optional
List of import dirs to add to the compile line.
These will be passed to the D compiler via-I
flags for
anyd_library
targets that depend on this target.
linkopts
List of strings, optional
List of flags that are added to the D linker command.
These will be passed to the D compiler via-L
flags for
anyd_library
targets that depend on this target.
versions
List of strings, optional
List of version flags to be defined during compilation.
Versions are used for conditional compilation and are enabled in the
code usingversion
condition blocks. These versions
listed here will be passed to the D compiler using
-version
flags for anyd_library
targets
that depend on this target.
### Example
Suppose you have the following directory structure for a project building a
C library and a [D interface](http://dlang.org/interfaceToC.html) 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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "d_source_library")d_binary(
name = "hello_world",
srcs = ["hello_world.d"],
deps = ["//greeter:native_greeter"],
)
``````python
d_binary(name, srcs, deps, includes, linkopts, versions)
```
Attributes
name
Name, required
A unique name for this rule.
This name will be used as the name of the binary built by this rule.
srcs
List of labels, required
List of D
.d
source files used to build the binary.
deps
List of labels, optional
List of libraries to be linked to this binary target.
These can either be otherd_library
targets,
source-onlyd_source_library
targets, or
cc_library
targets if linking a native library.
imports
List of strings, optional
List of import dirs to add to the compile line.
These will be passed to the D compiler via-I
flags.
linkopts
List of strings, optional
List of flags that are added to the D linker command.
These will be passed to the D compiler via-L
flags.
versions
List of strings, optional
List of versions to be defined during compilation.
Versions are used for conditional compilation and are enabled in the
code usingversion
condition blocks. These versions
listed here will be passed to the D compiler using
-version
flags.
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`:
```d
module greeter;
...
```The `hello_lib` library is built using a `d_library` target:
`hello_lib/BUILD`:
```python
load("@io_bazel_rules_d//d:d.bzl", "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:```d
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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "d_library")d_binary(
name = "hello_world",
srcs = ["hello_world.d"],
deps = ["//hello_lib"],
)
``````python
d_test(name, srcs, deps, includes, linkopts, versions)
```
Attributes
name
Name, required
A unique name for this rule.
This name will be used as the name of the test built by this rule.
srcs
List of labels, required
List of D
.d
source files used to build the test.
deps
List of labels, optional
List of libraries to be linked to this test target.
These can either be otherd_library
targets,
source-onlyd_source_library
targets, or
cc_library
targets if linking a native library.
imports
List of strings, optional
List of import dirs to add to the compile line.
These will be passed to the D compiler via-I
flags.
linkopts
List of strings, optional
List of flags that are added to the D linker command.
These will be passed to the D compiler via-L
flags.
versions
List of strings, optional
List of versions to be defined during compilation.
Versions are used for conditional compilation and are enabled in the
code usingversion
condition blocks. These versions
listed here will be passed to the D compiler using
-version
flags.
### 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`:
```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`:
```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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "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:
```sh
bazel test //hello_lib:greeter_test
``````python
d_docs(name, dep)
```
Attributes
name
Name, required
A unique name for this rule.
dep
Label, required
The label of the target to generate code documentation for.
d_docs
can generate HTML code documentation for the
source files ofd_library
,d_source_library
,
d_binary
, ord_test
targets.
### 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`:
```python
load("@io_bazel_rules_d//d:d.bzl", "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](http://dlang.org/ddoc.html) for
more information on the conventions for source documentation.