Skip to content

Commit

Permalink
Switch native_binary/test to use symlinks (#340)
Browse files Browse the repository at this point in the history
A copy should not be necessary here. The symlink action falls back to
copying when symlinks are not enabled on windows, which I think would 
be the only problem with using symlinks:
https://docs.bazel.build/versions/4.2.2/command-line-reference.html#flag--windows_enable_symlinks
  • Loading branch information
ngiloq6 authored May 17, 2022
1 parent fe308d7 commit 26a424f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 90 deletions.
45 changes: 23 additions & 22 deletions docs/native_binary_doc.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,57 +5,58 @@ native_binary() and native_test() rule implementations.
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="".
don't depend on Bash and work with --shell_executable="".


<a id="#native_binary"></a>

## native_binary

<pre>
native_binary(<a href="#native_binary-name">name</a>, <a href="#native_binary-src">src</a>, <a href="#native_binary-out">out</a>, <a href="#native_binary-data">data</a>, <a href="#native_binary-kwargs">kwargs</a>)
native_binary(<a href="#native_binary-name">name</a>, <a href="#native_binary-data">data</a>, <a href="#native_binary-out">out</a>, <a href="#native_binary-src">src</a>)
</pre>


Wraps a pre-built binary or script with a binary rule.

You can "bazel run" this rule like any other binary rule, and use it as a tool in genrule.tools for example. You can also augment the binary with runfiles.
You can "bazel run" this rule like any other binary rule, and use it as a tool
in genrule.tools for example. You can also augment the binary with runfiles.


**PARAMETERS**
**ATTRIBUTES**


| Name | Description | Default Value |
| :------------- | :------------- | :------------- |
| <a id="native_binary-name"></a>name | The name of the rule. | none |
| <a id="native_binary-src"></a>src | label; path of the pre-built executable | none |
| <a id="native_binary-out"></a>out | output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.) | none |
| <a id="native_binary-data"></a>data | list of labels; data dependencies | <code>None</code> |
| <a id="native_binary-kwargs"></a>kwargs | The &lt;a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-binaries"&gt;common attributes for binaries&lt;/a&gt;. | none |
| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="native_binary-name"></a>name | A unique name for this target. | <a href="https://bazel.build/docs/build-ref.html#name">Name</a> | required | |
| <a id="native_binary-data"></a>data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | <a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a> | optional | [] |
| <a id="native_binary-out"></a>out | An output name for the copy of the binary | String | required | |
| <a id="native_binary-src"></a>src | path of the pre-built executable | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | required | |


<a id="#native_test"></a>

## native_test

<pre>
native_test(<a href="#native_test-name">name</a>, <a href="#native_test-src">src</a>, <a href="#native_test-out">out</a>, <a href="#native_test-data">data</a>, <a href="#native_test-kwargs">kwargs</a>)
native_test(<a href="#native_test-name">name</a>, <a href="#native_test-data">data</a>, <a href="#native_test-out">out</a>, <a href="#native_test-src">src</a>)
</pre>


Wraps a pre-built binary or script with a test rule.

You can "bazel test" this rule like any other test rule. You can also augment the binary with
runfiles.
You can "bazel test" this rule like any other test rule. You can also augment
the binary with runfiles.


**PARAMETERS**
**ATTRIBUTES**


| Name | Description | Default Value |
| :------------- | :------------- | :------------- |
| <a id="native_test-name"></a>name | The name of the test rule. | none |
| <a id="native_test-src"></a>src | label; path of the pre-built executable | none |
| <a id="native_test-out"></a>out | output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.) | none |
| <a id="native_test-data"></a>data | list of labels; data dependencies | <code>None</code> |
| <a id="native_test-kwargs"></a>kwargs | The &lt;a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-tests"&gt;common attributes for tests&lt;/a&gt;. | none |
| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="native_test-name"></a>name | A unique name for this target. | <a href="https://bazel.build/docs/build-ref.html#name">Name</a> | required | |
| <a id="native_test-data"></a>data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | <a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a> | optional | [] |
| <a id="native_test-out"></a>out | An output name for the copy of the binary | String | required | |
| <a id="native_test-src"></a>src | path of the pre-built executable | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | required | |


