xref: /aosp_15_r20/build/soong/xml/xml.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage xml
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
19*333d2b36SAndroid Build Coastguard Worker	"android/soong/etc"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Worker// prebuilt_etc_xml installs an xml file under <partition>/etc/<subdir>.
26*333d2b36SAndroid Build Coastguard Worker// It also optionally validates the xml file against the schema.
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Workervar (
29*333d2b36SAndroid Build Coastguard Worker	pctx = android.NewPackageContext("android/soong/xml")
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	xmllintDtd = pctx.AndroidStaticRule("xmllint-dtd",
32*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
33*333d2b36SAndroid Build Coastguard Worker			Command:     `$XmlLintCmd --dtdvalid $dtd $in > /dev/null && touch -a $out`,
34*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$XmlLintCmd"},
35*333d2b36SAndroid Build Coastguard Worker			Restat:      true,
36*333d2b36SAndroid Build Coastguard Worker		},
37*333d2b36SAndroid Build Coastguard Worker		"dtd")
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker	xmllintXsd = pctx.AndroidStaticRule("xmllint-xsd",
40*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
41*333d2b36SAndroid Build Coastguard Worker			Command:     `$XmlLintCmd --schema $xsd $in > /dev/null && touch -a $out`,
42*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$XmlLintCmd"},
43*333d2b36SAndroid Build Coastguard Worker			Restat:      true,
44*333d2b36SAndroid Build Coastguard Worker		},
45*333d2b36SAndroid Build Coastguard Worker		"xsd")
46*333d2b36SAndroid Build Coastguard Worker
47*333d2b36SAndroid Build Coastguard Worker	xmllintMinimal = pctx.AndroidStaticRule("xmllint-minimal",
48*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
49*333d2b36SAndroid Build Coastguard Worker			Command:     `$XmlLintCmd $in > /dev/null && touch -a $out`,
50*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$XmlLintCmd"},
51*333d2b36SAndroid Build Coastguard Worker			Restat:      true,
52*333d2b36SAndroid Build Coastguard Worker		})
53*333d2b36SAndroid Build Coastguard Worker)
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Workerfunc init() {
56*333d2b36SAndroid Build Coastguard Worker	registerXmlBuildComponents(android.InitRegistrationContext)
57*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("XmlLintCmd", "xmllint")
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workerfunc registerXmlBuildComponents(ctx android.RegistrationContext) {
61*333d2b36SAndroid Build Coastguard Worker	ctx.RegisterModuleType("prebuilt_etc_xml", PrebuiltEtcXmlFactory)
62*333d2b36SAndroid Build Coastguard Worker}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workertype prebuiltEtcXmlProperties struct {
65*333d2b36SAndroid Build Coastguard Worker	// Optional DTD that will be used to validate the xml file.
66*333d2b36SAndroid Build Coastguard Worker	Schema *string `android:"path"`
67*333d2b36SAndroid Build Coastguard Worker}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Workertype prebuiltEtcXml struct {
70*333d2b36SAndroid Build Coastguard Worker	etc.PrebuiltEtc
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	properties prebuiltEtcXmlProperties
73*333d2b36SAndroid Build Coastguard Worker}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltEtcXml) timestampFilePath(ctx android.ModuleContext) android.WritablePath {
76*333d2b36SAndroid Build Coastguard Worker	return android.PathForModuleOut(ctx, p.PrebuiltEtc.SourceFilePath(ctx).Base()+"-timestamp")
77*333d2b36SAndroid Build Coastguard Worker}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Workerfunc (p *prebuiltEtcXml) GenerateAndroidBuildActions(ctx android.ModuleContext) {
80*333d2b36SAndroid Build Coastguard Worker	p.PrebuiltEtc.GenerateAndroidBuildActions(ctx)
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker	if p.properties.Schema != nil {
83*333d2b36SAndroid Build Coastguard Worker		schema := android.PathForModuleSrc(ctx, proptools.String(p.properties.Schema))
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker		switch schema.Ext() {
86*333d2b36SAndroid Build Coastguard Worker		case ".dtd":
87*333d2b36SAndroid Build Coastguard Worker			ctx.Build(pctx, android.BuildParams{
88*333d2b36SAndroid Build Coastguard Worker				Rule:        xmllintDtd,
89*333d2b36SAndroid Build Coastguard Worker				Description: "xmllint-dtd",
90*333d2b36SAndroid Build Coastguard Worker				Input:       p.PrebuiltEtc.SourceFilePath(ctx),
91*333d2b36SAndroid Build Coastguard Worker				Output:      p.timestampFilePath(ctx),
92*333d2b36SAndroid Build Coastguard Worker				Implicit:    schema,
93*333d2b36SAndroid Build Coastguard Worker				Args: map[string]string{
94*333d2b36SAndroid Build Coastguard Worker					"dtd": schema.String(),
95*333d2b36SAndroid Build Coastguard Worker				},
96*333d2b36SAndroid Build Coastguard Worker			})
97*333d2b36SAndroid Build Coastguard Worker			break
98*333d2b36SAndroid Build Coastguard Worker		case ".xsd":
99*333d2b36SAndroid Build Coastguard Worker			ctx.Build(pctx, android.BuildParams{
100*333d2b36SAndroid Build Coastguard Worker				Rule:        xmllintXsd,
101*333d2b36SAndroid Build Coastguard Worker				Description: "xmllint-xsd",
102*333d2b36SAndroid Build Coastguard Worker				Input:       p.PrebuiltEtc.SourceFilePath(ctx),
103*333d2b36SAndroid Build Coastguard Worker				Output:      p.timestampFilePath(ctx),
104*333d2b36SAndroid Build Coastguard Worker				Implicit:    schema,
105*333d2b36SAndroid Build Coastguard Worker				Args: map[string]string{
106*333d2b36SAndroid Build Coastguard Worker					"xsd": schema.String(),
107*333d2b36SAndroid Build Coastguard Worker				},
108*333d2b36SAndroid Build Coastguard Worker			})
109*333d2b36SAndroid Build Coastguard Worker			break
110*333d2b36SAndroid Build Coastguard Worker		default:
111*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("schema", "not supported extension: %q", schema.Ext())
112*333d2b36SAndroid Build Coastguard Worker		}
113*333d2b36SAndroid Build Coastguard Worker	} else {
114*333d2b36SAndroid Build Coastguard Worker		// when schema is not specified, just check if the xml is well-formed
115*333d2b36SAndroid Build Coastguard Worker		ctx.Build(pctx, android.BuildParams{
116*333d2b36SAndroid Build Coastguard Worker			Rule:        xmllintMinimal,
117*333d2b36SAndroid Build Coastguard Worker			Description: "xmllint-minimal",
118*333d2b36SAndroid Build Coastguard Worker			Input:       p.PrebuiltEtc.SourceFilePath(ctx),
119*333d2b36SAndroid Build Coastguard Worker			Output:      p.timestampFilePath(ctx),
120*333d2b36SAndroid Build Coastguard Worker		})
121*333d2b36SAndroid Build Coastguard Worker	}
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Worker	p.SetAdditionalDependencies([]android.Path{p.timestampFilePath(ctx)})
124*333d2b36SAndroid Build Coastguard Worker}
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltEtcXmlFactory() android.Module {
127*333d2b36SAndroid Build Coastguard Worker	module := &prebuiltEtcXml{}
128*333d2b36SAndroid Build Coastguard Worker	module.AddProperties(&module.properties)
129*333d2b36SAndroid Build Coastguard Worker	etc.InitPrebuiltEtcModule(&module.PrebuiltEtc, "etc")
130*333d2b36SAndroid Build Coastguard Worker	// This module is device-only
131*333d2b36SAndroid Build Coastguard Worker	android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst)
132*333d2b36SAndroid Build Coastguard Worker	return module
133*333d2b36SAndroid Build Coastguard Worker}
134