| # Copyright 2022 The IREE Authors | |
| # | |
| # Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| """native_binary() and native_test() rule implementations. | |
| Rewritten from the Bazel Skylib version pending several fixes and improvements | |
| to that rule: | |
| - https://github.com/bazelbuild/bazel-skylib/pull/338 | |
| - https://github.com/bazelbuild/bazel-skylib/pull/339 | |
| - https://github.com/bazelbuild/bazel-skylib/pull/340 | |
| - https://github.com/bazelbuild/bazel-skylib/pull/341 | |
| These rules let you wrap a pre-built binary or script in a conventional binary | |
| and test rule respectively. They fulfill the same goal as sh_binary and sh_test | |
| do, but they run the wrapped binary directly, instead of through Bash, so they | |
| don't depend on Bash and work with --shell_exectuable="". | |
| """ | |
| def _shared_impl(ctx): | |
| out = ctx.attr.out | |
| if not out: | |
| out = ctx.attr.name | |
| output = ctx.actions.declare_file(out) | |
| ctx.actions.symlink( | |
| target_file = ctx.executable.src, | |
| output = output, | |
| is_executable = True, | |
| ) | |
| runfiles = ctx.runfiles(files = ctx.files.data) | |
| # For Bazel 4.x support. Drop when Bazel 4.x is no longer supported | |
| to_merge = ([d[DefaultInfo].default_runfiles for d in ctx.attr.data] + | |
| [ctx.attr.src[DefaultInfo].default_runfiles]) | |
| if hasattr(runfiles, "merge_all"): | |
| runfiles = runfiles.merge_all(to_merge) | |
| else: | |
| for m in to_merge: | |
| runfiles = runfiles.merge(m) | |
| return DefaultInfo( | |
| executable = output, | |
| files = depset([output]), | |
| runfiles = runfiles, | |
| ) | |
| def _native_binary_impl(ctx): | |
| default_info = _shared_impl(ctx) | |
| return [default_info] | |
| def _native_test_impl(ctx): | |
| default_info = _shared_impl(ctx) | |
| return [default_info, testing.TestEnvironment(ctx.attr.env)] | |
| # We have to manually set "env" on the test rule because the builtin one is only | |
| # available in native rules. See | |
| # https://docs.bazel.build/versions/main/be/common-definitions.html#test.env | |
| # We don't have "env" on native_binary because there is no BinaryEnvironment | |
| # mirroring TestEnvironment. See https://github.com/bazelbuild/bazel/issues/7364 | |
| _SHARED_ATTRS = { | |
| "src": attr.label( | |
| executable = True, | |
| allow_files = True, | |
| mandatory = True, | |
| cfg = "target", | |
| ), | |
| "data": attr.label_list(allow_files = True), | |
| # "out" is attr.string instead of attr.output, so that it is select()'able. | |
| "out": attr.string(), | |
| } | |
| native_binary = rule( | |
| implementation = _native_binary_impl, | |
| attrs = _SHARED_ATTRS, | |
| executable = True, | |
| ) | |
| _TEST_ATTRS = { | |
| k: v | |
| for k, v in _SHARED_ATTRS.items() + [ | |
| ( | |
| "env", | |
| attr.string_dict( | |
| doc = "Mirrors the common env attribute that otherwise is" + | |
| " only available on native rules. See" + | |
| " https://docs.bazel.build/versions/main/be/common-definitions.html#test.env", | |
| ), | |
| ), | |
| ] | |
| } | |
| native_test = rule( | |
| implementation = _native_test_impl, | |
| attrs = _TEST_ATTRS, | |
| test = True, | |
| ) |