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

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_sync_freertos_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

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

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

pw_source_set("config") {
  public = [ "public/pw_sync_freertos/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [
    "$dir_pw_third_party/freertos",
    pw_sync_freertos_CONFIG,
  ]
}

# 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_freertos/binary_semaphore_inline.h",
    "public/pw_sync_freertos/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_freertos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/freertos",
  ]
  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_freertos:system_clock",
         "The FreeRTOS pw::sync::BinarySemaphore backend only works with the " +
             "FreeRTOS 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_freertos/counting_semaphore_inline.h",
    "public/pw_sync_freertos/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_freertos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/freertos",
  ]
  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_freertos:system_clock",
         "The FreeRTOS pw::sync::CountingSemaphore backend only works with " +
             "the FreeRTOS 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_freertos/mutex_inline.h",
    "public/pw_sync_freertos/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/freertos",
  ]
}

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
# task notifications.
pw_source_set("thread_notification") {
  public_configs = [
    ":public_include_path",
    ":public_overrides_thread_notification_include_path",
  ]
  public = [
    "public/pw_sync_freertos/thread_notification_inline.h",
    "public/pw_sync_freertos/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_interrupt:context",
    "$dir_pw_sync:thread_notification.facade",
    "$dir_pw_third_party/freertos",
  ]
  sources = [ "thread_notification.cc" ]
  deps = [
    ":config",
    dir_pw_assert,
  ]
}

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
# on task notifications.
pw_source_set("timed_thread_notification") {
  public_configs = [
    ":public_include_path",
    ":public_overrides_timed_thread_notification_include_path",
  ]
  public = [
    "public/pw_sync_freertos/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 = [
    ":config",
    "$dir_pw_assert",
    "$dir_pw_chrono_freertos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/freertos",
  ]
  assert(pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
             pw_chrono_SYSTEM_CLOCK_BACKEND ==
                 "$dir_pw_chrono_freertos:system_clock",
         "The FreeRTOS pw::sync::Mutex backend only works with the FreeRTOS " +
             "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_freertos/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_freertos:system_clock",
    "$dir_pw_interrupt:context",
    "$dir_pw_third_party/freertos",
  ]
  assert(pw_chrono_SYSTEM_CLOCK_BACKEND == "" ||
             pw_chrono_SYSTEM_CLOCK_BACKEND ==
                 "$dir_pw_chrono_freertos:system_clock",
         "The FreeRTOS pw::sync::Mutex backend only works with the FreeRTOS " +
             "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_freertos/interrupt_spin_lock_inline.h",
    "public/pw_sync_freertos/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/freertos" ]
  sources = [ "interrupt_spin_lock.cc" ]
  deps = [
    "$dir_pw_assert",
    "$dir_pw_interrupt:context",
    "$dir_pw_sync:interrupt_spin_lock.facade",
    "$dir_pw_third_party/freertos",
  ]
}

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