# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

template("third_party") {
  enabled = !defined(invoker.enabled) || invoker.enabled
  config(target_name + "_public") {
    if (enabled) {
      cflags = []
      if (defined(invoker.public_defines)) {
        defines = invoker.public_defines
      }
      if (is_win) {
        include_dirs = invoker.public_include_dirs
      } else {
        foreach(dir, invoker.public_include_dirs) {
          cflags += [
            "-isystem",
            rebase_path(dir),
          ]
        }
      }
    } else {
      not_needed(invoker, "*")
    }
  }
  source_set(target_name) {
    if (enabled) {
      forward_variables_from(invoker, "*", [ "public_include_dirs" ])
      public_configs = [ ":" + target_name + "_public" ]

      # Warnings are just noise if we're not maintaining the code.
      if (is_win) {
        cflags = [ "/w" ]
      } else {
        cflags = [ "-w" ]
      }
    }
  }
}

set_defaults("third_party") {
  configs = default_configs
  if (!is_official_build) {
    # Official builds don't have warnings to begin with.
    configs -= [ "//gn:warnings" ]
  }
  if (is_debug) {
    configs += [ "//gn:optimize" ]
  }
}

template("system") {
  config(target_name + "_public") {
    forward_variables_from(invoker, "*", [])
  }
  group(target_name) {
    public_configs = [ ":" + target_name + "_public" ]
  }
}
