diff --git a/labgrid/config/managers.bzl b/labgrid/config/managers.bzl index df1bb66e8558868615e28c1336dd44575c60cbc9..beeaa821084c6b4eccaf8e523fb5a2365bbf7627 100644 --- a/labgrid/config/managers.bzl +++ b/labgrid/config/managers.bzl @@ -15,7 +15,7 @@ managers = rule( doc = DOC, attrs = ATTRS, implementation = implementation, - provides = [DefaultInfo, PyInfo], + provides = [PyInfo], toolchains = ["//labgrid/toolchain/config:type"], cfg = _cfg, ) diff --git a/labgrid/config/rule.bzl b/labgrid/config/rule.bzl index 3751ead02327b86b8679dc230166496acc736dc3..35d8aea9541dfd1133090907e868ddd6865f1e6f 100644 --- a/labgrid/config/rule.bzl +++ b/labgrid/config/rule.bzl @@ -99,32 +99,18 @@ def _runfile(value, separator = "~"): return value def _merge_py_info(targets): - transitive_sources = [] - imports = [] - for target in targets: - p = target[PyInfo] - transitive_sources.extend(p.transitive_sources.to_list() if p.transitive_sources else []) - imports.extend(p.imports.to_list() if p.imports else []) return PyInfo( - transitive_sources = depset(transitive_sources), - imports = depset(imports), + transitive_sources = depset(transitive = [t[PyInfo].transitive_sources for t in targets]), + imports = depset(transitive = [t[PyInfo].imports for t in targets]), ) -def _merge_default_info(targets): - files = [] - data_runfiles = [] - default_runfiles = [] - for target in targets: - d = target[DefaultInfo] - files.extend(d.files.to_list() if d.files else []) - if d.data_runfiles: - data_runfiles.append(d.data_runfiles) - if d.default_runfiles: - default_runfiles.append(d.default_runfiles) +def _merge_default_info(ctx, targets): + files = depset(transitive = [t.files for t in targets]) + runfiles = ctx.runfiles() + runfiles = runfiles.merge_all([t.default_runfiles for t in targets]) return DefaultInfo( - files = depset(files), - data_runfiles = data_runfiles[0].merge_all(data_runfiles) if data_runfiles else None, - default_runfiles = default_runfiles[0].merge_all(default_runfiles) if default_runfiles else None, + files = files, + runfiles = runfiles, ) def implementation(ctx): @@ -133,10 +119,10 @@ def implementation(ctx): default = DefaultInfo(files = depset([ctx.file.src])) toolchain = platform_common.ToolchainInfo( src = ctx.file.src, - deps = [_merge_default_info(ctx.attr.deps), _merge_py_info(ctx.attr.deps)], + deps = [_merge_default_info(ctx, ctx.attr.deps), _merge_py_info(ctx.attr.deps)], env = env, data = depset(transitive = [d.files for d in data]), - managers = [_merge_default_info(ctx.attr.managers), _merge_py_info(ctx.attr.managers)], + managers = [_merge_default_info(ctx, ctx.attr.managers), _merge_py_info(ctx.attr.managers)], ) return [default, toolchain] diff --git a/labgrid/executor/args.bzl b/labgrid/executor/args.bzl index 138aad82e8e1b618b03d715fbd3bc1529e73eb29..e09419c6459724a5ac4450e6b39f402c10e2a337 100644 --- a/labgrid/executor/args.bzl +++ b/labgrid/executor/args.bzl @@ -5,8 +5,7 @@ visibility("//labgrid/executor/...") DOC = "Creates an args file to be passed to `//labgrid/executor`" ATTRS = { - "_manager": attr.label_list( - allow_files = True, + "_managers": attr.label_list( doc = "The manager to use", default = ["//labgrid/config:managers"], cfg = "exec", @@ -28,7 +27,7 @@ def implementation(ctx): output = ctx.actions.declare_file("executor-args.txt") lines = [] - for m in ctx.files._manager: + for m in ctx.files._managers: lines.extend(["--manager", "{}:{}".format(_import_path(m.short_path), "manager")]) for name, value in ctx.attr._env[EnvironmentInfo].environment.items(): lines.extend(["--env", name, value]) diff --git a/labgrid/executor/executor.py b/labgrid/executor/executor.py index b593cf604153819051a8aedd385f6092416aed52..fe189732904cb0f775c892a6259e37d431d97d72 100644 --- a/labgrid/executor/executor.py +++ b/labgrid/executor/executor.py @@ -19,7 +19,10 @@ from bazel.labgrid.executor.manager import Data, Manager def load(value: str) -> Manager: - name, _, attr = value.partition(":") + name, found, attr = value.partition(":") + if not found: + raise ArgumentTypeError(f"Must be of the form `:`: {value}") + module = import_module(name) try: @@ -47,6 +50,8 @@ def arguments(prsr: ArgumentParser) -> None: help="A manager to load from a Python module, of the form `module.to.load:Manager`.", action="append", type=load, + default=[], + dest="managers", ) prsr.add_argument( "--env", @@ -78,9 +83,8 @@ def main(exe: Path, *args: str) -> int: data = Data(env={}) with ExitStack() as stack: - if parsed.manager: - for manager in parsed.manager: - data = stack.enter_context(manager(data)) + for manager in parsed.managers: + data = stack.enter_context(manager(data)) env = {k: resolve_runfile(v) for k, v in parsed.env} env |= {k: v for k, v in data.env.items() if k != "RUNFILES_DIR"} try: