95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
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",
 | 
						|
    ],
 | 
						|
)
 |