Explicit outputs for wasm_cc_binary (#1047)
* Explicit outputs for wasm_cc_binary * Backwards compatibility * data_runfiles restore * restore test_bazel.sh * Using wrong path on accident * two separate rules for legacy support * Added name attribute to wasm_cc_binary rule
This commit is contained in:
@@ -54,11 +54,81 @@ _wasm_transition = transition(
|
||||
],
|
||||
)
|
||||
|
||||
def _wasm_binary_impl(ctx):
|
||||
args = ctx.actions.args()
|
||||
args.add("--output_path", ctx.outputs.loader.dirname)
|
||||
args.add_all("--archive", ctx.files.cc_target)
|
||||
_ALLOW_OUTPUT_EXTNAMES = [
|
||||
".js",
|
||||
".wasm",
|
||||
".wasm.map",
|
||||
".worker.js",
|
||||
".js.mem",
|
||||
".data",
|
||||
".fetch.js",
|
||||
".js.symbols",
|
||||
".wasm.debug.wasm",
|
||||
".html",
|
||||
]
|
||||
|
||||
_WASM_BINARY_COMMON_ATTRS = {
|
||||
"backend": attr.string(
|
||||
default = "_default",
|
||||
values = ["_default", "emscripten", "llvm"],
|
||||
),
|
||||
"cc_target": attr.label(
|
||||
cfg = _wasm_transition,
|
||||
mandatory = True,
|
||||
),
|
||||
"exit_runtime": attr.bool(
|
||||
default = False,
|
||||
),
|
||||
"threads": attr.string(
|
||||
default = "_default",
|
||||
values = ["_default", "emscripten", "off"],
|
||||
),
|
||||
"simd": attr.bool(
|
||||
default = False,
|
||||
),
|
||||
"_allowlist_function_transition": attr.label(
|
||||
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
|
||||
),
|
||||
"_wasm_binary_extractor": attr.label(
|
||||
executable = True,
|
||||
allow_files = True,
|
||||
cfg = "exec",
|
||||
default = Label("@emsdk//emscripten_toolchain:wasm_binary"),
|
||||
),
|
||||
}
|
||||
|
||||
def _wasm_cc_binary_impl(ctx):
|
||||
args = ctx.actions.args()
|
||||
cc_target = ctx.attr.cc_target[0]
|
||||
|
||||
for output in ctx.outputs.outputs:
|
||||
valid_extname = False
|
||||
for allowed_extname in _ALLOW_OUTPUT_EXTNAMES:
|
||||
if output.path.endswith(allowed_extname):
|
||||
valid_extname = True
|
||||
break
|
||||
if not valid_extname:
|
||||
fail("Invalid output '{}'. Allowed extnames: {}".format(output.basename, ", ".join(_ALLOW_OUTPUT_EXTNAMES)))
|
||||
|
||||
args.add_all("--archive", ctx.files.cc_target)
|
||||
args.add_joined("--outputs", ctx.outputs.outputs, join_with = ",")
|
||||
|
||||
ctx.actions.run(
|
||||
inputs = ctx.files.cc_target,
|
||||
outputs = ctx.outputs.outputs,
|
||||
arguments = [args],
|
||||
executable = ctx.executable._wasm_binary_extractor,
|
||||
)
|
||||
|
||||
return DefaultInfo(
|
||||
files = depset(ctx.outputs.outputs),
|
||||
# This is needed since rules like web_test usually have a data
|
||||
# dependency on this target.
|
||||
data_runfiles = ctx.runfiles(transitive_files = depset(ctx.outputs.outputs)),
|
||||
)
|
||||
|
||||
def _wasm_cc_binary_legacy_impl(ctx):
|
||||
cc_target = ctx.attr.cc_target[0]
|
||||
outputs = [
|
||||
ctx.outputs.loader,
|
||||
ctx.outputs.wasm,
|
||||
@@ -72,6 +142,11 @@ def _wasm_binary_impl(ctx):
|
||||
ctx.outputs.html,
|
||||
]
|
||||
|
||||
args = ctx.actions.args()
|
||||
args.add("--allow_empty_outputs")
|
||||
args.add_all("--archive", ctx.files.cc_target)
|
||||
args.add_joined("--outputs", outputs, join_with = ",")
|
||||
|
||||
ctx.actions.run(
|
||||
inputs = ctx.files.cc_target,
|
||||
outputs = outputs,
|
||||
@@ -87,7 +162,19 @@ def _wasm_binary_impl(ctx):
|
||||
data_runfiles = ctx.runfiles(transitive_files = depset(outputs)),
|
||||
)
|
||||
|
||||
def _wasm_binary_outputs(name, cc_target):
|
||||
_wasm_cc_binary = rule(
|
||||
name = "wasm_cc_binary",
|
||||
implementation = _wasm_cc_binary_impl,
|
||||
attrs = dict(
|
||||
_WASM_BINARY_COMMON_ATTRS,
|
||||
outputs = attr.output_list(
|
||||
allow_empty = False,
|
||||
mandatory = True,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
def _wasm_binary_legacy_outputs(name, cc_target):
|
||||
basename = cc_target.name
|
||||
basename = basename.split(".")[0]
|
||||
outputs = {
|
||||
@@ -105,6 +192,13 @@ def _wasm_binary_outputs(name, cc_target):
|
||||
|
||||
return outputs
|
||||
|
||||
_wasm_cc_binary_legacy = rule(
|
||||
name = "wasm_cc_binary",
|
||||
implementation = _wasm_cc_binary_legacy_impl,
|
||||
attrs = _WASM_BINARY_COMMON_ATTRS,
|
||||
outputs = _wasm_binary_legacy_outputs,
|
||||
)
|
||||
|
||||
# Wraps a C++ Blaze target, extracting the appropriate files.
|
||||
#
|
||||
# This rule will transition to the emscripten toolchain in order
|
||||
@@ -113,36 +207,10 @@ def _wasm_binary_outputs(name, cc_target):
|
||||
# Args:
|
||||
# name: The name of the rule.
|
||||
# cc_target: The cc_binary or cc_library to extract files from.
|
||||
wasm_cc_binary = rule(
|
||||
implementation = _wasm_binary_impl,
|
||||
attrs = {
|
||||
"backend": attr.string(
|
||||
default = "_default",
|
||||
values = ["_default", "emscripten", "llvm"],
|
||||
),
|
||||
"cc_target": attr.label(
|
||||
cfg = _wasm_transition,
|
||||
mandatory = True,
|
||||
),
|
||||
"exit_runtime": attr.bool(
|
||||
default = False,
|
||||
),
|
||||
"threads": attr.string(
|
||||
default = "_default",
|
||||
values = ["_default", "emscripten", "off"],
|
||||
),
|
||||
"simd": attr.bool(
|
||||
default = False,
|
||||
),
|
||||
"_allowlist_function_transition": attr.label(
|
||||
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
|
||||
),
|
||||
"_wasm_binary_extractor": attr.label(
|
||||
executable = True,
|
||||
allow_files = True,
|
||||
cfg = "exec",
|
||||
default = Label("@emsdk//emscripten_toolchain:wasm_binary"),
|
||||
),
|
||||
},
|
||||
outputs = _wasm_binary_outputs,
|
||||
)
|
||||
def wasm_cc_binary(outputs = None, **kwargs):
|
||||
# for backwards compatibility if no outputs are set the deprecated
|
||||
# implementation is used.
|
||||
if not outputs:
|
||||
_wasm_cc_binary_legacy(**kwargs)
|
||||
else:
|
||||
_wasm_cc_binary(outputs = outputs, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user