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

config("armv7m") {
  defines = [ "PW_CPU_EXCEPTION_CORTEX_M_ARMV7M=1" ]
}

config("armv8m") {
  defines = [ "PW_CPU_EXCEPTION_CORTEX_M_ARMV8M=1" ]
}

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

pw_source_set("support_armv8m") {
  public_configs = [ ":public_include_path" ]
  configs = [ ":armv8m" ]
  deps = [
    ":config",
    ":cortex_m_constants_armv8m",
    ":cpu_exception_armv8m",
    "$dir_pw_cpu_exception:support.facade",
    dir_pw_log,
    dir_pw_string,
  ]
  sources = [ "cpu_state.cc" ]
}

pw_source_set("proto_dump_armv7m") {
  public_configs = [ ":public_include_path" ]
  configs = [ ":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_source_set("proto_dump_armv8m") {
  public_configs = [ ":public_include_path" ]
  configs = [ ":armv8m" ]
  public_deps = [
    ":cpu_exception_armv8m",
    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" ]
}

pw_source_set("cpu_exception_armv7m") {
  public_configs = [
    ":armv7m",
    ":backend_config",
    ":public_include_path",
  ]
  public = [
    "public/pw_cpu_exception_cortex_m/cpu_state.h",
    "public_overrides/pw_cpu_exception_backend/state.h",
  ]
  public_deps = [ "$dir_pw_preprocessor" ]
}

# 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_armv8m") {
  public_configs = [
    ":armv8m",
    ":backend_config",
    ":public_include_path",
  ]
  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") {
  configs = [ ":armv7m" ]
  sources = [ "entry.cc" ]
  deps = [
    ":config",
    ":cortex_m_constants_armv7m",
    "$dir_pw_cpu_exception:entry.facade",
    "$dir_pw_cpu_exception:handler",
  ]
}

# 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_armv8m.impl") {
  configs = [ ":armv8m" ]
  sources = [ "entry.cc" ]
  deps = [
    ":config",
    ":cortex_m_constants_armv8m",
    "$dir_pw_cpu_exception:entry.facade",
    "$dir_pw_cpu_exception:handler",
  ]
}

# TODO(ewout): Deprecate this once customers have been migrated to the arch
# specific one.
group("snapshot") {
  public_deps = [ ":snapshot_armv7m" ]
}

pw_source_set("snapshot_armv7m") {
  public_configs = [ ":public_include_path" ]
  configs = [ ":armv7m" ]
  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_armv7m",
    ":proto_dump_armv7m",
    "$dir_pw_cpu_exception:support",
    dir_pw_log,
  ]
}

# 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("snapshot_armv8m") {
  public_configs = [ ":public_include_path" ]
  configs = [ ":armv8m" ]
  public_deps = [
    ":cpu_exception_armv8m",
    ":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_armv8m",
    ":proto_dump_armv8m",
    "$dir_pw_cpu_exception:support",
    dir_pw_log,
  ]
}

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

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

pw_test_group("tests") {
  tests = [ ":cpu_exception_entry_test_armv7m" ]
}

# TODO(pwbug/583): Add an ARMv8-M entry test.
pw_test("cpu_exception_entry_test_armv7m") {
  enable_if = pw_cpu_exception_ENTRY_BACKEND ==
              "$dir_pw_cpu_exception_cortex_m:cpu_exception_armv7m"
  deps = [
    ":cortex_m_constants_armv7m",
    ":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" ]
}
