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