# Copyright (c) 2013 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/android/config.gni")
import("//build/config/chrome_build.gni")
if (current_cpu == "arm") {
  import("//build/config/arm.gni")
}
if (current_cpu == "mipsel" || current_cpu == "mips64el") {
  import("//build/config/mips.gni")
}
if (is_posix) {
  import("//build/config/gcc/gcc_version.gni")
}
if (is_win) {
  import("//build/config/win/visual_studio_version.gni")
}

import("//build/toolchain/ccache.gni")
import("//build/config/sanitizers/sanitizers.gni")

declare_args() {
  # Normally, Android builds are lightly optimized, even for debug builds, to
  # keep binary size down. Setting this flag to true disables such optimization
  android_full_debug = false

  # Whether to use the binary binutils checked into third_party/binutils.
  # These are not multi-arch so cannot be used except on x86 and x86-64 (the
  # only two architectures that are currently checked in). Turn this off when
  # you are using a custom toolchain and need to control -B in cflags.
  linux_use_bundled_binutils = is_linux && current_cpu == "x64"

  # Compile in such a way as to enable profiling of the generated code. For
  # example, don't omit the frame pointer and leave in symbols.
  enable_profiling = false

  # Compile in such a way as to make it possible for the profiler to unwind full
  # stack frames. Setting this flag has a large effect on the performance of the
  # generated code than just setting profiling, but gives the profiler more
  # information to analyze.
  # Requires profiling to be set to true.
  enable_full_stack_frames_for_profiling = false

  # Use gold for linking on 64-bit Linux only (on 32-bit it runs out of
  # address space, and it doesn't support cross-compiling).
  use_gold = is_linux && current_cpu == "x64"

  # use_debug_fission: whether to use split DWARF debug info
  # files. This can reduce link time significantly, but is incompatible
  # with some utilities such as icecc and ccache. Requires gold and
  # gcc >= 4.8 or clang.
  # http://gcc.gnu.org/wiki/DebugFission
  use_debug_fission = is_debug && !is_win && use_gold &&
                      linux_use_bundled_binutils && !use_ccache

  if (is_win) {
    # Whether the VS xtree header has been patched to disable warning 4702. If
    # it has, then we don't need to disable 4702 (unreachable code warning).
    # The patch is preapplied to the internal toolchain and hence all bots.
    msvs_xtree_patched = false
  }
}

# default_include_dirs ---------------------------------------------------------
#
# This is a separate config so that third_party code (which would not use the
# source root and might have conflicting versions of some headers) can remove
# this and specify their own include paths.
config("default_include_dirs") {
  include_dirs = [
    "//",
    root_gen_dir,
  ]
}

# TODO(GYP): is_ubsan, is_ubsan_vptr
if (!is_win) {
  using_sanitizer = is_asan || is_lsan || is_tsan || is_msan
}

# compiler ---------------------------------------------------------------------
#
# Base compiler configuration.
#
# See also "runtime_library" below for related stuff and a discussion about
# where stuff should go. Put warning related stuff in the "warnings" config.

