| # Copyright 2019 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//build/config/android/rules.gni") |
| |
| # Declare an Android library factory target. |
| # |
| # This target creates an Android library target containing stripped java |
| # factory files. The generated target will not contain any .class files as all |
| # of them are excluded by jar_excluded_patterns. This target is intended to |
| # generate an empty factory that will be swapped out at build time by the real |
| # factory. |
| # |
| # A good way to limit the number of dependencies for these factory files is to |
| # encapsulate the creation logic into either the constructor of the internal |
| # Impl classes or a static create method in the Impl classes. See the sample |
| # code below as an example. |
| # |
| # Specific requirements for the java factory files are listed in the script: |
| # //chrome/android/features/create_stripped_java_factory.py |
| # |
| # Variables: |
| # sources: A list of all java factory files to be stripped. |
| # deps: Any deps needed by the generated Android library target. |
| # |
| # Example: |
| # android_library_factory("foo_java") { |
| # sources = [ |
| # "android/org/chromium/foo/FooFactory.java", |
| # ] |
| # deps = [ |
| # ":foo_public_interface" |
| # ] |
| # } |
| # |
| # //android/org/chromium/foo/FooFactory.java: |
| # package org.chromium.foo; |
| # public class FooFactory { |
| # private FooFactory () {} |
| # |
| # public static Foo createFoo() { |
| # return FooImpl.create(); |
| # } |
| # } |
| # |
| # //out/Default/.../generated/org/chromium/foo/FooFactory.java: |
| # package org.chromium.foo; |
| # public class FooFactory { |
| # private FooFactory () {} |
| # |
| # public static Foo createFoo() { |
| # return null; |
| # } |
| # } |
| # |
| # //android/org/chromium/foo/FooImpl.java: |
| # package org.chromium.foo; |
| # import org.chromium.foo.internal.Parameter; |
| # public class FooImpl implements Foo { |
| # FooImpl(Parameter parameter) {} |
| # |
| # static Foo create() { |
| # return new FooImpl(new Parameter()); |
| # } |
| # } |
| # |
| template("android_library_factory") { |
| forward_variables_from(invoker, [ "testonly" ]) |
| |
| # No underscores for factory target name to avoid crbug.com/908819. |
| _process_factory_target_name = "${target_name}factory" |
| _base_gen_dir = "${target_gen_dir}/${target_name}" |
| |
| action_foreach_with_pydeps(_process_factory_target_name) { |
| # TODO(crbug.com/1112471): Get this to run cleanly under Python 3. |
| run_under_python2 = true |
| |
| script = "//chrome/android/features/create_stripped_java_factory.py" |
| sources = invoker.sources |
| outputs = |
| [ "$_base_gen_dir/{{source_root_relative_dir}}/{{source_file_part}}" ] |
| args = [ |
| "--output", |
| rebase_path(outputs[0], root_build_dir), |
| "--input={{source}}", |
| ] |
| } |
| |
| android_library(target_name) { |
| deps = [ ":$_process_factory_target_name" ] |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| sources = get_target_outputs(":$_process_factory_target_name") |
| jar_excluded_patterns = [ "*" ] |
| } |
| } |