blob: a8cf1c034d7ae5b9b2db0793ef2a96bedd000d71 [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 && ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -070076 `${config.JavaCmd} ${config.JavaVmFlags} -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 && ` +
80 `rm -rf "$srcJarDir"`,
Nan Zhang79614d12018-04-19 18:03:39 -070081 CommandDeps: []string{
82 "${config.ZipSyncCmd}",
83 "${config.JavaCmd}",
84 "${config.MetalavaJar}",
Nan Zhang79614d12018-04-19 18:03:39 -070085 "${config.SoongZipCmd}",
86 },
87 Rspfile: "$out.rsp",
88 RspfileContent: "$in",
89 Restat: true,
90 },
Nan Zhang1598a9e2018-09-04 17:14:32 -070091 "outDir", "srcJarDir", "stubsDir", "srcJars", "javaVersion", "bootclasspathArgs",
92 "classpathArgs", "sourcepathArgs", "opts")
Nan Zhang2760dfc2018-08-24 17:32:54 +000093
94 metalavaApiCheck = pctx.AndroidStaticRule("metalavaApiCheck",
95 blueprint.RuleParams{
96 Command: `( rm -rf "$srcJarDir" && mkdir -p "$srcJarDir" && ` +
97 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -070098 `${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list ` +
Tor Norbye76c875a2018-12-26 20:34:29 -080099 `$bootclasspathArgs $classpathArgs $sourcepathArgs --no-banner --color --quiet --format=v2 ` +
Colin Cross44c29a82019-01-24 16:36:57 -0800100 `$opts && touch $out && rm -rf "$srcJarDir") || ` +
Nan Zhang2760dfc2018-08-24 17:32:54 +0000101 `( echo -e "$msg" ; exit 38 )`,
102 CommandDeps: []string{
103 "${config.ZipSyncCmd}",
104 "${config.JavaCmd}",
105 "${config.MetalavaJar}",
106 },
107 Rspfile: "$out.rsp",
108 RspfileContent: "$in",
109 },
Nan Zhang1598a9e2018-09-04 17:14:32 -0700110 "srcJarDir", "srcJars", "javaVersion", "bootclasspathArgs", "classpathArgs", "sourcepathArgs", "opts", "msg")
111
Pete Gillin581d6082018-10-22 15:55:04 +0100112 nullabilityWarningsCheck = pctx.AndroidStaticRule("nullabilityWarningsCheck",
113 blueprint.RuleParams{
114 Command: `( diff $expected $actual && touch $out ) || ( echo -e "$msg" ; exit 38 )`,
115 },
116 "expected", "actual", "msg")
117
Nan Zhang1598a9e2018-09-04 17:14:32 -0700118 dokka = pctx.AndroidStaticRule("dokka",
119 blueprint.RuleParams{
120 Command: `rm -rf "$outDir" "$srcJarDir" "$stubsDir" && ` +
121 `mkdir -p "$outDir" "$srcJarDir" "$stubsDir" && ` +
122 `${config.ZipSyncCmd} -d $srcJarDir -l $srcJarDir/list -f "*.java" $srcJars && ` +
Sasha Smundak26c6d9e2019-06-11 13:30:13 -0700123 `${config.JavaCmd} ${config.JavaVmFlags} -jar ${config.DokkaJar} $srcJarDir ` +
Nan Zhang1598a9e2018-09-04 17:14:32 -0700124 `$classpathArgs -format dac -dacRoot /reference/kotlin -output $outDir $opts && ` +
125 `${config.SoongZipCmd} -write_if_changed -d -o $docZip -C $outDir -D $outDir && ` +
Colin Cross44c29a82019-01-24 16:36:57 -0800126 `${config.SoongZipCmd} -write_if_changed -jar -o $out -C $stubsDir -D $stubsDir && ` +
127 `rm -rf "$srcJarDir"`,
Nan Zhang1598a9e2018-09-04 17:14:32 -0700128 CommandDeps: []string{
129 "${config.ZipSyncCmd}",
130 "${config.DokkaJar}",
131 "${config.MetalavaJar}",
132 "${config.SoongZipCmd}",
133 },
134 Restat: true,
135 },
136 "outDir", "srcJarDir", "stubsDir", "srcJars", "classpathArgs", "opts", "docZip")
Nan Zhang581fd212018-01-10 16:06:12 -0800137)
138
139func init() {
Nan Zhangb2b33de2018-02-23 11:18:47 -0800140 android.RegisterModuleType("doc_defaults", DocDefaultsFactory)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700141 android.RegisterModuleType("stubs_defaults", StubsDefaultsFactory)
Nan Zhangb2b33de2018-02-23 11:18:47 -0800142
Nan Zhang581fd212018-01-10 16:06:12 -0800143 android.RegisterModuleType("droiddoc", DroiddocFactory)
144 android.RegisterModuleType("droiddoc_host", DroiddocHostFactory)
Nan Zhangf4936b02018-08-01 15:00:28 -0700145 android.RegisterModuleType("droiddoc_exported_dir", ExportedDroiddocDirFactory)
Nan Zhang581fd212018-01-10 16:06:12 -0800146 android.RegisterModuleType("javadoc", JavadocFactory)
147 android.RegisterModuleType("javadoc_host", JavadocHostFactory)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700148
149 android.RegisterModuleType("droidstubs", DroidstubsFactory)
150 android.RegisterModuleType("droidstubs_host", DroidstubsHostFactory)
Nan Zhang581fd212018-01-10 16:06:12 -0800151}
152
Colin Crossa1ce2a02018-06-20 15:19:39 -0700153var (
154 srcsLibTag = dependencyTag{name: "sources from javalib"}
155)
156
Nan Zhang581fd212018-01-10 16:06:12 -0800157type JavadocProperties struct {
158 // list of source files used to compile the Java module. May be .java, .logtags, .proto,
159 // or .aidl files.
Colin Cross27b922f2019-03-04 22:35:41 -0800160 Srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -0800161
162 // list of directories rooted at the Android.bp file that will
163 // be added to the search paths for finding source files when passing package names.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800164 Local_sourcepaths []string
Nan Zhang581fd212018-01-10 16:06:12 -0800165
166 // list of source files that should not be used to build the Java module.
167 // This is most useful in the arch/multilib variants to remove non-common files
168 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -0800169 Exclude_srcs []string `android:"path,arch_variant"`
Nan Zhang581fd212018-01-10 16:06:12 -0800170
Nan Zhangb2b33de2018-02-23 11:18:47 -0800171 // list of java libraries that will be in the classpath.
Nan Zhang581fd212018-01-10 16:06:12 -0800172 Libs []string `android:"arch_variant"`
173
Paul Duffin2fbbfb82019-02-13 12:49:33 +0000174 // don't build against the framework libraries (ext, and framework for device targets)
Nan Zhange66c7272018-03-06 12:59:27 -0800175 No_framework_libs *bool
176
Nan Zhangb2b33de2018-02-23 11:18:47 -0800177 // the java library (in classpath) for documentation that provides java srcs and srcjars.
178 Srcs_lib *string
179
180 // the base dirs under srcs_lib will be scanned for java srcs.
181 Srcs_lib_whitelist_dirs []string
182
183 // the sub dirs under srcs_lib_whitelist_dirs will be scanned for java srcs.
184 Srcs_lib_whitelist_pkgs []string
185
Nan Zhang581fd212018-01-10 16:06:12 -0800186 // If set to false, don't allow this module(-docs.zip) to be exported. Defaults to true.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800187 Installable *bool
Nan Zhang581fd212018-01-10 16:06:12 -0800188
189 // if not blank, set to the version of the sdk to compile against
190 Sdk_version *string `android:"arch_variant"`
Jiyong Park1e440682018-05-23 18:42:04 +0900191
192 Aidl struct {
193 // Top level directories to pass to aidl tool
194 Include_dirs []string
195
196 // Directories rooted at the Android.bp file to pass to aidl tool
197 Local_include_dirs []string
198 }
Nan Zhang357466b2018-04-17 17:38:36 -0700199
200 // If not blank, set the java version passed to javadoc as -source
201 Java_version *string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700202
203 // local files that are used within user customized droiddoc options.
Colin Cross27b922f2019-03-04 22:35:41 -0800204 Arg_files []string `android:"path"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700205
206 // user customized droiddoc args.
207 // Available variables for substitution:
208 //
209 // $(location <label>): the path to the arg_files with name <label>
Colin Crosse4a05842019-05-28 10:17:14 -0700210 // $$: a literal $
Nan Zhang1598a9e2018-09-04 17:14:32 -0700211 Args *string
212
213 // names of the output files used in args that will be generated
214 Out []string
Nan Zhang581fd212018-01-10 16:06:12 -0800215}
216
Nan Zhang61819ce2018-05-04 18:49:16 -0700217type ApiToCheck struct {
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900218 // path to the API txt file that the new API extracted from source code is checked
219 // against. The path can be local to the module or from other module (via :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800220 Api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700221
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900222 // path to the API txt file that the new @removed API extractd from source code is
223 // checked against. The path can be local to the module or from other module (via
224 // :module syntax).
Colin Cross27b922f2019-03-04 22:35:41 -0800225 Removed_api_file *string `android:"path"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700226
Jiyong Parkeeb8a642018-05-12 22:21:20 +0900227 // Arguments to the apicheck tool.
Nan Zhang61819ce2018-05-04 18:49:16 -0700228 Args *string
229}
230
Nan Zhang581fd212018-01-10 16:06:12 -0800231type DroiddocProperties struct {
232 // directory relative to top of the source tree that contains doc templates files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800233 Custom_template *string
Nan Zhang581fd212018-01-10 16:06:12 -0800234
Nan Zhanga40da042018-08-01 12:48:00 -0700235 // directories under current module source which contains html/jd files.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800236 Html_dirs []string
Nan Zhang581fd212018-01-10 16:06:12 -0800237
238 // set a value in the Clearsilver hdf namespace.
Nan Zhangb2b33de2018-02-23 11:18:47 -0800239 Hdf []string
Nan Zhang581fd212018-01-10 16:06:12 -0800240
241 // proofread file contains all of the text content of the javadocs concatenated into one file,
242 // suitable for spell-checking and other goodness.
Colin Cross27b922f2019-03-04 22:35:41 -0800243 Proofread_file *string `android:"path"`
Nan Zhang581fd212018-01-10 16:06:12 -0800244
245 // a todo file lists the program elements that are missing documentation.
246 // At some point, this might be improved to show more warnings.
Colin Cross27b922f2019-03-04 22:35:41 -0800247 Todo_file *string `android:"path"`
Nan Zhangb2b33de2018-02-23 11:18:47 -0800248
249 // directory under current module source that provide additional resources (images).
250 Resourcesdir *string
251
252 // resources output directory under out/soong/.intermediates.
253 Resourcesoutdir *string
Nan Zhang581fd212018-01-10 16:06:12 -0800254
Nan Zhange2ba5d42018-07-11 15:16:55 -0700255 // if set to true, collect the values used by the Dev tools and
256 // write them in files packaged with the SDK. Defaults to false.
257 Write_sdk_values *bool
258
259 // index.html under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800260 Static_doc_index_redirect *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700261
262 // source.properties under current module will be copied to docs out dir, if not null.
Colin Cross27b922f2019-03-04 22:35:41 -0800263 Static_doc_properties *string `android:"path"`
Nan Zhange2ba5d42018-07-11 15:16:55 -0700264
Nan Zhang581fd212018-01-10 16:06:12 -0800265 // a list of files under current module source dir which contains known tags in Java sources.
266 // filegroup or genrule can be included within this property.
Colin Cross27b922f2019-03-04 22:35:41 -0800267 Knowntags []string `android:"path"`
Nan Zhang28c68b92018-03-13 16:17:01 -0700268
269 // the tag name used to distinguish if the API files belong to public/system/test.
270 Api_tag_name *string
271
272 // the generated public API filename by Doclava.
273 Api_filename *string
274
David Brazdilfbe4cc32018-05-31 13:56:46 +0100275 // the generated public Dex API filename by Doclava.
276 Dex_api_filename *string
277
Nan Zhang28c68b92018-03-13 16:17:01 -0700278 // the generated private API filename by Doclava.
279 Private_api_filename *string
280
281 // the generated private Dex API filename by Doclava.
282 Private_dex_api_filename *string
283
284 // the generated removed API filename by Doclava.
285 Removed_api_filename *string
286
David Brazdilaac0c3c2018-04-24 16:23:29 +0100287 // the generated removed Dex API filename by Doclava.
288 Removed_dex_api_filename *string
289
Mathew Inwood76c3de12018-06-22 15:28:11 +0100290 // mapping of dex signatures to source file and line number. This is a temporary property and
291 // will be deleted; you probably shouldn't be using it.
292 Dex_mapping_filename *string
293
Nan Zhang28c68b92018-03-13 16:17:01 -0700294 // the generated exact API filename by Doclava.
295 Exact_api_filename *string
Nan Zhang853f4202018-04-12 16:55:56 -0700296
Nan Zhang66dc2362018-08-14 20:41:04 -0700297 // the generated proguard filename by Doclava.
298 Proguard_filename *string
299
Nan Zhang853f4202018-04-12 16:55:56 -0700300 // if set to false, don't allow droiddoc to generate stubs source files. Defaults to true.
301 Create_stubs *bool
Nan Zhang61819ce2018-05-04 18:49:16 -0700302
303 Check_api struct {
304 Last_released ApiToCheck
305
306 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900307
308 // do not perform API check against Last_released, in the case that both two specified API
309 // files by Last_released are modules which don't exist.
310 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Nan Zhang61819ce2018-05-04 18:49:16 -0700311 }
Nan Zhang79614d12018-04-19 18:03:39 -0700312
Nan Zhang1598a9e2018-09-04 17:14:32 -0700313 // if set to true, generate docs through Dokka instead of Doclava.
314 Dokka_enabled *bool
315}
316
317type DroidstubsProperties struct {
318 // the tag name used to distinguish if the API files belong to public/system/test.
319 Api_tag_name *string
320
Nan Zhang199645c2018-09-19 12:40:06 -0700321 // the generated public API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700322 Api_filename *string
323
Nan Zhang199645c2018-09-19 12:40:06 -0700324 // the generated public Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700325 Dex_api_filename *string
326
Nan Zhang199645c2018-09-19 12:40:06 -0700327 // the generated private API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700328 Private_api_filename *string
329
Nan Zhang199645c2018-09-19 12:40:06 -0700330 // the generated private Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700331 Private_dex_api_filename *string
332
Nan Zhang199645c2018-09-19 12:40:06 -0700333 // the generated removed API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700334 Removed_api_filename *string
335
Nan Zhang199645c2018-09-19 12:40:06 -0700336 // the generated removed Dex API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700337 Removed_dex_api_filename *string
338
Nan Zhang9c69a122018-08-22 10:22:08 -0700339 // mapping of dex signatures to source file and line number. This is a temporary property and
340 // will be deleted; you probably shouldn't be using it.
341 Dex_mapping_filename *string
342
Nan Zhang199645c2018-09-19 12:40:06 -0700343 // the generated exact API filename by Metalava.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700344 Exact_api_filename *string
345
Nan Zhang199645c2018-09-19 12:40:06 -0700346 // the generated proguard filename by Metalava.
347 Proguard_filename *string
348
Nan Zhang1598a9e2018-09-04 17:14:32 -0700349 Check_api struct {
350 Last_released ApiToCheck
351
352 Current ApiToCheck
Inseob Kim38449af2019-02-28 14:24:05 +0900353
354 // do not perform API check against Last_released, in the case that both two specified API
355 // files by Last_released are modules which don't exist.
356 Ignore_missing_latest_api *bool `blueprint:"mutated"`
Nan Zhang1598a9e2018-09-04 17:14:32 -0700357 }
Nan Zhang79614d12018-04-19 18:03:39 -0700358
359 // user can specify the version of previous released API file in order to do compatibility check.
Colin Cross27b922f2019-03-04 22:35:41 -0800360 Previous_api *string `android:"path"`
Nan Zhang79614d12018-04-19 18:03:39 -0700361
362 // is set to true, Metalava will allow framework SDK to contain annotations.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700363 Annotations_enabled *bool
Nan Zhang79614d12018-04-19 18:03:39 -0700364
Pete Gillin77167902018-09-19 18:16:26 +0100365 // 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 -0700366 Merge_annotations_dirs []string
Nan Zhang86d2d552018-08-09 15:33:27 -0700367
Pete Gillin77167902018-09-19 18:16:26 +0100368 // a list of top-level directories containing Java stub files to merge show/hide annotations from.
369 Merge_inclusion_annotations_dirs []string
370
Pete Gillinc382a562018-11-14 18:45:46 +0000371 // a file containing a list of classes to do nullability validation for.
372 Validate_nullability_from_list *string
373
Pete Gillin581d6082018-10-22 15:55:04 +0100374 // a file containing expected warnings produced by validation of nullability annotations.
375 Check_nullability_warnings *string
376
Nan Zhang1598a9e2018-09-04 17:14:32 -0700377 // if set to true, allow Metalava to generate doc_stubs source files. Defaults to false.
378 Create_doc_stubs *bool
Nan Zhang9c69a122018-08-22 10:22:08 -0700379
380 // is set to true, Metalava will allow framework SDK to contain API levels annotations.
381 Api_levels_annotations_enabled *bool
382
383 // the dirs which Metalava extracts API levels annotations from.
384 Api_levels_annotations_dirs []string
385
386 // if set to true, collect the values used by the Dev tools and
387 // write them in files packaged with the SDK. Defaults to false.
388 Write_sdk_values *bool
Nan Zhang71bbe632018-09-17 14:32:21 -0700389
390 // If set to true, .xml based public API file will be also generated, and
391 // JDiff tool will be invoked to genreate javadoc files. Defaults to false.
392 Jdiff_enabled *bool
Nan Zhang581fd212018-01-10 16:06:12 -0800393}
394
Nan Zhanga40da042018-08-01 12:48:00 -0700395//
396// Common flags passed down to build rule
397//
398type droiddocBuilderFlags struct {
Nan Zhang86d2d552018-08-09 15:33:27 -0700399 bootClasspathArgs string
400 classpathArgs string
Nan Zhang1598a9e2018-09-04 17:14:32 -0700401 sourcepathArgs string
Nan Zhang86d2d552018-08-09 15:33:27 -0700402 dokkaClasspathArgs string
403 aidlFlags string
Colin Cross3047fa22019-04-18 10:56:44 -0700404 aidlDeps android.Paths
Nan Zhanga40da042018-08-01 12:48:00 -0700405
Nan Zhanga40da042018-08-01 12:48:00 -0700406 doclavaStubsFlags string
Nan Zhang86d2d552018-08-09 15:33:27 -0700407 doclavaDocsFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700408 postDoclavaCmds string
409
Nan Zhang9c69a122018-08-22 10:22:08 -0700410 metalavaStubsFlags string
411 metalavaAnnotationsFlags string
Nan Zhangdee152b2018-12-26 16:06:37 -0800412 metalavaMergeAnnoDirFlags string
Neil Fullerb2f14ec2018-10-21 22:13:19 +0100413 metalavaInclusionAnnotationsFlags string
Nan Zhang9c69a122018-08-22 10:22:08 -0700414 metalavaApiLevelsAnnotationsFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700415
Nan Zhang71bbe632018-09-17 14:32:21 -0700416 metalavaApiToXmlFlags string
Nan Zhanga40da042018-08-01 12:48:00 -0700417}
418
419func InitDroiddocModule(module android.DefaultableModule, hod android.HostOrDeviceSupported) {
420 android.InitAndroidArchModule(module, hod, android.MultilibCommon)
421 android.InitDefaultableModule(module)
422}
423
Nan Zhang1598a9e2018-09-04 17:14:32 -0700424func apiCheckEnabled(apiToCheck ApiToCheck, apiVersionTag string) bool {
425 if String(apiToCheck.Api_file) != "" && String(apiToCheck.Removed_api_file) != "" {
426 return true
427 } else if String(apiToCheck.Api_file) != "" {
428 panic("for " + apiVersionTag + " removed_api_file has to be non-empty!")
429 } else if String(apiToCheck.Removed_api_file) != "" {
430 panic("for " + apiVersionTag + " api_file has to be non-empty!")
431 }
432
433 return false
434}
435
Inseob Kim38449af2019-02-28 14:24:05 +0900436func ignoreMissingModules(ctx android.BottomUpMutatorContext, apiToCheck *ApiToCheck) {
437 api_file := String(apiToCheck.Api_file)
438 removed_api_file := String(apiToCheck.Removed_api_file)
439
440 api_module := android.SrcIsModule(api_file)
441 removed_api_module := android.SrcIsModule(removed_api_file)
442
443 if api_module == "" || removed_api_module == "" {
444 return
445 }
446
447 if ctx.OtherModuleExists(api_module) || ctx.OtherModuleExists(removed_api_module) {
448 return
449 }
450
451 apiToCheck.Api_file = nil
452 apiToCheck.Removed_api_file = nil
453}
454
Nan Zhang1598a9e2018-09-04 17:14:32 -0700455type ApiFilePath interface {
456 ApiFilePath() android.Path
457}
458
459func transformUpdateApi(ctx android.ModuleContext, destApiFile, destRemovedApiFile,
460 srcApiFile, srcRemovedApiFile android.Path, output android.WritablePath) {
461 ctx.Build(pctx, android.BuildParams{
462 Rule: updateApi,
463 Description: "Update API",
464 Output: output,
465 Implicits: append(android.Paths{}, srcApiFile, srcRemovedApiFile,
466 destApiFile, destRemovedApiFile),
467 Args: map[string]string{
468 "destApiFile": destApiFile.String(),
469 "srcApiFile": srcApiFile.String(),
470 "destRemovedApiFile": destRemovedApiFile.String(),
471 "srcRemovedApiFile": srcRemovedApiFile.String(),
472 },
473 })
474}
475
Nan Zhanga40da042018-08-01 12:48:00 -0700476//
477// Javadoc
478//
Nan Zhang581fd212018-01-10 16:06:12 -0800479type Javadoc struct {
480 android.ModuleBase
481 android.DefaultableModuleBase
482
483 properties JavadocProperties
484
485 srcJars android.Paths
486 srcFiles android.Paths
487 sourcepaths android.Paths
Nan Zhang1598a9e2018-09-04 17:14:32 -0700488 argFiles android.Paths
489
490 args string
Nan Zhang581fd212018-01-10 16:06:12 -0800491
Nan Zhangccff0f72018-03-08 17:26:16 -0800492 docZip android.WritablePath
493 stubsSrcJar android.WritablePath
Nan Zhang581fd212018-01-10 16:06:12 -0800494}
495
Colin Cross41955e82019-05-29 14:40:35 -0700496func (j *Javadoc) OutputFiles(tag string) (android.Paths, error) {
497 switch tag {
498 case "":
499 return android.Paths{j.stubsSrcJar}, nil
500 default:
501 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
502 }
Nan Zhangb2b33de2018-02-23 11:18:47 -0800503}
504
Nan Zhang581fd212018-01-10 16:06:12 -0800505func JavadocFactory() android.Module {
506 module := &Javadoc{}
507
508 module.AddProperties(&module.properties)
509
510 InitDroiddocModule(module, android.HostAndDeviceSupported)
511 return module
512}
513
514func JavadocHostFactory() android.Module {
515 module := &Javadoc{}
516
517 module.AddProperties(&module.properties)
518
519 InitDroiddocModule(module, android.HostSupported)
520 return module
521}
522
Colin Cross41955e82019-05-29 14:40:35 -0700523var _ android.OutputFileProducer = (*Javadoc)(nil)
Nan Zhang581fd212018-01-10 16:06:12 -0800524
Colin Cross83bb3162018-06-25 15:48:06 -0700525func (j *Javadoc) sdkVersion() string {
526 return String(j.properties.Sdk_version)
527}
528
529func (j *Javadoc) minSdkVersion() string {
530 return j.sdkVersion()
531}
532
Dan Willemsen419290a2018-10-31 15:28:47 -0700533func (j *Javadoc) targetSdkVersion() string {
534 return j.sdkVersion()
535}
536
Paul Duffin250e6192019-06-07 10:44:37 +0100537func (j *Javadoc) noFrameworkLibs() bool {
538 return Bool(j.properties.No_framework_libs)
539}
540
Nan Zhang581fd212018-01-10 16:06:12 -0800541func (j *Javadoc) addDeps(ctx android.BottomUpMutatorContext) {
542 if ctx.Device() {
Paul Duffin250e6192019-06-07 10:44:37 +0100543 sdkDep := decodeSdkDep(ctx, sdkContext(j))
544 if sdkDep.hasStandardLibs() {
Nan Zhang5994b622018-09-21 16:39:51 -0700545 if sdkDep.useDefaultLibs {
546 ctx.AddVariationDependencies(nil, bootClasspathTag, config.DefaultBootclasspathLibraries...)
547 if ctx.Config().TargetOpenJDK9() {
548 ctx.AddVariationDependencies(nil, systemModulesTag, config.DefaultSystemModules)
549 }
Paul Duffin250e6192019-06-07 10:44:37 +0100550 if sdkDep.hasFrameworkLibs() {
Nan Zhang5994b622018-09-21 16:39:51 -0700551 ctx.AddVariationDependencies(nil, libTag, config.DefaultLibraries...)
552 }
553 } else if sdkDep.useModule {
554 if ctx.Config().TargetOpenJDK9() {
555 ctx.AddVariationDependencies(nil, systemModulesTag, sdkDep.systemModules)
556 }
557 ctx.AddVariationDependencies(nil, bootClasspathTag, sdkDep.modules...)
Nan Zhang357466b2018-04-17 17:38:36 -0700558 }
Nan Zhang581fd212018-01-10 16:06:12 -0800559 }
560 }
561
Colin Cross42d48b72018-08-29 14:10:52 -0700562 ctx.AddVariationDependencies(nil, libTag, j.properties.Libs...)
Colin Crossa1ce2a02018-06-20 15:19:39 -0700563 if j.properties.Srcs_lib != nil {
Colin Cross42d48b72018-08-29 14:10:52 -0700564 ctx.AddVariationDependencies(nil, srcsLibTag, *j.properties.Srcs_lib)
Colin Crossa1ce2a02018-06-20 15:19:39 -0700565 }
Nan Zhang581fd212018-01-10 16:06:12 -0800566}
567
Nan Zhangb2b33de2018-02-23 11:18:47 -0800568func (j *Javadoc) genWhitelistPathPrefixes(whitelistPathPrefixes map[string]bool) {
569 for _, dir := range j.properties.Srcs_lib_whitelist_dirs {
570 for _, pkg := range j.properties.Srcs_lib_whitelist_pkgs {
Jiyong Park82484c02018-04-23 21:41:26 +0900571 // convert foo.bar.baz to foo/bar/baz
572 pkgAsPath := filepath.Join(strings.Split(pkg, ".")...)
573 prefix := filepath.Join(dir, pkgAsPath)
Nan Zhangb2b33de2018-02-23 11:18:47 -0800574 if _, found := whitelistPathPrefixes[prefix]; !found {
575 whitelistPathPrefixes[prefix] = true
576 }
577 }
578 }
579}
580
Nan Zhanga40da042018-08-01 12:48:00 -0700581func (j *Javadoc) collectAidlFlags(ctx android.ModuleContext, deps deps) droiddocBuilderFlags {
582 var flags droiddocBuilderFlags
Jiyong Park1e440682018-05-23 18:42:04 +0900583
Colin Cross3047fa22019-04-18 10:56:44 -0700584 flags.aidlFlags, flags.aidlDeps = j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs)
Jiyong Park1e440682018-05-23 18:42:04 +0900585
586 return flags
587}
588
589func (j *Javadoc) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.OptionalPath,
Colin Cross3047fa22019-04-18 10:56:44 -0700590 aidlIncludeDirs android.Paths) (string, android.Paths) {
Jiyong Park1e440682018-05-23 18:42:04 +0900591
592 aidlIncludes := android.PathsForModuleSrc(ctx, j.properties.Aidl.Local_include_dirs)
593 aidlIncludes = append(aidlIncludes, android.PathsForSource(ctx, j.properties.Aidl.Include_dirs)...)
594
595 var flags []string
Colin Cross3047fa22019-04-18 10:56:44 -0700596 var deps android.Paths
597
Jiyong Park1e440682018-05-23 18:42:04 +0900598 if aidlPreprocess.Valid() {
599 flags = append(flags, "-p"+aidlPreprocess.String())
Colin Cross3047fa22019-04-18 10:56:44 -0700600 deps = append(deps, aidlPreprocess.Path())
Jiyong Park1e440682018-05-23 18:42:04 +0900601 } else {
602 flags = append(flags, android.JoinWithPrefix(aidlIncludeDirs.Strings(), "-I"))
603 }
604
605 flags = append(flags, android.JoinWithPrefix(aidlIncludes.Strings(), "-I"))
606 flags = append(flags, "-I"+android.PathForModuleSrc(ctx).String())
607 if src := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "src"); src.Valid() {
608 flags = append(flags, "-I"+src.String())
609 }
610
Colin Cross3047fa22019-04-18 10:56:44 -0700611 return strings.Join(flags, " "), deps
Jiyong Park1e440682018-05-23 18:42:04 +0900612}
613
614func (j *Javadoc) genSources(ctx android.ModuleContext, srcFiles android.Paths,
Nan Zhanga40da042018-08-01 12:48:00 -0700615 flags droiddocBuilderFlags) android.Paths {
Jiyong Park1e440682018-05-23 18:42:04 +0900616
617 outSrcFiles := make(android.Paths, 0, len(srcFiles))
618
619 for _, srcFile := range srcFiles {
620 switch srcFile.Ext() {
621 case ".aidl":
Colin Cross3047fa22019-04-18 10:56:44 -0700622 javaFile := genAidl(ctx, srcFile, flags.aidlFlags, flags.aidlDeps)
Jiyong Park1e440682018-05-23 18:42:04 +0900623 outSrcFiles = append(outSrcFiles, javaFile)
Inseob Kimc0907f12019-02-08 21:00:45 +0900624 case ".sysprop":
625 javaFile := genSysprop(ctx, srcFile)
626 outSrcFiles = append(outSrcFiles, javaFile)
Jiyong Park1e440682018-05-23 18:42:04 +0900627 default:
628 outSrcFiles = append(outSrcFiles, srcFile)
629 }
630 }
631
632 return outSrcFiles
633}
634
Nan Zhang581fd212018-01-10 16:06:12 -0800635func (j *Javadoc) collectDeps(ctx android.ModuleContext) deps {
636 var deps deps
637
Colin Cross83bb3162018-06-25 15:48:06 -0700638 sdkDep := decodeSdkDep(ctx, sdkContext(j))
Nan Zhang581fd212018-01-10 16:06:12 -0800639 if sdkDep.invalidVersion {
Colin Cross86a60ae2018-05-29 14:44:55 -0700640 ctx.AddMissingDependencies(sdkDep.modules)
Nan Zhang581fd212018-01-10 16:06:12 -0800641 } else if sdkDep.useFiles {
Colin Cross86a60ae2018-05-29 14:44:55 -0700642 deps.bootClasspath = append(deps.bootClasspath, sdkDep.jars...)
Nan Zhang581fd212018-01-10 16:06:12 -0800643 }
644
645 ctx.VisitDirectDeps(func(module android.Module) {
646 otherName := ctx.OtherModuleName(module)
647 tag := ctx.OtherModuleDependencyTag(module)
648
Colin Cross2d24c1b2018-05-23 10:59:18 -0700649 switch tag {
650 case bootClasspathTag:
651 if dep, ok := module.(Dependency); ok {
Nan Zhang581fd212018-01-10 16:06:12 -0800652 deps.bootClasspath = append(deps.bootClasspath, dep.ImplementationJars()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700653 } else {
654 panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName()))
655 }
656 case libTag:
657 switch dep := module.(type) {
Colin Cross897d2ed2019-02-11 14:03:51 -0800658 case SdkLibraryDependency:
659 deps.classpath = append(deps.classpath, dep.SdkImplementationJars(ctx, j.sdkVersion())...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700660 case Dependency:
Sundong Ahnba493602018-11-20 17:36:35 +0900661 deps.classpath = append(deps.classpath, dep.HeaderJars()...)
Colin Cross2d24c1b2018-05-23 10:59:18 -0700662 case android.SourceFileProducer:
Nan Zhang581fd212018-01-10 16:06:12 -0800663 checkProducesJars(ctx, dep)
664 deps.classpath = append(deps.classpath, dep.Srcs()...)
Nan Zhang581fd212018-01-10 16:06:12 -0800665 default:
666 ctx.ModuleErrorf("depends on non-java module %q", otherName)
667 }
Colin Crossa1ce2a02018-06-20 15:19:39 -0700668 case srcsLibTag:
669 switch dep := module.(type) {
670 case Dependency:
671 srcs := dep.(SrcDependency).CompiledSrcs()
672 whitelistPathPrefixes := make(map[string]bool)
673 j.genWhitelistPathPrefixes(whitelistPathPrefixes)
674 for _, src := range srcs {
675 if _, ok := src.(android.WritablePath); ok { // generated sources
676 deps.srcs = append(deps.srcs, src)
677 } else { // select source path for documentation based on whitelist path prefixs.
Nan Zhang1598a9e2018-09-04 17:14:32 -0700678 for k := range whitelistPathPrefixes {
Colin Crossa1ce2a02018-06-20 15:19:39 -0700679 if strings.HasPrefix(src.Rel(), k) {
680 deps.srcs = append(deps.srcs, src)
681 break
682 }
683 }
684 }
685 }
686 deps.srcJars = append(deps.srcJars, dep.(SrcDependency).CompiledSrcJars()...)
687 default:
688 ctx.ModuleErrorf("depends on non-java module %q", otherName)
689 }
Nan Zhang357466b2018-04-17 17:38:36 -0700690 case systemModulesTag:
691 if deps.systemModules != nil {
692 panic("Found two system module dependencies")
693 }
694 sm := module.(*SystemModules)
695 if sm.outputFile == nil {
696 panic("Missing directory for system module dependency")
697 }
698 deps.systemModules = sm.outputFile
Nan Zhang581fd212018-01-10 16:06:12 -0800699 }
700 })
701 // do not pass exclude_srcs directly when expanding srcFiles since exclude_srcs
702 // may contain filegroup or genrule.
Colin Cross8a497952019-03-05 22:25:09 -0800703 srcFiles := android.PathsForModuleSrcExcludes(ctx, j.properties.Srcs, j.properties.Exclude_srcs)
Nan Zhanga40da042018-08-01 12:48:00 -0700704 flags := j.collectAidlFlags(ctx, deps)
Jiyong Park1e440682018-05-23 18:42:04 +0900705 srcFiles = j.genSources(ctx, srcFiles, flags)
Nan Zhang581fd212018-01-10 16:06:12 -0800706
707 // srcs may depend on some genrule output.
708 j.srcJars = srcFiles.FilterByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800709 j.srcJars = append(j.srcJars, deps.srcJars...)
710
Nan Zhang581fd212018-01-10 16:06:12 -0800711 j.srcFiles = srcFiles.FilterOutByExt(".srcjar")
Nan Zhangb2b33de2018-02-23 11:18:47 -0800712 j.srcFiles = append(j.srcFiles, deps.srcs...)
Nan Zhang581fd212018-01-10 16:06:12 -0800713
714 j.docZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"docs.zip")
Nan Zhangccff0f72018-03-08 17:26:16 -0800715 j.stubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"stubs.srcjar")
Nan Zhang581fd212018-01-10 16:06:12 -0800716
Nan Zhang9c69a122018-08-22 10:22:08 -0700717 if j.properties.Local_sourcepaths == nil && len(j.srcFiles) > 0 {
Nan Zhang581fd212018-01-10 16:06:12 -0800718 j.properties.Local_sourcepaths = append(j.properties.Local_sourcepaths, ".")
719 }
720 j.sourcepaths = android.PathsForModuleSrc(ctx, j.properties.Local_sourcepaths)
Nan Zhang581fd212018-01-10 16:06:12 -0800721
Colin Cross8a497952019-03-05 22:25:09 -0800722 j.argFiles = android.PathsForModuleSrc(ctx, j.properties.Arg_files)
Paul Duffin99e4a502019-02-11 15:38:42 +0000723 argFilesMap := map[string]string{}
724 argFileLabels := []string{}
Nan Zhang1598a9e2018-09-04 17:14:32 -0700725
Paul Duffin99e4a502019-02-11 15:38:42 +0000726 for _, label := range j.properties.Arg_files {
Colin Cross8a497952019-03-05 22:25:09 -0800727 var paths = android.PathsForModuleSrc(ctx, []string{label})
Paul Duffin99e4a502019-02-11 15:38:42 +0000728 if _, exists := argFilesMap[label]; !exists {
729 argFilesMap[label] = strings.Join(paths.Strings(), " ")
730 argFileLabels = append(argFileLabels, label)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700731 } else {
732 ctx.ModuleErrorf("multiple arg_files for %q, %q and %q",
Paul Duffin99e4a502019-02-11 15:38:42 +0000733 label, argFilesMap[label], paths)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700734 }
735 }
736
737 var err error
738 j.args, err = android.Expand(String(j.properties.Args), func(name string) (string, error) {
739 if strings.HasPrefix(name, "location ") {
740 label := strings.TrimSpace(strings.TrimPrefix(name, "location "))
Paul Duffin99e4a502019-02-11 15:38:42 +0000741 if paths, ok := argFilesMap[label]; ok {
742 return paths, nil
Nan Zhang1598a9e2018-09-04 17:14:32 -0700743 } else {
Paul Duffin99e4a502019-02-11 15:38:42 +0000744 return "", fmt.Errorf("unknown location label %q, expecting one of %q",
745 label, strings.Join(argFileLabels, ", "))
Nan Zhang1598a9e2018-09-04 17:14:32 -0700746 }
747 } else if name == "genDir" {
748 return android.PathForModuleGen(ctx).String(), nil
749 }
750 return "", fmt.Errorf("unknown variable '$(%s)'", name)
751 })
752
753 if err != nil {
754 ctx.PropertyErrorf("args", "%s", err.Error())
755 }
756
Nan Zhang581fd212018-01-10 16:06:12 -0800757 return deps
758}
759
760func (j *Javadoc) DepsMutator(ctx android.BottomUpMutatorContext) {
761 j.addDeps(ctx)
762}
763
764func (j *Javadoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
765 deps := j.collectDeps(ctx)
766
767 var implicits android.Paths
768 implicits = append(implicits, deps.bootClasspath...)
769 implicits = append(implicits, deps.classpath...)
770
Nan Zhang1598a9e2018-09-04 17:14:32 -0700771 var bootClasspathArgs, classpathArgs, sourcepathArgs string
Nan Zhang357466b2018-04-17 17:38:36 -0700772
Colin Cross83bb3162018-06-25 15:48:06 -0700773 javaVersion := getJavaVersion(ctx, String(j.properties.Java_version), sdkContext(j))
Colin Cross997262f2018-06-19 22:49:39 -0700774 if len(deps.bootClasspath) > 0 {
775 var systemModules classpath
776 if deps.systemModules != nil {
777 systemModules = append(systemModules, deps.systemModules)
Nan Zhang581fd212018-01-10 16:06:12 -0800778 }
Colin Cross997262f2018-06-19 22:49:39 -0700779 bootClasspathArgs = systemModules.FormJavaSystemModulesPath("--system ", ctx.Device())
780 bootClasspathArgs = bootClasspathArgs + " --patch-module java.base=."
Nan Zhang581fd212018-01-10 16:06:12 -0800781 }
782 if len(deps.classpath.Strings()) > 0 {
783 classpathArgs = "-classpath " + strings.Join(deps.classpath.Strings(), ":")
784 }
785
786 implicits = append(implicits, j.srcJars...)
Nan Zhang1598a9e2018-09-04 17:14:32 -0700787 implicits = append(implicits, j.argFiles...)
Nan Zhang581fd212018-01-10 16:06:12 -0800788
Nan Zhangaf322cc2018-06-19 15:15:38 -0700789 opts := "-source " + javaVersion + " -J-Xmx1024m -XDignore.symbol.file -Xdoclint:none"
Nan Zhang581fd212018-01-10 16:06:12 -0800790
Nan Zhang1598a9e2018-09-04 17:14:32 -0700791 sourcepathArgs = "-sourcepath " + strings.Join(j.sourcepaths.Strings(), ":")
792
Nan Zhang581fd212018-01-10 16:06:12 -0800793 ctx.Build(pctx, android.BuildParams{
794 Rule: javadoc,
795 Description: "Javadoc",
Nan Zhangccff0f72018-03-08 17:26:16 -0800796 Output: j.stubsSrcJar,
Nan Zhang581fd212018-01-10 16:06:12 -0800797 ImplicitOutput: j.docZip,
798 Inputs: j.srcFiles,
799 Implicits: implicits,
800 Args: map[string]string{
Nan Zhangde860a42018-08-08 16:32:21 -0700801 "outDir": android.PathForModuleOut(ctx, "out").String(),
802 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
803 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
Nan Zhang581fd212018-01-10 16:06:12 -0800804 "srcJars": strings.Join(j.srcJars.Strings(), " "),
805 "opts": opts,
Nan Zhang853f4202018-04-12 16:55:56 -0700806 "bootclasspathArgs": bootClasspathArgs,
Nan Zhang581fd212018-01-10 16:06:12 -0800807 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -0700808 "sourcepathArgs": sourcepathArgs,
Nan Zhang581fd212018-01-10 16:06:12 -0800809 "docZip": j.docZip.String(),
810 },
811 })
812}
813
Nan Zhanga40da042018-08-01 12:48:00 -0700814//
815// Droiddoc
816//
817type Droiddoc struct {
818 Javadoc
819
820 properties DroiddocProperties
821 apiFile android.WritablePath
822 dexApiFile android.WritablePath
823 privateApiFile android.WritablePath
824 privateDexApiFile android.WritablePath
825 removedApiFile android.WritablePath
826 removedDexApiFile android.WritablePath
827 exactApiFile android.WritablePath
828 apiMappingFile android.WritablePath
Nan Zhang66dc2362018-08-14 20:41:04 -0700829 proguardFile android.WritablePath
Nan Zhanga40da042018-08-01 12:48:00 -0700830
831 checkCurrentApiTimestamp android.WritablePath
832 updateCurrentApiTimestamp android.WritablePath
833 checkLastReleasedApiTimestamp android.WritablePath
834
Nan Zhanga40da042018-08-01 12:48:00 -0700835 apiFilePath android.Path
836}
837
Nan Zhanga40da042018-08-01 12:48:00 -0700838func DroiddocFactory() android.Module {
839 module := &Droiddoc{}
840
841 module.AddProperties(&module.properties,
842 &module.Javadoc.properties)
843
844 InitDroiddocModule(module, android.HostAndDeviceSupported)
845 return module
846}
847
848func DroiddocHostFactory() android.Module {
849 module := &Droiddoc{}
850
851 module.AddProperties(&module.properties,
852 &module.Javadoc.properties)
853
854 InitDroiddocModule(module, android.HostSupported)
855 return module
856}
857
858func (d *Droiddoc) ApiFilePath() android.Path {
859 return d.apiFilePath
860}
861
Nan Zhang581fd212018-01-10 16:06:12 -0800862func (d *Droiddoc) DepsMutator(ctx android.BottomUpMutatorContext) {
863 d.Javadoc.addDeps(ctx)
864
Inseob Kim38449af2019-02-28 14:24:05 +0900865 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
866 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
867 }
868
Nan Zhang79614d12018-04-19 18:03:39 -0700869 if String(d.properties.Custom_template) != "" {
Dan Willemsencc090972018-02-26 14:33:31 -0800870 ctx.AddDependency(ctx.Module(), droiddocTemplateTag, String(d.properties.Custom_template))
871 }
Nan Zhang581fd212018-01-10 16:06:12 -0800872}
873
Nan Zhang66dc2362018-08-14 20:41:04 -0700874func (d *Droiddoc) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths,
875 deps deps) (droiddocBuilderFlags, error) {
Nan Zhanga40da042018-08-01 12:48:00 -0700876 var flags droiddocBuilderFlags
Nan Zhang581fd212018-01-10 16:06:12 -0800877
Nan Zhanga40da042018-08-01 12:48:00 -0700878 *implicits = append(*implicits, deps.bootClasspath...)
879 *implicits = append(*implicits, deps.classpath...)
Nan Zhang581fd212018-01-10 16:06:12 -0800880
Nan Zhangc94f9d82018-06-26 10:02:26 -0700881 if len(deps.bootClasspath.Strings()) > 0 {
882 // For OpenJDK 8 we can use -bootclasspath to define the core libraries code.
Nan Zhanga40da042018-08-01 12:48:00 -0700883 flags.bootClasspathArgs = deps.bootClasspath.FormJavaClassPath("-bootclasspath")
Nan Zhang357466b2018-04-17 17:38:36 -0700884 }
Nan Zhanga40da042018-08-01 12:48:00 -0700885 flags.classpathArgs = deps.classpath.FormJavaClassPath("-classpath")
Nan Zhang1598a9e2018-09-04 17:14:32 -0700886 // Dokka doesn't support bootClasspath, so combine these two classpath vars for Dokka.
Nan Zhang86d2d552018-08-09 15:33:27 -0700887 dokkaClasspath := classpath{}
888 dokkaClasspath = append(dokkaClasspath, deps.bootClasspath...)
889 dokkaClasspath = append(dokkaClasspath, deps.classpath...)
890 flags.dokkaClasspathArgs = dokkaClasspath.FormJavaClassPath("-classpath")
Nan Zhang79614d12018-04-19 18:03:39 -0700891
Nan Zhang9c69a122018-08-22 10:22:08 -0700892 // TODO(nanzhang): Remove this if- statement once we finish migration for all Doclava
893 // based stubs generation.
894 // In the future, all the docs generation depends on Metalava stubs (droidstubs) srcjar
895 // dir. We need add the srcjar dir to -sourcepath arg, so that Javadoc can figure out
896 // the correct package name base path.
897 if len(d.Javadoc.properties.Local_sourcepaths) > 0 {
898 flags.sourcepathArgs = "-sourcepath " + strings.Join(d.Javadoc.sourcepaths.Strings(), ":")
899 } else {
900 flags.sourcepathArgs = "-sourcepath " + android.PathForModuleOut(ctx, "srcjars").String()
901 }
Nan Zhang581fd212018-01-10 16:06:12 -0800902
Nan Zhanga40da042018-08-01 12:48:00 -0700903 return flags, nil
904}
Nan Zhang581fd212018-01-10 16:06:12 -0800905
Nan Zhanga40da042018-08-01 12:48:00 -0700906func (d *Droiddoc) collectDoclavaDocsFlags(ctx android.ModuleContext, implicits *android.Paths,
Nan Zhang443fa522018-08-20 20:58:28 -0700907 jsilver, doclava android.Path) string {
Nan Zhang581fd212018-01-10 16:06:12 -0800908
Nan Zhanga40da042018-08-01 12:48:00 -0700909 *implicits = append(*implicits, jsilver)
910 *implicits = append(*implicits, doclava)
Nan Zhang30963742018-04-23 09:59:14 -0700911
Nan Zhang46130972018-06-04 11:28:01 -0700912 var date string
913 if runtime.GOOS == "darwin" {
914 date = `date -r`
915 } else {
916 date = `date -d`
917 }
918
Nan Zhang443fa522018-08-20 20:58:28 -0700919 // Droiddoc always gets "-source 1.8" because it doesn't support 1.9 sources. For modules with 1.9
920 // sources, droiddoc will get sources produced by metalava which will have already stripped out the
921 // 1.9 language features.
922 args := " -source 1.8 -J-Xmx1600m -J-XX:-OmitStackTraceInFastThrow -XDignore.symbol.file " +
Nan Zhang30963742018-04-23 09:59:14 -0700923 "-doclet com.google.doclava.Doclava -docletpath " + jsilver.String() + ":" + doclava.String() + " " +
Nan Zhang581fd212018-01-10 16:06:12 -0800924 "-hdf page.build " + ctx.Config().BuildId() + "-" + ctx.Config().BuildNumberFromFile() + " " +
Nan Zhang79614d12018-04-19 18:03:39 -0700925 `-hdf page.now "$$(` + date + ` @$$(cat ` + ctx.Config().Getenv("BUILD_DATETIME_FILE") + `) "+%d %b %Y %k:%M")" `
Nan Zhang46130972018-06-04 11:28:01 -0700926
Nan Zhanga40da042018-08-01 12:48:00 -0700927 if String(d.properties.Custom_template) == "" {
928 // TODO: This is almost always droiddoc-templates-sdk
929 ctx.PropertyErrorf("custom_template", "must specify a template")
930 }
931
932 ctx.VisitDirectDepsWithTag(droiddocTemplateTag, func(m android.Module) {
Nan Zhangf4936b02018-08-01 15:00:28 -0700933 if t, ok := m.(*ExportedDroiddocDir); ok {
Nan Zhanga40da042018-08-01 12:48:00 -0700934 *implicits = append(*implicits, t.deps...)
935 args = args + " -templatedir " + t.dir.String()
936 } else {
937 ctx.PropertyErrorf("custom_template", "module %q is not a droiddoc_template", ctx.OtherModuleName(m))
938 }
939 })
940
941 if len(d.properties.Html_dirs) > 0 {
Colin Cross07e51612019-03-05 12:46:40 -0800942 htmlDir := d.properties.Html_dirs[0]
Colin Cross8a497952019-03-05 22:25:09 -0800943 *implicits = append(*implicits, android.PathsForModuleSrc(ctx, []string{filepath.Join(d.properties.Html_dirs[0], "**/*")})...)
Colin Cross07e51612019-03-05 12:46:40 -0800944 args = args + " -htmldir " + htmlDir
Nan Zhanga40da042018-08-01 12:48:00 -0700945 }
946
947 if len(d.properties.Html_dirs) > 1 {
Colin Cross07e51612019-03-05 12:46:40 -0800948 htmlDir2 := d.properties.Html_dirs[1]
Colin Cross8a497952019-03-05 22:25:09 -0800949 *implicits = append(*implicits, android.PathsForModuleSrc(ctx, []string{filepath.Join(htmlDir2, "**/*")})...)
Colin Cross07e51612019-03-05 12:46:40 -0800950 args = args + " -htmldir2 " + htmlDir2
Nan Zhanga40da042018-08-01 12:48:00 -0700951 }
952
953 if len(d.properties.Html_dirs) > 2 {
954 ctx.PropertyErrorf("html_dirs", "Droiddoc only supports up to 2 html dirs")
955 }
956
Colin Cross8a497952019-03-05 22:25:09 -0800957 knownTags := android.PathsForModuleSrc(ctx, d.properties.Knowntags)
Nan Zhanga40da042018-08-01 12:48:00 -0700958 *implicits = append(*implicits, knownTags...)
959
960 for _, kt := range knownTags {
961 args = args + " -knowntags " + kt.String()
962 }
963
964 for _, hdf := range d.properties.Hdf {
965 args = args + " -hdf " + hdf
966 }
967
968 if String(d.properties.Proofread_file) != "" {
969 proofreadFile := android.PathForModuleOut(ctx, String(d.properties.Proofread_file))
970 args = args + " -proofread " + proofreadFile.String()
971 }
972
973 if String(d.properties.Todo_file) != "" {
974 // tricky part:
975 // we should not compute full path for todo_file through PathForModuleOut().
976 // the non-standard doclet will get the full path relative to "-o".
977 args = args + " -todo " + String(d.properties.Todo_file)
978 }
979
980 if String(d.properties.Resourcesdir) != "" {
981 // TODO: should we add files under resourcesDir to the implicits? It seems that
982 // resourcesDir is one sub dir of htmlDir
983 resourcesDir := android.PathForModuleSrc(ctx, String(d.properties.Resourcesdir))
984 args = args + " -resourcesdir " + resourcesDir.String()
985 }
986
987 if String(d.properties.Resourcesoutdir) != "" {
988 // TODO: it seems -resourceoutdir reference/android/images/ didn't get generated anywhere.
989 args = args + " -resourcesoutdir " + String(d.properties.Resourcesoutdir)
990 }
991 return args
992}
993
Nan Zhang1598a9e2018-09-04 17:14:32 -0700994func (d *Droiddoc) collectStubsFlags(ctx android.ModuleContext,
995 implicitOutputs *android.WritablePaths) string {
996 var doclavaFlags string
997 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
998 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
999 String(d.properties.Api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -07001000 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
1001 doclavaFlags += " -api " + d.apiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001002 *implicitOutputs = append(*implicitOutputs, d.apiFile)
1003 d.apiFilePath = d.apiFile
1004 }
1005
Nan Zhang1598a9e2018-09-04 17:14:32 -07001006 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1007 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1008 String(d.properties.Removed_api_filename) != "" {
Nan Zhanga40da042018-08-01 12:48:00 -07001009 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
1010 doclavaFlags += " -removedApi " + d.removedApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001011 *implicitOutputs = append(*implicitOutputs, d.removedApiFile)
1012 }
1013
1014 if String(d.properties.Private_api_filename) != "" {
1015 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
1016 doclavaFlags += " -privateApi " + d.privateApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001017 *implicitOutputs = append(*implicitOutputs, d.privateApiFile)
1018 }
1019
1020 if String(d.properties.Dex_api_filename) != "" {
1021 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
1022 doclavaFlags += " -dexApi " + d.dexApiFile.String()
1023 *implicitOutputs = append(*implicitOutputs, d.dexApiFile)
1024 }
1025
1026 if String(d.properties.Private_dex_api_filename) != "" {
1027 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
1028 doclavaFlags += " -privateDexApi " + d.privateDexApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001029 *implicitOutputs = append(*implicitOutputs, d.privateDexApiFile)
1030 }
1031
1032 if String(d.properties.Removed_dex_api_filename) != "" {
1033 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
1034 doclavaFlags += " -removedDexApi " + d.removedDexApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001035 *implicitOutputs = append(*implicitOutputs, d.removedDexApiFile)
1036 }
1037
1038 if String(d.properties.Exact_api_filename) != "" {
1039 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
1040 doclavaFlags += " -exactApi " + d.exactApiFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001041 *implicitOutputs = append(*implicitOutputs, d.exactApiFile)
1042 }
1043
1044 if String(d.properties.Dex_mapping_filename) != "" {
1045 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
1046 doclavaFlags += " -apiMapping " + d.apiMappingFile.String()
Nan Zhanga40da042018-08-01 12:48:00 -07001047 *implicitOutputs = append(*implicitOutputs, d.apiMappingFile)
1048 }
1049
Nan Zhang66dc2362018-08-14 20:41:04 -07001050 if String(d.properties.Proguard_filename) != "" {
1051 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
1052 doclavaFlags += " -proguard " + d.proguardFile.String()
Nan Zhang66dc2362018-08-14 20:41:04 -07001053 *implicitOutputs = append(*implicitOutputs, d.proguardFile)
1054 }
1055
Nan Zhanga40da042018-08-01 12:48:00 -07001056 if BoolDefault(d.properties.Create_stubs, true) {
Nan Zhangde860a42018-08-08 16:32:21 -07001057 doclavaFlags += " -stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001058 }
1059
1060 if Bool(d.properties.Write_sdk_values) {
Nan Zhangde860a42018-08-08 16:32:21 -07001061 doclavaFlags += " -sdkvalues " + android.PathForModuleOut(ctx, "out").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001062 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001063
1064 return doclavaFlags
Nan Zhanga40da042018-08-01 12:48:00 -07001065}
1066
1067func (d *Droiddoc) getPostDoclavaCmds(ctx android.ModuleContext, implicits *android.Paths) string {
1068 var cmds string
1069 if String(d.properties.Static_doc_index_redirect) != "" {
1070 static_doc_index_redirect := ctx.ExpandSource(String(d.properties.Static_doc_index_redirect),
1071 "static_doc_index_redirect")
1072 *implicits = append(*implicits, static_doc_index_redirect)
1073 cmds = cmds + " && cp " + static_doc_index_redirect.String() + " " +
Nan Zhangde860a42018-08-08 16:32:21 -07001074 android.PathForModuleOut(ctx, "out", "index.html").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001075 }
1076
1077 if String(d.properties.Static_doc_properties) != "" {
1078 static_doc_properties := ctx.ExpandSource(String(d.properties.Static_doc_properties),
1079 "static_doc_properties")
1080 *implicits = append(*implicits, static_doc_properties)
1081 cmds = cmds + " && cp " + static_doc_properties.String() + " " +
Nan Zhangde860a42018-08-08 16:32:21 -07001082 android.PathForModuleOut(ctx, "out", "source.properties").String()
Nan Zhanga40da042018-08-01 12:48:00 -07001083 }
1084 return cmds
1085}
1086
Nan Zhang1598a9e2018-09-04 17:14:32 -07001087func (d *Droiddoc) transformDoclava(ctx android.ModuleContext, implicits android.Paths,
1088 implicitOutputs android.WritablePaths,
1089 bootclasspathArgs, classpathArgs, sourcepathArgs, opts, postDoclavaCmds string) {
1090 ctx.Build(pctx, android.BuildParams{
1091 Rule: javadoc,
1092 Description: "Doclava",
1093 Output: d.Javadoc.stubsSrcJar,
1094 Inputs: d.Javadoc.srcFiles,
1095 Implicits: implicits,
1096 ImplicitOutputs: implicitOutputs,
1097 Args: map[string]string{
1098 "outDir": android.PathForModuleOut(ctx, "out").String(),
1099 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
1100 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
1101 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1102 "opts": opts,
1103 "bootclasspathArgs": bootclasspathArgs,
1104 "classpathArgs": classpathArgs,
1105 "sourcepathArgs": sourcepathArgs,
1106 "docZip": d.Javadoc.docZip.String(),
1107 "postDoclavaCmds": postDoclavaCmds,
1108 },
1109 })
1110}
1111
1112func (d *Droiddoc) transformCheckApi(ctx android.ModuleContext, apiFile, removedApiFile android.Path,
1113 checkApiClasspath classpath, msg, opts string, output android.WritablePath) {
1114 ctx.Build(pctx, android.BuildParams{
1115 Rule: apiCheck,
1116 Description: "Doclava Check API",
1117 Output: output,
1118 Inputs: nil,
1119 Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile},
1120 checkApiClasspath...),
1121 Args: map[string]string{
1122 "msg": msg,
1123 "classpath": checkApiClasspath.FormJavaClassPath(""),
1124 "opts": opts,
1125 "apiFile": apiFile.String(),
1126 "apiFileToCheck": d.apiFile.String(),
1127 "removedApiFile": removedApiFile.String(),
1128 "removedApiFileToCheck": d.removedApiFile.String(),
1129 },
1130 })
1131}
1132
1133func (d *Droiddoc) transformDokka(ctx android.ModuleContext, implicits android.Paths,
1134 classpathArgs, opts string) {
1135 ctx.Build(pctx, android.BuildParams{
1136 Rule: dokka,
1137 Description: "Dokka",
1138 Output: d.Javadoc.stubsSrcJar,
1139 Inputs: d.Javadoc.srcFiles,
1140 Implicits: implicits,
1141 Args: map[string]string{
Nan Zhang3ffc3522018-11-29 10:42:47 -08001142 "outDir": android.PathForModuleOut(ctx, "dokka-out").String(),
1143 "srcJarDir": android.PathForModuleOut(ctx, "dokka-srcjars").String(),
1144 "stubsDir": android.PathForModuleOut(ctx, "dokka-stubsDir").String(),
Nan Zhang1598a9e2018-09-04 17:14:32 -07001145 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1146 "classpathArgs": classpathArgs,
1147 "opts": opts,
1148 "docZip": d.Javadoc.docZip.String(),
1149 },
1150 })
1151}
1152
1153func (d *Droiddoc) GenerateAndroidBuildActions(ctx android.ModuleContext) {
1154 deps := d.Javadoc.collectDeps(ctx)
1155
1156 jsilver := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jsilver.jar")
1157 doclava := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "doclava.jar")
1158 java8Home := ctx.Config().Getenv("ANDROID_JAVA8_HOME")
1159 checkApiClasspath := classpath{jsilver, doclava, android.PathForSource(ctx, java8Home, "lib/tools.jar")}
1160
1161 var implicits android.Paths
1162 implicits = append(implicits, d.Javadoc.srcJars...)
1163 implicits = append(implicits, d.Javadoc.argFiles...)
1164
1165 var implicitOutputs android.WritablePaths
1166 implicitOutputs = append(implicitOutputs, d.Javadoc.docZip)
1167 for _, o := range d.Javadoc.properties.Out {
1168 implicitOutputs = append(implicitOutputs, android.PathForModuleGen(ctx, o))
1169 }
1170
1171 flags, err := d.initBuilderFlags(ctx, &implicits, deps)
1172 if err != nil {
1173 return
1174 }
1175
1176 flags.doclavaStubsFlags = d.collectStubsFlags(ctx, &implicitOutputs)
1177 if Bool(d.properties.Dokka_enabled) {
1178 d.transformDokka(ctx, implicits, flags.classpathArgs, d.Javadoc.args)
1179 } else {
1180 flags.doclavaDocsFlags = d.collectDoclavaDocsFlags(ctx, &implicits, jsilver, doclava)
1181 flags.postDoclavaCmds = d.getPostDoclavaCmds(ctx, &implicits)
1182 d.transformDoclava(ctx, implicits, implicitOutputs, flags.bootClasspathArgs, flags.classpathArgs,
1183 flags.sourcepathArgs, flags.doclavaDocsFlags+flags.doclavaStubsFlags+" "+d.Javadoc.args,
1184 flags.postDoclavaCmds)
1185 }
1186
1187 if apiCheckEnabled(d.properties.Check_api.Current, "current") &&
1188 !ctx.Config().IsPdkBuild() {
1189 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Api_file),
1190 "check_api.current.api_file")
1191 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file),
1192 "check_api.current_removed_api_file")
1193
1194 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
1195 d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
1196 fmt.Sprintf(`\n******************************\n`+
1197 `You have tried to change the API from what has been previously approved.\n\n`+
1198 `To make these errors go away, you have two choices:\n`+
1199 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1200 ` errors above.\n\n`+
1201 ` 2. You can update current.txt by executing the following command:\n`+
1202 ` make %s-update-current-api\n\n`+
1203 ` To submit the revised current.txt to the main Android repository,\n`+
1204 ` you will need approval.\n`+
1205 `******************************\n`, ctx.ModuleName()), String(d.properties.Check_api.Current.Args),
1206 d.checkCurrentApiTimestamp)
1207
1208 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
1209 transformUpdateApi(ctx, apiFile, removedApiFile, d.apiFile, d.removedApiFile,
1210 d.updateCurrentApiTimestamp)
1211 }
1212
1213 if apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") &&
1214 !ctx.Config().IsPdkBuild() {
1215 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1216 "check_api.last_released.api_file")
1217 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file),
1218 "check_api.last_released.removed_api_file")
1219
1220 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
1221 d.transformCheckApi(ctx, apiFile, removedApiFile, checkApiClasspath,
1222 `\n******************************\n`+
1223 `You have tried to change the API from what has been previously released in\n`+
1224 `an SDK. Please fix the errors listed above.\n`+
1225 `******************************\n`, String(d.properties.Check_api.Last_released.Args),
1226 d.checkLastReleasedApiTimestamp)
1227 }
1228}
1229
1230//
1231// Droidstubs
1232//
1233type Droidstubs struct {
1234 Javadoc
1235
Pete Gillin581d6082018-10-22 15:55:04 +01001236 properties DroidstubsProperties
1237 apiFile android.WritablePath
1238 apiXmlFile android.WritablePath
1239 lastReleasedApiXmlFile android.WritablePath
1240 dexApiFile android.WritablePath
1241 privateApiFile android.WritablePath
1242 privateDexApiFile android.WritablePath
1243 removedApiFile android.WritablePath
1244 removedDexApiFile android.WritablePath
1245 apiMappingFile android.WritablePath
1246 exactApiFile android.WritablePath
1247 proguardFile android.WritablePath
1248 nullabilityWarningsFile android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001249
1250 checkCurrentApiTimestamp android.WritablePath
1251 updateCurrentApiTimestamp android.WritablePath
1252 checkLastReleasedApiTimestamp android.WritablePath
1253
Pete Gillin581d6082018-10-22 15:55:04 +01001254 checkNullabilityWarningsTimestamp android.WritablePath
1255
Nan Zhang1598a9e2018-09-04 17:14:32 -07001256 annotationsZip android.WritablePath
Nan Zhang9c69a122018-08-22 10:22:08 -07001257 apiVersionsXml android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001258
1259 apiFilePath android.Path
Nan Zhang71bbe632018-09-17 14:32:21 -07001260
1261 jdiffDocZip android.WritablePath
1262 jdiffStubsSrcJar android.WritablePath
Nan Zhang1598a9e2018-09-04 17:14:32 -07001263}
1264
1265func DroidstubsFactory() android.Module {
1266 module := &Droidstubs{}
1267
1268 module.AddProperties(&module.properties,
1269 &module.Javadoc.properties)
1270
1271 InitDroiddocModule(module, android.HostAndDeviceSupported)
1272 return module
1273}
1274
1275func DroidstubsHostFactory() android.Module {
1276 module := &Droidstubs{}
1277
1278 module.AddProperties(&module.properties,
1279 &module.Javadoc.properties)
1280
1281 InitDroiddocModule(module, android.HostSupported)
1282 return module
1283}
1284
1285func (d *Droidstubs) ApiFilePath() android.Path {
1286 return d.apiFilePath
1287}
1288
1289func (d *Droidstubs) DepsMutator(ctx android.BottomUpMutatorContext) {
1290 d.Javadoc.addDeps(ctx)
1291
Inseob Kim38449af2019-02-28 14:24:05 +09001292 if Bool(d.properties.Check_api.Ignore_missing_latest_api) {
1293 ignoreMissingModules(ctx, &d.properties.Check_api.Last_released)
1294 }
1295
Nan Zhang1598a9e2018-09-04 17:14:32 -07001296 if len(d.properties.Merge_annotations_dirs) != 0 {
1297 for _, mergeAnnotationsDir := range d.properties.Merge_annotations_dirs {
1298 ctx.AddDependency(ctx.Module(), metalavaMergeAnnotationsDirTag, mergeAnnotationsDir)
1299 }
1300 }
Nan Zhang9c69a122018-08-22 10:22:08 -07001301
Pete Gillin77167902018-09-19 18:16:26 +01001302 if len(d.properties.Merge_inclusion_annotations_dirs) != 0 {
1303 for _, mergeInclusionAnnotationsDir := range d.properties.Merge_inclusion_annotations_dirs {
1304 ctx.AddDependency(ctx.Module(), metalavaMergeInclusionAnnotationsDirTag, mergeInclusionAnnotationsDir)
1305 }
1306 }
1307
Nan Zhang9c69a122018-08-22 10:22:08 -07001308 if len(d.properties.Api_levels_annotations_dirs) != 0 {
1309 for _, apiLevelsAnnotationsDir := range d.properties.Api_levels_annotations_dirs {
1310 ctx.AddDependency(ctx.Module(), metalavaAPILevelsAnnotationsDirTag, apiLevelsAnnotationsDir)
1311 }
1312 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001313}
1314
1315func (d *Droidstubs) initBuilderFlags(ctx android.ModuleContext, implicits *android.Paths,
1316 deps deps) (droiddocBuilderFlags, error) {
1317 var flags droiddocBuilderFlags
1318
1319 *implicits = append(*implicits, deps.bootClasspath...)
1320 *implicits = append(*implicits, deps.classpath...)
1321
1322 // continue to use -bootclasspath even if Metalava under -source 1.9 is enabled
1323 // since it doesn't support system modules yet.
1324 if len(deps.bootClasspath.Strings()) > 0 {
1325 // For OpenJDK 8 we can use -bootclasspath to define the core libraries code.
1326 flags.bootClasspathArgs = deps.bootClasspath.FormJavaClassPath("-bootclasspath")
1327 }
1328 flags.classpathArgs = deps.classpath.FormJavaClassPath("-classpath")
1329
Sundong Ahn56dce442018-10-05 18:41:09 +09001330 flags.sourcepathArgs = "-sourcepath \"" + strings.Join(d.Javadoc.sourcepaths.Strings(), ":") + "\""
Nan Zhang1598a9e2018-09-04 17:14:32 -07001331 return flags, nil
1332}
1333
1334func (d *Droidstubs) collectStubsFlags(ctx android.ModuleContext,
1335 implicitOutputs *android.WritablePaths) string {
1336 var metalavaFlags string
1337 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1338 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1339 String(d.properties.Api_filename) != "" {
1340 d.apiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.txt")
1341 metalavaFlags = metalavaFlags + " --api " + d.apiFile.String()
1342 *implicitOutputs = append(*implicitOutputs, d.apiFile)
1343 d.apiFilePath = d.apiFile
1344 }
1345
1346 if apiCheckEnabled(d.properties.Check_api.Current, "current") ||
1347 apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") ||
1348 String(d.properties.Removed_api_filename) != "" {
1349 d.removedApiFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_removed.txt")
1350 metalavaFlags = metalavaFlags + " --removed-api " + d.removedApiFile.String()
1351 *implicitOutputs = append(*implicitOutputs, d.removedApiFile)
1352 }
1353
1354 if String(d.properties.Private_api_filename) != "" {
1355 d.privateApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_api_filename))
1356 metalavaFlags = metalavaFlags + " --private-api " + d.privateApiFile.String()
1357 *implicitOutputs = append(*implicitOutputs, d.privateApiFile)
1358 }
1359
1360 if String(d.properties.Dex_api_filename) != "" {
1361 d.dexApiFile = android.PathForModuleOut(ctx, String(d.properties.Dex_api_filename))
1362 metalavaFlags += " --dex-api " + d.dexApiFile.String()
1363 *implicitOutputs = append(*implicitOutputs, d.dexApiFile)
1364 }
1365
1366 if String(d.properties.Private_dex_api_filename) != "" {
1367 d.privateDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Private_dex_api_filename))
1368 metalavaFlags = metalavaFlags + " --private-dex-api " + d.privateDexApiFile.String()
1369 *implicitOutputs = append(*implicitOutputs, d.privateDexApiFile)
1370 }
1371
1372 if String(d.properties.Removed_dex_api_filename) != "" {
1373 d.removedDexApiFile = android.PathForModuleOut(ctx, String(d.properties.Removed_dex_api_filename))
1374 metalavaFlags = metalavaFlags + " --removed-dex-api " + d.removedDexApiFile.String()
1375 *implicitOutputs = append(*implicitOutputs, d.removedDexApiFile)
1376 }
1377
1378 if String(d.properties.Exact_api_filename) != "" {
1379 d.exactApiFile = android.PathForModuleOut(ctx, String(d.properties.Exact_api_filename))
1380 metalavaFlags = metalavaFlags + " --exact-api " + d.exactApiFile.String()
1381 *implicitOutputs = append(*implicitOutputs, d.exactApiFile)
1382 }
1383
Nan Zhang9c69a122018-08-22 10:22:08 -07001384 if String(d.properties.Dex_mapping_filename) != "" {
1385 d.apiMappingFile = android.PathForModuleOut(ctx, String(d.properties.Dex_mapping_filename))
1386 metalavaFlags = metalavaFlags + " --dex-api-mapping " + d.apiMappingFile.String()
1387 *implicitOutputs = append(*implicitOutputs, d.apiMappingFile)
1388 }
1389
Nan Zhang199645c2018-09-19 12:40:06 -07001390 if String(d.properties.Proguard_filename) != "" {
1391 d.proguardFile = android.PathForModuleOut(ctx, String(d.properties.Proguard_filename))
1392 metalavaFlags += " --proguard " + d.proguardFile.String()
1393 *implicitOutputs = append(*implicitOutputs, d.proguardFile)
1394 }
1395
Nan Zhang9c69a122018-08-22 10:22:08 -07001396 if Bool(d.properties.Write_sdk_values) {
1397 metalavaFlags = metalavaFlags + " --sdk-values " + android.PathForModuleOut(ctx, "out").String()
1398 }
1399
Nan Zhang1598a9e2018-09-04 17:14:32 -07001400 if Bool(d.properties.Create_doc_stubs) {
1401 metalavaFlags += " --doc-stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
1402 } else {
1403 metalavaFlags += " --stubs " + android.PathForModuleOut(ctx, "stubsDir").String()
1404 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001405 return metalavaFlags
1406}
1407
1408func (d *Droidstubs) collectAnnotationsFlags(ctx android.ModuleContext,
Nan Zhangdee152b2018-12-26 16:06:37 -08001409 implicits *android.Paths, implicitOutputs *android.WritablePaths) (string, string) {
1410 var flags, mergeAnnoDirFlags string
Nan Zhang1598a9e2018-09-04 17:14:32 -07001411 if Bool(d.properties.Annotations_enabled) {
Pete Gillina262c052018-09-14 14:25:48 +01001412 flags += " --include-annotations"
Pete Gillinc382a562018-11-14 18:45:46 +00001413 validatingNullability :=
1414 strings.Contains(d.Javadoc.args, "--validate-nullability-from-merged-stubs") ||
1415 String(d.properties.Validate_nullability_from_list) != ""
Pete Gillina262c052018-09-14 14:25:48 +01001416 migratingNullability := String(d.properties.Previous_api) != ""
1417 if !(migratingNullability || validatingNullability) {
1418 ctx.PropertyErrorf("previous_api",
1419 "has to be non-empty if annotations was enabled (unless validating nullability)")
Nan Zhanga40da042018-08-01 12:48:00 -07001420 }
Pete Gillina262c052018-09-14 14:25:48 +01001421 if migratingNullability {
Colin Cross8a497952019-03-05 22:25:09 -08001422 previousApi := android.PathForModuleSrc(ctx, String(d.properties.Previous_api))
Pete Gillina262c052018-09-14 14:25:48 +01001423 *implicits = append(*implicits, previousApi)
1424 flags += " --migrate-nullness " + previousApi.String()
1425 }
Pete Gillinc382a562018-11-14 18:45:46 +00001426 if s := String(d.properties.Validate_nullability_from_list); s != "" {
Colin Cross8a497952019-03-05 22:25:09 -08001427 flags += " --validate-nullability-from-list " + android.PathForModuleSrc(ctx, s).String()
Pete Gillinc382a562018-11-14 18:45:46 +00001428 }
Pete Gillina262c052018-09-14 14:25:48 +01001429 if validatingNullability {
Pete Gillin581d6082018-10-22 15:55:04 +01001430 d.nullabilityWarningsFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_nullability_warnings.txt")
1431 *implicitOutputs = append(*implicitOutputs, d.nullabilityWarningsFile)
1432 flags += " --nullability-warnings-txt " + d.nullabilityWarningsFile.String()
Pete Gillina262c052018-09-14 14:25:48 +01001433 }
Nan Zhanga40da042018-08-01 12:48:00 -07001434
1435 d.annotationsZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"_annotations.zip")
1436 *implicitOutputs = append(*implicitOutputs, d.annotationsZip)
1437
Nan Zhangf4936b02018-08-01 15:00:28 -07001438 flags += " --extract-annotations " + d.annotationsZip.String()
1439
Nan Zhang1598a9e2018-09-04 17:14:32 -07001440 if len(d.properties.Merge_annotations_dirs) == 0 {
Nan Zhang9c69a122018-08-22 10:22:08 -07001441 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhanga40da042018-08-01 12:48:00 -07001442 "has to be non-empty if annotations was enabled!")
1443 }
Nan Zhangf4936b02018-08-01 15:00:28 -07001444 ctx.VisitDirectDepsWithTag(metalavaMergeAnnotationsDirTag, func(m android.Module) {
1445 if t, ok := m.(*ExportedDroiddocDir); ok {
1446 *implicits = append(*implicits, t.deps...)
Nan Zhangdee152b2018-12-26 16:06:37 -08001447 mergeAnnoDirFlags += " --merge-qualifier-annotations " + t.dir.String()
Nan Zhangf4936b02018-08-01 15:00:28 -07001448 } else {
Nan Zhang9c69a122018-08-22 10:22:08 -07001449 ctx.PropertyErrorf("merge_annotations_dirs",
Nan Zhangf4936b02018-08-01 15:00:28 -07001450 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1451 }
1452 })
Nan Zhangdee152b2018-12-26 16:06:37 -08001453 flags += mergeAnnoDirFlags
Nan Zhanga40da042018-08-01 12:48:00 -07001454 // TODO(tnorbye): find owners to fix these warnings when annotation was enabled.
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001455 flags += " --hide HiddenTypedefConstant --hide SuperfluousPrefix --hide AnnotationExtraction"
Nan Zhanga40da042018-08-01 12:48:00 -07001456 }
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001457
Nan Zhangdee152b2018-12-26 16:06:37 -08001458 return flags, mergeAnnoDirFlags
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001459}
1460
1461func (d *Droidstubs) collectInclusionAnnotationsFlags(ctx android.ModuleContext,
1462 implicits *android.Paths, implicitOutputs *android.WritablePaths) string {
1463 var flags string
Pete Gillin77167902018-09-19 18:16:26 +01001464 ctx.VisitDirectDepsWithTag(metalavaMergeInclusionAnnotationsDirTag, func(m android.Module) {
1465 if t, ok := m.(*ExportedDroiddocDir); ok {
1466 *implicits = append(*implicits, t.deps...)
1467 flags += " --merge-inclusion-annotations " + t.dir.String()
1468 } else {
1469 ctx.PropertyErrorf("merge_inclusion_annotations_dirs",
1470 "module %q is not a metalava merge-annotations dir", ctx.OtherModuleName(m))
1471 }
1472 })
Nan Zhanga40da042018-08-01 12:48:00 -07001473
1474 return flags
1475}
1476
Nan Zhang9c69a122018-08-22 10:22:08 -07001477func (d *Droidstubs) collectAPILevelsAnnotationsFlags(ctx android.ModuleContext,
1478 implicits *android.Paths, implicitOutputs *android.WritablePaths) string {
1479 var flags string
1480 if Bool(d.properties.Api_levels_annotations_enabled) {
1481 d.apiVersionsXml = android.PathForModuleOut(ctx, "api-versions.xml")
1482 *implicitOutputs = append(*implicitOutputs, d.apiVersionsXml)
1483
1484 if len(d.properties.Api_levels_annotations_dirs) == 0 {
1485 ctx.PropertyErrorf("api_levels_annotations_dirs",
1486 "has to be non-empty if api levels annotations was enabled!")
1487 }
1488
1489 flags = " --generate-api-levels " + d.apiVersionsXml.String() + " --apply-api-levels " +
1490 d.apiVersionsXml.String() + " --current-version " + ctx.Config().PlatformSdkVersion() +
1491 " --current-codename " + ctx.Config().PlatformSdkCodename() + " "
1492
1493 ctx.VisitDirectDepsWithTag(metalavaAPILevelsAnnotationsDirTag, func(m android.Module) {
1494 if t, ok := m.(*ExportedDroiddocDir); ok {
1495 var androidJars android.Paths
1496 for _, dep := range t.deps {
1497 if strings.HasSuffix(dep.String(), "android.jar") {
1498 androidJars = append(androidJars, dep)
1499 }
1500 }
1501 *implicits = append(*implicits, androidJars...)
Tor Norbyeebcdfed2019-01-24 11:05:46 -08001502 flags += " --android-jar-pattern " + t.dir.String() + "/%/public/android.jar "
Nan Zhang9c69a122018-08-22 10:22:08 -07001503 } else {
1504 ctx.PropertyErrorf("api_levels_annotations_dirs",
1505 "module %q is not a metalava api-levels-annotations dir", ctx.OtherModuleName(m))
1506 }
1507 })
1508
1509 }
1510
1511 return flags
1512}
1513
Nan Zhang71bbe632018-09-17 14:32:21 -07001514func (d *Droidstubs) collectApiToXmlFlags(ctx android.ModuleContext, implicits *android.Paths,
1515 implicitOutputs *android.WritablePaths) string {
1516 var flags string
1517 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1518 if d.apiFile.String() == "" {
1519 ctx.ModuleErrorf("API signature file has to be specified in Metalava when jdiff is enabled.")
1520 }
1521
1522 d.apiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_api.xml")
1523 *implicitOutputs = append(*implicitOutputs, d.apiXmlFile)
1524
1525 flags = " --api-xml " + d.apiXmlFile.String()
1526
1527 if String(d.properties.Check_api.Last_released.Api_file) == "" {
1528 ctx.PropertyErrorf("check_api.last_released.api_file",
1529 "has to be non-empty if jdiff was enabled!")
1530 }
1531 lastReleasedApi := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1532 "check_api.last_released.api_file")
1533 *implicits = append(*implicits, lastReleasedApi)
1534
1535 d.lastReleasedApiXmlFile = android.PathForModuleOut(ctx, ctx.ModuleName()+"_last_released_api.xml")
1536 *implicitOutputs = append(*implicitOutputs, d.lastReleasedApiXmlFile)
1537
1538 flags += " --convert-to-jdiff " + lastReleasedApi.String() + " " +
1539 d.lastReleasedApiXmlFile.String()
1540 }
1541
1542 return flags
1543}
1544
Nan Zhang1598a9e2018-09-04 17:14:32 -07001545func (d *Droidstubs) transformMetalava(ctx android.ModuleContext, implicits android.Paths,
1546 implicitOutputs android.WritablePaths, javaVersion,
1547 bootclasspathArgs, classpathArgs, sourcepathArgs, opts string) {
Nan Zhang9c69a122018-08-22 10:22:08 -07001548
Nan Zhang86d2d552018-08-09 15:33:27 -07001549 ctx.Build(pctx, android.BuildParams{
1550 Rule: metalava,
1551 Description: "Metalava",
1552 Output: d.Javadoc.stubsSrcJar,
1553 Inputs: d.Javadoc.srcFiles,
1554 Implicits: implicits,
1555 ImplicitOutputs: implicitOutputs,
1556 Args: map[string]string{
Nan Zhang86d2d552018-08-09 15:33:27 -07001557 "outDir": android.PathForModuleOut(ctx, "out").String(),
1558 "srcJarDir": android.PathForModuleOut(ctx, "srcjars").String(),
1559 "stubsDir": android.PathForModuleOut(ctx, "stubsDir").String(),
1560 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
Nan Zhang1598a9e2018-09-04 17:14:32 -07001561 "javaVersion": javaVersion,
Nan Zhang86d2d552018-08-09 15:33:27 -07001562 "bootclasspathArgs": bootclasspathArgs,
1563 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -07001564 "sourcepathArgs": sourcepathArgs,
1565 "opts": opts,
Nan Zhang86d2d552018-08-09 15:33:27 -07001566 },
1567 })
1568}
1569
Nan Zhang1598a9e2018-09-04 17:14:32 -07001570func (d *Droidstubs) transformCheckApi(ctx android.ModuleContext,
1571 apiFile, removedApiFile android.Path, implicits android.Paths,
Colin Cross39c16792019-01-24 16:32:44 -08001572 javaVersion, bootclasspathArgs, classpathArgs, sourcepathArgs, opts, subdir, msg string,
Nan Zhang2760dfc2018-08-24 17:32:54 +00001573 output android.WritablePath) {
1574 ctx.Build(pctx, android.BuildParams{
1575 Rule: metalavaApiCheck,
1576 Description: "Metalava Check API",
1577 Output: output,
1578 Inputs: d.Javadoc.srcFiles,
1579 Implicits: append(android.Paths{apiFile, removedApiFile, d.apiFile, d.removedApiFile},
1580 implicits...),
1581 Args: map[string]string{
Colin Cross39c16792019-01-24 16:32:44 -08001582 "srcJarDir": android.PathForModuleOut(ctx, subdir, "srcjars").String(),
Nan Zhang2760dfc2018-08-24 17:32:54 +00001583 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1584 "javaVersion": javaVersion,
1585 "bootclasspathArgs": bootclasspathArgs,
1586 "classpathArgs": classpathArgs,
Nan Zhang1598a9e2018-09-04 17:14:32 -07001587 "sourcepathArgs": sourcepathArgs,
Nan Zhang2760dfc2018-08-24 17:32:54 +00001588 "opts": opts,
1589 "msg": msg,
1590 },
1591 })
1592}
1593
Nan Zhang71bbe632018-09-17 14:32:21 -07001594func (d *Droidstubs) transformJdiff(ctx android.ModuleContext, implicits android.Paths,
1595 implicitOutputs android.WritablePaths,
1596 bootclasspathArgs, classpathArgs, sourcepathArgs, opts string) {
1597 ctx.Build(pctx, android.BuildParams{
1598 Rule: javadoc,
1599 Description: "Jdiff",
1600 Output: d.jdiffStubsSrcJar,
1601 Inputs: d.Javadoc.srcFiles,
1602 Implicits: implicits,
1603 ImplicitOutputs: implicitOutputs,
1604 Args: map[string]string{
Nan Zhang23a1ba62018-09-19 11:19:39 -07001605 "outDir": android.PathForModuleOut(ctx, "jdiff-out").String(),
1606 "srcJarDir": android.PathForModuleOut(ctx, "jdiff-srcjars").String(),
1607 "stubsDir": android.PathForModuleOut(ctx, "jdiff-stubsDir").String(),
Nan Zhang71bbe632018-09-17 14:32:21 -07001608 "srcJars": strings.Join(d.Javadoc.srcJars.Strings(), " "),
1609 "opts": opts,
1610 "bootclasspathArgs": bootclasspathArgs,
1611 "classpathArgs": classpathArgs,
1612 "sourcepathArgs": sourcepathArgs,
1613 "docZip": d.jdiffDocZip.String(),
1614 },
1615 })
1616}
1617
Nan Zhang1598a9e2018-09-04 17:14:32 -07001618func (d *Droidstubs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Nan Zhanga40da042018-08-01 12:48:00 -07001619 deps := d.Javadoc.collectDeps(ctx)
1620
1621 javaVersion := getJavaVersion(ctx, String(d.Javadoc.properties.Java_version), sdkContext(d))
Nan Zhang581fd212018-01-10 16:06:12 -08001622
Nan Zhanga40da042018-08-01 12:48:00 -07001623 var implicits android.Paths
1624 implicits = append(implicits, d.Javadoc.srcJars...)
Nan Zhang1598a9e2018-09-04 17:14:32 -07001625 implicits = append(implicits, d.Javadoc.argFiles...)
Nan Zhanga40da042018-08-01 12:48:00 -07001626
1627 var implicitOutputs android.WritablePaths
Nan Zhang1598a9e2018-09-04 17:14:32 -07001628 for _, o := range d.Javadoc.properties.Out {
Nan Zhanga40da042018-08-01 12:48:00 -07001629 implicitOutputs = append(implicitOutputs, android.PathForModuleGen(ctx, o))
1630 }
1631
1632 flags, err := d.initBuilderFlags(ctx, &implicits, deps)
Nan Zhang2760dfc2018-08-24 17:32:54 +00001633 metalavaCheckApiImplicits := implicits
Nan Zhang71bbe632018-09-17 14:32:21 -07001634 jdiffImplicits := implicits
1635
Nan Zhanga40da042018-08-01 12:48:00 -07001636 if err != nil {
1637 return
1638 }
1639
Nan Zhang1598a9e2018-09-04 17:14:32 -07001640 flags.metalavaStubsFlags = d.collectStubsFlags(ctx, &implicitOutputs)
Nan Zhangdee152b2018-12-26 16:06:37 -08001641 flags.metalavaAnnotationsFlags, flags.metalavaMergeAnnoDirFlags =
1642 d.collectAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001643 flags.metalavaInclusionAnnotationsFlags = d.collectInclusionAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Nan Zhang9c69a122018-08-22 10:22:08 -07001644 flags.metalavaApiLevelsAnnotationsFlags = d.collectAPILevelsAnnotationsFlags(ctx, &implicits, &implicitOutputs)
Nan Zhang71bbe632018-09-17 14:32:21 -07001645 flags.metalavaApiToXmlFlags = d.collectApiToXmlFlags(ctx, &implicits, &implicitOutputs)
1646
Nan Zhang1598a9e2018-09-04 17:14:32 -07001647 if strings.Contains(d.Javadoc.args, "--generate-documentation") {
1648 // Currently Metalava have the ability to invoke Javadoc in a seperate process.
1649 // Pass "-nodocs" to suppress the Javadoc invocation when Metalava receives
1650 // "--generate-documentation" arg. This is not needed when Metalava removes this feature.
1651 d.Javadoc.args = d.Javadoc.args + " -nodocs "
Nan Zhang79614d12018-04-19 18:03:39 -07001652 }
Nan Zhang1598a9e2018-09-04 17:14:32 -07001653 d.transformMetalava(ctx, implicits, implicitOutputs, javaVersion,
1654 flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs,
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001655 flags.metalavaStubsFlags+flags.metalavaAnnotationsFlags+flags.metalavaInclusionAnnotationsFlags+
Nan Zhang71bbe632018-09-17 14:32:21 -07001656 flags.metalavaApiLevelsAnnotationsFlags+flags.metalavaApiToXmlFlags+" "+d.Javadoc.args)
Nan Zhang61819ce2018-05-04 18:49:16 -07001657
Nan Zhang1598a9e2018-09-04 17:14:32 -07001658 if apiCheckEnabled(d.properties.Check_api.Current, "current") &&
1659 !ctx.Config().IsPdkBuild() {
Nan Zhang61819ce2018-05-04 18:49:16 -07001660 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Api_file),
1661 "check_api.current.api_file")
1662 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Current.Removed_api_file),
1663 "check_api.current_removed_api_file")
1664
Nan Zhang2760dfc2018-08-24 17:32:54 +00001665 d.checkCurrentApiTimestamp = android.PathForModuleOut(ctx, "check_current_api.timestamp")
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001666 opts := " " + d.Javadoc.args + " --check-compatibility:api:current " + apiFile.String() +
1667 " --check-compatibility:removed:current " + removedApiFile.String() +
Nan Zhangdee152b2018-12-26 16:06:37 -08001668 flags.metalavaInclusionAnnotationsFlags + flags.metalavaMergeAnnoDirFlags + " "
Nan Zhang2760dfc2018-08-24 17:32:54 +00001669
Nan Zhang1598a9e2018-09-04 17:14:32 -07001670 d.transformCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits,
Colin Cross39c16792019-01-24 16:32:44 -08001671 javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "current-apicheck",
Nan Zhang1598a9e2018-09-04 17:14:32 -07001672 fmt.Sprintf(`\n******************************\n`+
1673 `You have tried to change the API from what has been previously approved.\n\n`+
1674 `To make these errors go away, you have two choices:\n`+
1675 ` 1. You can add '@hide' javadoc comments to the methods, etc. listed in the\n`+
1676 ` errors above.\n\n`+
1677 ` 2. You can update current.txt by executing the following command:\n`+
1678 ` make %s-update-current-api\n\n`+
1679 ` To submit the revised current.txt to the main Android repository,\n`+
1680 ` you will need approval.\n`+
1681 `******************************\n`, ctx.ModuleName()),
1682 d.checkCurrentApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001683
1684 d.updateCurrentApiTimestamp = android.PathForModuleOut(ctx, "update_current_api.timestamp")
Nan Zhang1598a9e2018-09-04 17:14:32 -07001685 transformUpdateApi(ctx, apiFile, removedApiFile, d.apiFile, d.removedApiFile,
1686 d.updateCurrentApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001687 }
Nan Zhanga40da042018-08-01 12:48:00 -07001688
Nan Zhang1598a9e2018-09-04 17:14:32 -07001689 if apiCheckEnabled(d.properties.Check_api.Last_released, "last_released") &&
1690 !ctx.Config().IsPdkBuild() {
Nan Zhang61819ce2018-05-04 18:49:16 -07001691 apiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Api_file),
1692 "check_api.last_released.api_file")
1693 removedApiFile := ctx.ExpandSource(String(d.properties.Check_api.Last_released.Removed_api_file),
1694 "check_api.last_released.removed_api_file")
1695
Nan Zhang2760dfc2018-08-24 17:32:54 +00001696 d.checkLastReleasedApiTimestamp = android.PathForModuleOut(ctx, "check_last_released_api.timestamp")
Neil Fullerb2f14ec2018-10-21 22:13:19 +01001697 opts := " " + d.Javadoc.args + " --check-compatibility:api:released " + apiFile.String() +
1698 flags.metalavaInclusionAnnotationsFlags + " --check-compatibility:removed:released " +
Nan Zhangdee152b2018-12-26 16:06:37 -08001699 removedApiFile.String() + flags.metalavaMergeAnnoDirFlags + " "
Nan Zhang2760dfc2018-08-24 17:32:54 +00001700
Nan Zhang1598a9e2018-09-04 17:14:32 -07001701 d.transformCheckApi(ctx, apiFile, removedApiFile, metalavaCheckApiImplicits,
Colin Cross39c16792019-01-24 16:32:44 -08001702 javaVersion, flags.bootClasspathArgs, flags.classpathArgs, flags.sourcepathArgs, opts, "last-apicheck",
Nan Zhang1598a9e2018-09-04 17:14:32 -07001703 `\n******************************\n`+
1704 `You have tried to change the API from what has been previously released in\n`+
1705 `an SDK. Please fix the errors listed above.\n`+
1706 `******************************\n`,
1707 d.checkLastReleasedApiTimestamp)
Nan Zhang61819ce2018-05-04 18:49:16 -07001708 }
Nan Zhang71bbe632018-09-17 14:32:21 -07001709
Pete Gillin581d6082018-10-22 15:55:04 +01001710 if String(d.properties.Check_nullability_warnings) != "" {
1711 if d.nullabilityWarningsFile == nil {
1712 ctx.PropertyErrorf("check_nullability_warnings",
1713 "Cannot specify check_nullability_warnings unless validating nullability")
1714 }
1715 checkNullabilityWarnings := ctx.ExpandSource(String(d.properties.Check_nullability_warnings),
1716 "check_nullability_warnings")
1717 d.checkNullabilityWarningsTimestamp = android.PathForModuleOut(ctx, "check_nullability_warnings.timestamp")
1718 msg := fmt.Sprintf(`\n******************************\n`+
1719 `The warnings encountered during nullability annotation validation did\n`+
1720 `not match the checked in file of expected warnings. The diffs are shown\n`+
1721 `above. You have two options:\n`+
1722 ` 1. Resolve the differences by editing the nullability annotations.\n`+
1723 ` 2. Update the file of expected warnings by running:\n`+
1724 ` cp %s %s\n`+
1725 ` and submitting the updated file as part of your change.`,
1726 d.nullabilityWarningsFile, checkNullabilityWarnings)
1727 ctx.Build(pctx, android.BuildParams{
1728 Rule: nullabilityWarningsCheck,
1729 Description: "Nullability Warnings Check",
1730 Output: d.checkNullabilityWarningsTimestamp,
1731 Implicits: android.Paths{checkNullabilityWarnings, d.nullabilityWarningsFile},
1732 Args: map[string]string{
1733 "expected": checkNullabilityWarnings.String(),
1734 "actual": d.nullabilityWarningsFile.String(),
1735 "msg": msg,
1736 },
1737 })
1738 }
1739
Nan Zhang71bbe632018-09-17 14:32:21 -07001740 if Bool(d.properties.Jdiff_enabled) && !ctx.Config().IsPdkBuild() {
1741
Nan Zhang86b06202018-09-21 17:09:21 -07001742 // Please sync with android-api-council@ before making any changes for the name of jdiffDocZip below
1743 // since there's cron job downstream that fetch this .zip file periodically.
1744 // See b/116221385 for reference.
Nan Zhang71bbe632018-09-17 14:32:21 -07001745 d.jdiffDocZip = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-docs.zip")
1746 d.jdiffStubsSrcJar = android.PathForModuleOut(ctx, ctx.ModuleName()+"-"+"jdiff-stubs.srcjar")
1747
1748 var jdiffImplicitOutputs android.WritablePaths
1749 jdiffImplicitOutputs = append(jdiffImplicitOutputs, d.jdiffDocZip)
1750
1751 jdiff := android.PathForOutput(ctx, "host", ctx.Config().PrebuiltOS(), "framework", "jdiff.jar")
1752 jdiffImplicits = append(jdiffImplicits, android.Paths{jdiff, d.apiXmlFile, d.lastReleasedApiXmlFile}...)
1753
Pete Gillin2b1ea2e2019-06-10 14:20:11 +01001754 opts := " -source 1.8 -J-Xmx1600m -XDignore.symbol.file " +
Nan Zhang71bbe632018-09-17 14:32:21 -07001755 "-doclet jdiff.JDiff -docletpath " + jdiff.String() + " -quiet " +
1756 "-newapi " + strings.TrimSuffix(d.apiXmlFile.Base(), d.apiXmlFile.Ext()) +
1757 " -newapidir " + filepath.Dir(d.apiXmlFile.String()) +
1758 " -oldapi " + strings.TrimSuffix(d.lastReleasedApiXmlFile.Base(), d.lastReleasedApiXmlFile.Ext()) +
1759 " -oldapidir " + filepath.Dir(d.lastReleasedApiXmlFile.String())
1760
1761 d.transformJdiff(ctx, jdiffImplicits, jdiffImplicitOutputs, flags.bootClasspathArgs, flags.classpathArgs,
1762 flags.sourcepathArgs, opts)
1763 }
Nan Zhang581fd212018-01-10 16:06:12 -08001764}
Dan Willemsencc090972018-02-26 14:33:31 -08001765
Nan Zhanga40da042018-08-01 12:48:00 -07001766//
Nan Zhangf4936b02018-08-01 15:00:28 -07001767// Exported Droiddoc Directory
Nan Zhanga40da042018-08-01 12:48:00 -07001768//
Dan Willemsencc090972018-02-26 14:33:31 -08001769var droiddocTemplateTag = dependencyTag{name: "droiddoc-template"}
Nan Zhangf4936b02018-08-01 15:00:28 -07001770var metalavaMergeAnnotationsDirTag = dependencyTag{name: "metalava-merge-annotations-dir"}
Pete Gillin77167902018-09-19 18:16:26 +01001771var metalavaMergeInclusionAnnotationsDirTag = dependencyTag{name: "metalava-merge-inclusion-annotations-dir"}
Nan Zhang9c69a122018-08-22 10:22:08 -07001772var metalavaAPILevelsAnnotationsDirTag = dependencyTag{name: "metalava-api-levels-annotations-dir"}
Dan Willemsencc090972018-02-26 14:33:31 -08001773
Nan Zhangf4936b02018-08-01 15:00:28 -07001774type ExportedDroiddocDirProperties struct {
1775 // path to the directory containing Droiddoc related files.
Dan Willemsencc090972018-02-26 14:33:31 -08001776 Path *string
1777}
1778
Nan Zhangf4936b02018-08-01 15:00:28 -07001779type ExportedDroiddocDir struct {
Dan Willemsencc090972018-02-26 14:33:31 -08001780 android.ModuleBase
1781
Nan Zhangf4936b02018-08-01 15:00:28 -07001782 properties ExportedDroiddocDirProperties
Dan Willemsencc090972018-02-26 14:33:31 -08001783
1784 deps android.Paths
1785 dir android.Path
1786}
1787
Nan Zhangf4936b02018-08-01 15:00:28 -07001788func ExportedDroiddocDirFactory() android.Module {
1789 module := &ExportedDroiddocDir{}
Dan Willemsencc090972018-02-26 14:33:31 -08001790 module.AddProperties(&module.properties)
1791 android.InitAndroidModule(module)
1792 return module
1793}
1794
Nan Zhangf4936b02018-08-01 15:00:28 -07001795func (d *ExportedDroiddocDir) DepsMutator(android.BottomUpMutatorContext) {}
Dan Willemsencc090972018-02-26 14:33:31 -08001796
Nan Zhangf4936b02018-08-01 15:00:28 -07001797func (d *ExportedDroiddocDir) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Colin Cross07e51612019-03-05 12:46:40 -08001798 path := String(d.properties.Path)
1799 d.dir = android.PathForModuleSrc(ctx, path)
Colin Cross8a497952019-03-05 22:25:09 -08001800 d.deps = android.PathsForModuleSrc(ctx, []string{filepath.Join(path, "**/*")})
Dan Willemsencc090972018-02-26 14:33:31 -08001801}
Nan Zhangb2b33de2018-02-23 11:18:47 -08001802
1803//
1804// Defaults
1805//
1806type DocDefaults struct {
1807 android.ModuleBase
1808 android.DefaultsModuleBase
1809}
1810
Nan Zhangb2b33de2018-02-23 11:18:47 -08001811func DocDefaultsFactory() android.Module {
1812 module := &DocDefaults{}
1813
1814 module.AddProperties(
1815 &JavadocProperties{},
1816 &DroiddocProperties{},
1817 )
1818
1819 android.InitDefaultsModule(module)
1820
1821 return module
1822}
Nan Zhang1598a9e2018-09-04 17:14:32 -07001823
1824func StubsDefaultsFactory() android.Module {
1825 module := &DocDefaults{}
1826
1827 module.AddProperties(
1828 &JavadocProperties{},
1829 &DroidstubsProperties{},
1830 )
1831
1832 android.InitDefaultsModule(module)
1833
1834 return module
1835}