|  | #  Copyright 2020 The Monogon Project Authors. | 
|  | # | 
|  | #  SPDX-License-Identifier: Apache-2.0 | 
|  | # | 
|  | #  Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | #  you may not use this file except in compliance with the License. | 
|  | #  You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | #  Unless required by applicable law or agreed to in writing, software | 
|  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
|  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | #  See the License for the specific language governing permissions and | 
|  | #  limitations under the License. | 
|  |  | 
|  | load("//metropolis/node/build:def.bzl", "build_static_transition") | 
|  |  | 
|  | def _static_binary_tarball_impl(ctx): | 
|  | layer_spec = ctx.actions.declare_file(ctx.label.name + ".prototxt") | 
|  | if len(ctx.attr.executable) != 1: | 
|  | fail("executable arg can only contain one file/label") | 
|  | executable_label = ctx.attr.executable[0] | 
|  | executable = executable_label[DefaultInfo].files_to_run.executable | 
|  | runfiles = executable_label[DefaultInfo].default_runfiles | 
|  | files = [] | 
|  | for file in runfiles.files.to_list(): | 
|  | layer_path = file.short_path | 
|  |  | 
|  | # Weird shenanigans with external repos | 
|  | if layer_path.startswith("../"): | 
|  | layer_path = "external/" + layer_path[3:] | 
|  | files.append(struct( | 
|  | path = layer_path, | 
|  | src = file.path, | 
|  | )) | 
|  | ctx.actions.write(layer_spec, proto.encode_text(struct(file = files))) | 
|  |  | 
|  | layer_out = ctx.actions.declare_file(ctx.label.name + ".tar") | 
|  | ctx.actions.run( | 
|  | outputs = [layer_out], | 
|  | inputs = [layer_spec, executable] + runfiles.files.to_list(), | 
|  | tools = [ctx.executable._container_binary], | 
|  | executable = ctx.executable._container_binary, | 
|  | arguments = ["-out", layer_out.path, "-spec", layer_spec.path], | 
|  | ) | 
|  |  | 
|  | return [DefaultInfo(files = depset([layer_out]), runfiles = ctx.runfiles(files = [layer_out]))] | 
|  |  | 
|  | static_binary_tarball = rule( | 
|  | implementation = _static_binary_tarball_impl, | 
|  | doc = """ | 
|  | Build a tarball from a binary given in `executable` and its runfiles. Everything will be put under | 
|  | /app with the same filesystem layout as if run under `bazel run`. So if your executable works under bazel run, | 
|  | it will work when packaged with this rule with the exception of runfile manifests, which this rule currently | 
|  | doesn't support. | 
|  | """, | 
|  | attrs = { | 
|  | "executable": attr.label( | 
|  | mandatory = True, | 
|  | executable = True, | 
|  | allow_single_file = True, | 
|  | cfg = build_static_transition, | 
|  | ), | 
|  | "_container_binary": attr.label( | 
|  | default = Label("//build/static_binary_tarball"), | 
|  | cfg = "exec", | 
|  | executable = True, | 
|  | allow_files = True, | 
|  | ), | 
|  |  | 
|  | # Allow for transitions to be attached to this rule. | 
|  | "_whitelist_function_transition": attr.label( | 
|  | default = "@bazel_tools//tools/whitelists/function_transition_whitelist", | 
|  | ), | 
|  | }, | 
|  | ) |