# 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")
import("$dir_pw_sync/backend.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::Mutex.
pw_source_set("mutex") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_threadx/mutex_inline.h",
    "public/pw_sync_threadx/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/threadx",
  ]
}

config("public_overrides_thread_notification_include_path") {
  include_dirs = [ "public_overrides/thread_notification" ]
  visibility = [ ":thread_notification" ]
}

# This target provides the backend for pw::sync::ThreadNotification based on
# tx_thread_sleep and tx_thread_wait_abort.
pw_source_set("thread_notification") {
  public_configs = [
    ":public_include_path",
    ":public_overrides_thread_notification_include_path",
  ]
  public = [
    "public/pw_sync_threadx/thread_notification_inline.h",
    "public/pw_sync_threadx/thread_notification_native.h",
    "public_overrides/thread_notification/pw_sync_backend/thread_notification_inline.h",
    "public_overrides/thread_notification/pw_sync_backend/thread_notification_native.h",
  ]
  public_deps = [
    "$dir_pw_assert",
    "$dir_pw_interrupt:context",
    "$dir_pw_sync:interrupt_spin_lock",
    "$dir_pw_sync:thread_notification.facade",
    "$dir_pw_third_party/threadx",
  ]
  sources = [ "thread_notification.cc" ]
}

if (pw_chrono_SYSTEM_CLOCK_BACKEND != "") {
  # 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_threadx/binary_semaphore_inline.h",
      "public/pw_sync_threadx/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_interrupt:context",
      "$dir_pw_third_party/threadx",
    ]
    sources = [ "binary_semaphore.cc" ]
    deps = [
      "$dir_pw_sync:binary_semaphore.facade",
      pw_chrono_SYSTEM_CLOCK_BACKEND,
    ]
    assert(
        pw_sync_OVERRIDE_SYSTEM_CLOCK_BACKEND_CHECK ||
            pw_chrono_SYSTEM_CLOCK_BACKEND ==
                "$dir_pw_chrono_threadx:system_clock",
        "The ThreadX pw::sync::BinarySemaphore backend only works with the " +
            "ThreadX 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_threadx/counting_semaphore_inline.h",
      "public/pw_sync_threadx/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_interrupt:context",
      "$dir_pw_third_party/threadx",
    ]
    sources = [ "counting_semaphore.cc" ]
    deps = [
      "$dir_pw_sync:counting_semaphore.facade",
      pw_chrono_SYSTEM_CLOCK_BACKEND,
    ]
    assert(pw_sync_OVERRIDE_SYSTEM_CLOCK_BACKEND_CHECK ||
               pw_chrono_SYSTEM_CLOCK_BACKEND ==
                   "$dir_pw_chrono_threadx:system_clock",
           "The ThreadX pw::sync::CountingSemaphore backend only works with " +
               "the ThreadX pw::chrono::SystemClock backend.")
  }

  config("public_overrides_timed_thread_notification_include_path") {
    include_dirs = [ "public_overrides/timed_thread_notification" ]
    visibility = [ ":timed_thread_notification" ]
  }

  # This target provides the backend for pw::sync::TimedThreadNotification based
  # tx_thread_sleep and tx_thread_wait_abort.
  pw_source_set("timed_thread_notification") {
    public_configs = [
      ":public_include_path",
      ":public_overrides_timed_thread_notification_include_path",
    ]
    public = [
      "public/pw_sync_threadx/timed_thread_notification_inline.h",
      "public_overrides/timed_thread_notification/pw_sync_backend/timed_thread_notification_inline.h",
    ]
    public_deps = [
      ":thread_notification",
      "$dir_pw_chrono:system_clock",
      "$dir_pw_sync:timed_thread_notification.facade",
    ]
    sources = [ "timed_thread_notification.cc" ]
    deps = [
      "$dir_pw_assert",
      "$dir_pw_interrupt:context",
      "$dir_pw_third_party/threadx",
      pw_chrono_SYSTEM_CLOCK_BACKEND,
    ]
    assert(pw_sync_OVERRIDE_SYSTEM_CLOCK_BACKEND_CHECK ||
               pw_chrono_SYSTEM_CLOCK_BACKEND ==
                   "$dir_pw_chrono_threadx:system_clock",
           "The ThreadX pw::sync::TimedMutex backend only works with the " +
               "ThreadX pw::chrono::SystemClock backend.")
  }

  # 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_threadx/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_interrupt:context",
      "$dir_pw_third_party/threadx",
      pw_chrono_SYSTEM_CLOCK_BACKEND,
    ]
    assert(pw_sync_OVERRIDE_SYSTEM_CLOCK_BACKEND_CHECK ||
               pw_chrono_SYSTEM_CLOCK_BACKEND ==
                   "$dir_pw_chrono_threadx:system_clock",
           "The ThreadX pw::sync::Mutex backend only works with the ThreadX " +
               "pw::chrono::SystemClock backend.")
  }
}

# This target provides the backend for pw::sync::InterruptSpinLock, note that
# this implementation does NOT support ThreadX w/ SMP.
pw_source_set("interrupt_spin_lock") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_sync_threadx/interrupt_spin_lock_inline.h",
    "public/pw_sync_threadx/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/threadx" ]
  sources = [ "interrupt_spin_lock.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_interrupt:context",
    "$dir_pw_sync:interrupt_spin_lock.facade",
  ]
}

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