xref: /aosp_15_r20/external/bazelbuild-kotlin-rules/kotlin/jvm/util/srcjars.bzl (revision 3a22c0a33dd99bcca39a024d43e6fbcc55c2806e)
1*3a22c0a3SAlix# Copyright 2022 Google LLC. All rights reserved.
2*3a22c0a3SAlix#
3*3a22c0a3SAlix# Licensed under the Apache License, Version 2.0 (the License);
4*3a22c0a3SAlix# you may not use this file except in compliance with the License.
5*3a22c0a3SAlix# You may obtain a copy of the License at
6*3a22c0a3SAlix#
7*3a22c0a3SAlix#     http://www.apache.org/licenses/LICENSE-2.0
8*3a22c0a3SAlix#
9*3a22c0a3SAlix# Unless required by applicable law or agreed to in writing, software
10*3a22c0a3SAlix# distributed under the License is distributed on an "AS IS" BASIS,
11*3a22c0a3SAlix# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*3a22c0a3SAlix# See the License for the specific language governing permissions and
13*3a22c0a3SAlix# limitations under the License.
14*3a22c0a3SAlix
15*3a22c0a3SAlix"""kt_srcjars"""
16*3a22c0a3SAlix
17*3a22c0a3SAlix# go/keep-sorted start
18*3a22c0a3SAlixload("//:visibility.bzl", "RULES_KOTLIN")
19*3a22c0a3SAlixload(":run_deploy_jar.bzl", "kt_run_deploy_jar")
20*3a22c0a3SAlix# go/keep-sorted end
21*3a22c0a3SAlix
22*3a22c0a3SAlixvisibility(RULES_KOTLIN)
23*3a22c0a3SAlix
24*3a22c0a3SAlixdef _zip(
25*3a22c0a3SAlix        ctx,
26*3a22c0a3SAlix        kt_jvm_toolchain,
27*3a22c0a3SAlix        out_jar,
28*3a22c0a3SAlix        srcs = [],
29*3a22c0a3SAlix        common_srcs = [],
30*3a22c0a3SAlix        ignore_not_allowed_files = False):
31*3a22c0a3SAlix    """Creates a srcjar from a set of Kotlin and Java srcs
32*3a22c0a3SAlix
33*3a22c0a3SAlix    Paths inside the srcjar are derived from the package name in the source file.
34*3a22c0a3SAlix    """
35*3a22c0a3SAlix
36*3a22c0a3SAlix    args = ctx.actions.args()
37*3a22c0a3SAlix    args.add("zip")
38*3a22c0a3SAlix    args.add(out_jar)
39*3a22c0a3SAlix    args.add_joined("--kotlin_srcs", srcs, join_with = ",")
40*3a22c0a3SAlix    args.add_joined("--common_srcs", common_srcs, join_with = ",")
41*3a22c0a3SAlix    if ignore_not_allowed_files:
42*3a22c0a3SAlix        args.add("-i")
43*3a22c0a3SAlix
44*3a22c0a3SAlix    kt_run_deploy_jar(
45*3a22c0a3SAlix        ctx = ctx,
46*3a22c0a3SAlix        java_runtime = kt_jvm_toolchain.java_runtime,
47*3a22c0a3SAlix        deploy_jar = kt_jvm_toolchain.source_jar_zipper,
48*3a22c0a3SAlix        inputs = srcs + common_srcs,
49*3a22c0a3SAlix        outputs = [out_jar],
50*3a22c0a3SAlix        args = [args],
51*3a22c0a3SAlix        mnemonic = "KtJar",
52*3a22c0a3SAlix        progress_message = "Create Jar (kotlin/common.bzl): %{output}",
53*3a22c0a3SAlix    )
54*3a22c0a3SAlix
55*3a22c0a3SAlix    return out_jar
56*3a22c0a3SAlix
57*3a22c0a3SAlixdef _unzip(
58*3a22c0a3SAlix        ctx,
59*3a22c0a3SAlix        kt_jvm_toolchain,
60*3a22c0a3SAlix        dir,
61*3a22c0a3SAlix        input):
62*3a22c0a3SAlix    args = ctx.actions.args()
63*3a22c0a3SAlix    args.add("unzip", input)
64*3a22c0a3SAlix    args.add(dir.path)
65*3a22c0a3SAlix
66*3a22c0a3SAlix    kt_run_deploy_jar(
67*3a22c0a3SAlix        ctx = ctx,
68*3a22c0a3SAlix        java_runtime = kt_jvm_toolchain.java_runtime,
69*3a22c0a3SAlix        deploy_jar = kt_jvm_toolchain.source_jar_zipper,
70*3a22c0a3SAlix        inputs = [input],
71*3a22c0a3SAlix        outputs = [dir],
72*3a22c0a3SAlix        args = [args],
73*3a22c0a3SAlix        mnemonic = "SrcJarUnzip",
74*3a22c0a3SAlix    )
75*3a22c0a3SAlix
76*3a22c0a3SAlix    return dir
77*3a22c0a3SAlix
78*3a22c0a3SAlixdef _zip_resources(ctx, kt_jvm_toolchain, output_jar, input_dirs):
79*3a22c0a3SAlix    """Packs a sequence of tree artifacts into a single jar.
80*3a22c0a3SAlix
81*3a22c0a3SAlix    Given the following file directory structure,
82*3a22c0a3SAlix        /usr/home/a/x/1.txt
83*3a22c0a3SAlix        /usr/home/b/y/1.txt
84*3a22c0a3SAlix    with an input_dirs as [
85*3a22c0a3SAlix        "/usr/home/a",
86*3a22c0a3SAlix        "/usr/home/b",
87*3a22c0a3SAlix    ],
88*3a22c0a3SAlix    The tool produces a jar with in-archive structure of,
89*3a22c0a3SAlix        x/1.txt
90*3a22c0a3SAlix        y/1.txt
91*3a22c0a3SAlix
92*3a22c0a3SAlix    The function fails on the duplicate jar entry case. e.g. if we pass an
93*3a22c0a3SAlix    input_dirs as [
94*3a22c0a3SAlix        "/usr/home/a/x",
95*3a22c0a3SAlix        "/usr/home/b/y",
96*3a22c0a3SAlix    ],
97*3a22c0a3SAlix    then the blaze action would fail with an error message.
98*3a22c0a3SAlix        "java.lang.IllegalStateException: 1.txt has the same path as 1.txt!
99*3a22c0a3SAlix        If it is intended behavior rename one or both of them."
100*3a22c0a3SAlix
101*3a22c0a3SAlix    Args:
102*3a22c0a3SAlix        ctx: The build rule context.
103*3a22c0a3SAlix        kt_jvm_toolchain: Toolchain containing the jar tool.
104*3a22c0a3SAlix        output_jar: The jar to be produced by this action.
105*3a22c0a3SAlix        input_dirs: A sequence of tree artifacts to be zipped.
106*3a22c0a3SAlix
107*3a22c0a3SAlix    Returns:
108*3a22c0a3SAlix        The generated output jar, i.e. output_jar
109*3a22c0a3SAlix    """
110*3a22c0a3SAlix
111*3a22c0a3SAlix    args = ctx.actions.args()
112*3a22c0a3SAlix    args.add("zip_resources")
113*3a22c0a3SAlix    args.add(output_jar)
114*3a22c0a3SAlix    args.add_joined(
115*3a22c0a3SAlix        "--input_dirs",
116*3a22c0a3SAlix        input_dirs,
117*3a22c0a3SAlix        join_with = ",",
118*3a22c0a3SAlix        omit_if_empty = False,
119*3a22c0a3SAlix        expand_directories = False,
120*3a22c0a3SAlix    )
121*3a22c0a3SAlix
122*3a22c0a3SAlix    kt_run_deploy_jar(
123*3a22c0a3SAlix        ctx = ctx,
124*3a22c0a3SAlix        java_runtime = kt_jvm_toolchain.java_runtime,
125*3a22c0a3SAlix        deploy_jar = kt_jvm_toolchain.source_jar_zipper,
126*3a22c0a3SAlix        inputs = input_dirs,
127*3a22c0a3SAlix        outputs = [output_jar],
128*3a22c0a3SAlix        args = [args],
129*3a22c0a3SAlix        mnemonic = "KtJarActionFromTreeArtifacts",
130*3a22c0a3SAlix        progress_message = "Create Jar %{output}",
131*3a22c0a3SAlix    )
132*3a22c0a3SAlix
133*3a22c0a3SAlix    return output_jar
134*3a22c0a3SAlix
135*3a22c0a3SAlixdef _DirSrcjarSyncer(
136*3a22c0a3SAlix        ctx,
137*3a22c0a3SAlix        kt_jvm_toolchain,
138*3a22c0a3SAlix        file_factory):
139*3a22c0a3SAlix    """Synchronizes the contents of a set of srcjar files and tree-artifacts"""
140*3a22c0a3SAlix
141*3a22c0a3SAlix    _dirs = []
142*3a22c0a3SAlix    _srcjars = []
143*3a22c0a3SAlix
144*3a22c0a3SAlix    def add_dirs(dirs):
145*3a22c0a3SAlix        if not dirs:
146*3a22c0a3SAlix            return
147*3a22c0a3SAlix
148*3a22c0a3SAlix        _dirs.extend(dirs)
149*3a22c0a3SAlix        _srcjars.append(
150*3a22c0a3SAlix            _zip_resources(
151*3a22c0a3SAlix                ctx,
152*3a22c0a3SAlix                kt_jvm_toolchain,
153*3a22c0a3SAlix                file_factory.declare_file("%s-codegen.srcjar" % len(_srcjars)),
154*3a22c0a3SAlix                dirs,
155*3a22c0a3SAlix            ),
156*3a22c0a3SAlix        )
157*3a22c0a3SAlix
158*3a22c0a3SAlix    def add_srcjars(srcjars):
159*3a22c0a3SAlix        if not srcjars:
160*3a22c0a3SAlix            return
161*3a22c0a3SAlix
162*3a22c0a3SAlix        for srcjar in srcjars:
163*3a22c0a3SAlix            _dirs.append(
164*3a22c0a3SAlix                _unzip(
165*3a22c0a3SAlix                    ctx,
166*3a22c0a3SAlix                    kt_jvm_toolchain,
167*3a22c0a3SAlix                    file_factory.declare_directory("%s.expand" % len(_dirs)),
168*3a22c0a3SAlix                    srcjar,
169*3a22c0a3SAlix                ),
170*3a22c0a3SAlix            )
171*3a22c0a3SAlix        _srcjars.extend(srcjars)
172*3a22c0a3SAlix
173*3a22c0a3SAlix    return struct(
174*3a22c0a3SAlix        add_dirs = add_dirs,
175*3a22c0a3SAlix        add_srcjars = add_srcjars,
176*3a22c0a3SAlix        dirs = _dirs,
177*3a22c0a3SAlix        srcjars = _srcjars,
178*3a22c0a3SAlix    )
179*3a22c0a3SAlix
180*3a22c0a3SAlixkt_srcjars = struct(
181*3a22c0a3SAlix    zip = _zip,
182*3a22c0a3SAlix    unzip = _unzip,
183*3a22c0a3SAlix    zip_resources = _zip_resources,
184*3a22c0a3SAlix    DirSrcjarSyncer = _DirSrcjarSyncer,
185*3a22c0a3SAlix)
186