summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRin Kuryloski <kuryloskip@vmware.com>2023-01-05 12:41:07 +0100
committerRin Kuryloski <kuryloskip@vmware.com>2023-01-05 13:02:02 +0100
commita8658ae68d26154e6bc0c208bde8f6cdcc6f3300 (patch)
tree66debb22c28afadf54d89784d0ba37c8207eb3de /tools
parent06a330f553cd4a9aed4e1bbdba5e347e532931b8 (diff)
downloadrabbitmq-server-git-a8658ae68d26154e6bc0c208bde8f6cdcc6f3300.tar.gz
Add "bazel run //tools:symlink_deps_for_erlang_ls"
for symlinking 3rd party deps into a place that erlang_ls can use them
Diffstat (limited to 'tools')
-rw-r--r--tools/BUILD.bazel16
-rw-r--r--tools/erlang_ls.bzl64
2 files changed, 42 insertions, 38 deletions
diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel
index dbf4046a85..1b0de88b86 100644
--- a/tools/BUILD.bazel
+++ b/tools/BUILD.bazel
@@ -1,16 +1,18 @@
load("//:rabbitmq.bzl", "all_plugins")
-load(":erlang_ls.bzl", "erlang_ls_config", "erlang_ls_tree")
+load(":erlang_ls.bzl", "deps_symlinks", "erlang_ls_config")
-erlang_ls_tree(
- name = "erlang_ls_files",
+erlang_ls_config(
+ name = "erlang_ls.config",
+)
+
+deps_symlinks(
+ name = "symlink_deps_for_erlang_ls",
apps = all_plugins(
rabbitmq_workspace = "",
) + [
"//deps/rabbitmq_ct_helpers:erlang_app",
"//deps/rabbitmq_ct_client_helpers:erlang_app",
],
-)
-
-erlang_ls_config(
- name = "erlang_ls.config",
+ dest = "extra_deps", # must also be listed in .bazelignore
+ tags = ["local"],
)
diff --git a/tools/erlang_ls.bzl b/tools/erlang_ls.bzl
index 1fc41468df..f704f08558 100644
--- a/tools/erlang_ls.bzl
+++ b/tools/erlang_ls.bzl
@@ -6,10 +6,6 @@ load(
"@rules_erlang//:util.bzl",
"path_join",
)
-load(
- "@rules_erlang//private:util.bzl",
- "additional_file_dest_relative_path",
-)
def _erlang_ls_config(ctx):
runtime_prefix = path_join(
@@ -46,48 +42,54 @@ erlang_ls_config = rule(
executable = True,
)
-def _erlang_app_files(ctx, app, directory):
- app_info = app[ErlangAppInfo]
- app_path = path_join(directory, app_info.app_name)
- files = []
- for f in app_info.srcs + app_info.beam:
- relative_path = additional_file_dest_relative_path(app.label, f)
- dest = ctx.actions.declare_file(path_join(app_path, relative_path))
- ctx.actions.symlink(output = dest, target_file = f)
- files.append(dest)
- return files
-
-def _erlang_ls_tree(ctx):
+def _deps_symlinks(ctx):
apps = ctx.attr.apps
deps = []
for app in apps:
app_info = app[ErlangAppInfo]
for dep in app_info.deps:
- # this puts non rabbitmq plugins, like amqp10_client into deps,
- # but maybe those should be in apps? Does it matter?
- if dep not in deps and dep not in apps:
+ if dep.label.workspace_name != "" and dep not in deps and dep not in apps:
deps.append(dep)
files = []
- for app in apps:
- files.extend(
- _erlang_app_files(ctx, app, path_join(ctx.label.name, "apps")),
- )
- for dep in deps:
- files.extend(
- _erlang_app_files(ctx, dep, path_join(ctx.label.name, "deps")),
- )
+ output = ctx.actions.declare_file(ctx.label.name + ".sh")
- return [
- DefaultInfo(files = depset(files)),
+ commands = [
+ "set -euxo pipefail",
+ "",
+ "mkdir -p \"{}\"".format(path_join("$BUILD_WORKSPACE_DIRECTORY", ctx.attr.dest)),
+ "",
]
-erlang_ls_tree = rule(
- implementation = _erlang_ls_tree,
+ for dep in deps:
+ app_info = dep[ErlangAppInfo]
+ files.extend(app_info.srcs)
+
+ commands.append("ln -s \"{target}\" \"{source}\"".format(
+ target = path_join("$PWD", "external", dep.label.workspace_name),
+ source = path_join("$BUILD_WORKSPACE_DIRECTORY", ctx.attr.dest, app_info.app_name),
+ ))
+
+ ctx.actions.write(
+ output = output,
+ content = "\n".join(commands),
+ )
+
+ return [DefaultInfo(
+ runfiles = ctx.runfiles(files = files),
+ executable = output,
+ )]
+
+deps_symlinks = rule(
+ implementation = _deps_symlinks,
attrs = {
"apps": attr.label_list(
providers = [ErlangAppInfo],
),
+ "dest": attr.string(
+ mandatory = True,
+ ),
},
+ executable = True,
)