blob: 5ffb2898bcced91ae3038eb57614bd1633382f8a [file] [log] [blame]
"""
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