summaryrefslogtreecommitdiffhomepage
path: root/tools/go_marshal/defs.bzl
blob: f44f83eabd4f1aacb2ff2a682c43408dbc5e067e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
"""Marshal is a tool for generating marshalling interfaces for Go types."""

def _go_marshal_impl(ctx):
    """Execute the go_marshal tool."""
    output = ctx.outputs.lib
    output_test = ctx.outputs.test
    output_test_unconditional = ctx.outputs.test_unconditional

    # Run the marshal command.
    args = ["-output=%s" % output.path]
    args.append("-pkg=%s" % ctx.attr.package)
    args.append("-output_test=%s" % output_test.path)
    args.append("-output_test_unconditional=%s" % output_test_unconditional.path)

    if ctx.attr.debug:
        args += ["-debug"]

    args += ["--"]
    for src in ctx.attr.srcs:
        args += [f.path for f in src.files.to_list()]
    ctx.actions.run(
        inputs = ctx.files.srcs,
        outputs = [output, output_test, output_test_unconditional],
        mnemonic = "GoMarshal",
        progress_message = "go_marshal: %s" % ctx.label,
        arguments = args,
        executable = ctx.executable._tool,
    )

# Generates save and restore logic from a set of Go files.
#
# Args:
#   name: the name of the rule.
#   srcs: the input source files. These files should include all structs in the
#         package that need to be saved.
#   imports: an optional list of extra, non-aliased, Go-style absolute import
#            paths.
#   out: the name of the generated file output. This must not conflict with any
#        other files and must be added to the srcs of the relevant go_library.
#   package: the package name for the input sources.
go_marshal = rule(
    implementation = _go_marshal_impl,
    attrs = {
        "srcs": attr.label_list(mandatory = True, allow_files = True),
        "imports": attr.string_list(mandatory = False),
        "package": attr.string(mandatory = True),
        "debug": attr.bool(doc = "enable debugging output from the go_marshal tool"),
        "_tool": attr.label(executable = True, cfg = "host", default = Label("//tools/go_marshal:go_marshal")),
    },
    outputs = {
        "lib": "%{name}_unsafe.go",
        "test": "%{name}_test.go",
        "test_unconditional": "%{name}_unconditional_test.go",
    },
)

# marshal_deps are the dependencies requied by generated code.
marshal_deps = [
    "//pkg/gohacks",
    "//pkg/safecopy",
    "//pkg/usermem",
    "//pkg/marshal",
]

# marshal_test_deps are required by test targets.
marshal_test_deps = [
    "//tools/go_marshal/analysis",
]