config("compiler") {
  cflags = []
  cflags_c = []
  cflags_cc = []
  ldflags = []
  defines = []

  # In general, Windows is totally different, but all the other builds share
  # some common GCC configuration. This section sets up Windows and the common
  # GCC flags, and then we handle the other non-Windows platforms specifically
  # below.
  if (is_win) {
    # Windows compiler flags setup.
    # -----------------------------
    cflags += [
      "/Gy",  # Enable function-level linking.
      "/GS",  # Enable buffer security checking.
      "/FS",  # Preserve previous PDB behavior.
    ]

    # Building with Clang on Windows is a work in progress and very
    # experimental. See crbug.com/82385.
    # Keep this in sync with the similar block in build/common.gypi
    if (is_clang) {
      cflags += [
        # Many files use intrinsics without including this header.
        # TODO(hans): Fix those files, or move this to sub-GYPs.
        "/FIIntrin.h",
      ]

      if (visual_studio_version == "2013") {
        cflags += [ "-fmsc-version=1800" ]
      } else if (visual_studio_version == "2015") {
        cflags += [ "-fmsc-version=1900" ]
      }

      if (current_cpu == "x86") {
        cflags += [
          "/fallback",
          "-m32",
        ]
      } else {
        cflags += [ "-m64" ]
      }
      if (exec_script("//build/win/use_ansi_codes.py", [], "trim string") ==
          "True") {
        cflags += [
          # cmd.exe doesn't understand ANSI escape codes by default,
          # so only enable them if something emulating them is around.
          "-fansi-escape-codes",
        ]
      }
    }
  } else {
    # Common GCC compiler flags setup.
    # --------------------------------
    cflags += [ "-fno-strict-aliasing" ]  # See http://crbug.com/32204
    cflags_cc += [
      "-fno-threadsafe-statics",

      # Not exporting C++ inline functions can generally be applied anywhere
      # so we do so here. Normal function visibility is controlled by
      # //build/config/gcc:symbol_visibility_hidden.
      "-fvisibility-inlines-hidden",
    ]

    # Stack protection.
    if (is_mac) {
      cflags += [ "-fstack-protector-all" ]
    } else if (is_linux) {
      cflags += [
        "-fstack-protector",
        "--param=ssp-buffer-size=4",
      ]
    }

    # Linker warnings.
    if (!(is_chromeos && current_cpu == "arm") && !is_mac && !is_ios) {
      # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580
      ldflags += [ "-Wl,--fatal-warnings" ]
    }

    # Common options for AddressSanitizer, LeakSanitizer, ThreadSanitizer and
    # MemorySanitizer
    if (using_sanitizer) {
      cflags += [
        "-fno-omit-frame-pointer",
        "-gline-tables-only",
      ]
    }
    if (is_asan) {
      asan_blacklist_path =
          rebase_path("//tools/memory/asan/blacklist.txt", root_build_dir)
      cflags += [
        "-fsanitize=address",
        "-fsanitize-blacklist=$asan_blacklist_path",
      ]
      if (is_mac) {
        cflags += [ "-mllvm -asan-globals=0" ]  # http://crbug.com/352073
        # TODO(GYP): deal with mac_bundles.
      }
    }
    if (is_lsan) {
      cflags += [ "-fsanitize=leak" ]
    }
    if (is_tsan) {
      tsan_blacklist_path =
          rebase_path("//tools/memory/tsan_v2/ignores.txt", root_build_dir)
      cflags += [
        "-fsanitize=thread",
        "-fsanitize-blacklist=$tsan_blacklist_path",
      ]
    }
    if (is_msan) {
      msan_blacklist_path =
          rebase_path("//tools/msan/blacklist.txt", root_build_dir)
      cflags += [
        "-fsanitize=memory",
        "-fsanitize-memory-track-origins=$msan_track_origins",
        "-fsanitize-blacklist=$msan_blacklist_path",
      ]
    }

    if (use_custom_libcxx) {
      cflags_cc += [ "-nostdinc++" ]
      include_dirs = [
        "//buildtools/third_party/libc++/trunk/include",
        "//buildtools/third_party/libc++abi/trunk/include",
      ]
    }
  }

  if (is_clang && is_debug) {
    # Allow comparing the address of references and 'this' against 0
    # in debug builds. Technically, these can never be null in
    # well-defined C/C++ and Clang can optimize such checks away in
    # release builds, but they may be used in asserts in debug builds.
    cflags_cc += [
      "-Wno-undefined-bool-conversion",
      "-Wno-tautological-undefined-compare",
    ]
  }

  if (is_clang && !is_nacl) {
    # This is here so that all files get recompiled after a clang roll and
    # when turning clang on or off. (defines are passed via the command line,
    # and build system rebuild things when their commandline changes). Nothing
    # should ever read this define.
    defines +=
        [ "CR_CLANG_REVISION=" + exec_script("//tools/clang/scripts/update.py",
                                             [ "--print-revision" ],
                                             "trim string") ]
  }

  # Mac-specific compiler flags setup.
  # ----------------------------------
  if (is_mac || is_ios) {
    # These flags are shared between the C compiler and linker.
    common_mac_flags = []

    # CPU architecture.
    if (current_cpu == "x64") {
      common_mac_flags += [
        "-arch",
        "x86_64",
      ]
    } else if (current_cpu == "x86") {
      common_mac_flags += [
        "-arch",
        "i386",
      ]
    } else if (current_cpu == "arm") {
      common_mac_flags += [
        "-arch",
        "arm64",
      ]
    }

    cflags += common_mac_flags

    # Without this, the constructors and destructors of a C++ object inside
    # an Objective C struct won't be called, which is very bad.
    cflags_objcc = [ "-fobjc-call-cxx-cdtors" ]

    cflags_c += [ "-std=c99" ]

    ldflags += common_mac_flags
  } else if (is_posix) {
    # CPU architecture. We may or may not be doing a cross compile now, so for
    # simplicity we always explicitly set the architecture.
    if (current_cpu == "x64") {
      cflags += [
        "-m64",
        "-march=x86-64",
      ]
      ldflags += [ "-m64" ]
    } else if (current_cpu == "x86") {
      cflags += [ "-m32" ]
      ldflags += [ "-m32" ]
      if (is_clang) {
        cflags += [
          # Else building libyuv gives clang's register allocator issues,
          # see llvm.org/PR15798 / crbug.com/233709
          "-momit-leaf-frame-pointer",

          # Align the stack on 16-byte boundaries, http://crbug.com/418554.
          "-mstack-alignment=16",
          "-mstackrealign",
        ]
      }
    } else if (current_cpu == "arm") {
      cflags += [
        "-march=$arm_arch",
        "-mfloat-abi=$arm_float_abi",
      ]
      if (arm_tune != "") {
        cflags += [ "-mtune=$arm_tune" ]
      }
      if (arm_use_thumb) {
        cflags += [ "-mthumb" ]
        if (is_android && !is_clang) {  # Clang doesn't support this option.
          cflags += [ "-mthumb-interwork" ]
        }
      }
      if (!is_clang) {
        # Clang doesn't support these flags.
        cflags += [
          # The tree-sra optimization (scalar replacement for
          # aggregates enabling subsequent optimizations) leads to
          # invalid code generation when using the Android NDK's
          # compiler (r5-r7). This can be verified using
          # webkit_unit_tests' WTF.Checked_int8_t test.
          "-fno-tree-sra",

          # The following option is disabled to improve binary
          # size and performance in gcc 4.9.
          "-fno-caller-saves",
        ]
      }
    } else if (current_cpu == "mipsel") {
      if (mips_arch_variant == "r6") {
        cflags += [
          "-mips32r6",
          "-Wa,-mips32r6",
        ]
        if (is_android) {
          ldflags += [
            "-mips32r6",
            "-Wl,-melf32ltsmip",
          ]
        }
      } else if (mips_arch_variant == "r2") {
        cflags += [
          "-mips32r2",
          "-Wa,-mips32r2",
        ]
        if (mips_float_abi == "hard" && mips_fpu_mode != "") {
          cflags += [ "-m$mips_fpu_mode" ]
        }
      } else if (mips_arch_variant == "r1") {
        cflags += [
          "-mips32",
          "-Wa,-mips32",
        ]
      }

      if (mips_dsp_rev == 1) {
        cflags += [ "-mdsp" ]
      } else if (mips_dsp_rev == 2) {
        cflags += [ "-mdspr2" ]
      }

      cflags += [ "-m${mips_float_abi}-float" ]
    } else if (current_cpu == "mips64el") {
      if (mips_arch_variant == "r6") {
        cflags += [
          "-mips64r6",
          "-Wa,-mips64r6",
        ]
        ldflags += [ "-mips64r6" ]
      } else if (mips_arch_variant == "r2") {
        cflags += [
          "-mips64r2",
          "-Wa,-mips64r2",
        ]
        ldflags += [ "-mips64r2" ]
      }
    }

    defines += [ "_FILE_OFFSET_BITS=64" ]

    if (!is_android) {
      defines += [
        "_LARGEFILE_SOURCE",
        "_LARGEFILE64_SOURCE",
      ]
    }

    # Omit unwind support in official builds to save space. We can use breakpad
    # for these builds.
    if (is_chrome_branded && is_official_build) {
      cflags += [
        "-fno-unwind-tables",
        "-fno-asynchronous-unwind-tables",
      ]
      defines += [ "NO_UNWIND_TABLES" ]
    } else {
      cflags += [ "-funwind-tables" ]
    }
  }

  if (enable_profiling && !is_debug) {
    # The GYP build spams this define into every compilation unit, as we do
    # here, but it only appears to be used in base and a couple other places.
    # TODO(abarth): Should we move this define closer to where it's used?
    defines += [ "ENABLE_PROFILING" ]

    cflags += [
      "-fno-omit-frame-pointer",
      "-g",
    ]

    if (enable_full_stack_frames_for_profiling) {
      cflags += [
        "-fno-inline",
        "-fno-optimize-sibling-calls",
      ]
    }
  }

  # Linux/Android common flags setup.
  # ---------------------------------
  if (is_linux || is_android) {
    cflags += [
      "-fPIC",
      "-pipe",  # Use pipes for communicating between sub-processes. Faster.
    ]

    ldflags += [
      "-fPIC",
      "-Wl,-z,noexecstack",
      "-Wl,-z,now",
      "-Wl,-z,relro",
    ]
    if (!using_sanitizer) {
      ldflags += [ "-Wl,-z,defs" ]
    }
  }

  # Linux-specific compiler flags setup.
  # ------------------------------------
  if (is_linux) {
    cflags += [ "-pthread" ]
    ldflags += [ "-pthread" ]
  }
  if (use_gold) {
    gold_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin",
                            root_build_dir)
    ldflags += [
      "-B$gold_path",

      # Newer gccs and clangs support -fuse-ld, use the flag to force gold
      # selection.
      # gcc -- http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/Optimize-Options.html
      "-fuse-ld=gold",

      # Experimentation found that using four linking threads
      # saved ~20% of link time.
      # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36
      # Only apply this to the target linker, since the host
      # linker might not be gold, but isn't used much anyway.
      # TODO(raymes): Disable threading because gold is frequently
      # crashing on the bots: crbug.com/161942.
      #"-Wl,--threads",
      #"-Wl,--thread-count=4",
    ]

    if (!is_asan && !is_msan && !is_lsan && !is_tsan) {
      # TODO(brettw) common.gypi has this only for target toolset.
      ldflags += [ "-Wl,--icf=all" ]
    }

    # TODO(thestig): Make this flag work with GN.
    #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) {
    #  ldflags += [
    #    "-Wl,--detect-odr-violations",
    #  ]
    #}
  }

  if (linux_use_bundled_binutils) {
    binutils_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin",
                                root_build_dir)
    cflags += [ "-B$binutils_path" ]
  }

  # Clang-specific compiler flags setup.
  # ------------------------------------
  if (is_clang) {
    cflags += [ "-fcolor-diagnostics" ]
  }

  # C++11 compiler flags setup.
  # ---------------------------
  if (is_linux || is_android || is_nacl) {
    # gnu++11 instead of c++11 is needed because some code uses typeof() (a
    # GNU extension).
    # TODO(thakis): Eventually switch this to c++11 instead,
    # http://crbug.com/427584
    cflags_cc += [ "-std=gnu++11" ]
  } else if (!is_win) {
    cflags_cc += [ "-std=c++11" ]
  }

  # Android-specific flags setup.
  # -----------------------------
  if (is_android) {
    cflags += [
      "-ffunction-sections",
      "-funwind-tables",
      "-fno-short-enums",
    ]
    if (!is_clang) {
      # Clang doesn't support these flags.
      cflags += [ "-finline-limit=64" ]
    }
    if (is_asan) {
      # Android build relies on -Wl,--gc-sections removing unreachable code.
      # ASan instrumentation for globals inhibits this and results in a library
      # with unresolvable relocations.
      # TODO(eugenis): find a way to reenable this.
      cflags += [ "-mllvm -asan-globals=0" ]
    }

    defines += [ "ANDROID" ]

    # The NDK has these things, but doesn't define the constants
    # to say that it does. Define them here instead.
    defines += [ "HAVE_SYS_UIO_H" ]

    # Use gold for Android for most CPU architectures.
    if (current_cpu == "x86" || current_cpu == "x64" || current_cpu == "arm") {
      ldflags += [ "-fuse-ld=gold" ]
      if (is_clang) {
        # Let clang find the ld.gold in the NDK.
        ldflags += [ "--gcc-toolchain=" +
                     rebase_path(android_toolchain_root, root_build_dir) ]
      }
    }

    ldflags += [
      "-Wl,--no-undefined",

      # Don't allow visible symbols from libgcc or libc++ to be
      # re-exported.
      "-Wl,--exclude-libs=libgcc.a",
      "-Wl,--exclude-libs=libc++_static.a",

      # Don't allow visible symbols from libraries that contain
      # assembly code with symbols that aren't hidden properly.
      # http://crbug.com/448386
      "-Wl,--exclude-libs=libvpx_assembly_arm.a",
    ]
    if (current_cpu == "arm") {
      ldflags += [
        # Enable identical code folding to reduce size.
        "-Wl,--icf=safe",
      ]
    }

    if (is_clang) {
      if (current_cpu == "arm") {
        cflags += [ "-target arm-linux-androideabi" ]
        ldflags += [ "-target arm-linux-androideabi" ]
      } else if (current_cpu == "x86") {
        cflags += [ "-target x86-linux-androideabi" ]
        ldflags += [ "-target x86-linux-androideabi" ]
      }
    }
  }
}

