Add "bazel run //tools:symlink_deps_for_erlang_ls"
for symlinking 3rd party deps into a place that erlang_ls can use them
This commit is contained in:
parent
06a330f553
commit
a8658ae68d
|
@ -3,3 +3,4 @@
|
||||||
.erlang.mk
|
.erlang.mk
|
||||||
deps/osiris
|
deps/osiris
|
||||||
deps/ra
|
deps/ra
|
||||||
|
extra_deps
|
||||||
|
|
|
@ -89,6 +89,7 @@ callgrand*
|
||||||
|
|
||||||
/user.bazelrc
|
/user.bazelrc
|
||||||
/bazel-*
|
/bazel-*
|
||||||
|
/extra_deps/
|
||||||
|
|
||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
deps_dirs:
|
deps_dirs:
|
||||||
- "deps/*"
|
- "deps/*"
|
||||||
- "deps/*/apps/*"
|
- "deps/*/apps/*"
|
||||||
|
- "extra_deps/*"
|
||||||
diagnostics:
|
diagnostics:
|
||||||
disabled:
|
disabled:
|
||||||
- bound_var_in_pattern
|
- bound_var_in_pattern
|
||||||
|
@ -16,6 +17,7 @@ diagnostics:
|
||||||
include_dirs:
|
include_dirs:
|
||||||
- "deps"
|
- "deps"
|
||||||
- "deps/*/include"
|
- "deps/*/include"
|
||||||
|
- "extra_deps/*/include"
|
||||||
lenses:
|
lenses:
|
||||||
enabled:
|
enabled:
|
||||||
- ct-run-test
|
- ct-run-test
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
load("//:rabbitmq.bzl", "all_plugins")
|
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(
|
erlang_ls_config(
|
||||||
name = "erlang_ls_files",
|
name = "erlang_ls.config",
|
||||||
|
)
|
||||||
|
|
||||||
|
deps_symlinks(
|
||||||
|
name = "symlink_deps_for_erlang_ls",
|
||||||
apps = all_plugins(
|
apps = all_plugins(
|
||||||
rabbitmq_workspace = "",
|
rabbitmq_workspace = "",
|
||||||
) + [
|
) + [
|
||||||
"//deps/rabbitmq_ct_helpers:erlang_app",
|
"//deps/rabbitmq_ct_helpers:erlang_app",
|
||||||
"//deps/rabbitmq_ct_client_helpers:erlang_app",
|
"//deps/rabbitmq_ct_client_helpers:erlang_app",
|
||||||
],
|
],
|
||||||
)
|
dest = "extra_deps", # must also be listed in .bazelignore
|
||||||
|
tags = ["local"],
|
||||||
erlang_ls_config(
|
|
||||||
name = "erlang_ls.config",
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,10 +6,6 @@ load(
|
||||||
"@rules_erlang//:util.bzl",
|
"@rules_erlang//:util.bzl",
|
||||||
"path_join",
|
"path_join",
|
||||||
)
|
)
|
||||||
load(
|
|
||||||
"@rules_erlang//private:util.bzl",
|
|
||||||
"additional_file_dest_relative_path",
|
|
||||||
)
|
|
||||||
|
|
||||||
def _erlang_ls_config(ctx):
|
def _erlang_ls_config(ctx):
|
||||||
runtime_prefix = path_join(
|
runtime_prefix = path_join(
|
||||||
|
@ -46,48 +42,54 @@ erlang_ls_config = rule(
|
||||||
executable = True,
|
executable = True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _erlang_app_files(ctx, app, directory):
|
def _deps_symlinks(ctx):
|
||||||
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):
|
|
||||||
apps = ctx.attr.apps
|
apps = ctx.attr.apps
|
||||||
deps = []
|
deps = []
|
||||||
|
|
||||||
for app in apps:
|
for app in apps:
|
||||||
app_info = app[ErlangAppInfo]
|
app_info = app[ErlangAppInfo]
|
||||||
for dep in app_info.deps:
|
for dep in app_info.deps:
|
||||||
# this puts non rabbitmq plugins, like amqp10_client into deps,
|
if dep.label.workspace_name != "" and dep not in deps and dep not in apps:
|
||||||
# but maybe those should be in apps? Does it matter?
|
|
||||||
if dep not in deps and dep not in apps:
|
|
||||||
deps.append(dep)
|
deps.append(dep)
|
||||||
|
|
||||||
files = []
|
files = []
|
||||||
for app in apps:
|
output = ctx.actions.declare_file(ctx.label.name + ".sh")
|
||||||
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")),
|
|
||||||
)
|
|
||||||
|
|
||||||
return [
|
commands = [
|
||||||
DefaultInfo(files = depset(files)),
|
"set -euxo pipefail",
|
||||||
|
"",
|
||||||
|
"mkdir -p \"{}\"".format(path_join("$BUILD_WORKSPACE_DIRECTORY", ctx.attr.dest)),
|
||||||
|
"",
|
||||||
]
|
]
|
||||||
|
|
||||||
erlang_ls_tree = rule(
|
for dep in deps:
|
||||||
implementation = _erlang_ls_tree,
|
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 = {
|
attrs = {
|
||||||
"apps": attr.label_list(
|
"apps": attr.label_list(
|
||||||
providers = [ErlangAppInfo],
|
providers = [ErlangAppInfo],
|
||||||
),
|
),
|
||||||
|
"dest": attr.string(
|
||||||
|
mandatory = True,
|
||||||
|
),
|
||||||
},
|
},
|
||||||
|
executable = True,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue