# Copyright (c) 2023 Arm Limited.
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

#---------------------------------------------------------------------
# Prototype

add_library(ckw_prototype
    src/TileInfo.cpp
    src/TensorInfo.cpp
    src/Kernel.cpp
    src/KernelWriter.cpp
    src/OperandBase.cpp
    src/TileOperand.cpp
    src/TensorOperand.cpp
    src/TensorTileSampler.cpp
    src/KernelArgument.cpp
)

target_compile_options(ckw_prototype
    PUBLIC
    ${CKW_CXX_FLAGS}
    "$<$<CXX_COMPILER_ID:GNU>:${GNU_WARNINGS}>"
    "$<$<CONFIG:Debug>:${CKW_ASSERTS_OPTS}>"
    "$<$<BOOL:${CKW_ENABLE_ASSERTS}>:${CKW_ASSERTS_OPTS}>"
    ${CMAKE_CXX_FLAGS}
    PRIVATE
    $<$<CONFIG:Release>:-Os>
)

target_compile_definitions(ckw_prototype PUBLIC
    $<$<CONFIG:Debug>:COMPUTE_KERNEL_WRITER_DEBUG_ENABLED>
    $<$<CONFIG:Debug>:COMPUTE_KERNEL_WRITER_ASSERTS_ENABLED>
    $<$<BOOL:${CKW_ENABLE_ASSERTS}>:COMPUTE_KERNEL_WRITER_ASSERTS_ENABLED>
    $<$<BOOL:${CKW_ENABLE_OPENCL}>:COMPUTE_KERNEL_WRITER_OPENCL_ENABLED>
)

target_include_directories(ckw_prototype
    PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include
    PRIVATE ${CMAKE_CURRENT_LIST_DIR}
)

#---------------------------------------------------------------------
# Examples

add_library(ckw_prototype_examples_common
    examples/common/ExampleKernelWriter.cpp
    examples/common/ExampleScopedKernelWriter.cpp
    examples/common/ExampleComponentArgument.cpp
)

target_link_libraries(ckw_prototype_examples_common PUBLIC ckw_prototype)

add_executable(ckw_prototype_examples_add_exp_store examples/add_exp_store.cpp)
target_link_libraries(ckw_prototype_examples_add_exp_store PUBLIC ckw_prototype_examples_common)

add_executable(writer_helper examples/writer_helper.cpp)
target_link_libraries(writer_helper PUBLIC ckw_prototype)
