From 7f3a15f714c8311b1adb7bdce1ac83c7113af598 Mon Sep 17 00:00:00 2001 From: jbudorick Date: Fri, 10 Jun 2016 06:28:40 -0700 Subject: [Android] Add support for standalone PDFium gn build on Android. This pulls in the android NDK and catapult, rolls chromium/src/build/, and pulls in two .gni updates. It also fixes a few miscellaneous compile failures in android-specific code. BUG=pdfium:38 Review-Url: https://codereview.chromium.org/2059553002 --- testing/test.gni | 178 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 160 insertions(+), 18 deletions(-) (limited to 'testing') diff --git a/testing/test.gni b/testing/test.gni index 13c434238a..3f6f175613 100644 --- a/testing/test.gni +++ b/testing/test.gni @@ -6,14 +6,69 @@ # TEST SETUP # ============================================================================== +template("_gen_isolate") { + testonly = true + _runtime_deps_file = "$target_gen_dir/$target_name.runtime_deps" + group("${target_name}__write_deps") { + forward_variables_from(invoker, + [ + "data", + "data_deps", + "deps", + "public_deps", + ]) + write_runtime_deps = _runtime_deps_file + } + + action(target_name) { + script = "//testing/generate_isolate.py" + inputs = [ + _runtime_deps_file, + ] + outputs = [ + invoker.output, + ] + args = [ + "--output-directory=.", + "--out-file", + rebase_path(invoker.output, root_build_dir), + "--runtime-deps-file", + rebase_path(_runtime_deps_file, root_build_dir), + ] + if (is_android) { + args += [ "--apply-android-filters" ] + } + if (defined(invoker.apply_device_filters) && invoker.apply_device_filters) { + args += [ "--apply-device-filters" ] + } + _assert_no_odd_data = + defined(invoker.assert_no_odd_data) && invoker.assert_no_odd_data + if (_assert_no_odd_data) { + args += [ "--assert-no-odd-data" ] + } + if (defined(invoker.command)) { + _isolate_dir = get_path_info(invoker.output, "dir") + args += [ + "--command", + rebase_path(invoker.command, _isolate_dir), + ] + } + deps = [ + ":${invoker.target_name}__write_deps", + ] + } +} + # Define a test as an executable (or apk on Android) with the "testonly" flag # set. # Variable: # use_raw_android_executable: Use executable() rather than android_apk(). +# use_native_activity: Test implements ANativeActivity_onCreate(). template("test") { if (is_android) { import("//build/config/android/config.gni") import("//build/config/android/rules.gni") + import("//build/config/sanitizers/sanitizers.gni") _use_raw_android_executable = defined(invoker.use_raw_android_executable) && invoker.use_raw_android_executable @@ -25,6 +80,40 @@ template("test") { _output_name = invoker.output_name } + _test_runner_target = "${_output_name}__test_runner_script" + _wrapper_script_vars = [ "shard_timeout" ] + _gen_isolate_vars = [ + "allow_odd_runtime_deps", + "ignore_all_data_deps", + ] + _generate_device_isolate = + !defined(invoker.ignore_all_data_deps) || !invoker.ignore_all_data_deps + + if (_generate_device_isolate) { + _allow_odd_runtime_deps = defined(invoker.allow_odd_runtime_deps) && + invoker.allow_odd_runtime_deps + + # The device isolate is needed at runtime, so it cannot go in + # target_gen_dir, as builder/tester configurations do not include it. + _target_dir_name = get_label_info(":$target_name", "dir") + _device_isolate_path = "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.device.isolate" + _gen_isolate_target_name = "${target_name}__isolate" + _gen_isolate(_gen_isolate_target_name) { + forward_variables_from(invoker, + [ + "data", + "data_deps", + "deps", + "public_deps", + ]) + assert_no_odd_data = !_allow_odd_runtime_deps + output = _device_isolate_path + apply_device_filters = true + } + } + + assert(_use_raw_android_executable || enable_java_templates) + if (_use_raw_android_executable) { _exec_target = "${target_name}__exec" _dist_target = "${target_name}__dist" @@ -35,7 +124,10 @@ template("test") { # Configs will always be defined since we set_defaults in BUILDCONFIG.gn. configs = [] data_deps = [] - forward_variables_from(invoker, "*", [ "extra_dist_files" ]) + forward_variables_from( + invoker, + "*", + _wrapper_script_vars + _gen_isolate_vars + [ "extra_dist_files" ]) testonly = true # Thanks to the set_defaults() for test(), configs are initialized with @@ -70,8 +162,11 @@ template("test") { _apk_specific_vars = [ "android_manifest", "enable_multidex", + "proguard_configs", + "proguard_enabled", "use_default_launcher", "write_asset_list", + "use_native_activity", ] shared_library(_library_target) { # Configs will always be defined since we set_defaults in BUILDCONFIG.gn. @@ -82,10 +177,8 @@ template("test") { deps = [] forward_variables_from(invoker, "*", - _apk_specific_vars + [ - "isolate_file", - "visibility", - ]) + _apk_specific_vars + _wrapper_script_vars + + _gen_isolate_vars + [ "visibility" ]) if (!defined(invoker.use_default_launcher) || invoker.use_default_launcher) { @@ -102,13 +195,29 @@ template("test") { install_script_name = "install_${invoker.output_name}" } deps += [ ":$_library_target" ] + + # TODO(agrieve): Remove this data_dep once bots don't build the _apk + # target (post-GYP). + # It's a bit backwards for the apk to depend on the runner script, since + # the apk is conceptually a runtime_dep of the script. However, it is + # currently necessary because the bots build this _apk target directly + # rather than the group() below. + data_deps = [ + ":$_test_runner_target", + ] } # Incremental test targets work only for .apks. _incremental_test_runner_target = "${_output_name}_incremental__test_runner_script" test_runner_script(_incremental_test_runner_target) { - forward_variables_from(invoker, [ "isolate_file" ]) + forward_variables_from(invoker, _wrapper_script_vars) + if (_generate_device_isolate) { + isolate_file = _device_isolate_path + deps = [ + ":$_gen_isolate_target_name", + ] + } apk_target = ":$_apk_target" test_name = "${_output_name}_incremental" test_type = "gtest" @@ -128,7 +237,14 @@ template("test") { _test_runner_target = "${_output_name}__test_runner_script" test_runner_script(_test_runner_target) { - forward_variables_from(invoker, [ "isolate_file" ]) + forward_variables_from(invoker, _wrapper_script_vars) + if (_generate_device_isolate) { + isolate_file = _device_isolate_path + deps = [ + ":$_gen_isolate_target_name", + ] + } + if (_use_raw_android_executable) { executable_dist_dir = "$root_out_dir/$_dist_target" } else { @@ -151,7 +267,7 @@ template("test") { } } - # TODO(GYP): Delete this after we've converted everything to GN. + # TODO(GYP_GONE): Delete this after we've converted everything to GN. # The _run targets exist only for compatibility w/ GYP. group("${target_name}_apk_run") { testonly = true @@ -178,20 +294,37 @@ template("test") { ] } - app(_test_target) { - # TODO(GYP): Make this configurable and only provide a default - # that can be overridden. - info_plist = "//testing/gtest_ios/unittest-Info.plist" - app_name = target_name - entitlements_path = "//testing/gtest_ios" - code_signing_identity = "" + ios_app_bundle(_test_target) { testonly = true - extra_substitutions = [ "BUNDLE_ID_TEST_NAME=$app_name" ] # See above call. set_sources_assignment_filter([]) + forward_variables_from(invoker, "*", [ "testonly" ]) - forward_variables_from(invoker, "*") + # Provide sensible defaults in case invoker did not define any of those + # required variables. + if (!defined(info_plist) && !defined(info_plist_target)) { + info_plist = "//testing/gtest_ios/unittest-Info.plist" + } + if (!defined(entitlements_path)) { + entitlements_path = "//testing/gtest_ios" + } + if (!defined(code_signing_identity)) { + code_signing_identity = "" + } + + # TODO(crbug.com/603102): remove this once gyp support is dropped and all + # application uses the target name as value for BUNDLE_ID_TEST_NAME. + if (defined(invoker.app_name)) { + app_name = invoker.app_name + } else { + app_name = target_name + } + + if (!defined(extra_substitutions)) { + extra_substitutions = [] + } + extra_substitutions += [ "BUNDLE_ID_TEST_NAME=$app_name" ] if (!defined(deps)) { deps = [] @@ -220,7 +353,7 @@ template("test") { ] } - # TODO(GYP): Delete this after we've converted everything to GN. + # TODO(GYP_GONE): Delete this after we've converted everything to GN. # The _run targets exist only for compatibility with GYP. group("${target_name}_run") { testonly = true @@ -228,5 +361,14 @@ template("test") { ":${invoker.target_name}", ] } + + if (defined(invoker.output_name) && target_name != invoker.output_name) { + group("${invoker.output_name}_run") { + testonly = true + deps = [ + ":${invoker.target_name}", + ] + } + } } } -- cgit v1.2.3