# Copyright 2019 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_cpu_exception/backend.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_unit_test/test.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_cpu_exception_cortex_m_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

pw_source_set("config") {
  public_deps = [ pw_cpu_exception_cortex_m_CONFIG ]
  public = [ "pw_cpu_exception_cortex_m_private/config.h" ]
  visibility = [ ":*" ]
}

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

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

pw_source_set("support_armv7m") {
  public_configs = [ ":public_include_path" ]
  deps = [
    ":config",
    ":cortex_m_constants",
    ":cpu_exception_armv7m",
    "$dir_pw_cpu_exception:support.facade",
    dir_pw_log,
    dir_pw_string,
  ]
  sources = [ "cpu_state.cc" ]
}

pw_source_set("proto_dump_armv7m") {
  public_deps = [
    ":cpu_exception_armv7m",
    dir_pw_protobuf,
    dir_pw_status,
    dir_pw_stream,
  ]
  public = [ "public/pw_cpu_exception_cortex_m/proto_dump.h" ]
  deps = [
    ":config",
    ":cpu_state_protos.pwpb",
  ]
  sources = [ "proto_dump.cc" ]
}

pw_proto_library("cpu_state_protos") {
  sources = [ "pw_cpu_exception_cortex_m_protos/cpu_state.proto" ]
}

# TODO(pwbug/296): The *_armv7m libraries work on ARMv8-M, but needs some minor
# patches for complete correctness. Add *_armv8m targets that use the same files
# but provide preprocessor defines to enable/disable architecture specific code.
pw_source_set("cpu_exception_armv7m") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_cpu_exception_cortex_m/cpu_state.h",
    "public_overrides/pw_cpu_exception_backend/state.h",
  ]
  public_deps = [ "$dir_pw_preprocessor" ]
}

pw_source_set("cpu_exception_armv7m.impl") {
  sources = [ "entry.cc" ]
  deps = [
    ":config",
    ":cortex_m_constants",
    "$dir_pw_cpu_exception:entry.facade",
    "$dir_pw_cpu_exception:handler",
  ]
}

pw_source_set("snapshot") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":cpu_exception_armv7m",
    ":cpu_state_protos.pwpb",
    "$dir_pw_thread:protos.pwpb",
    "$dir_pw_thread:snapshot",
    dir_pw_protobuf,
    dir_pw_status,
  ]
  public = [ "public/pw_cpu_exception_cortex_m/snapshot.h" ]
  sources = [ "snapshot.cc" ]
  deps = [
    ":config",
    ":cortex_m_constants",
    ":proto_dump_armv7m",
    "$dir_pw_cpu_exception:support",
    dir_pw_log,
  ]
}

pw_source_set("cortex_m_constants") {
  public = [ "pw_cpu_exception_cortex_m_private/cortex_m_constants.h" ]
  visibility = [ ":*" ]
}

pw_test_group("tests") {
  enable_if = pw_cpu_exception_ENTRY_BACKEND ==
              "$dir_pw_cpu_exception_cortex_m:cpu_exception_armv7m"
  tests = [ ":cpu_exception_entry_test" ]
}

pw_test("cpu_exception_entry_test") {
  deps = [
    ":cpu_exception_armv7m",
    "$dir_pw_cpu_exception:entry",
    "$dir_pw_cpu_exception:handler",
    "$dir_pw_cpu_exception:support",
  ]
  sources = [ "exception_entry_test.cc" ]
}

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