#----------------------------------------------------------------------------
#  Copyright (c) 2022 Arm Limited. All rights reserved.
#  SPDX-License-Identifier: Apache-2.0
#
#  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.
#----------------------------------------------------------------------------

#########################################################
#  Wrapper for enabling stdout and stderr facility      #
#########################################################
# This is a wrapper around the UART module for CMSDK    #
# and PL011 UART drivers with retarget functions.       #
#########################################################

cmake_minimum_required(VERSION 3.21.0)

project(stdout
    DESCRIPTION     "Standard output and err redirection over UART"
    LANGUAGES       C CXX)


set(STDOUT_RETARGET     OFF CACHE BOOL "Retarget stdout/err to UART")

# Interface library for standard output:
set(STDOUT_IFACE_TARGET stdout_iface)
add_library(${STDOUT_IFACE_TARGET} INTERFACE)
target_include_directories(${STDOUT_IFACE_TARGET} INTERFACE include)

if (STDOUT_RETARGET)

    set(STDOUT_COMPONENT_CMSDK stdout_retarget_cmsdk)
    set(STDOUT_COMPONENT_PL011 stdout_retarget_pl011)

    add_library(${STDOUT_COMPONENT_CMSDK} STATIC)
    add_library(${STDOUT_COMPONENT_PL011} STATIC)

    # Check prerequisites
    ## Core platform directory is required to add the UART library project.
    if (NOT DEFINED CORE_PLATFORM_DIR)
        message(FATAL_ERROR "CORE_PLATFORM_DIR undefined")
    endif()

    ## UART0_BASE is the base address for UART configuration. The platform
    ## should define it prior to including this library.
    if (NOT DEFINED UART0_BASE)
        message(WARNING "UART0_BASE undefined, default will be used.")
    endif()

    ## Platform component: UART
    add_subdirectory(${CORE_PLATFORM_DIR}/drivers/uart ${CMAKE_BINARY_DIR}/uart)

    ## Component sources - public
    target_sources(${STDOUT_COMPONENT_CMSDK}
        PUBLIC
        source/retarget.c)

    ## Component sources - public
    target_sources(${STDOUT_COMPONENT_PL011}
        PUBLIC
        source/retarget.c)

    # Link
    target_link_libraries(${STDOUT_COMPONENT_CMSDK}
        PUBLIC
        ${STDOUT_IFACE_TARGET}
        ethosu_uart_cmsdk_apb)

    target_link_libraries(${STDOUT_COMPONENT_PL011}
        PUBLIC
        ${STDOUT_IFACE_TARGET}
        ethosu_uart_pl011)

    # Display status
    message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
    message(STATUS "*******************************************************")
    message(STATUS "Library:                  " ${STDOUT_COMPONENT_CMSDK})
    message(STATUS "Library:                  " ${STDOUT_COMPONENT_PL011})
    message(STATUS "*******************************************************")

else()

    # Create static library for retarget (stdout/err over UART)
    set(STDOUT_COMPONENT stdout)
    add_library(${STDOUT_COMPONENT} STATIC)

    ## Component sources - public
    target_sources(${STDOUT_COMPONENT}
        PUBLIC
        source/user_input.c)

    target_link_libraries(${STDOUT_COMPONENT}
        PUBLIC
        ${STDOUT_IFACE_TARGET})

    # Display status
    message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
    message(STATUS "*******************************************************")
    message(STATUS "Library:                  " ${STDOUT_COMPONENT})
    message(STATUS "*******************************************************")
endif()
