# Copyright (c) 2020-2021 Project CHIP 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
#
# http://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/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/nlassert.gni")
import("//build_overrides/nlfaultinjection.gni")
import("//build_overrides/nlio.gni")
import("//build_overrides/nlunit_test.gni")

import("${chip_root}/build/chip/chip_version.gni")
import("${chip_root}/build/chip/java/config.gni")
import("${chip_root}/build/chip/tests.gni")
import("${chip_root}/src/lib/core/core.gni")

declare_args() {
  # Set to true to run the PersistentStorageDelegate API compliance audit
  chip_support_enable_storage_api_audit = false

  # Set to true to run the PersistentStorageDelegate load test audit
  chip_support_enable_storage_load_test_audit = false
}

config("storage_audit_config") {
  defines = []

  if (chip_support_enable_storage_api_audit) {
    defines += [ "CHIP_SUPPORT_ENABLE_STORAGE_API_AUDIT" ]
  }

  if (chip_support_enable_storage_load_test_audit) {
    defines += [ "CHIP_SUPPORT_ENABLE_STORAGE_LOAD_TEST_AUDIT" ]
  }
}

if (chip_pw_tokenizer_logging) {
  import("//build_overrides/pigweed.gni")
}

action("gen_chip_version") {
  script = "${chip_root}/scripts/gen_chip_version.py"

  version_file = "${root_gen_dir}/include/CHIPVersion.h"
  outputs = [ version_file ]
  args = [
    "--output_file=" + rebase_path(version_file, root_build_dir),
    "--chip_major=${chip_version_major}",
    "--chip_minor=${chip_version_minor}",
    "--chip_patch=${chip_version_patch}",
    "--chip_extra=${chip_version_extra}",
  ]
}

source_set("logging_constants") {
  sources = [ "logging/Constants.h" ]
}

source_set("enforce_format") {
  sources = [ "EnforceFormat.h" ]
}

source_set("chip_version_header") {
  sources = get_target_outputs(":gen_chip_version")

  deps = [ ":gen_chip_version" ]
}

static_library("support") {
  output_name = "libSupportLayer"

  sources = [
    "Base64.cpp",
    "Base64.h",
    "BitFlags.h",
    "BitMask.h",
    "BufferReader.cpp",
    "BufferReader.h",
    "BufferWriter.cpp",
    "BufferWriter.h",
    "BytesCircularBuffer.cpp",
    "BytesCircularBuffer.h",
    "BytesToHex.cpp",
    "BytesToHex.h",
    "CHIPArgParser.cpp",
    "CHIPCounter.h",
    "CHIPMem.cpp",
    "CHIPMem.h",
    "CHIPMemString.h",
    "CHIPPlatformMemory.cpp",
    "CHIPPlatformMemory.h",
    "CodeUtils.h",
    "DLLUtil.h",
    "DefaultStorageKeyAllocator.h",
    "Defer.h",
    "ErrorStr.cpp",
    "ErrorStr.h",
    "FibonacciUtils.cpp",
    "FibonacciUtils.h",
    "FixedBufferAllocator.cpp",
    "FixedBufferAllocator.h",
    "IniEscaping.cpp",
    "IniEscaping.h",
    "Iterators.h",
    "LifetimePersistedCounter.h",
    "ObjectLifeCycle.h",
    "PersistedCounter.h",
    "PersistentStorageAudit.cpp",
    "PersistentStorageAudit.h",
    "PersistentStorageMacros.h",
    "Pool.cpp",
    "Pool.h",
    "PrivateHeap.cpp",
    "PrivateHeap.h",
    "ReferenceCountedHandle.h",
    "SafeInt.h",
    "SerializableIntegerSet.cpp",
    "SerializableIntegerSet.h",
    "SetupDiscriminator.h",
    "SortUtils.h",
    "StateMachine.h",
    "ThreadOperationalDataset.cpp",
    "ThreadOperationalDataset.h",
    "TimeUtils.cpp",
    "TimeUtils.h",
    "Variant.h",
    "ZclString.cpp",
    "ZclString.h",
    "logging/CHIPLogging.cpp",
    "logging/CHIPLogging.h",
    "verhoeff/Verhoeff.cpp",
    "verhoeff/Verhoeff.h",
    "verhoeff/Verhoeff10.cpp",
    "verhoeff/Verhoeff16.cpp",
    "verhoeff/Verhoeff32.cpp",
    "verhoeff/Verhoeff36.cpp",
  ]

  if (current_os == "android" || build_java_matter_controller) {
    if (build_java_matter_controller) {
      include_dirs = java_matter_controller_dependent_paths
    }

    # added JNI helper on android
    sources += [
      "CHIPJNIError.h",
      "JniReferences.cpp",
      "JniReferences.h",
      "JniTypeWrappers.h",
    ]
  }

  libs = []

  cflags = [ "-Wconversion" ]

  public_deps = [
    ":chip_version_header",
    ":enforce_format",
    ":logging_constants",
    "${chip_root}/src/lib/core:chip_config_header",
    "${chip_root}/src/platform:platform_buildconfig",
    "${chip_root}/src/platform/logging:headers",
    "${nlassert_root}:nlassert",
    "${nlio_root}:nlio",
  ]

  # These are needed because we include CHIPCore.h, which uses config
  # options for src/ble and src/inet, however we cannot depend on those
  # directly as such a dependency is cyclic.
  public_deps += [
    "${chip_root}/src/ble:ble_config_header",
    "${chip_root}/src/inet:inet_config_header",
  ]

  # Android has no 'platform' that provides logging
  if (current_os == "android") {
    public_deps += [ "${chip_root}/src/platform/logging:android" ]
  }

  public_configs = [
    "${chip_root}/src:includes",
    "${chip_root}/src/system:system_config",
    ":storage_audit_config",
  ]

  if (chip_config_memory_management == "simple") {
    sources += [ "CHIPMem-Simple.cpp" ]
  }
  if (chip_config_memory_management == "malloc") {
    sources += [ "CHIPMem-Malloc.cpp" ]
  }
  if (chip_with_nlfaultinjection) {
    sources += [
      "CHIPFaultInjection.cpp",
      "CHIPFaultInjection.h",
    ]
    public_deps += [ "${nlfaultinjection_root}:nlfaultinjection" ]
  }

  if (chip_pw_tokenizer_logging) {
    public_deps += [ "${dir_pw_tokenizer}:global_handler_with_payload" ]
  }

  if (chip_config_memory_debug_dmalloc) {
    libs += [ "dmallocthcxx" ]
  }
}

static_library("testing") {
  output_name = "libSupportTesting"
  output_dir = "${root_out_dir}/lib"

  sources = [
    "UnitTestExtendedAssertions.h",
    "UnitTestRegistration.cpp",
    "UnitTestRegistration.h",
    "UnitTestUtils.cpp",
    "UnitTestUtils.h",
  ]

  public_deps = [
    ":support",
    "${chip_root}/src/lib/core",
    "${nlassert_root}:nlassert",
    "${nlunit_test_root}:nlunit-test",
  ]
}
