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

pw_build_assert("check_system_clock_backend") {
  condition =
      pw_sync_OVERRIDE_SYSTEM_CLOCK_BACKEND_CHECK ||
      pw_chrono_SYSTEM_CLOCK_BACKEND == "$dir_pw_chrono_threadx:system_clock"
  message = "The ThreadX pw::sync::BinarySemaphore backend only works with " +
            "the ThreadX pw::chrono::SystemClock backend."
  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 = [
      ":check_system_clock_backend",
      "$dir_pw_sync:binary_semaphore.facade",
      pw_chrono_SYSTEM_CLOCK_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 = [
      ":check_system_clock_backend",
      "$dir_pw_sync:counting_semaphore.facade",
      pw_chrono_SYSTEM_CLOCK_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 = [
      ":check_system_clock_backend",
      "$dir_pw_assert",
      "$dir_pw_interrupt:context",
      "$dir_pw_third_party/threadx",
      pw_chrono_SYSTEM_CLOCK_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" ]
}