config("compiler_arm_fpu") {
  if (current_cpu == "arm" && !is_ios) {
    cflags = [ "-mfpu=$arm_fpu" ]
  }
}

# runtime_library -------------------------------------------------------------
#
# Sets the runtime library and associated options.
#
# How do you determine what should go in here vs. "compiler" above? Consider if
# a target might choose to use a different runtime library (ignore for a moment
# if this is possible or reasonable on your system). If such a target would want
# to change or remove your option, put it in the runtime_library config. If a
# target wants the option regardless, put it in the compiler config.

config("runtime_library") {
  cflags = []
  defines = []
  ldflags = []
  lib_dirs = []
  libs = []

  if (is_component_build) {
    # Component mode: dynamic CRT.
    defines += [ "COMPONENT_BUILD" ]
    if (is_win) {
      # Since the library is shared, it requires exceptions or will give errors
      # about things not matching, so keep exceptions on.
      if (is_debug) {
        cflags += [ "/MDd" ]
      } else {
        cflags += [ "/MD" ]
      }
    }
  } else {
    # Static CRT.
    if (is_win) {
      if (is_debug) {
        cflags += [ "/MTd" ]
      } else {
        cflags += [ "/MT" ]
      }
    }
  }

  if (is_win) {
    defines += [
      "__STD_C",
      "_CRT_RAND_S",
      "_CRT_SECURE_NO_DEPRECATE",
      "_HAS_EXCEPTIONS=0",
      "_SCL_SECURE_NO_DEPRECATE",
    ]
  }

  # Android standard library setup.
  if (is_android) {
    if (is_clang) {
      # Work around incompatibilities between bionic and clang headers.
      defines += [
        "__compiler_offsetof=__builtin_offsetof",
        "nan=__builtin_nan",
      ]
    }

    defines += [ "__GNU_SOURCE=1" ]  # Necessary for clone().

    # TODO(jdduke) Re-enable on mips after resolving linking
    # issues with libc++ (crbug.com/456380).
    if (current_cpu != "mipsel" && current_cpu != "mips64el") {
      ldflags += [ "-Wl,--warn-shared-textrel" ]
    }
    ldflags += [ "-nostdlib" ]

    # NOTE: The libc++ header include paths below are specified in cflags
    # rather than include_dirs because they need to come after include_dirs.
    # Think of them like system headers, but don't use '-isystem' because the
    # arm-linux-androideabi-4.4.3 toolchain (circa Gingerbread) will exhibit
    # strange errors. The include ordering here is important; change with
    # caution.
    cflags += [
      "-isystem" +
          rebase_path("$android_libcpp_root/libcxx/include", root_build_dir),
      "-isystem" + rebase_path(
              "$android_ndk_root/sources/cxx-stl/llvm-libc++abi/libcxxabi/include",
              root_build_dir),
      "-isystem" +
          rebase_path("$android_ndk_root/sources/android/support/include",
                      root_build_dir),
    ]

    lib_dirs += [ "$android_libcpp_root/libs/$android_app_abi" ]
    libs += [ "$android_libcpp_library" ]

    if (current_cpu == "mipsel") {
      libs += [
        # ld linker is used for mips Android, and ld does not accept library
        # absolute path prefixed by "-l"; Since libgcc does not exist in mips
        # sysroot the proper library will be linked.
        # TODO(gordanac): Remove once gold linker is used for mips Android.
        "gcc",
      ]
    } else {
      libs += [
        # Manually link the libgcc.a that the cross compiler uses. This is
        # absolute because the linker will look inside the sysroot if it's not.
        rebase_path(android_libgcc_file),
      ]
    }

    libs += [
      "c",
      "dl",
      "m",
    ]

    # Clang with libc++ does not require an explicit atomic library reference.
    if (!is_clang) {
      libs += [ "atomic" ]
    }
  }
}

