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

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.")
  }

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