# Copyright (c) 2014 The Native Client 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/nacl/config.gni")

# Native Client Definitions
config("nacl_defines") {
  if (is_linux || is_chromeos || is_android || is_nacl) {
    defines = [
      "_POSIX_C_SOURCE=199506",
      "_XOPEN_SOURCE=600",
      "_GNU_SOURCE=1",
      "__STDC_LIMIT_MACROS=1",
    ]
  } else if (is_win) {
    defines = [ "__STDC_LIMIT_MACROS=1" ]
  }

  if (current_cpu == "pnacl" && !is_nacl_nonsfi) {
    # TODO: Remove the following definition once NACL_BUILD_ARCH and
    # NACL_BUILD_SUBARCH are defined by the PNaCl toolchain.
    defines += [ "NACL_BUILD_ARCH=pnacl" ]
  }
}

config("nexe_defines") {
  defines = [
    "DYNAMIC_ANNOTATIONS_ENABLED=1",
    "DYNAMIC_ANNOTATIONS_PREFIX=NACL_",
  ]
}

config("nacl_warnings") {
  if (is_win) {
    # Some NaCl code uses forward declarations of static const variables,
    # with initialized definitions later on.  (The alternative would be
    # many, many more forward declarations of everything used in that
    # const variable's initializer before the definition.)  The Windows
    # compiler is too stupid to notice that there is an initializer later
    # in the file, and warns about the forward declaration.
    cflags = [ "/wd4132" ]
  }
}

# The base target that all targets in the NaCl build should depend on.
# This allows configs to be modified for everything in the NaCl build, even when
# the NaCl build is composed into the Chrome build.  (GN has no functionality to
# add flags to everything in //native_client, having a base target works around
# that limitation.)
source_set("nacl_base") {
  public_configs = [
    ":nacl_defines",
    ":nacl_warnings",
  ]
  if (current_os == "nacl") {
    public_configs += [ ":nexe_defines" ]
  }
}

config("compiler") {
  configs = []
  cflags = []
  ldflags = []
  libs = []

  if (is_clang && current_cpu != "pnacl") {
    # -no-integrated-as is the default in nacl-clang for historical
    # compatibility with inline assembly code and so forth.  But there
    # are no such cases in Chromium code, and -integrated-as is nicer in
    # general.  Moreover, the IRT must be built using LLVM's assembler
    # on x86-64 to preserve sandbox base address hiding.  Use it
    # everywhere for consistency (and possibly quicker builds).
    cflags += [ "-integrated-as" ]
  }
  if (is_nacl_nonsfi) {
    cflags += [ "--pnacl-allow-translate" ]
    ldflags += [
      "--pnacl-allow-translate",
      "--pnacl-allow-native",
      "-Wl,--noirt",
      "-Wt,--noirt",
      "-Wt,--noirtshim",

      # The clang driver automatically injects -lpthread when using libc++, but
      # the toolchain doesn't have it yet.  To get around this, use
      # -nodefaultlibs and make each executable target depend on
      # "//native_client/src/nonsfi/irt:nacl_sys_private".
      "-nodefaultlibs",
    ]
    libs += [
      "c++",
      "m",
      "c",
      "pnaclmm",
    ]
    include_dirs = [ "//native_client/src/public/linux_syscalls" ]
  }

  asmflags = cflags
}

config("compiler_codegen") {
  cflags = []

  if (is_nacl_irt) {
    cflags += [
      # A debugger should be able to unwind IRT call frames.  This is
      # the default behavior on x86-64 and when compiling C++ with
      # exceptions enabled; the change is for the benefit of x86-32 C.
      # The frame pointer is unnecessary when unwind tables are used.
      "-fasynchronous-unwind-tables",
      "-fomit-frame-pointer",
    ]

    if (current_cpu == "x86") {
      # The x86-32 IRT needs to be callable with an under-aligned
      # stack; so we disable SSE instructions, which can fault on
      # misaligned addresses.  See
      # https://code.google.com/p/nativeclient/issues/detail?id=3935
      cflags += [
        "-mstackrealign",
        "-mno-sse",
      ]
    }
  }

  asmflags = cflags
}

config("irt_optimize") {
  cflags = [
    # Optimize for space, keep the IRT nexe small.
    "-Os",

    # These are omitted from non-IRT libraries to keep the libraries
    # themselves small.
    "-ffunction-sections",
    "-fdata-sections",
  ]

  ldflags = [ "-Wl,--gc-sections" ]
}
