rabbitmq-server/bazel/elixir/elixir_build.bzl

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

172 lines
4.4 KiB
Python
Raw Normal View History

load(
"@bazel_skylib//rules:common_settings.bzl",
"BuildSettingInfo",
)
load(
"@rules_erlang//tools:erlang_toolchain.bzl",
"erlang_dirs",
2022-06-08 16:07:16 +08:00
"maybe_install_erlang",
)
ElixirInfo = provider(
doc = "A Home directory of a built Elixir",
fields = [
"release_dir",
"elixir_home",
"version_file",
],
)
def _impl(ctx):
(_, _, filename) = ctx.attr.url.rpartition("/")
downloaded_archive = ctx.actions.declare_file(filename)
release_dir = ctx.actions.declare_directory(ctx.label.name + "_release")
build_dir = ctx.actions.declare_directory(ctx.label.name + "_build")
version_file = ctx.actions.declare_file(ctx.label.name + "_version")
ctx.actions.run_shell(
inputs = [],
outputs = [downloaded_archive],
command = """set -euo pipefail
curl -L "{archive_url}" -o {archive_path}
if [ -n "{sha256}" ]; then
echo "{sha256} {archive_path}" | sha256sum --check --strict -
fi
""".format(
archive_url = ctx.attr.url,
archive_path = downloaded_archive.path,
sha256 = ctx.attr.sha256,
),
mnemonic = "CURL",
progress_message = "Downloading {}".format(ctx.attr.url),
)
(erlang_home, _, runfiles) = erlang_dirs(ctx)
inputs = depset(
direct = [downloaded_archive],
transitive = [runfiles.files],
)
strip_prefix = ctx.attr.strip_prefix
if strip_prefix != "":
strip_prefix += "\\/"
ctx.actions.run_shell(
inputs = inputs,
outputs = [release_dir, build_dir, version_file],
command = """set -euo pipefail
2022-06-08 16:07:16 +08:00
{maybe_install_erlang}
export PATH="{erlang_home}"/bin:${{PATH}}
ABS_BUILD_DIR=$PWD/{build_path}
ABS_RELEASE_DIR=$PWD/{release_path}
ABS_VERSION_FILE=$PWD/{version_file}
tar --extract \\
--transform 's/{strip_prefix}//' \\
--file {archive_path} \\
--directory $ABS_BUILD_DIR
cd $ABS_BUILD_DIR
make
cp -r bin $ABS_RELEASE_DIR/
cp -r lib $ABS_RELEASE_DIR/
$ABS_RELEASE_DIR/bin/iex --version > $ABS_VERSION_FILE
""".format(
2022-06-08 16:07:16 +08:00
maybe_install_erlang = maybe_install_erlang(ctx),
erlang_home = erlang_home,
archive_path = downloaded_archive.path,
strip_prefix = strip_prefix,
build_path = build_dir.path,
release_path = release_dir.path,
version_file = version_file.path,
),
mnemonic = "ELIXIR",
progress_message = "Compiling elixir from source",
)
return [
DefaultInfo(
files = depset([
release_dir,
version_file,
]),
),
ctx.toolchains["@rules_erlang//tools:toolchain_type"].otpinfo,
ElixirInfo(
release_dir = release_dir,
elixir_home = None,
version_file = version_file,
),
]
elixir_build = rule(
implementation = _impl,
attrs = {
"url": attr.string(mandatory = True),
"strip_prefix": attr.string(),
"sha256": attr.string(),
},
toolchains = ["@rules_erlang//tools:toolchain_type"],
)
def _elixir_external_impl(ctx):
elixir_home = ctx.attr.elixir_home
if elixir_home == "":
elixir_home = ctx.attr._elixir_home[BuildSettingInfo].value
version_file = ctx.actions.declare_file(ctx.label.name + "_version")
(erlang_home, _, runfiles) = erlang_dirs(ctx)
ctx.actions.run_shell(
inputs = runfiles.files,
outputs = [version_file],
command = """set -euo pipefail
{maybe_install_erlang}
export PATH="{erlang_home}"/bin:${{PATH}}
"{elixir_home}"/bin/iex --version > {version_file}
""".format(
maybe_install_erlang = maybe_install_erlang(ctx),
erlang_home = erlang_home,
elixir_home = elixir_home,
version_file = version_file.path,
),
mnemonic = "ELIXIR",
progress_message = "Validating elixir at {}".format(elixir_home),
)
return [
DefaultInfo(
files = depset([version_file]),
),
ctx.toolchains["@rules_erlang//tools:toolchain_type"].otpinfo,
ElixirInfo(
release_dir = None,
elixir_home = elixir_home,
version_file = version_file,
),
]
elixir_external = rule(
implementation = _elixir_external_impl,
attrs = {
"_elixir_home": attr.label(default = Label("//:elixir_home")),
"elixir_home": attr.string(),
},
toolchains = ["@rules_erlang//tools:toolchain_type"],
)