mirror of
https://github.com/edgelesssys/constellation.git
synced 2025-01-11 07:29:29 -05:00
bazel: mkosi_image rule
This commit is contained in:
parent
5323c2d870
commit
90967d5bc2
6
.gitignore
vendored
6
.gitignore
vendored
@ -63,3 +63,9 @@ __pycache__/
|
||||
|
||||
# bazeldnf
|
||||
.bazeldnf/
|
||||
|
||||
# mkosi
|
||||
.mkosi-tmp*
|
||||
|
||||
# nix
|
||||
/result
|
||||
|
137
bazel/mkosi/mkosi_image.bzl
Normal file
137
bazel/mkosi/mkosi_image.bzl
Normal file
@ -0,0 +1,137 @@
|
||||
""" Bazel rule for building mkosi images. """
|
||||
|
||||
load("@aspect_bazel_lib//lib:paths.bzl", "relative_file")
|
||||
load("@bazel_skylib//lib:paths.bzl", "paths")
|
||||
|
||||
def _mkosi_image_impl(ctx):
|
||||
args = ctx.actions.args()
|
||||
inputs = []
|
||||
outputs = []
|
||||
tools = []
|
||||
workdir = ctx.file.mkosi_conf.dirname
|
||||
config_rel = lambda target: relative_file(target, ctx.file.mkosi_conf.path)
|
||||
env = {}
|
||||
args.add("-C", workdir)
|
||||
if ctx.attr.distribution:
|
||||
args.add("--distribution", ctx.attr.distribution)
|
||||
if ctx.attr.architecture:
|
||||
args.add("--architecture", ctx.attr.architecture)
|
||||
args.add_all(ctx.attr.packages, before_each = "--package")
|
||||
for package_file in ctx.files.package_files:
|
||||
args.add("--package", config_rel(package_file.path))
|
||||
for tree in ctx.files.base_trees:
|
||||
args.add("--base-tree", config_rel(tree.path))
|
||||
for tree in ctx.files.skeleton_trees:
|
||||
args.add("--skeleton-tree", config_rel(tree.path))
|
||||
for tree in ctx.files.package_manager_trees:
|
||||
args.add("--package-manager_tree", config_rel(tree.path))
|
||||
for tree in ctx.files.extra_trees:
|
||||
args.add("--extra-tree", config_rel(tree.path))
|
||||
for initrd in ctx.files.initrds:
|
||||
inputs.append(initrd)
|
||||
args.add("--initrd", config_rel(initrd.path))
|
||||
inputs.extend(ctx.files.mkosi_conf)
|
||||
inputs.extend(ctx.files.srcs[:])
|
||||
inputs.extend(ctx.files.package_files[:])
|
||||
inputs.extend(ctx.files.base_trees[:])
|
||||
inputs.extend(ctx.files.skeleton_trees[:])
|
||||
inputs.extend(ctx.files.package_manager_trees[:])
|
||||
inputs.extend(ctx.files.extra_trees[:])
|
||||
inputs.extend(ctx.files.initrds[:])
|
||||
if ctx.attr.source_date_epoch:
|
||||
args.add("--source-date-epoch", ctx.attr.source_date_epoch)
|
||||
if ctx.attr.seed:
|
||||
args.add("--seed", ctx.attr.seed)
|
||||
if ctx.file.version_file:
|
||||
env["VERSION_FILE"] = ctx.file.version_file.path
|
||||
inputs.append(ctx.file.version_file)
|
||||
outputs.extend(ctx.outputs.outs)
|
||||
if ctx.attr.out_dir:
|
||||
out_dir = ctx.actions.declare_directory(ctx.attr.out_dir)
|
||||
for output in outputs:
|
||||
if output.path.startswith(out_dir.path + "/"):
|
||||
fail("output {} is nested within output directory {}; outputs cannot be nested within each other!".format(output.path, out_dir.path))
|
||||
if output.is_directory and out_dir.path.startswith(output.path + "/"):
|
||||
fail("output directory {} is nested within output directory {}; outputs cannot be nested within each other!".format(out_dir.path, output.path))
|
||||
outputs.append(out_dir)
|
||||
args.add("--output-dir", config_rel(out_dir.path))
|
||||
else:
|
||||
args.add("--output-dir", config_rel(paths.join(ctx.bin_dir.path, ctx.label.package)))
|
||||
args.add_all(ctx.attr.extra_args)
|
||||
for key, value in ctx.attr.env.items():
|
||||
args.add("--environment", "{}={}".format(key, value))
|
||||
if ctx.attr.kernel_command_line:
|
||||
args.add("--kernel-command-line", ctx.attr.kernel_command_line)
|
||||
for key, value in ctx.attr.kernel_command_line_dict.items():
|
||||
args.add("--kernel-command-line", "{}={}".format(key, value))
|
||||
if ctx.attr.autologin:
|
||||
args.add("--autologin", "yes")
|
||||
|
||||
info = ctx.toolchains["@constellation//bazel/mkosi:toolchain_type"].mkosi
|
||||
if not info.valid:
|
||||
fail("mkosi toolchain is not properly configured: {}".format(info.name))
|
||||
if info.label:
|
||||
executable_files = info.label[DefaultInfo].files_to_run
|
||||
tools.append(executable_files)
|
||||
mkosi_bin = executable_files.executable.path
|
||||
else:
|
||||
mkosi_bin = info.path
|
||||
|
||||
wrapper = ctx.actions.declare_file("mkosi_wrapper.sh")
|
||||
ctx.actions.expand_template(
|
||||
template = ctx.file._mkosi_wrapper_template,
|
||||
output = wrapper,
|
||||
substitutions = {
|
||||
"@@MKOSI@@": mkosi_bin,
|
||||
},
|
||||
is_executable = True,
|
||||
)
|
||||
inputs.append(wrapper)
|
||||
ctx.actions.run(
|
||||
outputs = outputs,
|
||||
inputs = inputs,
|
||||
executable = wrapper,
|
||||
arguments = [args],
|
||||
tools = tools,
|
||||
execution_requirements = {"no-remote": "1", "no-sandbox": "1"},
|
||||
progress_message = "Building mkosi image " + ctx.label.name,
|
||||
env = env,
|
||||
)
|
||||
return DefaultInfo(files = depset(outputs), runfiles = ctx.runfiles(outputs))
|
||||
|
||||
mkosi_image = rule(
|
||||
implementation = _mkosi_image_impl,
|
||||
attrs = {
|
||||
"architecture": attr.string(),
|
||||
"autologin": attr.bool(),
|
||||
"base_trees": attr.label_list(allow_files = True),
|
||||
"distribution": attr.string(),
|
||||
"env": attr.string_dict(),
|
||||
"extra_args": attr.string_list(),
|
||||
"extra_trees": attr.label_list(allow_files = True),
|
||||
"initrds": attr.label_list(allow_files = True),
|
||||
"kernel_command_line": attr.string(),
|
||||
"kernel_command_line_dict": attr.string_dict(),
|
||||
"mkosi_conf": attr.label(
|
||||
allow_single_file = True,
|
||||
mandatory = True,
|
||||
doc = "main mkosi.conf file",
|
||||
),
|
||||
"out_dir": attr.string(),
|
||||
"outs": attr.output_list(),
|
||||
"package_files": attr.label_list(allow_files = True),
|
||||
"package_manager_trees": attr.label_list(allow_files = True),
|
||||
"packages": attr.string_list(),
|
||||
"seed": attr.string(),
|
||||
"skeleton_trees": attr.label_list(allow_files = True),
|
||||
"source_date_epoch": attr.string(),
|
||||
"srcs": attr.label_list(allow_files = True),
|
||||
"version_file": attr.label(allow_single_file = True),
|
||||
"_mkosi_wrapper_template": attr.label(
|
||||
default = Label("@constellation//bazel/mkosi:mkosi_wrapper.sh.in"),
|
||||
allow_single_file = True,
|
||||
),
|
||||
},
|
||||
executable = False,
|
||||
toolchains = ["@constellation//bazel/mkosi:toolchain_type"],
|
||||
)
|
14
bazel/mkosi/mkosi_wrapper.sh.in
Normal file
14
bazel/mkosi/mkosi_wrapper.sh.in
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
shopt -s inherit_errexit
|
||||
|
||||
export PATH=/run/wrappers/bin:/run/current-system/sw/bin:/bin:/usr/bin:/usr/local/bin
|
||||
VERSION_ARG=""
|
||||
args=("$@")
|
||||
|
||||
if [[ -n ${VERSION_FILE+x} ]]; then
|
||||
VERSION_ARG="--environment=IMAGE_VERSION=$(cat "${VERSION_FILE}")"
|
||||
args+=("$VERSION_ARG")
|
||||
fi
|
||||
|
||||
exec @@MKOSI@@ "${args[@]}" build
|
Loading…
Reference in New Issue
Block a user