# default_warning_flags collects all warning flags that are used by default.
# This is in a variable instead of a config so that it can be used in
# both chromium_code and no_chromium_code.  This way these flags are guaranteed
# to appear on the compile command line after -Wall.

default_warning_flags = []
default_warning_flags_cc = []
if (is_win) {
  if (!is_clang || current_cpu != "x86") {
    default_warning_flags += [ "/WX" ]  # Treat warnings as errors.
  }

  default_warning_flags += [
    # Warnings permanently disabled:

    # TODO(GYP) The GYP build doesn't have this globally enabled but disabled
    # for a bunch of individual targets. Re-enable this globally when those
    # targets are fixed.
    "/wd4018",  # Comparing signed and unsigned values.

    # C4127: conditional expression is constant
    # This warning can in theory catch dead code and other problems, but
    # triggers in far too many desirable cases where the conditional
    # expression is either set by macros or corresponds some legitimate
    # compile-time constant expression (due to constant template args,
    # conditionals comparing the sizes of different types, etc.).  Some of
    # these can be worked around, but it's not worth it.
    "/wd4127",

    # C4251: 'identifier' : class 'type' needs to have dll-interface to be
    #        used by clients of class 'type2'
    # This is necessary for the shared library build.
    "/wd4251",

    # C4351: new behavior: elements of array 'array' will be default
    #        initialized
    # This is a silly "warning" that basically just alerts you that the
    # compiler is going to actually follow the language spec like it's
    # supposed to, instead of not following it like old buggy versions did.
    # There's absolutely no reason to turn this on.
    "/wd4351",

    # C4355: 'this': used in base member initializer list
    # It's commonly useful to pass |this| to objects in a class' initializer
    # list.  While this warning can catch real bugs, most of the time the
    # constructors in question don't attempt to call methods on the passed-in
    # pointer (until later), and annotating every legit usage of this is
    # simply more hassle than the warning is worth.
    "/wd4355",

    # C4503: 'identifier': decorated name length exceeded, name was
    #        truncated
    # This only means that some long error messages might have truncated
    # identifiers in the presence of lots of templates.  It has no effect on
    # program correctness and there's no real reason to waste time trying to
    # prevent it.
    "/wd4503",

    # Warning C4589 says: "Constructor of abstract class ignores
    # initializer for virtual base class." Disable this warning because it
    # is flaky in VS 2015 RTM. It triggers on compiler generated
    # copy-constructors in some cases.
    "/wd4589",

    # C4611: interaction between 'function' and C++ object destruction is
    #        non-portable
    # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN
    # suggests using exceptions instead of setjmp/longjmp for C++, but
    # Chromium code compiles without exception support.  We therefore have to
    # use setjmp/longjmp for e.g. JPEG decode error handling, which means we
    # have to turn off this warning (and be careful about how object
    # destruction happens in such cases).
    "/wd4611",

    # Warnings to evaluate and possibly fix/reenable later:

    "/wd4100",  # Unreferenced formal function parameter.
    "/wd4121",  # Alignment of a member was sensitive to packing.
    "/wd4244",  # Conversion: possible loss of data.
    "/wd4481",  # Nonstandard extension: override specifier.
    "/wd4505",  # Unreferenced local function has been removed.
    "/wd4510",  # Default constructor could not be generated.
    "/wd4512",  # Assignment operator could not be generated.
    "/wd4610",  # Class can never be instantiated, constructor required.
    "/wd4996",  # Deprecated function warning.
  ]

  # VS xtree header file needs to be patched or 4702 (unreachable code
  # warning) is reported if _HAS_EXCEPTIONS=0. Disable the warning if xtree is
  # not patched.
  if (!msvs_xtree_patched &&
      exec_script("../../win_is_xtree_patched.py", [], "value") == 0) {
    default_warning_flags += [ "/wd4702" ]  # Unreachable code.
  }

  # Building with Clang on Windows is a work in progress and very
  # experimental. See crbug.com/82385.
  # Keep this in sync with the similar block in build/common.gypi
  if (is_clang) {
    default_warning_flags += [
      # TODO(hans): Make this list shorter eventually, http://crbug.com/504657
      "-Qunused-arguments",  # http://crbug.com/504658
      "-Wno-microsoft",  # http://crbug.com/505296
      "-Wno-switch",  # http://crbug.com/505308
      "-Wno-unknown-pragmas",  # http://crbug.com/505314
      "-Wno-unused-function",  # http://crbug.com/505316
      "-Wno-unused-value",  # http://crbug.com/505318
      "-Wno-unused-local-typedef",  # http://crbug.com/411648
    ]
  }
} else {
  # Common GCC warning setup.
  default_warning_flags += [
    # Enables.
    "-Wendif-labels",  # Weird old-style text after an #endif.
    "-Werror",  # Warnings as errors.

    # Disables.
    "-Wno-missing-field-initializers",  # "struct foo f = {0};"
    "-Wno-unused-parameter",  # Unused function parameters.
  ]

  if (is_mac) {
    default_warning_flags += [ "-Wnewline-eof" ]
    if (!is_nacl) {
      # When compiling Objective-C, warns if a method is used whose
      # availability is newer than the deployment target. This is not
      # required when compiling Chrome for iOS.
      default_warning_flags += [ "-Wpartial-availability" ]
    }
  }

  if (gcc_version >= 48) {
    default_warning_flags_cc += [
      # See comment for -Wno-c++11-narrowing.
      "-Wno-narrowing",

      # TODO(thakis): Remove, http://crbug.com/263960
      "-Wno-literal-suffix",
    ]
  }

  # Suppress warnings about ABI changes on ARM (Clang doesn't give this
  # warning).
  if (current_cpu == "arm" && !is_clang) {
    default_warning_flags += [ "-Wno-psabi" ]
  }

  if (is_android) {
    # Disable any additional warnings enabled by the Android build system but
    # which chromium does not build cleanly with (when treating warning as
    # errors).
    default_warning_flags += [
      "-Wno-extra",
      "-Wno-ignored-qualifiers",
      "-Wno-type-limits",
    ]
    default_warning_flags_cc += [
      # Disabling c++0x-compat should be handled in WebKit, but
      # this currently doesn't work because gcc_version is not set
      # correctly when building with the Android build system.
      # TODO(torne): Fix this in WebKit.
      "-Wno-error=c++0x-compat",

      # Other things unrelated to -Wextra:
      "-Wno-non-virtual-dtor",
      "-Wno-sign-promo",
    ]
  }

  if (gcc_version >= 48) {
    # Don't warn about the "typedef 'foo' locally defined but not used"
    # for gcc 4.8.
    # TODO: remove this flag once all builds work. See crbug.com/227506
    default_warning_flags += [ "-Wno-unused-local-typedefs" ]
  }
}
if (is_clang) {
  default_warning_flags += [
    # This warns on using ints as initializers for floats in
    # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),
    # which happens in several places in chrome code. Not sure if
    # this is worth fixing.
    "-Wno-c++11-narrowing",

    # Don't die on dtoa code that uses a char as an array index.
    # This is required solely for base/third_party/dmg_fp/dtoa.cc.
    # TODO(brettw) move this to that project then!
    "-Wno-char-subscripts",

    # Warns on switches on enums that cover all enum values but
    # also contain a default: branch. Chrome is full of that.
    "-Wno-covered-switch-default",

    # Clang considers the `register` keyword as deprecated, but e.g.
    # code generated by flex (used in angle) contains that keyword.
    # http://crbug.com/255186
    "-Wno-deprecated-register",

    # TODO(thakis): This used to be implied by -Wno-unused-function,
    # which we no longer use. Check if it makes sense to remove
    # this as well. http://crbug.com/316352
    "-Wno-unneeded-internal-declaration",

    # TODO(thakis): Remove, http://crbug.com/263960
    "-Wno-reserved-user-defined-literal",
  ]

  # NaCl's Clang compiler and Chrome's hermetic Clang compiler will almost
  # always have different versions. Certain flags may not be recognized by
  # one version or the other.
  if (!is_nacl) {
    # Flags NaCl does not recognize.
    default_warning_flags += [
      # TODO(hans): Get this cleaned up, http://crbug.com/428099
      "-Wno-inconsistent-missing-override",

      # TODO(thakis): Enable this, crbug.com/507717
      "-Wno-shift-negative-value",
    ]
  }
}

