# 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("//mojo/public/mojo.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)) {
    output = invoker.output_name + ".mojo"
    library_target_name = invoker.output_name + "_library"
  } else {
    output = target_name + ".mojo"
    library_target_name = 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 = "${library_target_name}.so"
  } else {
    assert(false, "Platform not supported.")
  }

  final_target_name = target_name

  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
    }
    # Copy the prebuilt mojo_shell if using it.
    if (defined(invoker.datadeps)) {
      datadeps = invoker.datadeps
      if (use_prebuilt_mojo_shell) {
        datadeps += [ "//mojo/public/tools:copy_mojo_shell" ]
      }
    } else {
      if (use_prebuilt_mojo_shell) {
        datadeps = [ "//mojo/public/tools:copy_mojo_shell" ]
      }
    }
    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 = [ "${root_out_dir}/${library_name}" ]
    outputs = [ "${root_out_dir}/${output}" ]
  }
}
