# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Template for host toolchains.
template("host_cc_toolchain") {
  toolchain(target_name) {
    assert(defined(invoker.ar), "\"ar\" must be defined for ${target_name}.")
    assert(defined(invoker.cc), "\"cc\" must be defined for ${target_name}.")
    assert(defined(invoker.cxx), "\"cxx\" must be defined for ${target_name}.")

    # Collect extra flags from the toolchain.
    extra_defines = ""
    extra_cflags = ""
    extra_ldflags = ""
    if (defined(invoker.extra_defines)) {
      extra_defines += " ${invoker.extra_defines}"
    }
    if (defined(invoker.extra_cflags)) {
      extra_cflags += " ${invoker.extra_cflags}"
    }
    if (defined(invoker.extra_ldflags)) {
      extra_ldflags += " ${invoker.extra_ldflags}"
    }

    tool("cc") {
      depfile = "{{output}}.d"
      command = "${invoker.cc} -MMD -MF $depfile ${extra_defines} {{defines}} {{include_dirs}} ${extra_cflags} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "CC {{output}}"
      outputs = [
        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
      ]
    }

    tool("cxx") {
      depfile = "{{output}}.d"
      command = "${invoker.cxx} -MMD -MF $depfile ${extra_defines} {{defines}} {{include_dirs}} ${extra_cflags} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
      depsformat = "gcc"
      description = "CXX {{output}}"
      outputs = [
        "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
      ]
    }

    tool("alink") {
      rspfile = "{{output}}.rsp"
      command = "rm -f {{output}} && ${invoker.ar} rcs {{output}} @$rspfile"
      description = "AR {{target_output_name}}{{output_extension}}"
      rspfile_content = "{{inputs}}"
      outputs = [
        "{{target_out_dir}}/{{target_output_name}}{{output_extension}}",
      ]
      default_output_extension = ".a"
      output_prefix = "lib"
    }

    tool("solink") {
      soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so".
      sofile = "{{output_dir}}/$soname"
      rspfile = soname + ".rsp"

      command = "${invoker.cxx} -shared ${extra_ldflags} {{ldflags}} -o $sofile -Wl,-soname=$soname @$rspfile"
      rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}"

      description = "SOLINK $soname"

      # Use this for {{output_extension}} expansions unless a target manually
      # overrides it (in which case {{output_extension}} will be what the target
      # specifies).
      default_output_extension = ".so"

      # Use this for {{output_dir}} expansions unless a target manually overrides
      # it (in which case {{output_dir}} will be what the target specifies).
      default_output_dir = "{{root_out_dir}}"

      outputs = [
        sofile,
      ]
      link_output = sofile
      depend_output = sofile
      output_prefix = "lib"
    }

    tool("link") {
      outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
      rspfile = "$outfile.rsp"
      command = "${invoker.cxx} ${extra_ldflags} {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group {{libs}}"
      description = "LINK $outfile"
      default_output_dir = "{{root_out_dir}}"
      rspfile_content = "{{inputs}}"
      outputs = [
        outfile,
      ]
    }

    tool("stamp") {
      command = "touch {{output}}"
      description = "STAMP {{output}}"
    }

    tool("copy") {
      command = "cp -af {{source}} {{output}}"
      description = "COPY {{source}} {{output}}"
    }

    if (defined(invoker.toolchain_args)) {
      toolchain_args = {
        forward_variables_from(invoker.toolchain_args, "*")
      }
    }
  }
}

template("host_toolchain") {
  assert(defined(invoker.use_platform),
         "\"use_platform\" must be defined for ${target_name}.")
  if (invoker.use_platform) {
    assert(defined(invoker.max_cpus),
           "\"max_cpus\" must be defined for ${target_name}.")
    assert(defined(invoker.max_vms),
           "\"max_vms\" must be defined for ${target_name}.")
  }

  # Specialize for clang.
  host_cc_toolchain("${target_name}_clang") {
    ar = "llvm-ar"
    cc = "clang -fcolor-diagnostics"
    cxx = "clang++ -fcolor-diagnostics -stdlib=libc++"

    # TODO: remove the need for this
    extra_defines = "-DPL011_BASE=0"

    if (invoker.use_platform) {
      toolchain_args = {
        use_platform = true

        # When building for the ${target_name}, use the fake architecture to make things
        # testable.
        plat_arch = "fake"
        plat_max_cpus = invoker.max_cpus
        plat_max_vms = invoker.max_vms
      }
    }
  }

  # Specialize for gcc.
  host_cc_toolchain("${target_name}_gcc") {
    ar = "ar"
    cc = "gcc -fdiagnostics-color=always"
    cxx = "g++ -fdiagnostics-color=always"

    # TODO: remove the need for this
    extra_defines = "-DPL011_BASE=0"

    if (invoker.use_platform) {
      toolchain_args = {
        use_platform = true

        # When building for the ${target_name}, use the fake architecture to make things
        # testable.
        plat_arch = "fake"
        plat_max_cpus = invoker.max_cpus
        plat_max_vms = invoker.max_vms
      }
    }
  }
}
