m/cli/metroctl: add multiplatform metroctl target

This adds a target which builds metroctl for multiple platforms. Because
this target will be built with "bazel test //...", we no longer need to
explicitly test building metroctl for various platforms in CI.

Building fails with --config=race; I added a target_compatible_with so
the target is skipped in this case.

Change-Id: Ib747233bc8442af5f947d35289d36ddd147b7953
Reviewed-on: https://review.monogon.dev/c/monogon/+/4439
Tested-by: Jenkins CI
Reviewed-by: Tim Windelschmidt <tim@monogon.tech>
diff --git a/build/platforms/def.bzl b/build/platforms/def.bzl
new file mode 100644
index 0000000..2e4796a
--- /dev/null
+++ b/build/platforms/def.bzl
@@ -0,0 +1,36 @@
+def _multiplatform_transition_impl(_, attr):
+    return [
+        {"//command_line_option:platforms": str(platform)}
+        for platform in attr.platforms
+    ]
+
+_multiplatform_transition = transition(
+    implementation = _multiplatform_transition_impl,
+    inputs = [],
+    outputs = ["//command_line_option:platforms"],
+)
+
+def _multiplatform_transition_filegroup_impl(ctx):
+    files = [src[DefaultInfo].files for src in ctx.attr.srcs]
+    runfiles = ctx.runfiles().merge_all([src[DefaultInfo].default_runfiles for src in ctx.attr.srcs])
+    return [DefaultInfo(
+        files = depset(transitive = files),
+        runfiles = runfiles,
+    )]
+
+multiplatform_transition_filegroup = rule(
+    _multiplatform_transition_filegroup_impl,
+    attrs = {
+        "platforms": attr.label_list(
+            providers = [platform_common.PlatformInfo],
+            mandatory = True,
+            doc = "The target platforms to transition the srcs.",
+        ),
+        "srcs": attr.label_list(
+            cfg = _multiplatform_transition,
+            mandatory = True,
+            doc = "The input to be transitioned to the target platforms.",
+        ),
+    },
+    doc = "Transitions the srcs to use the provided platforms. The filegroup will contain artifacts for all target platforms.",
+)