# 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")
import("$dir_pw_unit_test/test.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" ]
}

pw_test_group("tests") {
}
