# 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/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")

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

pw_source_set("support_armv7m") {
  public_configs = [ ":default_config" ]
  public_deps = [
    "$dir_pw_cpu_exception:support.facade",
    dir_pw_preprocessor,
    dir_pw_string,
  ]
  deps = [ dir_pw_log ]
  public = [ "public/pw_cpu_exception_cortex_m/cpu_state.h" ]
  sources = [
    "cpu_state.cc",
    "pw_cpu_exception_cortex_m_private/cortex_m_constants.h",
  ]
}

pw_source_set("proto_dump_armv7m") {
  public_deps = [
    ":support_armv7m",
    dir_pw_protobuf,
    dir_pw_status,
    dir_pw_stream,
  ]
  public = [ "public/pw_cpu_exception_cortex_m/proto_dump.h" ]
  deps = [ ":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 = [ ":default_config" ]
  public_deps = [
    ":proto_dump_armv7m",
    ":support_armv7m",
    "$dir_pw_cpu_exception:entry.facade",
    "$dir_pw_cpu_exception:handler",
    "$dir_pw_preprocessor",
  ]
  sources = [
    "entry.cc",
    "pw_cpu_exception_cortex_m_private/cortex_m_constants.h",
  ]
}

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" ]
  sources = [ "exception_entry_test.cc" ]
}

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