# 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/target_types.gni")
import("$dir_pw_chrono/backend.gni")
import("$dir_pw_docgen/docs.gni")

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

config("backend_config") {
  include_dirs = [ "public_overrides" ]
  visibility = [ ":*" ]
}

# This target provides the backend for pw::sync::BinarySemaphore.
pw_source_set("binary_semaphore_backend") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_stl/binary_semaphore_inline.h",
    "public/pw_sync_stl/binary_semaphore_native.h",
    "public_overrides/pw_sync_backend/binary_semaphore_inline.h",
    "public_overrides/pw_sync_backend/binary_semaphore_native.h",
  ]
  sources = [ "binary_semaphore.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_sync:binary_semaphore.facade",
  ]
  assert(
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
          pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_stl:system_clock",
      "The STL pw::sync::BinarySemaphore backend only works with the " +
          "STL pw::chrono::SystemClock backend.")
}

# This target provides the backend for pw::sync::CountingSemaphore.
pw_source_set("counting_semaphore_backend") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_stl/counting_semaphore_inline.h",
    "public/pw_sync_stl/counting_semaphore_native.h",
    "public_overrides/pw_sync_backend/counting_semaphore_inline.h",
    "public_overrides/pw_sync_backend/counting_semaphore_native.h",
  ]
  sources = [ "counting_semaphore.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_sync:counting_semaphore.facade",
  ]
  assert(
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
          pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_stl:system_clock",
      "The STL pw::sync::CountingSemaphore backend only works with the " +
          "STL pw::chrono::SystemClock backend.")
}

# This target provides the backend for pw::sync::Mutex.
pw_source_set("mutex_backend") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_stl/mutex_inline.h",
    "public/pw_sync_stl/mutex_native.h",
    "public_overrides/pw_sync_backend/mutex_inline.h",
    "public_overrides/pw_sync_backend/mutex_native.h",
  ]
  public_deps = [ "$dir_pw_sync:mutex.facade" ]
  deps = [ dir_pw_assert ]

  sources = [ "mutex.cc" ]
}

# This target provides the backend for pw::sync::TimedMutex.
pw_source_set("timed_mutex_backend") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "$dir_pw_sync:timed_mutex.facade",
    "public/pw_sync_stl/timed_mutex_inline.h",
    "public_overrides/pw_sync_backend/timed_mutex_inline.h",
  ]
  public_deps = [ "$dir_pw_chrono:system_clock" ]
  assert(
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
          pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_stl:system_clock",
      "The STL pw::sync::TimedMutex backend only works with the STL " +
          "pw::chrono::SystemClock backend.")
}

# This target provides the backend for pw::sync::InterruptSpinLock.
pw_source_set("interrupt_spin_lock") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_stl/interrupt_spin_lock_inline.h",
    "public/pw_sync_stl/interrupt_spin_lock_native.h",
    "public_overrides/pw_sync_backend/interrupt_spin_lock_inline.h",
    "public_overrides/pw_sync_backend/interrupt_spin_lock_native.h",
  ]
  public_deps = [
    "$dir_pw_sync:interrupt_spin_lock.facade",
    "$dir_pw_sync:yield_core",
  ]
}

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