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(":prebuilt_file.bzl", "PrebuiltFileInfo") 16*7594170eSAndroid Build Coastguard Worker 17*7594170eSAndroid Build Coastguard Workerdef _prebuilt_xml_impl(ctx): 18*7594170eSAndroid Build Coastguard Worker schema = ctx.file.schema 19*7594170eSAndroid Build Coastguard Worker 20*7594170eSAndroid Build Coastguard Worker src = ctx.file.src 21*7594170eSAndroid Build Coastguard Worker 22*7594170eSAndroid Build Coastguard Worker args = ctx.actions.args() 23*7594170eSAndroid Build Coastguard Worker inputs = [src] 24*7594170eSAndroid Build Coastguard Worker 25*7594170eSAndroid Build Coastguard Worker if schema != None: 26*7594170eSAndroid Build Coastguard Worker if schema.extension == "dtd": 27*7594170eSAndroid Build Coastguard Worker args.add("--dtdvalid", schema.path) 28*7594170eSAndroid Build Coastguard Worker elif schema.extension == "xsd": 29*7594170eSAndroid Build Coastguard Worker args.add("--schema", schema.path) 30*7594170eSAndroid Build Coastguard Worker inputs.append(schema) 31*7594170eSAndroid Build Coastguard Worker 32*7594170eSAndroid Build Coastguard Worker args.add(src) 33*7594170eSAndroid Build Coastguard Worker args.add(">") 34*7594170eSAndroid Build Coastguard Worker args.add("/dev/null") 35*7594170eSAndroid Build Coastguard Worker args.add("&&") 36*7594170eSAndroid Build Coastguard Worker args.add("touch") 37*7594170eSAndroid Build Coastguard Worker args.add("-a") 38*7594170eSAndroid Build Coastguard Worker 39*7594170eSAndroid Build Coastguard Worker validation_output = ctx.actions.declare_file(ctx.attr.name + ".validation") 40*7594170eSAndroid Build Coastguard Worker args.add(validation_output.path) 41*7594170eSAndroid Build Coastguard Worker 42*7594170eSAndroid Build Coastguard Worker ctx.actions.run( 43*7594170eSAndroid Build Coastguard Worker outputs = [validation_output], 44*7594170eSAndroid Build Coastguard Worker inputs = inputs, 45*7594170eSAndroid Build Coastguard Worker executable = ctx.executable._xml_validation_tool, 46*7594170eSAndroid Build Coastguard Worker arguments = [args], 47*7594170eSAndroid Build Coastguard Worker mnemonic = "XMLValidation", 48*7594170eSAndroid Build Coastguard Worker ) 49*7594170eSAndroid Build Coastguard Worker 50*7594170eSAndroid Build Coastguard Worker filename = "" 51*7594170eSAndroid Build Coastguard Worker 52*7594170eSAndroid Build Coastguard Worker if ctx.attr.filename_from_src and ctx.attr.filename != "": 53*7594170eSAndroid Build Coastguard Worker fail("filename is set. filename_from_src cannot be true") 54*7594170eSAndroid Build Coastguard Worker elif ctx.attr.filename != "": 55*7594170eSAndroid Build Coastguard Worker filename = ctx.attr.filename 56*7594170eSAndroid Build Coastguard Worker elif ctx.attr.filename_from_src: 57*7594170eSAndroid Build Coastguard Worker filename = src 58*7594170eSAndroid Build Coastguard Worker else: 59*7594170eSAndroid Build Coastguard Worker filename = ctx.attrs.name 60*7594170eSAndroid Build Coastguard Worker 61*7594170eSAndroid Build Coastguard Worker return [ 62*7594170eSAndroid Build Coastguard Worker PrebuiltFileInfo( 63*7594170eSAndroid Build Coastguard Worker src = src, 64*7594170eSAndroid Build Coastguard Worker dir = "etc/xml", 65*7594170eSAndroid Build Coastguard Worker filename = filename, 66*7594170eSAndroid Build Coastguard Worker ), 67*7594170eSAndroid Build Coastguard Worker DefaultInfo(files = depset([src])), 68*7594170eSAndroid Build Coastguard Worker OutputGroupInfo(_validation = depset([validation_output])), 69*7594170eSAndroid Build Coastguard Worker ] 70*7594170eSAndroid Build Coastguard Worker 71*7594170eSAndroid Build Coastguard Workerprebuilt_xml = rule( 72*7594170eSAndroid Build Coastguard Worker doc = """ 73*7594170eSAndroid Build Coastguard Worker prebuilt_etc_xml installs an xml file under <partition>/etc/<subdir>. 74*7594170eSAndroid Build Coastguard Worker It also optionally validates the xml file against the schema. 75*7594170eSAndroid Build Coastguard Worker """, 76*7594170eSAndroid Build Coastguard Worker implementation = _prebuilt_xml_impl, 77*7594170eSAndroid Build Coastguard Worker attrs = { 78*7594170eSAndroid Build Coastguard Worker "src": attr.label( 79*7594170eSAndroid Build Coastguard Worker mandatory = True, 80*7594170eSAndroid Build Coastguard Worker allow_single_file = True, 81*7594170eSAndroid Build Coastguard Worker ), 82*7594170eSAndroid Build Coastguard Worker "schema": attr.label( 83*7594170eSAndroid Build Coastguard Worker allow_single_file = [".dtd", ".xsd"], 84*7594170eSAndroid Build Coastguard Worker doc = "Optional DTD or XSD that will be used to validate the xml file", 85*7594170eSAndroid Build Coastguard Worker ), 86*7594170eSAndroid Build Coastguard Worker "filename": attr.string(doc = "Optional name for the installed file"), 87*7594170eSAndroid Build Coastguard Worker "filename_from_src": attr.bool( 88*7594170eSAndroid Build Coastguard Worker doc = "Optional. When filename is not provided and" + 89*7594170eSAndroid Build Coastguard Worker "filename_from_src is true, name for the installed file" + 90*7594170eSAndroid Build Coastguard Worker "will be set from src", 91*7594170eSAndroid Build Coastguard Worker ), 92*7594170eSAndroid Build Coastguard Worker "_xml_validation_tool": attr.label( 93*7594170eSAndroid Build Coastguard Worker default = "//external/libxml2:xmllint", 94*7594170eSAndroid Build Coastguard Worker executable = True, 95*7594170eSAndroid Build Coastguard Worker cfg = "exec", 96*7594170eSAndroid Build Coastguard Worker ), 97*7594170eSAndroid Build Coastguard Worker }, 98*7594170eSAndroid Build Coastguard Worker) 99