| # Copyright 2014 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/ui.gni") |
| import("//mojo/public/mojo.gni") |
| import("//mojo/public/mojo_application.gni") |
| import("//mojo/public/tools/bindings/mojom.gni") |
| import("//mojo/tools/embed/rules.gni") |
| import("//testing/test.gni") |
| |
| # We don't support building in the component build since mojo apps are |
| # inherently components. |
| assert(!is_component_build) |
| |
| group("shell") { |
| testonly = true |
| |
| deps = [ |
| ":copy_symbols", |
| ":mojo_shell", |
| ":tests", |
| ] |
| |
| if (is_android) { |
| deps += [ |
| ":mojo_shell_apk", |
| ":mojo_shell_tests_apk", |
| ] |
| } |
| } |
| |
| group("tests") { |
| testonly = true |
| deps = [ |
| ":apptests", |
| ":mojo_shell_tests", |
| ":shell_nfc_apptests", |
| "//shell/application_manager:mojo_application_manager_unittests", |
| ] |
| |
| # TODO(cstout): fix breakpad build for fnl/musl |
| # https://code.google.com/p/google-breakpad/issues/detail?id=631 |
| if ((is_android || is_linux) && !is_fnl) { |
| deps += [ "//shell/crash:crash_unittests" ] |
| } |
| } |
| |
| if (is_android) { |
| import("//build/config/android/config.gni") |
| import("//build/config/android/rules.gni") |
| } |
| |
| if (!mojo_use_prebuilt_mojo_shell) { |
| shell_common_deps = [ |
| ":parent_lib", |
| "//base", |
| "//base/allocator", |
| "//build/config/sanitizers:deps", |
| "//mojo/environment:chromium", |
| "//mojo/message_pump", |
| ] |
| shell_common_data_deps = [ ":mojo_shell_child" ] |
| |
| # TODO(cstout): fix breakpad build for fnl/musl |
| # (see comment above) |
| if ((is_android || is_linux) && !is_fnl) { |
| shell_common_deps += [ "//shell/crash" ] |
| } |
| |
| if (is_android) { |
| shared_library("mojo_shell") { |
| sources = [ |
| "android/library_loader.cc", |
| "android/main.cc", |
| "android/main.h", |
| ] |
| |
| deps = shell_common_deps + [ |
| ":jni_headers", |
| "//gpu/config", |
| "//mojo/android:libsystem_java", |
| "//mojo/common", |
| "//services/native_viewport:lib", |
| "//services/ui/launcher:bindings", |
| "//shell/application_manager", |
| "//ui/gl", |
| ] |
| |
| data_deps = shell_common_data_deps |
| } |
| } else { |
| executable("mojo_shell") { |
| sources = [ |
| "desktop/main.cc", |
| ] |
| |
| deps = shell_common_deps + [ ":mojo_shell_child_32_bit" ] |
| |
| data_deps = shell_common_data_deps |
| } |
| } |
| |
| executable("mojo_shell_child") { |
| sources = [ |
| "child_main.cc", |
| ] |
| |
| deps = [ |
| ":child_controller_bindings", |
| ":common_lib", |
| "//base", |
| "//base/allocator", |
| "//build/config/sanitizers:deps", |
| "//mojo/edk/base_edk", |
| "//mojo/edk/system", |
| "//mojo/environment:chromium", |
| "//mojo/message_pump", |
| ] |
| } |
| |
| if (current_cpu == "x86") { |
| # The 32-bit version of the mojo_shell_child should be accessible in the |
| # root build directory, just like the regular mojo_shell_child, so that |
| # the 32-bit version can be accessed by simply adding a suffix to the path. |
| copy("mojo_shell_child_32_bit_copy") { |
| sources = [ |
| "${root_out_dir}/mojo_shell_child", |
| ] |
| outputs = [ |
| "${root_build_dir}/mojo_shell_child_32", |
| ] |
| deps = [ |
| ":mojo_shell_child", |
| ] |
| } |
| } |
| |
| group("mojo_shell_child_32_bit") { |
| # This group is required to run any 32-bit child process. |
| deps = [] |
| if ((target_cpu == "x64" || target_cpu == "x86") && is_linux && !is_fnl) { |
| # The toolchain is hardcoded as 32-bit clang here -- although it must |
| # be 32 bit (for nonsfi), it assumes clang. Ideally, the toolchain would |
| # be defined as the 32 bit variant of whatever is being used (be it clang, |
| # gcc, or something else). |
| deps = [ |
| ":mojo_shell_child_32_bit_copy(//build/toolchain/linux:clang_x86)", |
| ] |
| } |
| } |
| } # !mojo_use_prebuilt_mojo_shell |
| |
| # Files used both by mojo_shell and mojo_shell_child (and tests). |
| source_set("common_lib") { |
| sources = [ |
| "child_switches.cc", |
| "child_switches.h", |
| "init.cc", |
| "init.h", |
| ] |
| |
| deps = [ |
| "//base", |
| ] |
| |
| public_deps = [ |
| ":native_application_support", |
| ] |
| } |
| |
| source_set("parent_lib") { |
| sources = [ |
| "background_application_loader.cc", |
| "background_application_loader.h", |
| "child_process_host.cc", |
| "child_process_host.h", |
| "command_line_util.cc", |
| "command_line_util.h", |
| "context.cc", |
| "context.h", |
| "filename_util.cc", |
| "filename_util.h", |
| "in_process_native_runner.cc", |
| "in_process_native_runner.h", |
| "out_of_process_native_runner.cc", |
| "out_of_process_native_runner.h", |
| "switches.cc", |
| "switches.h", |
| "task_runners.cc", |
| "task_runners.h", |
| "tracer.cc", |
| "tracer.h", |
| "url_resolver.cc", |
| "url_resolver.h", |
| "url_response_disk_cache_loader.cc", |
| "url_response_disk_cache_loader.h", |
| ] |
| |
| deps = [ |
| ":child_controller_bindings", |
| "//base", |
| "//base:base_static", |
| "//base/third_party/dynamic_annotations", |
| "//mojo/application", |
| "//mojo/common", |
| "//mojo/common:tracing_impl", |
| "//mojo/data_pipe_utils", |
| "//mojo/edk/base_edk", |
| "//mojo/edk/system", |
| "//mojo/public/cpp/bindings", |
| "//mojo/public/interfaces/application", |
| "//mojo/services/network/interfaces", |
| "//mojo/services/tracing/interfaces", |
| "//services/url_response_disk_cache", |
| "//shell/application_manager", |
| "//url", |
| ] |
| |
| public_deps = [ |
| ":common_lib", |
| ] |
| |
| if (is_android) { |
| sources += [ |
| "android/android_handler.cc", |
| "android/android_handler.h", |
| "android/android_handler_loader.cc", |
| "android/android_handler_loader.h", |
| "android/java_application_loader.cc", |
| "android/java_application_loader.h", |
| "android/native_handler_thread.cc", |
| "android/native_handler_thread.h", |
| "android/native_viewport_application_loader.cc", |
| "android/native_viewport_application_loader.h", |
| "android/ui_application_loader_android.cc", |
| "android/ui_application_loader_android.h", |
| "android/url_response_disk_cache_delegate_impl.cc", |
| "android/url_response_disk_cache_delegate_impl.h", |
| ] |
| |
| deps += [ |
| ":jni_headers", |
| ":run_android_application_function", |
| "//mojo/application:content_handler", |
| "//mojo/services/content_handler/interfaces", |
| "//mojo/services/gpu/interfaces", |
| "//mojo/services/native_viewport/interfaces", |
| "//services/gles2", |
| "//services/native_viewport:lib", |
| ] |
| } |
| |
| if (is_mac) { |
| sources -= [ |
| "url_response_disk_cache_loader.cc", |
| "url_response_disk_cache_loader.h", |
| ] |
| |
| deps -= [ "//services/url_response_disk_cache" ] |
| } |
| } |
| |
| # This is a separate target mainly since it suppresses check_includes. |
| # TODO(vtl): Make it so that the suppression isn't needed. |
| source_set("native_application_support") { |
| sources = [ |
| "native_application_support.cc", |
| "native_application_support.h", |
| "platform_handle_impl.cc", |
| ] |
| |
| public_deps = [ |
| "//mojo/public/cpp/bindings", |
| ] |
| |
| deps = [ |
| "//base", |
| "//mojo/gles2:control_thunks", |
| "//mojo/gles2:gles2", |
| "//mojo/gles2:mgl", |
| "//mojo/public/platform/native:platform_handle_api", |
| ] |
| |
| # This target has to include the public thunk headers, which generally |
| # shouldn't be included without picking an implementation. We are providing |
| # the implementation but the thunk header target cannot declare that we are |
| # permitted to include it since it's in the public SDK and we are not. |
| # Suppress include checking so we can still check the rest of the targets in |
| # this file. |
| check_includes = false |
| } |
| |
| if (is_android) { |
| generate_jni("jni_headers") { |
| sources = [ |
| "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java", |
| "android/apk/src/org/chromium/mojo/shell/Bootstrap.java", |
| "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java", |
| "android/apk/src/org/chromium/mojo/shell/NativeHandlerThread.java", |
| "android/apk/src/org/chromium/mojo/shell/ShellService.java", |
| "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java", |
| ] |
| jni_package = "mojo/shell" |
| } |
| |
| android_library("bootstrap_java") { |
| java_files = [ "android/apk/src/org/chromium/mojo/shell/Bootstrap.java" ] |
| |
| deps = [ |
| "//base:base_java", |
| ] |
| |
| dex_path = "$target_out_dir/bootstrap_java.dex.jar" |
| } |
| |
| shared_library("bootstrap") { |
| sources = [ |
| "android/bootstrap.cc", |
| ] |
| deps = [ |
| ":jni_headers", |
| ":run_android_application_function", |
| "//base", |
| ] |
| } |
| |
| # Shared header between the bootstrap and the main shell .so. |
| source_set("run_android_application_function") { |
| sources = [ |
| "android/run_android_application_function.h", |
| ] |
| |
| deps = [ |
| "//base", |
| ] |
| } |
| |
| android_library("java") { |
| java_files = [ |
| "android/apk/src/org/chromium/mojo/shell/AndroidFactory.java", |
| "android/apk/src/org/chromium/mojo/shell/AndroidHandler.java", |
| "android/apk/src/org/chromium/mojo/shell/BaseActivity.java", |
| "android/apk/src/org/chromium/mojo/shell/FileHelper.java", |
| "android/apk/src/org/chromium/mojo/shell/InputFactory.java", |
| "android/apk/src/org/chromium/mojo/shell/IntentReceiverActivity.java", |
| "android/apk/src/org/chromium/mojo/shell/IntentReceiverRegistry.java", |
| "android/apk/src/org/chromium/mojo/shell/JavaApplicationRegistry.java", |
| "android/apk/src/org/chromium/mojo/shell/KeyboardFactory.java", |
| "android/apk/src/org/chromium/mojo/shell/MojoShellActivity.java", |
| "android/apk/src/org/chromium/mojo/shell/MojoShellApplication.java", |
| "android/apk/src/org/chromium/mojo/shell/NativeHandlerThread.java", |
| "android/apk/src/org/chromium/mojo/shell/NativeViewportSupportApplicationDelegate.java", |
| "android/apk/src/org/chromium/mojo/shell/NfcApplicationDelegate.java", |
| "android/apk/src/org/chromium/mojo/shell/NfcDbManager.java", |
| "android/apk/src/org/chromium/mojo/shell/NfcImpl.java", |
| "android/apk/src/org/chromium/mojo/shell/NfcReceiverActivity.java", |
| "android/apk/src/org/chromium/mojo/shell/NfcServiceFactoryBinder.java", |
| "android/apk/src/org/chromium/mojo/shell/SharingActivity.java", |
| "android/apk/src/org/chromium/mojo/shell/SharingApplicationDelegate.java", |
| "android/apk/src/org/chromium/mojo/shell/ShellService.java", |
| "android/apk/src/org/chromium/mojo/shell/ViewportActivity.java", |
| ] |
| |
| deps = [ |
| ":resources", |
| "//base:base_java", |
| "//mojo/android:system_java", |
| "//mojo/public/interfaces/application:application_java", |
| "//mojo/public/java:application", |
| "//mojo/public/java:bindings", |
| "//mojo/public/java:system", |
| "//mojo/services/android/interfaces:interfaces_java", |
| "//mojo/services/input/interfaces:interfaces_java", |
| "//mojo/services/keyboard/interfaces:interfaces_java", |
| "//mojo/services/nfc/interfaces:interfaces_java", |
| "//services/android", |
| "//services/authentication", |
| "//services/input", |
| "//services/intent_receiver:bindings_java", |
| "//services/keyboard", |
| "//services/location", |
| "//services/native_viewport:interfaces_java", |
| "//services/native_viewport:native_viewport_java", |
| "//services/nfc_message_sink:bindings_java", |
| "//services/sharing_sink:bindings_java", |
| "//third_party/android_tools:android_support_v13_java", |
| "//ui/gl:gl_java", |
| ] |
| } |
| |
| if (is_official_build) { |
| icon_dir = "android/apk/res-official" |
| } else { |
| icon_dir = "android/apk/res-dev" |
| } |
| |
| android_resources("resources") { |
| resource_dirs = [ |
| "android/apk/res", |
| icon_dir, |
| ] |
| custom_package = "org.chromium.mojo.shell" |
| } |
| |
| mojo_shell_assets_dir = "$root_build_dir/mojo_shell_assets" |
| mojo_shell_test_assets_dir = "$root_build_dir/mojo_shell_test_assets" |
| |
| copy_ex("copy_mojo_shell_assets") { |
| clear_dir = true |
| dest = mojo_shell_assets_dir |
| sources = [ |
| "$root_out_dir/exe.stripped/mojo_shell_child", |
| "$root_out_dir/lib.stripped/libbootstrap.so", |
| "$root_out_dir/network_service.mojo", |
| "$root_out_dir/obj/shell/bootstrap_java.dex.jar", |
| ] |
| deps = [ |
| ":bootstrap", |
| ":bootstrap_java", |
| ":mojo_shell_child", |
| "//mojo/public/tools:copy_network_service", |
| ] |
| |
| if (!is_debug) { |
| sources += [ |
| "$root_out_dir/authenticating_url_loader_interceptor.mojo", |
| "$root_out_dir/compositor_service.mojo", |
| "$root_out_dir/dart_content_handler.mojo", |
| "$root_out_dir/files.mojo", |
| "$root_out_dir/icu_data.mojo", |
| "$root_out_dir/input_manager_service.mojo", |
| "$root_out_dir/java_handler.mojo", |
| "$root_out_dir/launcher.mojo", |
| "$root_out_dir/speech_recognizer.mojo", |
| "$root_out_dir/tracing.mojo", |
| "$root_out_dir/view_manager_service.mojo", |
| ] |
| |
| deps += [ |
| "//services/authenticating_url_loader_interceptor", |
| "//services/dart:dart_content_handler", |
| "//services/files", |
| "//services/gfx/compositor", |
| "//services/icu_data", |
| "//services/java_handler", |
| "//services/speech_recognizer", |
| "//services/tracing", |
| "//services/ui/input_manager", |
| "//services/ui/launcher", |
| "//services/ui/view_manager", |
| ] |
| } |
| } |
| |
| copy_ex("copy_mojo_shell_test_assets") { |
| clear_dir = true |
| dest = mojo_shell_test_assets_dir |
| sources = [ |
| "$root_out_dir/test_app.mojo", |
| "$root_out_dir/test_request_tracker_app.mojo", |
| ] |
| deps = [ |
| "//services/test_service:test_app", |
| "//services/test_service:test_request_tracker_app", |
| ] |
| } |
| |
| if (!is_official_build) { |
| manifest_package = "org.chromium.mojo.shell" |
| apk_name = "Mojo Shell (dev)" |
| debuggable = "true" |
| } else { |
| manifest_package = "io.mojoapps.launcher" |
| apk_name = "Mojo Shell" |
| debuggable = "false" |
| } |
| |
| if (is_official_build) { |
| # Force GN to re-generate ninja files when a new commit is present. |
| read_file("//.git/index", "") |
| version_code = |
| exec_script("//mojo/public/tools/gn/last_commit_timestamp.py", |
| [ |
| "--directory", |
| rebase_path("//", root_build_dir), |
| ], |
| "trim string") |
| |
| # Download the keystore for signing. |
| keystore_path = "$root_build_dir/mojo_shell-official.keystore" |
| action("download_keystore") { |
| script = "//mojo/tools/download_keystore.py" |
| outputs = [ |
| keystore_path, |
| ] |
| args = [ |
| "keystore_file", |
| rebase_path(keystore_path, root_build_dir), |
| ] |
| } |
| keystore_password = exec_script("//mojo/tools/download_keystore.py", |
| [ "keystore_password" ], |
| "trim string") |
| } else { |
| version_code = "1" |
| } |
| version_name = "0.0.1" |
| |
| jinja_variables = [ |
| "manifest_package=$manifest_package", |
| "apk_name=$apk_name", |
| "debuggable=$debuggable", |
| "version_code=$version_code", |
| "version_name=$version_name", |
| ] |
| |
| mojo_shell_manifest = |
| "$target_gen_dir/mojo_shell_manifest/AndroidManifest.xml" |
| |
| jinja_template("mojo_shell_manifest") { |
| variables = jinja_variables |
| input = "android/apk/AndroidManifest.xml.jinja2" |
| output = mojo_shell_manifest |
| } |
| |
| android_apk("mojo_shell_apk") { |
| apk_name = "MojoShell" |
| |
| android_manifest = mojo_shell_manifest |
| |
| native_libs = [ "libmojo_shell.so" ] |
| |
| asset_location = mojo_shell_assets_dir |
| |
| deps = [ |
| ":copy_mojo_shell_assets", |
| ":java", |
| ":mojo_shell", |
| ":mojo_shell_manifest", |
| ":resources", |
| "//base:base_java", |
| "//services/native_viewport:native_viewport_java", |
| "//third_party/android_tools:google_play_services_default_resources", |
| ] |
| |
| if (is_official_build) { |
| deps += [ ":download_keystore" ] |
| keystore_path = keystore_path |
| keystore_name = "official" |
| keystore_password = keystore_password |
| } |
| } |
| |
| android_library("mojo_shell_tests_java") { |
| java_files = |
| [ "android/tests/src/org/chromium/mojo/shell/ShellTestBase.java" ] |
| |
| deps = [ |
| ":java", |
| "//base:base_java", |
| ] |
| } |
| } |
| |
| mojom("child_controller_bindings") { |
| sources = [ |
| "child_controller.mojom", |
| ] |
| |
| deps = [ |
| "//mojo/public/interfaces/application", |
| ] |
| } |
| |
| test("mojo_shell_tests") { |
| sources = [ |
| "background_application_loader_unittest.cc", |
| "child_process_host_unittest.cc", |
| "command_line_util_unittest.cc", |
| "context_unittest.cc", |
| "in_process_native_runner_unittest.cc", |
| "native_runner_unittest.cc", |
| "shell_test_base.cc", |
| "shell_test_base.h", |
| "shell_test_base_android.cc", |
| "shell_test_base_unittest.cc", |
| "shell_test_main.cc", |
| "url_resolver_unittest.cc", |
| ] |
| |
| deps = [ |
| ":parent_lib", |
| "//base", |
| "//base:i18n", |
| "//base/test:test_support", |
| "//mojo/common", |
| "//mojo/edk/system", |
| "//mojo/environment:chromium", |
| "//mojo/message_pump", |
| "//mojo/public/cpp/bindings", |
| "//services/test_service:bindings", |
| "//shell/application_manager", |
| "//testing/gtest", |
| "//url", |
| ] |
| |
| data_deps = [ |
| ":mojo_shell_child", |
| "//services/test_service:test_app", |
| "//services/test_service:test_request_tracker_app", |
| ] |
| |
| if (is_android) { |
| deps += [ ":jni_headers" ] |
| |
| apk_deps = [ |
| ":copy_mojo_shell_test_assets", |
| ":mojo_shell_tests_java", |
| ] |
| |
| apk_asset_location = mojo_shell_test_assets_dir |
| } |
| } |
| |
| # Shared library propagation will happen up to executable, shared library, |
| # or complete static library boundaries. |
| # Workaround from brettw to prevent gn from linking pingable app into the |
| # apptests executable. |
| static_library("pingable_app_dummy") { |
| complete_static_lib = true |
| testonly = true |
| public_deps = [ |
| "//shell/test:pingable_app($default_toolchain)", |
| ] |
| sources = [ |
| "pingable_app_dummy_empty.cc", |
| ] |
| } |
| |
| embed_file("embed_pingable") { |
| source = "$root_build_dir/pingable_app.mojo" |
| namespace = "shell::test" |
| variable = "kPingable" |
| testonly = true |
| deps = [ |
| ":pingable_app_dummy", |
| ] |
| } |
| |
| mojo_native_application("apptests") { |
| output_name = "shell_apptests" |
| |
| testonly = true |
| |
| sources = [ |
| "shell_apptest.cc", |
| ] |
| |
| deps = [ |
| ":embed_pingable", |
| "//base", |
| "//mojo/application", |
| "//mojo/application:test_support", |
| "//mojo/converters/base", |
| "//mojo/data_pipe_utils", |
| "//mojo/public/cpp/bindings:callback", |
| "//mojo/public/cpp/environment", |
| "//mojo/public/cpp/system:system", |
| "//mojo/public/interfaces/application", |
| "//mojo/services/http_server/cpp", |
| "//mojo/services/http_server/interfaces", |
| "//mojo/services/http_server/interfaces:interfaces_sync", |
| "//mojo/services/network/interfaces", |
| "//shell/test:bindings", |
| ] |
| |
| data_deps = [ |
| "//services/http_server:http_server($default_toolchain)", |
| ] |
| } |
| |
| mojo_native_application("shell_nfc_apptests") { |
| output_name = "shell_nfc_apptests" |
| |
| testonly = true |
| |
| sources = [ |
| "android/nfc_apptest.cc", |
| ] |
| |
| deps = [ |
| "//base", |
| "//mojo/application", |
| "//mojo/application:test_support", |
| "//mojo/common:common", |
| "//mojo/public/cpp/bindings:callback", |
| "//mojo/public/cpp/environment", |
| "//mojo/public/cpp/system:system", |
| "//mojo/services/nfc/interfaces", |
| "//shell/test:bindings", |
| ] |
| } |
| |
| copy("copy_symbols") { |
| testonly = true |
| |
| deps = [ |
| ":mojo_shell", |
| ":mojo_shell_child", |
| ] |
| if (is_android) { |
| deps += [ ":bootstrap" ] |
| } |
| |
| sources = [ |
| "${root_out_dir}/mojo_shell_child", |
| ] |
| if (is_android) { |
| sources += [ |
| "${root_out_dir}/libbootstrap.so", |
| "${root_out_dir}/libmojo_shell.so", |
| ] |
| } else { |
| sources += [ "${root_out_dir}/mojo_shell" ] |
| } |
| |
| outputs = [ |
| "${root_out_dir}/symbols/{{source_file_part}}", |
| ] |
| } |