# Copyright(c) 2022 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/chip.gni")
import("//build_overrides/pigweed.gni")

import("${chip_root}/src/platform/device.gni")
assert(chip_device_platform == "psoc6")

if (chip_enable_openthread) {
  import("//build_overrides/openthread.gni")
}

static_library("PSOC6") {
  sources = [
    "../../FreeRTOS/SystemTimeSupport.cpp",
    "../../SingletonConfigurationManager.cpp",
    "BLEManagerImpl.cpp",
    "BLEManagerImpl.h",
    "BlePlatformConfig.h",
    "CHIPDevicePlatformConfig.h",
    "CHIPDevicePlatformEvent.h",
    "CHIPPlatformConfig.h",
    "ConfigurationManagerImpl.cpp",
    "ConfigurationManagerImpl.h",
    "ConnectivityManagerImpl.cpp",
    "ConnectivityManagerImpl.h",
    "DiagnosticDataProviderImpl.cpp",
    "DiagnosticDataProviderImpl.h",
    "InetPlatformConfig.h",
    "KeyValueStoreManagerImpl.cpp",
    "KeyValueStoreManagerImpl.h",
    "Logging.cpp",
    "LwIPCoreLock.cpp",
    "MTBKeyValueStore.cpp",
    "MTBKeyValueStore.h",
    "NetworkCommissioningDriver.h",
    "NetworkCommissioningWiFiDriver.cpp",
    "OTAImageProcessorImpl.cpp",
    "OTAImageProcessorImpl.h",
    "P6Config.cpp",
    "P6Config.h",
    "P6Utils.cpp",
    "P6Utils.h",
    "PlatformManagerImpl.cpp",
    "PlatformManagerImpl.h",
    "SystemPlatformConfig.h",
    "WarmPlatformConfig.h",
    "app_platform_cfg.c",
    "app_platform_cfg.h",
    "cycfg_bt_settings.cpp",
    "cycfg_bt_settings.h",
    "cycfg_gap.cpp",
    "cycfg_gap.h",
    "cycfg_gatt_db.c",
    "cycfg_gatt_db.h",
  ]

  deps = [
    "${chip_root}/src/lib/dnssd:platform_header",
    "${chip_root}/src/setup_payload",
  ]

  public_deps = [
    "${chip_root}/src/crypto",
    "${chip_root}/src/platform:platform_base",
  ]
}
