| 
									
										
										
										
											2024-06-17 14:47:53 +08:00
										 |  |  | load("@rules_erlang//:ct.bzl", "additional_file_dest_relative_path") | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  | load("@rules_erlang//:erlang_app_info.bzl", "ErlangAppInfo", "flat_deps") | 
					
						
							|  |  |  | load("@rules_erlang//:util.bzl", "path_join") | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | RabbitmqHomeInfo = provider( | 
					
						
							|  |  |  |     doc = "An assembled RABBITMQ_HOME dir", | 
					
						
							|  |  |  |     fields = { | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  |         "rabbitmqctl": "rabbitmqctl script from the sbin directory", | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _copy_script(ctx, script): | 
					
						
							| 
									
										
										
										
											2022-12-07 22:47:43 +08:00
										 |  |  |     dest = ctx.actions.declare_file( | 
					
						
							|  |  |  |         path_join(ctx.label.name, "sbin", script.basename), | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |     ctx.actions.expand_template( | 
					
						
							|  |  |  |         template = script, | 
					
						
							|  |  |  |         output = dest, | 
					
						
							|  |  |  |         substitutions = {}, | 
					
						
							| 
									
										
										
										
											2022-12-07 22:47:43 +08:00
										 |  |  |         is_executable = True, | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     return dest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-07 22:47:43 +08:00
										 |  |  | def copy_escript(ctx, escript): | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     e = ctx.attr._rabbitmqctl_escript.files_to_run.executable | 
					
						
							| 
									
										
										
										
											2022-12-07 22:47:43 +08:00
										 |  |  |     dest = ctx.actions.declare_file( | 
					
						
							|  |  |  |         path_join(ctx.label.name, "escript", escript.basename), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     ctx.actions.run( | 
					
						
							|  |  |  |         inputs = [e], | 
					
						
							|  |  |  |         outputs = [dest], | 
					
						
							|  |  |  |         executable = "cp", | 
					
						
							|  |  |  |         arguments = [e.path, dest.path], | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-12-07 22:47:43 +08:00
										 |  |  |     return dest | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _plugins_dir_links(ctx, plugin): | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |     lib_info = plugin[ErlangAppInfo] | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     plugin_path = path_join( | 
					
						
							|  |  |  |         ctx.label.name, | 
					
						
							|  |  |  |         "plugins", | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |         lib_info.app_name, | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     links = [] | 
					
						
							|  |  |  |     for f in lib_info.include: | 
					
						
							|  |  |  |         o = ctx.actions.declare_file(path_join(plugin_path, "include", f.basename)) | 
					
						
							|  |  |  |         ctx.actions.symlink( | 
					
						
							|  |  |  |             output = o, | 
					
						
							|  |  |  |             target_file = f, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         links.append(o) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for f in lib_info.beam: | 
					
						
							|  |  |  |         if f.is_directory: | 
					
						
							| 
									
										
										
										
											2024-06-14 23:13:12 +08:00
										 |  |  |             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)) | 
					
						
							| 
									
										
										
										
											2023-02-23 21:47:41 +08:00
										 |  |  |             o = ctx.actions.declare_directory(path_join(plugin_path, "ebin")) | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |         else: | 
					
						
							|  |  |  |             o = ctx.actions.declare_file(path_join(plugin_path, "ebin", f.basename)) | 
					
						
							|  |  |  |         ctx.actions.symlink( | 
					
						
							|  |  |  |             output = o, | 
					
						
							|  |  |  |             target_file = f, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         links.append(o) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for f in lib_info.priv: | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |         p = additional_file_dest_relative_path(plugin.label, f) | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |         o = ctx.actions.declare_file(path_join(plugin_path, p)) | 
					
						
							|  |  |  |         ctx.actions.symlink( | 
					
						
							|  |  |  |             output = o, | 
					
						
							|  |  |  |             target_file = f, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         links.append(o) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return links | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  | def flatten(list_of_lists): | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     return [item for sublist in list_of_lists for item in sublist] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _impl(ctx): | 
					
						
							|  |  |  |     plugins = flat_deps(ctx.attr.plugins) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |     if not ctx.attr.is_windows: | 
					
						
							|  |  |  |         source_scripts = ctx.files._scripts | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         source_scripts = ctx.files._scripts_windows | 
					
						
							|  |  |  |     scripts = [_copy_script(ctx, script) for script in source_scripts] | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-01 16:32:59 +08:00
										 |  |  |     escripts = [copy_escript(ctx, escript) for escript in ctx.files._escripts] | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |     plugins = flatten([_plugins_dir_links(ctx, plugin) for plugin in plugins]) | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  |     rabbitmqctl = None | 
					
						
							|  |  |  |     for script in scripts: | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |         if script.basename == ("rabbitmqctl" if not ctx.attr.is_windows else "rabbitmqctl.bat"): | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  |             rabbitmqctl = script | 
					
						
							|  |  |  |     if rabbitmqctl == None: | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |         fail("could not find rabbitmqctl among", scripts) | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     return [ | 
					
						
							|  |  |  |         RabbitmqHomeInfo( | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  |             rabbitmqctl = rabbitmqctl, | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |         ), | 
					
						
							|  |  |  |         DefaultInfo( | 
					
						
							|  |  |  |             files = depset(scripts + escripts + plugins), | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  | RABBITMQ_HOME_ATTRS = { | 
					
						
							| 
									
										
										
										
											2023-05-01 16:32:59 +08:00
										 |  |  |     "_escripts": attr.label_list( | 
					
						
							|  |  |  |         default = [ | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-diagnostics", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-plugins", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-queues", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-streams", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-upgrade", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmqctl", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/vmware-rabbitmq", | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         allow_files = True, | 
					
						
							|  |  |  |     ), | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |     "_scripts": attr.label_list( | 
					
						
							|  |  |  |         default = [ | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-defaults", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-diagnostics", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-env", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-plugins", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-queues", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-server", | 
					
						
							| 
									
										
										
										
											2022-08-16 17:43:02 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmq-streams", | 
					
						
							| 
									
										
										
										
											2022-08-16 17:37:38 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmq-upgrade", | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmqctl", | 
					
						
							| 
									
										
										
										
											2023-02-16 20:39:20 +08:00
										 |  |  |             "//deps/rabbit:scripts/vmware-rabbitmq", | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |         ], | 
					
						
							|  |  |  |         allow_files = True, | 
					
						
							|  |  |  |     ), | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |     "_scripts_windows": attr.label_list( | 
					
						
							|  |  |  |         default = [ | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-defaults.bat", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-diagnostics.bat", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-env.bat", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-plugins.bat", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-queues.bat", | 
					
						
							|  |  |  |             "//deps/rabbit:scripts/rabbitmq-server.bat", | 
					
						
							| 
									
										
										
										
											2022-08-16 17:43:02 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmq-streams.bat", | 
					
						
							| 
									
										
										
										
											2022-08-16 17:37:38 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmq-upgrade.bat", | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |             "//deps/rabbit:scripts/rabbitmqctl.bat", | 
					
						
							| 
									
										
										
										
											2023-02-16 20:39:20 +08:00
										 |  |  |             "//deps/rabbit:scripts/vmware-rabbitmq.bat", | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |         ], | 
					
						
							|  |  |  |         allow_files = True, | 
					
						
							|  |  |  |     ), | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |     "_rabbitmqctl_escript": attr.label(default = "//deps/rabbitmq_cli:rabbitmqctl"), | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  |     "is_windows": attr.bool(mandatory = True), | 
					
						
							|  |  |  |     "plugins": attr.label_list(providers = [ErlangAppInfo]), | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  | rabbitmq_home_private = rule( | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  |     implementation = _impl, | 
					
						
							| 
									
										
										
										
											2021-09-30 21:49:08 +08:00
										 |  |  |     attrs = RABBITMQ_HOME_ATTRS, | 
					
						
							| 
									
										
										
										
											2021-03-29 17:01:43 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2021-09-08 18:01:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 03:57:48 +08:00
										 |  |  | def rabbitmq_home(**kwargs): | 
					
						
							|  |  |  |     rabbitmq_home_private( | 
					
						
							|  |  |  |         is_windows = select({ | 
					
						
							|  |  |  |             "@bazel_tools//src/conditions:host_windows": True, | 
					
						
							|  |  |  |             "//conditions:default": False, | 
					
						
							|  |  |  |         }), | 
					
						
							|  |  |  |         **kwargs | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-08 18:01:38 +08:00
										 |  |  | def _dirname(p): | 
					
						
							|  |  |  |     return p.rpartition("/")[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def rabbitmq_home_short_path(rabbitmq_home): | 
					
						
							| 
									
										
										
										
											2021-09-09 19:50:22 +08:00
										 |  |  |     short_path = rabbitmq_home[RabbitmqHomeInfo].rabbitmqctl.short_path | 
					
						
							| 
									
										
										
										
											2021-09-08 22:56:05 +08:00
										 |  |  |     if rabbitmq_home.label.workspace_root != "": | 
					
						
							|  |  |  |         short_path = path_join(rabbitmq_home.label.workspace_root, short_path) | 
					
						
							|  |  |  |     return _dirname(_dirname(short_path)) |