""" This module exports the pkg_cross_compiled_binaries rule. This rule is used to create a pkg_filegroup that contains the cross compiled binaries for each cpu. """ load("@rules_pkg//pkg:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files") def _cpu_transition_impl(settings, attr): _ignore = (settings) # @unused return [{"//command_line_option:cpu": attr.cpu}] _cpu_transition = transition( implementation = _cpu_transition_impl, inputs = [], outputs = [ "//command_line_option:cpu", ], ) def _cross_compiled_binary_impl(ctx): target = ctx.attr.target default_info = target[0][DefaultInfo] files = default_info.files runfiles = default_info.default_runfiles files = depset(transitive = [files]) return [ DefaultInfo( files = files, runfiles = runfiles, ), ] _cross_compiled_binary = rule( implementation = _cross_compiled_binary_impl, attrs = { "target": attr.label( mandatory = True, cfg = _cpu_transition, ), "cpu": attr.string(), "_allowlist_function_transition": attr.label( default = "@bazel_tools//tools/allowlists/function_transition_allowlist", ), }, ) def pkg_cross_compiled_binaries(name, cpus, targets, prefix, tags): """Creates a pkg_filegroup that contains the cross compiled binaries for each cpu. This rule is used to create a pkg_filegroup that contains the cross compiled binaries for each cpu. The binaries are created by an aspect that changes the cpu configuration for each target. The targets are placed into a directory that is named after the cpu. Args: name: The name of the pkg_filegroup. cpus: The cpus to cross compile for. targets: The targets to cross compile. prefix: The prefix to add to the pkg_filegroup. tags: The tags to add to the pkg_filegroup. """ filegroups = [] for cpu in cpus: compiled_targets = [] for target in targets: target_name = target.split(":")[1] bin_target_name = name + "_" + cpu + "_" + target_name _cross_compiled_binary( name = bin_target_name, cpu = cpu, target = target, ) compiled_targets.append(Label(":" + bin_target_name)) files_name = name + "_" + cpu + "_src" filegroup_name = files_name + "_dir" filegroups.append(Label(":" + filegroup_name)) pkg_files( name = files_name, srcs = compiled_targets, attributes = pkg_attributes( mode = "0755", ), ) pkg_filegroup( name = filegroup_name, srcs = [Label(":" + files_name)], prefix = cpu, ) pkg_filegroup( name = name, srcs = filegroups, prefix = prefix, tags = tags, ) return