1# Copyright (c) 2014 The Native Client Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import("//build/config/nacl/config.gni") 6 7# Native Client Definitions 8config("nacl_defines") { 9 if (is_linux || is_chromeos || is_android || is_nacl) { 10 defines = [ 11 "_POSIX_C_SOURCE=199506", 12 "_XOPEN_SOURCE=600", 13 "_GNU_SOURCE=1", 14 "__STDC_LIMIT_MACROS=1", 15 ] 16 } else if (is_win) { 17 defines = [ "__STDC_LIMIT_MACROS=1" ] 18 } 19 20 if (current_cpu == "pnacl") { 21 # TODO: Remove the following definition once NACL_BUILD_ARCH and 22 # NACL_BUILD_SUBARCH are defined by the PNaCl toolchain. 23 defines += [ "NACL_BUILD_ARCH=pnacl" ] 24 } 25} 26 27config("nexe_defines") { 28 defines = [ 29 "DYNAMIC_ANNOTATIONS_ENABLED=1", 30 "DYNAMIC_ANNOTATIONS_PREFIX=NACL_", 31 ] 32} 33 34config("nacl_warnings") { 35 if (is_win) { 36 # Some NaCl code uses forward declarations of static const variables, 37 # with initialized definitions later on. (The alternative would be 38 # many, many more forward declarations of everything used in that 39 # const variable's initializer before the definition.) The Windows 40 # compiler is too stupid to notice that there is an initializer later 41 # in the file, and warns about the forward declaration. 42 cflags = [ "/wd4132" ] 43 } 44} 45 46config("nacl_static_libstdc++") { 47 # The sysroot of linux x86 bots can have a different version of libstdc++ 48 # than the one that is on the bots natively. Linking dynamically against 49 # libstdc++ can then lead to linking against symbols that are not found when 50 # running the executable. 51 # Therefore, link statically instead. 52 if (is_linux && current_cpu == "x86") { 53 ldflags = [ "-static-libstdc++" ] 54 } 55} 56 57# The base target that all targets in the NaCl build should depend on. 58# This allows configs to be modified for everything in the NaCl build, even when 59# the NaCl build is composed into the Chrome build. (GN has no functionality to 60# add flags to everything in //native_client, having a base target works around 61# that limitation.) 62source_set("nacl_base") { 63 public_configs = [ 64 ":nacl_defines", 65 ":nacl_warnings", 66 ":nacl_static_libstdc++", 67 ] 68 if (current_os == "nacl") { 69 public_configs += [ ":nexe_defines" ] 70 } 71} 72 73config("compiler") { 74 configs = [] 75 cflags = [] 76 ldflags = [] 77 libs = [] 78 79 if (is_clang && current_cpu != "pnacl") { 80 # -no-integrated-as is the default in nacl-clang for historical 81 # compatibility with inline assembly code and so forth. But there 82 # are no such cases in Chromium code, and -integrated-as is nicer in 83 # general. Moreover, the IRT must be built using LLVM's assembler 84 # on x86-64 to preserve sandbox base address hiding. Use it 85 # everywhere for consistency (and possibly quicker builds). 86 cflags += [ "-integrated-as" ] 87 } 88 89 asmflags = cflags 90} 91 92config("compiler_codegen") { 93 cflags = [] 94 95 if (is_nacl_irt) { 96 cflags += [ 97 # A debugger should be able to unwind IRT call frames. This is 98 # the default behavior on x86-64 and when compiling C++ with 99 # exceptions enabled; the change is for the benefit of x86-32 C. 100 # The frame pointer is unnecessary when unwind tables are used. 101 "-fasynchronous-unwind-tables", 102 "-fomit-frame-pointer", 103 ] 104 105 if (current_cpu == "x86") { 106 # The x86-32 IRT needs to be callable with an under-aligned 107 # stack; so we disable SSE instructions, which can fault on 108 # misaligned addresses. See 109 # https://code.google.com/p/nativeclient/issues/detail?id=3935 110 cflags += [ 111 "-mstackrealign", 112 "-mno-sse", 113 ] 114 } 115 } 116 117 asmflags = cflags 118} 119 120config("irt_optimize") { 121 cflags = [ 122 # Optimize for space, keep the IRT nexe small. 123 "-Os", 124 125 # These are omitted from non-IRT libraries to keep the libraries 126 # themselves small. 127 "-ffunction-sections", 128 "-fdata-sections", 129 ] 130 131 ldflags = [ "-Wl,--gc-sections" ] 132} 133