| # 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, | 
 | ) |