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

# 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" ]

    script = "//third_party/yasm/run_yasm.py"
    sources = invoker.sources

    if (defined(invoker.inputs)) {
      inputs = invoker.inputs
    }

    # 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)"
    args = [ "./" +  # Force current dir.
             rebase_path(get_label_info(yasm_label, "root_out_dir") + "/yasm",
                         root_build_dir) ]

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