""" Internal tools to migrate shell commands to Bazel as an intermediate step to wider Bazelification. """ load("@rules_shell//shell:sh_binary.bzl", "sh_binary") load("@rules_shell//shell:sh_test.bzl", "sh_test") def inline_sh_binary( name, srcs = [], tools = [], deps = [], cmd = "", **kwargs): """Bazel rule to wrap up an inline bash script in a binary. This is most useful as a stop-gap solution for migrating off Autotools. These binaries are likely to be non-hermetic, with implicit system dependencies. NOTE: the rule is only an internal workaround. The interface may change and the rule may be removed when everything is properly "Bazelified". Args: name: the name of the inline_sh_binary. srcs: the files used directly by the script. tools: the executable tools used directly by the script. Any target used with rootpath/execpath/location must be declared here or in `srcs`. deps: a list of dependency labels that are required to run this binary. cmd: the inline sh command to run. **kwargs: other keyword arguments that are passed to sh_binary. """ native.genrule( name = name + "_genrule", srcs = srcs, tools = tools, outs = [name + ".sh"], cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd, visibility = ["//visibility:private"], tags = kwargs["tags"] if "tags" in kwargs else None, target_compatible_with = kwargs["target_compatible_with"] if "target_compatible_with" in kwargs else None, testonly = kwargs["testonly"] if "testonly" in kwargs else None, ) sh_binary( name = name, srcs = [name + "_genrule"], data = srcs + tools + deps, **kwargs ) def inline_sh_test( name, srcs = [], tools = [], deps = [], cmd = "", **kwargs): """Bazel rule to wrap up an inline bash script in a test. This is most useful as a stop-gap solution for migrating off Autotools. These tests are likely to be non-hermetic, with implicit system dependencies. NOTE: the rule is only an internal workaround. The interface may change and the rule may be removed when everything is properly "Bazelified". Args: name: the name of the inline_sh_binary. srcs: the files used directly by the script. tools: the executable tools used directly by the script. Any target used with rootpath/execpath/location must be declared here or in `srcs`. deps: a list of dependency labels that are required to run this binary. cmd: the inline sh command to run. **kwargs: other keyword arguments that are passed to sh_binary. https://bazel.build/reference/be/common-definitions#common-attributes) """ native.genrule( name = name + "_genrule", srcs = srcs, tools = tools, outs = [name + ".sh"], cmd = "cat <<'EOF' >$(OUTS)\n#!/bin/bash -exu\n%s\nEOF\n" % cmd, visibility = ["//visibility:private"], tags = kwargs["tags"] if "tags" in kwargs else None, target_compatible_with = kwargs["target_compatible_with"] if "target_compatible_with" in kwargs else None, testonly = kwargs["testonly"] if "testonly" in kwargs else None, ) sh_test( name = name, srcs = [name + "_genrule"], data = srcs + tools + deps, **kwargs )