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

#########################################################
#                       HAL library                     #
#########################################################

cmake_minimum_required(VERSION 3.15.6)

set(HAL_TARGET hal)

project(${HAL_TARGET}
    DESCRIPTION     "HAL library"
    LANGUAGES       C CXX)

# Create static library
add_library(${HAL_TARGET} STATIC)

# Select which profile needs to be used:
if (${CMAKE_CROSSCOMPILING})
    set(PLATFORM_PROFILE bare-metal)
else()
    set(PLATFORM_PROFILE native)
endif()

set(PLATFORM_PROFILE_DIR    source/profiles/${PLATFORM_PROFILE})

## Common include directories - public
target_include_directories(${HAL_TARGET}
    PUBLIC
    include
    ${PLATFORM_PROFILE_DIR}/timer/include)

## Common sources for all profiles
target_sources(${HAL_TARGET}
    PRIVATE
    source/hal.c
    source/data_psn.c
    source/data_acq.c
    ${PLATFORM_PROFILE_DIR}/timer/platform_timer.c)

if (DEFINED VERIFY_TEST_OUTPUT)
    message(STATUS "Test output verification flag is: ${VERIFY_TEST_OUTPUT}")
    target_compile_definitions(${HAL_TARGET} PUBLIC
        VERIFY_TEST_OUTPUT=${VERIFY_TEST_OUTPUT})
endif ()

if (NOT DEFINED PLATFORM_DRIVERS_DIR)
    message(FATAL_ERROR "PLATFORM_DRIVERS_DIR undefined")
endif()

# Add platform_drivers target
add_subdirectory(${PLATFORM_DRIVERS_DIR} ${CMAKE_BINARY_DIR}/platform_driver)

# Link time library targets:
target_link_libraries(${HAL_TARGET}
    PUBLIC
    log                 # Logging functions
    lcd_iface           # LCD interface
    stdout_iface        # Standard output (and error) interface
    platform_drivers    # Platform drivers implementing the required interfaces
)

# Display status:
message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR})
message(STATUS "*******************************************************")
message(STATUS "Library                                : " ${HAL_TARGET})
message(STATUS "CMAKE_SYSTEM_PROCESSOR                 : " ${CMAKE_SYSTEM_PROCESSOR})
message(STATUS "*******************************************************")
