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