# chromium_code ---------------------------------------------------------------
#
# Toggles between higher and lower warnings for code that is (or isn't)
# part of Chromium.

config("chromium_code") {
  if (is_win) {
    cflags = [ "/W4" ]  # Warning level 4.
  } else {
    cflags = [
      "-Wall",

      # GCC turns on -Wsign-compare for C++ under -Wall, but clang doesn't,
      # so we specify it explicitly.
      # TODO(fischman): remove this if http://llvm.org/PR10448 obsoletes it.
      # http://code.google.com/p/chromium/issues/detail?id=90453
      "-Wsign-compare",
    ]

    # In Chromium code, we define __STDC_foo_MACROS in order to get the
    # C99 macros on Mac and Linux.
    defines = [
      "__STDC_CONSTANT_MACROS",
      "__STDC_FORMAT_MACROS",
    ]

    if (!using_sanitizer && (!is_linux || !is_clang || is_official_build)) {
      # _FORTIFY_SOURCE isn't really supported by Clang now, see
      # http://llvm.org/bugs/show_bug.cgi?id=16821.
      # It seems to work fine with Ubuntu 12 headers though, so use it in
      # official builds.
      #
      # Non-chromium code is not guaranteed to compile cleanly with
      # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are
      # disabled, so only do that for Release build.
      defines += [ "_FORTIFY_SOURCE=2" ]
    }
  }
  cflags += default_warning_flags
  cflags_cc = default_warning_flags_cc
}
config("no_chromium_code") {
  cflags = []
  cflags_cc = []
  defines = []

  if (is_win) {
    cflags += [
      "/W3",  # Warning level 3.
      "/wd4800",  # Disable warning when forcing value to bool.
      "/wd4267",  # TODO(jschuh): size_t to int.
      "/wd4996",  # Deprecated function warning.
    ]
    defines += [
      "_CRT_NONSTDC_NO_WARNINGS",
      "_CRT_NONSTDC_NO_DEPRECATE",
    ]
  }

  if (is_linux) {
    # Don't warn about ignoring the return value from e.g. close(). This is
    # off by default in some gccs but on by default in others. BSD systems do
    # not support this option, since they are usually using gcc 4.2.1, which
    # does not have this flag yet.
    cflags += [ "-Wno-unused-result" ]
  }

  if (is_clang) {
    cflags += [
      # TODO(mgiuca): Move this suppression into individual third-party
      # libraries as required. http://crbug.com/505301.
      "-Wno-overloaded-virtual",

      # Lots of third-party libraries have unused variables. Instead of
      # suppressing them individually, we just blanket suppress them here.
      "-Wno-unused-variable",
    ]
  }

  if (is_linux || is_android) {
    cflags += [
      # Don't warn about printf format problems. This is off by default in gcc
      # but on in Ubuntu's gcc(!).
      "-Wno-format",
    ]
    cflags_cc += [
      # Don't warn about hash_map in third-party code.
      "-Wno-deprecated",
    ]
  }
  cflags += default_warning_flags
  cflags_cc += default_warning_flags_cc
}

