blob: f6e5f62bf664316caaf03c7a30626f823ca002fa [file] [log] [blame]
Sundong Ahne1fe3202018-10-05 18:21:15 +09001// Copyright 2018 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package xsdc
16
17import (
Sundong Ahn851ddf02018-10-31 21:42:10 +090018 "android/soong/android"
19 "android/soong/java"
20 "path/filepath"
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090021 "strings"
Sundong Ahne1fe3202018-10-05 18:21:15 +090022
23 "github.com/google/blueprint"
24 "github.com/google/blueprint/proptools"
Sundong Ahne1fe3202018-10-05 18:21:15 +090025)
26
27func init() {
28 pctx.Import("android/soong/java/config")
29 android.RegisterModuleType("xsd_config", xsdConfigFactory)
30
31 android.PreArchMutators(func(ctx android.RegisterMutatorsContext) {
32 ctx.TopDown("xsd_config", xsdConfigMutator).Parallel()
33 })
34}
35
36var (
37 pctx = android.NewPackageContext("android/xsdc")
38
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090039 xsdc = pctx.HostBinToolVariable("xsdcCmd", "xsdc")
40 xsdcJavaRule = pctx.StaticRule("xsdcJavaRule", blueprint.RuleParams{
Sundong Ahne1fe3202018-10-05 18:21:15 +090041 Command: `rm -rf "${out}.temp" && mkdir -p "${out}.temp" && ` +
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090042 `${xsdcCmd} $in -p $pkgName -o ${out}.temp -j && ` +
Sundong Ahne1fe3202018-10-05 18:21:15 +090043 `${config.SoongZipCmd} -jar -o ${out} -C ${out}.temp -D ${out}.temp && ` +
44 `rm -rf ${out}.temp`,
Sundong Ahne1fe3202018-10-05 18:21:15 +090045 CommandDeps: []string{"${xsdcCmd}", "${config.SoongZipCmd}"},
46 Description: "xsdc Java ${in} => ${out}",
47 }, "pkgName")
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090048
49 xsdcCppRule = pctx.StaticRule("xsdcCppRule", blueprint.RuleParams{
50 Command: `rm -rf "${outDir}" && ` +
51 `${xsdcCmd} $in -p $pkgName -o ${outDir} -c`,
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090052 CommandDeps: []string{"${xsdcCmd}", "${config.SoongZipCmd}"},
Yifan Hong70080b72019-02-01 12:10:06 -080053 Description: "xsdc C++ ${in} => ${out}",
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090054 }, "pkgName", "outDir")
Sundong Ahne1fe3202018-10-05 18:21:15 +090055)
56
57type xsdConfigProperties struct {
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090058 Srcs []string
Sundong Ahne1fe3202018-10-05 18:21:15 +090059 Package_name *string
Sundong Ahna12a9622019-02-22 18:17:17 +090060 Api_dir *string
Sundong Ahne1fe3202018-10-05 18:21:15 +090061}
62
63type xsdConfig struct {
64 android.ModuleBase
65
66 properties xsdConfigProperties
67
68 genOutputDir android.Path
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090069 genOutputs_j android.WritablePath
70 genOutputs_c android.WritablePath
71 genOutputs_h android.WritablePath
72
73 docsPath android.Path
Sundong Ahne1fe3202018-10-05 18:21:15 +090074}
75
76type ApiToCheck struct {
77 Api_file *string
78 Removed_api_file *string
79 Args *string
80}
81
82type CheckApi struct {
83 Last_released ApiToCheck
84 Current ApiToCheck
85}
86type DroidstubsProperties struct {
87 Name *string
88 No_framework_libs *bool
89 Installable *bool
90 Srcs []string
91 Args *string
92 Api_filename *string
93 Removed_api_filename *string
94 Check_api CheckApi
95}
96
97func (module *xsdConfig) GeneratedSourceFiles() android.Paths {
Sundong Ahnf3eb83e2018-10-12 12:12:10 +090098 return android.Paths{module.genOutputs_c}
Sundong Ahne1fe3202018-10-05 18:21:15 +090099}
100
101func (module *xsdConfig) Srcs() android.Paths {
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900102 return android.Paths{module.genOutputs_j}
Sundong Ahne1fe3202018-10-05 18:21:15 +0900103}
104
105func (module *xsdConfig) GeneratedDeps() android.Paths {
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900106 return android.Paths{module.genOutputs_h}
Sundong Ahne1fe3202018-10-05 18:21:15 +0900107}
108
109func (module *xsdConfig) GeneratedHeaderDirs() android.Paths {
110 return android.Paths{module.genOutputDir}
111}
112
113func (module *xsdConfig) DepsMutator(ctx android.BottomUpMutatorContext) {
Sundong Ahnec680e12019-02-08 14:40:31 +0900114 android.ExtractSourcesDeps(ctx, module.properties.Srcs)
Sundong Ahne1fe3202018-10-05 18:21:15 +0900115}
116
117func (module *xsdConfig) GenerateAndroidBuildActions(ctx android.ModuleContext) {
118 if len(module.properties.Srcs) != 1 {
119 ctx.PropertyErrorf("srcs", "xsd_config must be one src")
120 }
121
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900122 ctx.VisitDirectDeps(func(to android.Module) {
123 if doc, ok := to.(java.ApiFilePath); ok {
124 module.docsPath = doc.ApiFilePath()
125 }
126 })
127
Sundong Ahnec680e12019-02-08 14:40:31 +0900128 srcFiles := ctx.ExpandSources(module.properties.Srcs, nil)
129 xsdFile := srcFiles[0]
130
Sundong Ahne1fe3202018-10-05 18:21:15 +0900131 pkgName := *module.properties.Package_name
132
Sundong Ahn851ddf02018-10-31 21:42:10 +0900133 module.genOutputs_j = android.PathForModuleGen(ctx, "java", "xsdcgen.srcjar")
Sundong Ahne1fe3202018-10-05 18:21:15 +0900134
135 ctx.Build(pctx, android.BuildParams{
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900136 Rule: xsdcJavaRule,
Sundong Ahnec680e12019-02-08 14:40:31 +0900137 Description: "xsdc " + xsdFile.String(),
138 Input: xsdFile,
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900139 Implicit: module.docsPath,
140 Output: module.genOutputs_j,
Sundong Ahne1fe3202018-10-05 18:21:15 +0900141 Args: map[string]string{
142 "pkgName": pkgName,
143 },
144 })
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900145
146 pkgName = strings.Replace(pkgName, ".", "_", -1)
Sundong Ahn851ddf02018-10-31 21:42:10 +0900147 module.genOutputs_c = android.PathForModuleGen(ctx, "cpp", pkgName+".cpp")
148 module.genOutputs_h = android.PathForModuleGen(ctx, "cpp", "include/"+pkgName+".h")
149 module.genOutputDir = android.PathForModuleGen(ctx, "cpp", "include")
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900150
151 ctx.Build(pctx, android.BuildParams{
152 Rule: xsdcCppRule,
Sundong Ahnec680e12019-02-08 14:40:31 +0900153 Description: "xsdc " + xsdFile.String(),
154 Input: xsdFile,
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900155 Implicit: module.docsPath,
156 Output: module.genOutputs_c,
157 ImplicitOutput: module.genOutputs_h,
158 Args: map[string]string{
159 "pkgName": pkgName,
Sundong Ahn851ddf02018-10-31 21:42:10 +0900160 "outDir": android.PathForModuleGen(ctx, "cpp").String(),
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900161 },
162 })
Sundong Ahne1fe3202018-10-05 18:21:15 +0900163}
164
165func xsdConfigMutator(mctx android.TopDownMutatorContext) {
166 if module, ok := mctx.Module().(*xsdConfig); ok {
167 name := module.BaseModuleName()
168
169 args := " --stub-packages " + *module.properties.Package_name +
170 " --hide MissingPermission --hide BroadcastBehavior" +
171 " --hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol" +
172 " --hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo"
173
Sundong Ahna12a9622019-02-22 18:17:17 +0900174 api_dir := proptools.StringDefault(module.properties.Api_dir, "api")
175
176 currentApiFileName := filepath.Join(api_dir, "current.txt")
177 removedApiFileName := filepath.Join(api_dir, "removed.txt")
Sundong Ahne1fe3202018-10-05 18:21:15 +0900178
179 check_api := CheckApi{}
180
181 check_api.Current.Api_file = proptools.StringPtr(currentApiFileName)
182 check_api.Current.Removed_api_file = proptools.StringPtr(removedApiFileName)
183
184 check_api.Last_released.Api_file = proptools.StringPtr(
Sundong Ahna12a9622019-02-22 18:17:17 +0900185 filepath.Join(api_dir, "last_current.txt"))
Sundong Ahne1fe3202018-10-05 18:21:15 +0900186 check_api.Last_released.Removed_api_file = proptools.StringPtr(
Sundong Ahna12a9622019-02-22 18:17:17 +0900187 filepath.Join(api_dir, "last_removed.txt"))
Sundong Ahne1fe3202018-10-05 18:21:15 +0900188
Sundong Ahne1fe3202018-10-05 18:21:15 +0900189 mctx.CreateModule(android.ModuleFactoryAdaptor(java.DroidstubsFactory), &DroidstubsProperties{
Sundong Ahnf3eb83e2018-10-12 12:12:10 +0900190 Name: proptools.StringPtr(name + ".docs"),
Sundong Ahne1fe3202018-10-05 18:21:15 +0900191 Srcs: []string{":" + name},
192 Args: proptools.StringPtr(args),
193 Api_filename: proptools.StringPtr(currentApiFileName),
194 Removed_api_filename: proptools.StringPtr(removedApiFileName),
195 Check_api: check_api,
196 Installable: proptools.BoolPtr(false),
197 No_framework_libs: proptools.BoolPtr(true),
198 })
199 }
200}
201
202func xsdConfigFactory() android.Module {
203 module := &xsdConfig{}
204 module.AddProperties(&module.properties)
205 android.InitAndroidModule(module)
206
207 return module
208}