# 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,
                             [
                               "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"
      }
      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}",
      ]
    }
  }
}
