# Copyright 2017 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 step shouldn't run in a target toolchain, since it produces the sysroot
# that the target toolchain uses as input.
assert(current_toolchain == "//build/toolchain/fuchsia:${target_cpu}-sysroot")

if (target_cpu == "x64") {
  fuchsia_target_arch = "x86_64"
} else if (target_cpu == "arm64") {
  fuchsia_target_arch = "aarch64"
}

if (host_cpu == "arm64") {
  clang_cpu = "aarch64"
} else if (host_cpu == "x64") {
  clang_cpu = "x86_64"
} else {
  assert(false, "Host CPU not supported")
}

clang_os = host_os
if (host_os == "mac") {
  clang_os = "darwin"
}

magenta_build_dir = rebase_path("//out/build-magenta/build-$magenta_project")
magenta_sysroot_list = magenta_build_dir + "/sysroot.list"
toolchain_sysroot = rebase_path(
        "//buildtools/toolchain/clang+llvm-$clang_cpu-$clang_os/$fuchsia_target_arch-fuchsia")

group("sysroot") {
  deps = [
    ":assemble_sysroot",
  ]
}

# This step combines the magenta sysroot and the C++ standard library headers
# from the libcxx repo into the sysroot in the output directory. This step
# should re-run whenever any of the source header files change. Additionally,
# since many targets will depend on some or all of these headers, we need to
# tell ninja that these files are produced by this build step so it knows those
# steps are dirty when this step runs.
action("assemble_sysroot") {
  script = "assemble_sysroot.py"
  sysroot_stamp = "$target_gen_dir/assemble_sysroot.stamp"
  sysroot = rebase_path("$root_build_dir/sysroot")
  if (host_os == "linux") {
    toolchain_stamp_file = "//buildtools/linux64/toolchain.stamp"
  } else if (host_os == "mac") {
    toolchain_stamp_file = "//buildtools/mac/toolchain.stamp"
  } else {
    assert(false, "Host OS not supported")
  }

  toolchain_sysroot_contents = exec_script("list_sysroot_contents.py",
                                           [
                                             rebase_path(sysroot, "//"),
                                             toolchain_sysroot,
                                           ],
                                           "trim scope",
                                           [ toolchain_stamp_file ])

  magenta_sysroot_list_contents = read_file(magenta_sysroot_list, "list lines")
  magenta_sysroot_inputs = []
  magenta_sysroot_outputs = []
  foreach(entry, magenta_sysroot_list_contents) {
    magenta_sysroot_inputs += [ "$magenta_build_dir/sysroot/$entry" ]
    magenta_sysroot_outputs += [ "$root_build_dir/sysroot/$entry" ]
  }
  inputs = toolchain_sysroot_contents.inputs + magenta_sysroot_inputs
  outputs = [ sysroot_stamp ] + toolchain_sysroot_contents.outputs +
            magenta_sysroot_outputs
  args = [
    "--toolchain_sysroot=$toolchain_sysroot",
    "--magenta_sysroot=$magenta_build_dir/sysroot",
    "--sysroot=$sysroot",
    "--sysroot_stamp=" + rebase_path(sysroot_stamp),
  ]
}
