1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Worker""" 16*7594170eSAndroid Build Coastguard WorkerRules for generating java code from sysprop_library modules 17*7594170eSAndroid Build Coastguard Worker""" 18*7594170eSAndroid Build Coastguard Worker 19*7594170eSAndroid Build Coastguard Workerload("//build/bazel/rules/sysprop:sysprop_library.bzl", "SyspropGenInfo") 20*7594170eSAndroid Build Coastguard Workerload(":sdk_transition.bzl", "sdk_transition") 21*7594170eSAndroid Build Coastguard Worker 22*7594170eSAndroid Build Coastguard Worker# TODO: b/301122615 - Implement stubs rule and macro for both 23*7594170eSAndroid Build Coastguard Worker 24*7594170eSAndroid Build Coastguard Worker_java_sysprop_library_attrs = { 25*7594170eSAndroid Build Coastguard Worker "dep": attr.label(mandatory = True), 26*7594170eSAndroid Build Coastguard Worker "_sdk_version": attr.string(default = "core_current"), 27*7594170eSAndroid Build Coastguard Worker # TODO: TBD - Add other possible stub libs 28*7594170eSAndroid Build Coastguard Worker "_platform_stubs": attr.label( 29*7594170eSAndroid Build Coastguard Worker default = "//system/tools/sysprop:sysprop-library-stub-platform", 30*7594170eSAndroid Build Coastguard Worker ), 31*7594170eSAndroid Build Coastguard Worker "_sysprop_java": attr.label( 32*7594170eSAndroid Build Coastguard Worker default = "//system/tools/sysprop:sysprop_java", 33*7594170eSAndroid Build Coastguard Worker executable = True, 34*7594170eSAndroid Build Coastguard Worker cfg = "exec", 35*7594170eSAndroid Build Coastguard Worker ), 36*7594170eSAndroid Build Coastguard Worker "_soong_zip": attr.label( 37*7594170eSAndroid Build Coastguard Worker default = "//build/soong/zip/cmd:soong_zip", 38*7594170eSAndroid Build Coastguard Worker executable = True, 39*7594170eSAndroid Build Coastguard Worker cfg = "exec", 40*7594170eSAndroid Build Coastguard Worker ), 41*7594170eSAndroid Build Coastguard Worker "_allowlist_function_transition": attr.label( 42*7594170eSAndroid Build Coastguard Worker default = "@bazel_tools//tools/allowlists/function_transition_allowlist", 43*7594170eSAndroid Build Coastguard Worker ), 44*7594170eSAndroid Build Coastguard Worker} 45*7594170eSAndroid Build Coastguard Worker 46*7594170eSAndroid Build Coastguard Workerdef _gen_java( 47*7594170eSAndroid Build Coastguard Worker ctx, 48*7594170eSAndroid Build Coastguard Worker srcs, 49*7594170eSAndroid Build Coastguard Worker scope): 50*7594170eSAndroid Build Coastguard Worker outputs = [] 51*7594170eSAndroid Build Coastguard Worker all_srcs = [] 52*7594170eSAndroid Build Coastguard Worker for src in srcs: 53*7594170eSAndroid Build Coastguard Worker all_srcs.extend(src.files.to_list()) 54*7594170eSAndroid Build Coastguard Worker 55*7594170eSAndroid Build Coastguard Worker for src_file in all_srcs: 56*7594170eSAndroid Build Coastguard Worker output_subpath = src_file.short_path.replace( 57*7594170eSAndroid Build Coastguard Worker ctx.label.package + "/", 58*7594170eSAndroid Build Coastguard Worker "", 59*7594170eSAndroid Build Coastguard Worker 1, 60*7594170eSAndroid Build Coastguard Worker ) 61*7594170eSAndroid Build Coastguard Worker output_srcjar_file = ctx.actions.declare_file( 62*7594170eSAndroid Build Coastguard Worker "%s.srcjar" % output_subpath, 63*7594170eSAndroid Build Coastguard Worker ) 64*7594170eSAndroid Build Coastguard Worker output_tmp_dir_path = "%s.tmp" % output_srcjar_file.path 65*7594170eSAndroid Build Coastguard Worker ctx.actions.run_shell( 66*7594170eSAndroid Build Coastguard Worker tools = [ 67*7594170eSAndroid Build Coastguard Worker ctx.executable._sysprop_java, 68*7594170eSAndroid Build Coastguard Worker ctx.executable._soong_zip, 69*7594170eSAndroid Build Coastguard Worker ], 70*7594170eSAndroid Build Coastguard Worker inputs = [src_file], 71*7594170eSAndroid Build Coastguard Worker outputs = [output_srcjar_file], 72*7594170eSAndroid Build Coastguard Worker command = """ 73*7594170eSAndroid Build Coastguard Worker rm -rf {dir} && mkdir -p {dir} && 74*7594170eSAndroid Build Coastguard Worker {sysprop_java} --scope {scope} --java-output-dir {dir} {input} && 75*7594170eSAndroid Build Coastguard Worker {soong_zip} -jar -o {output_srcjar} -C {dir} -D {dir} 76*7594170eSAndroid Build Coastguard Worker """.format( 77*7594170eSAndroid Build Coastguard Worker dir = output_tmp_dir_path, 78*7594170eSAndroid Build Coastguard Worker sysprop_java = ctx.executable._sysprop_java.path, 79*7594170eSAndroid Build Coastguard Worker scope = scope, 80*7594170eSAndroid Build Coastguard Worker input = src_file.path, 81*7594170eSAndroid Build Coastguard Worker soong_zip = ctx.executable._soong_zip.path, 82*7594170eSAndroid Build Coastguard Worker output_srcjar = output_srcjar_file.path, 83*7594170eSAndroid Build Coastguard Worker ), 84*7594170eSAndroid Build Coastguard Worker mnemonic = "SyspropJava", 85*7594170eSAndroid Build Coastguard Worker progress_message = "Generating srcjar from {}".format( 86*7594170eSAndroid Build Coastguard Worker src_file.basename, 87*7594170eSAndroid Build Coastguard Worker ), 88*7594170eSAndroid Build Coastguard Worker ) 89*7594170eSAndroid Build Coastguard Worker outputs.append(output_srcjar_file) 90*7594170eSAndroid Build Coastguard Worker return outputs 91*7594170eSAndroid Build Coastguard Worker 92*7594170eSAndroid Build Coastguard Workerdef _compile_java( 93*7594170eSAndroid Build Coastguard Worker name, 94*7594170eSAndroid Build Coastguard Worker ctx, 95*7594170eSAndroid Build Coastguard Worker srcs, 96*7594170eSAndroid Build Coastguard Worker deps): 97*7594170eSAndroid Build Coastguard Worker out_jar = ctx.actions.declare_file("%s.jar" % name) 98*7594170eSAndroid Build Coastguard Worker java_info = java_common.compile( 99*7594170eSAndroid Build Coastguard Worker ctx, 100*7594170eSAndroid Build Coastguard Worker source_jars = srcs, 101*7594170eSAndroid Build Coastguard Worker deps = deps, 102*7594170eSAndroid Build Coastguard Worker output = out_jar, 103*7594170eSAndroid Build Coastguard Worker java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java, 104*7594170eSAndroid Build Coastguard Worker ) 105*7594170eSAndroid Build Coastguard Worker return java_info, out_jar 106*7594170eSAndroid Build Coastguard Worker 107*7594170eSAndroid Build Coastguard Workerdef _java_sysprop_library_impl(ctx): 108*7594170eSAndroid Build Coastguard Worker gen_srcjars = _gen_java( 109*7594170eSAndroid Build Coastguard Worker ctx, 110*7594170eSAndroid Build Coastguard Worker ctx.attr.dep[SyspropGenInfo].srcs, 111*7594170eSAndroid Build Coastguard Worker "internal", # TODO: b/302677541 - Determine based on props 112*7594170eSAndroid Build Coastguard Worker ) 113*7594170eSAndroid Build Coastguard Worker 114*7594170eSAndroid Build Coastguard Worker java_info, out_jar = _compile_java( 115*7594170eSAndroid Build Coastguard Worker ctx.attr.name, 116*7594170eSAndroid Build Coastguard Worker ctx, 117*7594170eSAndroid Build Coastguard Worker gen_srcjars, 118*7594170eSAndroid Build Coastguard Worker # TODO: b/302677539 - Determine based on props 119*7594170eSAndroid Build Coastguard Worker [ctx.attr._platform_stubs[JavaInfo]], 120*7594170eSAndroid Build Coastguard Worker ) 121*7594170eSAndroid Build Coastguard Worker 122*7594170eSAndroid Build Coastguard Worker return [ 123*7594170eSAndroid Build Coastguard Worker java_info, 124*7594170eSAndroid Build Coastguard Worker DefaultInfo( 125*7594170eSAndroid Build Coastguard Worker files = depset([out_jar]), 126*7594170eSAndroid Build Coastguard Worker runfiles = ctx.runfiles( 127*7594170eSAndroid Build Coastguard Worker transitive_files = depset( 128*7594170eSAndroid Build Coastguard Worker transitive = [java_info.transitive_runtime_jars], 129*7594170eSAndroid Build Coastguard Worker ), 130*7594170eSAndroid Build Coastguard Worker ), 131*7594170eSAndroid Build Coastguard Worker ), 132*7594170eSAndroid Build Coastguard Worker OutputGroupInfo(default = depset()), 133*7594170eSAndroid Build Coastguard Worker ] 134*7594170eSAndroid Build Coastguard Worker 135*7594170eSAndroid Build Coastguard Workerjava_sysprop_library = rule( 136*7594170eSAndroid Build Coastguard Worker implementation = _java_sysprop_library_impl, 137*7594170eSAndroid Build Coastguard Worker cfg = sdk_transition, 138*7594170eSAndroid Build Coastguard Worker doc = """ 139*7594170eSAndroid Build Coastguard Worker Generates java sources from the sources in the supplied sysprop_library 140*7594170eSAndroid Build Coastguard Worker target and compiles them into a jar. 141*7594170eSAndroid Build Coastguard Worker """, 142*7594170eSAndroid Build Coastguard Worker attrs = _java_sysprop_library_attrs, 143*7594170eSAndroid Build Coastguard Worker toolchains = ["@bazel_tools//tools/jdk:toolchain_type"], 144*7594170eSAndroid Build Coastguard Worker fragments = ["java"], 145*7594170eSAndroid Build Coastguard Worker provides = [JavaInfo], 146*7594170eSAndroid Build Coastguard Worker) 147