#
# Copyright 2020, Data61
# Commonwealth Scientific and Industrial Research Organisation (CSIRO)
# ABN 41 687 119 230.
#
# This software may be distributed and modified according to the terms of
# the BSD 2-Clause license. Note that NO WARRANTY is provided.
# See "LICENSE_BSD2.txt" for details.
#
# @TAG(DATA61_BSD)
#

cmake_minimum_required(VERSION 3.8.2)

function(get_device_list var device_type platform)
    get_filename_component(platsupport_tools ${PLATSUPPORT_HELPERS} DIRECTORY)
    find_file(
        ${platform}_${device_type}_LIST "${platform}.yaml"
        PATHS "${platsupport_tools}/device_lists/${device_type}"
        CMAKE_FIND_ROOT_PATH_BOTH
    )
    set(${var} ${${platform}_${device_type}_LIST} PARENT_SCOPE)
endfunction()

# List of helper CMake functions for libplatsupport
function(gen_device_header device_type platform)
    get_filename_component(platsupport_tools ${PLATSUPPORT_HELPERS} DIRECTORY)
    get_device_list(dev_list_file ${device_type} ${platform})
    if("${dev_list_file}" STREQUAL "${platform}_${device_type}_LIST-NOTFOUND")
        # Exit silently...
        return()
    endif()
    set(header_dir "${CMAKE_CURRENT_BINARY_DIR}/${device_type}/platsupport")
    set(header_file "${header_dir}/${device_type}_list.h")
    set(DEVICE_GEN_PATH "${platsupport_tools}/device_header_gen.py")
    set(dev_header_deps ${DEVICE_GEN_PATH} ${dev_list_file})
    check_outfile_stale(
        regen
        ${header_file}
        dev_header_deps
        "${CMAKE_CURRENT_BINARY_DIR}/${device_type}.cmd"
    )
    if(regen)
        file(MAKE_DIRECTORY ${header_dir})
        execute_process(
            COMMAND
                ${PYTHON3} "${DEVICE_GEN_PATH}" --device-list "${dev_list_file}" --device-type
                "${device_type}" --header-out "${header_file}"
            INPUT_FILE /dev/stdin
            OUTPUT_FILE /dev/stdout
            ERROR_FILE /dev/stderr
            RESULT_VARIABLE error
        )
        if(error)
            message(FATAL_ERROR "Failed to gen GPIO header: ${header_file}")
        endif()
    endif()
    add_custom_target(${device_type}_list_gen DEPENDS "${dev_list_file}")
    add_library(${device_type}_list INTERFACE)
    target_include_directories(
        ${device_type}_list
        INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/${device_type}"
    )
    add_dependencies(${device_type}_list ${device_type}_list_gen ${header_file})
    # NOTE: Add this header to the CONFIG_LIBRARIES and GENERATED_FILES properties?
endfunction(gen_device_header)
