# 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/toolchain/toolchain.gni") import("//mojo/public/mojo_constants.gni") if (is_android) { import("//build/config/android/rules.gni") import("//build/config/zip.gni") } # Generate a binary Mojo application in a self-named directory. # Application resources are copied to a "resources" directory alongside the app. # The parameters of this template are those of a shared library. template("mojo_native_application") { base_target_name = target_name if (defined(invoker.output_name)) { base_target_name = invoker.output_name } final_target_name = target_name mojo_deps = [] if (defined(invoker.deps)) { mojo_deps += invoker.deps } mojo_data_deps = [] if (defined(invoker.resources)) { copy_step_name = "${base_target_name}__copy_resources" copy(copy_step_name) { sources = invoker.resources outputs = [ "${root_out_dir}/${mojo_application_subdir}/${base_target_name}/resources/{{source_file_part}}", ] if (defined(invoker.testonly)) { testonly = invoker.testonly } deps = mojo_deps } mojo_data_deps += [ ":$copy_step_name" ] } output = base_target_name + ".mojo" library_target_name = base_target_name + "_library" library_name = "${shlib_prefix}${library_target_name}${shlib_extension}" shared_library(library_target_name) { if (defined(invoker.cflags)) { cflags = invoker.cflags } if (defined(invoker.cflags_c)) { cflags_c = invoker.cflags_c } if (defined(invoker.cflags_cc)) { cflags_cc = invoker.cflags_cc } if (defined(invoker.cflags_objc)) { cflags_objc = invoker.cflags_objc } if (defined(invoker.cflags_objcc)) { cflags_objcc = invoker.cflags_objcc } if (defined(invoker.defines)) { defines = invoker.defines } if (defined(invoker.include_dirs)) { include_dirs = invoker.include_dirs } if (defined(invoker.ldflags)) { ldflags = invoker.ldflags } if (defined(invoker.lib_dirs)) { lib_dirs = invoker.lib_dirs } if (defined(invoker.libs)) { libs = invoker.libs } data_deps = [] if (!defined(invoker.avoid_runner_cycle) || !invoker.avoid_runner_cycle) { # Give the user an out; as some mojo services are depended on by the # runner. data_deps += [ "//services/shell/standalone" ] } if (defined(invoker.data_deps)) { data_deps += invoker.data_deps } data_deps += mojo_data_deps deps = [ "//mojo/public/c/system:set_thunks_for_app", "//services/shell/public/cpp:application_support", ] deps += mojo_deps if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } if (defined(invoker.all_dependent_configs)) { all_dependent_configs = invoker.all_dependent_configs } if (defined(invoker.public_configs)) { public_configs = invoker.public_configs } if (defined(invoker.check_includes)) { check_includes = invoker.check_includes } if (defined(invoker.configs)) { configs += invoker.configs } if (defined(invoker.data)) { data = invoker.data } if (defined(invoker.inputs)) { inputs = invoker.inputs } if (defined(invoker.public)) { public = invoker.public } if (defined(invoker.sources)) { sources = invoker.sources } if (defined(invoker.testonly)) { testonly = invoker.testonly } } copy(final_target_name) { forward_variables_from(invoker, [ "testonly", "visibility", ]) deps = [ ":${library_target_name}", ] sources = [ "${root_shlib_dir}/${library_name}", ] outputs = [ "${root_out_dir}/${mojo_application_subdir}/${base_target_name}/${output}", ] } if (is_android) { android_assets("${final_target_name}_assets") { forward_variables_from(invoker, [ "testonly" ]) deps = [ ":${library_target_name}", ] if (defined(invoker.deps)) { deps += invoker.deps } renaming_sources = [ "${root_shlib_dir}/${library_name}" ] renaming_destinations = [ "${base_target_name}/${output}" ] if (defined(invoker.resources)) { renaming_sources += invoker.resources renaming_destinations += process_file_template( invoker.resources, [ "$base_target_name/resources/{{source_file_part}}" ]) } } } } if (is_android) { # Declares an Android Mojo application consisting of an .so file and a # corresponding .dex.jar file. # # Variables: # input_so: the .so file to bundle # input_dex_jar: the .dex.jar file to bundle # deps / public_deps / data_deps (optional): # Dependencies. The targets that generate the .so/jar inputs should be # listed in either deps or public_deps. # output_name (optional): override for the output file name template("mojo_android_application") { assert(defined(invoker.input_so)) assert(defined(invoker.input_dex_jar)) base_target_name = target_name if (defined(invoker.output_name)) { base_target_name = invoker.output_name } mojo_data_deps = [] if (defined(invoker.resources)) { copy_step_name = "${base_target_name}__copy_resources" copy(copy_step_name) { sources = invoker.resources outputs = [ "${root_out_dir}/${mojo_application_subdir}/${base_target_name}/resources/{{source_file_part}}", ] if (defined(invoker.testonly)) { testonly = invoker.testonly } if (defined(invoker.deps)) { deps = invoker.deps } } mojo_data_deps += [ ":$copy_step_name" ] } zip_action_name = "${target_name}_zip" zip_action_output = "$target_gen_dir/${target_name}.zip" prepend_action_name = target_name zip(zip_action_name) { visibility = [ ":$prepend_action_name" ] inputs = [ invoker.input_so, invoker.input_dex_jar, ] output = zip_action_output forward_variables_from(invoker, [ "deps", "public_deps", "data_deps", ]) } _mojo_output = "${root_out_dir}/${mojo_application_subdir}/${base_target_name}/${base_target_name}.mojo" action(target_name) { script = "//mojo/public/tools/prepend.py" input = zip_action_output inputs = [ input, ] outputs = [ _mojo_output, ] rebase_input = rebase_path(input, root_build_dir) rebase_output = rebase_path(_mojo_output, root_build_dir) args = [ "--input=$rebase_input", "--output=$rebase_output", "--line=#!mojo mojo:android_handler", ] data_deps = mojo_data_deps public_deps = [ ":$zip_action_name", ] } android_assets("${target_name}_assets") { forward_variables_from(invoker, [ "testonly" ]) deps = [ ":$prepend_action_name", ] renaming_sources = [ _mojo_output ] renaming_destinations = [ "${base_target_name}/${base_target_name}.mojo" ] if (defined(invoker.resources)) { renaming_sources += invoker.resources renaming_destinations += process_file_template( invoker.resources, [ "$base_target_name/resources/{{source_file_part}}" ]) } } } }