1 change: 0 additions & 1 deletion rules/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ bzl_library(
bzl_library(
name = "native_binary",
srcs = ["native_binary.bzl"],
deps = ["//rules/private:copy_file_private"],
)

bzl_library(
Expand Down
97 changes: 30 additions & 67 deletions rules/native_binary.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,16 @@
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="".
don't depend on Bash and work with --shell_executable="".
"""

load("//rules/private:copy_file_private.bzl", "copy_bash", "copy_cmd")

def _impl_rule(ctx, is_windows):
def _impl_rule(ctx):
out = ctx.actions.declare_file(ctx.attr.out)
if is_windows:
copy_cmd(ctx, ctx.executable.src, out)
else:
copy_bash(ctx, ctx.executable.src, out)
ctx.actions.symlink(
target_file = ctx.executable.src,
output = out,
is_executable = True,
)
runfiles = ctx.runfiles(files = ctx.files.data)

# Bazel 4.x LTS does not support `merge_all`.
Expand All @@ -48,9 +47,6 @@ def _impl_rule(ctx, is_windows):
runfiles = runfiles,
)

def _impl(ctx):
return _impl_rule(ctx, ctx.attr.is_windows)

_ATTRS = {
"src": attr.label(
executable = True,
Expand All @@ -60,70 +56,37 @@ _ATTRS = {
allow_files = True,
mandatory = True,
cfg = "target",
doc = "path of the pre-built executable",
),
"data": attr.label_list(
allow_files = True,
doc = "data dependencies. See" +
" https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data",
),
"data": attr.label_list(allow_files = True),
# "out" is attr.string instead of attr.output, so that it is select()'able.
"out": attr.string(mandatory = True),
"is_windows": attr.bool(mandatory = True),
"out": attr.string(mandatory = True, doc = "An output name for the copy of the binary"),
}

_native_binary = rule(
implementation = _impl,
native_binary = rule(
implementation = _impl_rule,
attrs = _ATTRS,
executable = True,
doc = """
Wraps a pre-built binary or script with a binary rule.
You can "bazel run" this rule like any other binary rule, and use it as a tool
in genrule.tools for example. You can also augment the binary with runfiles.
""",
)

_native_test = rule(
implementation = _impl,
native_test = rule(
implementation = _impl_rule,
attrs = _ATTRS,
test = True,
)
doc = """
Wraps a pre-built binary or script with a test rule.
def native_binary(name, src, out, data = None, **kwargs):
"""Wraps a pre-built binary or script with a binary rule.
You can "bazel run" this rule like any other binary rule, and use it as a tool in genrule.tools for example. You can also augment the binary with runfiles.
Args:
name: The name of the rule.
src: label; path of the pre-built executable
out: output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.)
data: list of labels; data dependencies
**kwargs: The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-binaries">common attributes for binaries</a>.
"""
_native_binary(
name = name,
src = src,
out = out,
data = data,
is_windows = select({
"@bazel_tools//src/conditions:host_windows": True,
"//conditions:default": False,
}),
**kwargs
)

def native_test(name, src, out, data = None, **kwargs):
"""Wraps a pre-built binary or script with a test rule.
You can "bazel test" this rule like any other test rule. You can also augment the binary with
runfiles.
Args:
name: The name of the test rule.
src: label; path of the pre-built executable
out: output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.)
data: list of labels; data dependencies
**kwargs: The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-tests">common attributes for tests</a>.
"""
_native_test(
name = name,
src = src,
out = out,
data = data,
is_windows = select({
"@bazel_tools//src/conditions:host_windows": True,
"//conditions:default": False,
}),
**kwargs
)
You can "bazel test" this rule like any other test rule. You can also augment
the binary with runfiles.
""",
)

0 comments on commit 26a424f

Please sign in to comment.