# 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_out_dir",
  ]

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