# 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_config") {
  enabled = !defined(invoker.enabled) || invoker.enabled
  config(target_name) {
    if (enabled) {
      forward_variables_from(invoker, "*", [ "include_dirs" ])
      cflags = []
      if (is_win) {
        include_dirs = invoker.include_dirs
        if (is_clang) {
          foreach(dir, invoker.include_dirs) {
            cflags += [
              "/imsvc",
              rebase_path(dir),
            ]
          }
        }
      } else {
        foreach(dir, invoker.include_dirs) {
          if (werror) {
            cflags += [
              "-isystem",
              rebase_path(dir),
            ]
          } else {
            cflags += [
              "-I",
              rebase_path(dir),
            ]
          }
        }
      }
    } else {
      not_needed(invoker, "*")
    }
  }
}

template("third_party") {
  enabled = !defined(invoker.enabled) || invoker.enabled
  third_party_config(target_name + "_public") {
    if (enabled) {
      if (defined(invoker.public_defines)) {
        defines = invoker.public_defines
      }
      include_dirs = invoker.public_include_dirs
    } 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" ]
  }

  if (is_debug) {
    configs += [ "//gn:optimize" ]
  }

  if (sanitize == "ASAN") {
    configs += [ "//gn:recover_pointer_overflow" ]
  }
}

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