# rtti ------------------------------------------------------------------------
#
# Allows turning Run-Time Type Identification on or off.

config("rtti") {
  if (is_win) {
    cflags_cc = [ "/GR" ]
  }
}
config("no_rtti") {
  if (is_win) {
    cflags_cc = [ "/GR-" ]
  } else {
    cflags_cc = [ "-fno-rtti" ]
  }
}

# Warnings ---------------------------------------------------------------------

# This will generate warnings when using Clang if code generates exit-time
# destructors, which will slow down closing the program.
# TODO(thakis): Make this a blacklist instead, http://crbug.com/101600
config("wexit_time_destructors") {
  # TODO: Enable on Windows too, http://crbug.com/404525
  if (is_clang && !is_win) {
    cflags = [ "-Wexit-time-destructors" ]
  }
}

# On Windows compiling on x64, VC will issue a warning when converting
# size_t to int because it will truncate the value. Our code should not have
# these warnings and one should use a static_cast or a checked_cast for the
# conversion depending on the case. However, a lot of code still needs to be
# fixed. Apply this config to such targets to disable the warning.
#
# Note that this can be applied regardless of platform and architecture to
# clean up the call sites. This will only apply the flag when necessary.
#
# TODO(jschuh): crbug.com/167187 fix this and delete this config.
config("no_size_t_to_int_warning") {
  if (is_win && current_cpu == "x64") {
    cflags = [ "/wd4267" ]
  }
}

