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

import("config.gni")
if (is_clang) {
  import("//build/config/clang/clang.gni")
}
if (is_posix) {
  import("//build/config/gcc/gcc_version.gni")
}

visibility = [ "//sky/*" ]

# features ---------------------------------------------------------------------

config("features") {
  defines = feature_defines_list
}

# inside_blink -----------------------------------------------------------------

config("inside_blink") {
  defines = [
    "BLINK_IMPLEMENTATION=1",
    "INSIDE_BLINK",
  ]
}

# config -----------------------------------------------------------------------

config("config") {
  include_dirs = [
    ".",
    "$root_build_dir",
    "$root_gen_dir/sky",  # Deprecated, remove.
  ]

  cflags = []
  defines = []

  # TODO(GYP) this should be based on gcc_version >= 46 but GN doesn't have a
  # concept of GCC version yet.

  # Disable warnings about c++0x compatibility, as some names (such as
  # nullptr) conflict with upcoming c++0x types.
  cflags_cc = [ "-Wno-c++0x-compat" ]

  if (is_linux && target_cpu == "arm") {
    # Due to a bug in gcc arm, we get warnings about uninitialized
    # timesNewRoman.unstatic.3258 and colorTransparent.unstatic.4879.
    cflags += [ "-Wno-uninitialized" ]
  }

  if (is_posix && gcc_version >= 49) {
    cflags += [ "-Wno-unused-but-set-variable" ]
  }
}

# The follow configs apply to all targets except for unit tests, which rely on
# static initializers.
config("non_test_config") {
  cflags = []

  if (is_clang) {
    cflags += [ "-Wglobal-constructors" ]
  }
}

group("engine") {
  deps = [
    "//sky/engine/platform",
    "//sky/engine/public/sky",
    "//sky/engine/web",
  ]
}
