blob: f56cae826c294742c9b1b1b146c33c48cfd16c63 [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 (
18 "android/soong/android"
19 "android/soong/java/config"
20 "fmt"
Nan Zhangb2b33de2018-02-23 11:18:47 -080021 "path/filepath"
Nan Zhang46130972018-06-04 11:28:01 -070022 "runtime"
Nan Zhang581fd212018-01-10 16:06:12 -080023 "strings"
24
25 "github.com/google/blueprint"
26)
27
28var (
29 javadoc = pctx.AndroidStaticRule("javadoc",
30 blueprint.RuleParams{
31 Command: `rm -rf "$outDir" "$srcJarDir" "$stubsDir" && mkdir -p "$outDir" "$srcJarDir" "$stubsDir" && ` +
Colin Cross436b7652018-03-15 16:24:10 -070032 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Nan Zhang40b41b42018-10-02 16:11:17 -070033 `${config.SoongJavacWrapper} ${config.JavadocCmd} -encoding UTF-8 @$out.rsp @$srcJarDir/list ` +
Nan Zhang1598a9e2018-09-04 17:14:32 -070034 `$opts $bootclasspathArgs $classpathArgs $sourcepathArgs ` +
Nan Zhang581fd212018-01-10 16:06:12 -080035 `-d $outDir -quiet && ` +
36 `${config.SoongZipCmd} -write_if_changed -d -o $docZip -C $outDir -D $outDir && ` +
Colin Cross44c29a82019-01-24 16:36:57 -080037 `${config.SoongZipCmd} -write_if_changed -jar -o $out -C $stubsDir -D $stubsDir $postDoclavaCmds && ` +
38 `rm -rf "$srcJarDir"`,
39
Nan Zhang581fd212018-01-10 16:06:12 -080040 CommandDeps: []string{
Colin Cross436b7652018-03-15 16:24:10 -070041 "${config.ZipSyncCmd}",
Nan Zhang581fd212018-01-10 16:06:12 -080042 "${config.JavadocCmd}",
43 "${config.SoongZipCmd}",
Nan Zhang581fd212018-01-10 16:06:12 -080044 },
Nan Zhang40b41b42018-10-02 16:11:17 -070045 CommandOrderOnly: []string{"${config.SoongJavacWrapper}"},
46 Rspfile: "$out.rsp",
47 RspfileContent: "$in",
48 Restat: true,
Nan Zhang581fd212018-01-10 16:06:12 -080049 },
Nan Zhangaf322cc2018-06-19 15:15:38 -070050 "outDir", "srcJarDir", "stubsDir", "srcJars", "opts",
Nan Zhang1598a9e2018-09-04 17:14:32 -070051 "bootclasspathArgs", "classpathArgs", "sourcepathArgs", "docZip", "postDoclavaCmds")
Nan Zhang61819ce2018-05-04 18:49:16 -070052
53 apiCheck = pctx.AndroidStaticRule("apiCheck",
54 blueprint.RuleParams{
55 Command: `( ${config.ApiCheckCmd} -JXmx1024m -J"classpath $classpath" $opts ` +
56 `$apiFile $apiFileToCheck $removedApiFile $removedApiFileToCheck ` +
Jiyong Parkeeb8a642018-05-12 22:21:20 +090057 `&& touch $out ) || (echo -e "$msg" ; exit 38)`,
Nan Zhang61819ce2018-05-04 18:49:16 -070058 CommandDeps: []string{
59 "${config.ApiCheckCmd}",
60 },
61 },
62 "classpath", "opts", "apiFile", "apiFileToCheck", "removedApiFile", "removedApiFileToCheck", "msg")
63
64 updateApi = pctx.AndroidStaticRule("updateApi",
65 blueprint.RuleParams{
Nan Zhang1598a9e2018-09-04 17:14:32 -070066 Command: `( ( cp -f $srcApiFile $destApiFile && cp -f $srcRemovedApiFile $destRemovedApiFile ) ` +
Nan Zhang61819ce2018-05-04 18:49:16 -070067 `&& touch $out ) || (echo failed to update public API ; exit 38)`,
68 },
Nan Zhang1598a9e2018-09-04 17:14:32 -070069 "srcApiFile", "destApiFile", "srcRemovedApiFile", "destRemovedApiFile")
Nan Zhang79614d12018-04-19 18:03:39 -070070
71 metalava = pctx.AndroidStaticRule("metalava",
72 blueprint.RuleParams{
Nan Zhang1598a9e2018-09-04 17:14:32 -070073 Command: `rm -rf "$outDir" "$srcJarDir" "$stubsDir" && ` +
74 `mkdir -p "$outDir" "$srcJarDir" "$stubsDir" && ` +
Nan Zhang79614d12018-04-19 18:03:39 -070075 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Nan Zhang357466b2018-04-17 17:38:36 -070076 `${config.JavaCmd} -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list ` +
Tor Norbye76c875a2018-12-26 20:34:29 -080077 `$bootclasspathArgs $classpathArgs $sourcepathArgs --no-banner --color --quiet --format=v2 ` +
Nan Zhang1598a9e2018-09-04 17:14:32 -070078 `$opts && ` +
Colin Cross44c29a82019-01-24 16:36:57 -080079 `${config.SoongZipCmd} -write_if_changed -jar -o $out -C $stubsDir -D $stubsDir && ` +
Jerome Gaillard0b09ad72019-10-10 19:29:11 +010080 `(if $writeSdkValues; then ${config.SoongZipCmd} -write_if_changed -d -o $metadataZip ` +
81 `-C $metadataDir -D $metadataDir; fi) && ` +
Colin Cross44c29a82019-01-24 16:36:57 -080082 `rm -rf "$srcJarDir"`,
Nan Zhang79614d12018-04-19 18:03:39 -070083 CommandDeps: []string{
84 "${config.ZipSyncCmd}",
85 "${config.JavaCmd}",
86 "${config.MetalavaJar}",
Nan Zhang79614d12018-04-19 18:03:39 -070087 "${config.SoongZipCmd}",
88 },
89 Rspfile: "$out.rsp",
90 RspfileContent: "$in",
91 Restat: true,
92 },
Nan Zhang1598a9e2018-09-04 17:14:32 -070093 "outDir", "srcJarDir", "stubsDir", "srcJars", "javaVersion", "bootclasspathArgs",
Jerome Gaillard0b09ad72019-10-10 19:29:11 +010094 "classpathArgs", "sourcepathArgs", "opts", "writeSdkValues", "metadataZip", "metadataDir")
Nan Zhang2760dfc2018-08-24 17:32:54 +000095
96 metalavaApiCheck = pctx.AndroidStaticRule("metalavaApiCheck",
97 blueprint.RuleParams{
98 Command: `( rm -rf "$srcJarDir" && mkdir -p "$srcJarDir" && ` +
99 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
100 `${config.JavaCmd} -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list ` +
Tor Norbye76c875a2018-12-26 20:34:29 -0800101 `$bootclasspathArgs $classpathArgs $sourcepathArgs --no-banner --color --quiet --format=v2 ` +
Colin Cross44c29a82019-01-24 16:36:57 -0800102 `$opts && touch $out && rm -rf "$srcJarDir") || ` +
Nan Zhang2760dfc2018-08-24 17:32:54 +0000103 `( echo -e "$msg" ; exit 38 )`,
104 CommandDeps: []string{
105 "${config.ZipSyncCmd}",
106 "${config.JavaCmd}",
107 "${config.MetalavaJar}",
108 },
109 Rspfile: "$out.rsp",
110 RspfileContent: "$in",
111 },
Nan Zhang1598a9e2018-09-04 17:14:32 -0700112 "srcJarDir", "srcJars", "javaVersion", "bootclasspathArgs", "classpathArgs", "sourcepathArgs", "opts", "msg")
113
Pete Gillin581d6082018-10-22 15:55:04 +0100114 nullabilityWarningsCheck = pctx.AndroidStaticRule("nullabilityWarningsCheck",
115 blueprint.RuleParams{
116 Command: `( diff $expected $actual && touch $out ) || ( echo -e "$msg" ; exit 38 )`,
117 },
118 "expected", "actual", "msg")
119
Nan Zhang1598a9e2018-09-04 17:14:32 -0700120 dokka = pctx.AndroidStaticRule("dokka",
121 blueprint.RuleParams{
122 Command: `rm -rf "$outDir" "$srcJarDir" "$stubsDir" && ` +
123 `mkdir -p "$outDir" "$srcJarDir" "$stubsDir" && ` +
124 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
125 `${config.JavaCmd} -jar ${config.DokkaJar} $srcJarDir ` +
126 `$classpathArgs -format dac -dacRoot /reference/kotlin -output $outDir $opts && ` +
127 `${config.SoongZipCmd} -write_if_changed -d -o $docZip -C $outDir -D $outDir && ` +
Colin Cross44c29a82019-01-24 16:36:57 -0800128 `${config.SoongZipCmd} -write_if_changed -jar -o $out -C $stubsDir -D $stubsDir && ` +
129 `rm -rf "$srcJarDir"`,
Nan Zhang1598a9e2018-09-04 17:14:32 -0700130 CommandDeps: []string{
131 "${config.ZipSyncCmd}",
132 "${config.DokkaJar}",
133 "${config.MetalavaJar}",
134 "${config.SoongZipCmd}",
135 },
136 Restat: true,
137 },
138 "outDir", "srcJarDir", "stubsDir", "srcJars", "classpathArgs", "opts", "docZip")
Nan Zhang581fd212018-01-10 16:06:12 -0800139)
140
141func init() {
Nan Zhangb2b33de2018-02-23 11:18:47 -0800142 android.RegisterModuleType("doc_defaults", DocDefaultsFactory)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700143 android.RegisterModuleType("stubs_defaults", StubsDefaultsFactory)
Nan Zhangb2b33de2018-02-23 11:18:47 -0800144
Nan Zhang581fd212018-01-10 16:06:12 -0800145 android.RegisterModuleType("droiddoc", DroiddocFactory)
146 android.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
Nan Zhangf4936b02018-08-01 15:00:28 -0700147 android.RegisterModuleType("droiddoc_exported_dir", ExportedDroiddocDirFactory)
Nan Zhang581fd212018-01-10 16:06:12 -0800148 android.RegisterModuleType("javadoc", JavadocFactory)
149 android.RegisterModuleType("javadoc_host", JavadocHostFactory)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700150
151 android.RegisterModuleType("droidstubs", DroidstubsFactory)
152 android.RegisterModuleType("droidstubs_host", DroidstubsHostFactory)
Nan Zhang581fd212018-01-10 16:06:12 -0800153}
154
Colin Crossa1ce2a02018-06-20 15:19:39 -0700155var (
156 srcsLibTag = dependencyTag{name: "sources from javalib"}
157)
158
Nan Zhang581fd212018-01-10 16:06:12 -0800159type JavadocProperties struct {
160 // list of source files used to compile the Java module. May be .java, .logtags, .proto,
161 // or .aidl files.
Colin Cross27b922f2019-03-04 22:35:41 -0800162 Srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -0800163
164 // list of directories rooted at the Android.bp file that will
165 // be added to the search paths for finding source files when passing package names.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800166 Local_sourcepaths []string
Nan Zhang581fd212018-01-10 16:06:12 -0800167
168 // list of source files that should not be used to build the Java module.
169 // This is most useful in the arch/multilib variants to remove non-common files
170 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -0800171 Exclude_srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -0800172
Nan Zhangb2b33de2018-02-23 11:18:47 -0800173 // list of java libraries that will be in the classpath.
Nan Zhang581fd212018-01-10 16:06:12 -0800174 Libs []string `android:"arch_variant"`
175
Paul Duffin2fbbfb82019-02-13 12:49:33 +0000176 // don't build against the default libraries (bootclasspath, ext, and framework for device
177 // targets)
Nan Zhang5994b622018-09-21 16:39:51 -0700178 No_standard_libs *bool
179
Paul Duffin2fbbfb82019-02-13 12:49:33 +0000180 // don't build against the framework libraries (ext, and framework for device targets)
Nan Zhange66c7272018-03-06 12:59:27 -0800181 No_framework_libs *bool
182
Nan Zhangb2b33de2018-02-23 11:18:47 -0800183 // the java library (in classpath) for documentation that provides java srcs and srcjars.
184 Srcs_lib *string
185
186 // the base dirs under srcs_lib will be scanned for java srcs.
187 Srcs_lib_whitelist_dirs []string
188
189 // the sub dirs under srcs_lib_whitelist_dirs will be scanned for java srcs.
190 Srcs_lib_whitelist_pkgs []string
191
Nan Zhang581fd212018-01-10 16:06:12 -0800192 // If set to false, don't allow this module(-docs.zip) to be exported. Defaults to true.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800193 Installable *bool
Nan Zhang581fd212018-01-10 16:06:12 -0800194
195 // if not blank, set to the version of the sdk to compile against
196 Sdk_version *string `android:"arch_variant"`
Jiyong Park1e440682018-05-23 18:42:04 +0900197
198 Aidl struct {
199 // Top level directories to pass to aidl tool
200 Include_dirs []string
201
202 // Directories rooted at the Android.bp file to pass to aidl tool
203 Local_include_dirs []string
204 }
Nan Zhang357466b2018-04-17 17:38:36 -0700205
206 // If not blank, set the java version passed to javadoc as -source
207 Java_version *string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700208
209 // local files that are used within user customized droiddoc options.
Colin Cross27b922f2019-03-04 22:35:41 -0800210 Arg_files []string `android:"path"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700211
212 // user customized droiddoc args.
213 // Available variables for substitution:
214 //
215 // $(location <label>): the path to the arg_files with name <label>
216 Args *string
217
218 // names of the output files used in args that will be generated
219 Out []string
Nan Zhang581fd212018-01-10 16:06:12 -0800220}
221
Nan Zhang61819ce2018-05-04 18:49:16 -0700222type ApiToCheck struct {
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900223 // path to the API txt file that the new API extracted from source code is checked
224 // against. The path can be local to the module or from other module (via :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800225 Api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700226
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900227 // path to the API txt file that the new @removed API extractd from source code is
228 // checked against. The path can be local to the module or from other module (via
229 // :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800230 Removed_api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700231
Adrian Roos4937c4a2019-08-12 17:54:09 +0200232 // If not blank, path to the baseline txt file for approved API check violations.
233 Baseline_file *string `android:"path"`
234
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900235 // Arguments to the apicheck tool.
Nan Zhang61819ce2018-05-04 18:49:16 -0700236 Args *string
237}
238
Nan Zhang581fd212018-01-10 16:06:12 -0800239type DroiddocProperties struct {
240 // directory relative to top of the source tree that contains doc templates files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800241 Custom_template *string
Nan Zhang581fd212018-01-10 16:06:12 -0800242
Nan Zhanga40da042018-08-01 12:48:00 -0700243 // directories under current module source which contains html/jd files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800244 Html_dirs []string
Nan Zhang581fd212018-01-10 16:06:12 -0800245
246 // set a value in the Clearsilver hdf namespace.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800247 Hdf []string
Nan Zhang581fd212018-01-10 16:06:12 -0800248
249 // proofread file contains all of the text content of the javadocs concatenated into one file,
250 // suitable for spell-checking and other goodness.
Colin Cross27b922f2019-03-04 22:35:41 -0800251 Proofread_file *string `android:"path"`
Nan Zhang581fd212018-01-10 16:06:12 -0800252
253 // a todo file lists the program elements that are missing documentation.
254 // At some point, this might be improved to show more warnings.
Colin Cross27b922f2019-03-04 22:35:41 -0800255 Todo_file *string `android:"path"`
Nan Zhangb2b33de2018-02-23 11:18:47 -0800256
257 // directory under current module source that provide additional resources (images).
258 Resourcesdir *string
259
260 // resources output directory under out/soong/.intermediates.
261 Resourcesoutdir *string
Nan Zhang581fd212018-01-10 16:06:12 -0800262
Nan Zhange2ba5d42018-07-11 15:16:55 -0700263 // if set to true, collect the values used by the Dev tools and
264 // write them in files packaged with the SDK. Defaults to false.
265 Write_sdk_values *bool
266
267 // index.html under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800268 Static_doc_index_redirect *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700269
270 // source.properties under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800271 Static_doc_properties *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700272
Nan Zhang581fd212018-01-10 16:06:12 -0800273 // a list of files under current module source dir which contains known tags in Java sources.
274 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -0800275 Knowntags []string `android:"path"`
Nan Zhang28c68b92018-03-13 16:17:01 -0700276
277 // the tag name used to distinguish if the API files belong to public/system/test.
278 Api_tag_name *string
279
280 // the generated public API filename by Doclava.
281 Api_filename *string
282
David Brazdilfbe4cc32018-05-31 13:56:46 +0100283 // the generated public Dex API filename by Doclava.
284 Dex_api_filename *string
285
Nan Zhang28c68b92018-03-13 16:17:01 -0700286 // the generated private API filename by Doclava.
287 Private_api_filename *string
288
289 // the generated private Dex API filename by Doclava.
290 Private_dex_api_filename *string
291
292 // the generated removed API filename by Doclava.
293 Removed_api_filename *string
294
David Brazdilaac0c3c2018-04-24 16:23:29 +0100295 // the generated removed Dex API filename by Doclava.
296 Removed_dex_api_filename *string
297
Mathew Inwood76c3de12018-06-22 15:28:11 +0100298 // mapping of dex signatures to source file and line number. This is a temporary property and
299 // will be deleted; you probably shouldn't be using it.
300 Dex_mapping_filename *string
301
Nan Zhang28c68b92018-03-13 16:17:01 -0700302 // the generated exact API filename by Doclava.
303 Exact_api_filename *string
Nan Zhang853f4202018-04-12 16:55:56 -0700304
Nan Zhang66dc2362018-08-14 20:41:04 -0700305 // the generated proguard filename by Doclava.
306 Proguard_filename *string
307
Nan Zhang853f4202018-04-12 16:55:56 -0700308 // if set to false, don't allow droiddoc to generate stubs source files. Defaults to true.
309 Create_stubs *bool
Nan Zhang61819ce2018-05-04 18:49:16 -0700310
311 Check_api struct {
312 Last_released ApiToCheck
313
314 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900315
316 // do not perform API check against Last_released, in the case that both two specified API
317 // files by Last_released are modules which don't exist.
318 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700319 }
Nan Zhang79614d12018-04-19 18:03:39 -0700320
Nan Zhang1598a9e2018-09-04 17:14:32 -0700321 // if set to true, generate docs through Dokka instead of Doclava.
322 Dokka_enabled *bool
323}
324
325type DroidstubsProperties struct {
326 // the tag name used to distinguish if the API files belong to public/system/test.
327 Api_tag_name *string
328
Nan Zhang199645c2018-09-19 12:40:06 -0700329 // the generated public API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700330 Api_filename *string
331
Nan Zhang199645c2018-09-19 12:40:06 -0700332 // the generated public Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700333 Dex_api_filename *string
334
Nan Zhang199645c2018-09-19 12:40:06 -0700335 // the generated private API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700336 Private_api_filename *string
337
Nan Zhang199645c2018-09-19 12:40:06 -0700338 // the generated private Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700339 Private_dex_api_filename *string
340
Nan Zhang199645c2018-09-19 12:40:06 -0700341 // the generated removed API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700342 Removed_api_filename *string
343
Nan Zhang199645c2018-09-19 12:40:06 -0700344 // the generated removed Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700345 Removed_dex_api_filename *string
346
Nan Zhang9c69a122018-08-22 10:22:08 -0700347 // mapping of dex signatures to source file and line number. This is a temporary property and
348 // will be deleted; you probably shouldn't be using it.
349 Dex_mapping_filename *string
350
Nan Zhang199645c2018-09-19 12:40:06 -0700351 // the generated exact API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700352 Exact_api_filename *string
353
Nan Zhang199645c2018-09-19 12:40:06 -0700354 // the generated proguard filename by Metalava.
355 Proguard_filename *string
356
Nan Zhang1598a9e2018-09-04 17:14:32 -0700357 Check_api struct {
358 Last_released ApiToCheck
359
360 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900361
362 // do not perform API check against Last_released, in the case that both two specified API
363 // files by Last_released are modules which don't exist.
364 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700365 }
Nan Zhang79614d12018-04-19 18:03:39 -0700366
367 // user can specify the version of previous released API file in order to do compatibility check.
Colin Cross27b922f2019-03-04 22:35:41 -0800368 Previous_api *string `android:"path"`
Nan Zhang79614d12018-04-19 18:03:39 -0700369
370 // is set to true, Metalava will allow framework SDK to contain annotations.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700371 Annotations_enabled *bool
Nan Zhang79614d12018-04-19 18:03:39 -0700372
Pete Gillin77167902018-09-19 18:16:26 +0100373 // 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 -0700374 Merge_annotations_dirs []string
Nan Zhang86d2d552018-08-09 15:33:27 -0700375
Pete Gillin77167902018-09-19 18:16:26 +0100376 // a list of top-level directories containing Java stub files to merge show/hide annotations from.
377 Merge_inclusion_annotations_dirs []string
378
Pete Gillinc382a562018-11-14 18:45:46 +0000379 // a file containing a list of classes to do nullability validation for.
380 Validate_nullability_from_list *string
381
Pete Gillin581d6082018-10-22 15:55:04 +0100382 // a file containing expected warnings produced by validation of nullability annotations.
383 Check_nullability_warnings *string
384
Nan Zhang1598a9e2018-09-04 17:14:32 -0700385 // if set to true, allow Metalava to generate doc_stubs source files. Defaults to false.
386 Create_doc_stubs *bool
Nan Zhang9c69a122018-08-22 10:22:08 -0700387
388 // is set to true, Metalava will allow framework SDK to contain API levels annotations.
389 Api_levels_annotations_enabled *bool
390
391 // the dirs which Metalava extracts API levels annotations from.
392 Api_levels_annotations_dirs []string
393
394 // if set to true, collect the values used by the Dev tools and
395 // write them in files packaged with the SDK. Defaults to false.
396 Write_sdk_values *bool
Nan Zhang71bbe632018-09-17 14:32:21 -0700397
398 // If set to true, .xml based public API file will be also generated, and
399 // JDiff tool will be invoked to genreate javadoc files. Defaults to false.
400 Jdiff_enabled *bool
Nan Zhang581fd212018-01-10 16:06:12 -0800401}
402
Nan Zhanga40da042018-08-01 12:48:00 -0700403//
404// Common flags passed down to build rule
405//
406type droiddocBuilderFlags struct {
Nan Zhang86d2d552018-08-09 15:33:27 -0700407 bootClasspathArgs string
408 classpathArgs string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700409 sourcepathArgs string
Nan Zhang86d2d552018-08-09 15:33:27 -0700410 dokkaClasspathArgs string
411 aidlFlags string
Colin Cross9bdfaf02019-04-18 10:56:44 -0700412 aidlDeps android.Paths
Nan Zhanga40da042018-08-01 12:48:00 -0700413
Nan Zhanga40da042018-08-01 12:48:00 -0700414 doclavaStubsFlags string
Nan Zhang86d2d552018-08-09 15:33:27 -0700415 doclavaDocsFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700416 postDoclavaCmds string
417
Nan Zhang9c69a122018-08-22 10:22:08 -0700418 metalavaStubsFlags string
419 metalavaAnnotationsFlags string
Nan Zhangdee152b2018-12-26 16:06:37 -0800420 metalavaMergeAnnoDirFlags string
Neil Fullerb2f14ec2018-10-21 22:13:19 +0100421 metalavaInclusionAnnotationsFlags string
Nan Zhang9c69a122018-08-22 10:22:08 -0700422 metalavaApiLevelsAnnotationsFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700423
Nan Zhang71bbe632018-09-17 14:32:21 -0700424 metalavaApiToXmlFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700425}
426
427func InitDroiddocModule(module android.DefaultableModule, hod android.HostOrDeviceSupported) {
428 android.InitAndroidArchModule(module, hod, android.MultilibCommon)
429 android.InitDefaultableModule(module)
430}
431
Nan Zhang1598a9e2018-09-04 17:14:32 -0700432func apiCheckEnabled(apiToCheck ApiToCheck, apiVersionTag string) bool {
433 if String(apiToCheck.Api_file) != "" && String(apiToCheck.Removed_api_file) != "" {
434 return true
435 } else if String(apiToCheck.Api_file) != "" {
436 panic("for " + apiVersionTag + " removed_api_file has to be non-empty!")
437 } else if String(apiToCheck.Removed_api_file) != "" {
438 panic("for " + apiVersionTag + " api_file has to be non-empty!")
439 }
440
441 return false
442}
443
Inseob Kim38449af2019-02-28 14:24:05 +0900444func ignoreMissingModules(ctx android.BottomUpMutatorContext, apiToCheck *ApiToCheck) {
445 api_file := String(apiToCheck.Api_file)
446 removed_api_file := String(apiToCheck.Removed_api_file)
447
448 api_module := android.SrcIsModule(api_file)
449 removed_api_module := android.SrcIsModule(removed_api_file)
450
451 if api_module == "" || removed_api_module == "" {
452 return
453 }
454
455 if ctx.OtherModuleExists(api_module) || ctx.OtherModuleExists(removed_api_module) {
456 return
457 }
458
459 apiToCheck.Api_file = nil
460 apiToCheck.Removed_api_file = nil
461}
462
Nan Zhang1598a9e2018-09-04 17:14:32 -0700463type ApiFilePath interface {
464 ApiFilePath() android.Path
465}
466
467func transformUpdateApi(ctx android.ModuleContext, destApiFile, destRemovedApiFile,
468 srcApiFile, srcRemovedApiFile android.Path, output android.WritablePath) {
469 ctx.Build(pctx, android.BuildParams{
470 Rule: updateApi,
471 Description: "Update API",
472 Output: output,
473 Implicits: append(android.Paths{}, srcApiFile, srcRemovedApiFile,
474 destApiFile, destRemovedApiFile),
475 Args: map[string]string{
476 "destApiFile": destApiFile.String(),
477 "srcApiFile": srcApiFile.String(),
478 "destRemovedApiFile": destRemovedApiFile.String(),
479 "srcRemovedApiFile": srcRemovedApiFile.String(),
480 },
481 })
482}
483
Nan Zhanga40da042018-08-01 12:48:00 -0700484//
485// Javadoc
486//
Nan Zhang581fd212018-01-10 16:06:12 -0800487type Javadoc struct {
488 android.ModuleBase
489 android.DefaultableModuleBase
490
491 properties JavadocProperties
492
493 srcJars android.Paths
494 srcFiles android.Paths
495 sourcepaths android.Paths
Nan Zhang1598a9e2018-09-04 17:14:32 -0700496 argFiles android.Paths
497
498 args string
Nan Zhang581fd212018-01-10 16:06:12 -0800499
Nan Zhangccff0f72018-03-08 17:26:16 -0800500 docZip android.WritablePath
501 stubsSrcJar android.WritablePath
Nan Zhang581fd212018-01-10 16:06:12 -0800502}
503
Nan Zhangb2b33de2018-02-23 11:18:47 -0800504func (j *Javadoc) Srcs() android.Paths {
505 return android.Paths{j.stubsSrcJar}
506}
507
Nan Zhang581fd212018-01-10 16:06:12 -0800508func JavadocFactory() android.Module {
509 module := &Javadoc{}
510
511 module.AddProperties(&module.properties)
512
513 InitDroiddocModule(module, android.HostAndDeviceSupported)
514 return module
515}
516
517func JavadocHostFactory() android.Module {
518 module := &Javadoc{}
519
520 module.AddProperties(&module.properties)
521
522 InitDroiddocModule(module, android.HostSupported)
523 return module
524}
525
Nan Zhanga40da042018-08-01 12:48:00 -0700526var _ android.SourceFileProducer = (*Javadoc)(nil)
Nan Zhang581fd212018-01-10 16:06:12 -0800527
Colin Cross83bb3162018-06-25 15:48:06 -0700528func (j *Javadoc) sdkVersion() string {
529 return String(j.properties.Sdk_version)
530}
531
532func (j *Javadoc) minSdkVersion() string {
533 return j.sdkVersion()
534}
535
Dan Willemsen419290a2018-10-31 15:28:47 -0700536func (j *Javadoc) targetSdkVersion() string {
537 return j.sdkVersion()
538}
539
Nan Zhang581fd212018-01-10 16:06:12 -0800540func (j *Javadoc) addDeps(ctx android.BottomUpMutatorContext) {
541 if ctx.Device() {
Nan Zhang5994b622018-09-21 16:39:51 -0700542 if !Bool(j.properties.No_standard_libs) {
543 sdkDep := decodeSdkDep(ctx, sdkContext(j))
544 if sdkDep.useDefaultLibs {
545 ctx.AddVariationDependencies(nil, bootClasspathTag, config.DefaultBootclasspathLibraries...)
546 if ctx.Config().TargetOpenJDK9() {
547 ctx.AddVariationDependencies(nil, systemModulesTag, config.DefaultSystemModules)
548 }
549 if !Bool(j.properties.No_framework_libs) {
550 ctx.AddVariationDependencies(nil, libTag, config.DefaultLibraries...)
551 }
552 } else if sdkDep.useModule {
553 if ctx.Config().TargetOpenJDK9() {
554 ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
555 }
556 ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.modules...)
Nan Zhang357466b2018-04-17 17:38:36 -0700557 }
Nan Zhang581fd212018-01-10 16:06:12 -0800558 }
559 }
560
Colin Cross42d48b72018-08-29 14:10:52 -0700561 ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
Colin Crossa1ce2a02018-06-20 15:19:39 -0700562 if j.properties.Srcs_lib != nil {
Colin Cross42d48b72018-08-29 14:10:52 -0700563 ctx.AddVariationDependencies(nil, srcsLibTag, *j.properties.Srcs_lib)
Colin Crossa1ce2a02018-06-20 15:19:39 -0700564 }
Nan Zhang581fd212018-01-10 16:06:12 -0800565}
566
Nan Zhangb2b33de2018-02-23 11:18:47 -0800567func (j *Javadoc) genWhitelistPathPrefixes(whitelistPathPrefixes map[string]bool) {
568 for _, dir := range j.properties.Srcs_lib_whitelist_dirs {
569 for _, pkg := range j.properties.Srcs_lib_whitelist_pkgs {
Jiyong Park82484c02018-04-23 21:41:26 +0900570 // convert foo.bar.baz to foo/bar/baz
571 pkgAsPath := filepath.Join(strings.Split(pkg, ".")...)
572 prefix := filepath.Join(dir, pkgAsPath)
Nan Zhangb2b33de2018-02-23 11:18:47 -0800573 if _, found := whitelistPathPrefixes[prefix]; !found {
574 whitelistPathPrefixes[prefix] = true
575 }
576 }
577 }
578}
579
Nan Zhanga40da042018-08-01 12:48:00 -0700580func (j *Javadoc) collectAidlFlags(ctx android.ModuleContext, deps deps) droiddocBuilderFlags {
581 var flags droiddocBuilderFlags
Jiyong Park1e440682018-05-23 18:42:04 +0900582
Colin Cross9bdfaf02019-04-18 10:56:44 -0700583 flags.aidlFlags, flags.aidlDeps = j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs)
Jiyong Park1e440682018-05-23 18:42:04 +0900584
585 return flags
586}
587
588func (j *Javadoc) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
Colin Cross9bdfaf02019-04-18 10:56:44 -0700589 aidlIncludeDirs android.Paths) (string, android.Paths) {
Jiyong Park1e440682018-05-23 18:42:04 +0900590
591 aidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl.Local_include_dirs)
592 aidlIncludes = append(aidlIncludes, android.PathsForSource(ctx, j.properties.Aidl.Include_dirs)...)
593
594 var flags []string
Colin Cross9bdfaf02019-04-18 10:56:44 -0700595 var deps android.Paths
596
Jiyong Park1e440682018-05-23 18:42:04 +0900597 if aidlPreprocess.Valid() {
598 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Cross9bdfaf02019-04-18 10:56:44 -0700599 deps = append(deps, aidlPreprocess.Path())
Jiyong Park1e440682018-05-23 18:42:04 +0900600 } else {
601 flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
602 }
603
604 flags = append(flags, android.JoinWithPrefix(aidlIncludes.Strings(), "-I"))
605 flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
606 if src := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "src"); src.Valid() {
607 flags = append(flags, "-I"+src.String())
608 }
609
Colin Cross9bdfaf02019-04-18 10:56:44 -0700610 return strings.Join(flags, " "), deps
Jiyong Park1e440682018-05-23 18:42:04 +0900611}
612
613func (j *Javadoc) genSources(ctx android.ModuleContext, srcFiles android.Paths,
Nan Zhanga40da042018-08-01 12:48:00 -0700614 flags droiddocBuilderFlags) android.Paths {
Jiyong Park1e440682018-05-23 18:42:04 +0900615
616 outSrcFiles := make(android.Paths, 0, len(srcFiles))
617
618 for _, srcFile := range srcFiles {
619 switch srcFile.Ext() {
620 case ".aidl":
Colin Cross9bdfaf02019-04-18 10:56:44 -0700621 javaFile := genAidl(ctx, srcFile, flags.aidlFlags, flags.aidlDeps)
Jiyong Park1e440682018-05-23 18:42:04 +0900622 outSrcFiles = append(outSrcFiles, javaFile)
Inseob Kimc0907f12019-02-08 21:00:45 +0900623 case ".sysprop":
624 javaFile := genSysprop(ctx, srcFile)
625 outSrcFiles = append(outSrcFiles, javaFile)
Jiyong Park1e440682018-05-23 18:42:04 +0900626 default:
627 outSrcFiles = append(outSrcFiles, srcFile)
628 }
629 }
630
631 return outSrcFiles
632}
633
Nan Zhang581fd212018-01-10 16:06:12 -0800634func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
635 var deps deps
636
Colin Cross83bb3162018-06-25 15:48:06 -0700637 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800638 if sdkDep.invalidVersion {
Colin Cross86a60ae2018-05-29 14:44:55 -0700639 ctx.AddMissingDependencies(sdkDep.modules)
Nan Zhang581fd212018-01-10 16:06:12 -0800640 } else if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700641 deps.bootClasspath = append(deps.bootClasspath, sdkDep.jars...)
Nan Zhang581fd212018-01-10 16:06:12 -0800642 }
643
644 ctx.VisitDirectDeps(func(module android.Module) {
645 otherName := ctx.OtherModuleName(module)
646 tag := ctx.OtherModuleDependencyTag(module)
647
Colin Cross2d24c1b2018-05-23 10:59:18 -0700648 switch tag {
649 case bootClasspathTag:
650 if dep, ok := module.(Dependency); ok {
Nan Zhang581fd212018-01-10 16:06:12 -0800651 deps.bootClasspath = append(deps.bootClasspath, dep.ImplementationJars()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700652 } else {
653 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
654 }
655 case libTag:
656 switch dep := module.(type) {
Colin Cross897d2ed2019-02-11 14:03:51 -0800657 case SdkLibraryDependency:
658 deps.classpath = append(deps.classpath, dep.SdkImplementationJars(ctx, j.sdkVersion())...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700659 case Dependency:
Sundong Ahnba493602018-11-20 17:36:35 +0900660 deps.classpath = append(deps.classpath, dep.HeaderJars()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700661 case android.SourceFileProducer:
Nan Zhang581fd212018-01-10 16:06:12 -0800662 checkProducesJars(ctx, dep)
663 deps.classpath = append(deps.classpath, dep.Srcs()...)
Nan Zhang581fd212018-01-10 16:06:12 -0800664 default:
665 ctx.ModuleErrorf("depends on non-java module %q", otherName)
666 }
Colin Crossa1ce2a02018-06-20 15:19:39 -0700667 case srcsLibTag:
668 switch dep := module.(type) {
669 case Dependency:
670 srcs := dep.(SrcDependency).CompiledSrcs()
671 whitelistPathPrefixes := make(map[string]bool)
672 j.genWhitelistPathPrefixes(whitelistPathPrefixes)
673 for _, src := range srcs {
674 if _, ok := src.(android.WritablePath); ok { // generated sources
675 deps.srcs = append(deps.srcs, src)
676 } else { // select source path for documentation based on whitelist path prefixs.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700677 for k := range whitelistPathPrefixes {
Colin Crossa1ce2a02018-06-20 15:19:39 -0700678 if strings.HasPrefix(src.Rel(), k) {
679 deps.srcs = append(deps.srcs, src)
680 break
681 }
682 }
683 }
684 }
685 deps.srcJars = append(deps.srcJars, dep.(SrcDependency).CompiledSrcJars()...)
686 default:
687 ctx.ModuleErrorf("depends on non-java module %q", otherName)
688 }
Nan Zhang357466b2018-04-17 17:38:36 -0700689 case systemModulesTag:
690 if deps.systemModules != nil {
691 panic("Found two system module dependencies")
692 }
693 sm := module.(*SystemModules)
694 if sm.outputFile == nil {
695 panic("Missing directory for system module dependency")
696 }
697 deps.systemModules = sm.outputFile
Nan Zhang581fd212018-01-10 16:06:12 -0800698 }
699 })
700 // do not pass exclude_srcs directly when expanding srcFiles since exclude_srcs
701 // may contain filegroup or genrule.
Colin Cross8a497952019-03-05 22:25:09 -0800702 srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
Nan Zhanga40da042018-08-01 12:48:00 -0700703 flags := j.collectAidlFlags(ctx, deps)
Jiyong Park1e440682018-05-23 18:42:04 +0900704 srcFiles = j.genSources(ctx, srcFiles, flags)
Nan Zhang581fd212018-01-10 16:06:12 -0800705
706 // srcs may depend on some genrule output.
707 j.srcJars = srcFiles.FilterByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800708 j.srcJars = append(j.srcJars, deps.srcJars...)
709
Nan Zhang581fd212018-01-10 16:06:12 -0800710 j.srcFiles = srcFiles.FilterOutByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800711 j.srcFiles = append(j.srcFiles, deps.srcs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800712
713 j.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
Nan Zhangccff0f72018-03-08 17:26:16 -0800714 j.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
Nan Zhang581fd212018-01-10 16:06:12 -0800715
Nan Zhang9c69a122018-08-22 10:22:08 -0700716 if j.properties.Local_sourcepaths == nil && len(j.srcFiles) > 0 {
Nan Zhang581fd212018-01-10 16:06:12 -0800717 j.properties.Local_sourcepaths = append(j.properties.Local_sourcepaths, ".")
718 }
719 j.sourcepaths = android.PathsForModuleSrc(ctx, j.properties.Local_sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800720
Colin Cross8a497952019-03-05 22:25:09 -0800721 j.argFiles = android.PathsForModuleSrc(ctx, j.properties.Arg_files)
Paul Duffin99e4a502019-02-11 15:38:42 +0000722 argFilesMap := map[string]string{}
723 argFileLabels := []string{}
Nan Zhang1598a9e2018-09-04 17:14:32 -0700724
Paul Duffin99e4a502019-02-11 15:38:42 +0000725 for _, label := range j.properties.Arg_files {
Colin Cross8a497952019-03-05 22:25:09 -0800726 var paths = android.PathsForModuleSrc(ctx, []string{label})
Paul Duffin99e4a502019-02-11 15:38:42 +0000727 if _, exists := argFilesMap[label]; !exists {
728 argFilesMap[label] = strings.Join(paths.Strings(), " ")
729 argFileLabels = append(argFileLabels, label)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700730 } else {
731 ctx.ModuleErrorf("multiple arg_files for %q, %q and %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000732 label, argFilesMap[label], paths)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700733 }
734 }
735
736 var err error
737 j.args, err = android.Expand(String(j.properties.Args), func(name string) (string, error) {
738 if strings.HasPrefix(name, "location ") {
739 label := strings.TrimSpace(strings.TrimPrefix(name, "location "))
Paul Duffin99e4a502019-02-11 15:38:42 +0000740 if paths, ok := argFilesMap[label]; ok {
741 return paths, nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700742 } else {
Paul Duffin99e4a502019-02-11 15:38:42 +0000743 return "", fmt.Errorf("unknown location label %q, expecting one of %q",
744 label, strings.Join(argFileLabels, ", "))
Nan Zhang1598a9e2018-09-04 17:14:32 -0700745 }
746 } else if name == "genDir" {
747 return android.PathForModuleGen(ctx).String(), nil
748 }
749 return "", fmt.Errorf("unknown variable '$(%s)'", name)
750 })
751
752 if err != nil {
753 ctx.PropertyErrorf("args", "%s", err.Error())
754 }
755
Nan Zhang581fd212018-01-10 16:06:12 -0800756 return deps
757}
758
759func (j *Javadoc) DepsMutator(ctx android.BottomUpMutatorContext) {
760 j.addDeps(ctx)
761}
762
763func (j *Javadoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
764 deps := j.collectDeps(ctx)
765
766 var implicits android.Paths
767 implicits = append(implicits, deps.bootClasspath...)
768 implicits = append(implicits, deps.classpath...)
769
Nan Zhang1598a9e2018-09-04 17:14:32 -0700770 var bootClasspathArgs, classpathArgs, sourcepathArgs string
Nan Zhang357466b2018-04-17 17:38:36 -0700771
Colin Cross83bb3162018-06-25 15:48:06 -0700772 javaVersion := getJavaVersion(ctx, String(j.properties.Java_version), sdkContext(j))
Colin Cross997262f2018-06-19 22:49:39 -0700773 if len(deps.bootClasspath) > 0 {
774 var systemModules classpath
775 if deps.systemModules != nil {
776 systemModules = append(systemModules, deps.systemModules)
Nan Zhang581fd212018-01-10 16:06:12 -0800777 }
Colin Cross997262f2018-06-19 22:49:39 -0700778 bootClasspathArgs = systemModules.FormJavaSystemModulesPath("--system ", ctx.Device())
779 bootClasspathArgs = bootClasspathArgs + " --patch-module java.base=."
Nan Zhang581fd212018-01-10 16:06:12 -0800780 }
781 if len(deps.classpath.Strings()) > 0 {
782 classpathArgs = "-classpath " + strings.Join(deps.classpath.Strings(), ":")
783 }
784
785 implicits = append(implicits, j.srcJars...)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700786 implicits = append(implicits, j.argFiles...)
Nan Zhang581fd212018-01-10 16:06:12 -0800787
Nan Zhangaf322cc2018-06-19 15:15:38 -0700788 opts := "-source " + javaVersion + " -J-Xmx1024m -XDignore.symbol.file -Xdoclint:none"
Nan Zhang581fd212018-01-10 16:06:12 -0800789
Nan Zhang1598a9e2018-09-04 17:14:32 -0700790 sourcepathArgs = "-sourcepath " + strings.Join(j.sourcepaths.Strings(), ":")
791
Nan Zhang581fd212018-01-10 16:06:12 -0800792 ctx.Build(pctx, android.BuildParams{
793 Rule: javadoc,
794 Description: "Javadoc",
Nan Zhangccff0f72018-03-08 17:26:16 -0800795 Output: j.stubsSrcJar,
Nan Zhang581fd212018-01-10 16:06:12 -0800796 ImplicitOutput: j.docZip,
797 Inputs: j.srcFiles,
798 Implicits: implicits,
799 Args: map[string]string{
Nan Zhangde860a42018-08-08 16:32:21 -0700800 "outDir": android.PathForModuleOut(ctx, "out").String(),
801 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
802 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
Nan Zhang581fd212018-01-10 16:06:12 -0800803 "srcJars": strings.Join(j.srcJars.Strings(), " "),
804 "opts": opts,
Nan Zhang853f4202018-04-12 16:55:56 -0700805 "bootclasspathArgs": bootClasspathArgs,
Nan Zhang581fd212018-01-10 16:06:12 -0800806 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -0700807 "sourcepathArgs": sourcepathArgs,
Nan Zhang581fd212018-01-10 16:06:12 -0800808 "docZip": j.docZip.String(),
809 },
810 })
811}
812
Nan Zhanga40da042018-08-01 12:48:00 -0700813//
814// Droiddoc
815//
816type Droiddoc struct {
817 Javadoc
818
819 properties DroiddocProperties
820 apiFile android.WritablePath
821 dexApiFile android.WritablePath
822 privateApiFile android.WritablePath
823 privateDexApiFile android.WritablePath
824 removedApiFile android.WritablePath
825 removedDexApiFile android.WritablePath
826 exactApiFile android.WritablePath
827 apiMappingFile android.WritablePath
Nan Zhang66dc2362018-08-14 20:41:04 -0700828 proguardFile android.WritablePath
Nan Zhanga40da042018-08-01 12:48:00 -0700829
830 checkCurrentApiTimestamp android.WritablePath
831 updateCurrentApiTimestamp android.WritablePath
832 checkLastReleasedApiTimestamp android.WritablePath
833
Nan Zhanga40da042018-08-01 12:48:00 -0700834 apiFilePath android.Path
835}
836
Nan Zhanga40da042018-08-01 12:48:00 -0700837func DroiddocFactory() android.Module {
838 module := &Droiddoc{}
839
840 module.AddProperties(&module.properties,
841 &module.Javadoc.properties)
842
843 InitDroiddocModule(module, android.HostAndDeviceSupported)
844 return module
845}
846
847func DroiddocHostFactory() android.Module {
848 module := &Droiddoc{}
849
850 module.AddProperties(&module.properties,
851 &module.Javadoc.properties)
852
853 InitDroiddocModule(module, android.HostSupported)
854 return module
855}
856
857func (d *Droiddoc) ApiFilePath() android.Path {
858 return d.apiFilePath
859}
860
Nan Zhang581fd212018-01-10 16:06:12 -0800861func (d *Droiddoc) DepsMutator(ctx android.BottomUpMutatorContext) {
862 d.Javadoc.addDeps(ctx)
863
Inseob Kim38449af2019-02-28 14:24:05 +0900864 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
865 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
866 }
867
Nan Zhang79614d12018-04-19 18:03:39 -0700868 if String(d.properties.Custom_template) != "" {
Dan Willemsencc090972018-02-26 14:33:31 -0800869 ctx.AddDependency(ctx.Module(), droiddocTemplateTag, String(d.properties.Custom_template))
870 }
Nan Zhang581fd212018-01-10 16:06:12 -0800871}
872
Nan Zhang66dc2362018-08-14 20:41:04 -0700873func (d *Droiddoc) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths,
874 deps deps) (droiddocBuilderFlags, error) {
Nan Zhanga40da042018-08-01 12:48:00 -0700875 var flags droiddocBuilderFlags
Nan Zhang581fd212018-01-10 16:06:12 -0800876
Nan Zhanga40da042018-08-01 12:48:00 -0700877 *implicits = append(*implicits, deps.bootClasspath...)
878 *implicits = append(*implicits, deps.classpath...)
Nan Zhang581fd212018-01-10 16:06:12 -0800879
Nan Zhangc94f9d82018-06-26 10:02:26 -0700880 if len(deps.bootClasspath.Strings()) > 0 {
881 // For OpenJDK 8 we can use -bootclasspath to define the core libraries code.
Nan Zhanga40da042018-08-01 12:48:00 -0700882 flags.bootClasspathArgs = deps.bootClasspath.FormJavaClassPath("-bootclasspath")
Nan Zhang357466b2018-04-17 17:38:36 -0700883 }
Nan Zhanga40da042018-08-01 12:48:00 -0700884 flags.classpathArgs = deps.classpath.FormJavaClassPath("-classpath")
Nan Zhang1598a9e2018-09-04 17:14:32 -0700885 // Dokka doesn't support bootClasspath, so combine these two classpath vars for Dokka.
Nan Zhang86d2d552018-08-09 15:33:27 -0700886 dokkaClasspath := classpath{}
887 dokkaClasspath = append(dokkaClasspath, deps.bootClasspath...)
888 dokkaClasspath = append(dokkaClasspath, deps.classpath...)
889 flags.dokkaClasspathArgs = dokkaClasspath.FormJavaClassPath("-classpath")
Nan Zhang79614d12018-04-19 18:03:39 -0700890
Nan Zhang9c69a122018-08-22 10:22:08 -0700891 // TODO(nanzhang): Remove this if- statement once we finish migration for all Doclava
892 // based stubs generation.
893 // In the future, all the docs generation depends on Metalava stubs (droidstubs) srcjar
894 // dir. We need add the srcjar dir to -sourcepath arg, so that Javadoc can figure out
895 // the correct package name base path.
896 if len(d.Javadoc.properties.Local_sourcepaths) > 0 {
897 flags.sourcepathArgs = "-sourcepath " + strings.Join(d.Javadoc.sourcepaths.Strings(), ":")
898 } else {
899 flags.sourcepathArgs = "-sourcepath " + android.PathForModuleOut(ctx, "srcjars").String()
900 }
Nan Zhang581fd212018-01-10 16:06:12 -0800901
Nan Zhanga40da042018-08-01 12:48:00 -0700902 return flags, nil
903}
Nan Zhang581fd212018-01-10 16:06:12 -0800904
Nan Zhanga40da042018-08-01 12:48:00 -0700905func (d *Droiddoc) collectDoclavaDocsFlags(ctx android.ModuleContext, implicits *android.Paths,
Nan Zhang443fa522018-08-20 20:58:28 -0700906 jsilver, doclava android.Path) string {
Nan Zhang581fd212018-01-10 16:06:12 -0800907
Nan Zhanga40da042018-08-01 12:48:00 -0700908 *implicits = append(*implicits, jsilver)
909 *implicits = append(*implicits, doclava)
Nan Zhang30963742018-04-23 09:59:14 -0700910
Nan Zhang46130972018-06-04 11:28:01 -0700911 var date string
912 if runtime.GOOS == "darwin" {
913 date = `date -r`
914 } else {
915 date = `date -d`
916 }
917
Nan Zhang443fa522018-08-20 20:58:28 -0700918 // Droiddoc always gets "-source 1.8" because it doesn't support 1.9 sources. For modules with 1.9
919 // sources, droiddoc will get sources produced by metalava which will have already stripped out the
920 // 1.9 language features.
921 args := " -source 1.8 -J-Xmx1600m -J-XX:-OmitStackTraceInFastThrow -XDignore.symbol.file " +
Nan Zhang30963742018-04-23 09:59:14 -0700922 "-doclet com.google.doclava.Doclava -docletpath " + jsilver.String() + ":" + doclava.String() + " " +
Nan Zhang581fd212018-01-10 16:06:12 -0800923 "-hdf page.build " + ctx.Config().BuildId() + "-" + ctx.Config().BuildNumberFromFile() + " " +
Nan Zhang79614d12018-04-19 18:03:39 -0700924 `-hdf page.now "$$(` + date + ` @$$(cat ` + ctx.Config().Getenv("BUILD_DATETIME_FILE") + `) "+%d %b %Y %k:%M")" `
Nan Zhang46130972018-06-04 11:28:01 -0700925
Nan Zhanga40da042018-08-01 12:48:00 -0700926 if String(d.properties.Custom_template) == "" {
927 // TODO: This is almost always droiddoc-templates-sdk
928 ctx.PropertyErrorf("custom_template", "must specify a template")
929 }
930
931 ctx.VisitDirectDepsWithTag(droiddocTemplateTag, func(m android.Module) {
Nan Zhangf4936b02018-08-01 15:00:28 -0700932 if t, ok := m.(*ExportedDroiddocDir); ok {
Nan Zhanga40da042018-08-01 12:48:00 -0700933 *implicits = append(*implicits, t.deps...)
934 args = args + " -templatedir " + t.dir.String()
935 } else {
936 ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_template", ctx.OtherModuleName(m))
937 }
938 })
939
940 if len(d.properties.Html_dirs) > 0 {
Colin Cross07e51612019-03-05 12:46:40 -0800941 htmlDir := d.properties.Html_dirs[0]
Colin Cross8a497952019-03-05 22:25:09 -0800942 *implicits = append(*implicits, android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[0], "**/*")})...)
Colin Cross07e51612019-03-05 12:46:40 -0800943 args = args + " -htmldir " + htmlDir
Nan Zhanga40da042018-08-01 12:48:00 -0700944 }
945
946 if len(d.properties.Html_dirs) > 1 {
Colin Cross07e51612019-03-05 12:46:40 -0800947 htmlDir2 := d.properties.Html_dirs[1]
Colin Cross8a497952019-03-05 22:25:09 -0800948 *implicits = append(*implicits, android.PathsForModuleSrc(ctx, []string{filepath.Join(htmlDir2, "**/*")})...)
Colin Cross07e51612019-03-05 12:46:40 -0800949 args = args + " -htmldir2 " + htmlDir2
Nan Zhanga40da042018-08-01 12:48:00 -0700950 }
951
952 if len(d.properties.Html_dirs) > 2 {
953 ctx.PropertyErrorf("html_dirs", "Droiddoc only supports up to 2 html dirs")
954 }
955
Colin Cross8a497952019-03-05 22:25:09 -0800956 knownTags := android.PathsForModuleSrc(ctx, d.properties.Knowntags)
Nan Zhanga40da042018-08-01 12:48:00 -0700957 *implicits = append(*implicits, knownTags...)
958
959 for _, kt := range knownTags {
960 args = args + " -knowntags " + kt.String()
961 }
962
963 for _, hdf := range d.properties.Hdf {
964 args = args + " -hdf " + hdf
965 }
966
967 if String(d.properties.Proofread_file) != "" {
968 proofreadFile := android.PathForModuleOut(ctx, String(d.properties.Proofread_file))
969 args = args + " -proofread " + proofreadFile.String()
970 }
971
972 if String(d.properties.Todo_file) != "" {
973 // tricky part:
974 // we should not compute full path for todo_file through PathForModuleOut().
975 // the non-standard doclet will get the full path relative to "-o".
976 args = args + " -todo " + String(d.properties.Todo_file)
977 }
978
979 if String(d.properties.Resourcesdir) != "" {
980 // TODO: should we add files under resourcesDir to the implicits? It seems that
981 // resourcesDir is one sub dir of htmlDir
982 resourcesDir := android.PathForModuleSrc(ctx, String(d.properties.Resourcesdir))
983 args = args + " -resourcesdir " + resourcesDir.String()
984 }
985
986 if String(d.properties.Resourcesoutdir) != "" {
987 // TODO: it seems -resourceoutdir reference/android/images/ didn't get generated anywhere.
988 args = args + " -resourcesoutdir " + String(d.properties.Resourcesoutdir)
989 }
990 return args
991}
992
Nan Zhang1598a9e2018-09-04 17:14:32 -0700993func (d *Droiddoc) collectStubsFlags(ctx android.ModuleContext,
994 implicitOutputs *android.WritablePaths) string {
995 var doclavaFlags string
996 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
997 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
998 String(d.properties.Api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -0700999 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
1000 doclavaFlags += " -api " + d.apiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001001 *implicitOutputs = append(*implicitOutputs, d.apiFile)
1002 d.apiFilePath = d.apiFile
1003 }
1004
Nan Zhang1598a9e2018-09-04 17:14:32 -07001005 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1006 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1007 String(d.properties.Removed_api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -07001008 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
1009 doclavaFlags += " -removedApi " + d.removedApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001010 *implicitOutputs = append(*implicitOutputs, d.removedApiFile)
1011 }
1012
1013 if String(d.properties.Private_api_filename) != "" {
1014 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
1015 doclavaFlags += " -privateApi " + d.privateApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001016 *implicitOutputs = append(*implicitOutputs, d.privateApiFile)
1017 }
1018
1019 if String(d.properties.Dex_api_filename) != "" {
1020 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
1021 doclavaFlags += " -dexApi " + d.dexApiFile.String()
1022 *implicitOutputs = append(*implicitOutputs, d.dexApiFile)
1023 }
1024
1025 if String(d.properties.Private_dex_api_filename) != "" {
1026 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
1027 doclavaFlags += " -privateDexApi " + d.privateDexApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001028 *implicitOutputs = append(*implicitOutputs, d.privateDexApiFile)
1029 }
1030
1031 if String(d.properties.Removed_dex_api_filename) != "" {
1032 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
1033 doclavaFlags += " -removedDexApi " + d.removedDexApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001034 *implicitOutputs = append(*implicitOutputs, d.removedDexApiFile)
1035 }
1036
1037 if String(d.properties.Exact_api_filename) != "" {
1038 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
1039 doclavaFlags += " -exactApi " + d.exactApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001040 *implicitOutputs = append(*implicitOutputs, d.exactApiFile)
1041 }
1042
1043 if String(d.properties.Dex_mapping_filename) != "" {
1044 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
1045 doclavaFlags += " -apiMapping " + d.apiMappingFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001046 *implicitOutputs = append(*implicitOutputs, d.apiMappingFile)
1047 }
1048
Nan Zhang66dc2362018-08-14 20:41:04 -07001049 if String(d.properties.Proguard_filename) != "" {
1050 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
1051 doclavaFlags += " -proguard " + d.proguardFile.String()
Nan Zhang66dc2362018-08-14 20:41:04 -07001052 *implicitOutputs = append(*implicitOutputs, d.proguardFile)
1053 }
1054
Nan Zhanga40da042018-08-01 12:48:00 -07001055 if BoolDefault(d.properties.Create_stubs, true) {
Nan Zhangde860a42018-08-08 16:32:21 -07001056 doclavaFlags += " -stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001057 }
1058
1059 if Bool(d.properties.Write_sdk_values) {
Nan Zhangde860a42018-08-08 16:32:21 -07001060 doclavaFlags += " -sdkvalues " + android.PathForModuleOut(ctx, "out").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001061 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001062
1063 return doclavaFlags
Nan Zhanga40da042018-08-01 12:48:00 -07001064}
1065
1066func (d *Droiddoc) getPostDoclavaCmds(ctx android.ModuleContext, implicits *android.Paths) string {
1067 var cmds string
1068 if String(d.properties.Static_doc_index_redirect) != "" {
1069 static_doc_index_redirect := ctx.ExpandSource(String(d.properties.Static_doc_index_redirect),
1070 "static_doc_index_redirect")
1071 *implicits = append(*implicits, static_doc_index_redirect)
1072 cmds = cmds + " && cp " + static_doc_index_redirect.String() + " " +
Nan Zhangde860a42018-08-08 16:32:21 -07001073 android.PathForModuleOut(ctx, "out", "index.html").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001074 }
1075
1076 if String(d.properties.Static_doc_properties) != "" {
1077 static_doc_properties := ctx.ExpandSource(String(d.properties.Static_doc_properties),
1078 "static_doc_properties")
1079 *implicits = append(*implicits, static_doc_properties)
1080 cmds = cmds + " && cp " + static_doc_properties.String() + " " +
Nan Zhangde860a42018-08-08 16:32:21 -07001081 android.PathForModuleOut(ctx, "out", "source.properties").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001082 }
1083 return cmds
1084}
1085
Nan Zhang1598a9e2018-09-04 17:14:32 -07001086func (d *Droiddoc) transformDoclava(ctx android.ModuleContext, implicits android.Paths,
1087 implicitOutputs android.WritablePaths,
1088 bootclasspathArgs, classpathArgs, sourcepathArgs, opts, postDoclavaCmds string) {
1089 ctx.Build(pctx, android.BuildParams{
1090 Rule: javadoc,
1091 Description: "Doclava",
1092 Output: d.Javadoc.stubsSrcJar,
1093 Inputs: d.Javadoc.srcFiles,
1094 Implicits: implicits,
1095 ImplicitOutputs: implicitOutputs,
1096 Args: map[string]string{
1097 "outDir": android.PathForModuleOut(ctx, "out").String(),
1098 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
1099 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
1100 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1101 "opts": opts,
1102 "bootclasspathArgs": bootclasspathArgs,
1103 "classpathArgs": classpathArgs,
1104 "sourcepathArgs": sourcepathArgs,
1105 "docZip": d.Javadoc.docZip.String(),
1106 "postDoclavaCmds": postDoclavaCmds,
1107 },
1108 })
1109}
1110
1111func (d *Droiddoc) transformCheckApi(ctx android.ModuleContext, apiFile, removedApiFile android.Path,
1112 checkApiClasspath classpath, msg, opts string, output android.WritablePath) {
1113 ctx.Build(pctx, android.BuildParams{
1114 Rule: apiCheck,
1115 Description: "Doclava Check API",
1116 Output: output,
1117 Inputs: nil,
1118 Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile},
1119 checkApiClasspath...),
1120 Args: map[string]string{
1121 "msg": msg,
1122 "classpath": checkApiClasspath.FormJavaClassPath(""),
1123 "opts": opts,
1124 "apiFile": apiFile.String(),
1125 "apiFileToCheck": d.apiFile.String(),
1126 "removedApiFile": removedApiFile.String(),
1127 "removedApiFileToCheck": d.removedApiFile.String(),
1128 },
1129 })
1130}
1131
1132func (d *Droiddoc) transformDokka(ctx android.ModuleContext, implicits android.Paths,
1133 classpathArgs, opts string) {
1134 ctx.Build(pctx, android.BuildParams{
1135 Rule: dokka,
1136 Description: "Dokka",
1137 Output: d.Javadoc.stubsSrcJar,
1138 Inputs: d.Javadoc.srcFiles,
1139 Implicits: implicits,
1140 Args: map[string]string{
Nan Zhang3ffc3522018-11-29 10:42:47 -08001141 "outDir": android.PathForModuleOut(ctx, "dokka-out").String(),
1142 "srcJarDir": android.PathForModuleOut(ctx, "dokka-srcjars").String(),
1143 "stubsDir": android.PathForModuleOut(ctx, "dokka-stubsDir").String(),
Nan Zhang1598a9e2018-09-04 17:14:32 -07001144 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1145 "classpathArgs": classpathArgs,
1146 "opts": opts,
1147 "docZip": d.Javadoc.docZip.String(),
1148 },
1149 })
1150}
1151
1152func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1153 deps := d.Javadoc.collectDeps(ctx)
1154
1155 jsilver := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jsilver.jar")
1156 doclava := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "doclava.jar")
1157 java8Home := ctx.Config().Getenv("ANDROID_JAVA8_HOME")
1158 checkApiClasspath := classpath{jsilver, doclava, android.PathForSource(ctx, java8Home, "lib/tools.jar")}
1159
1160 var implicits android.Paths
1161 implicits = append(implicits, d.Javadoc.srcJars...)
1162 implicits = append(implicits, d.Javadoc.argFiles...)
1163
1164 var implicitOutputs android.WritablePaths
1165 implicitOutputs = append(implicitOutputs, d.Javadoc.docZip)
1166 for _, o := range d.Javadoc.properties.Out {
1167 implicitOutputs = append(implicitOutputs, android.PathForModuleGen(ctx, o))
1168 }
1169
1170 flags, err := d.initBuilderFlags(ctx, &implicits, deps)
1171 if err != nil {
1172 return
1173 }
1174
1175 flags.doclavaStubsFlags = d.collectStubsFlags(ctx, &implicitOutputs)
1176 if Bool(d.properties.Dokka_enabled) {
1177 d.transformDokka(ctx, implicits, flags.classpathArgs, d.Javadoc.args)
1178 } else {
1179 flags.doclavaDocsFlags = d.collectDoclavaDocsFlags(ctx, &implicits, jsilver, doclava)
1180 flags.postDoclavaCmds = d.getPostDoclavaCmds(ctx, &implicits)
1181 d.transformDoclava(ctx, implicits, implicitOutputs, flags.bootClasspathArgs, flags.classpathArgs,
1182 flags.sourcepathArgs, flags.doclavaDocsFlags+flags.doclavaStubsFlags+" "+d.Javadoc.args,
1183 flags.postDoclavaCmds)
1184 }
1185
1186 if apiCheckEnabled(d.properties.Check_api.Current, "current") &&
1187 !ctx.Config().IsPdkBuild() {
1188 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Api_file),
1189 "check_api.current.api_file")
1190 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file),
1191 "check_api.current_removed_api_file")
1192
1193 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
1194 d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
1195 fmt.Sprintf(`\n******************************\n`+
1196 `You have tried to change the API from what has been previously approved.\n\n`+
1197 `To make these errors go away, you have two choices:\n`+
1198 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1199 ` errors above.\n\n`+
1200 ` 2. You can update current.txt by executing the following command:\n`+
1201 ` make %s-update-current-api\n\n`+
1202 ` To submit the revised current.txt to the main Android repository,\n`+
1203 ` you will need approval.\n`+
1204 `******************************\n`, ctx.ModuleName()), String(d.properties.Check_api.Current.Args),
1205 d.checkCurrentApiTimestamp)
1206
1207 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
1208 transformUpdateApi(ctx, apiFile, removedApiFile, d.apiFile, d.removedApiFile,
1209 d.updateCurrentApiTimestamp)
1210 }
1211
1212 if apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") &&
1213 !ctx.Config().IsPdkBuild() {
1214 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1215 "check_api.last_released.api_file")
1216 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file),
1217 "check_api.last_released.removed_api_file")
1218
1219 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
1220 d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
1221 `\n******************************\n`+
1222 `You have tried to change the API from what has been previously released in\n`+
1223 `an SDK. Please fix the errors listed above.\n`+
1224 `******************************\n`, String(d.properties.Check_api.Last_released.Args),
1225 d.checkLastReleasedApiTimestamp)
1226 }
1227}
1228
1229//
1230// Droidstubs
1231//
1232type Droidstubs struct {
1233 Javadoc
1234
Pete Gillin581d6082018-10-22 15:55:04 +01001235 properties DroidstubsProperties
1236 apiFile android.WritablePath
1237 apiXmlFile android.WritablePath
1238 lastReleasedApiXmlFile android.WritablePath
1239 dexApiFile android.WritablePath
1240 privateApiFile android.WritablePath
1241 privateDexApiFile android.WritablePath
1242 removedApiFile android.WritablePath
1243 removedDexApiFile android.WritablePath
1244 apiMappingFile android.WritablePath
1245 exactApiFile android.WritablePath
1246 proguardFile android.WritablePath
1247 nullabilityWarningsFile android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001248
1249 checkCurrentApiTimestamp android.WritablePath
1250 updateCurrentApiTimestamp android.WritablePath
1251 checkLastReleasedApiTimestamp android.WritablePath
1252
Pete Gillin581d6082018-10-22 15:55:04 +01001253 checkNullabilityWarningsTimestamp android.WritablePath
1254
Nan Zhang1598a9e2018-09-04 17:14:32 -07001255 annotationsZip android.WritablePath
Nan Zhang9c69a122018-08-22 10:22:08 -07001256 apiVersionsXml android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001257
1258 apiFilePath android.Path
Nan Zhang71bbe632018-09-17 14:32:21 -07001259
1260 jdiffDocZip android.WritablePath
1261 jdiffStubsSrcJar android.WritablePath
Jerome Gaillard0b09ad72019-10-10 19:29:11 +01001262
1263 metadataZip android.WritablePath
1264 metadataDir android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001265}
1266
1267func DroidstubsFactory() android.Module {
1268 module := &Droidstubs{}
1269
1270 module.AddProperties(&module.properties,
1271 &module.Javadoc.properties)
1272
1273 InitDroiddocModule(module, android.HostAndDeviceSupported)
1274 return module
1275}
1276
1277func DroidstubsHostFactory() android.Module {
1278 module := &Droidstubs{}
1279
1280 module.AddProperties(&module.properties,
1281 &module.Javadoc.properties)
1282
1283 InitDroiddocModule(module, android.HostSupported)
1284 return module
1285}
1286
1287func (d *Droidstubs) ApiFilePath() android.Path {
1288 return d.apiFilePath
1289}
1290
1291func (d *Droidstubs) DepsMutator(ctx android.BottomUpMutatorContext) {
1292 d.Javadoc.addDeps(ctx)
1293
Inseob Kim38449af2019-02-28 14:24:05 +09001294 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
1295 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
1296 }
1297
Nan Zhang1598a9e2018-09-04 17:14:32 -07001298 if len(d.properties.Merge_annotations_dirs) != 0 {
1299 for _, mergeAnnotationsDir := range d.properties.Merge_annotations_dirs {
1300 ctx.AddDependency(ctx.Module(), metalavaMergeAnnotationsDirTag, mergeAnnotationsDir)
1301 }
1302 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001303
Pete Gillin77167902018-09-19 18:16:26 +01001304 if len(d.properties.Merge_inclusion_annotations_dirs) != 0 {
1305 for _, mergeInclusionAnnotationsDir := range d.properties.Merge_inclusion_annotations_dirs {
1306 ctx.AddDependency(ctx.Module(), metalavaMergeInclusionAnnotationsDirTag, mergeInclusionAnnotationsDir)
1307 }
1308 }
1309
Nan Zhang9c69a122018-08-22 10:22:08 -07001310 if len(d.properties.Api_levels_annotations_dirs) != 0 {
1311 for _, apiLevelsAnnotationsDir := range d.properties.Api_levels_annotations_dirs {
1312 ctx.AddDependency(ctx.Module(), metalavaAPILevelsAnnotationsDirTag, apiLevelsAnnotationsDir)
1313 }
1314 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001315}
1316
1317func (d *Droidstubs) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths,
1318 deps deps) (droiddocBuilderFlags, error) {
1319 var flags droiddocBuilderFlags
1320
1321 *implicits = append(*implicits, deps.bootClasspath...)
1322 *implicits = append(*implicits, deps.classpath...)
1323
1324 // continue to use -bootclasspath even if Metalava under -source 1.9 is enabled
1325 // since it doesn't support system modules yet.
1326 if len(deps.bootClasspath.Strings()) > 0 {
1327 // For OpenJDK 8 we can use -bootclasspath to define the core libraries code.
1328 flags.bootClasspathArgs = deps.bootClasspath.FormJavaClassPath("-bootclasspath")
1329 }
1330 flags.classpathArgs = deps.classpath.FormJavaClassPath("-classpath")
1331
Sundong Ahn56dce442018-10-05 18:41:09 +09001332 flags.sourcepathArgs = "-sourcepath \"" + strings.Join(d.Javadoc.sourcepaths.Strings(), ":") + "\""
Nan Zhang1598a9e2018-09-04 17:14:32 -07001333 return flags, nil
1334}
1335
1336func (d *Droidstubs) collectStubsFlags(ctx android.ModuleContext,
1337 implicitOutputs *android.WritablePaths) string {
1338 var metalavaFlags string
1339 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1340 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1341 String(d.properties.Api_filename) != "" {
1342 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
1343 metalavaFlags = metalavaFlags + " --api " + d.apiFile.String()
1344 *implicitOutputs = append(*implicitOutputs, d.apiFile)
1345 d.apiFilePath = d.apiFile
1346 }
1347
1348 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1349 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1350 String(d.properties.Removed_api_filename) != "" {
1351 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
1352 metalavaFlags = metalavaFlags + " --removed-api " + d.removedApiFile.String()
1353 *implicitOutputs = append(*implicitOutputs, d.removedApiFile)
1354 }
1355
1356 if String(d.properties.Private_api_filename) != "" {
1357 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
1358 metalavaFlags = metalavaFlags + " --private-api " + d.privateApiFile.String()
1359 *implicitOutputs = append(*implicitOutputs, d.privateApiFile)
1360 }
1361
1362 if String(d.properties.Dex_api_filename) != "" {
1363 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
1364 metalavaFlags += " --dex-api " + d.dexApiFile.String()
1365 *implicitOutputs = append(*implicitOutputs, d.dexApiFile)
1366 }
1367
1368 if String(d.properties.Private_dex_api_filename) != "" {
1369 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
1370 metalavaFlags = metalavaFlags + " --private-dex-api " + d.privateDexApiFile.String()
1371 *implicitOutputs = append(*implicitOutputs, d.privateDexApiFile)
1372 }
1373
1374 if String(d.properties.Removed_dex_api_filename) != "" {
1375 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
1376 metalavaFlags = metalavaFlags + " --removed-dex-api " + d.removedDexApiFile.String()
1377 *implicitOutputs = append(*implicitOutputs, d.removedDexApiFile)
1378 }
1379
1380 if String(d.properties.Exact_api_filename) != "" {
1381 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
1382 metalavaFlags = metalavaFlags + " --exact-api " + d.exactApiFile.String()
1383 *implicitOutputs = append(*implicitOutputs, d.exactApiFile)
1384 }
1385
Nan Zhang9c69a122018-08-22 10:22:08 -07001386 if String(d.properties.Dex_mapping_filename) != "" {
1387 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
1388 metalavaFlags = metalavaFlags + " --dex-api-mapping " + d.apiMappingFile.String()
1389 *implicitOutputs = append(*implicitOutputs, d.apiMappingFile)
1390 }
1391
Nan Zhang199645c2018-09-19 12:40:06 -07001392 if String(d.properties.Proguard_filename) != "" {
1393 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
1394 metalavaFlags += " --proguard " + d.proguardFile.String()
1395 *implicitOutputs = append(*implicitOutputs, d.proguardFile)
1396 }
1397
Nan Zhang9c69a122018-08-22 10:22:08 -07001398 if Bool(d.properties.Write_sdk_values) {
Jerome Gaillard0b09ad72019-10-10 19:29:11 +01001399 d.metadataDir = android.PathForModuleOut(ctx, "metadata")
1400 metalavaFlags = metalavaFlags + " --sdk-values " + d.metadataDir.String()
Nan Zhang9c69a122018-08-22 10:22:08 -07001401 }
1402
Nan Zhang1598a9e2018-09-04 17:14:32 -07001403 if Bool(d.properties.Create_doc_stubs) {
1404 metalavaFlags += " --doc-stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
1405 } else {
1406 metalavaFlags += " --stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
1407 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001408 return metalavaFlags
1409}
1410
1411func (d *Droidstubs) collectAnnotationsFlags(ctx android.ModuleContext,
Nan Zhangdee152b2018-12-26 16:06:37 -08001412 implicits *android.Paths, implicitOutputs *android.WritablePaths) (string, string) {
1413 var flags, mergeAnnoDirFlags string
Nan Zhang1598a9e2018-09-04 17:14:32 -07001414 if Bool(d.properties.Annotations_enabled) {
Pete Gillina262c052018-09-14 14:25:48 +01001415 flags += " --include-annotations"
Pete Gillinc382a562018-11-14 18:45:46 +00001416 validatingNullability :=
1417 strings.Contains(d.Javadoc.args, "--validate-nullability-from-merged-stubs") ||
1418 String(d.properties.Validate_nullability_from_list) != ""
Pete Gillina262c052018-09-14 14:25:48 +01001419 migratingNullability := String(d.properties.Previous_api) != ""
1420 if !(migratingNullability || validatingNullability) {
1421 ctx.PropertyErrorf("previous_api",
1422 "has to be non-empty if annotations was enabled (unless validating nullability)")
Nan Zhanga40da042018-08-01 12:48:00 -07001423 }
Pete Gillina262c052018-09-14 14:25:48 +01001424 if migratingNullability {
Colin Cross8a497952019-03-05 22:25:09 -08001425 previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api))
Pete Gillina262c052018-09-14 14:25:48 +01001426 *implicits = append(*implicits, previousApi)
1427 flags += " --migrate-nullness " + previousApi.String()
1428 }
Pete Gillinc382a562018-11-14 18:45:46 +00001429 if s := String(d.properties.Validate_nullability_from_list); s != "" {
Colin Cross8a497952019-03-05 22:25:09 -08001430 flags += " --validate-nullability-from-list " + android.PathForModuleSrc(ctx, s).String()
Pete Gillinc382a562018-11-14 18:45:46 +00001431 }
Pete Gillina262c052018-09-14 14:25:48 +01001432 if validatingNullability {
Pete Gillin581d6082018-10-22 15:55:04 +01001433 d.nullabilityWarningsFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_nullability_warnings.txt")
1434 *implicitOutputs = append(*implicitOutputs, d.nullabilityWarningsFile)
1435 flags += " --nullability-warnings-txt " + d.nullabilityWarningsFile.String()
Pete Gillina262c052018-09-14 14:25:48 +01001436 }
Nan Zhanga40da042018-08-01 12:48:00 -07001437
1438 d.annotationsZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"_annotations.zip")
1439 *implicitOutputs = append(*implicitOutputs, d.annotationsZip)
1440
Nan Zhangf4936b02018-08-01 15:00:28 -07001441 flags += " --extract-annotations " + d.annotationsZip.String()
1442
Nan Zhang1598a9e2018-09-04 17:14:32 -07001443 if len(d.properties.Merge_annotations_dirs) == 0 {
Nan Zhang9c69a122018-08-22 10:22:08 -07001444 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhanga40da042018-08-01 12:48:00 -07001445 "has to be non-empty if annotations was enabled!")
1446 }
Nan Zhangf4936b02018-08-01 15:00:28 -07001447 ctx.VisitDirectDepsWithTag(metalavaMergeAnnotationsDirTag, func(m android.Module) {
1448 if t, ok := m.(*ExportedDroiddocDir); ok {
1449 *implicits = append(*implicits, t.deps...)
Nan Zhangdee152b2018-12-26 16:06:37 -08001450 mergeAnnoDirFlags += " --merge-qualifier-annotations " + t.dir.String()
Nan Zhangf4936b02018-08-01 15:00:28 -07001451 } else {
Nan Zhang9c69a122018-08-22 10:22:08 -07001452 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhangf4936b02018-08-01 15:00:28 -07001453 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1454 }
1455 })
Nan Zhangdee152b2018-12-26 16:06:37 -08001456 flags += mergeAnnoDirFlags
Nan Zhanga40da042018-08-01 12:48:00 -07001457 // TODO(tnorbye): find owners to fix these warnings when annotation was enabled.
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001458 flags += " --hide HiddenTypedefConstant --hide SuperfluousPrefix --hide AnnotationExtraction"
Nan Zhanga40da042018-08-01 12:48:00 -07001459 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001460
Nan Zhangdee152b2018-12-26 16:06:37 -08001461 return flags, mergeAnnoDirFlags
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001462}
1463
1464func (d *Droidstubs) collectInclusionAnnotationsFlags(ctx android.ModuleContext,
1465 implicits *android.Paths, implicitOutputs *android.WritablePaths) string {
1466 var flags string
Pete Gillin77167902018-09-19 18:16:26 +01001467 ctx.VisitDirectDepsWithTag(metalavaMergeInclusionAnnotationsDirTag, func(m android.Module) {
1468 if t, ok := m.(*ExportedDroiddocDir); ok {
1469 *implicits = append(*implicits, t.deps...)
1470 flags += " --merge-inclusion-annotations " + t.dir.String()
1471 } else {
1472 ctx.PropertyErrorf("merge_inclusion_annotations_dirs",
1473 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1474 }
1475 })
Nan Zhanga40da042018-08-01 12:48:00 -07001476
1477 return flags
1478}
1479
Nan Zhang9c69a122018-08-22 10:22:08 -07001480func (d *Droidstubs) collectAPILevelsAnnotationsFlags(ctx android.ModuleContext,
1481 implicits *android.Paths, implicitOutputs *android.WritablePaths) string {
1482 var flags string
1483 if Bool(d.properties.Api_levels_annotations_enabled) {
1484 d.apiVersionsXml = android.PathForModuleOut(ctx, "api-versions.xml")
1485 *implicitOutputs = append(*implicitOutputs, d.apiVersionsXml)
1486
1487 if len(d.properties.Api_levels_annotations_dirs) == 0 {
1488 ctx.PropertyErrorf("api_levels_annotations_dirs",
1489 "has to be non-empty if api levels annotations was enabled!")
1490 }
1491
1492 flags = " --generate-api-levels " + d.apiVersionsXml.String() + " --apply-api-levels " +
1493 d.apiVersionsXml.String() + " --current-version " + ctx.Config().PlatformSdkVersion() +
1494 " --current-codename " + ctx.Config().PlatformSdkCodename() + " "
1495
1496 ctx.VisitDirectDepsWithTag(metalavaAPILevelsAnnotationsDirTag, func(m android.Module) {
1497 if t, ok := m.(*ExportedDroiddocDir); ok {
1498 var androidJars android.Paths
1499 for _, dep := range t.deps {
1500 if strings.HasSuffix(dep.String(), "android.jar") {
1501 androidJars = append(androidJars, dep)
1502 }
1503 }
1504 *implicits = append(*implicits, androidJars...)
Tor Norbyeebcdfed2019-01-24 11:05:46 -08001505 flags += " --android-jar-pattern " + t.dir.String() + "/%/public/android.jar "
Nan Zhang9c69a122018-08-22 10:22:08 -07001506 } else {
1507 ctx.PropertyErrorf("api_levels_annotations_dirs",
1508 "module %q is not a metalava api-levels-annotations dir", ctx.OtherModuleName(m))
1509 }
1510 })
1511
1512 }
1513
1514 return flags
1515}
1516
Nan Zhang71bbe632018-09-17 14:32:21 -07001517func (d *Droidstubs) collectApiToXmlFlags(ctx android.ModuleContext, implicits *android.Paths,
1518 implicitOutputs *android.WritablePaths) string {
1519 var flags string
1520 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1521 if d.apiFile.String() == "" {
1522 ctx.ModuleErrorf("API signature file has to be specified in Metalava when jdiff is enabled.")
1523 }
1524
1525 d.apiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.xml")
1526 *implicitOutputs = append(*implicitOutputs, d.apiXmlFile)
1527
1528 flags = " --api-xml " + d.apiXmlFile.String()
1529
1530 if String(d.properties.Check_api.Last_released.Api_file) == "" {
1531 ctx.PropertyErrorf("check_api.last_released.api_file",
1532 "has to be non-empty if jdiff was enabled!")
1533 }
1534 lastReleasedApi := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1535 "check_api.last_released.api_file")
1536 *implicits = append(*implicits, lastReleasedApi)
1537
1538 d.lastReleasedApiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_last_released_api.xml")
1539 *implicitOutputs = append(*implicitOutputs, d.lastReleasedApiXmlFile)
1540
1541 flags += " --convert-to-jdiff " + lastReleasedApi.String() + " " +
1542 d.lastReleasedApiXmlFile.String()
1543 }
1544
1545 return flags
1546}
1547
Nan Zhang1598a9e2018-09-04 17:14:32 -07001548func (d *Droidstubs) transformMetalava(ctx android.ModuleContext, implicits android.Paths,
1549 implicitOutputs android.WritablePaths, javaVersion,
1550 bootclasspathArgs, classpathArgs, sourcepathArgs, opts string) {
Nan Zhang9c69a122018-08-22 10:22:08 -07001551
Jerome Gaillard0b09ad72019-10-10 19:29:11 +01001552 var writeSdkValues, metadataZip, metadataDir string
1553 if Bool(d.properties.Write_sdk_values) {
1554 writeSdkValues = "true"
1555 d.metadataZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-metadata.zip")
1556 metadataZip = d.metadataZip.String()
1557 metadataDir = d.metadataDir.String()
1558 implicitOutputs = append(implicitOutputs, d.metadataZip)
1559 } else {
1560 writeSdkValues = "false"
1561 metadataZip = ""
1562 metadataDir = ""
1563 }
1564
Nan Zhang86d2d552018-08-09 15:33:27 -07001565 ctx.Build(pctx, android.BuildParams{
1566 Rule: metalava,
1567 Description: "Metalava",
1568 Output: d.Javadoc.stubsSrcJar,
1569 Inputs: d.Javadoc.srcFiles,
1570 Implicits: implicits,
1571 ImplicitOutputs: implicitOutputs,
1572 Args: map[string]string{
Nan Zhang86d2d552018-08-09 15:33:27 -07001573 "outDir": android.PathForModuleOut(ctx, "out").String(),
1574 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
1575 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
1576 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
Nan Zhang1598a9e2018-09-04 17:14:32 -07001577 "javaVersion": javaVersion,
Nan Zhang86d2d552018-08-09 15:33:27 -07001578 "bootclasspathArgs": bootclasspathArgs,
1579 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -07001580 "sourcepathArgs": sourcepathArgs,
1581 "opts": opts,
Jerome Gaillard0b09ad72019-10-10 19:29:11 +01001582 "writeSdkValues": writeSdkValues,
1583 "metadataZip": metadataZip,
1584 "metadataDir": metadataDir,
Nan Zhang86d2d552018-08-09 15:33:27 -07001585 },
1586 })
1587}
1588
Nan Zhang1598a9e2018-09-04 17:14:32 -07001589func (d *Droidstubs) transformCheckApi(ctx android.ModuleContext,
Adrian Roos4937c4a2019-08-12 17:54:09 +02001590 apiFile, removedApiFile android.Path, baselineFile android.OptionalPath, updatedBaselineOut android.WritablePath, implicits android.Paths,
Colin Cross39c16792019-01-24 16:32:44 -08001591 javaVersion, bootclasspathArgs, classpathArgs, sourcepathArgs, opts, subdir, msg string,
Nan Zhang2760dfc2018-08-24 17:32:54 +00001592 output android.WritablePath) {
Adrian Roos4937c4a2019-08-12 17:54:09 +02001593
1594 implicits = append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile}, implicits...)
1595 var implicitOutputs android.WritablePaths
1596
1597 if baselineFile.Valid() {
1598 implicits = append(implicits, baselineFile.Path())
1599 implicitOutputs = append(implicitOutputs, updatedBaselineOut)
1600 }
1601
Nan Zhang2760dfc2018-08-24 17:32:54 +00001602 ctx.Build(pctx, android.BuildParams{
Adrian Roos4937c4a2019-08-12 17:54:09 +02001603 Rule: metalavaApiCheck,
1604 Description: "Metalava Check API",
1605 Output: output,
1606 Inputs: d.Javadoc.srcFiles,
1607 Implicits: implicits,
1608 ImplicitOutputs: implicitOutputs,
Nan Zhang2760dfc2018-08-24 17:32:54 +00001609 Args: map[string]string{
Colin Cross39c16792019-01-24 16:32:44 -08001610 "srcJarDir": android.PathForModuleOut(ctx, subdir, "srcjars").String(),
Nan Zhang2760dfc2018-08-24 17:32:54 +00001611 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1612 "javaVersion": javaVersion,
1613 "bootclasspathArgs": bootclasspathArgs,
1614 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -07001615 "sourcepathArgs": sourcepathArgs,
Nan Zhang2760dfc2018-08-24 17:32:54 +00001616 "opts": opts,
1617 "msg": msg,
1618 },
1619 })
1620}
1621
Nan Zhang71bbe632018-09-17 14:32:21 -07001622func (d *Droidstubs) transformJdiff(ctx android.ModuleContext, implicits android.Paths,
1623 implicitOutputs android.WritablePaths,
1624 bootclasspathArgs, classpathArgs, sourcepathArgs, opts string) {
1625 ctx.Build(pctx, android.BuildParams{
1626 Rule: javadoc,
1627 Description: "Jdiff",
1628 Output: d.jdiffStubsSrcJar,
1629 Inputs: d.Javadoc.srcFiles,
1630 Implicits: implicits,
1631 ImplicitOutputs: implicitOutputs,
1632 Args: map[string]string{
Nan Zhang23a1ba62018-09-19 11:19:39 -07001633 "outDir": android.PathForModuleOut(ctx, "jdiff-out").String(),
1634 "srcJarDir": android.PathForModuleOut(ctx, "jdiff-srcjars").String(),
1635 "stubsDir": android.PathForModuleOut(ctx, "jdiff-stubsDir").String(),
Nan Zhang71bbe632018-09-17 14:32:21 -07001636 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1637 "opts": opts,
1638 "bootclasspathArgs": bootclasspathArgs,
1639 "classpathArgs": classpathArgs,
1640 "sourcepathArgs": sourcepathArgs,
1641 "docZip": d.jdiffDocZip.String(),
1642 },
1643 })
1644}
1645
Nan Zhang1598a9e2018-09-04 17:14:32 -07001646func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Nan Zhanga40da042018-08-01 12:48:00 -07001647 deps := d.Javadoc.collectDeps(ctx)
1648
1649 javaVersion := getJavaVersion(ctx, String(d.Javadoc.properties.Java_version), sdkContext(d))
Nan Zhang581fd212018-01-10 16:06:12 -08001650
Nan Zhanga40da042018-08-01 12:48:00 -07001651 var implicits android.Paths
1652 implicits = append(implicits, d.Javadoc.srcJars...)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001653 implicits = append(implicits, d.Javadoc.argFiles...)
Nan Zhanga40da042018-08-01 12:48:00 -07001654
1655 var implicitOutputs android.WritablePaths
Nan Zhang1598a9e2018-09-04 17:14:32 -07001656 for _, o := range d.Javadoc.properties.Out {
Nan Zhanga40da042018-08-01 12:48:00 -07001657 implicitOutputs = append(implicitOutputs, android.PathForModuleGen(ctx, o))
1658 }
1659
1660 flags, err := d.initBuilderFlags(ctx, &implicits, deps)
Nan Zhang2760dfc2018-08-24 17:32:54 +00001661 metalavaCheckApiImplicits := implicits
Nan Zhang71bbe632018-09-17 14:32:21 -07001662 jdiffImplicits := implicits
1663
Nan Zhanga40da042018-08-01 12:48:00 -07001664 if err != nil {
1665 return
1666 }
1667
Nan Zhang1598a9e2018-09-04 17:14:32 -07001668 flags.metalavaStubsFlags = d.collectStubsFlags(ctx, &implicitOutputs)
Nan Zhangdee152b2018-12-26 16:06:37 -08001669 flags.metalavaAnnotationsFlags, flags.metalavaMergeAnnoDirFlags =
1670 d.collectAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001671 flags.metalavaInclusionAnnotationsFlags = d.collectInclusionAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Nan Zhang9c69a122018-08-22 10:22:08 -07001672 flags.metalavaApiLevelsAnnotationsFlags = d.collectAPILevelsAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Nan Zhang71bbe632018-09-17 14:32:21 -07001673 flags.metalavaApiToXmlFlags = d.collectApiToXmlFlags(ctx, &implicits, &implicitOutputs)
1674
Nan Zhang1598a9e2018-09-04 17:14:32 -07001675 if strings.Contains(d.Javadoc.args, "--generate-documentation") {
1676 // Currently Metalava have the ability to invoke Javadoc in a seperate process.
1677 // Pass "-nodocs" to suppress the Javadoc invocation when Metalava receives
1678 // "--generate-documentation" arg. This is not needed when Metalava removes this feature.
1679 d.Javadoc.args = d.Javadoc.args + " -nodocs "
Nan Zhang79614d12018-04-19 18:03:39 -07001680 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001681 d.transformMetalava(ctx, implicits, implicitOutputs, javaVersion,
1682 flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs,
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001683 flags.metalavaStubsFlags+flags.metalavaAnnotationsFlags+flags.metalavaInclusionAnnotationsFlags+
Nan Zhang71bbe632018-09-17 14:32:21 -07001684 flags.metalavaApiLevelsAnnotationsFlags+flags.metalavaApiToXmlFlags+" "+d.Javadoc.args)
Nan Zhang61819ce2018-05-04 18:49:16 -07001685
Nan Zhang1598a9e2018-09-04 17:14:32 -07001686 if apiCheckEnabled(d.properties.Check_api.Current, "current") &&
1687 !ctx.Config().IsPdkBuild() {
Nan Zhang61819ce2018-05-04 18:49:16 -07001688 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Api_file),
1689 "check_api.current.api_file")
1690 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file),
1691 "check_api.current_removed_api_file")
Adrian Roos4937c4a2019-08-12 17:54:09 +02001692 baselineFile := ctx.ExpandOptionalSource(d.properties.Check_api.Current.Baseline_file,
1693 "check_api.current.baseline_file")
Nan Zhang61819ce2018-05-04 18:49:16 -07001694
Nan Zhang2760dfc2018-08-24 17:32:54 +00001695 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001696 opts := " " + d.Javadoc.args + " --check-compatibility:api:current " + apiFile.String() +
1697 " --check-compatibility:removed:current " + removedApiFile.String() +
Nan Zhangdee152b2018-12-26 16:06:37 -08001698 flags.metalavaInclusionAnnotationsFlags + flags.metalavaMergeAnnoDirFlags + " "
Adrian Roos4937c4a2019-08-12 17:54:09 +02001699 baselineOut := android.PathForModuleOut(ctx, "current_baseline.txt")
1700 if baselineFile.Valid() {
1701 opts = opts + "--baseline " + baselineFile.String() + " --update-baseline " + baselineOut.String() + " "
1702 }
Nan Zhang2760dfc2018-08-24 17:32:54 +00001703
Adrian Roos4937c4a2019-08-12 17:54:09 +02001704 d.transformCheckApi(ctx, apiFile, removedApiFile, baselineFile, baselineOut, metalavaCheckApiImplicits,
Colin Cross39c16792019-01-24 16:32:44 -08001705 javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "current-apicheck",
Nan Zhang1598a9e2018-09-04 17:14:32 -07001706 fmt.Sprintf(`\n******************************\n`+
1707 `You have tried to change the API from what has been previously approved.\n\n`+
1708 `To make these errors go away, you have two choices:\n`+
1709 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1710 ` errors above.\n\n`+
1711 ` 2. You can update current.txt by executing the following command:\n`+
1712 ` make %s-update-current-api\n\n`+
1713 ` To submit the revised current.txt to the main Android repository,\n`+
1714 ` you will need approval.\n`+
1715 `******************************\n`, ctx.ModuleName()),
1716 d.checkCurrentApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001717
1718 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001719 transformUpdateApi(ctx, apiFile, removedApiFile, d.apiFile, d.removedApiFile,
1720 d.updateCurrentApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001721 }
Nan Zhanga40da042018-08-01 12:48:00 -07001722
Nan Zhang1598a9e2018-09-04 17:14:32 -07001723 if apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") &&
1724 !ctx.Config().IsPdkBuild() {
Nan Zhang61819ce2018-05-04 18:49:16 -07001725 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1726 "check_api.last_released.api_file")
1727 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file),
1728 "check_api.last_released.removed_api_file")
Adrian Roos4937c4a2019-08-12 17:54:09 +02001729 baselineFile := ctx.ExpandOptionalSource(d.properties.Check_api.Last_released.Baseline_file,
1730 "check_api.last_released.baseline_file")
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")
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001733 opts := " " + d.Javadoc.args + " --check-compatibility:api:released " + apiFile.String() +
1734 flags.metalavaInclusionAnnotationsFlags + " --check-compatibility:removed:released " +
Nan Zhangdee152b2018-12-26 16:06:37 -08001735 removedApiFile.String() + flags.metalavaMergeAnnoDirFlags + " "
Adrian Roos4937c4a2019-08-12 17:54:09 +02001736 baselineOut := android.PathForModuleOut(ctx, "last_released_baseline.txt")
1737 if baselineFile.Valid() {
1738 opts = opts + "--baseline " + baselineFile.String() + " --update-baseline " + baselineOut.String() + " "
1739 }
Nan Zhang2760dfc2018-08-24 17:32:54 +00001740
Adrian Roos4937c4a2019-08-12 17:54:09 +02001741 d.transformCheckApi(ctx, apiFile, removedApiFile, baselineFile, baselineOut, metalavaCheckApiImplicits,
Colin Cross39c16792019-01-24 16:32:44 -08001742 javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "last-apicheck",
Nan Zhang1598a9e2018-09-04 17:14:32 -07001743 `\n******************************\n`+
1744 `You have tried to change the API from what has been previously released in\n`+
1745 `an SDK. Please fix the errors listed above.\n`+
1746 `******************************\n`,
1747 d.checkLastReleasedApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001748 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001749
Pete Gillin581d6082018-10-22 15:55:04 +01001750 if String(d.properties.Check_nullability_warnings) != "" {
1751 if d.nullabilityWarningsFile == nil {
1752 ctx.PropertyErrorf("check_nullability_warnings",
1753 "Cannot specify check_nullability_warnings unless validating nullability")
1754 }
1755 checkNullabilityWarnings := ctx.ExpandSource(String(d.properties.Check_nullability_warnings),
1756 "check_nullability_warnings")
1757 d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, "check_nullability_warnings.timestamp")
1758 msg := fmt.Sprintf(`\n******************************\n`+
1759 `The warnings encountered during nullability annotation validation did\n`+
1760 `not match the checked in file of expected warnings. The diffs are shown\n`+
1761 `above. You have two options:\n`+
1762 ` 1. Resolve the differences by editing the nullability annotations.\n`+
1763 ` 2. Update the file of expected warnings by running:\n`+
1764 ` cp %s %s\n`+
1765 ` and submitting the updated file as part of your change.`,
1766 d.nullabilityWarningsFile, checkNullabilityWarnings)
1767 ctx.Build(pctx, android.BuildParams{
1768 Rule: nullabilityWarningsCheck,
1769 Description: "Nullability Warnings Check",
1770 Output: d.checkNullabilityWarningsTimestamp,
1771 Implicits: android.Paths{checkNullabilityWarnings, d.nullabilityWarningsFile},
1772 Args: map[string]string{
1773 "expected": checkNullabilityWarnings.String(),
1774 "actual": d.nullabilityWarningsFile.String(),
1775 "msg": msg,
1776 },
1777 })
1778 }
1779
Nan Zhang71bbe632018-09-17 14:32:21 -07001780 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1781
Nan Zhang86b06202018-09-21 17:09:21 -07001782 // Please sync with android-api-council@ before making any changes for the name of jdiffDocZip below
1783 // since there's cron job downstream that fetch this .zip file periodically.
1784 // See b/116221385 for reference.
Nan Zhang71bbe632018-09-17 14:32:21 -07001785 d.jdiffDocZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-docs.zip")
1786 d.jdiffStubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-stubs.srcjar")
1787
1788 var jdiffImplicitOutputs android.WritablePaths
1789 jdiffImplicitOutputs = append(jdiffImplicitOutputs, d.jdiffDocZip)
1790
1791 jdiff := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jdiff.jar")
1792 jdiffImplicits = append(jdiffImplicits, android.Paths{jdiff, d.apiXmlFile, d.lastReleasedApiXmlFile}...)
1793
1794 opts := " -encoding UTF-8 -source 1.8 -J-Xmx1600m -XDignore.symbol.file " +
1795 "-doclet jdiff.JDiff -docletpath " + jdiff.String() + " -quiet " +
1796 "-newapi " + strings.TrimSuffix(d.apiXmlFile.Base(), d.apiXmlFile.Ext()) +
1797 " -newapidir " + filepath.Dir(d.apiXmlFile.String()) +
1798 " -oldapi " + strings.TrimSuffix(d.lastReleasedApiXmlFile.Base(), d.lastReleasedApiXmlFile.Ext()) +
1799 " -oldapidir " + filepath.Dir(d.lastReleasedApiXmlFile.String())
1800
1801 d.transformJdiff(ctx, jdiffImplicits, jdiffImplicitOutputs, flags.bootClasspathArgs, flags.classpathArgs,
1802 flags.sourcepathArgs, opts)
1803 }
Nan Zhang581fd212018-01-10 16:06:12 -08001804}
Dan Willemsencc090972018-02-26 14:33:31 -08001805
Nan Zhanga40da042018-08-01 12:48:00 -07001806//
Nan Zhangf4936b02018-08-01 15:00:28 -07001807// Exported Droiddoc Directory
Nan Zhanga40da042018-08-01 12:48:00 -07001808//
Dan Willemsencc090972018-02-26 14:33:31 -08001809var droiddocTemplateTag = dependencyTag{name: "droiddoc-template"}
Nan Zhangf4936b02018-08-01 15:00:28 -07001810var metalavaMergeAnnotationsDirTag = dependencyTag{name: "metalava-merge-annotations-dir"}
Pete Gillin77167902018-09-19 18:16:26 +01001811var metalavaMergeInclusionAnnotationsDirTag = dependencyTag{name: "metalava-merge-inclusion-annotations-dir"}
Nan Zhang9c69a122018-08-22 10:22:08 -07001812var metalavaAPILevelsAnnotationsDirTag = dependencyTag{name: "metalava-api-levels-annotations-dir"}
Dan Willemsencc090972018-02-26 14:33:31 -08001813
Nan Zhangf4936b02018-08-01 15:00:28 -07001814type ExportedDroiddocDirProperties struct {
1815 // path to the directory containing Droiddoc related files.
Dan Willemsencc090972018-02-26 14:33:31 -08001816 Path *string
1817}
1818
Nan Zhangf4936b02018-08-01 15:00:28 -07001819type ExportedDroiddocDir struct {
Dan Willemsencc090972018-02-26 14:33:31 -08001820 android.ModuleBase
1821
Nan Zhangf4936b02018-08-01 15:00:28 -07001822 properties ExportedDroiddocDirProperties
Dan Willemsencc090972018-02-26 14:33:31 -08001823
1824 deps android.Paths
1825 dir android.Path
1826}
1827
Nan Zhangf4936b02018-08-01 15:00:28 -07001828func ExportedDroiddocDirFactory() android.Module {
1829 module := &ExportedDroiddocDir{}
Dan Willemsencc090972018-02-26 14:33:31 -08001830 module.AddProperties(&module.properties)
1831 android.InitAndroidModule(module)
1832 return module
1833}
1834
Nan Zhangf4936b02018-08-01 15:00:28 -07001835func (d *ExportedDroiddocDir) DepsMutator(android.BottomUpMutatorContext) {}
Dan Willemsencc090972018-02-26 14:33:31 -08001836
Nan Zhangf4936b02018-08-01 15:00:28 -07001837func (d *ExportedDroiddocDir) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross07e51612019-03-05 12:46:40 -08001838 path := String(d.properties.Path)
1839 d.dir = android.PathForModuleSrc(ctx, path)
Colin Cross8a497952019-03-05 22:25:09 -08001840 d.deps = android.PathsForModuleSrc(ctx, []string{filepath.Join(path, "**/*")})
Dan Willemsencc090972018-02-26 14:33:31 -08001841}
Nan Zhangb2b33de2018-02-23 11:18:47 -08001842
1843//
1844// Defaults
1845//
1846type DocDefaults struct {
1847 android.ModuleBase
1848 android.DefaultsModuleBase
1849}
1850
1851func (*DocDefaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1852}
1853
Nan Zhangb2b33de2018-02-23 11:18:47 -08001854func DocDefaultsFactory() android.Module {
1855 module := &DocDefaults{}
1856
1857 module.AddProperties(
1858 &JavadocProperties{},
1859 &DroiddocProperties{},
1860 )
1861
1862 android.InitDefaultsModule(module)
1863
1864 return module
1865}
Nan Zhang1598a9e2018-09-04 17:14:32 -07001866
1867func StubsDefaultsFactory() android.Module {
1868 module := &DocDefaults{}
1869
1870 module.AddProperties(
1871 &JavadocProperties{},
1872 &DroidstubsProperties{},
1873 )
1874
1875 android.InitDefaultsModule(module)
1876
1877 return module
1878}