1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132

build / config / nacl / BUILD.gn [blame]

# 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") {
    # 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 doesn't see that there is an initializer later in the file,
    # and warns about the forward declaration.
    cflags = [ "/wd4132" ]
  }
}

config("nacl_static_libstdc++") {
  # The sysroot of linux x86 bots can have a different version of libstdc++
  # than the one that is on the bots natively. Linking dynamically against
  # libstdc++ can then lead to linking against symbols that are not found when
  # running the executable.
  # Therefore, link statically instead.
  if (is_linux && current_cpu == "x86") {
    ldflags = [ "-static-libstdc++" ]
  }
}

# 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",
    ":nacl_static_libstdc++",
  ]
  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" ]
  }

  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" ]
}