#
# SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
#
# 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
#
# 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.
#

function(build_openamp PROJECT_SYSTEM)
    set(PROJECT_PROCESSOR "arm")
    set(PROJECT_MACHINE "cortexm")

    file(GLOB SRCS
        # libmetal
        libmetal/lib/*.c
        libmetal/lib/system/${PROJECT_SYSTEM}/*.c
        libmetal/lib/compiler/gcc/*.c

        # Extra sources
        src/system/${PROJECT_SYSTEM}/${PROJECT_MACHINE}/*.c

        # OpenAMP
        openamp/lib/remoteproc/*.c
        openamp/lib/rpmsg/*.c
        openamp/lib/virtio/*.c)

    add_library(openamp-${PROJECT_SYSTEM} STATIC
        ${SRCS})

    target_include_directories(openamp-${PROJECT_SYSTEM}
        PUBLIC
            ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_SYSTEM}
            openamp/lib/include
            src/system/${PROJECT_SYSTEM})

    target_compile_definitions(openamp-${PROJECT_SYSTEM} PRIVATE
        OPENAMP_VERSION_MAJOR=0
        OPENAMP_VERSION_MINOR=0
        OPENAMP_VERSION_PATCH=0
        OPENAMP_VERSION=0
        METAL_INTERNAL)

    target_link_libraries(openamp-${PROJECT_SYSTEM} PRIVATE
        cmsis_device
        $<$<STREQUAL:${PROJECT_SYSTEM},freertos>:freertos_kernel>)

    target_compile_options(openamp-${PROJECT_SYSTEM} PRIVATE
        -Wno-unknown-pragmas
    )

    # Generate libmetal headers
    file(GLOB_RECURSE HDRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/libmetal/lib" "libmetal/lib/*.h")

    foreach(HDR ${HDRS})
        configure_file("libmetal/lib/${HDR}" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_SYSTEM}/metal/${HDR}")
    endforeach()

    # Override errno.h adding support for ArmClang
    configure_file("src/libmetal/errno.h" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_SYSTEM}/metal/errno.h")
endfunction()

build_openamp(generic)

if (TARGET freertos_kernel)
    build_openamp(freertos)
endif()
