| # 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", |
| ), |
| }, |
| ) |