# Optimization -----------------------------------------------------------------
#
# Note that BUILDCONFIG.gn sets up a variable "default_optimization_config"
# which it will assign to the config it implicitly applies to every target. If
# you want to override the optimization level for your target, remove this
# config (which will expand differently for debug or release builds), and then
# add back the one you want to override it with:
#
#   configs -= default_optimization_config
#   configs += [ "//build/config/compiler/optimize_max" ]

# Shared settings for both "optimize" and "optimize_max" configs.
# IMPORTANT: On Windows "/O1" and "/O2" must go before the common flags.
if (is_win) {
  common_optimize_on_cflags = [
    "/Ob2",  # Both explicit and auto inlining.
    "/Oy-",  # Disable omitting frame pointers, must be after /O2.
  ]
  if (!is_asan) {
    common_optimize_on_cflags += [
      # Put data in separate COMDATs. This allows the linker
      # to put bit-identical constants at the same address even if
      # they're unrelated constants, which saves binary size.
      # This optimization can't be used when ASan is enabled because
      # it is not compatible with the ASan ODR checker.
      "/Gw",
    ]
  }
  common_optimize_on_ldflags = [ "/OPT:REF" ]
} else {
  common_optimize_on_cflags = [
    # Don't emit the GCC version ident directives, they just end up in the
    # .comment section taking up binary size.
    "-fno-ident",

    # Put data and code in their own sections, so that unused symbols
    # can be removed at link time with --gc-sections.
    "-fdata-sections",
    "-ffunction-sections",
  ]
  common_optimize_on_ldflags = []

  if (is_android) {
    if (!using_sanitizer) {
      common_optimize_on_cflags += [ "-fomit-frame-pointer" ]
    }

    # TODO(jdduke) Re-enable on mips after resolving linking
    # issues with libc++ (crbug.com/456380).
    if (current_cpu != "mipsel" && current_cpu != "mips64el") {
      common_optimize_on_ldflags += [
        # Warn in case of text relocations.
        "-Wl,--warn-shared-textrel",
      ]
    }
  }

  if (is_mac || is_ios) {
    if (symbol_level == 2) {
      # Mac dead code stripping requires symbols.
      common_optimize_on_ldflags += [ "-Wl,-dead_strip" ]
    }
  } else {
    # Non-Mac Posix linker flags.
    common_optimize_on_ldflags += [
      # Specifically tell the linker to perform optimizations.
      # See http://lwn.net/Articles/192624/ .
      "-Wl,-O1",
      "-Wl,--gc-sections",
    ]

    if (!using_sanitizer) {
      # Functions interposed by the sanitizers can make ld think
      # that some libraries aren't needed when they actually are,
      # http://crbug.com/234010. As workaround, disable --as-needed.
      common_optimize_on_ldflags += [ "-Wl,--as-needed" ]
    }
  }
}

