cmake_minimum_required(VERSION 2.8)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

project(asa)

set(PROJECT_EXAMPLE_NAME ${PROJECT_NAME}example)
set(PROJECT_LIB_NAME ${PROJECT_NAME})

# Find CURL package
if(NOT WIN32)
    find_package(CURL REQUIRED)
    include_directories(${CURL_INCLUDE_DIR})
endif()

# Find Threads package
find_package(Threads REQUIRED)

# Find XMLRPC package
set(XMLRPC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/xmlrpc-c-1-51.06)
include_directories(${XMLRPC_PATH}/include)
if(WIN32)
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(ALL_XMLRPC_LIBS libxmlrpc libxmlrpc_client libxmlrpc_xmlparse libxmlrpc_xmltok libxmlrpc_util)
        link_directories(${XMLRPC_PATH}/bin/Release-DLL-Win64)
        link_directories(${XMLRPC_PATH}/bin/Release-Static-Win64)
    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
        set(ALL_XMLRPC_LIBS libxmlrpc libxmlrpc_client libxmlrpc_xmlparse libxmlrpc_xmltok libxmlrpc_util)
        link_directories(${XMLRPC_PATH}/bin/Release-DLL-Win32)
        link_directories(${XMLRPC_PATH}/bin/Release-Static-Win32)
    endif()
else()
    set(ALL_XMLRPC_LIBS xmlrpc xmlrpc_client xmlrpc_xmlparse xmlrpc_xmltok xmlrpc_util)
    link_directories(${XMLRPC_PATH}/src)
    link_directories(${XMLRPC_PATH}/lib/libutil)
    link_directories(${XMLRPC_PATH}/lib/expat/xmlparse)
    link_directories(${XMLRPC_PATH}/lib/expat/xmltok)
endif()
if(NOT WIN32) # add XMLRPC rebuild command
    set(CONFIGS_TO_DELETE include/xmlrpc-c/config.h xmlrpc_config.h examples/config.h transport_config.h version.h)
    add_custom_command(OUTPUT ${XMLRPC_PATH}/lib/expat/xmlparse/libxmlrpc_xmlparse.so
                              ${XMLRPC_PATH}/lib/expat/xmltok/libxmlrpc_xmltok.so
                              ${XMLRPC_PATH}/lib/libutil/libxmlrpc_util.so
                              ${XMLRPC_PATH}/src/libxmlrpc.so
                              ${XMLRPC_PATH}/src/libxmlrpc_server.so
                              ${XMLRPC_PATH}/src/libxmlrpc_client.so
                              ${XMLRPC_PATH}/src/libxmlrpc_server_cgi.so
                              ${XMLRPC_PATH}/src/libxmlrpc_server_abyss.so
                       COMMAND rm ${CONFIGS_TO_DELETE} -f || true
                       COMMAND chmod 744 configure
                       COMMAND ./configure
                       COMMAND make
                       WORKING_DIRECTORY ${XMLRPC_PATH}
                       COMMENT Build XMLRPC)
endif()

# Add ivcmp library
add_subdirectory(vendor/ivcmp)
include_directories(vendor/ivcmp/src)

# Project itself, library
add_library(${PROJECT_LIB_NAME} SHARED src/asa.c $<TARGET_OBJECTS:ivcmp_static>)
if(NOT WIN32)  # add install section for Linux
    install(TARGETS ${PROJECT_LIB_NAME} DESTINATION /usr/local/lib)
    install(FILES ${XMLRPC_PATH}/lib/expat/xmlparse/libxmlrpc_xmlparse.so.3.51
                  ${XMLRPC_PATH}/lib/expat/xmltok/libxmlrpc_xmltok.so.3.51
                  ${XMLRPC_PATH}/lib/libutil/libxmlrpc_util.so.4.51
                  ${XMLRPC_PATH}/src/libxmlrpc.so.3.51
                  ${XMLRPC_PATH}/src/libxmlrpc_server.so.3.51
                  ${XMLRPC_PATH}/src/libxmlrpc_client.so.3.51
                  ${XMLRPC_PATH}/src/libxmlrpc_server_cgi.so.3.51
                  ${XMLRPC_PATH}/src/libxmlrpc_server_abyss.so.3.51
            DESTINATION /usr/local/lib)
    macro(install_symlink filepath sympath)
        install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${filepath} ${sympath})")
        install(CODE "message(\"-- Created symlink: ${sympath} -> ${filepath}\")")
    endmacro(install_symlink)
    install_symlink(/usr/local/lib/libxmlrpc.so.3.51 /usr/local/lib/libxmlrpc.so.3)
    install_symlink(/usr/local/lib/libxmlrpc_client.so.3.51 /usr/local/lib/libxmlrpc_client.so.3)
    install_symlink(/usr/local/lib/libxmlrpc_xmlparse.so.3.51 /usr/local/lib/libxmlrpc_xmlparse.so.3)
    install_symlink(/usr/local/lib/libxmlrpc_xmltok.so.3.51 /usr/local/lib/libxmlrpc_xmltok.so.3)
    install_symlink(/usr/local/lib/libxmlrpc_util.so.4.51 /usr/local/lib/libxmlrpc_util.so.4)
