# Copyright (c) 2023 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("$dir_pw_build/target_types.gni")
import("${chip_root}/src/platform/device.gni")

nxp_platform_dir = "${chip_root}/examples/platform/nxp"

# Define a scope for pw RPC server dependencies.
# This .gni file should be imported by applications that want to use pw RPC.
# These variables shall be copied in the final executable target by adding
# forward_variables_from(pw_rpc_server, "*") in the beginning of the target scope.
pw_rpc_server = {
  sources = [
    "${chip_root}/examples/common/pigweed/RpcService.cpp",
    "${chip_root}/examples/common/pigweed/nxp/PigweedLoggerMutex.cpp",
    "${nxp_platform_dir}/PigweedLogger.cpp",
    "${nxp_platform_dir}/Rpc.cpp",
  ]

  include_dirs = [
    "${chip_root}/examples/common",
    "${chip_root}/examples/common/pigweed",
    "${chip_root}/examples/common/pigweed/nxp",
    "${nxp_platform_dir}",
  ]

  defines = [
    "PW_RPC_ENABLED",
    "PW_RPC_ATTRIBUTE_SERVICE=1",
    "PW_RPC_BUTTON_SERVICE=1",
    "PW_RPC_DEVICE_SERVICE=1",
    "PW_RPC_LIGHTING_SERVICE=1",
  ]

  deps = [
    "$dir_pw_hdlc:rpc_channel_output",
    "$dir_pw_stream:sys_io_stream",
    "$dir_pw_trace",
    "${chip_root}/config/nxp/lib/pw_rpc:pw_rpc",
    "${chip_root}/examples/common/pigweed:attributes_service.nanopb_rpc",
    "${chip_root}/examples/common/pigweed:button_service.nanopb_rpc",
    "${chip_root}/examples/common/pigweed:device_service.nanopb_rpc",
    "${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc",
    "${nxp_platform_dir}/pw_sys_io:pw_sys_io_nxp",
  ]
  deps += pw_build_LINK_DEPS
}
