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

declare_args() {
  # By default, there is no go build tool, because go builds are not supported.
  go_build_tool = ""
}

# Declare a go test binary target.
#
# The target generates a go test executable, linking against other C code,
# which is compiled into a static library and linked against Go.
#
# Only works on linux. |go_build_tool| must be set to the absolute path
# of the go build tool.
#
# Variables (all required)
#   sources: list of .go files to compile
#   static_library_sources: list of C sources needed for the static library
#   deps: dependencies for the static library

template("go_test_binary") {
  # Only available on linux for now.
  assert(is_linux)
  assert(defined(invoker.sources))
  assert(go_build_tool != "")

  static_library_name = target_name + "_static_library"

  static_library(static_library_name) {
    testonly = true
    sources = invoker.static_library_sources
    deps = invoker.deps
    complete_static_lib = true
  }

  action(target_name) {
    testonly = true
    deps = [
      ":$static_library_name",
    ]
    script = "//mojo/go/go.py"
    inputs = invoker.sources
    outputs = [
      "${target_out_dir}/${target_name}",
    ]

    # Since go test does not permit specifying an output directory or output
    # binary name, we create a temporary build directory, and the python
    # script will later identify the output, copy it to the target location,
    # and clean up the temporary build directory.
    build_dir = "${target_out_dir}/${target_name}_build"
    args = [
             "--",
             "${go_build_tool}",
             rebase_path(build_dir, root_build_dir),
             rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
             rebase_path("//", root_build_dir),
             rebase_path(root_out_dir, root_build_dir),
             "-I" + rebase_path("//"),
             " -L" + rebase_path(target_out_dir) + " -l" + static_library_name +
                 " -lstdc++ -lpthread -lm -lglib-2.0",
             "test",
             "-c",
           ] + rebase_path(invoker.sources, build_dir)
  }
}

template("go_shared_library") {
  # Only available on android for now.
  assert(is_android)
  assert(defined(invoker.sources))
  assert(go_build_tool != "")

  static_library_name = target_name + "_static_library"

  static_library(static_library_name) {
    complete_static_lib = true
    deps = invoker.deps
  }

  action(target_name) {
    deps = [
      ":$static_library_name",
    ]
    script = "//mojo/go/go.py"
    inputs = invoker.sources
    outputs = [
      "${target_out_dir}/${target_name}",
    ]

    # Since go test does not permit specifying an output directory or output
    # binary name, we create a temporary build directory, and the python
    # script will later identify the output, copy it to the target location,
    # and clean up the temporary build directory.
    build_dir = "${target_out_dir}/${target_name}_build"
    args = [
             "--",
             "CGO_ENABLED=1 GOOS=android GOARCH=arm GOARM=7 ${go_build_tool}",
             rebase_path(build_dir, root_build_dir),
             rebase_path(target_out_dir, root_build_dir) + "/${target_name}",
             rebase_path("//", root_build_dir),
             rebase_path(root_out_dir, root_build_dir),
             "-I" + rebase_path("//"),
             " -L" + rebase_path(target_out_dir) + " -l" + static_library_name +
                 "",
             "build -ldflags=-shared",
           ] + rebase_path(invoker.sources, build_dir)
  }
}
