| # 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/module_args/mojo.gni") |
| import("mojo.gni") |
| import("mojo_sdk.gni") |
| |
| # Generate a binary mojo application.The parameters of this template are those |
| # of a shared library. |
| template("mojo_native_application") { |
| if (defined(invoker.output_name)) { |
| base_target_name = invoker.output_name |
| } else { |
| base_target_name = target_name |
| } |
| |
| if (!is_nacl) { |
| final_target_name = target_name |
| output = base_target_name + ".mojo" |
| library_target_name = base_target_name + "_library" |
| copy_symbols_target = "__${final_target_name}_copy_symbols" |
| |
| if (is_linux || is_android) { |
| library_name = "lib${library_target_name}.so" |
| } else if (is_win) { |
| library_name = "${library_target_name}.dll" |
| } else if (is_mac || is_ios) { |
| library_name = "lib${library_target_name}.dylib" |
| } else { |
| assert(false, "Platform not supported.") |
| } |
| |
| if (is_android) { |
| # On android, use the stripped version of the library, because applications |
| # are always fetched over the network. |
| library_dir = "${root_out_dir}/lib.stripped" |
| } else { |
| library_dir = root_out_dir |
| } |
| |
| shared_library(library_target_name) { |
| data_deps = [] |
| forward_variables_from(invoker, |
| [ |
| "cflags", |
| "cflags_c", |
| "cflags_cc", |
| "cflags_objc", |
| "cflags_objcc", |
| "defines", |
| "include_dirs", |
| "ldflags", |
| "lib_dirs", |
| "libs", |
| "data_deps", |
| ]) |
| |
| # Copy any necessary prebuilt artifacts. |
| if (mojo_use_prebuilt_mojo_shell) { |
| data_deps += |
| [ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ] |
| } |
| if (mojo_use_prebuilt_network_service) { |
| data_deps += [ rebase_path("mojo/public/tools:copy_network_service", |
| ".", |
| mojo_root) ] |
| } |
| |
| deps = |
| rebase_path([ "mojo/public/platform/native:system" ], ".", mojo_root) |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.configs)) { |
| configs += invoker.configs |
| } |
| forward_variables_from(invoker, |
| [ |
| "public_deps", |
| "all_dependent_configs", |
| "public_configs", |
| "check_includes", |
| "data", |
| "inputs", |
| "public", |
| "sources", |
| "testonly", |
| ]) |
| |
| visibility = [ |
| ":${final_target_name}", |
| ":${copy_symbols_target}", |
| ] |
| } |
| |
| copy(copy_symbols_target) { |
| if (defined(invoker.testonly)) { |
| testonly = invoker.testonly |
| } |
| visibility = [ ":${final_target_name}" ] |
| deps = [ |
| ":${library_target_name}", |
| ] |
| |
| sources = [ |
| "${root_out_dir}/${library_name}", |
| ] |
| outputs = [ |
| "${root_out_dir}/symbols/${library_name}", |
| ] |
| } |
| |
| copy(final_target_name) { |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| public_deps = [ |
| # We want to allow rules to depend on symbol libraries. |
| ":${copy_symbols_target}", |
| ] |
| |
| deps = [ |
| ":${library_target_name}", |
| ] |
| |
| sources = [ |
| "${library_dir}/${library_name}", |
| ] |
| outputs = [ |
| "${root_out_dir}/${output}", |
| ] |
| } |
| } else { |
| nexe_target_name = base_target_name + "_nexe" |
| executable_target_name = base_target_name + "_exe" |
| |
| executable(nexe_target_name) { |
| output_name = base_target_name |
| data_deps = [] |
| forward_variables_from(invoker, |
| [ |
| "cflags", |
| "cflags_c", |
| "cflags_cc", |
| "cflags_objc", |
| "cflags_objcc", |
| "defines", |
| "include_dirs", |
| "ldflags", |
| "lib_dirs", |
| "libs", |
| "data_deps", |
| ]) |
| |
| # Copy any necessary prebuilt artifacts. |
| if (mojo_use_prebuilt_mojo_shell) { |
| data_deps += |
| [ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ] |
| } |
| if (mojo_use_prebuilt_network_service) { |
| data_deps += [ rebase_path("mojo/public/tools:copy_network_service", |
| ".", |
| mojo_root) ] |
| } |
| |
| deps = rebase_path([ |
| "mojo/public/c/system", |
| "mojo/public/platform/nacl:system", |
| ], |
| ".", |
| mojo_root) |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.configs)) { |
| configs += invoker.configs |
| } |
| |
| forward_variables_from(invoker, |
| [ |
| "forward_dependent_configs_from", |
| "public_deps", |
| "all_dependent_configs", |
| "public_configs", |
| "check_includes", |
| "data", |
| "inputs", |
| "public", |
| "sources", |
| "testonly", |
| ]) |
| |
| visibility = [ ":*" ] |
| } |
| |
| group(target_name) { |
| # This group specifies two targets: first, it requests that the |
| # pexe be built, and secondly (if the toolchain is not requesting |
| # a pexe implicitly), it creates a nexe. |
| forward_variables_from(invoker, [ "testonly" ]) |
| deps = [ |
| ":${executable_target_name}(//build/toolchain/nacl:newlib_pnacl)", |
| ] |
| if (current_cpu != "pnacl") { |
| deps += [ ":${executable_target_name}" ] |
| } |
| } |
| |
| action(executable_target_name) { |
| if (current_cpu == "pnacl") { |
| input_file_extension = ".pexe" |
| output_file_extension = ".pexe.mojo" |
| content_handler = "content_handler_nonsfi_pexe" |
| } else { |
| input_file_extension = ".nexe" |
| output_file_extension = "_${target_cpu}.nexe.mojo" |
| content_handler = "content_handler_sfi_nexe" |
| } |
| input_file = "${base_target_name}${input_file_extension}" |
| output_file = "${base_target_name}${output_file_extension}" |
| |
| forward_variables_from(invoker, |
| [ |
| "testonly", |
| "visibility", |
| ]) |
| |
| script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root) |
| |
| input_path = "${root_out_dir}/${input_file}" |
| inputs = [ |
| input_path, |
| ] |
| |
| output_path = "${root_build_dir}/${output_file}" |
| outputs = [ |
| output_path, |
| ] |
| |
| deps = [ |
| ":${nexe_target_name}", |
| ] |
| |
| rebase_input = rebase_path(input_path, root_build_dir) |
| rebase_output = rebase_path(output_path, root_build_dir) |
| args = [ |
| "--input=$rebase_input", |
| "--output=$rebase_output", |
| "--line=#!mojo mojo:$content_handler", |
| ] |
| } |
| } |
| } |
| |
| if (is_android) { |
| import("//build/config/android/rules.gni") |
| |
| # Declares an Android Mojo application consisting of an .so file and a |
| # corresponding .dex.jar file. |
| # |
| # Variables: |
| # sources (optional): The c++ sources. |
| # deps (optional): The c++ dependencies. |
| # java_sources (optional): The java sources. |
| # java_deps (optional): The java dependencies. |
| # jni_package (optional): The c++ package for the generated jni headers. |
| # output_name (optional): override for the output file name |
| # public_deps / data_deps (optional): Dependencies. |
| template("mojo_android_application") { |
| shared_library_name = "__${target_name}_lib" |
| library_basename = "lib${shared_library_name}.so" |
| if (defined(invoker.jni_package)) { |
| assert(defined(invoker.java_sources)) |
| generate_jni_name = "__${target_name}_jni" |
| } |
| if (defined(invoker.java_sources)) { |
| java_library_name = "__${target_name}_java" |
| } |
| android_standalone_library_name = "__${target_name}_java_lib" |
| dex_output_path = "${target_gen_dir}/${target_name}.dex.jar" |
| zip_action_name = "__${target_name}_zip" |
| zip_action_output = "${target_gen_dir}/${target_name}.zip" |
| copy_symbols_target = "__${target_name}_copy_symbols" |
| final_target_name = target_name |
| |
| if (defined(invoker.jni_package)) { |
| generate_jni(generate_jni_name) { |
| visibility = [ ":${shared_library_name}" ] |
| |
| sources = invoker.java_sources |
| jni_package = invoker.jni_package |
| } |
| } |
| |
| shared_library(shared_library_name) { |
| visibility = [ |
| ":${copy_symbols_target}", |
| ":${zip_action_name}", |
| ] |
| |
| if (defined(invoker.sources)) { |
| sources = invoker.sources |
| } |
| |
| deps = |
| rebase_path([ "mojo/public/platform/native:system" ], ".", mojo_root) |
| if (defined(invoker.jni_package)) { |
| deps += [ ":${generate_jni_name}" ] |
| } |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| } |
| |
| copy(copy_symbols_target) { |
| visibility = [ ":${final_target_name}" ] |
| deps = [ |
| ":${shared_library_name}", |
| ] |
| |
| sources = [ |
| "${root_out_dir}/${library_basename}", |
| ] |
| outputs = [ |
| "${root_out_dir}/symbols/${library_basename}", |
| ] |
| } |
| |
| if (defined(invoker.java_sources)) { |
| android_library(java_library_name) { |
| visibility = [ ":*" ] |
| |
| java_files = invoker.java_sources |
| |
| if (defined(invoker.java_deps)) { |
| deps = invoker.java_deps |
| } |
| } |
| } |
| |
| android_standalone_library(android_standalone_library_name) { |
| deps = [] |
| |
| if (defined(invoker.java_sources)) { |
| deps += [ ":${java_library_name}" ] |
| } |
| |
| if (defined(invoker.java_deps)) { |
| deps += invoker.java_deps |
| } |
| |
| dex_path = dex_output_path |
| } |
| |
| action(zip_action_name) { |
| visibility = [ ":${final_target_name}" ] |
| script = "//build/android/gn/zip.py" |
| |
| inputs = [ |
| "${root_out_dir}/lib.stripped/${library_basename}", |
| dex_output_path, |
| ] |
| |
| output = zip_action_output |
| outputs = [ |
| output, |
| ] |
| |
| rebase_inputs = rebase_path(inputs, root_build_dir) |
| rebase_output = rebase_path(output, root_build_dir) |
| args = [ |
| "--inputs=${rebase_inputs}", |
| "--output=${rebase_output}", |
| ] |
| |
| deps = [ |
| ":${android_standalone_library_name}", |
| ":${shared_library_name}", |
| ] |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| if (defined(invoker.public_deps)) { |
| public_deps = invoker.public_deps |
| } |
| if (defined(invoker.data_deps)) { |
| data_deps = invoker.data_deps |
| } |
| } |
| |
| if (defined(invoker.output_name)) { |
| mojo_output = "${root_out_dir}/" + invoker.output_name + ".mojo" |
| } else { |
| mojo_output = "${root_out_dir}/" + target_name + ".mojo" |
| } |
| |
| action(final_target_name) { |
| script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root) |
| |
| input = zip_action_output |
| inputs = [ |
| input, |
| ] |
| |
| output = mojo_output |
| outputs = [ |
| output, |
| ] |
| |
| rebase_input = rebase_path(input, root_build_dir) |
| rebase_output = rebase_path(output, root_build_dir) |
| args = [ |
| "--input=${rebase_input}", |
| "--output=${rebase_output}", |
| "--line=#!mojo mojo:android_handler", |
| ] |
| |
| deps = [ |
| ":${copy_symbols_target}", |
| ] |
| |
| public_deps = [ |
| ":${zip_action_name}", |
| ] |
| } |
| } |
| } |