1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 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 Workerload( 16*7594170eSAndroid Build Coastguard Worker "//build/bazel/rules/sysprop:sysprop_library.bzl", 17*7594170eSAndroid Build Coastguard Worker "SyspropGenInfo", 18*7594170eSAndroid Build Coastguard Worker) 19*7594170eSAndroid Build Coastguard Workerload( 20*7594170eSAndroid Build Coastguard Worker ":cc_library_common.bzl", 21*7594170eSAndroid Build Coastguard Worker "create_ccinfo_for_includes", 22*7594170eSAndroid Build Coastguard Worker) 23*7594170eSAndroid Build Coastguard Workerload(":cc_library_shared.bzl", "cc_library_shared") 24*7594170eSAndroid Build Coastguard Workerload(":cc_library_static.bzl", "cc_library_static") 25*7594170eSAndroid Build Coastguard Worker 26*7594170eSAndroid Build Coastguard Worker# TODO(b/240466571): Implement determination of exported includes 27*7594170eSAndroid Build Coastguard Workerdef _cc_gen_sysprop_impl(ctx): 28*7594170eSAndroid Build Coastguard Worker outputs = [] 29*7594170eSAndroid Build Coastguard Worker output_headers = [] 30*7594170eSAndroid Build Coastguard Worker all_srcs = [] 31*7594170eSAndroid Build Coastguard Worker [ 32*7594170eSAndroid Build Coastguard Worker all_srcs.extend(src.files.to_list()) 33*7594170eSAndroid Build Coastguard Worker for src in ctx.attr.dep[SyspropGenInfo].srcs 34*7594170eSAndroid Build Coastguard Worker ] 35*7594170eSAndroid Build Coastguard Worker for src_file in all_srcs: 36*7594170eSAndroid Build Coastguard Worker output_subpath = src_file.short_path.replace( 37*7594170eSAndroid Build Coastguard Worker ctx.label.package + "/", 38*7594170eSAndroid Build Coastguard Worker "", 39*7594170eSAndroid Build Coastguard Worker 1, 40*7594170eSAndroid Build Coastguard Worker ) 41*7594170eSAndroid Build Coastguard Worker action_outputs = [] 42*7594170eSAndroid Build Coastguard Worker args = ctx.actions.args() 43*7594170eSAndroid Build Coastguard Worker output_src_file = ctx.actions.declare_file( 44*7594170eSAndroid Build Coastguard Worker "sysprop/%s.cpp" % output_subpath, 45*7594170eSAndroid Build Coastguard Worker ) 46*7594170eSAndroid Build Coastguard Worker action_outputs.append(output_src_file) 47*7594170eSAndroid Build Coastguard Worker 48*7594170eSAndroid Build Coastguard Worker output_header_file = ctx.actions.declare_file( 49*7594170eSAndroid Build Coastguard Worker "sysprop/include/%s.h" % output_subpath, 50*7594170eSAndroid Build Coastguard Worker ) 51*7594170eSAndroid Build Coastguard Worker action_outputs.append(output_header_file) 52*7594170eSAndroid Build Coastguard Worker output_headers.append(output_header_file) 53*7594170eSAndroid Build Coastguard Worker 54*7594170eSAndroid Build Coastguard Worker # TODO(b/240466571): This will in some cases be exported with the 55*7594170eSAndroid Build Coastguard Worker # linked bug 56*7594170eSAndroid Build Coastguard Worker output_public_header_file = ctx.actions.declare_file( 57*7594170eSAndroid Build Coastguard Worker "sysprop/public/include/%s.h" % output_subpath, 58*7594170eSAndroid Build Coastguard Worker ) 59*7594170eSAndroid Build Coastguard Worker action_outputs.append(output_public_header_file) 60*7594170eSAndroid Build Coastguard Worker 61*7594170eSAndroid Build Coastguard Worker args.add("--header-dir", output_header_file.dirname) 62*7594170eSAndroid Build Coastguard Worker args.add("--public-header-dir", output_public_header_file.dirname) 63*7594170eSAndroid Build Coastguard Worker args.add("--source-dir", output_src_file.dirname) 64*7594170eSAndroid Build Coastguard Worker args.add("--include-name", "%s.h" % output_subpath) 65*7594170eSAndroid Build Coastguard Worker args.add(src_file.path) 66*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 67*7594170eSAndroid Build Coastguard Worker executable = ctx.executable._sysprop_cpp, 68*7594170eSAndroid Build Coastguard Worker arguments = [args], 69*7594170eSAndroid Build Coastguard Worker inputs = [src_file], 70*7594170eSAndroid Build Coastguard Worker outputs = action_outputs, 71*7594170eSAndroid Build Coastguard Worker mnemonic = "syspropcc", 72*7594170eSAndroid Build Coastguard Worker progress_message = "Generating sources from %s" % ( 73*7594170eSAndroid Build Coastguard Worker src_file.short_path, 74*7594170eSAndroid Build Coastguard Worker ), 75*7594170eSAndroid Build Coastguard Worker ) 76*7594170eSAndroid Build Coastguard Worker outputs.extend(action_outputs) 77*7594170eSAndroid Build Coastguard Worker return [ 78*7594170eSAndroid Build Coastguard Worker DefaultInfo(files = depset(outputs)), 79*7594170eSAndroid Build Coastguard Worker create_ccinfo_for_includes( 80*7594170eSAndroid Build Coastguard Worker ctx = ctx, 81*7594170eSAndroid Build Coastguard Worker hdrs = output_headers, 82*7594170eSAndroid Build Coastguard Worker # TODO(b/240466571): This will be determined dynamically with the 83*7594170eSAndroid Build Coastguard Worker # linked bug 84*7594170eSAndroid Build Coastguard Worker includes = ["sysprop/include"], 85*7594170eSAndroid Build Coastguard Worker ), 86*7594170eSAndroid Build Coastguard Worker ] 87*7594170eSAndroid Build Coastguard Worker 88*7594170eSAndroid Build Coastguard Worker# Visible For Testing 89*7594170eSAndroid Build Coastguard Workercc_gen_sysprop = rule( 90*7594170eSAndroid Build Coastguard Worker implementation = _cc_gen_sysprop_impl, 91*7594170eSAndroid Build Coastguard Worker doc = """compilation of sysprop sources into cpp sources and headers""", 92*7594170eSAndroid Build Coastguard Worker attrs = { 93*7594170eSAndroid Build Coastguard Worker "dep": attr.label( 94*7594170eSAndroid Build Coastguard Worker providers = [SyspropGenInfo], 95*7594170eSAndroid Build Coastguard Worker mandatory = True, 96*7594170eSAndroid Build Coastguard Worker ), 97*7594170eSAndroid Build Coastguard Worker "_sysprop_cpp": attr.label( 98*7594170eSAndroid Build Coastguard Worker default = "//system/tools/sysprop:sysprop_cpp", 99*7594170eSAndroid Build Coastguard Worker executable = True, 100*7594170eSAndroid Build Coastguard Worker cfg = "exec", 101*7594170eSAndroid Build Coastguard Worker ), 102*7594170eSAndroid Build Coastguard Worker }, 103*7594170eSAndroid Build Coastguard Worker provides = [CcInfo], 104*7594170eSAndroid Build Coastguard Worker) 105*7594170eSAndroid Build Coastguard Worker 106*7594170eSAndroid Build Coastguard Workerdef _cc_gen_sysprop_common( 107*7594170eSAndroid Build Coastguard Worker name, 108*7594170eSAndroid Build Coastguard Worker dep): 109*7594170eSAndroid Build Coastguard Worker sysprop_gen_name = name + "_sysprop_gen" 110*7594170eSAndroid Build Coastguard Worker cc_gen_sysprop( 111*7594170eSAndroid Build Coastguard Worker name = sysprop_gen_name, 112*7594170eSAndroid Build Coastguard Worker dep = dep, 113*7594170eSAndroid Build Coastguard Worker tags = ["manual"], 114*7594170eSAndroid Build Coastguard Worker ) 115*7594170eSAndroid Build Coastguard Worker 116*7594170eSAndroid Build Coastguard Worker return sysprop_gen_name 117*7594170eSAndroid Build Coastguard Worker 118*7594170eSAndroid Build Coastguard Workersysprop_deps = select({ 119*7594170eSAndroid Build Coastguard Worker "//build/bazel_common_rules/platforms/os:android": ["//system/libbase:libbase_headers"], 120*7594170eSAndroid Build Coastguard Worker "//conditions:default": [ 121*7594170eSAndroid Build Coastguard Worker "//system/libbase:libbase_bp2build_cc_library_static", 122*7594170eSAndroid Build Coastguard Worker "//system/logging/liblog:liblog_bp2build_cc_library_static", 123*7594170eSAndroid Build Coastguard Worker ], 124*7594170eSAndroid Build Coastguard Worker}) 125*7594170eSAndroid Build Coastguard Worker 126*7594170eSAndroid Build Coastguard Workersysprop_dynamic_deps = select({ 127*7594170eSAndroid Build Coastguard Worker "//build/bazel_common_rules/platforms/os:android": [ 128*7594170eSAndroid Build Coastguard Worker "//system/logging/liblog", 129*7594170eSAndroid Build Coastguard Worker ], 130*7594170eSAndroid Build Coastguard Worker "//conditions:default": [], 131*7594170eSAndroid Build Coastguard Worker}) 132*7594170eSAndroid Build Coastguard Worker 133*7594170eSAndroid Build Coastguard Workerdef cc_sysprop_library_shared( 134*7594170eSAndroid Build Coastguard Worker name, 135*7594170eSAndroid Build Coastguard Worker dep, 136*7594170eSAndroid Build Coastguard Worker min_sdk_version = "", 137*7594170eSAndroid Build Coastguard Worker **kwargs): 138*7594170eSAndroid Build Coastguard Worker sysprop_gen_name = _cc_gen_sysprop_common(name, dep) 139*7594170eSAndroid Build Coastguard Worker 140*7594170eSAndroid Build Coastguard Worker cc_library_shared( 141*7594170eSAndroid Build Coastguard Worker name = name, 142*7594170eSAndroid Build Coastguard Worker srcs = [":" + sysprop_gen_name], 143*7594170eSAndroid Build Coastguard Worker min_sdk_version = min_sdk_version, 144*7594170eSAndroid Build Coastguard Worker deps = sysprop_deps + [sysprop_gen_name], 145*7594170eSAndroid Build Coastguard Worker dynamic_deps = sysprop_dynamic_deps, 146*7594170eSAndroid Build Coastguard Worker **kwargs 147*7594170eSAndroid Build Coastguard Worker ) 148*7594170eSAndroid Build Coastguard Worker 149*7594170eSAndroid Build Coastguard Workerdef cc_sysprop_library_static( 150*7594170eSAndroid Build Coastguard Worker name, 151*7594170eSAndroid Build Coastguard Worker dep, 152*7594170eSAndroid Build Coastguard Worker min_sdk_version = "", 153*7594170eSAndroid Build Coastguard Worker **kwargs): 154*7594170eSAndroid Build Coastguard Worker sysprop_gen_name = _cc_gen_sysprop_common(name, dep) 155*7594170eSAndroid Build Coastguard Worker cc_library_static( 156*7594170eSAndroid Build Coastguard Worker name = name, 157*7594170eSAndroid Build Coastguard Worker srcs = [":" + sysprop_gen_name], 158*7594170eSAndroid Build Coastguard Worker min_sdk_version = min_sdk_version, 159*7594170eSAndroid Build Coastguard Worker deps = sysprop_deps + [sysprop_gen_name], 160*7594170eSAndroid Build Coastguard Worker dynamic_deps = sysprop_dynamic_deps, 161*7594170eSAndroid Build Coastguard Worker **kwargs 162*7594170eSAndroid Build Coastguard Worker ) 163