blob: 959f1c7340cbb2d7a0dba5ef30cf2f957f029338 [file] [log] [blame]
Nan Zhang581fd212018-01-10 16:06:12 -08001// 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 java
16
17import (
Nan Zhang581fd212018-01-10 16:06:12 -080018 "fmt"
Nan Zhangb2b33de2018-02-23 11:18:47 -080019 "path/filepath"
Nan Zhang581fd212018-01-10 16:06:12 -080020 "strings"
21
Paul Duffin13879572019-11-28 14:31:38 +000022 "github.com/google/blueprint"
Jeongik Cha6bd33c12019-06-25 16:26:18 +090023 "github.com/google/blueprint/proptools"
Nan Zhang581fd212018-01-10 16:06:12 -080024
Colin Crossab054432019-07-15 16:13:59 -070025 "android/soong/android"
26 "android/soong/java/config"
Nan Zhang581fd212018-01-10 16:06:12 -080027)
28
29func init() {
Paul Duffin884363e2019-12-19 10:21:09 +000030 RegisterDocsBuildComponents(android.InitRegistrationContext)
31 RegisterStubsBuildComponents(android.InitRegistrationContext)
Paul Duffin255f18e2019-12-13 11:22:16 +000032
33 // Register sdk member type.
34 android.RegisterSdkMemberType(&droidStubsSdkMemberType{
35 SdkMemberTypeBase: android.SdkMemberTypeBase{
36 PropertyName: "stubs_sources",
Paul Duffine6029182019-12-16 17:43:48 +000037 // stubs_sources can be used with sdk to provide the source stubs for APIs provided by
38 // the APEX.
39 SupportsSdk: true,
Paul Duffin255f18e2019-12-13 11:22:16 +000040 },
41 })
Nan Zhang581fd212018-01-10 16:06:12 -080042}
43
Paul Duffin884363e2019-12-19 10:21:09 +000044func RegisterDocsBuildComponents(ctx android.RegistrationContext) {
45 ctx.RegisterModuleType("doc_defaults", DocDefaultsFactory)
46
47 ctx.RegisterModuleType("droiddoc", DroiddocFactory)
48 ctx.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
49 ctx.RegisterModuleType("droiddoc_exported_dir", ExportedDroiddocDirFactory)
50 ctx.RegisterModuleType("javadoc", JavadocFactory)
51 ctx.RegisterModuleType("javadoc_host", JavadocHostFactory)
52}
53
54func RegisterStubsBuildComponents(ctx android.RegistrationContext) {
55 ctx.RegisterModuleType("stubs_defaults", StubsDefaultsFactory)
56
57 ctx.RegisterModuleType("droidstubs", DroidstubsFactory)
58 ctx.RegisterModuleType("droidstubs_host", DroidstubsHostFactory)
59
60 ctx.RegisterModuleType("prebuilt_stubs_sources", PrebuiltStubsSourcesFactory)
61}
62
Colin Crossa1ce2a02018-06-20 15:19:39 -070063var (
64 srcsLibTag = dependencyTag{name: "sources from javalib"}
65)
66
Nan Zhang581fd212018-01-10 16:06:12 -080067type JavadocProperties struct {
68 // list of source files used to compile the Java module. May be .java, .logtags, .proto,
69 // or .aidl files.
Colin Cross27b922f2019-03-04 22:35:41 -080070 Srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -080071
72 // list of directories rooted at the Android.bp file that will
73 // be added to the search paths for finding source files when passing package names.
Nan Zhangb2b33de2018-02-23 11:18:47 -080074 Local_sourcepaths []string
Nan Zhang581fd212018-01-10 16:06:12 -080075
76 // list of source files that should not be used to build the Java module.
77 // This is most useful in the arch/multilib variants to remove non-common files
78 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -080079 Exclude_srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -080080
Jiyong Parkc6ddccf2019-09-13 20:56:14 +090081 // list of package names that should actually be used. If this property is left unspecified,
82 // all the sources from the srcs property is used.
83 Filter_packages []string
84
Nan Zhangb2b33de2018-02-23 11:18:47 -080085 // list of java libraries that will be in the classpath.
Nan Zhang581fd212018-01-10 16:06:12 -080086 Libs []string `android:"arch_variant"`
87
88 // If set to false, don't allow this module(-docs.zip) to be exported. Defaults to true.
Nan Zhangb2b33de2018-02-23 11:18:47 -080089 Installable *bool
Nan Zhang581fd212018-01-10 16:06:12 -080090
Paul Duffine25c6442019-10-11 13:50:28 +010091 // if not blank, set to the version of the sdk to compile against.
92 // Defaults to compiling against the current platform.
Nan Zhang581fd212018-01-10 16:06:12 -080093 Sdk_version *string `android:"arch_variant"`
Jiyong Park1e440682018-05-23 18:42:04 +090094
Paul Duffine25c6442019-10-11 13:50:28 +010095 // When targeting 1.9 and above, override the modules to use with --system,
96 // otherwise provides defaults libraries to add to the bootclasspath.
97 // Defaults to "none"
98 System_modules *string
99
Jiyong Park1e440682018-05-23 18:42:04 +0900100 Aidl struct {
101 // Top level directories to pass to aidl tool
102 Include_dirs []string
103
104 // Directories rooted at the Android.bp file to pass to aidl tool
105 Local_include_dirs []string
106 }
Nan Zhang357466b2018-04-17 17:38:36 -0700107
108 // If not blank, set the java version passed to javadoc as -source
109 Java_version *string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700110
111 // local files that are used within user customized droiddoc options.
Colin Cross27b922f2019-03-04 22:35:41 -0800112 Arg_files []string `android:"path"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700113
114 // user customized droiddoc args.
115 // Available variables for substitution:
116 //
117 // $(location <label>): the path to the arg_files with name <label>
Colin Crosse4a05842019-05-28 10:17:14 -0700118 // $$: a literal $
Nan Zhang1598a9e2018-09-04 17:14:32 -0700119 Args *string
120
121 // names of the output files used in args that will be generated
122 Out []string
Nan Zhang581fd212018-01-10 16:06:12 -0800123}
124
Nan Zhang61819ce2018-05-04 18:49:16 -0700125type ApiToCheck struct {
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900126 // path to the API txt file that the new API extracted from source code is checked
127 // against. The path can be local to the module or from other module (via :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800128 Api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700129
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900130 // path to the API txt file that the new @removed API extractd from source code is
131 // checked against. The path can be local to the module or from other module (via
132 // :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800133 Removed_api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700134
Adrian Roos14f75a92019-08-12 17:54:09 +0200135 // If not blank, path to the baseline txt file for approved API check violations.
136 Baseline_file *string `android:"path"`
137
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900138 // Arguments to the apicheck tool.
Nan Zhang61819ce2018-05-04 18:49:16 -0700139 Args *string
140}
141
Nan Zhang581fd212018-01-10 16:06:12 -0800142type DroiddocProperties struct {
143 // directory relative to top of the source tree that contains doc templates files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800144 Custom_template *string
Nan Zhang581fd212018-01-10 16:06:12 -0800145
Nan Zhanga40da042018-08-01 12:48:00 -0700146 // directories under current module source which contains html/jd files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800147 Html_dirs []string
Nan Zhang581fd212018-01-10 16:06:12 -0800148
149 // set a value in the Clearsilver hdf namespace.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800150 Hdf []string
Nan Zhang581fd212018-01-10 16:06:12 -0800151
152 // proofread file contains all of the text content of the javadocs concatenated into one file,
153 // suitable for spell-checking and other goodness.
Colin Crossab054432019-07-15 16:13:59 -0700154 Proofread_file *string
Nan Zhang581fd212018-01-10 16:06:12 -0800155
156 // a todo file lists the program elements that are missing documentation.
157 // At some point, this might be improved to show more warnings.
Colin Cross27b922f2019-03-04 22:35:41 -0800158 Todo_file *string `android:"path"`
Nan Zhangb2b33de2018-02-23 11:18:47 -0800159
160 // directory under current module source that provide additional resources (images).
161 Resourcesdir *string
162
163 // resources output directory under out/soong/.intermediates.
164 Resourcesoutdir *string
Nan Zhang581fd212018-01-10 16:06:12 -0800165
Nan Zhange2ba5d42018-07-11 15:16:55 -0700166 // if set to true, collect the values used by the Dev tools and
167 // write them in files packaged with the SDK. Defaults to false.
168 Write_sdk_values *bool
169
170 // index.html under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800171 Static_doc_index_redirect *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700172
173 // source.properties under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800174 Static_doc_properties *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700175
Nan Zhang581fd212018-01-10 16:06:12 -0800176 // a list of files under current module source dir which contains known tags in Java sources.
177 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -0800178 Knowntags []string `android:"path"`
Nan Zhang28c68b92018-03-13 16:17:01 -0700179
180 // the tag name used to distinguish if the API files belong to public/system/test.
181 Api_tag_name *string
182
183 // the generated public API filename by Doclava.
184 Api_filename *string
185
David Brazdilfbe4cc32018-05-31 13:56:46 +0100186 // the generated public Dex API filename by Doclava.
187 Dex_api_filename *string
188
Nan Zhang28c68b92018-03-13 16:17:01 -0700189 // the generated private API filename by Doclava.
190 Private_api_filename *string
191
192 // the generated private Dex API filename by Doclava.
193 Private_dex_api_filename *string
194
195 // the generated removed API filename by Doclava.
196 Removed_api_filename *string
197
David Brazdilaac0c3c2018-04-24 16:23:29 +0100198 // the generated removed Dex API filename by Doclava.
199 Removed_dex_api_filename *string
200
Mathew Inwood76c3de12018-06-22 15:28:11 +0100201 // mapping of dex signatures to source file and line number. This is a temporary property and
202 // will be deleted; you probably shouldn't be using it.
203 Dex_mapping_filename *string
204
Nan Zhang28c68b92018-03-13 16:17:01 -0700205 // the generated exact API filename by Doclava.
206 Exact_api_filename *string
Nan Zhang853f4202018-04-12 16:55:56 -0700207
Nan Zhang66dc2362018-08-14 20:41:04 -0700208 // the generated proguard filename by Doclava.
209 Proguard_filename *string
210
Nan Zhang853f4202018-04-12 16:55:56 -0700211 // if set to false, don't allow droiddoc to generate stubs source files. Defaults to true.
212 Create_stubs *bool
Nan Zhang61819ce2018-05-04 18:49:16 -0700213
214 Check_api struct {
215 Last_released ApiToCheck
216
217 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900218
219 // do not perform API check against Last_released, in the case that both two specified API
220 // files by Last_released are modules which don't exist.
221 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700222 }
Nan Zhang79614d12018-04-19 18:03:39 -0700223
Nan Zhang1598a9e2018-09-04 17:14:32 -0700224 // if set to true, generate docs through Dokka instead of Doclava.
225 Dokka_enabled *bool
Mathew Inwoodabd49ab2019-12-19 14:27:08 +0000226
227 // Compat config XML. Generates compat change documentation if set.
228 Compat_config *string `android:"path"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700229}
230
231type DroidstubsProperties struct {
232 // the tag name used to distinguish if the API files belong to public/system/test.
233 Api_tag_name *string
234
Nan Zhang199645c2018-09-19 12:40:06 -0700235 // the generated public API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700236 Api_filename *string
237
Nan Zhang199645c2018-09-19 12:40:06 -0700238 // the generated public Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700239 Dex_api_filename *string
240
Nan Zhang199645c2018-09-19 12:40:06 -0700241 // the generated private API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700242 Private_api_filename *string
243
Nan Zhang199645c2018-09-19 12:40:06 -0700244 // the generated private Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700245 Private_dex_api_filename *string
246
Nan Zhang199645c2018-09-19 12:40:06 -0700247 // the generated removed API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700248 Removed_api_filename *string
249
Nan Zhang199645c2018-09-19 12:40:06 -0700250 // the generated removed Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700251 Removed_dex_api_filename *string
252
Nan Zhang9c69a122018-08-22 10:22:08 -0700253 // mapping of dex signatures to source file and line number. This is a temporary property and
254 // will be deleted; you probably shouldn't be using it.
255 Dex_mapping_filename *string
256
Nan Zhang199645c2018-09-19 12:40:06 -0700257 // the generated exact API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700258 Exact_api_filename *string
259
Nan Zhang199645c2018-09-19 12:40:06 -0700260 // the generated proguard filename by Metalava.
261 Proguard_filename *string
262
Nan Zhang1598a9e2018-09-04 17:14:32 -0700263 Check_api struct {
264 Last_released ApiToCheck
265
266 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900267
268 // do not perform API check against Last_released, in the case that both two specified API
269 // files by Last_released are modules which don't exist.
270 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Adrian Roos075eedc2019-10-10 12:07:03 +0200271
272 Api_lint struct {
273 Enabled *bool
274
275 // If set, performs api_lint on any new APIs not found in the given signature file
276 New_since *string `android:"path"`
277
278 // If not blank, path to the baseline txt file for approved API lint violations.
279 Baseline_file *string `android:"path"`
280 }
Nan Zhang1598a9e2018-09-04 17:14:32 -0700281 }
Nan Zhang79614d12018-04-19 18:03:39 -0700282
283 // user can specify the version of previous released API file in order to do compatibility check.
Colin Cross27b922f2019-03-04 22:35:41 -0800284 Previous_api *string `android:"path"`
Nan Zhang79614d12018-04-19 18:03:39 -0700285
286 // is set to true, Metalava will allow framework SDK to contain annotations.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700287 Annotations_enabled *bool
Nan Zhang79614d12018-04-19 18:03:39 -0700288
Pete Gillin77167902018-09-19 18:16:26 +0100289 // a list of top-level directories containing files to merge qualifier annotations (i.e. those intended to be included in the stubs written) from.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700290 Merge_annotations_dirs []string
Nan Zhang86d2d552018-08-09 15:33:27 -0700291
Pete Gillin77167902018-09-19 18:16:26 +0100292 // a list of top-level directories containing Java stub files to merge show/hide annotations from.
293 Merge_inclusion_annotations_dirs []string
294
Pete Gillinc382a562018-11-14 18:45:46 +0000295 // a file containing a list of classes to do nullability validation for.
296 Validate_nullability_from_list *string
297
Pete Gillin581d6082018-10-22 15:55:04 +0100298 // a file containing expected warnings produced by validation of nullability annotations.
299 Check_nullability_warnings *string
300
Nan Zhang1598a9e2018-09-04 17:14:32 -0700301 // if set to true, allow Metalava to generate doc_stubs source files. Defaults to false.
302 Create_doc_stubs *bool
Nan Zhang9c69a122018-08-22 10:22:08 -0700303
304 // is set to true, Metalava will allow framework SDK to contain API levels annotations.
305 Api_levels_annotations_enabled *bool
306
307 // the dirs which Metalava extracts API levels annotations from.
308 Api_levels_annotations_dirs []string
309
310 // if set to true, collect the values used by the Dev tools and
311 // write them in files packaged with the SDK. Defaults to false.
312 Write_sdk_values *bool
Nan Zhang71bbe632018-09-17 14:32:21 -0700313
314 // If set to true, .xml based public API file will be also generated, and
315 // JDiff tool will be invoked to genreate javadoc files. Defaults to false.
316 Jdiff_enabled *bool
Nan Zhang581fd212018-01-10 16:06:12 -0800317}
318
Nan Zhanga40da042018-08-01 12:48:00 -0700319//
320// Common flags passed down to build rule
321//
322type droiddocBuilderFlags struct {
Nan Zhang86d2d552018-08-09 15:33:27 -0700323 bootClasspathArgs string
324 classpathArgs string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700325 sourcepathArgs string
Nan Zhang86d2d552018-08-09 15:33:27 -0700326 dokkaClasspathArgs string
327 aidlFlags string
Colin Cross3047fa22019-04-18 10:56:44 -0700328 aidlDeps android.Paths
Nan Zhanga40da042018-08-01 12:48:00 -0700329
Nan Zhanga40da042018-08-01 12:48:00 -0700330 doclavaStubsFlags string
Nan Zhang86d2d552018-08-09 15:33:27 -0700331 doclavaDocsFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700332 postDoclavaCmds string
Nan Zhanga40da042018-08-01 12:48:00 -0700333}
334
335func InitDroiddocModule(module android.DefaultableModule, hod android.HostOrDeviceSupported) {
336 android.InitAndroidArchModule(module, hod, android.MultilibCommon)
337 android.InitDefaultableModule(module)
338}
339
Luca Stefanid63ea0a2019-09-01 21:49:45 +0200340func apiCheckEnabled(ctx android.ModuleContext, apiToCheck ApiToCheck, apiVersionTag string) bool {
341 if ctx.Config().IsEnvTrue("WITHOUT_CHECK_API") {
342 return false
343 } else if String(apiToCheck.Api_file) != "" && String(apiToCheck.Removed_api_file) != "" {
Nan Zhang1598a9e2018-09-04 17:14:32 -0700344 return true
345 } else if String(apiToCheck.Api_file) != "" {
346 panic("for " + apiVersionTag + " removed_api_file has to be non-empty!")
347 } else if String(apiToCheck.Removed_api_file) != "" {
348 panic("for " + apiVersionTag + " api_file has to be non-empty!")
349 }
350
351 return false
352}
353
Inseob Kim38449af2019-02-28 14:24:05 +0900354func ignoreMissingModules(ctx android.BottomUpMutatorContext, apiToCheck *ApiToCheck) {
355 api_file := String(apiToCheck.Api_file)
356 removed_api_file := String(apiToCheck.Removed_api_file)
357
358 api_module := android.SrcIsModule(api_file)
359 removed_api_module := android.SrcIsModule(removed_api_file)
360
361 if api_module == "" || removed_api_module == "" {
362 return
363 }
364
365 if ctx.OtherModuleExists(api_module) || ctx.OtherModuleExists(removed_api_module) {
366 return
367 }
368
369 apiToCheck.Api_file = nil
370 apiToCheck.Removed_api_file = nil
371}
372
Nan Zhang1598a9e2018-09-04 17:14:32 -0700373type ApiFilePath interface {
374 ApiFilePath() android.Path
375}
376
Nan Zhanga40da042018-08-01 12:48:00 -0700377//
378// Javadoc
379//
Nan Zhang581fd212018-01-10 16:06:12 -0800380type Javadoc struct {
381 android.ModuleBase
382 android.DefaultableModuleBase
383
384 properties JavadocProperties
385
386 srcJars android.Paths
387 srcFiles android.Paths
388 sourcepaths android.Paths
Nan Zhang1598a9e2018-09-04 17:14:32 -0700389 argFiles android.Paths
390
391 args string
Nan Zhang581fd212018-01-10 16:06:12 -0800392
Nan Zhangccff0f72018-03-08 17:26:16 -0800393 docZip android.WritablePath
394 stubsSrcJar android.WritablePath
Nan Zhang581fd212018-01-10 16:06:12 -0800395}
396
Colin Cross41955e82019-05-29 14:40:35 -0700397func (j *Javadoc) OutputFiles(tag string) (android.Paths, error) {
398 switch tag {
399 case "":
400 return android.Paths{j.stubsSrcJar}, nil
Colin Crosse68e5542019-08-12 13:11:40 -0700401 case ".docs.zip":
402 return android.Paths{j.docZip}, nil
Colin Cross41955e82019-05-29 14:40:35 -0700403 default:
404 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
405 }
Nan Zhangb2b33de2018-02-23 11:18:47 -0800406}
407
Colin Crossa3002fc2019-07-08 16:48:04 -0700408// javadoc converts .java source files to documentation using javadoc.
Nan Zhang581fd212018-01-10 16:06:12 -0800409func JavadocFactory() android.Module {
410 module := &Javadoc{}
411
412 module.AddProperties(&module.properties)
413
414 InitDroiddocModule(module, android.HostAndDeviceSupported)
415 return module
416}
417
Colin Crossa3002fc2019-07-08 16:48:04 -0700418// javadoc_host converts .java source files to documentation using javadoc.
Nan Zhang581fd212018-01-10 16:06:12 -0800419func JavadocHostFactory() android.Module {
420 module := &Javadoc{}
421
422 module.AddProperties(&module.properties)
423
424 InitDroiddocModule(module, android.HostSupported)
425 return module
426}
427
Colin Cross41955e82019-05-29 14:40:35 -0700428var _ android.OutputFileProducer = (*Javadoc)(nil)
Nan Zhang581fd212018-01-10 16:06:12 -0800429
Jiyong Park6a927c42020-01-21 02:03:43 +0900430func (j *Javadoc) sdkVersion() sdkSpec {
431 return sdkSpecFrom(String(j.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700432}
433
Paul Duffine25c6442019-10-11 13:50:28 +0100434func (j *Javadoc) systemModules() string {
435 return proptools.String(j.properties.System_modules)
436}
437
Jiyong Park6a927c42020-01-21 02:03:43 +0900438func (j *Javadoc) minSdkVersion() sdkSpec {
Colin Cross83bb3162018-06-25 15:48:06 -0700439 return j.sdkVersion()
440}
441
Jiyong Park6a927c42020-01-21 02:03:43 +0900442func (j *Javadoc) targetSdkVersion() sdkSpec {
Dan Willemsen419290a2018-10-31 15:28:47 -0700443 return j.sdkVersion()
444}
445
Nan Zhang581fd212018-01-10 16:06:12 -0800446func (j *Javadoc) addDeps(ctx android.BottomUpMutatorContext) {
447 if ctx.Device() {
Paul Duffin250e6192019-06-07 10:44:37 +0100448 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Colin Cross6d8d8c62019-10-28 15:10:03 -0700449 if sdkDep.useDefaultLibs {
450 ctx.AddVariationDependencies(nil, bootClasspathTag, config.DefaultBootclasspathLibraries...)
451 ctx.AddVariationDependencies(nil, systemModulesTag, config.DefaultSystemModules)
452 if sdkDep.hasFrameworkLibs() {
453 ctx.AddVariationDependencies(nil, libTag, config.DefaultLibraries...)
Nan Zhang357466b2018-04-17 17:38:36 -0700454 }
Colin Cross6d8d8c62019-10-28 15:10:03 -0700455 } else if sdkDep.useModule {
Colin Cross6cef4812019-10-17 14:23:50 -0700456 ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...)
Paul Duffine25c6442019-10-11 13:50:28 +0100457 ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
Colin Cross6cef4812019-10-17 14:23:50 -0700458 ctx.AddVariationDependencies(nil, java9LibTag, sdkDep.java9Classpath...)
Nan Zhang581fd212018-01-10 16:06:12 -0800459 }
460 }
461
Colin Cross42d48b72018-08-29 14:10:52 -0700462 ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800463}
464
Nan Zhanga40da042018-08-01 12:48:00 -0700465func (j *Javadoc) collectAidlFlags(ctx android.ModuleContext, deps deps) droiddocBuilderFlags {
466 var flags droiddocBuilderFlags
Jiyong Park1e440682018-05-23 18:42:04 +0900467
Colin Cross3047fa22019-04-18 10:56:44 -0700468 flags.aidlFlags, flags.aidlDeps = j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs)
Jiyong Park1e440682018-05-23 18:42:04 +0900469
470 return flags
471}
472
473func (j *Javadoc) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
Colin Cross3047fa22019-04-18 10:56:44 -0700474 aidlIncludeDirs android.Paths) (string, android.Paths) {
Jiyong Park1e440682018-05-23 18:42:04 +0900475
476 aidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl.Local_include_dirs)
477 aidlIncludes = append(aidlIncludes, android.PathsForSource(ctx, j.properties.Aidl.Include_dirs)...)
478
479 var flags []string
Colin Cross3047fa22019-04-18 10:56:44 -0700480 var deps android.Paths
481
Jiyong Park1e440682018-05-23 18:42:04 +0900482 if aidlPreprocess.Valid() {
483 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Cross3047fa22019-04-18 10:56:44 -0700484 deps = append(deps, aidlPreprocess.Path())
Jiyong Park1e440682018-05-23 18:42:04 +0900485 } else {
486 flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
487 }
488
489 flags = append(flags, android.JoinWithPrefix(aidlIncludes.Strings(), "-I"))
490 flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
491 if src := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "src"); src.Valid() {
492 flags = append(flags, "-I"+src.String())
493 }
494
Colin Cross3047fa22019-04-18 10:56:44 -0700495 return strings.Join(flags, " "), deps
Jiyong Park1e440682018-05-23 18:42:04 +0900496}
497
Jiyong Parkd90d7412019-08-20 22:49:19 +0900498// TODO: remove the duplication between this and the one in gen.go
Jiyong Park1e440682018-05-23 18:42:04 +0900499func (j *Javadoc) genSources(ctx android.ModuleContext, srcFiles android.Paths,
Nan Zhanga40da042018-08-01 12:48:00 -0700500 flags droiddocBuilderFlags) android.Paths {
Jiyong Park1e440682018-05-23 18:42:04 +0900501
502 outSrcFiles := make(android.Paths, 0, len(srcFiles))
Colin Crossc0806172019-06-14 18:51:47 -0700503 var aidlSrcs android.Paths
Jiyong Park1e440682018-05-23 18:42:04 +0900504
Jiyong Park1112c4c2019-08-16 21:12:10 +0900505 aidlIncludeFlags := genAidlIncludeFlags(srcFiles)
506
Jiyong Park1e440682018-05-23 18:42:04 +0900507 for _, srcFile := range srcFiles {
508 switch srcFile.Ext() {
509 case ".aidl":
Colin Crossc0806172019-06-14 18:51:47 -0700510 aidlSrcs = append(aidlSrcs, srcFile)
Jiyong Parkd90d7412019-08-20 22:49:19 +0900511 case ".logtags":
512 javaFile := genLogtags(ctx, srcFile)
513 outSrcFiles = append(outSrcFiles, javaFile)
Jiyong Park1e440682018-05-23 18:42:04 +0900514 default:
515 outSrcFiles = append(outSrcFiles, srcFile)
516 }
517 }
518
Colin Crossc0806172019-06-14 18:51:47 -0700519 // Process all aidl files together to support sharding them into one or more rules that produce srcjars.
520 if len(aidlSrcs) > 0 {
521 srcJarFiles := genAidl(ctx, aidlSrcs, flags.aidlFlags+aidlIncludeFlags, flags.aidlDeps)
522 outSrcFiles = append(outSrcFiles, srcJarFiles...)
523 }
524
Jiyong Park1e440682018-05-23 18:42:04 +0900525 return outSrcFiles
526}
527
Nan Zhang581fd212018-01-10 16:06:12 -0800528func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
529 var deps deps
530
Colin Cross83bb3162018-06-25 15:48:06 -0700531 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800532 if sdkDep.invalidVersion {
Colin Cross6cef4812019-10-17 14:23:50 -0700533 ctx.AddMissingDependencies(sdkDep.bootclasspath)
534 ctx.AddMissingDependencies(sdkDep.java9Classpath)
Nan Zhang581fd212018-01-10 16:06:12 -0800535 } else if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700536 deps.bootClasspath = append(deps.bootClasspath, sdkDep.jars...)
Anton Hansson26bf49b2020-02-08 20:26:29 +0000537 deps.aidlPreprocess = sdkDep.aidl
538 } else {
539 deps.aidlPreprocess = sdkDep.aidl
Nan Zhang581fd212018-01-10 16:06:12 -0800540 }
541
542 ctx.VisitDirectDeps(func(module android.Module) {
543 otherName := ctx.OtherModuleName(module)
544 tag := ctx.OtherModuleDependencyTag(module)
545
Colin Cross2d24c1b2018-05-23 10:59:18 -0700546 switch tag {
547 case bootClasspathTag:
548 if dep, ok := module.(Dependency); ok {
Nan Zhang581fd212018-01-10 16:06:12 -0800549 deps.bootClasspath = append(deps.bootClasspath, dep.ImplementationJars()...)
Paul Duffine25c6442019-10-11 13:50:28 +0100550 } else if sm, ok := module.(*SystemModules); ok {
551 // A system modules dependency has been added to the bootclasspath
552 // so add its libs to the bootclasspath.
553 deps.bootClasspath = append(deps.bootClasspath, sm.headerJars...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700554 } else {
555 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
556 }
557 case libTag:
558 switch dep := module.(type) {
Colin Cross897d2ed2019-02-11 14:03:51 -0800559 case SdkLibraryDependency:
560 deps.classpath = append(deps.classpath, dep.SdkImplementationJars(ctx, j.sdkVersion())...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700561 case Dependency:
Sundong Ahnba493602018-11-20 17:36:35 +0900562 deps.classpath = append(deps.classpath, dep.HeaderJars()...)
Jiyong Park19a7f252019-07-10 16:59:31 +0900563 deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700564 case android.SourceFileProducer:
Nan Zhang581fd212018-01-10 16:06:12 -0800565 checkProducesJars(ctx, dep)
566 deps.classpath = append(deps.classpath, dep.Srcs()...)
Nan Zhang581fd212018-01-10 16:06:12 -0800567 default:
568 ctx.ModuleErrorf("depends on non-java module %q", otherName)
569 }
Colin Cross6cef4812019-10-17 14:23:50 -0700570 case java9LibTag:
571 switch dep := module.(type) {
572 case Dependency:
573 deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars()...)
574 default:
575 ctx.ModuleErrorf("depends on non-java module %q", otherName)
576 }
Nan Zhang357466b2018-04-17 17:38:36 -0700577 case systemModulesTag:
578 if deps.systemModules != nil {
579 panic("Found two system module dependencies")
580 }
581 sm := module.(*SystemModules)
Dan Willemsenff60a732019-06-13 16:52:01 +0000582 if sm.outputDir == nil && len(sm.outputDeps) == 0 {
Nan Zhang357466b2018-04-17 17:38:36 -0700583 panic("Missing directory for system module dependency")
584 }
Colin Crossb77043e2019-07-16 13:57:13 -0700585 deps.systemModules = &systemModules{sm.outputDir, sm.outputDeps}
Nan Zhang581fd212018-01-10 16:06:12 -0800586 }
587 })
588 // do not pass exclude_srcs directly when expanding srcFiles since exclude_srcs
589 // may contain filegroup or genrule.
Colin Cross8a497952019-03-05 22:25:09 -0800590 srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
Jiyong Parkc6ddccf2019-09-13 20:56:14 +0900591
592 filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path {
593 if filterPackages == nil {
594 return srcs
595 }
596 filtered := []android.Path{}
597 for _, src := range srcs {
598 if src.Ext() != ".java" {
599 // Don't filter-out non-Java (=generated sources) by package names. This is not ideal,
600 // but otherwise metalava emits stub sources having references to the generated AIDL classes
601 // in filtered-out pacages (e.g. com.android.internal.*).
602 // TODO(b/141149570) We need to fix this by introducing default private constructors or
603 // fixing metalava to not emit constructors having references to unknown classes.
604 filtered = append(filtered, src)
605 continue
606 }
607 packageName := strings.ReplaceAll(filepath.Dir(src.Rel()), "/", ".")
608 for _, pkg := range filterPackages {
609 if strings.HasPrefix(packageName, pkg) {
610 filtered = append(filtered, src)
611 break
612 }
613 }
614 }
615 return filtered
616 }
617 srcFiles = filterByPackage(srcFiles, j.properties.Filter_packages)
618
Nan Zhanga40da042018-08-01 12:48:00 -0700619 flags := j.collectAidlFlags(ctx, deps)
Jiyong Park1e440682018-05-23 18:42:04 +0900620 srcFiles = j.genSources(ctx, srcFiles, flags)
Nan Zhang581fd212018-01-10 16:06:12 -0800621
622 // srcs may depend on some genrule output.
623 j.srcJars = srcFiles.FilterByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800624 j.srcJars = append(j.srcJars, deps.srcJars...)
625
Nan Zhang581fd212018-01-10 16:06:12 -0800626 j.srcFiles = srcFiles.FilterOutByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800627 j.srcFiles = append(j.srcFiles, deps.srcs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800628
Nan Zhang9c69a122018-08-22 10:22:08 -0700629 if j.properties.Local_sourcepaths == nil && len(j.srcFiles) > 0 {
Nan Zhang581fd212018-01-10 16:06:12 -0800630 j.properties.Local_sourcepaths = append(j.properties.Local_sourcepaths, ".")
631 }
632 j.sourcepaths = android.PathsForModuleSrc(ctx, j.properties.Local_sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800633
Colin Cross8a497952019-03-05 22:25:09 -0800634 j.argFiles = android.PathsForModuleSrc(ctx, j.properties.Arg_files)
Paul Duffin99e4a502019-02-11 15:38:42 +0000635 argFilesMap := map[string]string{}
636 argFileLabels := []string{}
Nan Zhang1598a9e2018-09-04 17:14:32 -0700637
Paul Duffin99e4a502019-02-11 15:38:42 +0000638 for _, label := range j.properties.Arg_files {
Colin Cross8a497952019-03-05 22:25:09 -0800639 var paths = android.PathsForModuleSrc(ctx, []string{label})
Paul Duffin99e4a502019-02-11 15:38:42 +0000640 if _, exists := argFilesMap[label]; !exists {
641 argFilesMap[label] = strings.Join(paths.Strings(), " ")
642 argFileLabels = append(argFileLabels, label)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700643 } else {
644 ctx.ModuleErrorf("multiple arg_files for %q, %q and %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000645 label, argFilesMap[label], paths)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700646 }
647 }
648
649 var err error
Colin Cross15638152019-07-11 11:11:35 -0700650 j.args, err = android.Expand(String(j.properties.Args), func(name string) (string, error) {
Nan Zhang1598a9e2018-09-04 17:14:32 -0700651 if strings.HasPrefix(name, "location ") {
652 label := strings.TrimSpace(strings.TrimPrefix(name, "location "))
Paul Duffin99e4a502019-02-11 15:38:42 +0000653 if paths, ok := argFilesMap[label]; ok {
Colin Cross15638152019-07-11 11:11:35 -0700654 return paths, nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700655 } else {
Colin Cross15638152019-07-11 11:11:35 -0700656 return "", fmt.Errorf("unknown location label %q, expecting one of %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000657 label, strings.Join(argFileLabels, ", "))
Nan Zhang1598a9e2018-09-04 17:14:32 -0700658 }
659 } else if name == "genDir" {
Colin Cross15638152019-07-11 11:11:35 -0700660 return android.PathForModuleGen(ctx).String(), nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700661 }
Colin Cross15638152019-07-11 11:11:35 -0700662 return "", fmt.Errorf("unknown variable '$(%s)'", name)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700663 })
664
665 if err != nil {
666 ctx.PropertyErrorf("args", "%s", err.Error())
667 }
668
Nan Zhang581fd212018-01-10 16:06:12 -0800669 return deps
670}
671
672func (j *Javadoc) DepsMutator(ctx android.BottomUpMutatorContext) {
673 j.addDeps(ctx)
674}
675
676func (j *Javadoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
677 deps := j.collectDeps(ctx)
678
Colin Crossdaa4c672019-07-15 22:53:46 -0700679 j.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
Nan Zhang581fd212018-01-10 16:06:12 -0800680
Colin Crossdaa4c672019-07-15 22:53:46 -0700681 outDir := android.PathForModuleOut(ctx, "out")
682 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
683
684 j.stubsSrcJar = nil
685
686 rule := android.NewRuleBuilder()
687
688 rule.Command().Text("rm -rf").Text(outDir.String())
689 rule.Command().Text("mkdir -p").Text(outDir.String())
690
691 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, j.srcJars)
Nan Zhang357466b2018-04-17 17:38:36 -0700692
Colin Cross83bb3162018-06-25 15:48:06 -0700693 javaVersion := getJavaVersion(ctx, String(j.properties.Java_version), sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800694
Colin Crossdaa4c672019-07-15 22:53:46 -0700695 cmd := javadocSystemModulesCmd(ctx, rule, j.srcFiles, outDir, srcJarDir, srcJarList,
696 deps.systemModules, deps.classpath, j.sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800697
Colin Cross1e743852019-10-28 11:37:20 -0700698 cmd.FlagWithArg("-source ", javaVersion.String()).
Colin Crossdaa4c672019-07-15 22:53:46 -0700699 Flag("-J-Xmx1024m").
700 Flag("-XDignore.symbol.file").
701 Flag("-Xdoclint:none")
Nan Zhang581fd212018-01-10 16:06:12 -0800702
Colin Crossdaa4c672019-07-15 22:53:46 -0700703 rule.Command().
704 BuiltTool(ctx, "soong_zip").
705 Flag("-write_if_changed").
706 Flag("-d").
707 FlagWithOutput("-o ", j.docZip).
708 FlagWithArg("-C ", outDir.String()).
709 FlagWithArg("-D ", outDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -0700710
Colin Crossdaa4c672019-07-15 22:53:46 -0700711 rule.Restat()
712
713 zipSyncCleanupCmd(rule, srcJarDir)
714
715 rule.Build(pctx, ctx, "javadoc", "javadoc")
Nan Zhang581fd212018-01-10 16:06:12 -0800716}
717
Nan Zhanga40da042018-08-01 12:48:00 -0700718//
719// Droiddoc
720//
721type Droiddoc struct {
722 Javadoc
723
724 properties DroiddocProperties
725 apiFile android.WritablePath
726 dexApiFile android.WritablePath
727 privateApiFile android.WritablePath
728 privateDexApiFile android.WritablePath
729 removedApiFile android.WritablePath
730 removedDexApiFile android.WritablePath
731 exactApiFile android.WritablePath
732 apiMappingFile android.WritablePath
Nan Zhang66dc2362018-08-14 20:41:04 -0700733 proguardFile android.WritablePath
Nan Zhanga40da042018-08-01 12:48:00 -0700734
735 checkCurrentApiTimestamp android.WritablePath
736 updateCurrentApiTimestamp android.WritablePath
737 checkLastReleasedApiTimestamp android.WritablePath
738
Nan Zhanga40da042018-08-01 12:48:00 -0700739 apiFilePath android.Path
740}
741
Colin Crossa3002fc2019-07-08 16:48:04 -0700742// droiddoc converts .java source files to documentation using doclava or dokka.
Nan Zhanga40da042018-08-01 12:48:00 -0700743func DroiddocFactory() android.Module {
744 module := &Droiddoc{}
745
746 module.AddProperties(&module.properties,
747 &module.Javadoc.properties)
748
749 InitDroiddocModule(module, android.HostAndDeviceSupported)
750 return module
751}
752
Colin Crossa3002fc2019-07-08 16:48:04 -0700753// droiddoc_host converts .java source files to documentation using doclava or dokka.
Nan Zhanga40da042018-08-01 12:48:00 -0700754func DroiddocHostFactory() android.Module {
755 module := &Droiddoc{}
756
757 module.AddProperties(&module.properties,
758 &module.Javadoc.properties)
759
760 InitDroiddocModule(module, android.HostSupported)
761 return module
762}
763
764func (d *Droiddoc) ApiFilePath() android.Path {
765 return d.apiFilePath
766}
767
Nan Zhang581fd212018-01-10 16:06:12 -0800768func (d *Droiddoc) DepsMutator(ctx android.BottomUpMutatorContext) {
769 d.Javadoc.addDeps(ctx)
770
Inseob Kim38449af2019-02-28 14:24:05 +0900771 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
772 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
773 }
774
Nan Zhang79614d12018-04-19 18:03:39 -0700775 if String(d.properties.Custom_template) != "" {
Dan Willemsencc090972018-02-26 14:33:31 -0800776 ctx.AddDependency(ctx.Module(), droiddocTemplateTag, String(d.properties.Custom_template))
777 }
Nan Zhang581fd212018-01-10 16:06:12 -0800778}
779
Colin Crossab054432019-07-15 16:13:59 -0700780func (d *Droiddoc) doclavaDocsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, docletPath classpath) {
Nan Zhang443fa522018-08-20 20:58:28 -0700781 // Droiddoc always gets "-source 1.8" because it doesn't support 1.9 sources. For modules with 1.9
782 // sources, droiddoc will get sources produced by metalava which will have already stripped out the
783 // 1.9 language features.
Colin Crossab054432019-07-15 16:13:59 -0700784 cmd.FlagWithArg("-source ", "1.8").
785 Flag("-J-Xmx1600m").
786 Flag("-J-XX:-OmitStackTraceInFastThrow").
787 Flag("-XDignore.symbol.file").
788 FlagWithArg("-doclet ", "com.google.doclava.Doclava").
789 FlagWithInputList("-docletpath ", docletPath.Paths(), ":").
790 FlagWithArg("-hdf page.build ", ctx.Config().BuildId()+"-"+ctx.Config().BuildNumberFromFile()).
Elliott Hughes26bce342019-09-12 15:05:13 -0700791 FlagWithArg("-hdf page.now ", `"$(date -d @$(cat `+ctx.Config().Getenv("BUILD_DATETIME_FILE")+`) "+%d %b %Y %k:%M")" `)
Nan Zhang46130972018-06-04 11:28:01 -0700792
Nan Zhanga40da042018-08-01 12:48:00 -0700793 if String(d.properties.Custom_template) == "" {
794 // TODO: This is almost always droiddoc-templates-sdk
795 ctx.PropertyErrorf("custom_template", "must specify a template")
796 }
797
798 ctx.VisitDirectDepsWithTag(droiddocTemplateTag, func(m android.Module) {
Nan Zhangf4936b02018-08-01 15:00:28 -0700799 if t, ok := m.(*ExportedDroiddocDir); ok {
Colin Crossab054432019-07-15 16:13:59 -0700800 cmd.FlagWithArg("-templatedir ", t.dir.String()).Implicits(t.deps)
Nan Zhanga40da042018-08-01 12:48:00 -0700801 } else {
Paul Duffin884363e2019-12-19 10:21:09 +0000802 ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_exported_dir", ctx.OtherModuleName(m))
Nan Zhanga40da042018-08-01 12:48:00 -0700803 }
804 })
805
806 if len(d.properties.Html_dirs) > 0 {
Colin Crossab054432019-07-15 16:13:59 -0700807 htmlDir := android.PathForModuleSrc(ctx, d.properties.Html_dirs[0])
808 cmd.FlagWithArg("-htmldir ", htmlDir.String()).
809 Implicits(android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[0], "**/*")}))
Nan Zhanga40da042018-08-01 12:48:00 -0700810 }
811
812 if len(d.properties.Html_dirs) > 1 {
Colin Crossab054432019-07-15 16:13:59 -0700813 htmlDir2 := android.PathForModuleSrc(ctx, d.properties.Html_dirs[1])
814 cmd.FlagWithArg("-htmldir2 ", htmlDir2.String()).
815 Implicits(android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[1], "**/*")}))
Nan Zhanga40da042018-08-01 12:48:00 -0700816 }
817
818 if len(d.properties.Html_dirs) > 2 {
819 ctx.PropertyErrorf("html_dirs", "Droiddoc only supports up to 2 html dirs")
820 }
821
Colin Cross8a497952019-03-05 22:25:09 -0800822 knownTags := android.PathsForModuleSrc(ctx, d.properties.Knowntags)
Colin Crossab054432019-07-15 16:13:59 -0700823 cmd.FlagForEachInput("-knowntags ", knownTags)
Nan Zhanga40da042018-08-01 12:48:00 -0700824
Colin Crossab054432019-07-15 16:13:59 -0700825 cmd.FlagForEachArg("-hdf ", d.properties.Hdf)
Nan Zhanga40da042018-08-01 12:48:00 -0700826
827 if String(d.properties.Proofread_file) != "" {
828 proofreadFile := android.PathForModuleOut(ctx, String(d.properties.Proofread_file))
Colin Crossab054432019-07-15 16:13:59 -0700829 cmd.FlagWithOutput("-proofread ", proofreadFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700830 }
831
832 if String(d.properties.Todo_file) != "" {
833 // tricky part:
834 // we should not compute full path for todo_file through PathForModuleOut().
835 // the non-standard doclet will get the full path relative to "-o".
Colin Crossab054432019-07-15 16:13:59 -0700836 cmd.FlagWithArg("-todo ", String(d.properties.Todo_file)).
837 ImplicitOutput(android.PathForModuleOut(ctx, String(d.properties.Todo_file)))
Nan Zhanga40da042018-08-01 12:48:00 -0700838 }
839
840 if String(d.properties.Resourcesdir) != "" {
841 // TODO: should we add files under resourcesDir to the implicits? It seems that
842 // resourcesDir is one sub dir of htmlDir
843 resourcesDir := android.PathForModuleSrc(ctx, String(d.properties.Resourcesdir))
Colin Crossab054432019-07-15 16:13:59 -0700844 cmd.FlagWithArg("-resourcesdir ", resourcesDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -0700845 }
846
847 if String(d.properties.Resourcesoutdir) != "" {
848 // TODO: it seems -resourceoutdir reference/android/images/ didn't get generated anywhere.
Colin Crossab054432019-07-15 16:13:59 -0700849 cmd.FlagWithArg("-resourcesoutdir ", String(d.properties.Resourcesoutdir))
Nan Zhanga40da042018-08-01 12:48:00 -0700850 }
Nan Zhanga40da042018-08-01 12:48:00 -0700851}
852
Colin Crossab054432019-07-15 16:13:59 -0700853func (d *Droiddoc) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.WritablePath) {
Luca Stefanid63ea0a2019-09-01 21:49:45 +0200854 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
855 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -0700856 String(d.properties.Api_filename) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700857
Nan Zhanga40da042018-08-01 12:48:00 -0700858 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
Colin Crossab054432019-07-15 16:13:59 -0700859 cmd.FlagWithOutput("-api ", d.apiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700860 d.apiFilePath = d.apiFile
861 }
862
Luca Stefanid63ea0a2019-09-01 21:49:45 +0200863 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
864 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -0700865 String(d.properties.Removed_api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -0700866 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
Colin Crossab054432019-07-15 16:13:59 -0700867 cmd.FlagWithOutput("-removedApi ", d.removedApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700868 }
869
870 if String(d.properties.Private_api_filename) != "" {
871 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700872 cmd.FlagWithOutput("-privateApi ", d.privateApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700873 }
874
875 if String(d.properties.Dex_api_filename) != "" {
876 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700877 cmd.FlagWithOutput("-dexApi ", d.dexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700878 }
879
880 if String(d.properties.Private_dex_api_filename) != "" {
881 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700882 cmd.FlagWithOutput("-privateDexApi ", d.privateDexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700883 }
884
885 if String(d.properties.Removed_dex_api_filename) != "" {
886 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700887 cmd.FlagWithOutput("-removedDexApi ", d.removedDexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700888 }
889
890 if String(d.properties.Exact_api_filename) != "" {
891 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700892 cmd.FlagWithOutput("-exactApi ", d.exactApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700893 }
894
895 if String(d.properties.Dex_mapping_filename) != "" {
896 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
Colin Crossab054432019-07-15 16:13:59 -0700897 cmd.FlagWithOutput("-apiMapping ", d.apiMappingFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700898 }
899
Nan Zhang66dc2362018-08-14 20:41:04 -0700900 if String(d.properties.Proguard_filename) != "" {
901 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
Colin Crossab054432019-07-15 16:13:59 -0700902 cmd.FlagWithOutput("-proguard ", d.proguardFile)
Nan Zhang66dc2362018-08-14 20:41:04 -0700903 }
904
Nan Zhanga40da042018-08-01 12:48:00 -0700905 if BoolDefault(d.properties.Create_stubs, true) {
Colin Crossab054432019-07-15 16:13:59 -0700906 cmd.FlagWithArg("-stubs ", stubsDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -0700907 }
908
909 if Bool(d.properties.Write_sdk_values) {
Colin Crossab054432019-07-15 16:13:59 -0700910 cmd.FlagWithArg("-sdkvalues ", android.PathForModuleOut(ctx, "out").String())
Nan Zhanga40da042018-08-01 12:48:00 -0700911 }
Nan Zhanga40da042018-08-01 12:48:00 -0700912}
913
Colin Crossab054432019-07-15 16:13:59 -0700914func (d *Droiddoc) postDoclavaCmds(ctx android.ModuleContext, rule *android.RuleBuilder) {
Nan Zhanga40da042018-08-01 12:48:00 -0700915 if String(d.properties.Static_doc_index_redirect) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700916 staticDocIndexRedirect := android.PathForModuleSrc(ctx, String(d.properties.Static_doc_index_redirect))
917 rule.Command().Text("cp").
918 Input(staticDocIndexRedirect).
919 Output(android.PathForModuleOut(ctx, "out", "index.html"))
Nan Zhanga40da042018-08-01 12:48:00 -0700920 }
921
922 if String(d.properties.Static_doc_properties) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700923 staticDocProperties := android.PathForModuleSrc(ctx, String(d.properties.Static_doc_properties))
924 rule.Command().Text("cp").
925 Input(staticDocProperties).
926 Output(android.PathForModuleOut(ctx, "out", "source.properties"))
Nan Zhanga40da042018-08-01 12:48:00 -0700927 }
Nan Zhanga40da042018-08-01 12:48:00 -0700928}
929
Colin Crossab054432019-07-15 16:13:59 -0700930func javadocCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
Colin Crossdaa4c672019-07-15 22:53:46 -0700931 outDir, srcJarDir, srcJarList android.Path, sourcepaths android.Paths) *android.RuleBuilderCommand {
Colin Crossab054432019-07-15 16:13:59 -0700932
933 cmd := rule.Command().
934 BuiltTool(ctx, "soong_javac_wrapper").Tool(config.JavadocCmd(ctx)).
935 Flag(config.JavacVmFlags).
936 FlagWithArg("-encoding ", "UTF-8").
Colin Crossab054432019-07-15 16:13:59 -0700937 FlagWithRspFileInputList("@", srcs).
938 FlagWithInput("@", srcJarList)
939
Colin Crossab054432019-07-15 16:13:59 -0700940 // TODO(ccross): Remove this if- statement once we finish migration for all Doclava
941 // based stubs generation.
942 // In the future, all the docs generation depends on Metalava stubs (droidstubs) srcjar
943 // dir. We need add the srcjar dir to -sourcepath arg, so that Javadoc can figure out
944 // the correct package name base path.
945 if len(sourcepaths) > 0 {
946 cmd.FlagWithList("-sourcepath ", sourcepaths.Strings(), ":")
947 } else {
948 cmd.FlagWithArg("-sourcepath ", srcJarDir.String())
949 }
950
951 cmd.FlagWithArg("-d ", outDir.String()).
952 Flag("-quiet")
953
954 return cmd
Nan Zhang1598a9e2018-09-04 17:14:32 -0700955}
956
Colin Crossdaa4c672019-07-15 22:53:46 -0700957func javadocSystemModulesCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
958 outDir, srcJarDir, srcJarList android.Path, systemModules *systemModules,
959 classpath classpath, sourcepaths android.Paths) *android.RuleBuilderCommand {
960
961 cmd := javadocCmd(ctx, rule, srcs, outDir, srcJarDir, srcJarList, sourcepaths)
962
963 flag, deps := systemModules.FormJavaSystemModulesPath(ctx.Device())
964 cmd.Flag(flag).Implicits(deps)
965
966 cmd.FlagWithArg("--patch-module ", "java.base=.")
967
968 if len(classpath) > 0 {
969 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
970 }
971
972 return cmd
Nan Zhang1598a9e2018-09-04 17:14:32 -0700973}
974
Colin Crossdaa4c672019-07-15 22:53:46 -0700975func javadocBootclasspathCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
976 outDir, srcJarDir, srcJarList android.Path, bootclasspath, classpath classpath,
977 sourcepaths android.Paths) *android.RuleBuilderCommand {
978
979 cmd := javadocCmd(ctx, rule, srcs, outDir, srcJarDir, srcJarList, sourcepaths)
980
981 if len(bootclasspath) == 0 && ctx.Device() {
982 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
983 // ensure java does not fall back to the default bootclasspath.
984 cmd.FlagWithArg("-bootclasspath ", `""`)
985 } else if len(bootclasspath) > 0 {
986 cmd.FlagWithInputList("-bootclasspath ", bootclasspath.Paths(), ":")
987 }
988
989 if len(classpath) > 0 {
990 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
991 }
992
993 return cmd
994}
995
Colin Crossab054432019-07-15 16:13:59 -0700996func dokkaCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
997 outDir, srcJarDir android.Path, bootclasspath, classpath classpath) *android.RuleBuilderCommand {
Nan Zhang1598a9e2018-09-04 17:14:32 -0700998
Colin Crossab054432019-07-15 16:13:59 -0700999 // Dokka doesn't support bootClasspath, so combine these two classpath vars for Dokka.
1000 dokkaClasspath := append(bootclasspath.Paths(), classpath.Paths()...)
1001
1002 return rule.Command().
1003 BuiltTool(ctx, "dokka").
1004 Flag(config.JavacVmFlags).
1005 Flag(srcJarDir.String()).
1006 FlagWithInputList("-classpath ", dokkaClasspath, ":").
1007 FlagWithArg("-format ", "dac").
1008 FlagWithArg("-dacRoot ", "/reference/kotlin").
1009 FlagWithArg("-output ", outDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001010}
1011
1012func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1013 deps := d.Javadoc.collectDeps(ctx)
1014
Colin Crossdaa4c672019-07-15 22:53:46 -07001015 d.Javadoc.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
1016 d.Javadoc.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
1017
Nan Zhang1598a9e2018-09-04 17:14:32 -07001018 jsilver := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jsilver.jar")
1019 doclava := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "doclava.jar")
1020 java8Home := ctx.Config().Getenv("ANDROID_JAVA8_HOME")
1021 checkApiClasspath := classpath{jsilver, doclava, android.PathForSource(ctx, java8Home, "lib/tools.jar")}
1022
Colin Crossab054432019-07-15 16:13:59 -07001023 outDir := android.PathForModuleOut(ctx, "out")
1024 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
1025 stubsDir := android.PathForModuleOut(ctx, "stubsDir")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001026
Colin Crossab054432019-07-15 16:13:59 -07001027 rule := android.NewRuleBuilder()
Nan Zhang1598a9e2018-09-04 17:14:32 -07001028
Colin Crossab054432019-07-15 16:13:59 -07001029 rule.Command().Text("rm -rf").Text(outDir.String()).Text(stubsDir.String())
1030 rule.Command().Text("mkdir -p").Text(outDir.String()).Text(stubsDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001031
Colin Crossab054432019-07-15 16:13:59 -07001032 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1033
1034 var cmd *android.RuleBuilderCommand
Nan Zhang1598a9e2018-09-04 17:14:32 -07001035 if Bool(d.properties.Dokka_enabled) {
Colin Crossab054432019-07-15 16:13:59 -07001036 cmd = dokkaCmd(ctx, rule, outDir, srcJarDir, deps.bootClasspath, deps.classpath)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001037 } else {
Colin Crossdaa4c672019-07-15 22:53:46 -07001038 cmd = javadocBootclasspathCmd(ctx, rule, d.Javadoc.srcFiles, outDir, srcJarDir, srcJarList,
Colin Crossab054432019-07-15 16:13:59 -07001039 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001040 }
1041
Colin Crossab054432019-07-15 16:13:59 -07001042 d.stubsFlags(ctx, cmd, stubsDir)
1043
1044 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1045
Mathew Inwoodabd49ab2019-12-19 14:27:08 +00001046 if d.properties.Compat_config != nil {
1047 compatConfig := android.PathForModuleSrc(ctx, String(d.properties.Compat_config))
1048 cmd.FlagWithInput("-compatconfig ", compatConfig)
1049 }
1050
Colin Crossab054432019-07-15 16:13:59 -07001051 var desc string
1052 if Bool(d.properties.Dokka_enabled) {
1053 desc = "dokka"
1054 } else {
1055 d.doclavaDocsFlags(ctx, cmd, classpath{jsilver, doclava})
1056
1057 for _, o := range d.Javadoc.properties.Out {
1058 cmd.ImplicitOutput(android.PathForModuleGen(ctx, o))
1059 }
1060
1061 d.postDoclavaCmds(ctx, rule)
1062 desc = "doclava"
1063 }
1064
1065 rule.Command().
1066 BuiltTool(ctx, "soong_zip").
1067 Flag("-write_if_changed").
1068 Flag("-d").
1069 FlagWithOutput("-o ", d.docZip).
1070 FlagWithArg("-C ", outDir.String()).
1071 FlagWithArg("-D ", outDir.String())
1072
1073 rule.Command().
1074 BuiltTool(ctx, "soong_zip").
1075 Flag("-write_if_changed").
1076 Flag("-jar").
1077 FlagWithOutput("-o ", d.stubsSrcJar).
1078 FlagWithArg("-C ", stubsDir.String()).
1079 FlagWithArg("-D ", stubsDir.String())
1080
1081 rule.Restat()
1082
1083 zipSyncCleanupCmd(rule, srcJarDir)
1084
1085 rule.Build(pctx, ctx, "javadoc", desc)
1086
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001087 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001088 !ctx.Config().IsPdkBuild() {
Colin Crossab054432019-07-15 16:13:59 -07001089
1090 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Api_file))
1091 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Removed_api_file))
Nan Zhang1598a9e2018-09-04 17:14:32 -07001092
1093 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001094
1095 rule := android.NewRuleBuilder()
1096
1097 rule.Command().Text("( true")
1098
1099 rule.Command().
1100 BuiltTool(ctx, "apicheck").
1101 Flag("-JXmx1024m").
1102 FlagWithInputList("-Jclasspath\\ ", checkApiClasspath.Paths(), ":").
1103 OptionalFlag(d.properties.Check_api.Current.Args).
1104 Input(apiFile).
1105 Input(d.apiFile).
1106 Input(removedApiFile).
1107 Input(d.removedApiFile)
1108
1109 msg := fmt.Sprintf(`\n******************************\n`+
1110 `You have tried to change the API from what has been previously approved.\n\n`+
1111 `To make these errors go away, you have two choices:\n`+
1112 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1113 ` errors above.\n\n`+
1114 ` 2. You can update current.txt by executing the following command:\n`+
1115 ` make %s-update-current-api\n\n`+
1116 ` To submit the revised current.txt to the main Android repository,\n`+
1117 ` you will need approval.\n`+
1118 `******************************\n`, ctx.ModuleName())
1119
1120 rule.Command().
1121 Text("touch").Output(d.checkCurrentApiTimestamp).
1122 Text(") || (").
1123 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1124 Text("; exit 38").
1125 Text(")")
1126
1127 rule.Build(pctx, ctx, "doclavaCurrentApiCheck", "check current API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001128
1129 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001130
1131 // update API rule
1132 rule = android.NewRuleBuilder()
1133
1134 rule.Command().Text("( true")
1135
1136 rule.Command().
1137 Text("cp").Flag("-f").
1138 Input(d.apiFile).Flag(apiFile.String())
1139
1140 rule.Command().
1141 Text("cp").Flag("-f").
1142 Input(d.removedApiFile).Flag(removedApiFile.String())
1143
1144 msg = "failed to update public API"
1145
1146 rule.Command().
1147 Text("touch").Output(d.updateCurrentApiTimestamp).
1148 Text(") || (").
1149 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1150 Text("; exit 38").
1151 Text(")")
1152
1153 rule.Build(pctx, ctx, "doclavaCurrentApiUpdate", "update current API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001154 }
1155
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001156 if apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001157 !ctx.Config().IsPdkBuild() {
Colin Crossab054432019-07-15 16:13:59 -07001158
1159 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
1160 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file))
Nan Zhang1598a9e2018-09-04 17:14:32 -07001161
1162 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001163
1164 rule := android.NewRuleBuilder()
1165
1166 rule.Command().
1167 Text("(").
1168 BuiltTool(ctx, "apicheck").
1169 Flag("-JXmx1024m").
1170 FlagWithInputList("-Jclasspath\\ ", checkApiClasspath.Paths(), ":").
1171 OptionalFlag(d.properties.Check_api.Last_released.Args).
1172 Input(apiFile).
1173 Input(d.apiFile).
1174 Input(removedApiFile).
1175 Input(d.removedApiFile)
1176
1177 msg := `\n******************************\n` +
1178 `You have tried to change the API from what has been previously released in\n` +
1179 `an SDK. Please fix the errors listed above.\n` +
1180 `******************************\n`
1181
1182 rule.Command().
1183 Text("touch").Output(d.checkLastReleasedApiTimestamp).
1184 Text(") || (").
1185 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1186 Text("; exit 38").
1187 Text(")")
1188
1189 rule.Build(pctx, ctx, "doclavaLastApiCheck", "check last API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001190 }
1191}
1192
1193//
1194// Droidstubs
1195//
1196type Droidstubs struct {
1197 Javadoc
Paul Duffin91547182019-11-12 19:39:36 +00001198 android.SdkBase
Nan Zhang1598a9e2018-09-04 17:14:32 -07001199
Pete Gillin581d6082018-10-22 15:55:04 +01001200 properties DroidstubsProperties
1201 apiFile android.WritablePath
1202 apiXmlFile android.WritablePath
1203 lastReleasedApiXmlFile android.WritablePath
1204 dexApiFile android.WritablePath
1205 privateApiFile android.WritablePath
1206 privateDexApiFile android.WritablePath
1207 removedApiFile android.WritablePath
1208 removedDexApiFile android.WritablePath
1209 apiMappingFile android.WritablePath
1210 exactApiFile android.WritablePath
1211 proguardFile android.WritablePath
1212 nullabilityWarningsFile android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001213
1214 checkCurrentApiTimestamp android.WritablePath
1215 updateCurrentApiTimestamp android.WritablePath
1216 checkLastReleasedApiTimestamp android.WritablePath
Adrian Roos075eedc2019-10-10 12:07:03 +02001217 apiLintTimestamp android.WritablePath
Adrian Roos3b8f1cd2019-11-01 13:42:39 +01001218 apiLintReport android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001219
Pete Gillin581d6082018-10-22 15:55:04 +01001220 checkNullabilityWarningsTimestamp android.WritablePath
1221
Nan Zhang1598a9e2018-09-04 17:14:32 -07001222 annotationsZip android.WritablePath
Nan Zhang9c69a122018-08-22 10:22:08 -07001223 apiVersionsXml android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001224
1225 apiFilePath android.Path
Nan Zhang71bbe632018-09-17 14:32:21 -07001226
1227 jdiffDocZip android.WritablePath
1228 jdiffStubsSrcJar android.WritablePath
Jerome Gaillard0f599032019-10-10 19:29:11 +01001229
1230 metadataZip android.WritablePath
1231 metadataDir android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001232}
1233
Colin Crossa3002fc2019-07-08 16:48:04 -07001234// droidstubs passes sources files through Metalava to generate stub .java files that only contain the API to be
1235// documented, filtering out hidden classes and methods. The resulting .java files are intended to be passed to
1236// a droiddoc module to generate documentation.
Nan Zhang1598a9e2018-09-04 17:14:32 -07001237func DroidstubsFactory() android.Module {
1238 module := &Droidstubs{}
1239
1240 module.AddProperties(&module.properties,
1241 &module.Javadoc.properties)
1242
1243 InitDroiddocModule(module, android.HostAndDeviceSupported)
Paul Duffin91547182019-11-12 19:39:36 +00001244 android.InitSdkAwareModule(module)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001245 return module
1246}
1247
Colin Crossa3002fc2019-07-08 16:48:04 -07001248// droidstubs_host passes sources files through Metalava to generate stub .java files that only contain the API
1249// to be documented, filtering out hidden classes and methods. The resulting .java files are intended to be
1250// passed to a droiddoc_host module to generate documentation. Use a droidstubs_host instead of a droidstubs
1251// module when symbols needed by the source files are provided by java_library_host modules.
Nan Zhang1598a9e2018-09-04 17:14:32 -07001252func DroidstubsHostFactory() android.Module {
1253 module := &Droidstubs{}
1254
1255 module.AddProperties(&module.properties,
1256 &module.Javadoc.properties)
1257
1258 InitDroiddocModule(module, android.HostSupported)
1259 return module
1260}
1261
1262func (d *Droidstubs) ApiFilePath() android.Path {
1263 return d.apiFilePath
1264}
1265
1266func (d *Droidstubs) DepsMutator(ctx android.BottomUpMutatorContext) {
1267 d.Javadoc.addDeps(ctx)
1268
Inseob Kim38449af2019-02-28 14:24:05 +09001269 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
1270 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
1271 }
1272
Nan Zhang1598a9e2018-09-04 17:14:32 -07001273 if len(d.properties.Merge_annotations_dirs) != 0 {
1274 for _, mergeAnnotationsDir := range d.properties.Merge_annotations_dirs {
1275 ctx.AddDependency(ctx.Module(), metalavaMergeAnnotationsDirTag, mergeAnnotationsDir)
1276 }
1277 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001278
Pete Gillin77167902018-09-19 18:16:26 +01001279 if len(d.properties.Merge_inclusion_annotations_dirs) != 0 {
1280 for _, mergeInclusionAnnotationsDir := range d.properties.Merge_inclusion_annotations_dirs {
1281 ctx.AddDependency(ctx.Module(), metalavaMergeInclusionAnnotationsDirTag, mergeInclusionAnnotationsDir)
1282 }
1283 }
1284
Nan Zhang9c69a122018-08-22 10:22:08 -07001285 if len(d.properties.Api_levels_annotations_dirs) != 0 {
1286 for _, apiLevelsAnnotationsDir := range d.properties.Api_levels_annotations_dirs {
1287 ctx.AddDependency(ctx.Module(), metalavaAPILevelsAnnotationsDirTag, apiLevelsAnnotationsDir)
1288 }
1289 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001290}
1291
Colin Cross33961b52019-07-11 11:01:22 -07001292func (d *Droidstubs) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.WritablePath) {
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001293 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
1294 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -07001295 String(d.properties.Api_filename) != "" {
1296 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001297 cmd.FlagWithOutput("--api ", d.apiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001298 d.apiFilePath = d.apiFile
1299 }
1300
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001301 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
1302 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -07001303 String(d.properties.Removed_api_filename) != "" {
1304 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001305 cmd.FlagWithOutput("--removed-api ", d.removedApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001306 }
1307
1308 if String(d.properties.Private_api_filename) != "" {
1309 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001310 cmd.FlagWithOutput("--private-api ", d.privateApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001311 }
1312
1313 if String(d.properties.Dex_api_filename) != "" {
1314 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001315 cmd.FlagWithOutput("--dex-api ", d.dexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001316 }
1317
1318 if String(d.properties.Private_dex_api_filename) != "" {
1319 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001320 cmd.FlagWithOutput("--private-dex-api ", d.privateDexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001321 }
1322
1323 if String(d.properties.Removed_dex_api_filename) != "" {
1324 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001325 cmd.FlagWithOutput("--removed-dex-api ", d.removedDexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001326 }
1327
1328 if String(d.properties.Exact_api_filename) != "" {
1329 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001330 cmd.FlagWithOutput("--exact-api ", d.exactApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001331 }
1332
Nan Zhang9c69a122018-08-22 10:22:08 -07001333 if String(d.properties.Dex_mapping_filename) != "" {
1334 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001335 cmd.FlagWithOutput("--dex-api-mapping ", d.apiMappingFile)
Nan Zhang9c69a122018-08-22 10:22:08 -07001336 }
1337
Nan Zhang199645c2018-09-19 12:40:06 -07001338 if String(d.properties.Proguard_filename) != "" {
1339 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001340 cmd.FlagWithOutput("--proguard ", d.proguardFile)
Nan Zhang199645c2018-09-19 12:40:06 -07001341 }
1342
Nan Zhang9c69a122018-08-22 10:22:08 -07001343 if Bool(d.properties.Write_sdk_values) {
Jerome Gaillard0f599032019-10-10 19:29:11 +01001344 d.metadataDir = android.PathForModuleOut(ctx, "metadata")
1345 cmd.FlagWithArg("--sdk-values ", d.metadataDir.String())
Nan Zhang9c69a122018-08-22 10:22:08 -07001346 }
1347
Nan Zhang1598a9e2018-09-04 17:14:32 -07001348 if Bool(d.properties.Create_doc_stubs) {
Colin Cross33961b52019-07-11 11:01:22 -07001349 cmd.FlagWithArg("--doc-stubs ", stubsDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001350 } else {
Colin Cross33961b52019-07-11 11:01:22 -07001351 cmd.FlagWithArg("--stubs ", stubsDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001352 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001353}
1354
Colin Cross33961b52019-07-11 11:01:22 -07001355func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang1598a9e2018-09-04 17:14:32 -07001356 if Bool(d.properties.Annotations_enabled) {
Colin Cross33961b52019-07-11 11:01:22 -07001357 cmd.Flag("--include-annotations")
1358
Pete Gillinc382a562018-11-14 18:45:46 +00001359 validatingNullability :=
1360 strings.Contains(d.Javadoc.args, "--validate-nullability-from-merged-stubs") ||
1361 String(d.properties.Validate_nullability_from_list) != ""
Paul Duffin13a9dd62019-11-04 10:26:47 +00001362
Pete Gillina262c052018-09-14 14:25:48 +01001363 migratingNullability := String(d.properties.Previous_api) != ""
Pete Gillina262c052018-09-14 14:25:48 +01001364 if migratingNullability {
Colin Cross8a497952019-03-05 22:25:09 -08001365 previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api))
Colin Cross33961b52019-07-11 11:01:22 -07001366 cmd.FlagWithInput("--migrate-nullness ", previousApi)
Pete Gillina262c052018-09-14 14:25:48 +01001367 }
Colin Cross33961b52019-07-11 11:01:22 -07001368
Pete Gillinc382a562018-11-14 18:45:46 +00001369 if s := String(d.properties.Validate_nullability_from_list); s != "" {
Colin Cross33961b52019-07-11 11:01:22 -07001370 cmd.FlagWithInput("--validate-nullability-from-list ", android.PathForModuleSrc(ctx, s))
Pete Gillinc382a562018-11-14 18:45:46 +00001371 }
Colin Cross33961b52019-07-11 11:01:22 -07001372
Pete Gillina262c052018-09-14 14:25:48 +01001373 if validatingNullability {
Pete Gillin581d6082018-10-22 15:55:04 +01001374 d.nullabilityWarningsFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_nullability_warnings.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001375 cmd.FlagWithOutput("--nullability-warnings-txt ", d.nullabilityWarningsFile)
Pete Gillina262c052018-09-14 14:25:48 +01001376 }
Nan Zhanga40da042018-08-01 12:48:00 -07001377
1378 d.annotationsZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"_annotations.zip")
Colin Cross33961b52019-07-11 11:01:22 -07001379 cmd.FlagWithOutput("--extract-annotations ", d.annotationsZip)
Nan Zhangf4936b02018-08-01 15:00:28 -07001380
Nan Zhang1598a9e2018-09-04 17:14:32 -07001381 if len(d.properties.Merge_annotations_dirs) == 0 {
Nan Zhang9c69a122018-08-22 10:22:08 -07001382 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhanga40da042018-08-01 12:48:00 -07001383 "has to be non-empty if annotations was enabled!")
1384 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001385
Colin Cross33961b52019-07-11 11:01:22 -07001386 d.mergeAnnoDirFlags(ctx, cmd)
1387
1388 // TODO(tnorbye): find owners to fix these warnings when annotation was enabled.
1389 cmd.FlagWithArg("--hide ", "HiddenTypedefConstant").
1390 FlagWithArg("--hide ", "SuperfluousPrefix").
1391 FlagWithArg("--hide ", "AnnotationExtraction")
1392 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001393}
1394
Colin Cross33961b52019-07-11 11:01:22 -07001395func (d *Droidstubs) mergeAnnoDirFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
1396 ctx.VisitDirectDepsWithTag(metalavaMergeAnnotationsDirTag, func(m android.Module) {
1397 if t, ok := m.(*ExportedDroiddocDir); ok {
1398 cmd.FlagWithArg("--merge-qualifier-annotations ", t.dir.String()).Implicits(t.deps)
1399 } else {
1400 ctx.PropertyErrorf("merge_annotations_dirs",
1401 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1402 }
1403 })
1404}
1405
1406func (d *Droidstubs) inclusionAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Pete Gillin77167902018-09-19 18:16:26 +01001407 ctx.VisitDirectDepsWithTag(metalavaMergeInclusionAnnotationsDirTag, func(m android.Module) {
1408 if t, ok := m.(*ExportedDroiddocDir); ok {
Colin Cross33961b52019-07-11 11:01:22 -07001409 cmd.FlagWithArg("--merge-inclusion-annotations ", t.dir.String()).Implicits(t.deps)
Pete Gillin77167902018-09-19 18:16:26 +01001410 } else {
1411 ctx.PropertyErrorf("merge_inclusion_annotations_dirs",
1412 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1413 }
1414 })
Nan Zhanga40da042018-08-01 12:48:00 -07001415}
1416
Colin Cross33961b52019-07-11 11:01:22 -07001417func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang9c69a122018-08-22 10:22:08 -07001418 if Bool(d.properties.Api_levels_annotations_enabled) {
1419 d.apiVersionsXml = android.PathForModuleOut(ctx, "api-versions.xml")
Nan Zhang9c69a122018-08-22 10:22:08 -07001420
1421 if len(d.properties.Api_levels_annotations_dirs) == 0 {
1422 ctx.PropertyErrorf("api_levels_annotations_dirs",
1423 "has to be non-empty if api levels annotations was enabled!")
1424 }
1425
Colin Cross33961b52019-07-11 11:01:22 -07001426 cmd.FlagWithOutput("--generate-api-levels ", d.apiVersionsXml)
1427 cmd.FlagWithInput("--apply-api-levels ", d.apiVersionsXml)
1428 cmd.FlagWithArg("--current-version ", ctx.Config().PlatformSdkVersion())
1429 cmd.FlagWithArg("--current-codename ", ctx.Config().PlatformSdkCodename())
Nan Zhang9c69a122018-08-22 10:22:08 -07001430
1431 ctx.VisitDirectDepsWithTag(metalavaAPILevelsAnnotationsDirTag, func(m android.Module) {
1432 if t, ok := m.(*ExportedDroiddocDir); ok {
Nan Zhang9c69a122018-08-22 10:22:08 -07001433 for _, dep := range t.deps {
1434 if strings.HasSuffix(dep.String(), "android.jar") {
Colin Cross33961b52019-07-11 11:01:22 -07001435 cmd.Implicit(dep)
Nan Zhang9c69a122018-08-22 10:22:08 -07001436 }
1437 }
Colin Cross33961b52019-07-11 11:01:22 -07001438 cmd.FlagWithArg("--android-jar-pattern ", t.dir.String()+"/%/public/android.jar")
Nan Zhang9c69a122018-08-22 10:22:08 -07001439 } else {
1440 ctx.PropertyErrorf("api_levels_annotations_dirs",
1441 "module %q is not a metalava api-levels-annotations dir", ctx.OtherModuleName(m))
1442 }
1443 })
1444
1445 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001446}
1447
Colin Cross33961b52019-07-11 11:01:22 -07001448func (d *Droidstubs) apiToXmlFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang71bbe632018-09-17 14:32:21 -07001449 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1450 if d.apiFile.String() == "" {
1451 ctx.ModuleErrorf("API signature file has to be specified in Metalava when jdiff is enabled.")
1452 }
1453
1454 d.apiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.xml")
Colin Cross33961b52019-07-11 11:01:22 -07001455 cmd.FlagWithOutput("--api-xml ", d.apiXmlFile)
Nan Zhang71bbe632018-09-17 14:32:21 -07001456
1457 if String(d.properties.Check_api.Last_released.Api_file) == "" {
1458 ctx.PropertyErrorf("check_api.last_released.api_file",
1459 "has to be non-empty if jdiff was enabled!")
1460 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001461
Colin Cross33961b52019-07-11 11:01:22 -07001462 lastReleasedApi := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
Nan Zhang71bbe632018-09-17 14:32:21 -07001463 d.lastReleasedApiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_last_released_api.xml")
Colin Cross33961b52019-07-11 11:01:22 -07001464 cmd.FlagWithInput("--convert-to-jdiff ", lastReleasedApi).Output(d.lastReleasedApiXmlFile)
1465 }
1466}
Nan Zhang71bbe632018-09-17 14:32:21 -07001467
Colin Cross1e743852019-10-28 11:37:20 -07001468func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersion javaVersion, srcs android.Paths,
Colin Cross33961b52019-07-11 11:01:22 -07001469 srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths) *android.RuleBuilderCommand {
Colin Cross8b8bec32019-11-15 13:18:43 -08001470 // Metalava uses lots of memory, restrict the number of metalava jobs that can run in parallel.
1471 rule.HighMem()
Colin Cross33961b52019-07-11 11:01:22 -07001472 cmd := rule.Command().BuiltTool(ctx, "metalava").
1473 Flag(config.JavacVmFlags).
1474 FlagWithArg("-encoding ", "UTF-8").
Colin Cross1e743852019-10-28 11:37:20 -07001475 FlagWithArg("-source ", javaVersion.String()).
Colin Cross33961b52019-07-11 11:01:22 -07001476 FlagWithRspFileInputList("@", srcs).
1477 FlagWithInput("@", srcJarList)
1478
1479 if len(bootclasspath) > 0 {
1480 cmd.FlagWithInputList("-bootclasspath ", bootclasspath.Paths(), ":")
Nan Zhang71bbe632018-09-17 14:32:21 -07001481 }
1482
Colin Cross33961b52019-07-11 11:01:22 -07001483 if len(classpath) > 0 {
1484 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
1485 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001486
Colin Cross33961b52019-07-11 11:01:22 -07001487 if len(sourcepaths) > 0 {
1488 cmd.FlagWithList("-sourcepath ", sourcepaths.Strings(), ":")
1489 } else {
1490 cmd.FlagWithArg("-sourcepath ", `""`)
1491 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001492
Colin Cross33961b52019-07-11 11:01:22 -07001493 cmd.Flag("--no-banner").
1494 Flag("--color").
1495 Flag("--quiet").
1496 Flag("--format=v2")
Nan Zhang86d2d552018-08-09 15:33:27 -07001497
Colin Cross33961b52019-07-11 11:01:22 -07001498 return cmd
Nan Zhang71bbe632018-09-17 14:32:21 -07001499}
1500
Nan Zhang1598a9e2018-09-04 17:14:32 -07001501func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Nan Zhanga40da042018-08-01 12:48:00 -07001502 deps := d.Javadoc.collectDeps(ctx)
1503
1504 javaVersion := getJavaVersion(ctx, String(d.Javadoc.properties.Java_version), sdkContext(d))
Nan Zhang581fd212018-01-10 16:06:12 -08001505
Colin Cross33961b52019-07-11 11:01:22 -07001506 // Create rule for metalava
Nan Zhanga40da042018-08-01 12:48:00 -07001507
Colin Crossdaa4c672019-07-15 22:53:46 -07001508 d.Javadoc.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
Nan Zhanga40da042018-08-01 12:48:00 -07001509
Colin Cross33961b52019-07-11 11:01:22 -07001510 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
1511 stubsDir := android.PathForModuleOut(ctx, "stubsDir")
Nan Zhang71bbe632018-09-17 14:32:21 -07001512
Colin Cross33961b52019-07-11 11:01:22 -07001513 rule := android.NewRuleBuilder()
Nan Zhanga40da042018-08-01 12:48:00 -07001514
Colin Cross33961b52019-07-11 11:01:22 -07001515 rule.Command().Text("rm -rf").Text(stubsDir.String())
1516 rule.Command().Text("mkdir -p").Text(stubsDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -07001517
Colin Cross33961b52019-07-11 11:01:22 -07001518 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1519
1520 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1521 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1522
1523 d.stubsFlags(ctx, cmd, stubsDir)
1524
1525 d.annotationsFlags(ctx, cmd)
1526 d.inclusionAnnotationsFlags(ctx, cmd)
1527 d.apiLevelsAnnotationsFlags(ctx, cmd)
1528 d.apiToXmlFlags(ctx, cmd)
Nan Zhang71bbe632018-09-17 14:32:21 -07001529
Nan Zhang1598a9e2018-09-04 17:14:32 -07001530 if strings.Contains(d.Javadoc.args, "--generate-documentation") {
1531 // Currently Metalava have the ability to invoke Javadoc in a seperate process.
1532 // Pass "-nodocs" to suppress the Javadoc invocation when Metalava receives
1533 // "--generate-documentation" arg. This is not needed when Metalava removes this feature.
1534 d.Javadoc.args = d.Javadoc.args + " -nodocs "
Nan Zhang79614d12018-04-19 18:03:39 -07001535 }
Colin Cross33961b52019-07-11 11:01:22 -07001536
1537 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1538 for _, o := range d.Javadoc.properties.Out {
1539 cmd.ImplicitOutput(android.PathForModuleGen(ctx, o))
1540 }
1541
1542 rule.Command().
1543 BuiltTool(ctx, "soong_zip").
1544 Flag("-write_if_changed").
1545 Flag("-jar").
1546 FlagWithOutput("-o ", d.Javadoc.stubsSrcJar).
1547 FlagWithArg("-C ", stubsDir.String()).
1548 FlagWithArg("-D ", stubsDir.String())
Jerome Gaillard0f599032019-10-10 19:29:11 +01001549
1550 if Bool(d.properties.Write_sdk_values) {
1551 d.metadataZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-metadata.zip")
1552 rule.Command().
1553 BuiltTool(ctx, "soong_zip").
1554 Flag("-write_if_changed").
1555 Flag("-d").
1556 FlagWithOutput("-o ", d.metadataZip).
1557 FlagWithArg("-C ", d.metadataDir.String()).
1558 FlagWithArg("-D ", d.metadataDir.String())
1559 }
1560
Colin Cross33961b52019-07-11 11:01:22 -07001561 rule.Restat()
1562
1563 zipSyncCleanupCmd(rule, srcJarDir)
1564
1565 rule.Build(pctx, ctx, "metalava", "metalava")
1566
1567 // Create rule for apicheck
Nan Zhang61819ce2018-05-04 18:49:16 -07001568
Adrian Roos075eedc2019-10-10 12:07:03 +02001569 if BoolDefault(d.properties.Check_api.Api_lint.Enabled, false) && !ctx.Config().IsPdkBuild() {
1570 rule := android.NewRuleBuilder()
1571 rule.Command().Text("( true")
1572
1573 srcJarDir := android.PathForModuleOut(ctx, "api_lint", "srcjars")
1574 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1575
1576 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1577 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1578
Adrian Rooscab4a2c2019-10-14 16:32:41 +02001579 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1580
Adrian Roos075eedc2019-10-10 12:07:03 +02001581 newSince := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Api_lint.New_since)
1582 if newSince.Valid() {
1583 cmd.FlagWithInput("--api-lint ", newSince.Path())
1584 } else {
1585 cmd.Flag("--api-lint")
1586 }
Adrian Roos3b8f1cd2019-11-01 13:42:39 +01001587 d.apiLintReport = android.PathForModuleOut(ctx, "api_lint_report.txt")
1588 cmd.FlagWithOutput("--report-even-if-suppressed ", d.apiLintReport)
Adrian Roos075eedc2019-10-10 12:07:03 +02001589
1590 d.inclusionAnnotationsFlags(ctx, cmd)
1591 d.mergeAnnoDirFlags(ctx, cmd)
1592
1593 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Api_lint.Baseline_file)
1594 updatedBaselineOutput := android.PathForModuleOut(ctx, "api_lint_baseline.txt")
1595 d.apiLintTimestamp = android.PathForModuleOut(ctx, "api_lint.timestamp")
1596
1597 if baselineFile.Valid() {
1598 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1599 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1600 }
1601
1602 zipSyncCleanupCmd(rule, srcJarDir)
1603
1604 msg := fmt.Sprintf(`\n******************************\n`+
1605 `Your API changes are triggering API Lint warnings or errors.\n\n`+
1606 `To make these errors go away, you have two choices:\n`+
1607 ` 1. You can suppress the errors with @SuppressLint(\"<id>\").\n\n`+
1608 ` 2. You can update the baseline by executing the following command:\n`+
1609 ` cp \"$PWD/%s\" \"$PWD/%s\"\n\n`+
1610 `******************************\n`, updatedBaselineOutput, baselineFile.Path())
1611 rule.Command().
1612 Text("touch").Output(d.apiLintTimestamp).
1613 Text(") || (").
1614 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1615 Text("; exit 38").
1616 Text(")")
1617
1618 rule.Build(pctx, ctx, "metalavaApiLint", "metalava API lint")
1619
1620 }
1621
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001622 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001623 !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001624
1625 if len(d.Javadoc.properties.Out) > 0 {
1626 ctx.PropertyErrorf("out", "out property may not be combined with check_api")
1627 }
1628
1629 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Api_file))
1630 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Removed_api_file))
Adrian Roos14f75a92019-08-12 17:54:09 +02001631 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Current.Baseline_file)
1632 updatedBaselineOutput := android.PathForModuleOut(ctx, "current_baseline.txt")
Nan Zhang61819ce2018-05-04 18:49:16 -07001633
Nan Zhang2760dfc2018-08-24 17:32:54 +00001634 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Nan Zhang2760dfc2018-08-24 17:32:54 +00001635
Colin Cross33961b52019-07-11 11:01:22 -07001636 rule := android.NewRuleBuilder()
1637
1638 rule.Command().Text("( true")
1639
1640 srcJarDir := android.PathForModuleOut(ctx, "current-apicheck", "srcjars")
1641 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1642
1643 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1644 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1645
1646 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles).
1647 FlagWithInput("--check-compatibility:api:current ", apiFile).
1648 FlagWithInput("--check-compatibility:removed:current ", removedApiFile)
1649
1650 d.inclusionAnnotationsFlags(ctx, cmd)
1651 d.mergeAnnoDirFlags(ctx, cmd)
1652
Adrian Roos14f75a92019-08-12 17:54:09 +02001653 if baselineFile.Valid() {
1654 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1655 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1656 }
1657
Colin Cross33961b52019-07-11 11:01:22 -07001658 zipSyncCleanupCmd(rule, srcJarDir)
1659
1660 msg := fmt.Sprintf(`\n******************************\n`+
1661 `You have tried to change the API from what has been previously approved.\n\n`+
1662 `To make these errors go away, you have two choices:\n`+
1663 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1664 ` errors above.\n\n`+
1665 ` 2. You can update current.txt by executing the following command:\n`+
1666 ` make %s-update-current-api\n\n`+
1667 ` To submit the revised current.txt to the main Android repository,\n`+
1668 ` you will need approval.\n`+
1669 `******************************\n`, ctx.ModuleName())
1670
1671 rule.Command().
1672 Text("touch").Output(d.checkCurrentApiTimestamp).
1673 Text(") || (").
1674 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1675 Text("; exit 38").
1676 Text(")")
1677
1678 rule.Build(pctx, ctx, "metalavaCurrentApiCheck", "metalava check current API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001679
1680 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Colin Cross33961b52019-07-11 11:01:22 -07001681
1682 // update API rule
1683 rule = android.NewRuleBuilder()
1684
1685 rule.Command().Text("( true")
1686
1687 rule.Command().
1688 Text("cp").Flag("-f").
1689 Input(d.apiFile).Flag(apiFile.String())
1690
1691 rule.Command().
1692 Text("cp").Flag("-f").
1693 Input(d.removedApiFile).Flag(removedApiFile.String())
1694
1695 msg = "failed to update public API"
1696
1697 rule.Command().
1698 Text("touch").Output(d.updateCurrentApiTimestamp).
1699 Text(") || (").
1700 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1701 Text("; exit 38").
1702 Text(")")
1703
1704 rule.Build(pctx, ctx, "metalavaCurrentApiUpdate", "update current API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001705 }
Nan Zhanga40da042018-08-01 12:48:00 -07001706
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001707 if apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001708 !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001709
1710 if len(d.Javadoc.properties.Out) > 0 {
1711 ctx.PropertyErrorf("out", "out property may not be combined with check_api")
1712 }
1713
1714 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
1715 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file))
Adrian Roos14f75a92019-08-12 17:54:09 +02001716 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file)
1717 updatedBaselineOutput := android.PathForModuleOut(ctx, "last_released_baseline.txt")
Nan Zhang61819ce2018-05-04 18:49:16 -07001718
Nan Zhang2760dfc2018-08-24 17:32:54 +00001719 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
Nan Zhang2760dfc2018-08-24 17:32:54 +00001720
Colin Cross33961b52019-07-11 11:01:22 -07001721 rule := android.NewRuleBuilder()
1722
1723 rule.Command().Text("( true")
1724
1725 srcJarDir := android.PathForModuleOut(ctx, "last-apicheck", "srcjars")
1726 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1727
1728 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1729 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1730
1731 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles).
1732 FlagWithInput("--check-compatibility:api:released ", apiFile)
1733
1734 d.inclusionAnnotationsFlags(ctx, cmd)
1735
1736 cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile)
1737
1738 d.mergeAnnoDirFlags(ctx, cmd)
1739
Adrian Roos14f75a92019-08-12 17:54:09 +02001740 if baselineFile.Valid() {
1741 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1742 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1743 }
1744
Colin Cross33961b52019-07-11 11:01:22 -07001745 zipSyncCleanupCmd(rule, srcJarDir)
1746
1747 msg := `\n******************************\n` +
1748 `You have tried to change the API from what has been previously released in\n` +
1749 `an SDK. Please fix the errors listed above.\n` +
1750 `******************************\n`
1751 rule.Command().
1752 Text("touch").Output(d.checkLastReleasedApiTimestamp).
1753 Text(") || (").
1754 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1755 Text("; exit 38").
1756 Text(")")
1757
1758 rule.Build(pctx, ctx, "metalavaLastApiCheck", "metalava check last API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001759 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001760
Pete Gillin581d6082018-10-22 15:55:04 +01001761 if String(d.properties.Check_nullability_warnings) != "" {
1762 if d.nullabilityWarningsFile == nil {
1763 ctx.PropertyErrorf("check_nullability_warnings",
1764 "Cannot specify check_nullability_warnings unless validating nullability")
1765 }
Colin Cross33961b52019-07-11 11:01:22 -07001766
1767 checkNullabilityWarnings := android.PathForModuleSrc(ctx, String(d.properties.Check_nullability_warnings))
1768
Pete Gillin581d6082018-10-22 15:55:04 +01001769 d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, "check_nullability_warnings.timestamp")
Colin Cross33961b52019-07-11 11:01:22 -07001770
Pete Gillin581d6082018-10-22 15:55:04 +01001771 msg := fmt.Sprintf(`\n******************************\n`+
1772 `The warnings encountered during nullability annotation validation did\n`+
1773 `not match the checked in file of expected warnings. The diffs are shown\n`+
1774 `above. You have two options:\n`+
1775 ` 1. Resolve the differences by editing the nullability annotations.\n`+
1776 ` 2. Update the file of expected warnings by running:\n`+
1777 ` cp %s %s\n`+
1778 ` and submitting the updated file as part of your change.`,
1779 d.nullabilityWarningsFile, checkNullabilityWarnings)
Colin Cross33961b52019-07-11 11:01:22 -07001780
1781 rule := android.NewRuleBuilder()
1782
1783 rule.Command().
1784 Text("(").
1785 Text("diff").Input(checkNullabilityWarnings).Input(d.nullabilityWarningsFile).
1786 Text("&&").
1787 Text("touch").Output(d.checkNullabilityWarningsTimestamp).
1788 Text(") || (").
1789 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1790 Text("; exit 38").
1791 Text(")")
1792
1793 rule.Build(pctx, ctx, "nullabilityWarningsCheck", "nullability warnings check")
Pete Gillin581d6082018-10-22 15:55:04 +01001794 }
1795
Nan Zhang71bbe632018-09-17 14:32:21 -07001796 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001797 if len(d.Javadoc.properties.Out) > 0 {
1798 ctx.PropertyErrorf("out", "out property may not be combined with jdiff")
1799 }
1800
1801 outDir := android.PathForModuleOut(ctx, "jdiff-out")
1802 srcJarDir := android.PathForModuleOut(ctx, "jdiff-srcjars")
1803 stubsDir := android.PathForModuleOut(ctx, "jdiff-stubsDir")
1804
1805 rule := android.NewRuleBuilder()
Nan Zhang71bbe632018-09-17 14:32:21 -07001806
Nan Zhang86b06202018-09-21 17:09:21 -07001807 // Please sync with android-api-council@ before making any changes for the name of jdiffDocZip below
1808 // since there's cron job downstream that fetch this .zip file periodically.
1809 // See b/116221385 for reference.
Nan Zhang71bbe632018-09-17 14:32:21 -07001810 d.jdiffDocZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-docs.zip")
1811 d.jdiffStubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-stubs.srcjar")
1812
Nan Zhang71bbe632018-09-17 14:32:21 -07001813 jdiff := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jdiff.jar")
Nan Zhang71bbe632018-09-17 14:32:21 -07001814
Colin Cross33961b52019-07-11 11:01:22 -07001815 rule.Command().Text("rm -rf").Text(outDir.String()).Text(stubsDir.String())
1816 rule.Command().Text("mkdir -p").Text(outDir.String()).Text(stubsDir.String())
Nan Zhang71bbe632018-09-17 14:32:21 -07001817
Colin Cross33961b52019-07-11 11:01:22 -07001818 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1819
Colin Crossdaa4c672019-07-15 22:53:46 -07001820 cmd := javadocBootclasspathCmd(ctx, rule, d.Javadoc.srcFiles, outDir, srcJarDir, srcJarList,
Colin Crossab054432019-07-15 16:13:59 -07001821 deps.bootClasspath, deps.classpath, d.sourcepaths)
1822
1823 cmd.Flag("-J-Xmx1600m").
Colin Cross33961b52019-07-11 11:01:22 -07001824 Flag("-XDignore.symbol.file").
1825 FlagWithArg("-doclet ", "jdiff.JDiff").
1826 FlagWithInput("-docletpath ", jdiff).
1827 Flag("-quiet").
1828 FlagWithArg("-newapi ", strings.TrimSuffix(d.apiXmlFile.Base(), d.apiXmlFile.Ext())).
1829 FlagWithArg("-newapidir ", filepath.Dir(d.apiXmlFile.String())).
1830 Implicit(d.apiXmlFile).
1831 FlagWithArg("-oldapi ", strings.TrimSuffix(d.lastReleasedApiXmlFile.Base(), d.lastReleasedApiXmlFile.Ext())).
1832 FlagWithArg("-oldapidir ", filepath.Dir(d.lastReleasedApiXmlFile.String())).
1833 Implicit(d.lastReleasedApiXmlFile)
1834
Colin Cross33961b52019-07-11 11:01:22 -07001835 rule.Command().
1836 BuiltTool(ctx, "soong_zip").
1837 Flag("-write_if_changed").
1838 Flag("-d").
1839 FlagWithOutput("-o ", d.jdiffDocZip).
1840 FlagWithArg("-C ", outDir.String()).
1841 FlagWithArg("-D ", outDir.String())
1842
1843 rule.Command().
1844 BuiltTool(ctx, "soong_zip").
1845 Flag("-write_if_changed").
1846 Flag("-jar").
1847 FlagWithOutput("-o ", d.jdiffStubsSrcJar).
1848 FlagWithArg("-C ", stubsDir.String()).
1849 FlagWithArg("-D ", stubsDir.String())
1850
1851 rule.Restat()
1852
1853 zipSyncCleanupCmd(rule, srcJarDir)
1854
1855 rule.Build(pctx, ctx, "jdiff", "jdiff")
Nan Zhang71bbe632018-09-17 14:32:21 -07001856 }
Nan Zhang581fd212018-01-10 16:06:12 -08001857}
Dan Willemsencc090972018-02-26 14:33:31 -08001858
Nan Zhanga40da042018-08-01 12:48:00 -07001859//
Nan Zhangf4936b02018-08-01 15:00:28 -07001860// Exported Droiddoc Directory
Nan Zhanga40da042018-08-01 12:48:00 -07001861//
Dan Willemsencc090972018-02-26 14:33:31 -08001862var droiddocTemplateTag = dependencyTag{name: "droiddoc-template"}
Nan Zhangf4936b02018-08-01 15:00:28 -07001863var metalavaMergeAnnotationsDirTag = dependencyTag{name: "metalava-merge-annotations-dir"}
Pete Gillin77167902018-09-19 18:16:26 +01001864var metalavaMergeInclusionAnnotationsDirTag = dependencyTag{name: "metalava-merge-inclusion-annotations-dir"}
Nan Zhang9c69a122018-08-22 10:22:08 -07001865var metalavaAPILevelsAnnotationsDirTag = dependencyTag{name: "metalava-api-levels-annotations-dir"}
Dan Willemsencc090972018-02-26 14:33:31 -08001866
Nan Zhangf4936b02018-08-01 15:00:28 -07001867type ExportedDroiddocDirProperties struct {
1868 // path to the directory containing Droiddoc related files.
Dan Willemsencc090972018-02-26 14:33:31 -08001869 Path *string
1870}
1871
Nan Zhangf4936b02018-08-01 15:00:28 -07001872type ExportedDroiddocDir struct {
Dan Willemsencc090972018-02-26 14:33:31 -08001873 android.ModuleBase
1874
Nan Zhangf4936b02018-08-01 15:00:28 -07001875 properties ExportedDroiddocDirProperties
Dan Willemsencc090972018-02-26 14:33:31 -08001876
1877 deps android.Paths
1878 dir android.Path
1879}
1880
Colin Crossa3002fc2019-07-08 16:48:04 -07001881// droiddoc_exported_dir exports a directory of html templates or nullability annotations for use by doclava.
Nan Zhangf4936b02018-08-01 15:00:28 -07001882func ExportedDroiddocDirFactory() android.Module {
1883 module := &ExportedDroiddocDir{}
Dan Willemsencc090972018-02-26 14:33:31 -08001884 module.AddProperties(&module.properties)
1885 android.InitAndroidModule(module)
1886 return module
1887}
1888
Nan Zhangf4936b02018-08-01 15:00:28 -07001889func (d *ExportedDroiddocDir) DepsMutator(android.BottomUpMutatorContext) {}
Dan Willemsencc090972018-02-26 14:33:31 -08001890
Nan Zhangf4936b02018-08-01 15:00:28 -07001891func (d *ExportedDroiddocDir) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross07e51612019-03-05 12:46:40 -08001892 path := String(d.properties.Path)
1893 d.dir = android.PathForModuleSrc(ctx, path)
Colin Cross8a497952019-03-05 22:25:09 -08001894 d.deps = android.PathsForModuleSrc(ctx, []string{filepath.Join(path, "**/*")})
Dan Willemsencc090972018-02-26 14:33:31 -08001895}
Nan Zhangb2b33de2018-02-23 11:18:47 -08001896
1897//
1898// Defaults
1899//
1900type DocDefaults struct {
1901 android.ModuleBase
1902 android.DefaultsModuleBase
1903}
1904
Nan Zhangb2b33de2018-02-23 11:18:47 -08001905func DocDefaultsFactory() android.Module {
1906 module := &DocDefaults{}
1907
1908 module.AddProperties(
1909 &JavadocProperties{},
1910 &DroiddocProperties{},
1911 )
1912
1913 android.InitDefaultsModule(module)
1914
1915 return module
1916}
Nan Zhang1598a9e2018-09-04 17:14:32 -07001917
1918func StubsDefaultsFactory() android.Module {
1919 module := &DocDefaults{}
1920
1921 module.AddProperties(
1922 &JavadocProperties{},
1923 &DroidstubsProperties{},
1924 )
1925
1926 android.InitDefaultsModule(module)
1927
1928 return module
1929}
Colin Cross33961b52019-07-11 11:01:22 -07001930
1931func zipSyncCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
1932 srcJarDir android.ModuleOutPath, srcJars android.Paths) android.OutputPath {
1933
1934 rule.Command().Text("rm -rf").Text(srcJarDir.String())
1935 rule.Command().Text("mkdir -p").Text(srcJarDir.String())
1936 srcJarList := srcJarDir.Join(ctx, "list")
1937
1938 rule.Temporary(srcJarList)
1939
1940 rule.Command().BuiltTool(ctx, "zipsync").
1941 FlagWithArg("-d ", srcJarDir.String()).
1942 FlagWithOutput("-l ", srcJarList).
1943 FlagWithArg("-f ", `"*.java"`).
1944 Inputs(srcJars)
1945
1946 return srcJarList
1947}
1948
1949func zipSyncCleanupCmd(rule *android.RuleBuilder, srcJarDir android.ModuleOutPath) {
1950 rule.Command().Text("rm -rf").Text(srcJarDir.String())
1951}
Paul Duffin91547182019-11-12 19:39:36 +00001952
1953var _ android.PrebuiltInterface = (*PrebuiltStubsSources)(nil)
1954
1955type PrebuiltStubsSourcesProperties struct {
1956 Srcs []string `android:"path"`
1957}
1958
1959type PrebuiltStubsSources struct {
1960 android.ModuleBase
1961 android.DefaultableModuleBase
1962 prebuilt android.Prebuilt
1963 android.SdkBase
1964
1965 properties PrebuiltStubsSourcesProperties
1966
Paul Duffin9b478b02019-12-10 13:41:51 +00001967 // The source directories containing stubs source files.
1968 srcDirs android.Paths
Paul Duffin91547182019-11-12 19:39:36 +00001969 stubsSrcJar android.ModuleOutPath
1970}
1971
Paul Duffin9b478b02019-12-10 13:41:51 +00001972func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) {
1973 switch tag {
1974 case "":
1975 return android.Paths{p.stubsSrcJar}, nil
1976 default:
1977 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
1978 }
1979}
1980
Paul Duffin91547182019-11-12 19:39:36 +00001981func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Paul Duffin9b478b02019-12-10 13:41:51 +00001982 p.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
1983
1984 p.srcDirs = android.PathsForModuleSrc(ctx, p.properties.Srcs)
1985
1986 rule := android.NewRuleBuilder()
1987 command := rule.Command().
1988 BuiltTool(ctx, "soong_zip").
1989 Flag("-write_if_changed").
1990 Flag("-jar").
1991 FlagWithOutput("-o ", p.stubsSrcJar)
1992
1993 for _, d := range p.srcDirs {
1994 dir := d.String()
1995 command.
1996 FlagWithArg("-C ", dir).
1997 FlagWithInput("-D ", d)
1998 }
1999
2000 rule.Restat()
2001
2002 rule.Build(pctx, ctx, "zip src", "Create srcjar from prebuilt source")
Paul Duffin91547182019-11-12 19:39:36 +00002003}
2004
2005func (p *PrebuiltStubsSources) Prebuilt() *android.Prebuilt {
2006 return &p.prebuilt
2007}
2008
2009func (p *PrebuiltStubsSources) Name() string {
2010 return p.prebuilt.Name(p.ModuleBase.Name())
2011}
2012
Paul Duffin91547182019-11-12 19:39:36 +00002013// prebuilt_stubs_sources imports a set of java source files as if they were
2014// generated by droidstubs.
2015//
2016// By default, a prebuilt_stubs_sources has a single variant that expects a
2017// set of `.java` files generated by droidstubs.
2018//
2019// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one
2020// for host modules.
2021//
2022// Intended only for use by sdk snapshots.
2023func PrebuiltStubsSourcesFactory() android.Module {
2024 module := &PrebuiltStubsSources{}
2025
2026 module.AddProperties(&module.properties)
2027
2028 android.InitPrebuiltModule(module, &module.properties.Srcs)
2029 android.InitSdkAwareModule(module)
2030 InitDroiddocModule(module, android.HostAndDeviceSupported)
2031 return module
2032}
2033
Paul Duffin13879572019-11-28 14:31:38 +00002034type droidStubsSdkMemberType struct {
Paul Duffin255f18e2019-12-13 11:22:16 +00002035 android.SdkMemberTypeBase
Paul Duffin13879572019-11-28 14:31:38 +00002036}
2037
2038func (mt *droidStubsSdkMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) {
2039 mctx.AddVariationDependencies(nil, dependencyTag, names...)
2040}
2041
2042func (mt *droidStubsSdkMemberType) IsInstance(module android.Module) bool {
2043 _, ok := module.(*Droidstubs)
2044 return ok
2045}
2046
2047func (mt *droidStubsSdkMemberType) BuildSnapshot(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember) {
2048 variants := member.Variants()
2049 if len(variants) != 1 {
2050 sdkModuleContext.ModuleErrorf("sdk contains %d variants of member %q but only one is allowed", len(variants), member.Name())
2051 }
2052 variant := variants[0]
2053 d, _ := variant.(*Droidstubs)
Paul Duffin91547182019-11-12 19:39:36 +00002054 stubsSrcJar := d.stubsSrcJar
2055
2056 snapshotRelativeDir := filepath.Join("java", d.Name()+"_stubs_sources")
2057 builder.UnzipToSnapshot(stubsSrcJar, snapshotRelativeDir)
2058
Paul Duffin9d8d6092019-12-05 18:19:29 +00002059 pbm := builder.AddPrebuiltModule(member, "prebuilt_stubs_sources")
Paul Duffinb645ec82019-11-27 17:43:54 +00002060 pbm.AddProperty("srcs", []string{snapshotRelativeDir})
Paul Duffin91547182019-11-12 19:39:36 +00002061}