endif()

# Project itself, example
include_directories(include)
add_executable(${PROJECT_EXAMPLE_NAME} example/asaexample.c $<TARGET_OBJECTS:ivcmp_static>)
target_link_libraries(${PROJECT_EXAMPLE_NAME} ${PROJECT_LIB_NAME})
add_dependencies(${PROJECT_EXAMPLE_NAME} ${PROJECT_LIB_NAME})

# Link CURL\WININET
if(WIN32)
    target_link_libraries(${PROJECT_LIB_NAME} wininet)
    target_link_libraries(${PROJECT_EXAMPLE_NAME} wininet)
else()
    target_link_libraries(${PROJECT_LIB_NAME} ${CURL_LIBRARIES})
    target_link_libraries(${PROJECT_EXAMPLE_NAME} ${CURL_LIBRARIES})
endif()

# Link XMLRPC
target_link_libraries(${PROJECT_LIB_NAME} ${ALL_XMLRPC_LIBS})
target_link_libraries(${PROJECT_EXAMPLE_NAME} ${ALL_XMLRPC_LIBS})
if(WIN32)
    # Copy DLL's to output directory
    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
        add_custom_command(TARGET ${PROJECT_EXAMPLE_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${XMLRPC_PATH}/bin/Release-DLL-Win64"
            "$<TARGET_FILE_DIR:${PROJECT_EXAMPLE_NAME}>"
            COMMENT "Copy XMLRPC DLLs ...")
    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
        add_custom_command(TARGET ${PROJECT_EXAMPLE_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${XMLRPC_PATH}/bin/Release-DLL-Win32"
            "$<TARGET_FILE_DIR:${PROJECT_EXAMPLE_NAME}>"
             COMMENT "Copy XMLRPC DLLs ...")
    endif()
endif()

# XMLRPC auto-rebuild dependency for linux
if(NOT WIN32)
    add_custom_target(
        rebuild_xmlrpc ALL
        DEPENDS ${XMLRPC_PATH}/src/libxmlrpc.so
                ${XMLRPC_PATH}/lib/expat/xmlparse/libxmlrpc_xmlparse.so
                ${XMLRPC_PATH}/lib/expat/xmltok/libxmlrpc_xmltok.so
                ${XMLRPC_PATH}/lib/libutil/libxmlrpc_util.so
                ${XMLRPC_PATH}/src/libxmlrpc.so
                ${XMLRPC_PATH}/src/libxmlrpc_server.so
                ${XMLRPC_PATH}/src/libxmlrpc_client.so
                ${XMLRPC_PATH}/src/libxmlrpc_server_cgi.so
                ${XMLRPC_PATH}/src/libxmlrpc_server_abyss.so
        )
    add_dependencies(${PROJECT_LIB_NAME} rebuild_xmlrpc)
endif()

# Link threads
target_link_libraries(${PROJECT_LIB_NAME} ${CMAKE_THREAD_LIBS_INIT})
target_link_libraries(${PROJECT_EXAMPLE_NAME} ${CMAKE_THREAD_LIBS_INIT})

# Link Math
if(NOT WIN32)
    target_link_libraries(${PROJECT_LIB_NAME} m)
    target_link_libraries(${PROJECT_EXAMPLE_NAME} m)
endif()

# Enable Treat Warnings as Errors
if(MSVC)
    target_compile_options(${PROJECT_LIB_NAME} PRIVATE /W3 /WX)
    target_compile_options(${PROJECT_EXAMPLE_NAME} PRIVATE /W3 /WX)
# switch off warning 4098, 4099 in Debug config - the reason is the third-party xmlrpc library with no debug info(release only version is allways used) 
# and wrong CRT version (release instead of debug)    
    target_link_options (${PROJECT_LIB_NAME} PRIVATE /ignore:4098,4099)
    target_link_options (${PROJECT_EXAMPLE_NAME} PRIVATE /ignore:4098,4099)
else()
    target_compile_options(${PROJECT_LIB_NAME} PRIVATE -Wall -Wextra -Werror)
    target_compile_options(${PROJECT_EXAMPLE_NAME} PRIVATE -Wall -Wextra -Werror)
endif()
