# 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, "*")
    }
  }

  # You can't make a static_library() without object files to archive,
  # but we can treat targets without object files as a source_set().
  if (defined(invoker.sources)) {
    _mode = "static_library"
  } else {
    _mode = "source_set"
  }

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

  # Don't want to to deal with this (especially /RTCc)
  if (sanitize == "MSVC") {
    configs -= [ "//gn:msvc_rtc" ]
  }
  if (is_debug) {
    configs += [ "//gn:optimize" ]
  }
}

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