# Copyright 2017 The Dawn Authors
#
# 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.

find_package(PythonInterp REQUIRED)
include(CMakeParseArguments)

# Check for Jinja2
message(STATUS "${PYTHON_EXECUTABLE}")
execute_process(
    COMMAND ${PYTHON_EXECUTABLE} -c "import jinja2"
    RESULT_VARIABLE RET
)
if (NOT RET EQUAL 0)
    message(FATAL_ERROR "Missing dependencies for code generation, please ensure you have python-jinja2 installed.")
endif()

function(Generate)
    set(oneValueArgs LIB_NAME LIB_TYPE PRINT_NAME EXECUTABLE FOLDER)
    set(multiValueArgs COMMAND_LINE_ARGS EXTRA_DEPS EXTRA_SOURCES)
    cmake_parse_arguments(G "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    execute_process(
        COMMAND ${G_COMMAND_LINE_ARGS} --print-dependencies
        OUTPUT_VARIABLE DEPENDENCIES
        RESULT_VARIABLE RET
    )
    if (NOT RET EQUAL 0)
        message(STATUS ${RET})
        message(FATAL_ERROR "Failed to get the dependencies for ${G_PRINT_NAME}.")
    endif()

    execute_process(
        COMMAND ${G_COMMAND_LINE_ARGS} --print-outputs
        OUTPUT_VARIABLE OUTPUTS
        RESULT_VARIABLE RET
    )
    if (NOT RET EQUAL 0)
        message(FATAL_ERROR "Failed to get the outputs for ${G_PRINT_NAME}.")
    endif()

    add_custom_command(
        COMMAND ${G_COMMAND_LINE_ARGS}
        DEPENDS ${DEPENDENCIES} ${G_EXTRA_DEPS}
        OUTPUT ${OUTPUTS}
        COMMENT "Generating files for ${G_PRINT_NAME}."
    )

    add_library(${G_LIB_NAME} ${G_LIB_TYPE}
        ${G_EXTRA_SOURCES}
        ${OUTPUTS}
    )

    DawnInternalTarget("${G_FOLDER}" ${G_LIB_NAME})
    set_property(TARGET ${G_LIB_NAME} APPEND PROPERTY COMPILE_OPTIONS ${DAWN_GENERATED_FLAGS})
endfunction()

set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE)

set(GENERATOR_COMMON_ARGS
    ${PYTHON_EXECUTABLE}
    ${CMAKE_CURRENT_SOURCE_DIR}/main.py
    ${PROJECT_SOURCE_DIR}/dawn.json
    -t ${CMAKE_CURRENT_SOURCE_DIR}/templates
    -o ${CMAKE_CURRENT_BINARY_DIR}
    PARENT_SCOPE
)
