# 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
  }

  final_target_name = target_name

  if (!is_nacl) {
    output = base_target_name + ".mojo"
    library_target_name = base_target_name + "_library"

    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) {
      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) {
      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.data_deps)) {
        data_deps = invoker.data_deps
      }

      # Copy any necessary prebuilt artifacts.
      if (use_prebuilt_mojo_shell) {
        data_deps +=
            [ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ]
      }
      if (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.forward_dependent_configs_from)) {
        forward_dependent_configs_from = invoker.forward_dependent_configs_from
      }
      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
      }

      visibility = [ ":${final_target_name}" ]
    }

    copy(final_target_name) {
      if (defined(invoker.testonly)) {
        testonly = invoker.testonly
      }
      if (defined(invoker.visibility)) {
        visibility = invoker.visibility
      }
      deps = [
        ":${library_target_name}",
      ]

      sources = [
        "${library_dir}/${library_name}",
      ]
      outputs = [
        "${root_out_dir}/${output}",
      ]
    }
  } else {
    nexe_target_name = base_target_name + "_nexe"
    nexe_name = base_target_name + ".nexe"

    output = "${base_target_name}_${target_cpu}.nexe.mojo"

    executable(nexe_target_name) {
      output_name = base_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.data_deps)) {
        data_deps = invoker.data_deps
      }

      # Copy any necessary prebuilt artifacts.
      if (use_prebuilt_mojo_shell) {
        data_deps +=
            [ rebase_path("mojo/public/tools:copy_mojo_shell", ".", mojo_root) ]
      }
      if (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.forward_dependent_configs_from)) {
        forward_dependent_configs_from = invoker.forward_dependent_configs_from
      }
      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
      }

      visibility = [ ":${final_target_name}" ]
    }

    action(target_name) {
      if (defined(invoker.testonly)) {
        testonly = invoker.testonly
      }
      if (defined(invoker.visibility)) {
        visibility = invoker.visibility
      }

      script = rebase_path("mojo/public/tools/prepend.py", ".", mojo_root)

      input_path = "${root_out_dir}/${nexe_name}"
      inputs = [
        input_path,
      ]

      output_path = "${root_build_dir}/${output}"
      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:nacl_content_handler",
      ]
    }
  }
}

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
  #   output_name (optional): override for the output file name
  template("mojo_android_application") {
    assert(defined(invoker.input_so))
    assert(defined(invoker.input_dex_jar))

    zip_action_name = "${target_name}_zip"
    zip_action_output = "$target_gen_dir/${target_name}.zip"
    action(zip_action_name) {
      script = "//build/android/gn/zip.py"

      inputs = [
        invoker.input_so,
        invoker.input_dex_jar,
      ]

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

    if (defined(invoker.output_name)) {
      mojo_output = "$root_out_dir/" + invoker.output_name + ".mojo"
    } else {
      mojo_output = "$root_out_dir/" + target_name + ".mojo"
    }

    action(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",
      ]
    }
  }
}
