diff --git a/docs/native_binary_doc.md b/docs/native_binary_doc.md index 1a330ca..a9c476d 100755 --- a/docs/native_binary_doc.md +++ b/docs/native_binary_doc.md @@ -5,7 +5,7 @@ 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="". @@ -13,24 +13,25 @@ don't depend on Bash and work with --shell_exectuable="". ## native_binary
-native_binary(name, src, out, data, kwargs)
+native_binary(name, data, out, src)
 
+ 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 | -| :------------- | :------------- | :------------- | -| name | The name of the rule. | none | -| src | label; path of the pre-built executable | none | -| out | output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.) | none | -| data | list of labels; data dependencies | None | -| kwargs | The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-binaries">common attributes for binaries</a>. | none | +| Name | Description | Type | Mandatory | Default | +| :------------- | :------------- | :------------- | :------------- | :------------- | +| name | A unique name for this target. | Name | required | | +| data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | List of labels | optional | [] | +| out | An output name for the copy of the binary | String | required | | +| src | path of the pre-built executable | Label | required | | @@ -38,24 +39,24 @@ You can "bazel run" this rule like any other binary rule, and use it as a tool i ## native_test
-native_test(name, src, out, data, kwargs)
+native_test(name, data, out, src)
 
+ 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 | -| :------------- | :------------- | :------------- | -| name | The name of the test rule. | none | -| src | label; path of the pre-built executable | none | -| out | output; an output name for the copy of the binary. (Bazel requires that this rule make a copy of 'src'.) | none | -| data | list of labels; data dependencies | None | -| kwargs | The <a href="https://docs.bazel.build/versions/main/be/common-definitions.html#common-attributes-tests">common attributes for tests</a>. | none | +| Name | Description | Type | Mandatory | Default | +| :------------- | :------------- | :------------- | :------------- | :------------- | +| name | A unique name for this target. | Name | required | | +| data | data dependencies. See https://docs.bazel.build/versions/main/be/common-definitions.html#typical.data | List of labels | optional | [] | +| out | An output name for the copy of the binary | String | required | | +| src | path of the pre-built executable | Label | required | | diff --git a/rules/BUILD b/rules/BUILD index c1ffbf2..e2709d6 100644 --- a/rules/BUILD +++ b/rules/BUILD @@ -41,7 +41,6 @@ bzl_library( bzl_library( name = "native_binary", srcs = ["native_binary.bzl"], - deps = ["//rules/private:copy_file_private"], ) bzl_library( diff --git a/rules/native_binary.bzl b/rules/native_binary.bzl index a3f0d73..a027fc9 100644 --- a/rules/native_binary.bzl +++ b/rules/native_binary.bzl @@ -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`. @@ -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, @@ -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. + +You can "bazel test" this rule like any other test rule. You can also augment +the binary with runfiles. +""", ) - -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 common attributes for binaries. - """ - _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 common attributes for tests. - """ - _native_test( - name = name, - src = src, - out = out, - data = data, - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - **kwargs - )