xref: /aosp_15_r20/build/bazel/rules/sh_binary.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard WorkerShBinaryInfo = provider(
2*7594170eSAndroid Build Coastguard Worker    "Info needed for sh_binary modules",
3*7594170eSAndroid Build Coastguard Worker    fields = {
4*7594170eSAndroid Build Coastguard Worker        "sub_dir": "Optional subdirectory to install into",
5*7594170eSAndroid Build Coastguard Worker        "filename": "Optional name for the installed file",
6*7594170eSAndroid Build Coastguard Worker    },
7*7594170eSAndroid Build Coastguard Worker)
8*7594170eSAndroid Build Coastguard Worker
9*7594170eSAndroid Build Coastguard Workerdef sh_binary(
10*7594170eSAndroid Build Coastguard Worker        name,
11*7594170eSAndroid Build Coastguard Worker        srcs,
12*7594170eSAndroid Build Coastguard Worker        sub_dir = None,
13*7594170eSAndroid Build Coastguard Worker        filename = None,
14*7594170eSAndroid Build Coastguard Worker        tags = [],
15*7594170eSAndroid Build Coastguard Worker        **kwargs):
16*7594170eSAndroid Build Coastguard Worker    "Bazel macro to correspond with the sh_binary Soong module."
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard Worker    internal_name = name + "_internal"
19*7594170eSAndroid Build Coastguard Worker    native.sh_binary(
20*7594170eSAndroid Build Coastguard Worker        name = internal_name,
21*7594170eSAndroid Build Coastguard Worker        srcs = srcs,
22*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
23*7594170eSAndroid Build Coastguard Worker        **kwargs
24*7594170eSAndroid Build Coastguard Worker    )
25*7594170eSAndroid Build Coastguard Worker
26*7594170eSAndroid Build Coastguard Worker    # We need this wrapper rule around native.sh_binary in order to provide extra
27*7594170eSAndroid Build Coastguard Worker    # attributes such as filename and sub_dir that are useful when building apex.
28*7594170eSAndroid Build Coastguard Worker    _sh_binary_combiner(
29*7594170eSAndroid Build Coastguard Worker        name = name,
30*7594170eSAndroid Build Coastguard Worker        sub_dir = sub_dir,
31*7594170eSAndroid Build Coastguard Worker        filename = filename,
32*7594170eSAndroid Build Coastguard Worker        dep = internal_name,
33*7594170eSAndroid Build Coastguard Worker        tags = tags,
34*7594170eSAndroid Build Coastguard Worker    )
35*7594170eSAndroid Build Coastguard Worker
36*7594170eSAndroid Build Coastguard Workerdef _sh_binary_combiner_impl(ctx):
37*7594170eSAndroid Build Coastguard Worker    dep = ctx.attr.dep[DefaultInfo]
38*7594170eSAndroid Build Coastguard Worker    output = ctx.outputs.executable
39*7594170eSAndroid Build Coastguard Worker
40*7594170eSAndroid Build Coastguard Worker    ctx.actions.run_shell(
41*7594170eSAndroid Build Coastguard Worker        outputs = [output],
42*7594170eSAndroid Build Coastguard Worker        inputs = [dep.files_to_run.executable],
43*7594170eSAndroid Build Coastguard Worker        command = "cp %s %s" % (dep.files_to_run.executable.path, output.path),
44*7594170eSAndroid Build Coastguard Worker        mnemonic = "CopyNativeShBinary",
45*7594170eSAndroid Build Coastguard Worker    )
46*7594170eSAndroid Build Coastguard Worker
47*7594170eSAndroid Build Coastguard Worker    files = depset(direct = [output], transitive = [dep.files])
48*7594170eSAndroid Build Coastguard Worker
49*7594170eSAndroid Build Coastguard Worker    return [
50*7594170eSAndroid Build Coastguard Worker        DefaultInfo(
51*7594170eSAndroid Build Coastguard Worker            files = files,
52*7594170eSAndroid Build Coastguard Worker            runfiles = ctx.runfiles().merge(dep.data_runfiles).merge(dep.default_runfiles),
53*7594170eSAndroid Build Coastguard Worker            executable = output,
54*7594170eSAndroid Build Coastguard Worker        ),
55*7594170eSAndroid Build Coastguard Worker        ShBinaryInfo(
56*7594170eSAndroid Build Coastguard Worker            sub_dir = ctx.attr.sub_dir,
57*7594170eSAndroid Build Coastguard Worker            filename = ctx.attr.filename,
58*7594170eSAndroid Build Coastguard Worker        ),
59*7594170eSAndroid Build Coastguard Worker    ]
60*7594170eSAndroid Build Coastguard Worker
61*7594170eSAndroid Build Coastguard Worker_sh_binary_combiner = rule(
62*7594170eSAndroid Build Coastguard Worker    implementation = _sh_binary_combiner_impl,
63*7594170eSAndroid Build Coastguard Worker    attrs = {
64*7594170eSAndroid Build Coastguard Worker        "sub_dir": attr.string(),
65*7594170eSAndroid Build Coastguard Worker        "filename": attr.string(),
66*7594170eSAndroid Build Coastguard Worker        "dep": attr.label(mandatory = True),
67*7594170eSAndroid Build Coastguard Worker    },
68*7594170eSAndroid Build Coastguard Worker    provides = [ShBinaryInfo],
69*7594170eSAndroid Build Coastguard Worker    executable = True,
70*7594170eSAndroid Build Coastguard Worker    doc = "Wrapper rule around native.sh_binary to provide extra attributes",
71*7594170eSAndroid Build Coastguard Worker)
72