# This file is part of the openHiTLS project.
#
# openHiTLS is licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#     http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.


include_guard(GLOBAL)

# Helper function to collect OBJECT-library object files
function(objects_to_target_objects output_var _obj_targets)
    if(NOT _obj_targets)
        set(${output_var} "" PARENT_SCOPE)
        return()
    endif()

    # Collect all object files
    set(_target_objects "")
    foreach(_target ${_obj_targets})
        if(TARGET ${_target})
            list(APPEND _target_objects $<TARGET_OBJECTS:${_target}>)
        endif()
    endforeach()

    set(${output_var} "${_target_objects}" PARENT_SCOPE)
endfunction()


function(hitls_create_shared_library _target_objects shared_lib_name output_name)
    if(NOT _target_objects)
        message(STATUS "[HiTLS] No objects for ${shared_lib_name}, skipping shared library")
        return()
    endif()

    add_library(${shared_lib_name} SHARED ${_target_objects})
    target_link_options(${shared_lib_name} PRIVATE ${HITLS_SHARED_LINKER_FLAGS})
    set_target_properties(${shared_lib_name} PROPERTIES OUTPUT_NAME ${output_name})
    install(TARGETS ${shared_lib_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})

    if(_G_HITLS_APPROVED_PROVIDER)
        install(CODE
            "execute_process(
                COMMAND openssl dgst -hmac \"${CMVP_INTEGRITYKEY}\"
                -${_G_HITLS_CMVP_HAMC_ALG} -out lib${output_name}.so.hmac
                lib${output_name}.so)"
            )
        install(CODE
            "execute_process(
                COMMAND cp lib${output_name}.so.hmac \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/lib${output_name}.so.hmac)"
            )
    endif()

    message(STATUS "[HiTLS] Created shared library ${shared_lib_name}")
endfunction()

function(hitls_create_static_library _target_objects static_lib_name output_name)
    if(NOT _target_objects)
        message(STATUS "[HiTLS] No objects for ${static_lib_name}, skipping static library")
        return()
    endif()

    add_library(${static_lib_name} STATIC ${_target_objects})
    set_target_properties(${static_lib_name} PROPERTIES OUTPUT_NAME ${output_name})
    install(TARGETS ${static_lib_name} DESTINATION ${CMAKE_INSTALL_LIBDIR})

    message(STATUS "[HiTLS] Created static library ${static_lib_name}")
endfunction()

function(hitls_create_executable _target_objects executable_name)
    if(NOT _target_objects)
        message(STATUS "[HiTLS] No objects for ${executable_name}, skipping executable")
        return()
    endif()

    add_executable(${executable_name} ${_target_objects})
    target_link_options(${executable_name} PRIVATE ${HITLS_EXE_LINKER_FLAGS})
    target_link_directories(${executable_name} PRIVATE ${CMAKE_BINARY_DIR})
    install(TARGETS ${executable_name} DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(CODE "execute_process(COMMAND openssl dgst -hmac \"${CMVP_INTEGRITYKEY}\" -sm3 -out hitls.hmac hitls)")
    install(CODE "execute_process(COMMAND cp hitls.hmac \${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/hitls.hmac)")

    message(STATUS "[HiTLS] Created executable ${executable_name}")
endfunction()