143 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
load(
 | 
						|
    "@rules_erlang//:util.bzl",
 | 
						|
    "path_join",
 | 
						|
    "windows_path",
 | 
						|
)
 | 
						|
load(
 | 
						|
    "@rules_erlang//tools:erlang_toolchain.bzl",
 | 
						|
    "erlang_dirs",
 | 
						|
)
 | 
						|
load(
 | 
						|
    ":rabbitmq_home.bzl",
 | 
						|
    "RabbitmqHomeInfo",
 | 
						|
    "rabbitmq_home_short_path",
 | 
						|
)
 | 
						|
 | 
						|
def _impl(ctx):
 | 
						|
    rabbitmq_home_path = rabbitmq_home_short_path(ctx.attr.home)
 | 
						|
 | 
						|
    # the rabbitmq-run.sh template only allows a single erl_libs currently
 | 
						|
    erl_libs = ctx.configuration.host_path_separator.join([
 | 
						|
        path_join(rabbitmq_home_path, "plugins"),
 | 
						|
    ])
 | 
						|
 | 
						|
    (erlang_home, _, runfiles) = erlang_dirs(ctx)
 | 
						|
 | 
						|
    if not ctx.attr.is_windows:
 | 
						|
        output = ctx.actions.declare_file(ctx.label.name)
 | 
						|
        ctx.actions.expand_template(
 | 
						|
            template = ctx.file._template,
 | 
						|
            output = output,
 | 
						|
            substitutions = {
 | 
						|
                "{RABBITMQ_HOME}": rabbitmq_home_path,
 | 
						|
                "{ERL_LIBS}": erl_libs,
 | 
						|
                "{ERLANG_HOME}": erlang_home,
 | 
						|
            },
 | 
						|
            is_executable = True,
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        output = ctx.actions.declare_file(ctx.label.name + ".bat")
 | 
						|
        ctx.actions.expand_template(
 | 
						|
            template = ctx.file._windows_template,
 | 
						|
            output = output,
 | 
						|
            substitutions = {
 | 
						|
                "{RABBITMQ_HOME}": windows_path(rabbitmq_home_path),
 | 
						|
                "{ERL_LIBS}": erl_libs,
 | 
						|
                "{ERLANG_HOME}": windows_path(erlang_home),
 | 
						|
            },
 | 
						|
            is_executable = True,
 | 
						|
        )
 | 
						|
 | 
						|
    runfiles = runfiles.merge(ctx.runfiles(ctx.attr.home[DefaultInfo].files.to_list()))
 | 
						|
 | 
						|
    return [DefaultInfo(
 | 
						|
        runfiles = runfiles,
 | 
						|
        executable = output,
 | 
						|
    )]
 | 
						|
 | 
						|
rabbitmq_run_private = rule(
 | 
						|
    implementation = _impl,
 | 
						|
    attrs = {
 | 
						|
        "_template": attr.label(
 | 
						|
            default = Label("//:scripts/bazel/rabbitmq-run.sh"),
 | 
						|
            allow_single_file = True,
 | 
						|
        ),
 | 
						|
        "_windows_template": attr.label(
 | 
						|
            default = Label("//:scripts/bazel/rabbitmq-run.bat"),
 | 
						|
            allow_single_file = True,
 | 
						|
        ),
 | 
						|
        "is_windows": attr.bool(mandatory = True),
 | 
						|
        "home": attr.label(providers = [RabbitmqHomeInfo]),
 | 
						|
    },
 | 
						|
    toolchains = ["@rules_erlang//tools:toolchain_type"],
 | 
						|
    executable = True,
 | 
						|
)
 | 
						|
 | 
						|
def rabbitmq_run(**kwargs):
 | 
						|
    rabbitmq_run_private(
 | 
						|
        is_windows = select({
 | 
						|
            "@bazel_tools//src/conditions:host_windows": True,
 | 
						|
            "//conditions:default": False,
 | 
						|
        }),
 | 
						|
        **kwargs
 | 
						|
    )
 | 
						|
 | 
						|
def _run_command_impl(ctx):
 | 
						|
    if not ctx.attr.is_windows:
 | 
						|
        output = ctx.actions.declare_file(ctx.label.name)
 | 
						|
        script = "exec ./{} {} $@".format(
 | 
						|
            ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path,
 | 
						|
            ctx.attr.subcommand,
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        output = ctx.actions.declare_file(ctx.label.name + ".bat")
 | 
						|
        script = """@echo off
 | 
						|
call {} {} %*
 | 
						|
if ERRORLEVEL 1 (
 | 
						|
    exit /B %ERRORLEVEL%
 | 
						|
)
 | 
						|
EXIT /B 0
 | 
						|
""".format(
 | 
						|
            ctx.attr.rabbitmq_run[DefaultInfo].files_to_run.executable.short_path,
 | 
						|
            ctx.attr.subcommand,
 | 
						|
        )
 | 
						|
 | 
						|
    ctx.actions.write(
 | 
						|
        output = output,
 | 
						|
        content = script,
 | 
						|
        is_executable = True,
 | 
						|
    )
 | 
						|
 | 
						|
    return [DefaultInfo(
 | 
						|
        runfiles = ctx.attr.rabbitmq_run[DefaultInfo].default_runfiles,
 | 
						|
        executable = output,
 | 
						|
    )]
 | 
						|
 | 
						|
rabbitmq_run_command_private = rule(
 | 
						|
    implementation = _run_command_impl,
 | 
						|
    attrs = {
 | 
						|
        "is_windows": attr.bool(mandatory = True),
 | 
						|
        "rabbitmq_run": attr.label(
 | 
						|
            executable = True,
 | 
						|
            cfg = "target",
 | 
						|
        ),
 | 
						|
        "subcommand": attr.string(values = [
 | 
						|
            "run-broker",
 | 
						|
            "start-background-broker",
 | 
						|
            "stop-node",
 | 
						|
            "start-cluster",
 | 
						|
            "stop-cluster",
 | 
						|
        ]),
 | 
						|
    },
 | 
						|
    executable = True,
 | 
						|
)
 | 
						|
 | 
						|
def rabbitmq_run_command(**kwargs):
 | 
						|
    rabbitmq_run_command_private(
 | 
						|
        is_windows = select({
 | 
						|
            "@bazel_tools//src/conditions:host_windows": True,
 | 
						|
            "//conditions:default": False,
 | 
						|
        }),
 | 
						|
        **kwargs
 | 
						|
    )
 |