# Copyright 2016 The Fuchsia 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/config/clang/clang.gni")

# This provides the yasm_assemble() template which uses YASM to assemble
# assembly files.
#
# Files to be assembled with YASM should have an extension of .asm.
#
# Parameters
#
#   yasm_flags (optional)
#       [list of strings] Pass additional flags into YASM. These are appended
#       to the command line. Note that the target machine type and system is
#       already set up based on the current toolchain so you don't need to
#       specify these things (see below).
#
#       Example: yasm_flags = [ "--force-strict" ]
#
#   include_dirs (optional)
#       [list of dir names] List of additional include dirs. Note that the
#       source root and the root generated file dir is always added, just like
#       our C++ build sets up.
#
#       Example: include_dirs = [ "//some/other/path", target_gen_dir ]
#
#   defines (optional)
#       [list of strings] List of defines, as with the native code defines.
#
#       Example: defines = [ "FOO", "BAR=1" ]
#
#   inputs, deps, visibility  (optional)
#       These have the same meaning as in an action.
#
# Example
#
#   yasm_assemble("my_yasm_target") {
#     sources = [
#       "ultra_optimized_awesome.asm",
#     ]
#     include_dirs = [ "assembly_include" ]
#   }

if (is_mac || is_ios) {
  if (current_cpu == "x86") {
    _yasm_flags = [
      "-fmacho32",
      "-m",
      "x86",
    ]
  } else if (current_cpu == "x64") {
    _yasm_flags = [
      "-fmacho64",
      "-m",
      "amd64",
    ]
  }
} else {  # POSIX
  if (current_cpu == "x86") {
    _yasm_flags = [
      "-felf32",
      "-m",
      "x86",
    ]
  } else if (current_cpu == "x64") {
    _yasm_flags = [
      "-DPIC",
      "-felf64",
      "-m",
      "amd64",
    ]
  }
}

asm_obj_extension = "o"

template("yasm_assemble") {
  assert(defined(invoker.sources), "Need sources defined for $target_name")

  # Only depend on YASM on x86 systems. Force compilation of .asm files for
  # ARM to fail.
  assert(current_cpu == "x86" || current_cpu == "x64")

  action_name = "${target_name}_action"
  source_set_name = target_name

  action_foreach(action_name) {
    # Only the source set can depend on this.
    visibility = [ ":$source_set_name" ]

    sources = invoker.sources

    run_yasm_script = "//third_party/yasm/run_yasm.py"
    script = "//build/gn_run_binary.sh"

    inputs = [
      run_yasm_script,
    ]

    # Executable (first in the args). The binary might be in the root build dir
    # (no cross-compiling) or in a toolchain-specific subdirectory of that
    # (when cross-compiling).
    yasm_label = "//third_party/yasm($host_toolchain)"
    yasm_path = get_label_info(yasm_label, "root_out_dir") + "/yasm"
    args = [
      clang_prefix,
      rebase_path(run_yasm_script, root_build_dir),
    ]

    if (defined(invoker.yasm_ignore_preprocess_only_errors) &&
        invoker.yasm_ignore_preprocess_only_errors) {
      args += [ "--ignore-preprocess-only-errors" ]
    }

    args += [ "./" + rebase_path(yasm_path, root_build_dir) ]  # Force current dir.

    # List the yasm binary as an input so the action is re-run when it changes.
    inputs += [ yasm_path ]
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    # Deps.
    deps = [
      yasm_label,
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    # Flags.
    args += _yasm_flags
    if (defined(invoker.yasm_flags)) {
      args += invoker.yasm_flags
    }

    # User defined include dirs go first.
    if (defined(invoker.include_dirs)) {
      foreach(include, invoker.include_dirs) {
        args += [ "-I" + rebase_path(include, root_build_dir) ]
      }
    }

    # Default yasm include dirs. Make it match the native build (source root and
    # root generated code directory).
    # This goes to the end of include list.
    args += [
      "-I.",

      # Using "//." will produce a relative path "../.." which looks better than
      # "../../" which will result from using "//" as the base (although both
      # work). This is because rebase_path will terminate the result in a
      # slash if the input ends in a slash.
      "-I" + rebase_path("//.", root_build_dir),
      "-I" + rebase_path(root_gen_dir, root_build_dir),
    ]

    # Extra defines.
    if (defined(invoker.defines)) {
      foreach(def, invoker.defines) {
        args += [ "-D$def" ]
      }
    }

    # Output file.
    outputs = [
      "$target_out_dir/$source_set_name/{{source_name_part}}.o",
    ]
    args += [
      "-o",
      rebase_path(outputs[0], root_build_dir),
      "{{source}}",
    ]

    # The wrapper script run_yasm will write the depfile to the same name as
    # the output but with .d appended (like gcc will).
    depfile = outputs[0] + ".d"
  }

  # Gather the .o files into a linkable thing. This doesn't actually link
  # anything (a source set just compiles files to link later), but will pass
  # the object files generated by the action up the dependency chain.
  static_library(source_set_name) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    sources = get_target_outputs(":$action_name")

    deps = [
      ":$action_name",
    ]
  }
}
