# Copyright 2021 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") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_embos/binary_semaphore_inline.h",
    "public/pw_sync_embos/binary_semaphore_native.h",
    "public_overrides/pw_sync_backend/binary_semaphore_inline.h",
    "public_overrides/pw_sync_backend/binary_semaphore_native.h",
  ]
  public_deps = [
    "$dir_pw_assert",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_chrono_embos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/embos",
  ]
  sources = [ "binary_semaphore.cc" ]
  deps = [ "$dir_pw_sync:binary_semaphore.facade" ]
  assert(
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
          pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_embos:system_clock",
      "The embOS pw::sync::BinarySemaphore backend only works with the " +
          "embOS pw::chrono::SystemClock backend.")
}

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

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

# This target provides the backend for pw::sync::TimedMutex.
pw_source_set("timed_mutex") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_embos/timed_mutex_inline.h",
    "public_overrides/pw_sync_backend/timed_mutex_inline.h",
  ]
  public_deps = [
    "$dir_pw_chrono:system_clock",
    "$dir_pw_sync:timed_mutex.facade",
  ]
  sources = [ "timed_mutex.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_chrono_embos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/embos",
  ]
  assert(
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
          pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_embos:system_clock",
      "The embOS pw::sync::Mutex backend only works with the embOS " +
          "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_embos/interrupt_spin_lock_inline.h",
    "public/pw_sync_embos/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_third_party/embos" ]
  sources = [ "interrupt_spin_lock.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_sync:interrupt_spin_lock.facade",
    "$dir_pw_third_party/embos",
  ]
}

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