pw_build: Switch to pw_* target types

This change replaces the implicit overrides of the default GN target
types in BUILDCONFIG.gn with explicit pw_* versions. This is done to
allow Pigweed to build within larger GN projects without modifying their
BUILDCONFIG files.

Change-Id: I1d1e41d5e9bde8fe076f7031f3c2b98b9630ff70
diff --git a/pw_build/target_types.gni b/pw_build/target_types.gni
new file mode 100644
index 0000000..9797763
--- /dev/null
+++ b/pw_build/target_types.gni
@@ -0,0 +1,183 @@
+# Copyright 2020 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+#     https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+# TODO(frolv): The code in all of the templates below is duplicated, with the
+# exception of the target type. This file could be auto-generated with Python.
+
+_supported_toolchain_defaults = [
+  "configs",
+  "public_deps",
+]
+
+template("pw_source_set") {
+  import("$dir_pw_build/defaults.gni")
+
+  source_set(target_name) {
+    forward_variables_from(invoker, "*", _supported_toolchain_defaults)
+
+    if (defined(pw_build_defaults.configs)) {
+      configs = pw_build_defaults.configs
+    } else {
+      configs = []
+    }
+    if (defined(remove_configs)) {
+      if (remove_configs[0] == "*") {
+        configs = []
+      } else {
+        configs -= remove_configs
+      }
+    }
+    if (defined(invoker.configs)) {
+      configs += invoker.configs
+    }
+
+    if (defined(pw_build_defaults.public_deps)) {
+      public_deps = pw_build_defaults.public_deps
+    } else {
+      public_deps = []
+    }
+    if (defined(remove_public_deps)) {
+      if (remove_public_deps[0] == "*") {
+        public_deps = []
+      } else {
+        public_deps -= remove_public_deps
+      }
+    }
+    if (defined(invoker.public_deps)) {
+      public_deps += invoker.public_deps
+    }
+  }
+}
+
+template("pw_static_library") {
+  import("$dir_pw_build/defaults.gni")
+
+  static_library(target_name) {
+    forward_variables_from(invoker, "*", _supported_toolchain_defaults)
+
+    if (defined(pw_build_defaults.configs)) {
+      configs = pw_build_defaults.configs
+    } else {
+      configs = []
+    }
+    if (defined(remove_configs)) {
+      if (remove_configs[0] == "*") {
+        configs = []
+      } else {
+        configs -= remove_configs
+      }
+    }
+    if (defined(invoker.configs)) {
+      configs += invoker.configs
+    }
+
+    if (defined(pw_build_defaults.public_deps)) {
+      public_deps = pw_build_defaults.public_deps
+    } else {
+      public_deps = []
+    }
+    if (defined(remove_public_deps)) {
+      if (remove_public_deps[0] == "*") {
+        public_deps = []
+      } else {
+        public_deps -= remove_public_deps
+      }
+    }
+    if (defined(invoker.public_deps)) {
+      public_deps += invoker.public_deps
+    }
+  }
+}
+
+template("pw_shared_library") {
+  import("$dir_pw_build/defaults.gni")
+
+  shared_library(target_name) {
+    forward_variables_from(invoker, "*", _supported_toolchain_defaults)
+
+    if (defined(pw_build_defaults.configs)) {
+      configs = pw_build_defaults.configs
+    } else {
+      configs = []
+    }
+    if (defined(remove_configs)) {
+      if (remove_configs[0] == "*") {
+        configs = []
+      } else {
+        configs -= remove_configs
+      }
+    }
+    if (defined(invoker.configs)) {
+      configs += invoker.configs
+    }
+
+    if (defined(pw_build_defaults.public_deps)) {
+      public_deps = pw_build_defaults.public_deps
+    } else {
+      public_deps = []
+    }
+    if (defined(remove_public_deps)) {
+      if (remove_public_deps[0] == "*") {
+        public_deps = []
+      } else {
+        public_deps -= remove_public_deps
+      }
+    }
+    if (defined(invoker.public_deps)) {
+      public_deps += invoker.public_deps
+    }
+  }
+}
+
+# Wrapper for Pigweed executable build targets which uses a globally-defined,
+# configurable target type.
+template("pw_executable") {
+  import("$dir_pw_build/defaults.gni")
+
+  target(pw_executable_config.target_type, target_name) {
+    forward_variables_from(invoker, "*", _supported_toolchain_defaults)
+
+    if (defined(pw_build_defaults.configs)) {
+      configs = pw_build_defaults.configs
+    } else {
+      configs = []
+    }
+    if (defined(remove_configs)) {
+      if (remove_configs[0] == "*") {
+        configs = []
+      } else {
+        configs -= remove_configs
+      }
+    }
+    if (defined(invoker.configs)) {
+      configs += invoker.configs
+    }
+
+    if (defined(pw_build_defaults.public_deps)) {
+      public_deps = pw_build_defaults.public_deps
+    } else {
+      public_deps = []
+    }
+    if (defined(remove_public_deps)) {
+      if (remove_public_deps[0] == "*") {
+        public_deps = []
+      } else {
+        public_deps -= remove_public_deps
+      }
+    }
+    if (defined(invoker.public_deps)) {
+      public_deps += invoker.public_deps
+    }
+  }
+}