# 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/c/system",
                           "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,
                             [
                               "forward_dependent_configs_from",
                               "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 = "pexe_content_handler"
      } else {
        input_file_extension = ".nexe"
        output_file_extension = "_${target_cpu}.nexe.mojo"
        content_handler = "nacl_content_handler"
      }
      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 = []
      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}",
      ]
    }
  }
}
