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.", ), }, )