| """ | |
| 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, visibility = None): | |
| """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. | |
| visibility: The visibility of 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, | |
| visibility = visibility, | |
| ) | |
| return |