Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions docs/rules.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions e2e/workspace/multiple-sources-and-packages-test/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
load("@rules_zig//zig:defs.bzl", "zig_package", "zig_test")

zig_test(
name = "test",
srcs = [
"test/a.zig",
"test/b.zig",
],
main = "main.zig",
deps = [
":pkg",
],
)

zig_package(
name = "pkg",
main = "pkg/main.zig",
)
11 changes: 11 additions & 0 deletions e2e/workspace/multiple-sources-and-packages-test/main.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const std = @import("std");
const pkg = @import("pkg");

test "1 + 1" {
try std.testing.expectEqual(@as(i64, 2), pkg.add(1, 1));
}

test {
_ = @import("test/a.zig");
_ = @import("test/b.zig");
}
3 changes: 3 additions & 0 deletions e2e/workspace/multiple-sources-and-packages-test/pkg/main.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pub fn add(a: i64, b: i64) i64 {
return a + b;
}
6 changes: 6 additions & 0 deletions e2e/workspace/multiple-sources-and-packages-test/test/a.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const std = @import("std");
const pkg = @import("pkg");

test "1 + 2" {
try std.testing.expectEqual(@as(i64, 3), pkg.add(1, 2));
}
6 changes: 6 additions & 0 deletions e2e/workspace/multiple-sources-and-packages-test/test/b.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const std = @import("std");
const pkg = @import("pkg");

test "1 + 3" {
try std.testing.expectEqual(@as(i64, 4), pkg.add(1, 3));
}
6 changes: 6 additions & 0 deletions e2e/workspace/simple-test/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
load("@rules_zig//zig:defs.bzl", "zig_test")

zig_test(
name = "test",
main = "main.zig",
)
5 changes: 5 additions & 0 deletions e2e/workspace/simple-test/main.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const std = @import("std");

test "simple" {
try std.testing.expectEqual(2, 1 + 1);
}
1 change: 1 addition & 0 deletions zig/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ bzl_library(
"//zig/private:zig_binary",
"//zig/private:zig_library",
"//zig/private:zig_package",
"//zig/private:zig_test",
],
)

Expand Down
2 changes: 2 additions & 0 deletions zig/defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
load("//zig/private:zig_binary.bzl", _zig_binary = "zig_binary")
load("//zig/private:zig_library.bzl", _zig_library = "zig_library")
load("//zig/private:zig_package.bzl", _zig_package = "zig_package")
load("//zig/private:zig_test.bzl", _zig_test = "zig_test")

zig_binary = _zig_binary
zig_library = _zig_library
zig_package = _zig_package
zig_test = _zig_test
11 changes: 11 additions & 0 deletions zig/private/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ bzl_library(
],
)

bzl_library(
name = "zig_test",
srcs = ["zig_test.bzl"],
visibility = ["//zig:__subpackages__"],
deps = [
"//zig/private/common:filetypes",
"//zig/private/common:zig_cache",
"//zig/private/providers:zig_package_info",
],
)

bzl_library(
name = "toolchains_repo",
srcs = ["toolchains_repo.bzl"],
Expand Down
90 changes: 90 additions & 0 deletions zig/private/zig_test.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
"""Implementation of the zig_test rule."""

load("//zig/private/common:filetypes.bzl", "ZIG_SOURCE_EXTENSIONS")
load("//zig/private/common:zig_cache.bzl", "zig_cache_output")
load(
"//zig/private/providers:zig_package_info.bzl",
"ZigPackageInfo",
"zig_package_dependencies",
)

DOC = """\
"""

ATTRS = {
"main": attr.label(
allow_single_file = ZIG_SOURCE_EXTENSIONS,
doc = "The main source file.",
mandatory = True,
),
"srcs": attr.label_list(
allow_files = ZIG_SOURCE_EXTENSIONS,
doc = "Other source files required to build the target.",
mandatory = False,
),
"deps": attr.label_list(
doc = "Packages or libraries required to build the target.",
mandatory = False,
providers = [ZigPackageInfo],
),
}

def _zig_test_impl(ctx):
ziginfo = ctx.toolchains["//zig:toolchain_type"].ziginfo

outputs = []

direct_inputs = []
transitive_inputs = []

args = ctx.actions.args()
args.use_param_file("@%s")

# TODO[AH] Append `.exe` extension on Windows.
output = ctx.actions.declare_file(ctx.label.name)
outputs.append(output)
args.add(output, format = "-femit-bin=%s")

direct_inputs.append(ctx.file.main)
direct_inputs.extend(ctx.files.srcs)
args.add(ctx.file.main)

zig_package_dependencies(
deps = ctx.attr.deps,
inputs = transitive_inputs,
args = args,
)

zig_cache_output(
actions = ctx.actions,
name = ctx.label.name,
outputs = outputs,
args = args,
)

ctx.actions.run(
outputs = outputs,
inputs = depset(direct = direct_inputs, transitive = transitive_inputs),
executable = ziginfo.target_tool_path,
tools = ziginfo.tool_files,
arguments = ["test", "--test-no-exec", args],
mnemonic = "ZigBuildTest",
progress_message = "Building %{input} as Zig test %{output}",
execution_requirements = {tag: "" for tag in ctx.attr.tags},
)

default = DefaultInfo(
executable = output,
files = depset([output]),
runfiles = ctx.runfiles(files = [output]),
)

return [default]

zig_test = rule(
_zig_test_impl,
attrs = ATTRS,
doc = DOC,
test = True,
toolchains = ["//zig:toolchain_type"],
)