blob: 6ffd67b93b1cc2431490dfd626d9f933a96135db [file] [view] [edit]
# Java Flag Generator
Generates a Java class with typed accessors for the features that a C++
feature list exposes to Java through `kFeaturesExposedToJava`.
For each `&namespace::kFoo` in the array, the generated class contains:
```java
/** {@code ns::kFoo} */
public static final class Foo {
public static final String NAME = "FooFeatureName";
public static boolean isEnabled() {
return isFeatureEnabled(NAME);
}
}
```
`NAME` is the feature name string from the feature's definition
(`BASE_FEATURE(kFoo, "FooFeatureName", ...)`), not a name derived from the
identifier.
## Usage
```gn
import("//base/android/java_flag_generator/java_flag_generator.gni")
java_flag_generator("java_flags") {
sources = [ "android/chrome_feature_list.cc" ]
class_name = "org.chromium.chrome.browser.flags.ChromeFeatures"
}
android_library("java") {
srcjar_deps = [ ":java_flags" ]
...
}
```
List the target in the `srcjar_deps` of exactly one `android_library()`;
others should depend on that library.
### Variables
* `sources`: C++ files that define `kFeaturesExposedToJava`.
* `class_name`: Fully-qualified name of the generated class.
* `feature_map_class_name` (optional): `FeatureMap` subclass used by all
sources. By default, each source's map is derived from its
`JNI_<Name>_GetNativeMap` function and assumed to be in the package of
`class_name`.
* `deps` (optional): Must include the targets that generate any generated
`FEATURE_DEFINITION_FILE`s.
With a single `FeatureMap`, the generated helper is `isFeatureEnabled()`. With
several (multiple sources backed by different maps), there is one helper per
map, named `isFeatureEnabledIn<FeatureMapName>()`.
## Finding feature definitions
For each feature in kFeaturesExposedToJava, the generator looks for feature
definitions in:
1. The source itself.
2. For each quoted `#include "path/foo.h"`, the file `path/foo.cc`. The path is
tried relative to the source root, then relative to the including file.
3. Files listed in `FEATURE_DEFINITION_FILE` directives.
If a feature's definition can't be found, the build fails. Fix it by adding a
directive to the source naming the file that defines the feature:
```c++
// FEATURE_DEFINITION_FILE: //third_party/blink/common/features.cc
```
Directive paths are looked up in the source tree first, then in
`$root_gen_dir`. For a generated file, add the target that generates it to
`deps`.
Directives that are not needed (the file is already found automatically, or no
feature uses it) are errors, so the list stays accurate.
### What counts as a definition
Any ALL_CAPS macro call whose name contains `FEATURE` (but not `DECLARE` or
`PARAM`) and whose first argument is a `kCamelCase` identifier, e.g.
`BASE_FEATURE(...)` or `BASE_FEATURE_WITH_COUNTRY_RESTRICTIONS(...)`.
For `BASE_FEATURE` and `BASE_RUNTIME_MUTABLE_FEATURE`, the feature name is the
second argument when it is a string literal; otherwise the feature name is
derived from the identifier (`kFoo` -> `"Foo"`).