# 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/error.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 = [ ":*" ]
}

pw_build_assert("check_system_clock_backend") {
  condition =
      pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
      pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_embos:system_clock"
  message = "The embOS pw_sync backends only work with the " +
            "embOS pw::chrono::SystemClock backend."
  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 = [
    ":check_system_clock_backend",
    "$dir_pw_sync:binary_semaphore.facade",
  ]
}

# 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 = [
    ":check_system_clock_backend",
    "$dir_pw_sync:counting_semaphore.facade",
  ]
}

# 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 = [
    ":check_system_clock_backend",
    "$dir_pw_assert",
    "$dir_pw_chrono_embos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/embos",
  ]
}

# 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" ]
}
