| def _gostatic_tarball_impl(ctx): |
| out = ctx.actions.declare_directory("out") |
| tarball_name = ctx.attr.name + ".tar" |
| tarball = ctx.actions.declare_file(tarball_name) |
| |
| config_name = ctx.attr.name + ".config" |
| config = ctx.actions.declare_file(config_name) |
| |
| # Build path to root of sources, based on source_dir |
| # and location of the instantiating BUILDfile |
| # (source_dir is defined as relative to the BUILD file). |
| source_dir = '/'.join(ctx.build_file_path.split('/')[:-1]) + '/' + ctx.attr.source_dir |
| |
| # Relative path to go up from generated config to build |
| # root. This is because gostatic is magical and really |
| # wants the config to be alongside the source. |
| up = "../" * (config.path.count("/")) |
| templates = " ".join([up + f.path for f in ctx.files.templates]) |
| config_lines = [ |
| "OUTPUT = {}".format(up + out.path), |
| "TEMPLATES = {}".format(templates), |
| "SOURCE = {}".format(up + source_dir), |
| ] |
| config_content = "\n".join(config_lines) |
| config_content += ctx.attr.extra_config |
| |
| ctx.actions.write(config, config_content) |
| |
| ctx.actions.run( |
| outputs = [out], |
| inputs = [config] + ctx.files.templates + ctx.files.srcs, |
| executable = ctx.file._gostatic, |
| arguments = [config.path], |
| ) |
| ctx.actions.run( |
| outputs = [tarball], |
| inputs = [out], |
| executable = ctx.file._tarify, |
| arguments = [ |
| "-site", out.path, |
| "-tarball", tarball.path, |
| ], |
| ) |
| |
| return [DefaultInfo(files=depset([tarball]))] |
| |
| gostatic_tarball = rule( |
| implementation = _gostatic_tarball_impl, |
| attrs = { |
| "extra_config": attr.string( |
| mandatory = True, |
| doc = """ |
| Gostatic configuration (rules, etc). Do not specify OUTPUT, TEMPLATES |
| or SOURCES - these are automatically generated. |
| """, |
| ), |
| "source_dir": attr.string( |
| mandatory = True, |
| doc = "Root of site sources. Relative to BUILDfile.", |
| ), |
| "srcs": attr.label_list( |
| allow_files = True, |
| doc = "Site sources, all must be contained within source_dir" |
| ), |
| "templates": attr.label_list( |
| allow_files = True, |
| doc = "Templates to use (passed to TEMPLATES in gostatic config).", |
| ), |
| "_gostatic": attr.label( |
| default = Label("//tools/gostatic"), |
| allow_single_file = True, |
| executable = True, |
| cfg = "exec", |
| doc = "Path to gostatic binary.", |
| ), |
| "_tarify": attr.label( |
| default = Label("//tools/gostatic/tarify"), |
| allow_single_file = True, |
| executable = True, |
| cfg = "exec", |
| doc = "Path to tarify binary.", |
| ), |
| }, |
| ) |