# Copyright 2019 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.

import("$dir_pw_unit_test/test.gni")

# By default, Pigweed will build this target when invoking ninja.
group("default") {
  deps = [
    ":pw_module_tests_run",
    "$dir_pigweed/docs",
  ]
}

group("pw_facades") {
  deps = [
    "$dir_pw_cpu_exception",
    "$dir_pw_dumb_io",
  ]
}

# All Pigweed modules that can be built using gn. This is not built by default.
group("pw_modules") {
  deps = [
    "$dir_pigweed/docs",
    "$dir_pw_bloat",
    "$dir_pw_preprocessor",
    "$dir_pw_span",
    "$dir_pw_status",
    "$dir_pw_string",
    "$dir_pw_unit_test",
    "$dir_pw_varint",
  ]
}

# Targets for all module unit test groups.
pw_test_group("pw_module_tests") {
  group_deps = [
    "$dir_pw_preprocessor:tests",
    "$dir_pw_span:tests",
    "$dir_pw_status:tests",
    "$dir_pw_string:tests",
    "$dir_pw_varint:tests",
  ]

  # TODO(pwbug/17): Re-think when Pigweed config system is added.
  if (dir_pw_cpu_exception_backend == dir_pw_cpu_exception_armv7m) {
    group_deps += [ "$dir_pw_cpu_exception_armv7m:tests" ]
  }
}
