cmake_minimum_required(VERSION 3.5)

project(OpensslSamples)

include(../../common.cmake)

set(CMAKE_BINARY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/out/")

set(test_data_dir "${CMAKE_CURRENT_SOURCE_DIR}/testData")
safe_glob(test_data ${test_data_dir}/*)

add_internal_target(Software)
add_internal_target(Hardware)

foreach(ver 1.1 3.0)
    set(CMAKE_BINARY_DIR_${ver} ${CMAKE_BINARY_DIR}/${ver}/${OUT_DIR}/)

    add_internal_target(copy_test_data_to_${ver})
    safe_copy(
        copy_test_data_to_${ver}
        FILES ${test_data}
        DESTINATION ${CMAKE_BINARY_DIR_${ver}})
    safe_copy(
        copy_test_data_to_${ver}
        FILES "${test_data_dir}/test_cert.cer"
        DESTINATION ${CMAKE_BINARY_DIR_${ver}}
        NEW_NAME software_test_cert.cer)

    add_internal_target(${ver})

    foreach(type Software Hardware)
        add_internal_target(${type}${ver})
        add_dependencies(${ver} ${type}${ver})
        add_dependencies(${type} ${type}${ver})
    endforeach()
endforeach()

if(APPLE)
    string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-rpath,@executable_path")
elseif(NOT MSVC)
    string(APPEND CMAKE_EXE_LINKER_FLAGS " -Wl,-rpath,$ORIGIN")
endif()

if(MSVC)
    set(EXTRA_CFLAGS /W4 /WX /wd4996)
else()
    set(EXTRA_CFLAGS -Werror -Wall -Wextra -Wno-deprecated-declarations -Wno-unused-value)
endif()
add_compile_options(${EXTRA_CFLAGS})

function(openssl_executable target ssl_ver type atrs)
    set(target_name "${target}${ssl_ver}${type}")

    set(source "${CMAKE_CURRENT_SOURCE_DIR}/sources/${target}.c")
    add_executable(${target_name} ${source})

    set_target_properties(
        ${target_name}
        PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR_${ssl_ver}}
                   FOLDER openssl-${ssl_ver}/${type}
                   VS_DEBUGGER_WORKING_DIRECTORY $(OutDir)
                   OUTPUT_NAME "${type}${target}")

    target_rutoken_dependencies(${target_name} OPENSSL_${ssl_ver} RTENGINE_${ssl_ver})
    target_include_directories(${target_name} PRIVATE "sources/include")

    if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
        target_link_libraries(${target_name} PRIVATE dl)
    endif()

    if("xml" IN_LIST atrs)
        target_rutoken_dependencies(${target_name} XML2 XMLSEC_${ssl_ver})
        target_compile_definitions(${target_name} PRIVATE __XMLSEC_FUNCTION__=__func__)

        if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
            target_rutoken_dependencies(${target_name} ICU)
        endif()
    endif()

    if(${type} MATCHES Hardware)
        target_rutoken_dependencies(${target_name} PKCS11)
        target_compile_definitions(${target_name} PRIVATE HARDWARE_KEYS)
        add_dependencies(Hardware${ssl_ver} ${target_name})
    else()
        add_dependencies(Software${ssl_ver} ${target_name})
    endif()

    add_dependencies(${target_name} copy_test_data_to_${ssl_ver})
endfunction()

function(openssl_executables target ssl_vers types atrs)
    foreach(ssl_ver ${ssl_vers})
        foreach(type ${types})
            openssl_executable(${target} ${ssl_ver} ${type} "${atrs}")
        endforeach()
    endforeach()
endfunction()

openssl_executables(Sign "1.1;3.0" "Software;Hardware" "")
openssl_executables(Verify "1.1;3.0" "Software;Hardware" "")
openssl_executables(Derive "1.1;3.0" "Software;Hardware" "")
openssl_executables(CreateCSR "1.1;3.0" "Software;Hardware" "")
openssl_executables(SignCMS "1.1;3.0" "Software;Hardware" "")
openssl_executables(SignStreamCMS "1.1;3.0" "Software;Hardware" "")
openssl_executables(VerifyCMS "1.1;3.0" "Software;Hardware" "")
openssl_executables(EncryptCMS "1.1;3.0" "Software;Hardware" "")
openssl_executables(DecryptCMS "1.1;3.0" "Software;Hardware" "")
openssl_executables(KeyWrap "1.1;3.0" "Software;Hardware" "")
openssl_executables(KeyUnwrap "1.1;3.0" "Software;Hardware" "")

if(${CMAKE_SYSTEM_NAME} MATCHES "Windows|Darwin" OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND ${ARCH} MATCHES "x86_64"))
    openssl_executables(XMLDSigDetached "1.1;3.0" "Software;Hardware" "xml")
    openssl_executables(XMLDSigEnveloped "1.1;3.0" "Software;Hardware" "xml")
    openssl_executables(XMLDSigVerify "1.1;3.0" "Software;Hardware" "xml")
    openssl_executables(XMLDSigXadesBesSign "1.1;3.0" "Software;Hardware" "xml")
    openssl_executables(XMLDSigXadesBesVerify "1.1;3.0" "Software;Hardware" "xml")
    openssl_executables(XMLDSigXadesT "1.1;3.0" "Software;Hardware" "xml")
endif()

openssl_executables(KeyGeneration "1.1;3.0" "Software" "")
openssl_executables(CreateTSRequest "1.1;3.0" "Software" "")
openssl_executables(AddTimestampToCMS "1.1;3.0" "Software" "")

openssl_executables(TokenPreparation "1.1;3.0" "Hardware" "")
openssl_executables(KeyDeleting "1.1;3.0" "Hardware" "")

openssl_executables(CAdES-T "3.0" "Software;Hardware" "")
openssl_executables(EncryptCMS3412 "3.0" "Software;Hardware" "")
