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

# This file contains Chrome-feature-related build flags (see ui.gni for
# UI-related ones). These should theoretically be moved to the build files of
# the features themselves.
#
# However, today we have many "bad" dependencies on some of these flags from,
# e.g. base, so they need to be global to match the GYP configuration. Also,
# anything that needs a grit define must be in either this file or ui.gni.
#
# PLEASE TRY TO AVOID ADDING FLAGS TO THIS FILE in cases where grit isn't
# required. See the declare_args block of BUILDCONFIG.gn for advice on how
# to set up feature flags.

import("//build/config/chrome_build.gni")
if (is_android) {
  import("//build/config/android/config.gni")
}

declare_args() {
  # Enables Native Client support.
  # TODO(GYP): Get NaCl linking on other platforms.
  # Also, see if we can always get rid of enable_nacl_untrusted and
  # enable_pnacl and always build them if enable_nacl is true.
  # The "is_nacl" part of the condition is needed to ensure that
  # the untrusted code is built properly; arguably it should be
  # guarded by "is_nacl" directly rather than enable_nacl_untrusted, but
  # this will go away when Mac and Win are working and we can just use
  # the commented out logic.
  # Eventually we want this to be:
  #   enable_nacl = !is_ios && !is_android
  enable_nacl = (is_linux && !is_chromeos && current_cpu == "x64") || is_nacl
  enable_nacl_untrusted = enable_nacl
  enable_pnacl = enable_nacl_untrusted

  # If debug_devtools is set to true, JavaScript files for DevTools are stored
  # as is and loaded from disk. Otherwise, a concatenated file is stored in
  # resources.pak. It is still possible to load JS files from disk by passing
  # --debug-devtools cmdline switch.
  debug_devtools = false

  # Enables proprietary codecs and demuxers; e.g. H264, MOV, AAC, and MP3.
  # Android OS includes support for proprietary codecs regardless of building
  # Chromium or Google Chrome. We also ship Google Chrome and Chromecast with
  # proprietary codecs.
  # TODO(GYP) The GYP build has || chromecast==1 for this:
  proprietary_codecs = is_android || is_chrome_branded
}

# Additional dependent variables -----------------------------------------------

# Set the version of CLD.
#   0: Don't specify the version. This option is for the Finch testing.
#   1: Use only CLD1.
#   2: Use only CLD2.
if (is_android) {
  cld_version = 1
} else {
  cld_version = 2
}

# libudev usage.
use_udev = is_linux && !is_fnl

# Enable basic printing support and UI.
enable_basic_printing = !is_chromeos

# Enable printing with print preview. It does not imply
# enable_basic_printing. It's possible to build Chrome with preview only.
enable_print_preview = !is_android

# The seccomp-bpf sandbox is only supported on three architectures
# currently.
# Do not disable seccomp_bpf anywhere without talking to
# security@chromium.org!
use_seccomp_bpf = (is_linux || is_android) &&
                  (current_cpu == "x86" || current_cpu == "x64" ||
                   current_cpu == "arm" || current_cpu == "mipsel")

# Use brlapi from brltty for braille display support.
use_brlapi = is_chromeos

# Option controlling the use of GConf (the classic GNOME configuration
# system).
# TODO(GYP) also require !embedded to enable.
use_gconf = is_linux && !is_chromeos
