#
# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
#
# SPDX-License-Identifier: BSD-2-Clause
#

cmake_minimum_required(VERSION 3.8.2)
include_guard(GLOBAL)

find_path(
    RUST_TARGET_PATH "x86_64-sel4-none.json"
    PATHS ${CMAKE_CURRENT_LIST_DIR}/../rust_targets
    CMAKE_FIND_ROOT_PATH_BOTH
)

# Return absoulute filepath of the rust custom target directory
function(RustGetCustomTargetPath return)
    set(${return} "${RUST_TARGET_PATH}" PARENT_SCOPE)
endfunction()

# add_library but for rust libraries. Invokes cargo in the SOURCE_DIR that is provided,
# all build output is placed in BUILD_DIR or CMAKE_CURRENT_BINARY_DIR if BUILD_DIR isn't provided.
# lib_name: Name of library that is created
# SOURCE_DIR: source directory of cargo project
# BUILD_DIR: directory for cargo build output
# TARGET: custom target to use. See in ../rust_targets/ for list of available targets.
# LIB_FILENAME: filename of library created by cargo
# DEPENDS: And target or file dependencies that need to be run before cargo
function(RustAddLibrary lib_name)
    cmake_parse_arguments(PARSE_ARGV 1 RUST "" "SOURCE_DIR;BUILD_DIR;TARGET;LIB_FILENAME" "DEPENDS")
    if(NOT "${RUST_UNPARSED_ARGUMENTS}" STREQUAL "")
        message(FATAL_ERROR "Unknown arguments to RustAddLibrary ${RUST_UNPARSED_ARGUMENTS}")
    endif()
    if("${RUST_SOURCE_DIR}" STREQUAL "")
        message(FATAL_ERROR "SOURCE_DIR must be set for RustAddLibrary")
    endif()
    if("${RUST_LIB_FILENAME}" STREQUAL "")
        message(FATAL_ERROR "LIB_FILENAME must be set for RustAddLibrary")
    endif()
    if("${RUST_BUILD_DIR}" STREQUAL "")
        set(RUST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
    endif()
    RustGetCustomTargetPath(target_path)
    if("${RUST_TARGET}" STREQUAL "")
        message(
            FATAL_ERROR
                "TARGET must be set for RustAddLibrary. Valid options can be found in: ${target_path}"
        )
    endif()
    string(FIND "${RUST_TARGET}" ".json" pos)
    if(NOT ${pos} EQUAL -1)
        message(FATAL_ERROR "${RUST_TARGET} cannot contain .json")
    endif()

    find_program(XARGO_TOOL xargo)
    if("${XARGO_TOOL}" STREQUAL "XARGO_TOOL-NOTFOUND")
        message(FATAL_ERROR "Could not find tool xargo. Install with `cargo install xargo` \
    or see https://github.com/japaric/xargo")
    endif()

    add_custom_target(
        ${libmain}_custom
        BYPRODUCTS
        ${RUST_BUILD_DIR}/${RUST_LIB_FILENAME}
        ${USES_TERMINAL_DEBUG}
        DEPENDS ${RUST_DEPENDS}
        WORKING_DIRECTORY ${RUST_SOURCE_DIR}
        COMMAND
            ${CMAKE_COMMAND} -E env RUST_TARGET_PATH=${target_path} ${XARGO_TOOL} build
            --target ${RUST_TARGET}
            --target-dir ${RUST_BUILD_DIR} -Z unstable-options
            --out-dir ${RUST_BUILD_DIR}
    )

    add_library(${lib_name} STATIC IMPORTED GLOBAL)
    set_property(
        TARGET ${lib_name}
        PROPERTY IMPORTED_LOCATION "${RUST_BUILD_DIR}/${RUST_LIB_FILENAME}"
    )
    add_dependencies(${lib_name} ${libmain}_custom)
endfunction()
