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

sysroot = "$root_out_dir/sysroot"
sysroot_lib_dir = "${sysroot}/usr/lib"

# See the discussion below about what these files are, and their
# relationship to other C runtime files.
source_set("crt") {
  cflags = []

  configs = []
  configs += [ "//fusl:fusl_config" ]

  cflags += [
    "-DCRT",
    "-fno-stack-protector",
  ]

  sources = [
    "Scrt1.c",
    "crt1.c",
    "rcrt1.c",
  ]

  if (target_cpu == "x64") {
    sources += [
      "x86_64/crti.s",
      "x86_64/crtn.s",
    ]
  } else {
    sources += [
      "crti.c",
      "crtn.c",
    ]
  }
}

template("copy_objects") {
  assert(defined(invoker.input_dir), "input_dir must be defined")
  assert(defined(invoker.output_dir), "output_dir must be defined")
  object_prefix = ""
  if (defined(invoker.object_prefix)) {
    object_prefix = invoker.object_prefix
  }
  foreach(file, invoker.sources) {
    copy("copy_${file}") {
      sources = [
        rebase_path("${invoker.input_dir}/${object_prefix}${file}",
                    "",
                    target_out_dir),
      ]
      outputs = [
        "${invoker.output_dir}/${file}",
      ]
      deps = [
        ":crt",
      ]
    }
  }
  group(target_name) {
    deps = [
      ":crt",
    ]
    foreach(file, invoker.sources) {
      deps += [ ":copy_$file" ]
    }
  }
}

copy_objects("copy_crt_generic_objects") {
  sources = [
    "Scrt1.o",
    "crt1.o",
    "rcrt1.o",
  ]
  object_prefix = "crt."
  input_dir = "."
  output_dir = "${sysroot_lib_dir}"
}

copy_objects("copy_crt_x64_objects") {
  sources = [
    "crti.o",
    "crtn.o",
  ]
  object_prefix = "crt."
  input_dir = "x86_64"
  output_dir = "${sysroot_lib_dir}"
}

# The crtXXX.o files that are copied elsewhere in this file define
# _start, and the machinery to implement calling into the init and
# fini sections. These things are libc dependent and hence part of
# libc.
#
# Unlike the other crtXXX.o files, crtbegin and crtend, are provided
# by the toolchain, not the libc. So we steal them from the host.
#
# crtbegin and crtend know how to call constructors and destructors.
#
# libgcc provides runtime support, and so also comes from the
# compiler. Things in here are stack unwinding, arithmetic not
# supported on the target architecture, and so on.
#
# The best document I am aware of describing the different variants of
# these files (and crtXXX.o above) is
# https://dev.gentoo.org/~vapier/crt.txt
#
# S and _s mean shared or PIE
# T and _eh mean static
action("copy_crt_objects") {
  script = "//fusl/tools/populate_crt.py"

  clang = "//third_party/llvm-build/Release+Asserts/bin/clang"
  target = "$sysroot/usr/lib"

  files = [
    "crtbegin.o",
    "crtbeginS.o",
    "crtbeginT.o",
    "crtend.o",
    "crtendS.o",

    "libgcc.a",
    "libgcc_eh.a",
    "libgcc_s.so",
  ]

  args = [
    rebase_path(clang),
    rebase_path(target),
  ]
  args += files

  outputs = [
    "$target/crtbegin.o",
    "$target/crtbeginS.o",
    "$target/crtbeginT.o",
    "$target/crtend.o",
    "$target/crtendS.o",

    "$target/libgcc.a",
    "$target/libgcc_eh.a",
    "$target/libgcc_s.so",
  ]

  deps = [
    ":copy_crt_${current_cpu}_objects",
    ":copy_crt_generic_objects",
  ]
}
