blob: 5b047e639a391385d7d26046da20c74575da88e0 [file] [log] [blame]
# 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,
)