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

declare_args() {
  third_party_isystem = true
}

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 (third_party_isystem) {
            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) {
      # set_defaults(_mode) might not exist or set configs
      if (!defined(configs)) {
        configs = []
      }
      if (is_debug) {
        configs += [ "//gn/skia:optimize" ]
      }
      if (sanitize == "ASAN") {
        configs += [ "//gn/skia:recover_pointer_overflow" ]
      }

      # "*" clobbers the current scope; append to existing configs
      forward_variables_from(invoker,
                             "*",
                             [
                               "public_include_dirs",
                               "configs",
                             ])
      if (defined(invoker.configs)) {
        configs += invoker.configs
      }
      public_configs = [ ":" + target_name + "_public" ]

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

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