summaryrefslogtreecommitdiffhomepage
path: root/tools/go_stateify/defs.bzl
blob: 87fdc0d285d756f1579ac6c5829409cea0c4d5b8 (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
69
70
71
72
73
74
75
76
77
"""Stateify is a tool for generating state wrappers for Go types.

The go_stateify rule is used to generate a file that will appear in a Go
target; the output file should appear explicitly in a srcs list. For example:

go_stateify(
    name = "foo_state",
    srcs = ["foo.go"],
    out = "foo_state.go",
    package = "foo",
)

go_library(
    name = "foo",
    srcs = [
        "foo.go",
        "foo_state.go",
    ],
    deps = [
        "//pkg/state",
    ],
)
"""

def _go_stateify_impl(ctx):
  """Implementation for the stateify tool."""
  output = ctx.outputs.out

  # Run the stateify command.
  args = ["-output=%s" % output.path]
  args += ["-pkg=%s" % ctx.attr.package]
  if ctx.attr._statepkg:
    args += ["-statepkg=%s" % ctx.attr._statepkg]
  if ctx.attr.imports:
    args += ["-imports=%s" % ",".join(ctx.attr.imports)]
  args += ["--"]
  for src in ctx.attr.srcs:
    args += [f.path for f in src.files]
  ctx.actions.run(
      inputs = ctx.files.srcs,
      outputs = [output],
      mnemonic = "GoStateify",
      progress_message = "Generating state library %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_stateify = rule(
    attrs = {
        "srcs": attr.label_list(
            mandatory = True,
            allow_files = True,
        ),
        "imports": attr.string_list(mandatory = False),
        "package": attr.string(mandatory = True),
        "out": attr.output(mandatory = True),
        "_tool": attr.label(
            executable = True,
            cfg = "host",
            default = Label("//tools/go_stateify:stateify"),
        ),
        "_statepkg": attr.string(default = "gvisor.googlesource.com/gvisor/pkg/state"),
    },
    implementation = _go_stateify_impl,
)