#
#   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.
#

cmake_minimum_required(VERSION 3.21)

get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../.. REALPATH)
get_filename_component(OPEN_IOT_SDK_CONFIG ${CHIP_ROOT}/config/openiotsdk REALPATH)
get_filename_component(OPEN_IOT_SDK_EXAMPLE_COMMON ${CHIP_ROOT}/examples/platform/openiotsdk REALPATH)
get_filename_component(SHELL_COMMON ${CHIP_ROOT}/examples/shell/shell_common REALPATH)

list(APPEND CMAKE_MODULE_PATH ${OPEN_IOT_SDK_CONFIG}/cmake)

set(APP_TARGET chip-openiotsdk-shell-example)

# Toolchain files need to exist before first call to project
include(toolchain)

project(${APP_TARGET} LANGUAGES C CXX ASM)

include(sdk)

# LwIP configuration
if(TARGET lwip-cmsis-port)
    # lwip requires user_lwipopts.h, we use the custom settings
    target_include_directories(lwipopts
        INTERFACE
            ${OPEN_IOT_SDK_CONFIG}/lwip
    )

    if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
        target_compile_definitions(lwipopts
            INTERFACE
                LWIP_DEBUG
        )
    endif()
endif()

add_executable(${APP_TARGET})

# Application CHIP build configuration 
set(CONFIG_CHIP_LIB_SHELL YES)
include(chip)

add_subdirectory(${OPEN_IOT_SDK_EXAMPLE_COMMON}/app ./app_build)

target_include_directories(${APP_TARGET} 
    PRIVATE
        main/include
        ${SHELL_COMMON}/include
)

target_sources(${APP_TARGET} 
    PRIVATE
        main/main.cpp
        ${SHELL_COMMON}/cmd_misc.cpp
        ${SHELL_COMMON}/globals.cpp
)

target_link_libraries(${APP_TARGET}
    openiotsdk-app
)

include(linker)
set_target_link(${APP_TARGET})
