diff --git a/labgrid/config/rule.bzl b/labgrid/config/rule.bzl index 596a00cf3a1b3c084f6451efc6ef0fb7d64359eb..97733b1ae865ebf9eca4847fcbced2f285ef5601 100644 --- a/labgrid/config/rule.bzl +++ b/labgrid/config/rule.bzl @@ -61,7 +61,7 @@ ATTRS = { cfg = "exec", ), "env": attr.string_dict( - doc = "The environment variables to set. Subject to `$(location)` substitution.", + doc = "The environment variables to set. Subject to `$(location)` and \"Make\" variable substitution.", ), "data": attr.label_list( allow_files = True, @@ -82,9 +82,31 @@ def _forward(target): def _flatten(iterable): return [e for x in iterable for e in x] +def _expand(ctx, data, value): + value = value.replace("$(location", "$(rlocationpath") + value = ctx.expand_location(value, targets = data) + for k, v in ctx.var.items(): + value = value.replace("$({})".format(k), _runfile(v)) + return value + +# FIXME: separator changes to `+` on Bazel 8+ +def _runfile(value, separator = "~"): + # Non-runfile value + if not value.startswith("bazel-out/"): + return value + + _, found, rest = value.partition("/external/") + if found: + workspace_name, workspaced, short_path = rest.partition("{}/".format(separator)) + if workspaced: + return "{}/{}".format(workspace_name, short_path) + fail("Failed to convert runfile `path` to `rlocationpath`: {}".format(value)) + + return value + def implementation(ctx): - data = ctx.attr.data + [ctx.attr.src] - env = {k: ctx.expand_location(v, targets = data) for k, v in ctx.attr.env.items()} + data = ctx.attr.data + [ctx.attr.src] + ctx.attr.toolchains + env = {k: _expand(ctx, data, v) for k, v in ctx.attr.env.items()} default = DefaultInfo(files = depset([ctx.file.src])) toolchain = platform_common.ToolchainInfo( src = ctx.file.src, diff --git a/labgrid/config/toolchain/macro.bzl b/labgrid/config/toolchain/macro.bzl index 99a7af8147244f6fd718d2aeec7a60b1d9ec7373..3928a6777f09ff4e18816f1cdf0e4fa155e8c804 100644 --- a/labgrid/config/toolchain/macro.bzl +++ b/labgrid/config/toolchain/macro.bzl @@ -2,16 +2,18 @@ load("@rules_labgrid//labgrid/config:defs.bzl", "labgrid_config") visibility("//...") -def labgrid_config_toolchain(*, name, src, state, target_compatible_with, manager = "@rules_labgrid//labgrid/manager:passthrough", deps = ()): +def labgrid_config_toolchain(*, name, src, state, target_compatible_with, manager = "@rules_labgrid//labgrid/manager:passthrough", deps = (), env = {}, data = [], toolchains = []): src = native.package_relative_label(src) labgrid_config( name = "{}-config".format(name), src = src, deps = [native.package_relative_label(d) for d in deps], - env = { - "LG_ENV": "$(rlocationpath {})".format(src), + env = env | { + "LG_ENV": "$(location {})".format(src), "LG_STATE": state, }, + data = data, + toolchains = toolchains, manager = native.package_relative_label(manager), )