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

import("//build/config/fuchsia/config.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/config/sysroot.gni")

assert(is_fuchsia)
assert(!is_posix)

config("compiler") {
  sdk_version_file = "${fuchsia_sdk}/.hash"
  sdk_version = read_file(sdk_version_file, "trim string")
  defines = [
    # To force full builds after SDK updates in case of ABI changes.
    "FUCHSIA_SDK_VERSION=$sdk_version",
  ]
  cflags = []
  ldflags = []
  if (current_cpu == "arm64") {
    cflags += [ "--target=aarch64-fuchsia" ]
    ldflags += [ "--target=aarch64-fuchsia" ]
  } else if (current_cpu == "x64") {
    cflags += [ "--target=x86_64-fuchsia" ]
    ldflags += [ "--target=x86_64-fuchsia" ]
  } else {
    assert(false, "Unsupported architecture")
  }
  asmflags = cflags

  ldflags += [
    # The stack defaults to 256k on Fuchsia (see
    # https://fuchsia.googlesource.com/zircon/+/master/system/private/zircon/stack.h#9),
    # but on other platforms it's much higher, so a variety of code assumes more
    # will be available. Raise to 8M which matches e.g. macOS.
    "-Wl,-z,stack-size=0x800000",

    # We always want fdio or else e.g. stdio wouldn't be initialized if fdio
    # happens to not be directly referenced. The common POSIX-y compiler setup
    # uses -Wl,--as-needed which drops it if it's simply "-lfdio" from a libs
    # setting. Disable --as-needed, add fdio, and then set back to --as-needed.
    # https://crbug.com/731217.
    "-Wl,--no-as-needed",
    "-lfdio",
    "-Wl,--as-needed",
  ]

  # Add SDK lib dir for -lfdio above.
  lib_dirs = [ "${fuchsia_sdk}/arch/${current_cpu}/lib" ]

  # TODO(crbug.com/821951): Clang enables SafeStack by default when targeting
  # Fuchsia, but it breaks some tests, notably in V8.
  cflags += [ "-fno-sanitize=safe-stack" ]

  libs = [ "zircon" ]
}

# Writes an extended version of storage-full.blk to fvm.extended.blk.
blobstore_extended_path = "$root_out_dir/storage-extended.blk"
action("blobstore_extended") {
  # The file is grown by 1GB, which should be large enough to hold packaged
  # binaries and assets. The value should be increased if the size becomes a
  # limitation in the future.
  _extend_size = "1073741824"  # 1GB

  _blobstore_path =
      "${fuchsia_sdk}/../images/${current_cpu}/qemu/storage-full.blk"

  script = "//build/config/fuchsia/extend_fvm.py"

  inputs = [
    _blobstore_path,
    "${fuchsia_sdk}/tools/fvm",
  ]
  outputs = [
    blobstore_extended_path,
  ]

  args = [
    rebase_path("${fuchsia_sdk}/tools/fvm", root_build_dir),
    rebase_path(_blobstore_path, root_build_dir),
    rebase_path(blobstore_extended_path, root_build_dir),
    _extend_size,
  ]
}

#  _________________________________________
# / Create a compressed copy-on-write (COW) \
# \ image based on storage-extended.blk.    /
#  -----------------------------------------
#         \   ^__^
#          \  (oo)\_______
#             (__)\       )\/\
#                 ||----w |
#                 ||     ||
action("blobstore_extended_qcow2") {
  script = "//build/gn_run_binary.py"

  deps = [
    ":blobstore_extended",
  ]
  inputs = [
    blobstore_extended_path,
  ]
  outputs = [
    blobstore_qcow_path,
  ]
  data = [
    blobstore_qcow_path,
  ]

  args = [
    rebase_path("${qemu_root}/bin/qemu-img", root_build_dir),
    "convert",
    "-f",
    "raw",
    "-O",
    "qcow2",
    "-c",
    rebase_path(blobstore_extended_path, root_build_dir),
    rebase_path(blobstore_qcow_path, root_build_dir),
  ]
}

# Settings for executables.
config("executable_config") {
  ldflags = [ "-pie" ]
}
