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

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/facade.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.gni")
import("backend.gni")

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_facade("id") {
  backend = pw_thread_ID_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/id.h" ]
}

pw_facade("sleep") {
  backend = pw_thread_SLEEP_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/sleep.h" ]
  public_deps = [
    "$dir_pw_chrono:system_clock",
    "$dir_pw_preprocessor",
  ]
  sources = [ "sleep.cc" ]
}

pw_facade("thread") {
  backend = pw_thread_THREAD_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_thread/detached_thread.h",
    "public/pw_thread/thread.h",
  ]
  public_deps = [
    ":id",
    ":thread_core",
  ]
  sources = [ "thread.cc" ]
}

pw_source_set("thread_core") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/thread_core.h" ]
}

pw_facade("yield") {
  backend = pw_thread_YIELD_BACKEND
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_thread/yield.h" ]
  public_deps = [ "$dir_pw_preprocessor" ]
  sources = [ "yield.cc" ]
}

pw_test_group("tests") {
  tests = [
    ":id_facade_test",
    ":sleep_facade_test",
    ":yield_facade_test",
  ]
}

pw_test("id_facade_test") {
  enable_if = pw_thread_ID_BACKEND != ""
  sources = [ "id_facade_test.cc" ]
  deps = [ ":id" ]
}

pw_test("sleep_facade_test") {
  enable_if = pw_thread_SLEEP_BACKEND != "" && pw_thread_ID_BACKEND != ""
  sources = [
    "sleep_facade_test.cc",
    "sleep_facade_test_c.c",
  ]
  deps = [
    ":id",
    ":sleep",
    "$dir_pw_chrono:system_clock",
  ]
}

if (pw_thread_THREAD_BACKEND != "") {
  pw_source_set("test_threads") {
    public_configs = [ ":public_include_path" ]
    public = [ "public/pw_thread/test_threads.h" ]
    public_deps = [ ":thread" ]
  }

  # To instantiate this facade test based on a selected backend to provide
  # test_threads you can create a pw_test target which depends on this
  # pw_source_set and a pw_source_set which provides the implementation of
  # test_threads. See "$dir_pw_thread_stl:thread_backend_test" as an example.
  pw_source_set("thread_facade_test") {
    sources = [ "thread_facade_test.cc" ]
    deps = [
      ":id",
      ":sleep",
      ":test_threads",
      ":thread",
      "$dir_pw_sync:binary_semaphore",
      dir_pw_unit_test,
    ]
  }
}

pw_test("yield_facade_test") {
  enable_if = pw_thread_YIELD_BACKEND != "" && pw_thread_ID_BACKEND != ""
  sources = [
    "yield_facade_test.cc",
    "yield_facade_test_c.c",
  ]
  deps = [
    ":id",
    ":yield",
  ]
}

pw_proto_library("protos") {
  sources = [ "pw_thread_protos/thread.proto" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
