blob: f3a16eadfcf366c0d899f52e2adf64c32383e4d7 [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
Paul Duffin3d1248c2020-04-09 00:10:17 +0100373// Used by xsd_config
Nan Zhang1598a9e2018-09-04 17:14:32 -0700374type ApiFilePath interface {
375 ApiFilePath() android.Path
376}
377
Paul Duffin3d1248c2020-04-09 00:10:17 +0100378// Provider of information about API stubs, used by java_sdk_library.
379type ApiStubsProvider interface {
380 ApiFilePath
Paul Duffin1fd005d2020-04-09 01:08:11 +0100381 RemovedApiFilePath() android.Path
Paul Duffin3d1248c2020-04-09 00:10:17 +0100382 StubsSrcJar() android.Path
383}
384
Nan Zhanga40da042018-08-01 12:48:00 -0700385//
386// Javadoc
387//
Nan Zhang581fd212018-01-10 16:06:12 -0800388type Javadoc struct {
389 android.ModuleBase
390 android.DefaultableModuleBase
391
392 properties JavadocProperties
393
394 srcJars android.Paths
395 srcFiles android.Paths
396 sourcepaths android.Paths
Nan Zhang1598a9e2018-09-04 17:14:32 -0700397 argFiles android.Paths
398
399 args string
Nan Zhang581fd212018-01-10 16:06:12 -0800400
Nan Zhangccff0f72018-03-08 17:26:16 -0800401 docZip android.WritablePath
402 stubsSrcJar android.WritablePath
Nan Zhang581fd212018-01-10 16:06:12 -0800403}
404
Colin Cross41955e82019-05-29 14:40:35 -0700405func (j *Javadoc) OutputFiles(tag string) (android.Paths, error) {
406 switch tag {
407 case "":
408 return android.Paths{j.stubsSrcJar}, nil
Colin Crosse68e5542019-08-12 13:11:40 -0700409 case ".docs.zip":
410 return android.Paths{j.docZip}, nil
Colin Cross41955e82019-05-29 14:40:35 -0700411 default:
412 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
413 }
Nan Zhangb2b33de2018-02-23 11:18:47 -0800414}
415
Colin Crossa3002fc2019-07-08 16:48:04 -0700416// javadoc converts .java source files to documentation using javadoc.
Nan Zhang581fd212018-01-10 16:06:12 -0800417func JavadocFactory() android.Module {
418 module := &Javadoc{}
419
420 module.AddProperties(&module.properties)
421
422 InitDroiddocModule(module, android.HostAndDeviceSupported)
423 return module
424}
425
Colin Crossa3002fc2019-07-08 16:48:04 -0700426// javadoc_host converts .java source files to documentation using javadoc.
Nan Zhang581fd212018-01-10 16:06:12 -0800427func JavadocHostFactory() android.Module {
428 module := &Javadoc{}
429
430 module.AddProperties(&module.properties)
431
432 InitDroiddocModule(module, android.HostSupported)
433 return module
434}
435
Colin Cross41955e82019-05-29 14:40:35 -0700436var _ android.OutputFileProducer = (*Javadoc)(nil)
Nan Zhang581fd212018-01-10 16:06:12 -0800437
Jiyong Park6a927c42020-01-21 02:03:43 +0900438func (j *Javadoc) sdkVersion() sdkSpec {
439 return sdkSpecFrom(String(j.properties.Sdk_version))
Colin Cross83bb3162018-06-25 15:48:06 -0700440}
441
Paul Duffine25c6442019-10-11 13:50:28 +0100442func (j *Javadoc) systemModules() string {
443 return proptools.String(j.properties.System_modules)
444}
445
Jiyong Park6a927c42020-01-21 02:03:43 +0900446func (j *Javadoc) minSdkVersion() sdkSpec {
Colin Cross83bb3162018-06-25 15:48:06 -0700447 return j.sdkVersion()
448}
449
Jiyong Park6a927c42020-01-21 02:03:43 +0900450func (j *Javadoc) targetSdkVersion() sdkSpec {
Dan Willemsen419290a2018-10-31 15:28:47 -0700451 return j.sdkVersion()
452}
453
Nan Zhang581fd212018-01-10 16:06:12 -0800454func (j *Javadoc) addDeps(ctx android.BottomUpMutatorContext) {
455 if ctx.Device() {
Paul Duffin250e6192019-06-07 10:44:37 +0100456 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Colin Cross6d8d8c62019-10-28 15:10:03 -0700457 if sdkDep.useDefaultLibs {
458 ctx.AddVariationDependencies(nil, bootClasspathTag, config.DefaultBootclasspathLibraries...)
459 ctx.AddVariationDependencies(nil, systemModulesTag, config.DefaultSystemModules)
460 if sdkDep.hasFrameworkLibs() {
461 ctx.AddVariationDependencies(nil, libTag, config.DefaultLibraries...)
Nan Zhang357466b2018-04-17 17:38:36 -0700462 }
Colin Cross6d8d8c62019-10-28 15:10:03 -0700463 } else if sdkDep.useModule {
Colin Cross6cef4812019-10-17 14:23:50 -0700464 ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.bootclasspath...)
Paul Duffine25c6442019-10-11 13:50:28 +0100465 ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
Colin Cross6cef4812019-10-17 14:23:50 -0700466 ctx.AddVariationDependencies(nil, java9LibTag, sdkDep.java9Classpath...)
Nan Zhang581fd212018-01-10 16:06:12 -0800467 }
468 }
469
Colin Cross42d48b72018-08-29 14:10:52 -0700470 ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800471}
472
Nan Zhanga40da042018-08-01 12:48:00 -0700473func (j *Javadoc) collectAidlFlags(ctx android.ModuleContext, deps deps) droiddocBuilderFlags {
474 var flags droiddocBuilderFlags
Jiyong Park1e440682018-05-23 18:42:04 +0900475
Colin Cross3047fa22019-04-18 10:56:44 -0700476 flags.aidlFlags, flags.aidlDeps = j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs)
Jiyong Park1e440682018-05-23 18:42:04 +0900477
478 return flags
479}
480
481func (j *Javadoc) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
Colin Cross3047fa22019-04-18 10:56:44 -0700482 aidlIncludeDirs android.Paths) (string, android.Paths) {
Jiyong Park1e440682018-05-23 18:42:04 +0900483
484 aidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl.Local_include_dirs)
485 aidlIncludes = append(aidlIncludes, android.PathsForSource(ctx, j.properties.Aidl.Include_dirs)...)
486
487 var flags []string
Colin Cross3047fa22019-04-18 10:56:44 -0700488 var deps android.Paths
489
Jiyong Park1e440682018-05-23 18:42:04 +0900490 if aidlPreprocess.Valid() {
491 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Cross3047fa22019-04-18 10:56:44 -0700492 deps = append(deps, aidlPreprocess.Path())
Jiyong Park1e440682018-05-23 18:42:04 +0900493 } else {
494 flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
495 }
496
497 flags = append(flags, android.JoinWithPrefix(aidlIncludes.Strings(), "-I"))
498 flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
499 if src := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "src"); src.Valid() {
500 flags = append(flags, "-I"+src.String())
501 }
502
Colin Cross3047fa22019-04-18 10:56:44 -0700503 return strings.Join(flags, " "), deps
Jiyong Park1e440682018-05-23 18:42:04 +0900504}
505
Jiyong Parkd90d7412019-08-20 22:49:19 +0900506// TODO: remove the duplication between this and the one in gen.go
Jiyong Park1e440682018-05-23 18:42:04 +0900507func (j *Javadoc) genSources(ctx android.ModuleContext, srcFiles android.Paths,
Nan Zhanga40da042018-08-01 12:48:00 -0700508 flags droiddocBuilderFlags) android.Paths {
Jiyong Park1e440682018-05-23 18:42:04 +0900509
510 outSrcFiles := make(android.Paths, 0, len(srcFiles))
Colin Crossc0806172019-06-14 18:51:47 -0700511 var aidlSrcs android.Paths
Jiyong Park1e440682018-05-23 18:42:04 +0900512
Jiyong Park1112c4c2019-08-16 21:12:10 +0900513 aidlIncludeFlags := genAidlIncludeFlags(srcFiles)
514
Jiyong Park1e440682018-05-23 18:42:04 +0900515 for _, srcFile := range srcFiles {
516 switch srcFile.Ext() {
517 case ".aidl":
Colin Crossc0806172019-06-14 18:51:47 -0700518 aidlSrcs = append(aidlSrcs, srcFile)
Jiyong Parkd90d7412019-08-20 22:49:19 +0900519 case ".logtags":
520 javaFile := genLogtags(ctx, srcFile)
521 outSrcFiles = append(outSrcFiles, javaFile)
Jiyong Park1e440682018-05-23 18:42:04 +0900522 default:
523 outSrcFiles = append(outSrcFiles, srcFile)
524 }
525 }
526
Colin Crossc0806172019-06-14 18:51:47 -0700527 // Process all aidl files together to support sharding them into one or more rules that produce srcjars.
528 if len(aidlSrcs) > 0 {
529 srcJarFiles := genAidl(ctx, aidlSrcs, flags.aidlFlags+aidlIncludeFlags, flags.aidlDeps)
530 outSrcFiles = append(outSrcFiles, srcJarFiles...)
531 }
532
Jiyong Park1e440682018-05-23 18:42:04 +0900533 return outSrcFiles
534}
535
Nan Zhang581fd212018-01-10 16:06:12 -0800536func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
537 var deps deps
538
Colin Cross83bb3162018-06-25 15:48:06 -0700539 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800540 if sdkDep.invalidVersion {
Colin Cross6cef4812019-10-17 14:23:50 -0700541 ctx.AddMissingDependencies(sdkDep.bootclasspath)
542 ctx.AddMissingDependencies(sdkDep.java9Classpath)
Nan Zhang581fd212018-01-10 16:06:12 -0800543 } else if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700544 deps.bootClasspath = append(deps.bootClasspath, sdkDep.jars...)
Anton Hansson26bf49b2020-02-08 20:26:29 +0000545 deps.aidlPreprocess = sdkDep.aidl
546 } else {
547 deps.aidlPreprocess = sdkDep.aidl
Nan Zhang581fd212018-01-10 16:06:12 -0800548 }
549
550 ctx.VisitDirectDeps(func(module android.Module) {
551 otherName := ctx.OtherModuleName(module)
552 tag := ctx.OtherModuleDependencyTag(module)
553
Colin Cross2d24c1b2018-05-23 10:59:18 -0700554 switch tag {
555 case bootClasspathTag:
556 if dep, ok := module.(Dependency); ok {
Nan Zhang581fd212018-01-10 16:06:12 -0800557 deps.bootClasspath = append(deps.bootClasspath, dep.ImplementationJars()...)
Paul Duffin83a2d962019-11-19 19:44:10 +0000558 } else if sm, ok := module.(SystemModulesProvider); ok {
Paul Duffine25c6442019-10-11 13:50:28 +0100559 // A system modules dependency has been added to the bootclasspath
560 // so add its libs to the bootclasspath.
Paul Duffin83a2d962019-11-19 19:44:10 +0000561 deps.bootClasspath = append(deps.bootClasspath, sm.HeaderJars()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700562 } else {
563 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
564 }
565 case libTag:
566 switch dep := module.(type) {
Colin Cross897d2ed2019-02-11 14:03:51 -0800567 case SdkLibraryDependency:
568 deps.classpath = append(deps.classpath, dep.SdkImplementationJars(ctx, j.sdkVersion())...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700569 case Dependency:
Sundong Ahnba493602018-11-20 17:36:35 +0900570 deps.classpath = append(deps.classpath, dep.HeaderJars()...)
Jiyong Park19a7f252019-07-10 16:59:31 +0900571 deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700572 case android.SourceFileProducer:
Nan Zhang581fd212018-01-10 16:06:12 -0800573 checkProducesJars(ctx, dep)
574 deps.classpath = append(deps.classpath, dep.Srcs()...)
Nan Zhang581fd212018-01-10 16:06:12 -0800575 default:
576 ctx.ModuleErrorf("depends on non-java module %q", otherName)
577 }
Colin Cross6cef4812019-10-17 14:23:50 -0700578 case java9LibTag:
579 switch dep := module.(type) {
580 case Dependency:
581 deps.java9Classpath = append(deps.java9Classpath, dep.HeaderJars()...)
582 default:
583 ctx.ModuleErrorf("depends on non-java module %q", otherName)
584 }
Nan Zhang357466b2018-04-17 17:38:36 -0700585 case systemModulesTag:
586 if deps.systemModules != nil {
587 panic("Found two system module dependencies")
588 }
Paul Duffin83a2d962019-11-19 19:44:10 +0000589 sm := module.(SystemModulesProvider)
590 outputDir, outputDeps := sm.OutputDirAndDeps()
591 deps.systemModules = &systemModules{outputDir, outputDeps}
Nan Zhang581fd212018-01-10 16:06:12 -0800592 }
593 })
594 // do not pass exclude_srcs directly when expanding srcFiles since exclude_srcs
595 // may contain filegroup or genrule.
Colin Cross8a497952019-03-05 22:25:09 -0800596 srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
Jiyong Parkc6ddccf2019-09-13 20:56:14 +0900597
598 filterByPackage := func(srcs []android.Path, filterPackages []string) []android.Path {
599 if filterPackages == nil {
600 return srcs
601 }
602 filtered := []android.Path{}
603 for _, src := range srcs {
604 if src.Ext() != ".java" {
605 // Don't filter-out non-Java (=generated sources) by package names. This is not ideal,
606 // but otherwise metalava emits stub sources having references to the generated AIDL classes
607 // in filtered-out pacages (e.g. com.android.internal.*).
608 // TODO(b/141149570) We need to fix this by introducing default private constructors or
609 // fixing metalava to not emit constructors having references to unknown classes.
610 filtered = append(filtered, src)
611 continue
612 }
613 packageName := strings.ReplaceAll(filepath.Dir(src.Rel()), "/", ".")
Jaewoong Jung3aff5782020-02-11 07:54:35 -0800614 if android.HasAnyPrefix(packageName, filterPackages) {
615 filtered = append(filtered, src)
Jiyong Parkc6ddccf2019-09-13 20:56:14 +0900616 }
617 }
618 return filtered
619 }
620 srcFiles = filterByPackage(srcFiles, j.properties.Filter_packages)
621
Nan Zhanga40da042018-08-01 12:48:00 -0700622 flags := j.collectAidlFlags(ctx, deps)
Jiyong Park1e440682018-05-23 18:42:04 +0900623 srcFiles = j.genSources(ctx, srcFiles, flags)
Nan Zhang581fd212018-01-10 16:06:12 -0800624
625 // srcs may depend on some genrule output.
626 j.srcJars = srcFiles.FilterByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800627 j.srcJars = append(j.srcJars, deps.srcJars...)
628
Nan Zhang581fd212018-01-10 16:06:12 -0800629 j.srcFiles = srcFiles.FilterOutByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800630 j.srcFiles = append(j.srcFiles, deps.srcs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800631
Nan Zhang9c69a122018-08-22 10:22:08 -0700632 if j.properties.Local_sourcepaths == nil && len(j.srcFiles) > 0 {
Nan Zhang581fd212018-01-10 16:06:12 -0800633 j.properties.Local_sourcepaths = append(j.properties.Local_sourcepaths, ".")
634 }
635 j.sourcepaths = android.PathsForModuleSrc(ctx, j.properties.Local_sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800636
Colin Cross8a497952019-03-05 22:25:09 -0800637 j.argFiles = android.PathsForModuleSrc(ctx, j.properties.Arg_files)
Paul Duffin99e4a502019-02-11 15:38:42 +0000638 argFilesMap := map[string]string{}
639 argFileLabels := []string{}
Nan Zhang1598a9e2018-09-04 17:14:32 -0700640
Paul Duffin99e4a502019-02-11 15:38:42 +0000641 for _, label := range j.properties.Arg_files {
Colin Cross8a497952019-03-05 22:25:09 -0800642 var paths = android.PathsForModuleSrc(ctx, []string{label})
Paul Duffin99e4a502019-02-11 15:38:42 +0000643 if _, exists := argFilesMap[label]; !exists {
644 argFilesMap[label] = strings.Join(paths.Strings(), " ")
645 argFileLabels = append(argFileLabels, label)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700646 } else {
647 ctx.ModuleErrorf("multiple arg_files for %q, %q and %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000648 label, argFilesMap[label], paths)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700649 }
650 }
651
652 var err error
Colin Cross15638152019-07-11 11:11:35 -0700653 j.args, err = android.Expand(String(j.properties.Args), func(name string) (string, error) {
Nan Zhang1598a9e2018-09-04 17:14:32 -0700654 if strings.HasPrefix(name, "location ") {
655 label := strings.TrimSpace(strings.TrimPrefix(name, "location "))
Paul Duffin99e4a502019-02-11 15:38:42 +0000656 if paths, ok := argFilesMap[label]; ok {
Colin Cross15638152019-07-11 11:11:35 -0700657 return paths, nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700658 } else {
Colin Cross15638152019-07-11 11:11:35 -0700659 return "", fmt.Errorf("unknown location label %q, expecting one of %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000660 label, strings.Join(argFileLabels, ", "))
Nan Zhang1598a9e2018-09-04 17:14:32 -0700661 }
662 } else if name == "genDir" {
Colin Cross15638152019-07-11 11:11:35 -0700663 return android.PathForModuleGen(ctx).String(), nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700664 }
Colin Cross15638152019-07-11 11:11:35 -0700665 return "", fmt.Errorf("unknown variable '$(%s)'", name)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700666 })
667
668 if err != nil {
669 ctx.PropertyErrorf("args", "%s", err.Error())
670 }
671
Nan Zhang581fd212018-01-10 16:06:12 -0800672 return deps
673}
674
675func (j *Javadoc) DepsMutator(ctx android.BottomUpMutatorContext) {
676 j.addDeps(ctx)
677}
678
679func (j *Javadoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
680 deps := j.collectDeps(ctx)
681
Colin Crossdaa4c672019-07-15 22:53:46 -0700682 j.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
Nan Zhang581fd212018-01-10 16:06:12 -0800683
Colin Crossdaa4c672019-07-15 22:53:46 -0700684 outDir := android.PathForModuleOut(ctx, "out")
685 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
686
687 j.stubsSrcJar = nil
688
689 rule := android.NewRuleBuilder()
690
691 rule.Command().Text("rm -rf").Text(outDir.String())
692 rule.Command().Text("mkdir -p").Text(outDir.String())
693
694 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, j.srcJars)
Nan Zhang357466b2018-04-17 17:38:36 -0700695
Colin Cross83bb3162018-06-25 15:48:06 -0700696 javaVersion := getJavaVersion(ctx, String(j.properties.Java_version), sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800697
Colin Crossdaa4c672019-07-15 22:53:46 -0700698 cmd := javadocSystemModulesCmd(ctx, rule, j.srcFiles, outDir, srcJarDir, srcJarList,
699 deps.systemModules, deps.classpath, j.sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800700
Colin Cross1e743852019-10-28 11:37:20 -0700701 cmd.FlagWithArg("-source ", javaVersion.String()).
Colin Crossdaa4c672019-07-15 22:53:46 -0700702 Flag("-J-Xmx1024m").
703 Flag("-XDignore.symbol.file").
704 Flag("-Xdoclint:none")
Nan Zhang581fd212018-01-10 16:06:12 -0800705
Colin Crossdaa4c672019-07-15 22:53:46 -0700706 rule.Command().
707 BuiltTool(ctx, "soong_zip").
708 Flag("-write_if_changed").
709 Flag("-d").
710 FlagWithOutput("-o ", j.docZip).
711 FlagWithArg("-C ", outDir.String()).
712 FlagWithArg("-D ", outDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -0700713
Colin Crossdaa4c672019-07-15 22:53:46 -0700714 rule.Restat()
715
716 zipSyncCleanupCmd(rule, srcJarDir)
717
718 rule.Build(pctx, ctx, "javadoc", "javadoc")
Nan Zhang581fd212018-01-10 16:06:12 -0800719}
720
Nan Zhanga40da042018-08-01 12:48:00 -0700721//
722// Droiddoc
723//
724type Droiddoc struct {
725 Javadoc
726
727 properties DroiddocProperties
728 apiFile android.WritablePath
729 dexApiFile android.WritablePath
730 privateApiFile android.WritablePath
731 privateDexApiFile android.WritablePath
732 removedApiFile android.WritablePath
733 removedDexApiFile android.WritablePath
734 exactApiFile android.WritablePath
735 apiMappingFile android.WritablePath
Nan Zhang66dc2362018-08-14 20:41:04 -0700736 proguardFile android.WritablePath
Nan Zhanga40da042018-08-01 12:48:00 -0700737
738 checkCurrentApiTimestamp android.WritablePath
739 updateCurrentApiTimestamp android.WritablePath
740 checkLastReleasedApiTimestamp android.WritablePath
741
Nan Zhanga40da042018-08-01 12:48:00 -0700742 apiFilePath android.Path
743}
744
Colin Crossa3002fc2019-07-08 16:48:04 -0700745// droiddoc converts .java source files to documentation using doclava or dokka.
Nan Zhanga40da042018-08-01 12:48:00 -0700746func DroiddocFactory() android.Module {
747 module := &Droiddoc{}
748
749 module.AddProperties(&module.properties,
750 &module.Javadoc.properties)
751
752 InitDroiddocModule(module, android.HostAndDeviceSupported)
753 return module
754}
755
Colin Crossa3002fc2019-07-08 16:48:04 -0700756// droiddoc_host converts .java source files to documentation using doclava or dokka.
Nan Zhanga40da042018-08-01 12:48:00 -0700757func DroiddocHostFactory() android.Module {
758 module := &Droiddoc{}
759
760 module.AddProperties(&module.properties,
761 &module.Javadoc.properties)
762
763 InitDroiddocModule(module, android.HostSupported)
764 return module
765}
766
767func (d *Droiddoc) ApiFilePath() android.Path {
768 return d.apiFilePath
769}
770
Nan Zhang581fd212018-01-10 16:06:12 -0800771func (d *Droiddoc) DepsMutator(ctx android.BottomUpMutatorContext) {
772 d.Javadoc.addDeps(ctx)
773
Inseob Kim38449af2019-02-28 14:24:05 +0900774 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
775 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
776 }
777
Nan Zhang79614d12018-04-19 18:03:39 -0700778 if String(d.properties.Custom_template) != "" {
Dan Willemsencc090972018-02-26 14:33:31 -0800779 ctx.AddDependency(ctx.Module(), droiddocTemplateTag, String(d.properties.Custom_template))
780 }
Nan Zhang581fd212018-01-10 16:06:12 -0800781}
782
Colin Crossab054432019-07-15 16:13:59 -0700783func (d *Droiddoc) doclavaDocsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, docletPath classpath) {
Colin Cross2a2e0db2020-02-21 16:55:46 -0800784 buildNumberFile := ctx.Config().BuildNumberFile(ctx)
Nan Zhang443fa522018-08-20 20:58:28 -0700785 // Droiddoc always gets "-source 1.8" because it doesn't support 1.9 sources. For modules with 1.9
786 // sources, droiddoc will get sources produced by metalava which will have already stripped out the
787 // 1.9 language features.
Colin Crossab054432019-07-15 16:13:59 -0700788 cmd.FlagWithArg("-source ", "1.8").
789 Flag("-J-Xmx1600m").
790 Flag("-J-XX:-OmitStackTraceInFastThrow").
791 Flag("-XDignore.symbol.file").
792 FlagWithArg("-doclet ", "com.google.doclava.Doclava").
793 FlagWithInputList("-docletpath ", docletPath.Paths(), ":").
Colin Cross2a2e0db2020-02-21 16:55:46 -0800794 FlagWithArg("-hdf page.build ", ctx.Config().BuildId()+"-$(cat "+buildNumberFile.String()+")").OrderOnly(buildNumberFile).
Elliott Hughes26bce342019-09-12 15:05:13 -0700795 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 -0700796
Nan Zhanga40da042018-08-01 12:48:00 -0700797 if String(d.properties.Custom_template) == "" {
798 // TODO: This is almost always droiddoc-templates-sdk
799 ctx.PropertyErrorf("custom_template", "must specify a template")
800 }
801
802 ctx.VisitDirectDepsWithTag(droiddocTemplateTag, func(m android.Module) {
Nan Zhangf4936b02018-08-01 15:00:28 -0700803 if t, ok := m.(*ExportedDroiddocDir); ok {
Colin Crossab054432019-07-15 16:13:59 -0700804 cmd.FlagWithArg("-templatedir ", t.dir.String()).Implicits(t.deps)
Nan Zhanga40da042018-08-01 12:48:00 -0700805 } else {
Paul Duffin884363e2019-12-19 10:21:09 +0000806 ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_exported_dir", ctx.OtherModuleName(m))
Nan Zhanga40da042018-08-01 12:48:00 -0700807 }
808 })
809
810 if len(d.properties.Html_dirs) > 0 {
Colin Crossab054432019-07-15 16:13:59 -0700811 htmlDir := android.PathForModuleSrc(ctx, d.properties.Html_dirs[0])
812 cmd.FlagWithArg("-htmldir ", htmlDir.String()).
813 Implicits(android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[0], "**/*")}))
Nan Zhanga40da042018-08-01 12:48:00 -0700814 }
815
816 if len(d.properties.Html_dirs) > 1 {
Colin Crossab054432019-07-15 16:13:59 -0700817 htmlDir2 := android.PathForModuleSrc(ctx, d.properties.Html_dirs[1])
818 cmd.FlagWithArg("-htmldir2 ", htmlDir2.String()).
819 Implicits(android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[1], "**/*")}))
Nan Zhanga40da042018-08-01 12:48:00 -0700820 }
821
822 if len(d.properties.Html_dirs) > 2 {
823 ctx.PropertyErrorf("html_dirs", "Droiddoc only supports up to 2 html dirs")
824 }
825
Colin Cross8a497952019-03-05 22:25:09 -0800826 knownTags := android.PathsForModuleSrc(ctx, d.properties.Knowntags)
Colin Crossab054432019-07-15 16:13:59 -0700827 cmd.FlagForEachInput("-knowntags ", knownTags)
Nan Zhanga40da042018-08-01 12:48:00 -0700828
Colin Crossab054432019-07-15 16:13:59 -0700829 cmd.FlagForEachArg("-hdf ", d.properties.Hdf)
Nan Zhanga40da042018-08-01 12:48:00 -0700830
831 if String(d.properties.Proofread_file) != "" {
832 proofreadFile := android.PathForModuleOut(ctx, String(d.properties.Proofread_file))
Colin Crossab054432019-07-15 16:13:59 -0700833 cmd.FlagWithOutput("-proofread ", proofreadFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700834 }
835
836 if String(d.properties.Todo_file) != "" {
837 // tricky part:
838 // we should not compute full path for todo_file through PathForModuleOut().
839 // the non-standard doclet will get the full path relative to "-o".
Colin Crossab054432019-07-15 16:13:59 -0700840 cmd.FlagWithArg("-todo ", String(d.properties.Todo_file)).
841 ImplicitOutput(android.PathForModuleOut(ctx, String(d.properties.Todo_file)))
Nan Zhanga40da042018-08-01 12:48:00 -0700842 }
843
844 if String(d.properties.Resourcesdir) != "" {
845 // TODO: should we add files under resourcesDir to the implicits? It seems that
846 // resourcesDir is one sub dir of htmlDir
847 resourcesDir := android.PathForModuleSrc(ctx, String(d.properties.Resourcesdir))
Colin Crossab054432019-07-15 16:13:59 -0700848 cmd.FlagWithArg("-resourcesdir ", resourcesDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -0700849 }
850
851 if String(d.properties.Resourcesoutdir) != "" {
852 // TODO: it seems -resourceoutdir reference/android/images/ didn't get generated anywhere.
Colin Crossab054432019-07-15 16:13:59 -0700853 cmd.FlagWithArg("-resourcesoutdir ", String(d.properties.Resourcesoutdir))
Nan Zhanga40da042018-08-01 12:48:00 -0700854 }
Nan Zhanga40da042018-08-01 12:48:00 -0700855}
856
Colin Crossab054432019-07-15 16:13:59 -0700857func (d *Droiddoc) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.WritablePath) {
Luca Stefanid63ea0a2019-09-01 21:49:45 +0200858 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
859 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -0700860 String(d.properties.Api_filename) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700861
Nan Zhanga40da042018-08-01 12:48:00 -0700862 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
Colin Crossab054432019-07-15 16:13:59 -0700863 cmd.FlagWithOutput("-api ", d.apiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700864 d.apiFilePath = d.apiFile
865 }
866
Luca Stefanid63ea0a2019-09-01 21:49:45 +0200867 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
868 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -0700869 String(d.properties.Removed_api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -0700870 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
Colin Crossab054432019-07-15 16:13:59 -0700871 cmd.FlagWithOutput("-removedApi ", d.removedApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700872 }
873
874 if String(d.properties.Private_api_filename) != "" {
875 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700876 cmd.FlagWithOutput("-privateApi ", d.privateApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700877 }
878
879 if String(d.properties.Dex_api_filename) != "" {
880 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700881 cmd.FlagWithOutput("-dexApi ", d.dexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700882 }
883
884 if String(d.properties.Private_dex_api_filename) != "" {
885 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700886 cmd.FlagWithOutput("-privateDexApi ", d.privateDexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700887 }
888
889 if String(d.properties.Removed_dex_api_filename) != "" {
890 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700891 cmd.FlagWithOutput("-removedDexApi ", d.removedDexApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700892 }
893
894 if String(d.properties.Exact_api_filename) != "" {
895 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
Colin Crossab054432019-07-15 16:13:59 -0700896 cmd.FlagWithOutput("-exactApi ", d.exactApiFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700897 }
898
899 if String(d.properties.Dex_mapping_filename) != "" {
900 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
Colin Crossab054432019-07-15 16:13:59 -0700901 cmd.FlagWithOutput("-apiMapping ", d.apiMappingFile)
Nan Zhanga40da042018-08-01 12:48:00 -0700902 }
903
Nan Zhang66dc2362018-08-14 20:41:04 -0700904 if String(d.properties.Proguard_filename) != "" {
905 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
Colin Crossab054432019-07-15 16:13:59 -0700906 cmd.FlagWithOutput("-proguard ", d.proguardFile)
Nan Zhang66dc2362018-08-14 20:41:04 -0700907 }
908
Nan Zhanga40da042018-08-01 12:48:00 -0700909 if BoolDefault(d.properties.Create_stubs, true) {
Colin Crossab054432019-07-15 16:13:59 -0700910 cmd.FlagWithArg("-stubs ", stubsDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -0700911 }
912
913 if Bool(d.properties.Write_sdk_values) {
Colin Crossab054432019-07-15 16:13:59 -0700914 cmd.FlagWithArg("-sdkvalues ", android.PathForModuleOut(ctx, "out").String())
Nan Zhanga40da042018-08-01 12:48:00 -0700915 }
Nan Zhanga40da042018-08-01 12:48:00 -0700916}
917
Colin Crossab054432019-07-15 16:13:59 -0700918func (d *Droiddoc) postDoclavaCmds(ctx android.ModuleContext, rule *android.RuleBuilder) {
Nan Zhanga40da042018-08-01 12:48:00 -0700919 if String(d.properties.Static_doc_index_redirect) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700920 staticDocIndexRedirect := android.PathForModuleSrc(ctx, String(d.properties.Static_doc_index_redirect))
921 rule.Command().Text("cp").
922 Input(staticDocIndexRedirect).
923 Output(android.PathForModuleOut(ctx, "out", "index.html"))
Nan Zhanga40da042018-08-01 12:48:00 -0700924 }
925
926 if String(d.properties.Static_doc_properties) != "" {
Colin Crossab054432019-07-15 16:13:59 -0700927 staticDocProperties := android.PathForModuleSrc(ctx, String(d.properties.Static_doc_properties))
928 rule.Command().Text("cp").
929 Input(staticDocProperties).
930 Output(android.PathForModuleOut(ctx, "out", "source.properties"))
Nan Zhanga40da042018-08-01 12:48:00 -0700931 }
Nan Zhanga40da042018-08-01 12:48:00 -0700932}
933
Colin Crossab054432019-07-15 16:13:59 -0700934func javadocCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
Colin Crossdaa4c672019-07-15 22:53:46 -0700935 outDir, srcJarDir, srcJarList android.Path, sourcepaths android.Paths) *android.RuleBuilderCommand {
Colin Crossab054432019-07-15 16:13:59 -0700936
937 cmd := rule.Command().
938 BuiltTool(ctx, "soong_javac_wrapper").Tool(config.JavadocCmd(ctx)).
939 Flag(config.JavacVmFlags).
940 FlagWithArg("-encoding ", "UTF-8").
Colin Crossab054432019-07-15 16:13:59 -0700941 FlagWithRspFileInputList("@", srcs).
942 FlagWithInput("@", srcJarList)
943
Colin Crossab054432019-07-15 16:13:59 -0700944 // TODO(ccross): Remove this if- statement once we finish migration for all Doclava
945 // based stubs generation.
946 // In the future, all the docs generation depends on Metalava stubs (droidstubs) srcjar
947 // dir. We need add the srcjar dir to -sourcepath arg, so that Javadoc can figure out
948 // the correct package name base path.
949 if len(sourcepaths) > 0 {
950 cmd.FlagWithList("-sourcepath ", sourcepaths.Strings(), ":")
951 } else {
952 cmd.FlagWithArg("-sourcepath ", srcJarDir.String())
953 }
954
955 cmd.FlagWithArg("-d ", outDir.String()).
956 Flag("-quiet")
957
958 return cmd
Nan Zhang1598a9e2018-09-04 17:14:32 -0700959}
960
Colin Crossdaa4c672019-07-15 22:53:46 -0700961func javadocSystemModulesCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
962 outDir, srcJarDir, srcJarList android.Path, systemModules *systemModules,
963 classpath classpath, sourcepaths android.Paths) *android.RuleBuilderCommand {
964
965 cmd := javadocCmd(ctx, rule, srcs, outDir, srcJarDir, srcJarList, sourcepaths)
966
967 flag, deps := systemModules.FormJavaSystemModulesPath(ctx.Device())
968 cmd.Flag(flag).Implicits(deps)
969
970 cmd.FlagWithArg("--patch-module ", "java.base=.")
971
972 if len(classpath) > 0 {
973 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
974 }
975
976 return cmd
Nan Zhang1598a9e2018-09-04 17:14:32 -0700977}
978
Colin Crossdaa4c672019-07-15 22:53:46 -0700979func javadocBootclasspathCmd(ctx android.ModuleContext, rule *android.RuleBuilder, srcs android.Paths,
980 outDir, srcJarDir, srcJarList android.Path, bootclasspath, classpath classpath,
981 sourcepaths android.Paths) *android.RuleBuilderCommand {
982
983 cmd := javadocCmd(ctx, rule, srcs, outDir, srcJarDir, srcJarList, sourcepaths)
984
985 if len(bootclasspath) == 0 && ctx.Device() {
986 // explicitly specify -bootclasspath "" if the bootclasspath is empty to
987 // ensure java does not fall back to the default bootclasspath.
988 cmd.FlagWithArg("-bootclasspath ", `""`)
989 } else if len(bootclasspath) > 0 {
990 cmd.FlagWithInputList("-bootclasspath ", bootclasspath.Paths(), ":")
991 }
992
993 if len(classpath) > 0 {
994 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
995 }
996
997 return cmd
998}
999
Colin Crossab054432019-07-15 16:13:59 -07001000func dokkaCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
1001 outDir, srcJarDir android.Path, bootclasspath, classpath classpath) *android.RuleBuilderCommand {
Nan Zhang1598a9e2018-09-04 17:14:32 -07001002
Colin Crossab054432019-07-15 16:13:59 -07001003 // Dokka doesn't support bootClasspath, so combine these two classpath vars for Dokka.
1004 dokkaClasspath := append(bootclasspath.Paths(), classpath.Paths()...)
1005
1006 return rule.Command().
1007 BuiltTool(ctx, "dokka").
1008 Flag(config.JavacVmFlags).
1009 Flag(srcJarDir.String()).
1010 FlagWithInputList("-classpath ", dokkaClasspath, ":").
1011 FlagWithArg("-format ", "dac").
1012 FlagWithArg("-dacRoot ", "/reference/kotlin").
1013 FlagWithArg("-output ", outDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001014}
1015
1016func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1017 deps := d.Javadoc.collectDeps(ctx)
1018
Colin Crossdaa4c672019-07-15 22:53:46 -07001019 d.Javadoc.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
1020 d.Javadoc.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
1021
Nan Zhang1598a9e2018-09-04 17:14:32 -07001022 jsilver := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jsilver.jar")
1023 doclava := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "doclava.jar")
1024 java8Home := ctx.Config().Getenv("ANDROID_JAVA8_HOME")
1025 checkApiClasspath := classpath{jsilver, doclava, android.PathForSource(ctx, java8Home, "lib/tools.jar")}
1026
Colin Crossab054432019-07-15 16:13:59 -07001027 outDir := android.PathForModuleOut(ctx, "out")
1028 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
1029 stubsDir := android.PathForModuleOut(ctx, "stubsDir")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001030
Colin Crossab054432019-07-15 16:13:59 -07001031 rule := android.NewRuleBuilder()
Nan Zhang1598a9e2018-09-04 17:14:32 -07001032
Colin Crossab054432019-07-15 16:13:59 -07001033 rule.Command().Text("rm -rf").Text(outDir.String()).Text(stubsDir.String())
1034 rule.Command().Text("mkdir -p").Text(outDir.String()).Text(stubsDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001035
Colin Crossab054432019-07-15 16:13:59 -07001036 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1037
1038 var cmd *android.RuleBuilderCommand
Nan Zhang1598a9e2018-09-04 17:14:32 -07001039 if Bool(d.properties.Dokka_enabled) {
Colin Crossab054432019-07-15 16:13:59 -07001040 cmd = dokkaCmd(ctx, rule, outDir, srcJarDir, deps.bootClasspath, deps.classpath)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001041 } else {
Colin Crossdaa4c672019-07-15 22:53:46 -07001042 cmd = javadocBootclasspathCmd(ctx, rule, d.Javadoc.srcFiles, outDir, srcJarDir, srcJarList,
Colin Crossab054432019-07-15 16:13:59 -07001043 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001044 }
1045
Colin Crossab054432019-07-15 16:13:59 -07001046 d.stubsFlags(ctx, cmd, stubsDir)
1047
1048 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1049
Mathew Inwoodabd49ab2019-12-19 14:27:08 +00001050 if d.properties.Compat_config != nil {
1051 compatConfig := android.PathForModuleSrc(ctx, String(d.properties.Compat_config))
1052 cmd.FlagWithInput("-compatconfig ", compatConfig)
1053 }
1054
Colin Crossab054432019-07-15 16:13:59 -07001055 var desc string
1056 if Bool(d.properties.Dokka_enabled) {
1057 desc = "dokka"
1058 } else {
1059 d.doclavaDocsFlags(ctx, cmd, classpath{jsilver, doclava})
1060
1061 for _, o := range d.Javadoc.properties.Out {
1062 cmd.ImplicitOutput(android.PathForModuleGen(ctx, o))
1063 }
1064
1065 d.postDoclavaCmds(ctx, rule)
1066 desc = "doclava"
1067 }
1068
1069 rule.Command().
1070 BuiltTool(ctx, "soong_zip").
1071 Flag("-write_if_changed").
1072 Flag("-d").
1073 FlagWithOutput("-o ", d.docZip).
1074 FlagWithArg("-C ", outDir.String()).
1075 FlagWithArg("-D ", outDir.String())
1076
1077 rule.Command().
1078 BuiltTool(ctx, "soong_zip").
1079 Flag("-write_if_changed").
1080 Flag("-jar").
1081 FlagWithOutput("-o ", d.stubsSrcJar).
1082 FlagWithArg("-C ", stubsDir.String()).
1083 FlagWithArg("-D ", stubsDir.String())
1084
1085 rule.Restat()
1086
1087 zipSyncCleanupCmd(rule, srcJarDir)
1088
1089 rule.Build(pctx, ctx, "javadoc", desc)
1090
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001091 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001092 !ctx.Config().IsPdkBuild() {
Colin Crossab054432019-07-15 16:13:59 -07001093
1094 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Api_file))
1095 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Removed_api_file))
Nan Zhang1598a9e2018-09-04 17:14:32 -07001096
1097 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001098
1099 rule := android.NewRuleBuilder()
1100
1101 rule.Command().Text("( true")
1102
1103 rule.Command().
1104 BuiltTool(ctx, "apicheck").
1105 Flag("-JXmx1024m").
1106 FlagWithInputList("-Jclasspath\\ ", checkApiClasspath.Paths(), ":").
1107 OptionalFlag(d.properties.Check_api.Current.Args).
1108 Input(apiFile).
1109 Input(d.apiFile).
1110 Input(removedApiFile).
1111 Input(d.removedApiFile)
1112
1113 msg := fmt.Sprintf(`\n******************************\n`+
1114 `You have tried to change the API from what has been previously approved.\n\n`+
1115 `To make these errors go away, you have two choices:\n`+
1116 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1117 ` errors above.\n\n`+
1118 ` 2. You can update current.txt by executing the following command:\n`+
1119 ` make %s-update-current-api\n\n`+
1120 ` To submit the revised current.txt to the main Android repository,\n`+
1121 ` you will need approval.\n`+
1122 `******************************\n`, ctx.ModuleName())
1123
1124 rule.Command().
1125 Text("touch").Output(d.checkCurrentApiTimestamp).
1126 Text(") || (").
1127 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1128 Text("; exit 38").
1129 Text(")")
1130
1131 rule.Build(pctx, ctx, "doclavaCurrentApiCheck", "check current API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001132
1133 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001134
1135 // update API rule
1136 rule = android.NewRuleBuilder()
1137
1138 rule.Command().Text("( true")
1139
1140 rule.Command().
1141 Text("cp").Flag("-f").
1142 Input(d.apiFile).Flag(apiFile.String())
1143
1144 rule.Command().
1145 Text("cp").Flag("-f").
1146 Input(d.removedApiFile).Flag(removedApiFile.String())
1147
1148 msg = "failed to update public API"
1149
1150 rule.Command().
1151 Text("touch").Output(d.updateCurrentApiTimestamp).
1152 Text(") || (").
1153 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1154 Text("; exit 38").
1155 Text(")")
1156
1157 rule.Build(pctx, ctx, "doclavaCurrentApiUpdate", "update current API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001158 }
1159
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001160 if apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001161 !ctx.Config().IsPdkBuild() {
Colin Crossab054432019-07-15 16:13:59 -07001162
1163 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
1164 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file))
Nan Zhang1598a9e2018-09-04 17:14:32 -07001165
1166 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
Colin Crossab054432019-07-15 16:13:59 -07001167
1168 rule := android.NewRuleBuilder()
1169
1170 rule.Command().
1171 Text("(").
1172 BuiltTool(ctx, "apicheck").
1173 Flag("-JXmx1024m").
1174 FlagWithInputList("-Jclasspath\\ ", checkApiClasspath.Paths(), ":").
1175 OptionalFlag(d.properties.Check_api.Last_released.Args).
1176 Input(apiFile).
1177 Input(d.apiFile).
1178 Input(removedApiFile).
1179 Input(d.removedApiFile)
1180
1181 msg := `\n******************************\n` +
1182 `You have tried to change the API from what has been previously released in\n` +
1183 `an SDK. Please fix the errors listed above.\n` +
1184 `******************************\n`
1185
1186 rule.Command().
1187 Text("touch").Output(d.checkLastReleasedApiTimestamp).
1188 Text(") || (").
1189 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1190 Text("; exit 38").
1191 Text(")")
1192
1193 rule.Build(pctx, ctx, "doclavaLastApiCheck", "check last API")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001194 }
1195}
1196
1197//
1198// Droidstubs
1199//
1200type Droidstubs struct {
1201 Javadoc
Paul Duffin91547182019-11-12 19:39:36 +00001202 android.SdkBase
Nan Zhang1598a9e2018-09-04 17:14:32 -07001203
Pete Gillin581d6082018-10-22 15:55:04 +01001204 properties DroidstubsProperties
1205 apiFile android.WritablePath
1206 apiXmlFile android.WritablePath
1207 lastReleasedApiXmlFile android.WritablePath
1208 dexApiFile android.WritablePath
1209 privateApiFile android.WritablePath
1210 privateDexApiFile android.WritablePath
1211 removedApiFile android.WritablePath
1212 removedDexApiFile android.WritablePath
1213 apiMappingFile android.WritablePath
1214 exactApiFile android.WritablePath
1215 proguardFile android.WritablePath
1216 nullabilityWarningsFile android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001217
1218 checkCurrentApiTimestamp android.WritablePath
1219 updateCurrentApiTimestamp android.WritablePath
1220 checkLastReleasedApiTimestamp android.WritablePath
Adrian Roos075eedc2019-10-10 12:07:03 +02001221 apiLintTimestamp android.WritablePath
Adrian Roos3b8f1cd2019-11-01 13:42:39 +01001222 apiLintReport android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001223
Pete Gillin581d6082018-10-22 15:55:04 +01001224 checkNullabilityWarningsTimestamp android.WritablePath
1225
Nan Zhang1598a9e2018-09-04 17:14:32 -07001226 annotationsZip android.WritablePath
Nan Zhang9c69a122018-08-22 10:22:08 -07001227 apiVersionsXml android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001228
1229 apiFilePath android.Path
Nan Zhang71bbe632018-09-17 14:32:21 -07001230
1231 jdiffDocZip android.WritablePath
1232 jdiffStubsSrcJar android.WritablePath
Jerome Gaillard0f599032019-10-10 19:29:11 +01001233
1234 metadataZip android.WritablePath
1235 metadataDir android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001236}
1237
Colin Crossa3002fc2019-07-08 16:48:04 -07001238// droidstubs passes sources files through Metalava to generate stub .java files that only contain the API to be
1239// documented, filtering out hidden classes and methods. The resulting .java files are intended to be passed to
1240// a droiddoc module to generate documentation.
Nan Zhang1598a9e2018-09-04 17:14:32 -07001241func DroidstubsFactory() android.Module {
1242 module := &Droidstubs{}
1243
1244 module.AddProperties(&module.properties,
1245 &module.Javadoc.properties)
1246
1247 InitDroiddocModule(module, android.HostAndDeviceSupported)
Paul Duffin91547182019-11-12 19:39:36 +00001248 android.InitSdkAwareModule(module)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001249 return module
1250}
1251
Colin Crossa3002fc2019-07-08 16:48:04 -07001252// droidstubs_host passes sources files through Metalava to generate stub .java files that only contain the API
1253// to be documented, filtering out hidden classes and methods. The resulting .java files are intended to be
1254// passed to a droiddoc_host module to generate documentation. Use a droidstubs_host instead of a droidstubs
1255// module when symbols needed by the source files are provided by java_library_host modules.
Nan Zhang1598a9e2018-09-04 17:14:32 -07001256func DroidstubsHostFactory() android.Module {
1257 module := &Droidstubs{}
1258
1259 module.AddProperties(&module.properties,
1260 &module.Javadoc.properties)
1261
1262 InitDroiddocModule(module, android.HostSupported)
1263 return module
1264}
1265
1266func (d *Droidstubs) ApiFilePath() android.Path {
1267 return d.apiFilePath
1268}
1269
Paul Duffin1fd005d2020-04-09 01:08:11 +01001270func (d *Droidstubs) RemovedApiFilePath() android.Path {
1271 return d.removedApiFile
1272}
1273
Paul Duffin3d1248c2020-04-09 00:10:17 +01001274func (d *Droidstubs) StubsSrcJar() android.Path {
1275 return d.stubsSrcJar
1276}
1277
Nan Zhang1598a9e2018-09-04 17:14:32 -07001278func (d *Droidstubs) DepsMutator(ctx android.BottomUpMutatorContext) {
1279 d.Javadoc.addDeps(ctx)
1280
Inseob Kim38449af2019-02-28 14:24:05 +09001281 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
1282 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
1283 }
1284
Nan Zhang1598a9e2018-09-04 17:14:32 -07001285 if len(d.properties.Merge_annotations_dirs) != 0 {
1286 for _, mergeAnnotationsDir := range d.properties.Merge_annotations_dirs {
1287 ctx.AddDependency(ctx.Module(), metalavaMergeAnnotationsDirTag, mergeAnnotationsDir)
1288 }
1289 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001290
Pete Gillin77167902018-09-19 18:16:26 +01001291 if len(d.properties.Merge_inclusion_annotations_dirs) != 0 {
1292 for _, mergeInclusionAnnotationsDir := range d.properties.Merge_inclusion_annotations_dirs {
1293 ctx.AddDependency(ctx.Module(), metalavaMergeInclusionAnnotationsDirTag, mergeInclusionAnnotationsDir)
1294 }
1295 }
1296
Nan Zhang9c69a122018-08-22 10:22:08 -07001297 if len(d.properties.Api_levels_annotations_dirs) != 0 {
1298 for _, apiLevelsAnnotationsDir := range d.properties.Api_levels_annotations_dirs {
1299 ctx.AddDependency(ctx.Module(), metalavaAPILevelsAnnotationsDirTag, apiLevelsAnnotationsDir)
1300 }
1301 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001302}
1303
Colin Cross33961b52019-07-11 11:01:22 -07001304func (d *Droidstubs) stubsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand, stubsDir android.WritablePath) {
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001305 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
1306 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -07001307 String(d.properties.Api_filename) != "" {
1308 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001309 cmd.FlagWithOutput("--api ", d.apiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001310 d.apiFilePath = d.apiFile
1311 }
1312
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001313 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") ||
1314 apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") ||
Nan Zhang1598a9e2018-09-04 17:14:32 -07001315 String(d.properties.Removed_api_filename) != "" {
1316 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001317 cmd.FlagWithOutput("--removed-api ", d.removedApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001318 }
1319
1320 if String(d.properties.Private_api_filename) != "" {
1321 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001322 cmd.FlagWithOutput("--private-api ", d.privateApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001323 }
1324
1325 if String(d.properties.Dex_api_filename) != "" {
1326 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001327 cmd.FlagWithOutput("--dex-api ", d.dexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001328 }
1329
1330 if String(d.properties.Private_dex_api_filename) != "" {
1331 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001332 cmd.FlagWithOutput("--private-dex-api ", d.privateDexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001333 }
1334
1335 if String(d.properties.Removed_dex_api_filename) != "" {
1336 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001337 cmd.FlagWithOutput("--removed-dex-api ", d.removedDexApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001338 }
1339
1340 if String(d.properties.Exact_api_filename) != "" {
1341 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001342 cmd.FlagWithOutput("--exact-api ", d.exactApiFile)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001343 }
1344
Nan Zhang9c69a122018-08-22 10:22:08 -07001345 if String(d.properties.Dex_mapping_filename) != "" {
1346 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001347 cmd.FlagWithOutput("--dex-api-mapping ", d.apiMappingFile)
Nan Zhang9c69a122018-08-22 10:22:08 -07001348 }
1349
Nan Zhang199645c2018-09-19 12:40:06 -07001350 if String(d.properties.Proguard_filename) != "" {
1351 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
Colin Cross33961b52019-07-11 11:01:22 -07001352 cmd.FlagWithOutput("--proguard ", d.proguardFile)
Nan Zhang199645c2018-09-19 12:40:06 -07001353 }
1354
Nan Zhang9c69a122018-08-22 10:22:08 -07001355 if Bool(d.properties.Write_sdk_values) {
Jerome Gaillard0f599032019-10-10 19:29:11 +01001356 d.metadataDir = android.PathForModuleOut(ctx, "metadata")
1357 cmd.FlagWithArg("--sdk-values ", d.metadataDir.String())
Nan Zhang9c69a122018-08-22 10:22:08 -07001358 }
1359
Nan Zhang1598a9e2018-09-04 17:14:32 -07001360 if Bool(d.properties.Create_doc_stubs) {
Colin Cross33961b52019-07-11 11:01:22 -07001361 cmd.FlagWithArg("--doc-stubs ", stubsDir.String())
Nan Zhang1598a9e2018-09-04 17:14:32 -07001362 } else {
Colin Cross33961b52019-07-11 11:01:22 -07001363 cmd.FlagWithArg("--stubs ", stubsDir.String())
Aurimas Liutikas39de3252020-03-11 16:28:05 -07001364 cmd.Flag("--exclude-documentation-from-stubs")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001365 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001366}
1367
Colin Cross33961b52019-07-11 11:01:22 -07001368func (d *Droidstubs) annotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang1598a9e2018-09-04 17:14:32 -07001369 if Bool(d.properties.Annotations_enabled) {
Colin Cross33961b52019-07-11 11:01:22 -07001370 cmd.Flag("--include-annotations")
1371
Pete Gillinc382a562018-11-14 18:45:46 +00001372 validatingNullability :=
1373 strings.Contains(d.Javadoc.args, "--validate-nullability-from-merged-stubs") ||
1374 String(d.properties.Validate_nullability_from_list) != ""
Paul Duffin13a9dd62019-11-04 10:26:47 +00001375
Pete Gillina262c052018-09-14 14:25:48 +01001376 migratingNullability := String(d.properties.Previous_api) != ""
Pete Gillina262c052018-09-14 14:25:48 +01001377 if migratingNullability {
Colin Cross8a497952019-03-05 22:25:09 -08001378 previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api))
Colin Cross33961b52019-07-11 11:01:22 -07001379 cmd.FlagWithInput("--migrate-nullness ", previousApi)
Pete Gillina262c052018-09-14 14:25:48 +01001380 }
Colin Cross33961b52019-07-11 11:01:22 -07001381
Pete Gillinc382a562018-11-14 18:45:46 +00001382 if s := String(d.properties.Validate_nullability_from_list); s != "" {
Colin Cross33961b52019-07-11 11:01:22 -07001383 cmd.FlagWithInput("--validate-nullability-from-list ", android.PathForModuleSrc(ctx, s))
Pete Gillinc382a562018-11-14 18:45:46 +00001384 }
Colin Cross33961b52019-07-11 11:01:22 -07001385
Pete Gillina262c052018-09-14 14:25:48 +01001386 if validatingNullability {
Pete Gillin581d6082018-10-22 15:55:04 +01001387 d.nullabilityWarningsFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_nullability_warnings.txt")
Colin Cross33961b52019-07-11 11:01:22 -07001388 cmd.FlagWithOutput("--nullability-warnings-txt ", d.nullabilityWarningsFile)
Pete Gillina262c052018-09-14 14:25:48 +01001389 }
Nan Zhanga40da042018-08-01 12:48:00 -07001390
1391 d.annotationsZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"_annotations.zip")
Colin Cross33961b52019-07-11 11:01:22 -07001392 cmd.FlagWithOutput("--extract-annotations ", d.annotationsZip)
Nan Zhangf4936b02018-08-01 15:00:28 -07001393
Nan Zhang1598a9e2018-09-04 17:14:32 -07001394 if len(d.properties.Merge_annotations_dirs) == 0 {
Nan Zhang9c69a122018-08-22 10:22:08 -07001395 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhanga40da042018-08-01 12:48:00 -07001396 "has to be non-empty if annotations was enabled!")
1397 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001398
Colin Cross33961b52019-07-11 11:01:22 -07001399 d.mergeAnnoDirFlags(ctx, cmd)
1400
1401 // TODO(tnorbye): find owners to fix these warnings when annotation was enabled.
1402 cmd.FlagWithArg("--hide ", "HiddenTypedefConstant").
1403 FlagWithArg("--hide ", "SuperfluousPrefix").
1404 FlagWithArg("--hide ", "AnnotationExtraction")
1405 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001406}
1407
Colin Cross33961b52019-07-11 11:01:22 -07001408func (d *Droidstubs) mergeAnnoDirFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
1409 ctx.VisitDirectDepsWithTag(metalavaMergeAnnotationsDirTag, func(m android.Module) {
1410 if t, ok := m.(*ExportedDroiddocDir); ok {
1411 cmd.FlagWithArg("--merge-qualifier-annotations ", t.dir.String()).Implicits(t.deps)
1412 } else {
1413 ctx.PropertyErrorf("merge_annotations_dirs",
1414 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1415 }
1416 })
1417}
1418
1419func (d *Droidstubs) inclusionAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Pete Gillin77167902018-09-19 18:16:26 +01001420 ctx.VisitDirectDepsWithTag(metalavaMergeInclusionAnnotationsDirTag, func(m android.Module) {
1421 if t, ok := m.(*ExportedDroiddocDir); ok {
Colin Cross33961b52019-07-11 11:01:22 -07001422 cmd.FlagWithArg("--merge-inclusion-annotations ", t.dir.String()).Implicits(t.deps)
Pete Gillin77167902018-09-19 18:16:26 +01001423 } else {
1424 ctx.PropertyErrorf("merge_inclusion_annotations_dirs",
1425 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1426 }
1427 })
Nan Zhanga40da042018-08-01 12:48:00 -07001428}
1429
Colin Cross33961b52019-07-11 11:01:22 -07001430func (d *Droidstubs) apiLevelsAnnotationsFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang9c69a122018-08-22 10:22:08 -07001431 if Bool(d.properties.Api_levels_annotations_enabled) {
1432 d.apiVersionsXml = android.PathForModuleOut(ctx, "api-versions.xml")
Nan Zhang9c69a122018-08-22 10:22:08 -07001433
1434 if len(d.properties.Api_levels_annotations_dirs) == 0 {
1435 ctx.PropertyErrorf("api_levels_annotations_dirs",
1436 "has to be non-empty if api levels annotations was enabled!")
1437 }
1438
Colin Cross33961b52019-07-11 11:01:22 -07001439 cmd.FlagWithOutput("--generate-api-levels ", d.apiVersionsXml)
1440 cmd.FlagWithInput("--apply-api-levels ", d.apiVersionsXml)
1441 cmd.FlagWithArg("--current-version ", ctx.Config().PlatformSdkVersion())
1442 cmd.FlagWithArg("--current-codename ", ctx.Config().PlatformSdkCodename())
Nan Zhang9c69a122018-08-22 10:22:08 -07001443
1444 ctx.VisitDirectDepsWithTag(metalavaAPILevelsAnnotationsDirTag, func(m android.Module) {
1445 if t, ok := m.(*ExportedDroiddocDir); ok {
Nan Zhang9c69a122018-08-22 10:22:08 -07001446 for _, dep := range t.deps {
1447 if strings.HasSuffix(dep.String(), "android.jar") {
Colin Cross33961b52019-07-11 11:01:22 -07001448 cmd.Implicit(dep)
Nan Zhang9c69a122018-08-22 10:22:08 -07001449 }
1450 }
Colin Cross33961b52019-07-11 11:01:22 -07001451 cmd.FlagWithArg("--android-jar-pattern ", t.dir.String()+"/%/public/android.jar")
Nan Zhang9c69a122018-08-22 10:22:08 -07001452 } else {
1453 ctx.PropertyErrorf("api_levels_annotations_dirs",
1454 "module %q is not a metalava api-levels-annotations dir", ctx.OtherModuleName(m))
1455 }
1456 })
1457
1458 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001459}
1460
Colin Cross33961b52019-07-11 11:01:22 -07001461func (d *Droidstubs) apiToXmlFlags(ctx android.ModuleContext, cmd *android.RuleBuilderCommand) {
Nan Zhang71bbe632018-09-17 14:32:21 -07001462 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1463 if d.apiFile.String() == "" {
1464 ctx.ModuleErrorf("API signature file has to be specified in Metalava when jdiff is enabled.")
1465 }
1466
1467 d.apiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.xml")
Colin Cross33961b52019-07-11 11:01:22 -07001468 cmd.FlagWithOutput("--api-xml ", d.apiXmlFile)
Nan Zhang71bbe632018-09-17 14:32:21 -07001469
1470 if String(d.properties.Check_api.Last_released.Api_file) == "" {
1471 ctx.PropertyErrorf("check_api.last_released.api_file",
1472 "has to be non-empty if jdiff was enabled!")
1473 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001474
Colin Cross33961b52019-07-11 11:01:22 -07001475 lastReleasedApi := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
Nan Zhang71bbe632018-09-17 14:32:21 -07001476 d.lastReleasedApiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_last_released_api.xml")
Colin Cross33961b52019-07-11 11:01:22 -07001477 cmd.FlagWithInput("--convert-to-jdiff ", lastReleasedApi).Output(d.lastReleasedApiXmlFile)
1478 }
1479}
Nan Zhang71bbe632018-09-17 14:32:21 -07001480
Colin Cross1e743852019-10-28 11:37:20 -07001481func metalavaCmd(ctx android.ModuleContext, rule *android.RuleBuilder, javaVersion javaVersion, srcs android.Paths,
Colin Cross33961b52019-07-11 11:01:22 -07001482 srcJarList android.Path, bootclasspath, classpath classpath, sourcepaths android.Paths) *android.RuleBuilderCommand {
Colin Cross8b8bec32019-11-15 13:18:43 -08001483 // Metalava uses lots of memory, restrict the number of metalava jobs that can run in parallel.
1484 rule.HighMem()
Colin Cross33961b52019-07-11 11:01:22 -07001485 cmd := rule.Command().BuiltTool(ctx, "metalava").
1486 Flag(config.JavacVmFlags).
1487 FlagWithArg("-encoding ", "UTF-8").
Colin Cross1e743852019-10-28 11:37:20 -07001488 FlagWithArg("-source ", javaVersion.String()).
Colin Cross33961b52019-07-11 11:01:22 -07001489 FlagWithRspFileInputList("@", srcs).
1490 FlagWithInput("@", srcJarList)
1491
1492 if len(bootclasspath) > 0 {
1493 cmd.FlagWithInputList("-bootclasspath ", bootclasspath.Paths(), ":")
Nan Zhang71bbe632018-09-17 14:32:21 -07001494 }
1495
Colin Cross33961b52019-07-11 11:01:22 -07001496 if len(classpath) > 0 {
1497 cmd.FlagWithInputList("-classpath ", classpath.Paths(), ":")
1498 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001499
Colin Cross33961b52019-07-11 11:01:22 -07001500 if len(sourcepaths) > 0 {
1501 cmd.FlagWithList("-sourcepath ", sourcepaths.Strings(), ":")
1502 } else {
1503 cmd.FlagWithArg("-sourcepath ", `""`)
1504 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001505
Colin Cross33961b52019-07-11 11:01:22 -07001506 cmd.Flag("--no-banner").
1507 Flag("--color").
1508 Flag("--quiet").
1509 Flag("--format=v2")
Nan Zhang86d2d552018-08-09 15:33:27 -07001510
Colin Cross33961b52019-07-11 11:01:22 -07001511 return cmd
Nan Zhang71bbe632018-09-17 14:32:21 -07001512}
1513
Nan Zhang1598a9e2018-09-04 17:14:32 -07001514func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Nan Zhanga40da042018-08-01 12:48:00 -07001515 deps := d.Javadoc.collectDeps(ctx)
1516
1517 javaVersion := getJavaVersion(ctx, String(d.Javadoc.properties.Java_version), sdkContext(d))
Nan Zhang581fd212018-01-10 16:06:12 -08001518
Colin Cross33961b52019-07-11 11:01:22 -07001519 // Create rule for metalava
Nan Zhanga40da042018-08-01 12:48:00 -07001520
Colin Crossdaa4c672019-07-15 22:53:46 -07001521 d.Javadoc.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
Nan Zhanga40da042018-08-01 12:48:00 -07001522
Colin Cross33961b52019-07-11 11:01:22 -07001523 srcJarDir := android.PathForModuleOut(ctx, "srcjars")
1524 stubsDir := android.PathForModuleOut(ctx, "stubsDir")
Nan Zhang71bbe632018-09-17 14:32:21 -07001525
Colin Cross33961b52019-07-11 11:01:22 -07001526 rule := android.NewRuleBuilder()
Nan Zhanga40da042018-08-01 12:48:00 -07001527
Colin Cross33961b52019-07-11 11:01:22 -07001528 rule.Command().Text("rm -rf").Text(stubsDir.String())
1529 rule.Command().Text("mkdir -p").Text(stubsDir.String())
Nan Zhanga40da042018-08-01 12:48:00 -07001530
Colin Cross33961b52019-07-11 11:01:22 -07001531 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1532
1533 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1534 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1535
1536 d.stubsFlags(ctx, cmd, stubsDir)
1537
1538 d.annotationsFlags(ctx, cmd)
1539 d.inclusionAnnotationsFlags(ctx, cmd)
1540 d.apiLevelsAnnotationsFlags(ctx, cmd)
1541 d.apiToXmlFlags(ctx, cmd)
Nan Zhang71bbe632018-09-17 14:32:21 -07001542
Nan Zhang1598a9e2018-09-04 17:14:32 -07001543 if strings.Contains(d.Javadoc.args, "--generate-documentation") {
1544 // Currently Metalava have the ability to invoke Javadoc in a seperate process.
1545 // Pass "-nodocs" to suppress the Javadoc invocation when Metalava receives
1546 // "--generate-documentation" arg. This is not needed when Metalava removes this feature.
1547 d.Javadoc.args = d.Javadoc.args + " -nodocs "
Nan Zhang79614d12018-04-19 18:03:39 -07001548 }
Colin Cross33961b52019-07-11 11:01:22 -07001549
1550 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1551 for _, o := range d.Javadoc.properties.Out {
1552 cmd.ImplicitOutput(android.PathForModuleGen(ctx, o))
1553 }
1554
1555 rule.Command().
1556 BuiltTool(ctx, "soong_zip").
1557 Flag("-write_if_changed").
1558 Flag("-jar").
1559 FlagWithOutput("-o ", d.Javadoc.stubsSrcJar).
1560 FlagWithArg("-C ", stubsDir.String()).
1561 FlagWithArg("-D ", stubsDir.String())
Jerome Gaillard0f599032019-10-10 19:29:11 +01001562
1563 if Bool(d.properties.Write_sdk_values) {
1564 d.metadataZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-metadata.zip")
1565 rule.Command().
1566 BuiltTool(ctx, "soong_zip").
1567 Flag("-write_if_changed").
1568 Flag("-d").
1569 FlagWithOutput("-o ", d.metadataZip).
1570 FlagWithArg("-C ", d.metadataDir.String()).
1571 FlagWithArg("-D ", d.metadataDir.String())
1572 }
1573
Colin Cross33961b52019-07-11 11:01:22 -07001574 rule.Restat()
1575
1576 zipSyncCleanupCmd(rule, srcJarDir)
1577
1578 rule.Build(pctx, ctx, "metalava", "metalava")
1579
1580 // Create rule for apicheck
Nan Zhang61819ce2018-05-04 18:49:16 -07001581
Adrian Roos075eedc2019-10-10 12:07:03 +02001582 if BoolDefault(d.properties.Check_api.Api_lint.Enabled, false) && !ctx.Config().IsPdkBuild() {
1583 rule := android.NewRuleBuilder()
1584 rule.Command().Text("( true")
1585
1586 srcJarDir := android.PathForModuleOut(ctx, "api_lint", "srcjars")
1587 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1588
1589 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1590 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1591
Adrian Rooscab4a2c2019-10-14 16:32:41 +02001592 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles)
1593
Adrian Roos075eedc2019-10-10 12:07:03 +02001594 newSince := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Api_lint.New_since)
1595 if newSince.Valid() {
1596 cmd.FlagWithInput("--api-lint ", newSince.Path())
1597 } else {
1598 cmd.Flag("--api-lint")
1599 }
Adrian Roos3b8f1cd2019-11-01 13:42:39 +01001600 d.apiLintReport = android.PathForModuleOut(ctx, "api_lint_report.txt")
1601 cmd.FlagWithOutput("--report-even-if-suppressed ", d.apiLintReport)
Adrian Roos075eedc2019-10-10 12:07:03 +02001602
1603 d.inclusionAnnotationsFlags(ctx, cmd)
1604 d.mergeAnnoDirFlags(ctx, cmd)
1605
1606 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Api_lint.Baseline_file)
1607 updatedBaselineOutput := android.PathForModuleOut(ctx, "api_lint_baseline.txt")
1608 d.apiLintTimestamp = android.PathForModuleOut(ctx, "api_lint.timestamp")
1609
1610 if baselineFile.Valid() {
1611 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1612 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1613 }
1614
1615 zipSyncCleanupCmd(rule, srcJarDir)
1616
1617 msg := fmt.Sprintf(`\n******************************\n`+
1618 `Your API changes are triggering API Lint warnings or errors.\n\n`+
1619 `To make these errors go away, you have two choices:\n`+
1620 ` 1. You can suppress the errors with @SuppressLint(\"<id>\").\n\n`+
1621 ` 2. You can update the baseline by executing the following command:\n`+
1622 ` cp \"$PWD/%s\" \"$PWD/%s\"\n\n`+
1623 `******************************\n`, updatedBaselineOutput, baselineFile.Path())
1624 rule.Command().
1625 Text("touch").Output(d.apiLintTimestamp).
1626 Text(") || (").
1627 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1628 Text("; exit 38").
1629 Text(")")
1630
1631 rule.Build(pctx, ctx, "metalavaApiLint", "metalava API lint")
1632
1633 }
1634
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001635 if apiCheckEnabled(ctx, d.properties.Check_api.Current, "current") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001636 !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001637
1638 if len(d.Javadoc.properties.Out) > 0 {
1639 ctx.PropertyErrorf("out", "out property may not be combined with check_api")
1640 }
1641
1642 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Api_file))
1643 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Current.Removed_api_file))
Adrian Roos14f75a92019-08-12 17:54:09 +02001644 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Current.Baseline_file)
1645 updatedBaselineOutput := android.PathForModuleOut(ctx, "current_baseline.txt")
Nan Zhang61819ce2018-05-04 18:49:16 -07001646
Nan Zhang2760dfc2018-08-24 17:32:54 +00001647 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Nan Zhang2760dfc2018-08-24 17:32:54 +00001648
Colin Cross33961b52019-07-11 11:01:22 -07001649 rule := android.NewRuleBuilder()
1650
1651 rule.Command().Text("( true")
1652
1653 srcJarDir := android.PathForModuleOut(ctx, "current-apicheck", "srcjars")
1654 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1655
1656 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1657 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1658
1659 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles).
1660 FlagWithInput("--check-compatibility:api:current ", apiFile).
1661 FlagWithInput("--check-compatibility:removed:current ", removedApiFile)
1662
1663 d.inclusionAnnotationsFlags(ctx, cmd)
1664 d.mergeAnnoDirFlags(ctx, cmd)
1665
Adrian Roos14f75a92019-08-12 17:54:09 +02001666 if baselineFile.Valid() {
1667 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1668 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1669 }
1670
Colin Cross33961b52019-07-11 11:01:22 -07001671 zipSyncCleanupCmd(rule, srcJarDir)
1672
1673 msg := fmt.Sprintf(`\n******************************\n`+
1674 `You have tried to change the API from what has been previously approved.\n\n`+
1675 `To make these errors go away, you have two choices:\n`+
1676 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1677 ` errors above.\n\n`+
1678 ` 2. You can update current.txt by executing the following command:\n`+
1679 ` make %s-update-current-api\n\n`+
1680 ` To submit the revised current.txt to the main Android repository,\n`+
1681 ` you will need approval.\n`+
1682 `******************************\n`, ctx.ModuleName())
1683
1684 rule.Command().
1685 Text("touch").Output(d.checkCurrentApiTimestamp).
1686 Text(") || (").
1687 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1688 Text("; exit 38").
1689 Text(")")
1690
1691 rule.Build(pctx, ctx, "metalavaCurrentApiCheck", "metalava check current API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001692
1693 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Colin Cross33961b52019-07-11 11:01:22 -07001694
1695 // update API rule
1696 rule = android.NewRuleBuilder()
1697
1698 rule.Command().Text("( true")
1699
1700 rule.Command().
1701 Text("cp").Flag("-f").
1702 Input(d.apiFile).Flag(apiFile.String())
1703
1704 rule.Command().
1705 Text("cp").Flag("-f").
1706 Input(d.removedApiFile).Flag(removedApiFile.String())
1707
1708 msg = "failed to update public API"
1709
1710 rule.Command().
1711 Text("touch").Output(d.updateCurrentApiTimestamp).
1712 Text(") || (").
1713 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1714 Text("; exit 38").
1715 Text(")")
1716
1717 rule.Build(pctx, ctx, "metalavaCurrentApiUpdate", "update current API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001718 }
Nan Zhanga40da042018-08-01 12:48:00 -07001719
Luca Stefanid63ea0a2019-09-01 21:49:45 +02001720 if apiCheckEnabled(ctx, d.properties.Check_api.Last_released, "last_released") &&
Nan Zhang1598a9e2018-09-04 17:14:32 -07001721 !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001722
1723 if len(d.Javadoc.properties.Out) > 0 {
1724 ctx.PropertyErrorf("out", "out property may not be combined with check_api")
1725 }
1726
1727 apiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Api_file))
1728 removedApiFile := android.PathForModuleSrc(ctx, String(d.properties.Check_api.Last_released.Removed_api_file))
Adrian Roos14f75a92019-08-12 17:54:09 +02001729 baselineFile := android.OptionalPathForModuleSrc(ctx, d.properties.Check_api.Last_released.Baseline_file)
1730 updatedBaselineOutput := android.PathForModuleOut(ctx, "last_released_baseline.txt")
Nan Zhang61819ce2018-05-04 18:49:16 -07001731
Nan Zhang2760dfc2018-08-24 17:32:54 +00001732 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
Nan Zhang2760dfc2018-08-24 17:32:54 +00001733
Colin Cross33961b52019-07-11 11:01:22 -07001734 rule := android.NewRuleBuilder()
1735
1736 rule.Command().Text("( true")
1737
1738 srcJarDir := android.PathForModuleOut(ctx, "last-apicheck", "srcjars")
1739 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1740
1741 cmd := metalavaCmd(ctx, rule, javaVersion, d.Javadoc.srcFiles, srcJarList,
1742 deps.bootClasspath, deps.classpath, d.Javadoc.sourcepaths)
1743
1744 cmd.Flag(d.Javadoc.args).Implicits(d.Javadoc.argFiles).
1745 FlagWithInput("--check-compatibility:api:released ", apiFile)
1746
1747 d.inclusionAnnotationsFlags(ctx, cmd)
1748
1749 cmd.FlagWithInput("--check-compatibility:removed:released ", removedApiFile)
1750
1751 d.mergeAnnoDirFlags(ctx, cmd)
1752
Adrian Roos14f75a92019-08-12 17:54:09 +02001753 if baselineFile.Valid() {
1754 cmd.FlagWithInput("--baseline ", baselineFile.Path())
1755 cmd.FlagWithOutput("--update-baseline ", updatedBaselineOutput)
1756 }
1757
Colin Cross33961b52019-07-11 11:01:22 -07001758 zipSyncCleanupCmd(rule, srcJarDir)
1759
1760 msg := `\n******************************\n` +
1761 `You have tried to change the API from what has been previously released in\n` +
1762 `an SDK. Please fix the errors listed above.\n` +
1763 `******************************\n`
1764 rule.Command().
1765 Text("touch").Output(d.checkLastReleasedApiTimestamp).
1766 Text(") || (").
1767 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1768 Text("; exit 38").
1769 Text(")")
1770
1771 rule.Build(pctx, ctx, "metalavaLastApiCheck", "metalava check last API")
Nan Zhang61819ce2018-05-04 18:49:16 -07001772 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001773
Pete Gillin581d6082018-10-22 15:55:04 +01001774 if String(d.properties.Check_nullability_warnings) != "" {
1775 if d.nullabilityWarningsFile == nil {
1776 ctx.PropertyErrorf("check_nullability_warnings",
1777 "Cannot specify check_nullability_warnings unless validating nullability")
1778 }
Colin Cross33961b52019-07-11 11:01:22 -07001779
1780 checkNullabilityWarnings := android.PathForModuleSrc(ctx, String(d.properties.Check_nullability_warnings))
1781
Pete Gillin581d6082018-10-22 15:55:04 +01001782 d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, "check_nullability_warnings.timestamp")
Colin Cross33961b52019-07-11 11:01:22 -07001783
Pete Gillin581d6082018-10-22 15:55:04 +01001784 msg := fmt.Sprintf(`\n******************************\n`+
1785 `The warnings encountered during nullability annotation validation did\n`+
1786 `not match the checked in file of expected warnings. The diffs are shown\n`+
1787 `above. You have two options:\n`+
1788 ` 1. Resolve the differences by editing the nullability annotations.\n`+
1789 ` 2. Update the file of expected warnings by running:\n`+
1790 ` cp %s %s\n`+
1791 ` and submitting the updated file as part of your change.`,
1792 d.nullabilityWarningsFile, checkNullabilityWarnings)
Colin Cross33961b52019-07-11 11:01:22 -07001793
1794 rule := android.NewRuleBuilder()
1795
1796 rule.Command().
1797 Text("(").
1798 Text("diff").Input(checkNullabilityWarnings).Input(d.nullabilityWarningsFile).
1799 Text("&&").
1800 Text("touch").Output(d.checkNullabilityWarningsTimestamp).
1801 Text(") || (").
1802 Text("echo").Flag("-e").Flag(`"` + msg + `"`).
1803 Text("; exit 38").
1804 Text(")")
1805
1806 rule.Build(pctx, ctx, "nullabilityWarningsCheck", "nullability warnings check")
Pete Gillin581d6082018-10-22 15:55:04 +01001807 }
1808
Nan Zhang71bbe632018-09-17 14:32:21 -07001809 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
Colin Cross33961b52019-07-11 11:01:22 -07001810 if len(d.Javadoc.properties.Out) > 0 {
1811 ctx.PropertyErrorf("out", "out property may not be combined with jdiff")
1812 }
1813
1814 outDir := android.PathForModuleOut(ctx, "jdiff-out")
1815 srcJarDir := android.PathForModuleOut(ctx, "jdiff-srcjars")
1816 stubsDir := android.PathForModuleOut(ctx, "jdiff-stubsDir")
1817
1818 rule := android.NewRuleBuilder()
Nan Zhang71bbe632018-09-17 14:32:21 -07001819
Nan Zhang86b06202018-09-21 17:09:21 -07001820 // Please sync with android-api-council@ before making any changes for the name of jdiffDocZip below
1821 // since there's cron job downstream that fetch this .zip file periodically.
1822 // See b/116221385 for reference.
Nan Zhang71bbe632018-09-17 14:32:21 -07001823 d.jdiffDocZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-docs.zip")
1824 d.jdiffStubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-stubs.srcjar")
1825
Nan Zhang71bbe632018-09-17 14:32:21 -07001826 jdiff := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jdiff.jar")
Nan Zhang71bbe632018-09-17 14:32:21 -07001827
Colin Cross33961b52019-07-11 11:01:22 -07001828 rule.Command().Text("rm -rf").Text(outDir.String()).Text(stubsDir.String())
1829 rule.Command().Text("mkdir -p").Text(outDir.String()).Text(stubsDir.String())
Nan Zhang71bbe632018-09-17 14:32:21 -07001830
Colin Cross33961b52019-07-11 11:01:22 -07001831 srcJarList := zipSyncCmd(ctx, rule, srcJarDir, d.Javadoc.srcJars)
1832
Colin Crossdaa4c672019-07-15 22:53:46 -07001833 cmd := javadocBootclasspathCmd(ctx, rule, d.Javadoc.srcFiles, outDir, srcJarDir, srcJarList,
Colin Crossab054432019-07-15 16:13:59 -07001834 deps.bootClasspath, deps.classpath, d.sourcepaths)
1835
1836 cmd.Flag("-J-Xmx1600m").
Colin Cross33961b52019-07-11 11:01:22 -07001837 Flag("-XDignore.symbol.file").
1838 FlagWithArg("-doclet ", "jdiff.JDiff").
1839 FlagWithInput("-docletpath ", jdiff).
1840 Flag("-quiet").
1841 FlagWithArg("-newapi ", strings.TrimSuffix(d.apiXmlFile.Base(), d.apiXmlFile.Ext())).
1842 FlagWithArg("-newapidir ", filepath.Dir(d.apiXmlFile.String())).
1843 Implicit(d.apiXmlFile).
1844 FlagWithArg("-oldapi ", strings.TrimSuffix(d.lastReleasedApiXmlFile.Base(), d.lastReleasedApiXmlFile.Ext())).
1845 FlagWithArg("-oldapidir ", filepath.Dir(d.lastReleasedApiXmlFile.String())).
1846 Implicit(d.lastReleasedApiXmlFile)
1847
Colin Cross33961b52019-07-11 11:01:22 -07001848 rule.Command().
1849 BuiltTool(ctx, "soong_zip").
1850 Flag("-write_if_changed").
1851 Flag("-d").
1852 FlagWithOutput("-o ", d.jdiffDocZip).
1853 FlagWithArg("-C ", outDir.String()).
1854 FlagWithArg("-D ", outDir.String())
1855
1856 rule.Command().
1857 BuiltTool(ctx, "soong_zip").
1858 Flag("-write_if_changed").
1859 Flag("-jar").
1860 FlagWithOutput("-o ", d.jdiffStubsSrcJar).
1861 FlagWithArg("-C ", stubsDir.String()).
1862 FlagWithArg("-D ", stubsDir.String())
1863
1864 rule.Restat()
1865
1866 zipSyncCleanupCmd(rule, srcJarDir)
1867
1868 rule.Build(pctx, ctx, "jdiff", "jdiff")
Nan Zhang71bbe632018-09-17 14:32:21 -07001869 }
Nan Zhang581fd212018-01-10 16:06:12 -08001870}
Dan Willemsencc090972018-02-26 14:33:31 -08001871
Nan Zhanga40da042018-08-01 12:48:00 -07001872//
Nan Zhangf4936b02018-08-01 15:00:28 -07001873// Exported Droiddoc Directory
Nan Zhanga40da042018-08-01 12:48:00 -07001874//
Dan Willemsencc090972018-02-26 14:33:31 -08001875var droiddocTemplateTag = dependencyTag{name: "droiddoc-template"}
Nan Zhangf4936b02018-08-01 15:00:28 -07001876var metalavaMergeAnnotationsDirTag = dependencyTag{name: "metalava-merge-annotations-dir"}
Pete Gillin77167902018-09-19 18:16:26 +01001877var metalavaMergeInclusionAnnotationsDirTag = dependencyTag{name: "metalava-merge-inclusion-annotations-dir"}
Nan Zhang9c69a122018-08-22 10:22:08 -07001878var metalavaAPILevelsAnnotationsDirTag = dependencyTag{name: "metalava-api-levels-annotations-dir"}
Dan Willemsencc090972018-02-26 14:33:31 -08001879
Nan Zhangf4936b02018-08-01 15:00:28 -07001880type ExportedDroiddocDirProperties struct {
1881 // path to the directory containing Droiddoc related files.
Dan Willemsencc090972018-02-26 14:33:31 -08001882 Path *string
1883}
1884
Nan Zhangf4936b02018-08-01 15:00:28 -07001885type ExportedDroiddocDir struct {
Dan Willemsencc090972018-02-26 14:33:31 -08001886 android.ModuleBase
1887
Nan Zhangf4936b02018-08-01 15:00:28 -07001888 properties ExportedDroiddocDirProperties
Dan Willemsencc090972018-02-26 14:33:31 -08001889
1890 deps android.Paths
1891 dir android.Path
1892}
1893
Colin Crossa3002fc2019-07-08 16:48:04 -07001894// droiddoc_exported_dir exports a directory of html templates or nullability annotations for use by doclava.
Nan Zhangf4936b02018-08-01 15:00:28 -07001895func ExportedDroiddocDirFactory() android.Module {
1896 module := &ExportedDroiddocDir{}
Dan Willemsencc090972018-02-26 14:33:31 -08001897 module.AddProperties(&module.properties)
1898 android.InitAndroidModule(module)
1899 return module
1900}
1901
Nan Zhangf4936b02018-08-01 15:00:28 -07001902func (d *ExportedDroiddocDir) DepsMutator(android.BottomUpMutatorContext) {}
Dan Willemsencc090972018-02-26 14:33:31 -08001903
Nan Zhangf4936b02018-08-01 15:00:28 -07001904func (d *ExportedDroiddocDir) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross07e51612019-03-05 12:46:40 -08001905 path := String(d.properties.Path)
1906 d.dir = android.PathForModuleSrc(ctx, path)
Colin Cross8a497952019-03-05 22:25:09 -08001907 d.deps = android.PathsForModuleSrc(ctx, []string{filepath.Join(path, "**/*")})
Dan Willemsencc090972018-02-26 14:33:31 -08001908}
Nan Zhangb2b33de2018-02-23 11:18:47 -08001909
1910//
1911// Defaults
1912//
1913type DocDefaults struct {
1914 android.ModuleBase
1915 android.DefaultsModuleBase
1916}
1917
Nan Zhangb2b33de2018-02-23 11:18:47 -08001918func DocDefaultsFactory() android.Module {
1919 module := &DocDefaults{}
1920
1921 module.AddProperties(
1922 &JavadocProperties{},
1923 &DroiddocProperties{},
1924 )
1925
1926 android.InitDefaultsModule(module)
1927
1928 return module
1929}
Nan Zhang1598a9e2018-09-04 17:14:32 -07001930
1931func StubsDefaultsFactory() android.Module {
1932 module := &DocDefaults{}
1933
1934 module.AddProperties(
1935 &JavadocProperties{},
1936 &DroidstubsProperties{},
1937 )
1938
1939 android.InitDefaultsModule(module)
1940
1941 return module
1942}
Colin Cross33961b52019-07-11 11:01:22 -07001943
1944func zipSyncCmd(ctx android.ModuleContext, rule *android.RuleBuilder,
1945 srcJarDir android.ModuleOutPath, srcJars android.Paths) android.OutputPath {
1946
1947 rule.Command().Text("rm -rf").Text(srcJarDir.String())
1948 rule.Command().Text("mkdir -p").Text(srcJarDir.String())
1949 srcJarList := srcJarDir.Join(ctx, "list")
1950
1951 rule.Temporary(srcJarList)
1952
1953 rule.Command().BuiltTool(ctx, "zipsync").
1954 FlagWithArg("-d ", srcJarDir.String()).
1955 FlagWithOutput("-l ", srcJarList).
1956 FlagWithArg("-f ", `"*.java"`).
1957 Inputs(srcJars)
1958
1959 return srcJarList
1960}
1961
1962func zipSyncCleanupCmd(rule *android.RuleBuilder, srcJarDir android.ModuleOutPath) {
1963 rule.Command().Text("rm -rf").Text(srcJarDir.String())
1964}
Paul Duffin91547182019-11-12 19:39:36 +00001965
1966var _ android.PrebuiltInterface = (*PrebuiltStubsSources)(nil)
1967
1968type PrebuiltStubsSourcesProperties struct {
1969 Srcs []string `android:"path"`
1970}
1971
1972type PrebuiltStubsSources struct {
1973 android.ModuleBase
1974 android.DefaultableModuleBase
1975 prebuilt android.Prebuilt
1976 android.SdkBase
1977
1978 properties PrebuiltStubsSourcesProperties
1979
Paul Duffin9b478b02019-12-10 13:41:51 +00001980 // The source directories containing stubs source files.
1981 srcDirs android.Paths
Paul Duffin91547182019-11-12 19:39:36 +00001982 stubsSrcJar android.ModuleOutPath
1983}
1984
Paul Duffin9b478b02019-12-10 13:41:51 +00001985func (p *PrebuiltStubsSources) OutputFiles(tag string) (android.Paths, error) {
1986 switch tag {
1987 case "":
1988 return android.Paths{p.stubsSrcJar}, nil
1989 default:
1990 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
1991 }
1992}
1993
Paul Duffin91547182019-11-12 19:39:36 +00001994func (p *PrebuiltStubsSources) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Paul Duffin9b478b02019-12-10 13:41:51 +00001995 p.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
1996
1997 p.srcDirs = android.PathsForModuleSrc(ctx, p.properties.Srcs)
1998
1999 rule := android.NewRuleBuilder()
2000 command := rule.Command().
2001 BuiltTool(ctx, "soong_zip").
2002 Flag("-write_if_changed").
2003 Flag("-jar").
2004 FlagWithOutput("-o ", p.stubsSrcJar)
2005
2006 for _, d := range p.srcDirs {
2007 dir := d.String()
2008 command.
2009 FlagWithArg("-C ", dir).
2010 FlagWithInput("-D ", d)
2011 }
2012
2013 rule.Restat()
2014
2015 rule.Build(pctx, ctx, "zip src", "Create srcjar from prebuilt source")
Paul Duffin91547182019-11-12 19:39:36 +00002016}
2017
2018func (p *PrebuiltStubsSources) Prebuilt() *android.Prebuilt {
2019 return &p.prebuilt
2020}
2021
2022func (p *PrebuiltStubsSources) Name() string {
2023 return p.prebuilt.Name(p.ModuleBase.Name())
2024}
2025
Paul Duffin91547182019-11-12 19:39:36 +00002026// prebuilt_stubs_sources imports a set of java source files as if they were
2027// generated by droidstubs.
2028//
2029// By default, a prebuilt_stubs_sources has a single variant that expects a
2030// set of `.java` files generated by droidstubs.
2031//
2032// Specifying `host_supported: true` will produce two variants, one for use as a dependency of device modules and one
2033// for host modules.
2034//
2035// Intended only for use by sdk snapshots.
2036func PrebuiltStubsSourcesFactory() android.Module {
2037 module := &PrebuiltStubsSources{}
2038
2039 module.AddProperties(&module.properties)
2040
2041 android.InitPrebuiltModule(module, &module.properties.Srcs)
2042 android.InitSdkAwareModule(module)
2043 InitDroiddocModule(module, android.HostAndDeviceSupported)
2044 return module
2045}
2046
Paul Duffin13879572019-11-28 14:31:38 +00002047type droidStubsSdkMemberType struct {
Paul Duffin255f18e2019-12-13 11:22:16 +00002048 android.SdkMemberTypeBase
Paul Duffin13879572019-11-28 14:31:38 +00002049}
2050
2051func (mt *droidStubsSdkMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) {
2052 mctx.AddVariationDependencies(nil, dependencyTag, names...)
2053}
2054
2055func (mt *droidStubsSdkMemberType) IsInstance(module android.Module) bool {
2056 _, ok := module.(*Droidstubs)
2057 return ok
2058}
2059
Paul Duffin495ffb92020-03-20 13:35:40 +00002060func (mt *droidStubsSdkMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
2061 return ctx.SnapshotBuilder().AddPrebuiltModule(member, "prebuilt_stubs_sources")
2062}
2063
2064func (mt *droidStubsSdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
2065 return &droidStubsInfoProperties{}
2066}
2067
2068type droidStubsInfoProperties struct {
2069 android.SdkMemberPropertiesBase
2070
2071 StubsSrcJar android.Path
2072}
2073
2074func (p *droidStubsInfoProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
2075 droidstubs := variant.(*Droidstubs)
2076 p.StubsSrcJar = droidstubs.stubsSrcJar
2077}
2078
2079func (p *droidStubsInfoProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
2080 if p.StubsSrcJar != nil {
2081 builder := ctx.SnapshotBuilder()
2082
2083 snapshotRelativeDir := filepath.Join("java", ctx.Name()+"_stubs_sources")
2084
2085 builder.UnzipToSnapshot(p.StubsSrcJar, snapshotRelativeDir)
2086
2087 propertySet.AddProperty("srcs", []string{snapshotRelativeDir})
Paul Duffin13879572019-11-28 14:31:38 +00002088 }
Paul Duffin91547182019-11-12 19:39:36 +00002089}