diff --git a/.bazelrc b/.bazelrc index b1e3a90686f2..b21b7289af6a 100644 --- a/.bazelrc +++ b/.bazelrc @@ -8,7 +8,7 @@ build --local_test_jobs=1 build --flag_alias=erlang_home=@rules_erlang//:erlang_home build --flag_alias=erlang_version=@rules_erlang//:erlang_version -build --flag_alias=elixir_home=//:elixir_home +build --flag_alias=elixir_home=@rules_elixir//:elixir_home build --flag_alias=test_build=//:enable_test_build build --test_timeout=7200 diff --git a/BUILD.bazel b/BUILD.bazel index 23178f6e4821..3aa3ce4b0cb2 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,7 +1,6 @@ load( "@bazel_skylib//rules:common_settings.bzl", "bool_flag", - "string_flag", ) load("@rules_pkg//pkg:mappings.bzl", "pkg_files") load("@bazel_gazelle//:def.bzl", "gazelle") @@ -11,7 +10,7 @@ load("@rules_erlang//:dialyze.bzl", "DEFAULT_PLT_APPS", "plt") load("@rules_erlang//:shell.bzl", "shell") load("@rules_erlang//:erl_eval.bzl", "erl_eval") load("@rules_erlang//gazelle:moduleindex.bzl", "moduleindex") -load("//bazel/elixir:iex_eval.bzl", "iex_eval") +load("@rules_elixir//:iex_eval.bzl", "iex_eval") load(":rabbitmq_home.bzl", "rabbitmq_home") load(":rabbitmq_run.bzl", "rabbitmq_run", "rabbitmq_run_command") load(":rabbitmqctl.bzl", "rabbitmqctl") @@ -124,12 +123,6 @@ config_setting( }, ) -string_flag( - name = "elixir_home", - build_setting_default = "", - visibility = ["//visibility:public"], -) - plt( name = "base_plt", apps = DEFAULT_PLT_APPS + [ diff --git a/MODULE.bazel b/MODULE.bazel index bc3848308ae5..2b266cb77dc8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -46,7 +46,12 @@ bazel_dep( bazel_dep( name = "rules_erlang", - version = "3.15.1", + version = "3.15.3", +) + +bazel_dep( + name = "rules_elixir", + version = "1.0.0", ) bazel_dep( @@ -73,7 +78,7 @@ use_repo( ) elixir_config = use_extension( - "//bazel/bzlmod:extensions.bzl", + "@rules_elixir//bzlmod:extensions.bzl", "elixir_config", ) diff --git a/bazel/BUILD.ranch b/bazel/BUILD.ranch index 89555ce604aa..09bf62408b5f 100644 --- a/bazel/BUILD.ranch +++ b/bazel/BUILD.ranch @@ -88,12 +88,7 @@ filegroup(name = "private_hdrs") filegroup(name = "public_hdrs") -filegroup( - name = "priv", - srcs = [ - "ebin/ranch.appup", # keep - ], -) +filegroup(name = "priv") filegroup( name = "licenses", diff --git a/bazel/bzlmod/extensions.bzl b/bazel/bzlmod/extensions.bzl index 338c045a8ca8..f721bf37d449 100644 --- a/bazel/bzlmod/extensions.bzl +++ b/bazel/bzlmod/extensions.bzl @@ -1,99 +1,9 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load( ":secondary_umbrella.bzl", fetch_secondary_umbrella = "secondary_umbrella", ) -load( - "//bazel/repositories:elixir_config.bzl", - "INSTALLATION_TYPE_EXTERNAL", - "INSTALLATION_TYPE_INTERNAL", - _elixir_config_rule = "elixir_config", -) -load( - "//bazel/elixir:elixir.bzl", - "DEFAULT_ELIXIR_SHA256", - "DEFAULT_ELIXIR_VERSION", -) - -def _elixir_config(ctx): - types = {} - versions = {} - urls = {} - strip_prefixs = {} - sha256s = {} - elixir_homes = {} - - for mod in ctx.modules: - for elixir in mod.tags.external_elixir_from_path: - types[elixir.name] = INSTALLATION_TYPE_EXTERNAL - versions[elixir.name] = elixir.version - elixir_homes[elixir.name] = elixir.elixir_home - - for elixir in mod.tags.internal_elixir_from_http_archive: - types[elixir.name] = INSTALLATION_TYPE_INTERNAL - versions[elixir.name] = elixir.version - urls[elixir.name] = elixir.url - strip_prefixs[elixir.name] = elixir.strip_prefix - sha256s[elixir.name] = elixir.sha256 - - for elixir in mod.tags.internal_elixir_from_github_release: - url = "https://github.com/elixir-lang/elixir/archive/refs/tags/v{}.tar.gz".format( - elixir.version, - ) - strip_prefix = "elixir-{}".format(elixir.version) - - types[elixir.name] = INSTALLATION_TYPE_INTERNAL - versions[elixir.name] = elixir.version - urls[elixir.name] = url - strip_prefixs[elixir.name] = strip_prefix - sha256s[elixir.name] = elixir.sha256 - - _elixir_config_rule( - name = "elixir_config", - rabbitmq_server_workspace = "@rabbitmq-server", - types = types, - versions = versions, - urls = urls, - strip_prefixs = strip_prefixs, - sha256s = sha256s, - elixir_homes = elixir_homes, - ) - -external_elixir_from_path = tag_class(attrs = { - "name": attr.string(), - "version": attr.string(), - "elixir_home": attr.string(), -}) - -internal_elixir_from_http_archive = tag_class(attrs = { - "name": attr.string(), - "version": attr.string(), - "url": attr.string(), - "strip_prefix": attr.string(), - "sha256": attr.string(), -}) - -internal_elixir_from_github_release = tag_class(attrs = { - "name": attr.string( - default = "internal", - ), - "version": attr.string( - default = DEFAULT_ELIXIR_VERSION, - ), - "sha256": attr.string( - default = DEFAULT_ELIXIR_SHA256, - ), -}) - -elixir_config = module_extension( - implementation = _elixir_config, - tag_classes = { - "external_elixir_from_path": external_elixir_from_path, - "internal_elixir_from_http_archive": internal_elixir_from_http_archive, - "internal_elixir_from_github_release": internal_elixir_from_github_release, - }, -) def _secondary_umbrella(_ctx): fetch_secondary_umbrella() diff --git a/bazel/elixir/BUILD.bazel b/bazel/elixir/BUILD.bazel index f21e9181d40f..e6ca258ecc6e 100644 --- a/bazel/elixir/BUILD.bazel +++ b/bazel/elixir/BUILD.bazel @@ -1,26 +1 @@ -load( - ":elixir_as_app.bzl", - "elixir_as_app", -) - -toolchain_type( - name = "toolchain_type", - visibility = ["//visibility:public"], -) - -elixir_as_app( - name = "erlang_app", - visibility = ["//visibility:public"], -) - -elixir_as_app( - name = "logger", - app = "logger", - visibility = ["//visibility:public"], -) - -elixir_as_app( - name = "iex", - app = "iex", - visibility = ["//visibility:public"], -) +exports_files(["elixir_escript_main.exs"]) diff --git a/bazel/elixir/elixir.bzl b/bazel/elixir/elixir.bzl deleted file mode 100644 index d36240a9a862..000000000000 --- a/bazel/elixir/elixir.bzl +++ /dev/null @@ -1,147 +0,0 @@ -load( - ":elixir_build.bzl", - "elixir_build", - "elixir_external", -) -load( - ":elixir_toolchain.bzl", - "elixir_toolchain", -) -load( - "//bazel/repositories:elixir_config.bzl", - "INSTALLATION_TYPE_INTERNAL", - _elixir_config = "elixir_config", -) - -def elixir_toolchain_external(): - """DEPRECATED""" - - elixir_external( - name = "external_elixir_installation_ref", - target_compatible_with = [ - Label("//bazel/platforms:elixir_external"), - ], - ) - - elixir_toolchain( - name = "elixir_external", - elixir = ":external_elixir_installation_ref", - ) - - native.toolchain( - name = "elixir_toolchain_external", - exec_compatible_with = [ - Label("@erlang_config//:erlang_external"), - ], - target_compatible_with = [ - Label("//bazel/platforms:elixir_external"), - ], - toolchain = ":elixir_external", - toolchain_type = Label("//bazel/elixir:toolchain_type"), - visibility = ["//visibility:public"], - ) - -def elixir_toolchain_from_http_archive( - name_suffix = "", - url = None, - strip_prefix = None, - sha256 = None, - elixir_constraints = None): - """DEPRECATED""" - - elixir_build( - name = "elixir_build{}".format(name_suffix), - url = url, - strip_prefix = strip_prefix, - sha256 = sha256, - target_compatible_with = elixir_constraints, - ) - - elixir_toolchain( - name = "elixir{}".format(name_suffix), - elixir = ":elixir_build{}".format(name_suffix), - ) - - native.toolchain( - name = "elixir_toolchain{}".format(name_suffix), - exec_compatible_with = [ - Label("@erlang_config//:erlang_internal"), - ], - target_compatible_with = elixir_constraints, - toolchain = ":elixir{}".format(name_suffix), - toolchain_type = Label("//bazel/elixir:toolchain_type"), - visibility = ["//visibility:public"], - ) - -def elixir_toolchain_from_github_release( - name_suffix = "_default", - version = None, - sha256 = None): - """DEPRECATED""" - - [major, minor, patch] = version.split(".") - elixir_constraints = [ - Label("//bazel/platforms:elixir_{}_{}".format(major, minor)), - ] - url = "https://github.com/elixir-lang/elixir/archive/refs/tags/v{}.tar.gz".format(version) - elixir_toolchain_from_http_archive( - name_suffix = name_suffix, - url = url, - strip_prefix = "elixir-{}".format(version), - sha256 = sha256, - elixir_constraints = elixir_constraints, - ) - -DEFAULT_ELIXIR_VERSION = "1.13.4" -DEFAULT_ELIXIR_SHA256 = "95daf2dd3052e6ca7d4d849457eaaba09de52d65ca38d6933c65bc1cdf6b8579" - -# Generates the @elixir_config repository, which contains erlang -# toolchains and platform defintions -def elixir_config( - rabbitmq_server_workspace = "@rabbitmq-server", - internal_elixir_configs = []): - types = {c.name: INSTALLATION_TYPE_INTERNAL for c in internal_elixir_configs} - versions = {c.name: c.version for c in internal_elixir_configs} - urls = {c.name: c.url for c in internal_elixir_configs} - strip_prefixs = {c.name: c.strip_prefix for c in internal_elixir_configs if c.strip_prefix} - sha256s = {c.name: c.sha256 for c in internal_elixir_configs if c.sha256} - - _elixir_config( - name = "elixir_config", - rabbitmq_server_workspace = rabbitmq_server_workspace, - types = types, - versions = versions, - urls = urls, - strip_prefixs = strip_prefixs, - sha256s = sha256s, - ) - -def internal_elixir_from_http_archive( - name = None, - version = None, - url = None, - strip_prefix = None, - sha256 = None): - return struct( - name = name, - version = version, - url = url, - strip_prefix = strip_prefix, - sha256 = sha256, - ) - -def internal_elixir_from_github_release( - name = "internal", - version = DEFAULT_ELIXIR_VERSION, - sha256 = DEFAULT_ELIXIR_SHA256): - url = "https://github.com/elixir-lang/elixir/archive/refs/tags/v{}.tar.gz".format( - version, - ) - - return internal_elixir_from_http_archive( - name = name, - version = version, - url = url, - strip_prefix = "elixir-{}".format(version), - sha256 = sha256, - ) diff --git a/bazel/elixir/elixir_as_app.bzl b/bazel/elixir/elixir_as_app.bzl deleted file mode 100644 index 09eaa19cebc4..000000000000 --- a/bazel/elixir/elixir_as_app.bzl +++ /dev/null @@ -1,52 +0,0 @@ -load( - "@rules_erlang//:erlang_app_info.bzl", - "ErlangAppInfo", -) -load( - "@rules_erlang//:util.bzl", - "path_join", -) -load( - ":elixir_toolchain.bzl", - "elixir_dirs", -) - -def _impl(ctx): - ebin = ctx.actions.declare_directory(path_join(ctx.label.name, "ebin")) - - (elixir_home, elixir_runfiles) = elixir_dirs(ctx) - - ctx.actions.run_shell( - inputs = elixir_runfiles.files, - outputs = [ebin], - command = """set -euo pipefail - -cp -RL "{elixir_home}"/lib/{app}/ebin/* {ebin} -""".format( - elixir_home = elixir_home, - app = ctx.attr.app, - ebin = ebin.path, - ), - ) - - return [ - DefaultInfo(files = depset([ebin])), - ErlangAppInfo( - app_name = ctx.attr.app, - include = [], - beam = [ebin], - priv = [], - license_files = [], - srcs = [], - deps = [], - ), - ] - -elixir_as_app = rule( - implementation = _impl, - attrs = { - "app": attr.string(default = "elixir"), - }, - toolchains = [":toolchain_type"], - provides = [ErlangAppInfo], -) diff --git a/bazel/elixir/elixir_build.bzl b/bazel/elixir/elixir_build.bzl deleted file mode 100644 index 3ccc2c152e7d..000000000000 --- a/bazel/elixir/elixir_build.bzl +++ /dev/null @@ -1,172 +0,0 @@ -load( - "@bazel_skylib//rules:common_settings.bzl", - "BuildSettingInfo", -) -load( - "@rules_erlang//tools:erlang_toolchain.bzl", - "erlang_dirs", - "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 - -{maybe_install_erlang} - -export PATH="{erlang_home}"/bin:${{PATH}} -export HOME="$(mktemp -d)" - -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( - 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"], -) diff --git a/bazel/elixir/elixir_bytecode.bzl b/bazel/elixir/elixir_bytecode.bzl new file mode 100644 index 000000000000..d44779785e65 --- /dev/null +++ b/bazel/elixir/elixir_bytecode.bzl @@ -0,0 +1,108 @@ +load("@bazel_skylib//lib:shell.bzl", "shell") +load("@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", "flat_deps") +load("@rules_erlang//:util.bzl", "path_join") +load("@rules_erlang//private:util.bzl", "erl_libs_contents") + +def _impl(ctx): + ebin = ctx.actions.declare_directory(ctx.attr.dest) + + erl_libs_dir = ctx.label.name + "_deps" + + erl_libs_files = erl_libs_contents( + ctx, + target_info = None, + headers = True, + dir = erl_libs_dir, + deps = flat_deps(ctx.attr.deps), + ez_deps = ctx.files.ez_deps, + expand_ezs = True, + ) + + erl_libs_path = "" + if len(erl_libs_files) > 0: + erl_libs_path = path_join( + ctx.bin_dir.path, + ctx.label.workspace_root, + ctx.label.package, + erl_libs_dir, + ) + + env = "\n".join([ + "export {}={}".format(k, v) + for k, v in ctx.attr.env.items() + ]) + + script = """set -euo pipefail + +if [ -n "{erl_libs_path}" ]; then + export ERL_LIBS={erl_libs_path} +fi + +{env} + +{setup} +set -x +{elixirc} \\ + -o {out_dir} \\ + {elixirc_opts} \\ + {srcs} +""".format( + erl_libs_path = erl_libs_path, + env = env, + setup = ctx.attr.setup, + elixirc = ctx.executable._compiler.path, + out_dir = ebin.path, + elixirc_opts = " ".join([shell.quote(opt) for opt in ctx.attr.elixirc_opts]), + srcs = " ".join([f.path for f in ctx.files.srcs]), + ) + + compiler_runfiles = ctx.attr._compiler[DefaultInfo].default_runfiles + + inputs = depset( + direct = ctx.files.srcs + erl_libs_files, + transitive = [ + compiler_runfiles.files, + ], + ) + + ctx.actions.run_shell( + inputs = inputs, + outputs = [ebin], + command = script, + mnemonic = "ELIXIRC", + tools = [ctx.executable._compiler], + ) + + return [ + DefaultInfo( + files = depset([ebin]), + ) + ] + +elixir_bytecode = rule( + implementation = _impl, + attrs = { + "srcs": attr.label_list( + allow_files = [".ex"], + ), + "elixirc_opts": attr.string_list(), + "env": attr.string_dict(), + "deps": attr.label_list( + providers = [ErlangAppInfo], + ), + "ez_deps": attr.label_list( + allow_files = [".ez"], + ), + "dest": attr.string( + mandatory = True, + ), + "setup": attr.string(), + "_compiler": attr.label( + default = Label("@rules_elixir//tools:elixirc"), + allow_single_file = True, + executable = True, + cfg = "exec", + ), + }, + # toolchains = ["@rules_elixir//:toolchain_type"], +) diff --git a/bazel/elixir/elixir_escript_main.bzl b/bazel/elixir/elixir_escript_main.bzl new file mode 100644 index 000000000000..e65780c50d12 --- /dev/null +++ b/bazel/elixir/elixir_escript_main.bzl @@ -0,0 +1,94 @@ +load( + "@rules_elixir//private:elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_install_erlang", +) +load( + "@rules_erlang//:erlang_app_info.bzl", + "ErlangAppInfo", +) + +def _impl(ctx): + (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) + (elixir_home, elixir_runfiles) = elixir_dirs(ctx) + + app_info = ctx.attr.app[ErlangAppInfo] + + env = "\n".join([ + "export {}={}".format(k, v) + for k, v in ctx.attr.env.items() + ]) + + config_path = "" + if ctx.file.mix_config != None: + config_path = ctx.file.mix_config.path + + command = """set -euo pipefail + +{maybe_install_erlang} + +if [[ "{elixir_home}" == /* ]]; then + ABS_ELIXIR_HOME="{elixir_home}" +else + ABS_ELIXIR_HOME=$PWD/{elixir_home} +fi + +export OUT="{out}" +export CONFIG_PATH="{config_path}" +export APP="{app}" +export MAIN_MODULE="Elixir.{main_module}" + +{env} + +export PATH="{erlang_home}/bin:$PATH" +set -x +"{elixir_home}"/bin/elixir {script} +""".format( + maybe_install_erlang = maybe_install_erlang(ctx), + erlang_home = erlang_home, + elixir_home = elixir_home, + env = env, + script = ctx.file._script.path, + out = ctx.outputs.out.path, + config_path = config_path, + app = app_info.app_name, + main_module = ctx.attr.main_module, + ) + + inputs = depset( + direct = ctx.files._script + ctx.files.mix_config, + transitive = [ + erlang_runfiles.files, + elixir_runfiles.files, + ], + ) + + ctx.actions.run_shell( + inputs = inputs, + outputs = [ctx.outputs.out], + command = command, + mnemonic = "ELIXIR", + ) + +elixir_escript_main = rule( + implementation = _impl, + attrs = { + "_script": attr.label( + allow_single_file = True, + default = Label(":elixir_escript_main.exs"), + ), + "app": attr.label( + providers = [ErlangAppInfo], + ), + "env": attr.string_dict(), + "main_module": attr.string(), + "mix_config": attr.label( + allow_single_file = [".exs"], + ), + "out": attr.output(), + }, + toolchains = [ + "@rules_elixir//:toolchain_type", + ], +) diff --git a/bazel/elixir/elixir_escript_main.exs b/bazel/elixir/elixir_escript_main.exs new file mode 100644 index 000000000000..0b8511e12a04 --- /dev/null +++ b/bazel/elixir/elixir_escript_main.exs @@ -0,0 +1,130 @@ +defmodule ElixirEscriptMain do + # https://github.com/elixir-lang/elixir/blob/99785cc16be096d02012ad889ca51b5045b599a4/lib/mix/lib/mix/tasks/escript.build.ex#L327 + def gen_main(project, name, module, app, language) do + config_path = project[:config_path] + + compile_config = + if File.regular?(config_path) do + config = Config.Reader.read!(config_path, env: Mix.env(), target: Mix.target()) + Macro.escape(config) + else + [] + end + + runtime_path = config_path |> Path.dirname() |> Path.join("runtime.exs") + + runtime_config = + if File.regular?(runtime_path) do + File.read!(runtime_path) + end + + module_body = + quote do + @spec main(OptionParser.argv()) :: any + def main(args) do + unquote(main_body_for(language, module, app, compile_config, runtime_config)) + end + + defp load_config(config) do + each_fun = fn {app, kw} -> + set_env_fun = fn {k, v} -> :application.set_env(app, k, v, persistent: true) end + :lists.foreach(set_env_fun, kw) + end + + :lists.foreach(each_fun, config) + :ok + end + + defp start_app(nil) do + :ok + end + + defp start_app(app) do + case :application.ensure_all_started(app) do + {:ok, _} -> + :ok + + {:error, {app, reason}} -> + formatted_error = + case :code.ensure_loaded(Application) do + {:module, Application} -> Application.format_error(reason) + {:error, _} -> :io_lib.format(~c"~p", [reason]) + end + + error_message = [ + "ERROR! Could not start application ", + :erlang.atom_to_binary(app, :utf8), + ": ", + formatted_error, + ?\n + ] + + io_error(error_message) + :erlang.halt(1) + end + end + + defp io_error(message) do + :io.put_chars(:standard_error, message) + end + end + + {:module, ^name, binary, _} = Module.create(name, module_body, Macro.Env.location(__ENV__)) + [{~c"#{name}.beam", binary}] + end + + defp main_body_for(:elixir, module, app, compile_config, runtime_config) do + config = + if runtime_config do + quote do + runtime_config = + Config.Reader.eval!( + "config/runtime.exs", + unquote(runtime_config), + env: unquote(Mix.env()), + target: unquote(Mix.target()), + imports: :disabled + ) + + Config.Reader.merge(unquote(compile_config), runtime_config) + end + else + compile_config + end + + quote do + case :application.ensure_all_started(:elixir) do + {:ok, _} -> + args = Enum.map(args, &List.to_string(&1)) + System.argv(args) + load_config(unquote(config)) + start_app(unquote(app)) + Kernel.CLI.run(fn _ -> unquote(module).main(args) end) + + error -> + io_error(["ERROR! Failed to start Elixir.\n", :io_lib.format(~c"error: ~p~n", [error])]) + :erlang.halt(1) + end + end + end +end + +output = System.get_env("OUT") +IO.puts("Will write to " <> output) + +project = [ + config_path: System.get_env("CONFIG_PATH", "config/config.exs"), +] +app = String.to_atom(System.get_env("APP")) +name = String.to_atom(Atom.to_string(app) <> "_escript") +module = String.to_atom(System.get_env("MAIN_MODULE")) + +:application.ensure_all_started(:mix) +Mix.State.start_link(:none) +[{_, bytecode}] = ElixirEscriptMain.gen_main(project, name, module, app, :elixir) + +{:ok, file} = File.open(output, [:write]) +IO.binwrite(file, bytecode) +File.close(file) + +IO.puts("done.") diff --git a/bazel/elixir/elixir_toolchain.bzl b/bazel/elixir/elixir_toolchain.bzl deleted file mode 100644 index 54aff63f08f6..000000000000 --- a/bazel/elixir/elixir_toolchain.bzl +++ /dev/null @@ -1,68 +0,0 @@ -load( - "@rules_erlang//private:erlang_build.bzl", - "OtpInfo", -) -load( - ":elixir_build.bzl", - "ElixirInfo", -) - -def _impl(ctx): - toolchain_info = platform_common.ToolchainInfo( - otpinfo = ctx.attr.elixir[OtpInfo], - elixirinfo = ctx.attr.elixir[ElixirInfo], - ) - return [toolchain_info] - -elixir_toolchain = rule( - implementation = _impl, - attrs = { - "elixir": attr.label( - mandatory = True, - providers = [OtpInfo, ElixirInfo], - ), - }, - provides = [platform_common.ToolchainInfo], -) - -def _build_info(ctx): - return ctx.toolchains[":toolchain_type"].otpinfo - -def erlang_dirs(ctx): - info = _build_info(ctx) - if info.release_dir_tar != None: - runfiles = ctx.runfiles([ - info.release_dir_tar, - info.version_file, - ]) - else: - runfiles = ctx.runfiles([ - info.version_file, - ]) - return (info.erlang_home, info.release_dir_tar, runfiles) - -def elixir_dirs(ctx, short_path = False): - info = ctx.toolchains[":toolchain_type"].elixirinfo - if info.elixir_home != None: - return (info.elixir_home, ctx.runfiles([info.version_file])) - else: - p = info.release_dir.short_path if short_path else info.release_dir.path - return (p, ctx.runfiles([info.release_dir, info.version_file])) - -def maybe_install_erlang(ctx, short_path = False): - info = _build_info(ctx) - release_dir_tar = info.release_dir_tar - if release_dir_tar == None: - return "" - else: - return """\ -mkdir -p $(dirname "{install_path}") -if mkdir "{install_path}"; then - tar --extract \\ - --directory "{install_path}" \\ - --file {release_tar} -fi\ -""".format( - release_tar = release_dir_tar.short_path if short_path else release_dir_tar.path, - install_path = info.install_path, - ) diff --git a/bazel/elixir/iex_eval.bzl b/bazel/elixir/iex_eval.bzl deleted file mode 100644 index 956fd751194c..000000000000 --- a/bazel/elixir/iex_eval.bzl +++ /dev/null @@ -1,70 +0,0 @@ -load( - ":elixir_toolchain.bzl", - "elixir_dirs", - "erlang_dirs", - "maybe_install_erlang", -) - -def _impl(ctx): - outs = [ - ctx.actions.declare_file(f) - for f in ctx.attr.outs - ] - - (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) - (elixir_home, elixir_runfiles) = elixir_dirs(ctx) - - script = """set -euo pipefail - -{maybe_install_erlang} - -if [[ "{elixir_home}" == /* ]]; then - ABS_ELIXIR_HOME="{elixir_home}" -else - ABS_ELIXIR_HOME=$PWD/{elixir_home} -fi - -export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} - -export SRCS="{srcs}" -export OUTS="{outs}" - -${{ABS_ELIXIR_HOME}}/bin/iex --eval "$1" -""".format( - maybe_install_erlang = maybe_install_erlang(ctx), - erlang_home = erlang_home, - elixir_home = elixir_home, - srcs = ctx.configuration.host_path_separator.join([src.path for src in ctx.files.srcs]), - outs = ctx.configuration.host_path_separator.join([out.path for out in outs]), - ) - - inputs = depset( - direct = ctx.files.srcs, - transitive = [ - erlang_runfiles.files, - elixir_runfiles.files, - ], - ) - - ctx.actions.run_shell( - inputs = inputs, - outputs = outs, - command = script, - arguments = [ctx.attr.expression], - ) - - return [ - DefaultInfo(files = depset(outs)), - ] - -iex_eval = rule( - implementation = _impl, - attrs = { - "srcs": attr.label_list(allow_files = True), - "outs": attr.string_list(), - "expression": attr.string( - mandatory = True, - ), - }, - toolchains = [":toolchain_type"], -) diff --git a/bazel/elixir/mix_archive_build.bzl b/bazel/elixir/mix_archive_build.bzl index adc3b15de608..621a43748fa8 100644 --- a/bazel/elixir/mix_archive_build.bzl +++ b/bazel/elixir/mix_archive_build.bzl @@ -1,14 +1,24 @@ load("@bazel_skylib//lib:shell.bzl", "shell") load( - "@rules_erlang//private:util.bzl", - "additional_file_dest_relative_path", -) -load( - "//bazel/elixir:elixir_toolchain.bzl", + "@rules_elixir//private:elixir_toolchain.bzl", "elixir_dirs", "erlang_dirs", "maybe_install_erlang", ) +load( + "@rules_erlang//:erlang_app_info.bzl", + "ErlangAppInfo", + "flat_deps", +) +load( + "@rules_erlang//:util.bzl", + "path_join", +) +load( + "@rules_erlang//private:util.bzl", + "additional_file_dest_relative_path", + "erl_libs_contents", +) def _impl(ctx): (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) @@ -17,6 +27,27 @@ def _impl(ctx): out = ctx.actions.declare_file(ctx.attr.out.name) mix_invocation_dir = ctx.actions.declare_directory("{}_mix".format(ctx.label.name)) + erl_libs_dir = ctx.label.name + "_deps" + + erl_libs_files = erl_libs_contents( + ctx, + target_info = None, + headers = True, + dir = erl_libs_dir, + deps = flat_deps(ctx.attr.deps), + ez_deps = ctx.files.ez_deps, + expand_ezs = True, + ) + + erl_libs_path = "" + if len(erl_libs_files) > 0: + erl_libs_path = path_join( + ctx.bin_dir.path, + ctx.label.workspace_root, + ctx.label.package, + erl_libs_dir, + ) + copy_srcs_commands = [] for src in ctx.attr.srcs: for src_file in src[DefaultInfo].files.to_list(): @@ -36,6 +67,10 @@ def _impl(ctx): {maybe_install_erlang} +if [ -n "{erl_libs_path}" ]; then + export ERL_LIBS=$PWD/{erl_libs_path} +fi + if [[ "{elixir_home}" == /* ]]; then ABS_ELIXIR_HOME="{elixir_home}" else @@ -61,12 +96,15 @@ export ERL_COMPILER_OPTIONS=deterministic for archive in {archives}; do "${{ABS_ELIXIR_HOME}}"/bin/mix archive.install --force $ORIGINAL_DIR/$archive done -if [[ -n "{ez_deps}" ]]; then +if [[ -n "{erl_libs_path}" ]]; then mkdir -p _build/${{MIX_ENV}}/lib - for ez_dep in {ez_deps}; do - unzip -q $ORIGINAL_DIR/$ez_dep -d _build/${{MIX_ENV}}/lib + for dep in "$ERL_LIBS"/*; do + ln -s $dep _build/${{MIX_ENV}}/lib done fi + +{setup} + "${{ABS_ELIXIR_HOME}}"/bin/mix archive.build \\ --no-deps-check \\ -o "${{ABS_OUT_PATH}}" @@ -76,12 +114,13 @@ fi find . -type l -delete """.format( maybe_install_erlang = maybe_install_erlang(ctx), + erl_libs_path = erl_libs_path, erlang_home = erlang_home, elixir_home = elixir_home, mix_invocation_dir = mix_invocation_dir.path, copy_srcs_commands = "\n".join(copy_srcs_commands), archives = " ".join([shell.quote(a.path) for a in ctx.files.archives]), - ez_deps = " ".join([shell.quote(a.path) for a in ctx.files.ez_deps]), + setup = ctx.attr.setup, out = out.path, ) @@ -91,7 +130,7 @@ find . -type l -delete erlang_runfiles.files, elixir_runfiles.files, depset(ctx.files.archives), - depset(ctx.files.ez_deps), + depset(erl_libs_files), ], ) @@ -121,12 +160,16 @@ mix_archive_build = rule( "archives": attr.label_list( allow_files = [".ez"], ), + "setup": attr.string(), "ez_deps": attr.label_list( allow_files = [".ez"], ), + "deps": attr.label_list( + providers = [ErlangAppInfo], + ), "out": attr.output(), }, toolchains = [ - ":toolchain_type", + "@rules_elixir//:toolchain_type", ], ) diff --git a/bazel/repositories/BUILD.bazel b/bazel/repositories/BUILD.bazel deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/bazel/repositories/BUILD_external.tpl b/bazel/repositories/BUILD_external.tpl deleted file mode 100644 index d8649ce15b47..000000000000 --- a/bazel/repositories/BUILD_external.tpl +++ /dev/null @@ -1,34 +0,0 @@ -# This file is generated by rabbitmq-server via the elixir_config macro - -load( - "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:elixir_build.bzl", - "elixir_external", -) -load( - "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:elixir_toolchain.bzl", - "elixir_toolchain", -) - -elixir_external( - name = "elixir_external", - elixir_home = "%{ELIXIR_HOME}", -) - -elixir_toolchain( - name = "elixir", - elixir = ":elixir_external", - visibility = ["//visibility:public"], -) - -toolchain( - name = "toolchain", - exec_compatible_with = [ - "//:elixir_external", - ], - target_compatible_with = [ - "//:elixir_%{ELIXIR_VERSION_ID}", - ], - toolchain = ":elixir", - toolchain_type = "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:toolchain_type", - visibility = ["//visibility:public"], -) diff --git a/bazel/repositories/BUILD_internal.tpl b/bazel/repositories/BUILD_internal.tpl deleted file mode 100644 index 6592e8e7a704..000000000000 --- a/bazel/repositories/BUILD_internal.tpl +++ /dev/null @@ -1,36 +0,0 @@ -# This file is generated by rabbitmq-server via the elixir_config macro - -load( - "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:elixir_build.bzl", - "elixir_build", -) -load( - "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:elixir_toolchain.bzl", - "elixir_toolchain", -) - -elixir_build( - name = "elixir_build", - url = "%{URL}", - strip_prefix = "%{STRIP_PREFIX}", - sha256 = "%{SHA_256}", -) - -elixir_toolchain( - name = "elixir", - elixir = ":elixir_build", - visibility = ["//visibility:public"], -) - -toolchain( - name = "toolchain", - exec_compatible_with = [ - "//:elixir_internal", - ], - target_compatible_with = [ - "//:elixir_%{ELIXIR_VERSION_ID}", - ], - toolchain = ":elixir", - toolchain_type = "%{RABBITMQ_SERVER_WORKSPACE}//bazel/elixir:toolchain_type", - visibility = ["//visibility:public"], -) diff --git a/bazel/repositories/defaults.bzl.tpl b/bazel/repositories/defaults.bzl.tpl deleted file mode 100644 index f4822fd9d078..000000000000 --- a/bazel/repositories/defaults.bzl.tpl +++ /dev/null @@ -1,6 +0,0 @@ -# This file is generated by rabbitmq-server via the elixir_config macro - -def register_defaults(): - native.register_toolchains( -%{TOOLCHAINS} - ) diff --git a/bazel/repositories/elixir_config.bzl b/bazel/repositories/elixir_config.bzl deleted file mode 100644 index 1d59cbf86307..000000000000 --- a/bazel/repositories/elixir_config.bzl +++ /dev/null @@ -1,233 +0,0 @@ -load( - "@rules_erlang//:util.bzl", - "msys2_path", - "path_join", -) - -ELIXIR_HOME_ENV_VAR = "ELIXIR_HOME" - -_DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME = "external" -_ELIXIR_VERSION_UNKNOWN = "UNKNOWN" - -INSTALLATION_TYPE_EXTERNAL = "external" -INSTALLATION_TYPE_INTERNAL = "internal" - -def _version_identifier(version_string): - parts = version_string.split(".", 2) - if len(parts) > 1: - return "{}_{}".format(parts[0], parts[1]) - else: - return parts[0] - -def _impl(repository_ctx): - rabbitmq_server_workspace = repository_ctx.attr.rabbitmq_server_workspace - - elixir_installations = _default_elixir_dict(repository_ctx) - for name in repository_ctx.attr.types.keys(): - if name == _DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME: - fail("'{}' is reserved as an elixir name".format( - _DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME, - )) - version = repository_ctx.attr.versions[name] - identifier = _version_identifier(version) - elixir_installations[name] = struct( - type = repository_ctx.attr.types[name], - version = version, - identifier = identifier, - url = repository_ctx.attr.urls.get(name, None), - strip_prefix = repository_ctx.attr.strip_prefixs.get(name, None), - sha256 = repository_ctx.attr.sha256s.get(name, None), - elixir_home = repository_ctx.attr.elixir_homes.get(name, None), - ) - - for (name, props) in elixir_installations.items(): - if props.type == INSTALLATION_TYPE_EXTERNAL: - repository_ctx.template( - "{}/BUILD.bazel".format(name), - Label("//bazel/repositories:BUILD_external.tpl"), - { - "%{ELIXIR_HOME}": props.elixir_home, - "%{ELIXIR_VERSION_ID}": props.identifier, - "%{RABBITMQ_SERVER_WORKSPACE}": rabbitmq_server_workspace, - }, - False, - ) - else: - repository_ctx.template( - "{}/BUILD.bazel".format(name), - Label("//bazel/repositories:BUILD_internal.tpl"), - { - "%{URL}": props.url, - "%{STRIP_PREFIX}": props.strip_prefix or "", - "%{SHA_256}": props.sha256 or "", - "%{ELIXIR_VERSION_ID}": props.identifier, - "%{RABBITMQ_SERVER_WORKSPACE}": rabbitmq_server_workspace, - }, - False, - ) - - if len(elixir_installations) == 0: - fail("No elixir installations configured") - - repository_ctx.file( - "BUILD.bazel", - _build_file_content(elixir_installations), - False, - ) - - toolchains = [ - "@{}//{}:toolchain".format(repository_ctx.name, name) - for name in elixir_installations.keys() - ] - - repository_ctx.template( - "defaults.bzl", - Label("//bazel/repositories:defaults.bzl.tpl"), - { - "%{TOOLCHAINS}": "\n".join([ - ' "%s",' % t - for t in toolchains - ]), - }, - False, - ) - -elixir_config = repository_rule( - implementation = _impl, - attrs = { - "rabbitmq_server_workspace": attr.string(), - "types": attr.string_dict(), - "versions": attr.string_dict(), - "urls": attr.string_dict(), - "strip_prefixs": attr.string_dict(), - "sha256s": attr.string_dict(), - "elixir_homes": attr.string_dict(), - }, - environ = [ - ELIXIR_HOME_ENV_VAR, - "PATH", - ], - local = True, -) - -def _elixir_home_from_elixir_path(repository_ctx, elixir_path): - ehr = repository_ctx.execute( - [ - elixir_path, - "-e", - "IO.puts Path.dirname(Path.dirname(Path.dirname(Path.dirname(Path.expand(:code.which(System))))))", - ], - ) - if ehr.return_code == 0: - elixir_home = ehr.stdout.strip("\n") - else: - elixir_home = str(elixir_path.dirname.dirname) - return elixir_home - -def _is_windows(repository_ctx): - return repository_ctx.os.name.lower().find("windows") != -1 - -def _default_elixir_dict(repository_ctx): - if _is_windows(repository_ctx): - if ELIXIR_HOME_ENV_VAR in repository_ctx.os.environ: - elixir_home = repository_ctx.os.environ[ELIXIR_HOME_ENV_VAR] - elixir_path = elixir_home + "\\bin\\elixir" - else: - elixir_path = repository_ctx.which("elixir") - if elixir_path == None: - elixir_path = repository_ctx.path("C:/Program Files (x86)/Elixir/bin/elixir") - elixir_home = _elixir_home_from_elixir_path(repository_ctx, elixir_path) - elixir_home = msys2_path(elixir_home) - elif ELIXIR_HOME_ENV_VAR in repository_ctx.os.environ: - elixir_home = repository_ctx.os.environ[ELIXIR_HOME_ENV_VAR] - elixir_path = path_join(elixir_home, "bin", "elixir") - else: - elixir_path = repository_ctx.which("elixir") - if elixir_path == None: - elixir_path = repository_ctx.path("/usr/local/bin/elixir") - elixir_home = _elixir_home_from_elixir_path(repository_ctx, elixir_path) - - version = repository_ctx.execute( - [ - path_join(elixir_home, "bin", "elixir"), - "-e", - "IO.puts System.version()", - ], - timeout = 10, - ) - if version.return_code == 0: - version = version.stdout.strip("\n") - identifier = _version_identifier(version) - return { - _DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME: struct( - type = INSTALLATION_TYPE_EXTERNAL, - version = version, - identifier = identifier, - elixir_home = elixir_home, - ), - } - else: - return { - _DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME: struct( - type = INSTALLATION_TYPE_EXTERNAL, - version = _ELIXIR_VERSION_UNKNOWN, - identifier = _ELIXIR_VERSION_UNKNOWN.lower(), - elixir_home = elixir_home, - ), - } - -def _build_file_content(elixir_installations): - build_file_content = """\ -package( - default_visibility = ["//visibility:public"], -) - -constraint_setting( - name = "elixir_internal_external", - default_constraint_value = ":elixir_external", -) - -constraint_value( - name = "elixir_external", - constraint_setting = ":elixir_internal_external", -) - -constraint_value( - name = "elixir_internal", - constraint_setting = ":elixir_internal_external", -) - -""" - - default_installation = elixir_installations[_DEFAULT_EXTERNAL_ELIXIR_PACKAGE_NAME] - - build_file_content += """\ -constraint_setting( - name = "elixir_version", - default_constraint_value = ":elixir_{}", -) - -""".format(default_installation.identifier) - - unique_identifiers = { - props.identifier: name - for (name, props) in elixir_installations.items() - }.keys() - - for identifier in unique_identifiers: - build_file_content += """\ -constraint_value( - name = "elixir_{identifier}", - constraint_setting = ":elixir_version", -) - -platform( - name = "elixir_{identifier}_platform", - constraint_values = [ - ":elixir_{identifier}", - ], -) - -""".format(identifier = identifier) - - return build_file_content diff --git a/deps/rabbit/BUILD.bazel b/deps/rabbit/BUILD.bazel index ba4cf2fe20f8..f79873475b52 100644 --- a/deps/rabbit/BUILD.bazel +++ b/deps/rabbit/BUILD.bazel @@ -249,6 +249,10 @@ plt( ], for_target = ":erlang_app", ignore_warnings = True, +<<<<<<< HEAD +======= + libs = ["@rules_elixir//elixir"], # keep +>>>>>>> 5debebfaf3 (Use rules_elixir to build the cli without mix) plt = "//:base_plt", deps = [ "@looking_glass//:erlang_app", # keep diff --git a/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel b/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel index 7cb93b375753..6529f4a3622b 100644 --- a/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel +++ b/deps/rabbitmq_auth_backend_oauth2/BUILD.bazel @@ -66,7 +66,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_cli/BUILD.bazel b/deps/rabbitmq_cli/BUILD.bazel index f03ffc18b9d9..9b7fd6c6cd34 100644 --- a/deps/rabbitmq_cli/BUILD.bazel +++ b/deps/rabbitmq_cli/BUILD.bazel @@ -1,13 +1,35 @@ +load("@rules_elixir//:ex_unit_test.bzl", "ex_unit_test") +load( + "@rules_elixir//private:elixir_ebin_dir.bzl", + "elixir_ebin_dir", +) +load( + "@rules_elixir//private:erlang_app_filter_module_conflicts.bzl", + "erlang_app_filter_module_conflicts", +) +load("@rules_erlang//:app_file2.bzl", "app_file") load("@rules_erlang//:dialyze.bzl", "dialyze", "plt") -load(":rabbitmqctl.bzl", "rabbitmqctl") -load(":rabbitmqctl_check_formatted.bzl", "rabbitmqctl_check_formatted_test") -load(":rabbitmqctl_compile_warnings_as_errors.bzl", "rabbitmqctl_compile_warnings_as_errors_test") -load(":rabbitmqctl_test.bzl", "rabbitmqctl_test") +load("@rules_erlang//:erlang_app_info.bzl", "erlang_app_info") +load("@rules_erlang//:escript.bzl", "escript_archive") +load( + "//:rabbitmq.bzl", + "APP_VERSION", + "RABBITMQ_DIALYZER_OPTS", + "STARTS_BACKGROUND_BROKER_TAG", + "without", +) load("//:rabbitmq_home.bzl", "rabbitmq_home") load("//:rabbitmq_run.bzl", "rabbitmq_run") -load("//:rabbitmq.bzl", "RABBITMQ_DIALYZER_OPTS", "STARTS_BACKGROUND_BROKER_TAG", "without") load( - "@rabbitmq-server//bazel/elixir:mix_archive_build.bzl", + "//bazel/elixir:elixir_bytecode.bzl", + "elixir_bytecode", +) +load( + "//bazel/elixir:elixir_escript_main.bzl", + "elixir_escript_main", +) +load( + "//bazel/elixir:mix_archive_build.bzl", "mix_archive_build", ) @@ -25,35 +47,216 @@ mix_archive_build( archives = ["@hex//:archive"], ) +mix_archive_build( + name = "amqp_ez", + testonly = True, + srcs = ["@amqp//:sources"], + out = "amqp.ez", + archives = ["@hex//:archive"], + setup = """\ +export DEPS_DIR="$ERL_LIBS" +""", + deps = [ + "//deps/amqp_client:erlang_app", + "//deps/rabbit_common:erlang_app", + ], +) + +mix_archive_build( + name = "temp_ez", + testonly = True, + srcs = ["@temp//:sources"], + out = "temp.ez", + archives = ["@hex//:archive"], +) + +mix_archive_build( + name = "x509_ez", + testonly = True, + srcs = ["@x509//:sources"], + out = "x509.ez", + archives = ["@hex//:archive"], +) + +APP_NAME = "rabbitmqctl" + +APP_ENV = """[{scopes,[{'rabbitmq-plugins',plugins}, + {rabbitmqctl,ctl}, + {'rabbitmq-diagnostics',diagnostics}, + {'rabbitmq-queues',queues}, + {'rabbitmq-streams',streams}, + {'rabbitmq-upgrade',upgrade}, + {'vmware-rabbitmq',vmware}]}]""" + +EXTRA_APPS = [ + "elixir", + "logger", +] + +SRCS = glob([ + "lib/**/*.ex", +]) + +DEPS = [ + "//deps/rabbit_common:erlang_app", + "@observer_cli//:erlang_app", + "@stdout_formatter//:erlang_app", +] + +elixir_bytecode( + name = "beam_files", + srcs = SRCS, + dest = "beam_files", + elixirc_opts = [ + "-e", + ":application.ensure_all_started(:mix)", + ], + env = { + "HOME": '"$(mktemp -d)"', + "MIX_ENV": "prod", + "DEPS_DIR": "$ERL_LIBS", + "ERL_COMPILER_OPTIONS": "deterministic", + }, + ez_deps = [ + ":csv.ez", + ":json.ez", + ], + setup = """\ +mkdir -p _build/$MIX_ENV/lib/csv +cp -RL $ERL_LIBS/csv/ebin _build/$MIX_ENV/lib/csv +""", + deps = DEPS, +) + +app_file( + name = "app_file", + out = "%s.app" % APP_NAME, + app_description = APP_NAME, + app_env = APP_ENV, + app_name = APP_NAME, + app_version = APP_VERSION, + extra_apps = EXTRA_APPS, + modules = [":beam_files"], +) + +elixir_ebin_dir( + name = "ebin", + app_file = ":app_file", + beam_files_dir = ":beam_files", + dest = "ebin", +) + +erlang_app_filter_module_conflicts( + name = "elixir_without_rabbitmqctl_overlap", + src = "@rules_elixir//elixir", + dest = "unconsolidated", + without = [":ebin"], +) + +erlang_app_info( + name = "erlang_app", + srcs = SRCS, + hdrs = [], + app_name = APP_NAME, + beam = [":ebin"], + extra_apps = EXTRA_APPS, + license_files = glob(["LICENSE*"]), + priv = [], + visibility = ["//visibility:public"], + deps = [ + ":elixir_without_rabbitmqctl_overlap", + "@rules_elixir//elixir:logger", + ] + DEPS, +) + +elixir_escript_main( + name = "escript_main", + out = "rabbitmqctl_escript.beam", + app = ":erlang_app", + env = { + "HOME": '"$(mktemp -d)"', + }, + main_module = "RabbitMQCtl", + mix_config = "config/config.exs", +) + # Note: All the various rabbitmq-* scripts are just copies of rabbitmqctl -rabbitmqctl( +escript_archive( name = "rabbitmqctl", - srcs = [ - "config/config.exs", - "mix.exs", - ] + glob([ - "lib/**/*.ex", - ]), - archives = [ - "@hex//:archive", + app = ":erlang_app", + beam = [":escript_main"], + drop_hrl = True, + flat = True, + headers = [ + "shebang", + '{emu_args, "-escript main rabbitmqctl_escript -hidden"}', ], + visibility = ["//visibility:public"], +) + +_TEST_MODULES = [ + "RabbitMQ.CLI.Ctl.Commands.DuckCommand", + "RabbitMQ.CLI.Ctl.Commands.GrayGooseCommand", + "RabbitMQ.CLI.Ctl.Commands.UglyDucklingCommand", + "RabbitMQ.CLI.Plugins.Commands.StorkCommand", + "RabbitMQ.CLI.Plugins.Commands.HeronCommand", + "RabbitMQ.CLI.Custom.Commands.CrowCommand", + "RabbitMQ.CLI.Custom.Commands.RavenCommand", + "RabbitMQ.CLI.Seagull.Commands.SeagullCommand", + "RabbitMQ.CLI.Seagull.Commands.PacificGullCommand", + "RabbitMQ.CLI.Seagull.Commands.HerringGullCommand", + "RabbitMQ.CLI.Seagull.Commands.HermannGullCommand", + "RabbitMQ.CLI.Wolf.Commands.CanisLupusCommand", + "RabbitMQ.CLI.Wolf.Commands.CanisLatransCommand", + "RabbitMQ.CLI.Wolf.Commands.CanisAureusCommand", +] + +app_file( + name = "test_app_file", + testonly = True, + out = "test/%s.app" % APP_NAME, + app_description = APP_NAME, + app_env = APP_ENV, + app_name = APP_NAME, + app_version = APP_VERSION, + extra_apps = EXTRA_APPS, + modules = [":beam_files"], + synthetic_module_names = [ + "Elixir." + name + for name in _TEST_MODULES + ], +) + +elixir_ebin_dir( + name = "test_ebin", + testonly = True, + app_file = ":test_app_file", + beam_files_dir = ":beam_files", + dest = "test_ebin", +) + +erlang_app_info( + name = "test_erlang_app", + testonly = True, + srcs = SRCS, + hdrs = [], + app_name = APP_NAME, + beam = [":test_ebin"], + extra_apps = EXTRA_APPS, license_files = glob(["LICENSE*"]), - source_deps = { - "@csv//:sources": "csv", - "@json//:sources": "json", - }, + priv = [], visibility = ["//visibility:public"], deps = [ - "//deps/rabbit_common:erlang_app", - "@observer_cli//:erlang_app", - "@stdout_formatter//:erlang_app", - ], + ":elixir_without_rabbitmqctl_overlap", + "@rules_elixir//elixir:logger", + ] + DEPS, ) rabbitmq_home( name = "broker-for-cli-tests-home", testonly = True, plugins = [ + ":test_erlang_app", "//deps/rabbit:erlang_app", "//deps/rabbitmq_federation:erlang_app", "//deps/rabbitmq_stomp:erlang_app", @@ -69,81 +272,6 @@ rabbitmq_run( visibility = ["//visibility:public"], ) -rabbitmqctl_check_formatted_test( - name = "check_formatted", - size = "small", - srcs = [ - ".formatter.exs", - "config/config.exs", - "mix.exs", - ] + glob([ - "lib/**/*.ex", - "test/**/*.exs", - ]), - data = glob(["test/fixtures/**/*"]), - target_compatible_with = select({ - "@platforms//os:macos": [ - "@platforms//os:macos", - "@elixir_config//:elixir_1_15", - ], - "//conditions:default": [ - "@platforms//os:linux", - "@elixir_config//:elixir_1_15", - ], - }), -) - -test_suite( - name = "rabbitmqctl_check_formatted", - tests = ["check_formatted"], -) - -rabbitmqctl_compile_warnings_as_errors_test( - name = "compile_warnings_as_errors", - size = "small", - srcs = [ - ".formatter.exs", - "config/config.exs", - "mix.exs", - ] + glob([ - "lib/**/*.ex", - "test/**/*.exs", - ]), - archives = [ - "@hex//:archive", - ], - data = glob(["test/fixtures/**/*"]), - source_deps = { - "@amqp//:sources": "amqp", - "@csv//:sources": "csv", - "@json//:sources": "json", - "@temp//:sources": "temp", - "@x509//:sources": "x509", - }, - target_compatible_with = select({ - "@platforms//os:macos": [ - "@platforms//os:macos", - "@elixir_config//:elixir_1_15", - ], - "//conditions:default": [ - "@platforms//os:linux", - "@elixir_config//:elixir_1_15", - ], - }), - deps = [ - "//deps/amqp_client:erlang_app", - "//deps/rabbit:erlang_app", - "//deps/rabbit_common:erlang_app", - "@observer_cli//:erlang_app", - "@stdout_formatter//:erlang_app", - ], -) - -test_suite( - name = "rabbitmqctl_compile_warnings_as_errors", - tests = ["compile_warnings_as_errors"], -) - plt( name = "deps_plt", apps = [ @@ -159,12 +287,12 @@ plt( ":json_ez", ], ignore_warnings = True, - libs = [":elixir"], + libs = ["@rules_elixir//elixir:elixir"], deps = [ - ":elixir", - "//bazel/elixir:logger", "//deps/rabbit:erlang_app", "//deps/rabbit_common:erlang_app", + "@rules_elixir//elixir", + "@rules_elixir//elixir:logger", ], ) @@ -174,36 +302,57 @@ dialyze( "-Wunknown", RABBITMQ_DIALYZER_OPTS, ), - libs = [":elixir"], + libs = ["@rules_elixir//elixir:elixir"], plt = ":deps_plt", ) -rabbitmqctl_test( +ex_unit_test( name = "tests", - size = "large", srcs = [ - ".formatter.exs", - "config/config.exs", - "mix.exs", + "test/test_helper.exs", ] + glob([ - "lib/**/*.ex", - "test/**/*.exs", + "test/**/*_test.exs", ]), - archives = [ - "@hex//:archive", - ], - data = glob(["test/fixtures/**/*"]), - flaky = True, - rabbitmq_run = ":rabbitmq-for-cli-tests-run", - source_deps = { - "@amqp//:sources": "amqp", - "@csv//:sources": "csv", - "@json//:sources": "json", - "@temp//:sources": "temp", - "@x509//:sources": "x509", + data = glob([ + "test/fixtures/**/*", + ]), + env = { + "MIX_ENV": "prod", + "DEPS_DIR": "$ERL_LIBS", + "ERL_COMPILER_OPTIONS": "deterministic", }, + ez_deps = [ + ":amqp.ez", + ":csv.ez", + ":json.ez", + ":temp.ez", + ":x509.ez", + ], + setup = """\ +# pretend that mix build the deps, as some modules add mix code paths in +# their module definitions +for app in amqp csv json temp x509; do + mkdir -p _build/$MIX_ENV/lib/$app + ln -s $ERL_LIBS/$app/ebin _build/$MIX_ENV/lib/$app/ebin +done + +# we need a running broker with certain plugins for this to pass +export TEST_TMPDIR=${TEST_UNDECLARED_OUTPUTS_DIR} +trap 'catch $?' EXIT +catch() { + pid=$(cat ${TEST_TMPDIR}/*/*.pid) + echo "stopping broker (pid ${pid})" + kill -TERM "${pid}" +} +$TEST_SRCDIR/$TEST_WORKSPACE/deps/rabbitmq_cli/rabbitmq-for-cli-tests-run \\ + start-background-broker\ +""", tags = [STARTS_BACKGROUND_BROKER_TAG], + tools = [ + ":rabbitmq-for-cli-tests-run", + ], deps = [ + ":test_erlang_app", "//deps/amqp_client:erlang_app", "//deps/rabbit:erlang_app", "//deps/rabbit_common:erlang_app", diff --git a/deps/rabbitmq_cli/rabbitmqctl.bzl b/deps/rabbitmq_cli/rabbitmqctl.bzl index 9d500debf4ed..fd8e0c4aec1e 100644 --- a/deps/rabbitmq_cli/rabbitmqctl.bzl +++ b/deps/rabbitmq_cli/rabbitmqctl.bzl @@ -1,4 +1,10 @@ load("@bazel_skylib//lib:shell.bzl", "shell") +load( + "@rules_elixir//private:elixir_toolchain.bzl", + "elixir_dirs", + "erlang_dirs", + "maybe_install_erlang", +) load( "@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", @@ -12,12 +18,6 @@ load( "@rules_erlang//private:util.bzl", "additional_file_dest_relative_path", ) -load( - "//bazel/elixir:elixir_toolchain.bzl", - "elixir_dirs", - "erlang_dirs", - "maybe_install_erlang", -) ElixirAppInfo = provider( doc = "Compiled Elixir Application", @@ -249,7 +249,7 @@ rabbitmqctl_private = rule( "source_deps": attr.label_keyed_string_dict(), }, toolchains = [ - "//bazel/elixir:toolchain_type", + "@rules_elixir//:toolchain_type", ], provides = [ElixirAppInfo], executable = True, @@ -373,7 +373,7 @@ elixir_app_to_erlang_app = rule( ), }, toolchains = [ - "//bazel/elixir:toolchain_type", + "@rules_elixir//:toolchain_type", ], provides = [ErlangAppInfo], ) @@ -407,7 +407,7 @@ def rabbitmqctl( elixir_app_to_erlang_app( name = "elixir", - elixir_as_app = Label("//bazel/elixir:erlang_app"), + elixir_as_app = Label("@rules_elixir//elixir:elixir"), elixir_app = ":" + name, mode = "elixir", visibility = visibility, @@ -415,7 +415,7 @@ def rabbitmqctl( elixir_app_to_erlang_app( name = "erlang_app", - elixir_as_app = Label("//bazel/elixir:erlang_app"), + elixir_as_app = Label("@rules_elixir//elixir:elixir"), elixir_app = ":" + name, mode = "app", visibility = visibility, diff --git a/deps/rabbitmq_cli/rabbitmqctl_check_formatted.bzl b/deps/rabbitmq_cli/rabbitmqctl_check_formatted.bzl deleted file mode 100644 index b6f166a82970..000000000000 --- a/deps/rabbitmq_cli/rabbitmqctl_check_formatted.bzl +++ /dev/null @@ -1,135 +0,0 @@ -load( - "@rules_erlang//:util.bzl", - "path_join", - "windows_path", -) -load( - "//bazel/elixir:elixir_toolchain.bzl", - "elixir_dirs", - "erlang_dirs", - "maybe_install_erlang", -) - -def _impl(ctx): - (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) - (elixir_home, elixir_runfiles) = elixir_dirs(ctx, short_path = True) - - package_dir = path_join( - ctx.label.workspace_root, - ctx.label.package, - ) - - if not ctx.attr.is_windows: - output = ctx.actions.declare_file(ctx.label.name) - script = """set -euo pipefail - -{maybe_install_erlang} - -if [[ "{elixir_home}" == /* ]]; then - ABS_ELIXIR_HOME="{elixir_home}" -else - ABS_ELIXIR_HOME=$PWD/{elixir_home} -fi - -export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} - -export LANG="en_US.UTF-8" -export LC_ALL="en_US.UTF-8" - -INITIAL_DIR="$(pwd)" - -if [ ! -f ${{INITIAL_DIR}}/{package_dir}/test/test_helper.exs ]; then - echo "test_helper.exs cannot be found. 'bazel clean' might fix this." - exit 1 -fi - -cp -r ${{INITIAL_DIR}}/{package_dir}/config ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/lib ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/test ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/mix.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/.formatter.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -export IS_BAZEL=true -export HOME=${{PWD}} -export MIX_ENV=test -export ERL_COMPILER_OPTIONS=deterministic -set -x -"${{ABS_ELIXIR_HOME}}"/bin/mix format --check-formatted -""".format( - maybe_install_erlang = maybe_install_erlang(ctx, short_path = True), - erlang_home = erlang_home, - elixir_home = elixir_home, - package_dir = package_dir, - ) - else: - output = ctx.actions.declare_file(ctx.label.name + ".bat") - script = """@echo off -:: set LANG="en_US.UTF-8" -:: set LC_ALL="en_US.UTF-8" - -set PATH="{elixir_home}\\bin";"{erlang_home}\\bin";%PATH% - -set OUTPUTS_DIR=%TEST_UNDECLARED_OUTPUTS_DIR:/=\\% - -:: robocopy exits non-zero when files are copied successfully -:: https://social.msdn.microsoft.com/Forums/en-US/d599833c-dcea-46f5-85e9-b1f028a0fefe/robocopy-exits-with-error-code-1?forum=tfsbuild -robocopy {package_dir}\\config %OUTPUTS_DIR%\\config /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\lib %OUTPUTS_DIR%\\lib /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\test %OUTPUTS_DIR%\\test /E /NFL /NDL /NJH /NJS /nc /ns /np -copy {package_dir}\\mix.exs %OUTPUTS_DIR%\\mix.exs || goto :error -copy {package_dir}\\.formatter.exs %OUTPUTS_DIR%\\.formatter.exs || goto :error - -cd %OUTPUTS_DIR% || goto :error - -set ERL_COMPILER_OPTIONS=deterministic -set MIX_ENV=test -"{elixir_home}\\bin\\mix" format --check-formatted || goto :error -goto :EOF -:error -exit /b 1 -""".format( - erlang_home = windows_path(erlang_home), - elixir_home = windows_path(elixir_home), - package_dir = windows_path(ctx.label.package), - ) - - ctx.actions.write( - output = output, - content = script, - ) - - runfiles = ctx.runfiles( - files = ctx.files.srcs + ctx.files.data, - ).merge_all([ - erlang_runfiles, - elixir_runfiles, - ]) - - return [DefaultInfo( - runfiles = runfiles, - executable = output, - )] - -rabbitmqctl_check_formatted_private_test = rule( - implementation = _impl, - attrs = { - "is_windows": attr.bool(mandatory = True), - "srcs": attr.label_list(allow_files = [".ex", ".exs"]), - "data": attr.label_list(allow_files = True), - }, - toolchains = [ - "//bazel/elixir:toolchain_type", - ], - test = True, -) - -def rabbitmqctl_check_formatted_test(**kwargs): - rabbitmqctl_check_formatted_private_test( - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - **kwargs - ) diff --git a/deps/rabbitmq_cli/rabbitmqctl_compile_warnings_as_errors.bzl b/deps/rabbitmq_cli/rabbitmqctl_compile_warnings_as_errors.bzl deleted file mode 100644 index 731eb945bf67..000000000000 --- a/deps/rabbitmq_cli/rabbitmqctl_compile_warnings_as_errors.bzl +++ /dev/null @@ -1,202 +0,0 @@ -load("@bazel_skylib//lib:shell.bzl", "shell") -load( - "@rules_erlang//:erlang_app_info.bzl", - "ErlangAppInfo", -) -load( - "@rules_erlang//:util.bzl", - "path_join", - "windows_path", -) -load( - "@rules_erlang//private:util.bzl", - "additional_file_dest_relative_path", -) -load( - "//bazel/elixir:elixir_toolchain.bzl", - "elixir_dirs", - "erlang_dirs", - "maybe_install_erlang", -) -load( - ":rabbitmqctl.bzl", - "deps_dir_contents", -) - -def _impl(ctx): - (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) - (elixir_home, elixir_runfiles) = elixir_dirs(ctx, short_path = True) - - deps_dir = ctx.label.name + "_deps" - - deps_dir_files = deps_dir_contents( - ctx, - ctx.attr.deps, - deps_dir, - ) - - for dep, app_name in ctx.attr.source_deps.items(): - for src in dep.files.to_list(): - if not src.is_directory: - rp = additional_file_dest_relative_path(dep.label, src) - f = ctx.actions.declare_file(path_join( - deps_dir, - app_name, - rp, - )) - ctx.actions.symlink( - output = f, - target_file = src, - ) - deps_dir_files.append(f) - - package_dir = path_join( - ctx.label.workspace_root, - ctx.label.package, - ) - - precompiled_deps = " ".join([ - dep[ErlangAppInfo].app_name - for dep in ctx.attr.deps - ]) - - if not ctx.attr.is_windows: - output = ctx.actions.declare_file(ctx.label.name) - script = """set -euo pipefail - -{maybe_install_erlang} - -if [[ "{elixir_home}" == /* ]]; then - ABS_ELIXIR_HOME="{elixir_home}" -else - ABS_ELIXIR_HOME=$PWD/{elixir_home} -fi - -export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} - -export LANG="en_US.UTF-8" -export LC_ALL="en_US.UTF-8" - -INITIAL_DIR="$(pwd)" - -if [ ! -f ${{INITIAL_DIR}}/{package_dir}/test/test_helper.exs ]; then - echo "test_helper.exs cannot be found. 'bazel clean' might fix this." - exit 1 -fi - -cp -r ${{INITIAL_DIR}}/{package_dir}/config ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/lib ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/test ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/mix.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/.formatter.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -export IS_BAZEL=true -export HOME=${{PWD}} -export DEPS_DIR=$TEST_SRCDIR/$TEST_WORKSPACE/{package_dir}/{deps_dir} -export MIX_ENV=test -export ERL_COMPILER_OPTIONS=deterministic -for archive in {archives}; do - "${{ABS_ELIXIR_HOME}}"/bin/mix archive.install --force $INITIAL_DIR/$archive -done -set -x -"${{ABS_ELIXIR_HOME}}"/bin/mix deps.compile -"${{ABS_ELIXIR_HOME}}"/bin/mix compile --warnings-as-errors -""".format( - maybe_install_erlang = maybe_install_erlang(ctx, short_path = True), - erlang_home = erlang_home, - elixir_home = elixir_home, - package_dir = package_dir, - deps_dir = deps_dir, - archives = " ".join([shell.quote(a.short_path) for a in ctx.files.archives]), - precompiled_deps = precompiled_deps, - ) - else: - output = ctx.actions.declare_file(ctx.label.name + ".bat") - script = """@echo off -:: set LANG="en_US.UTF-8" -:: set LC_ALL="en_US.UTF-8" - -set PATH="{elixir_home}\\bin";"{erlang_home}\\bin";%PATH% - -set OUTPUTS_DIR=%TEST_UNDECLARED_OUTPUTS_DIR:/=\\% - -:: robocopy exits non-zero when files are copied successfully -:: https://social.msdn.microsoft.com/Forums/en-US/d599833c-dcea-46f5-85e9-b1f028a0fefe/robocopy-exits-with-error-code-1?forum=tfsbuild -robocopy {package_dir}\\config %OUTPUTS_DIR%\\config /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\lib %OUTPUTS_DIR%\\lib /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\test %OUTPUTS_DIR%\\test /E /NFL /NDL /NJH /NJS /nc /ns /np -copy {package_dir}\\mix.exs %OUTPUTS_DIR%\\mix.exs || goto :error -copy {package_dir}\\.formatter.exs %OUTPUTS_DIR%\\.formatter.exs || goto :error - -cd %OUTPUTS_DIR% || goto :error - -set DEPS_DIR=%TEST_SRCDIR%/%TEST_WORKSPACE%/{package_dir}/{deps_dir} -set DEPS_DIR=%DEPS_DIR:/=\\% -set ERL_COMPILER_OPTIONS=deterministic -set MIX_ENV=test -for %%a in ({archives}) do ( - set ARCH=%TEST_SRCDIR%/%TEST_WORKSPACE%/%%a - set ARCH=%ARCH:/=\\% - "{elixir_home}\\bin\\mix" archive.install --force %ARCH% || goto :error -) -"{elixir_home}\\bin\\mix" deps.compile || goto :error -"{elixir_home}\\bin\\mix" compile --warnings-as-errors || goto :error -goto :EOF -:error -exit /b 1 -""".format( - erlang_home = windows_path(erlang_home), - elixir_home = windows_path(elixir_home), - package_dir = windows_path(ctx.label.package), - deps_dir = deps_dir, - archives = " ".join([shell.quote(a.short_path) for a in ctx.files.archives]), - precompiled_deps = precompiled_deps, - ) - - ctx.actions.write( - output = output, - content = script, - ) - - runfiles = ctx.runfiles( - files = ctx.files.srcs + ctx.files.data + ctx.files.archives, - transitive_files = depset(deps_dir_files), - ).merge_all([ - erlang_runfiles, - elixir_runfiles, - ]) - - return [DefaultInfo( - runfiles = runfiles, - executable = output, - )] - -rabbitmqctl_compile_warnings_as_errors_private_test = rule( - implementation = _impl, - attrs = { - "is_windows": attr.bool(mandatory = True), - "srcs": attr.label_list(allow_files = [".ex", ".exs"]), - "data": attr.label_list(allow_files = True), - "deps": attr.label_list(providers = [ErlangAppInfo]), - "archives": attr.label_list( - allow_files = [".ez"], - ), - "source_deps": attr.label_keyed_string_dict(), - }, - toolchains = [ - "//bazel/elixir:toolchain_type", - ], - test = True, -) - -def rabbitmqctl_compile_warnings_as_errors_test(**kwargs): - rabbitmqctl_compile_warnings_as_errors_private_test( - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - **kwargs - ) - diff --git a/deps/rabbitmq_cli/rabbitmqctl_test.bzl b/deps/rabbitmq_cli/rabbitmqctl_test.bzl deleted file mode 100644 index a4f05a0dea0e..000000000000 --- a/deps/rabbitmq_cli/rabbitmqctl_test.bzl +++ /dev/null @@ -1,237 +0,0 @@ -load("@bazel_skylib//lib:shell.bzl", "shell") -load( - "@rules_erlang//:erlang_app_info.bzl", - "ErlangAppInfo", -) -load( - "@rules_erlang//:util.bzl", - "path_join", - "windows_path", -) -load( - "@rules_erlang//private:util.bzl", - "additional_file_dest_relative_path", -) -load( - "//bazel/elixir:elixir_toolchain.bzl", - "elixir_dirs", - "erlang_dirs", - "maybe_install_erlang", -) -load( - ":rabbitmqctl.bzl", - "deps_dir_contents", -) - -def _impl(ctx): - (erlang_home, _, erlang_runfiles) = erlang_dirs(ctx) - (elixir_home, elixir_runfiles) = elixir_dirs(ctx, short_path = True) - - deps_dir = ctx.label.name + "_deps" - - deps_dir_files = deps_dir_contents( - ctx, - ctx.attr.deps, - deps_dir, - ) - - for dep, app_name in ctx.attr.source_deps.items(): - for src in dep.files.to_list(): - if not src.is_directory: - rp = additional_file_dest_relative_path(dep.label, src) - f = ctx.actions.declare_file(path_join( - deps_dir, - app_name, - rp, - )) - ctx.actions.symlink( - output = f, - target_file = src, - ) - deps_dir_files.append(f) - - package_dir = path_join( - ctx.label.workspace_root, - ctx.label.package, - ) - - precompiled_deps = " ".join([ - dep[ErlangAppInfo].app_name - for dep in ctx.attr.deps - ]) - - if not ctx.attr.is_windows: - output = ctx.actions.declare_file(ctx.label.name) - script = """set -euo pipefail - -{maybe_install_erlang} - -if [[ "{elixir_home}" == /* ]]; then - ABS_ELIXIR_HOME="{elixir_home}" -else - ABS_ELIXIR_HOME=$PWD/{elixir_home} -fi - -export PATH="$ABS_ELIXIR_HOME"/bin:"{erlang_home}"/bin:${{PATH}} - -export LANG="en_US.UTF-8" -export LC_ALL="en_US.UTF-8" - -INITIAL_DIR="$(pwd)" - -if [ ! -f ${{INITIAL_DIR}}/{package_dir}/test/test_helper.exs ]; then - echo "test_helper.exs cannot be found. 'bazel clean' might fix this." - exit 1 -fi - -cp -r ${{INITIAL_DIR}}/{package_dir}/config ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/lib ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp -r ${{INITIAL_DIR}}/{package_dir}/test ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/mix.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} -cp ${{INITIAL_DIR}}/{package_dir}/.formatter.exs ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -export IS_BAZEL=true -export HOME=${{PWD}} -export DEPS_DIR=$TEST_SRCDIR/$TEST_WORKSPACE/{package_dir}/{deps_dir} -export MIX_ENV=test -export ERL_COMPILER_OPTIONS=deterministic -for archive in {archives}; do - "${{ABS_ELIXIR_HOME}}"/bin/mix archive.install --force $INITIAL_DIR/$archive -done -"${{ABS_ELIXIR_HOME}}"/bin/mix deps.compile -"${{ABS_ELIXIR_HOME}}"/bin/mix compile - -export TEST_TMPDIR=${{TEST_UNDECLARED_OUTPUTS_DIR}} - -# we need a running broker with certain plugins for this to pass -trap 'catch $?' EXIT -catch() {{ - pid=$(cat ${{TEST_TMPDIR}}/*/*.pid) - kill -TERM "${{pid}}" -}} -cd ${{INITIAL_DIR}} -./{rabbitmq_run_cmd} start-background-broker -cd ${{TEST_UNDECLARED_OUTPUTS_DIR}} - -# The test cases will need to be able to load code from the deps -# directly, so we set ERL_LIBS -export ERL_LIBS=$DEPS_DIR - -# run the actual tests -set +u -set -x -"${{ABS_ELIXIR_HOME}}"/bin/mix test --trace --max-failures 1 ${{TEST_FILE}} -""".format( - maybe_install_erlang = maybe_install_erlang(ctx, short_path = True), - erlang_home = erlang_home, - elixir_home = elixir_home, - package_dir = package_dir, - deps_dir = deps_dir, - archives = " ".join([shell.quote(a.short_path) for a in ctx.files.archives]), - precompiled_deps = precompiled_deps, - rabbitmq_run_cmd = ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path, - ) - else: - output = ctx.actions.declare_file(ctx.label.name + ".bat") - script = """@echo off -echo Erlang Version: {erlang_version} - -:: set LANG="en_US.UTF-8" -:: set LC_ALL="en_US.UTF-8" - -set PATH="{elixir_home}\\bin";"{erlang_home}\\bin";%PATH% - -set OUTPUTS_DIR=%TEST_UNDECLARED_OUTPUTS_DIR:/=\\% - -:: robocopy exits non-zero when files are copied successfully -:: https://social.msdn.microsoft.com/Forums/en-US/d599833c-dcea-46f5-85e9-b1f028a0fefe/robocopy-exits-with-error-code-1?forum=tfsbuild -robocopy {package_dir}\\config %OUTPUTS_DIR%\\config /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\lib %OUTPUTS_DIR%\\lib /E /NFL /NDL /NJH /NJS /nc /ns /np -robocopy {package_dir}\\test %OUTPUTS_DIR%\\test /E /NFL /NDL /NJH /NJS /nc /ns /np -copy {package_dir}\\mix.exs %OUTPUTS_DIR%\\mix.exs || goto :error -copy {package_dir}\\.formatter.exs %OUTPUTS_DIR%\\.formatter.exs || goto :error - -cd %OUTPUTS_DIR% || goto :error - -set DEPS_DIR=%TEST_SRCDIR%/%TEST_WORKSPACE%/{package_dir}/{deps_dir} -set DEPS_DIR=%DEPS_DIR:/=\\% -set ERL_COMPILER_OPTIONS=deterministic -set MIX_ENV=test -for %%a in ({archives}) do ( - set ARCH=%TEST_SRCDIR%/%TEST_WORKSPACE%/%%a - set ARCH=%ARCH:/=\\% - "{elixir_home}\\bin\\mix" archive.install --force %ARCH% || goto :error -) -"{elixir_home}\\bin\\mix" deps.compile || goto :error -"{elixir_home}\\bin\\mix" compile || goto :error - -REM need to start the background broker here -set TEST_TEMPDIR=%OUTPUTS_DIR% - -set ERL_LIBS=%DEPS_DIR% - -"{elixir_home}\\bin\\mix" test --trace --max-failures 1 || goto :error -goto :EOF -:error -exit /b 1 -""".format( - erlang_home = windows_path(erlang_home), - elixir_home = windows_path(elixir_home), - package_dir = windows_path(ctx.label.package), - deps_dir = deps_dir, - archives = " ".join([shell.quote(a.short_path) for a in ctx.files.archives]), - precompiled_deps = precompiled_deps, - rabbitmq_run_cmd = ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path, - ) - - ctx.actions.write( - output = output, - content = script, - ) - - runfiles = ctx.runfiles( - files = ctx.files.srcs + ctx.files.data + ctx.files.archives, - transitive_files = depset(deps_dir_files), - ).merge_all([ - erlang_runfiles, - elixir_runfiles, - ctx.attr.rabbitmq_run[DefaultInfo].default_runfiles, - ]) - - return [DefaultInfo( - runfiles = runfiles, - executable = output, - )] - -rabbitmqctl_private_test = rule( - implementation = _impl, - attrs = { - "is_windows": attr.bool(mandatory = True), - "srcs": attr.label_list(allow_files = [".ex", ".exs"]), - "data": attr.label_list(allow_files = True), - "deps": attr.label_list(providers = [ErlangAppInfo]), - "archives": attr.label_list( - allow_files = [".ez"], - ), - "source_deps": attr.label_keyed_string_dict(), - "rabbitmq_run": attr.label( - executable = True, - cfg = "target", - ), - }, - toolchains = [ - "//bazel/elixir:toolchain_type", - ], - test = True, -) - -def rabbitmqctl_test(**kwargs): - rabbitmqctl_private_test( - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - **kwargs - ) diff --git a/deps/rabbitmq_cli/test/core/command_modules_test.exs b/deps/rabbitmq_cli/test/core/command_modules_test.exs index ebafc9f039f9..938e9e3a2cc8 100644 --- a/deps/rabbitmq_cli/test/core/command_modules_test.exs +++ b/deps/rabbitmq_cli/test/core/command_modules_test.exs @@ -20,6 +20,9 @@ defmodule CommandModulesTest do end test "command modules has existing commands" do + # true = Enum.take(RabbitMQ.CLI.Core.CommandModules.ctl_modules(), -15) + # true = Enum.find_index(RabbitMQ.CLI.Core.CommandModules.ctl_modules(), fn x -> x == RabbitMQ.CLI.Ctl.Commands.DuckCommand end) + assert @subject.load_commands(:all, %{})["duck"] == RabbitMQ.CLI.Ctl.Commands.DuckCommand end diff --git a/deps/rabbitmq_cli/test/json_formatting.exs b/deps/rabbitmq_cli/test/json_formatting_test.exs similarity index 100% rename from deps/rabbitmq_cli/test/json_formatting.exs rename to deps/rabbitmq_cli/test/json_formatting_test.exs diff --git a/deps/rabbitmq_cli/test/test_helper.exs b/deps/rabbitmq_cli/test/test_helper.exs index 575fcdf7f7f8..3613e1078b70 100644 --- a/deps/rabbitmq_cli/test/test_helper.exs +++ b/deps/rabbitmq_cli/test/test_helper.exs @@ -12,7 +12,14 @@ ExUnit.configure( timeout: ten_minutes ) -ExUnit.start() +if System.get_env("BAZEL_TEST") == "1" do + ExUnit.configure(seed: 0) + :application.ensure_all_started(:mix) + :application.ensure_all_started(:rabbitmqctl) + ExUnit.start(trace: true) +else + ExUnit.start() +end # Elixir 1.15 compiler optimizations seem to require that we explicitly add to the code path true = Code.append_path(Path.join([System.get_env("DEPS_DIR"), "rabbit_common", "ebin"])) diff --git a/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel b/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel index abeda2bf34d1..593ad5bdba9b 100644 --- a/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel +++ b/deps/rabbitmq_consistent_hash_exchange/BUILD.bazel @@ -61,7 +61,7 @@ plt( ], for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_ct_client_helpers/BUILD.bazel b/deps/rabbitmq_ct_client_helpers/BUILD.bazel index 2bbee7a93b7f..8fa9dfa34f41 100644 --- a/deps/rabbitmq_ct_client_helpers/BUILD.bazel +++ b/deps/rabbitmq_ct_client_helpers/BUILD.bazel @@ -59,7 +59,7 @@ plt( ], for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_ct_helpers/BUILD.bazel b/deps/rabbitmq_ct_helpers/BUILD.bazel index b78f4cb04a2e..dd8c4bfb14c0 100644 --- a/deps/rabbitmq_ct_helpers/BUILD.bazel +++ b/deps/rabbitmq_ct_helpers/BUILD.bazel @@ -57,7 +57,7 @@ alias( xref( name = "xref", additional_libs = [ - "//deps/rabbitmq_cli:elixir", # keep + "@rules_elixir//elixir", # keep "//deps/rabbitmq_cli:erlang_app", # keep "//deps/rabbit:erlang_app", # keep "//deps/rabbitmq_prelaunch:erlang_app", # keep @@ -77,12 +77,12 @@ plt( for_target = ":erlang_app", ignore_warnings = True, libs = [ - "//deps/rabbitmq_cli:elixir", # keep + "@rules_elixir//elixir", # keep ], plt = "//:base_plt", deps = [ "//deps/rabbit:erlang_app", # keep - "//deps/rabbitmq_cli:elixir", # keep + "@rules_elixir//elixir", # keep "//deps/rabbitmq_cli:erlang_app", # keep "//deps/rabbitmq_management_agent:erlang_app", # keep "//deps/rabbitmq_prelaunch:erlang_app", # keep diff --git a/deps/rabbitmq_federation/BUILD.bazel b/deps/rabbitmq_federation/BUILD.bazel index 007b672b0536..b244b4183d9b 100644 --- a/deps/rabbitmq_federation/BUILD.bazel +++ b/deps/rabbitmq_federation/BUILD.bazel @@ -69,7 +69,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_federation_management/BUILD.bazel b/deps/rabbitmq_federation_management/BUILD.bazel index 54754c11aa94..10d8c0af0e3c 100644 --- a/deps/rabbitmq_federation_management/BUILD.bazel +++ b/deps/rabbitmq_federation_management/BUILD.bazel @@ -67,7 +67,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_management/BUILD.bazel b/deps/rabbitmq_management/BUILD.bazel index 83572b39f305..f8ea5eb6a3b9 100644 --- a/deps/rabbitmq_management/BUILD.bazel +++ b/deps/rabbitmq_management/BUILD.bazel @@ -102,7 +102,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_management_agent/BUILD.bazel b/deps/rabbitmq_management_agent/BUILD.bazel index 775e8bad97a7..5bdbd9fe7b3f 100644 --- a/deps/rabbitmq_management_agent/BUILD.bazel +++ b/deps/rabbitmq_management_agent/BUILD.bazel @@ -87,7 +87,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_mqtt/BUILD.bazel b/deps/rabbitmq_mqtt/BUILD.bazel index 05c38cac6ac2..8ef7d5359e6c 100644 --- a/deps/rabbitmq_mqtt/BUILD.bazel +++ b/deps/rabbitmq_mqtt/BUILD.bazel @@ -101,7 +101,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_shovel/BUILD.bazel b/deps/rabbitmq_shovel/BUILD.bazel index 4836f3017683..d3d11689ba6f 100644 --- a/deps/rabbitmq_shovel/BUILD.bazel +++ b/deps/rabbitmq_shovel/BUILD.bazel @@ -79,7 +79,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_shovel_management/BUILD.bazel b/deps/rabbitmq_shovel_management/BUILD.bazel index 173a83c4fbf9..69763d8f11c5 100644 --- a/deps/rabbitmq_shovel_management/BUILD.bazel +++ b/deps/rabbitmq_shovel_management/BUILD.bazel @@ -65,7 +65,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_stomp/BUILD.bazel b/deps/rabbitmq_stomp/BUILD.bazel index 4e0e6c1411e8..e8193b124257 100644 --- a/deps/rabbitmq_stomp/BUILD.bazel +++ b/deps/rabbitmq_stomp/BUILD.bazel @@ -89,7 +89,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_stream/BUILD.bazel b/deps/rabbitmq_stream/BUILD.bazel index a8edfc3393d7..3cc56121c6a7 100644 --- a/deps/rabbitmq_stream/BUILD.bazel +++ b/deps/rabbitmq_stream/BUILD.bazel @@ -83,7 +83,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_stream_management/BUILD.bazel b/deps/rabbitmq_stream_management/BUILD.bazel index 85d04900c941..6a204575de29 100644 --- a/deps/rabbitmq_stream_management/BUILD.bazel +++ b/deps/rabbitmq_stream_management/BUILD.bazel @@ -64,7 +64,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_top/BUILD.bazel b/deps/rabbitmq_top/BUILD.bazel index 27af026d8da4..696462261bc9 100644 --- a/deps/rabbitmq_top/BUILD.bazel +++ b/deps/rabbitmq_top/BUILD.bazel @@ -62,7 +62,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_tracing/BUILD.bazel b/deps/rabbitmq_tracing/BUILD.bazel index b3d9c8241c60..acd304a3ad2f 100644 --- a/deps/rabbitmq_tracing/BUILD.bazel +++ b/deps/rabbitmq_tracing/BUILD.bazel @@ -69,7 +69,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/deps/rabbitmq_web_mqtt/BUILD.bazel b/deps/rabbitmq_web_mqtt/BUILD.bazel index 2fe6ac3eb29a..f9561e14ffaf 100644 --- a/deps/rabbitmq_web_mqtt/BUILD.bazel +++ b/deps/rabbitmq_web_mqtt/BUILD.bazel @@ -78,7 +78,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", deps = ["//deps/rabbitmq_cli:erlang_app"], # keep ) diff --git a/deps/rabbitmq_web_stomp/BUILD.bazel b/deps/rabbitmq_web_stomp/BUILD.bazel index ed01db749c57..1015703a58e4 100644 --- a/deps/rabbitmq_web_stomp/BUILD.bazel +++ b/deps/rabbitmq_web_stomp/BUILD.bazel @@ -79,7 +79,7 @@ plt( name = "deps_plt", for_target = ":erlang_app", ignore_warnings = True, - libs = ["//deps/rabbitmq_cli:elixir"], # keep + libs = ["@rules_elixir//elixir"], # keep plt = "//:base_plt", ) diff --git a/rabbitmq.bzl b/rabbitmq.bzl index 9b758cfdf110..26facf0ed0f3 100644 --- a/rabbitmq.bzl +++ b/rabbitmq.bzl @@ -230,7 +230,7 @@ def rabbitmq_integration_suite( ":test_erlang_app", "//deps/rabbit_common:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app", - "//deps/rabbitmq_cli:elixir", + "@rules_elixir//elixir", "//deps/rabbitmq_cli:erlang_app", "//deps/rabbitmq_ct_client_helpers:erlang_app", ] diff --git a/rabbitmq_home.bzl b/rabbitmq_home.bzl index 0af142dfd630..53647c51e7c1 100644 --- a/rabbitmq_home.bzl +++ b/rabbitmq_home.bzl @@ -53,8 +53,8 @@ def _plugins_dir_links(ctx, plugin): for f in lib_info.beam: if f.is_directory: - if f.basename != "ebin": - fail("{} contains a directory in 'beam' that is not an ebin dir".format(lib_info.lib_name)) + if len(lib_info.beam) != 1: + fail("ErlangAppInfo.beam must be a collection of files, or a single ebin dir: {} {}".format(lib_info.app_name, lib_info.beam)) o = ctx.actions.declare_directory(path_join(plugin_path, "ebin")) else: o = ctx.actions.declare_file(path_join(plugin_path, "ebin", f.basename))