# Default "optimization on" config. On Windows, this favors size over speed.
config("optimize") {
  if (is_win) {
    # Favor size over speed, /O1 must be before the common flags. The GYP
    # build also specifies /Os and /GF but these are implied by /O1.
    cflags = [ "/O1" ] + common_optimize_on_cflags + [ "/Oi" ]
  } else if (is_android || is_ios) {
    cflags = [ "-Os" ] + common_optimize_on_cflags  # Favor size over speed.
  } else {
    cflags = [ "-O2" ] + common_optimize_on_cflags
  }
  ldflags = common_optimize_on_ldflags
}

# Turn off optimizations.
config("no_optimize") {
  if (is_win) {
    cflags = [
      "/Od",  # Disable optimization.
      "/Ob0",  # Disable all inlining (on by default).
      "/RTC1",  # Runtime checks for stack frame and uninitialized variables.
    ]
  } else if (is_android && !android_full_debug) {
    # On Android we kind of optimize some things that don't affect debugging
    # much even when optimization is disabled to get the binary size down.
    cflags = [
      "-Os",
      "-fdata-sections",
      "-ffunction-sections",
    ]
    if (!using_sanitizer) {
      cflags += [ "-fomit-frame-pointer" ]
    }
    ldflags = common_optimize_on_ldflags
  } else {
    cflags = [ "-O0" ]
  }
}

# Turns up the optimization level. On Windows, this implies whole program
# optimization and link-time code generation which is very expensive and should
# be used sparingly.
config("optimize_max") {
  ldflags = common_optimize_on_ldflags
  if (is_win) {
    # Favor speed over size, /O2 must be before the common flags. The GYP
    # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.
    cflags = [ "/O2" ] + common_optimize_on_cflags
    if (is_official_build) {
      # TODO(GYP): TODO(dpranke): Should these only be on in an official
      # build, or on all the time? For now we'll require official build so
      # that the compile is clean.
      cflags += [
        "/GL",  # Whole program optimization.

        # Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds.
        # Probably anything that this would catch that wouldn't be caught in a
        # normal build isn't going to actually be a bug, so the incremental
        # value of C4702 for PGO builds is likely very small.
        "/wd4702",
      ]
      ldflags += [ "/LTCG" ]
    }
  } else {
    cflags = [ "-O2" ] + common_optimize_on_cflags
  }
}

# Symbols ----------------------------------------------------------------------

config("symbols") {
  if (is_win) {
    import("//build/toolchain/goma.gni")
    if (use_goma) {
      cflags = [ "/Z7" ]  # No PDB file
    } else {
      cflags = [ "/Zi" ]  # Produce PDB file, no edit and continue.
    }
    ldflags = [ "/DEBUG" ]
  } else {
    cflags = [ "-g2" ]
    if (use_debug_fission) {
      cflags += [ "-gsplit-dwarf" ]
    }
  }
}

config("minimal_symbols") {
  if (is_win) {
    # Linker symbols for backtraces only.
    ldflags = [ "/DEBUG" ]
  } else {
    cflags = [ "-g1" ]
    if (use_debug_fission) {
      cflags += [ "-gsplit-dwarf" ]
    }
  }
}

config("no_symbols") {
  if (!is_win) {
    cflags = [ "-g0" ]
  }
}
