# Copyright 2016 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/features.gni")
import("//build/config/linux/gtk/gtk.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")

# CrOS doesn't install GTK or any gnome packages.
assert(!is_chromeos)

# These packages should _only_ be expected when building for a target.
assert(current_toolchain == default_toolchain)

if (use_atk) {
  assert(use_glib, "use_atk=true requires that use_glib=true")
}

pkg_config("atk_base") {
  packages = [ "atk" ]
  atk_lib_dir = exec_script(pkg_config_script,
                            pkg_config_args + [
                                  "--libdir",
                                  "atk",
                                ],
                            "string")
  defines = [ "ATK_LIB_DIR=\"$atk_lib_dir\"" ]
  if (use_gtk3) {
    packages += [ "atk-bridge-2.0" ]
    defines += [ "USE_ATK_BRIDGE" ]
  }
}

# gn orders flags on a target before flags from configs. The default config
# adds -Wall, and these flags have to be after -Wall -- so they need to
# come from a config and can't be on the target directly.
config("atk") {
  configs = [ ":atk_base" ]

  cflags = [
    # G_DEFINE_TYPE automatically generates a *get_instance_private
    # inline function after glib 2.37. That's unused. Prevent to
    # complain about it.
    "-Wno-unused-function",
  ]

  if (is_clang) {
    # glib uses the pre-c++11 typedef-as-static_assert hack.
    cflags += [ "-Wno-unused-local-typedef" ]
  }
}
