project(WiseSDK CXX C)
cmake_minimum_required(VERSION 2.8)

if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Os -fvisibility=hidden")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -Os -fvisibility=hidden")
endif()

############ PAHO FILES ###########
set(PAHO_SOURCE_FILES
    src/paho/Clients.c
    src/paho/Heap.c
    src/paho/LinkedList.c
    src/paho/Log.c
    src/paho/Messages.c
    #src/paho/MQTTAsync.c
    src/paho/MQTTClient.c
    src/paho/MQTTPacket.c
    src/paho/MQTTPacketOut.c
    src/paho/MQTTPersistence.c
    src/paho/MQTTPersistenceDefault.c
    src/paho/MQTTProtocolClient.c
    src/paho/MQTTProtocolOut.c
    #src/paho/MQTTVersion.c
    src/paho/SSLSocket.c
    src/paho/Socket.c
    src/paho/SocketBuffer.c
    #src/paho/StackTrace.c
    src/paho/Thread.c
    src/paho/Tree.c
    src/paho/utf-8.c)

set(PAHO_HEADER_FILES
    include/paho/Clients.h
    include/paho/Heap.h
    include/paho/LinkedList.h
    include/paho/Log.h
    include/paho/Messages.h
    #include/paho/MQTTAsync.h
    include/paho/MQTTClient.h
    include/paho/MQTTClientPersistence.h
    include/paho/MQTTPacket.h
    include/paho/MQTTPacketOut.h
    include/paho/MQTTPersistence.h
    include/paho/MQTTPersistenceDefault.h
    include/paho/MQTTProtocol.h
    include/paho/MQTTProtocolClient.h
    include/paho/MQTTProtocolOut.h
    include/paho/SSLSocket.h
    include/paho/Socket.h
    include/paho/SocketBuffer.h
    include/paho/StackTrace.h
    include/paho/Thread.h
    include/paho/Tree.h
    include/paho/utf-8.h)

############ SSDP FILES ###########
file(GLOB_RECURSE SSDP_SOURCE_FILES
    "src/ssdp/*.cpp"
    )
file(GLOB_RECURSE SSDP_HEADER_FILES
    "include/ssdp/*.h"
    )

############ UTIL FILES ###########
file(GLOB_RECURSE UTIL_SOURCE_FILES
    "src/util/*.cpp"
    )
file(GLOB_RECURSE UTIL_HEADER_FILES
    "include/util/*.h"
    )

############ IPDEVICE FILES ###########
file(GLOB_RECURSE IPDEVICE_SOURCE_FILES
    "src/ipdevice/*.cpp"
    )
file(GLOB_RECURSE IPDEVICE_HEADER_FILES
    "include/ipdevice/*.h"
    )

############# MESSENGER FILES ##########
file(GLOB_RECURSE MESSENGER_SOURCE_FILES
    "src/messenger/*.cpp"
    )
file(GLOB_RECURSE MESSENGER_HEADER_FILES
    "include/messenger/*.h"
    )

list(APPEND WISE_SDK_INCLUDE_DIRS
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/include/jzon
        ${CMAKE_CURRENT_SOURCE_DIR}/include/rapidxml
        ${CMAKE_CURRENT_SOURCE_DIR}/include/paho
    )

file(GLOB_RECURSE JZON_SOURCE_FILES
    "include/jzon/*.cpp"
    )

file(GLOB_RECURSE JZON_HEADER_FILES
    "include/jzon/*.h"
    )

#######################
######### GIT #########
#######################
find_package(Git)
if(GIT_FOUND)
    ##### Get version
    execute_process(
            COMMAND ${GIT_EXECUTABLE} describe --tags --dirty
            WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
            OUTPUT_VARIABLE WISE_VERSION
            ERROR_QUIET
            OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(WISE_VERSION)
        string(REPLACE "-dirty" "" WISE_VERSION ${WISE_VERSION})
        message(STATUS "Version: " ${WISE_VERSION} ".")
        add_definitions(-DWISE_VERSION=\"${WISE_VERSION}\")
    else()
        message(STATUS "WISE version could not be obtained from Git. Using default...")
        add_definitions(-DWISE_VERSION="1.0.0")
        message(STATUS "Version: 1.0.0")
    endif()
else()
    set(WISE_VERSION, ${WISE_VERSION})
    message(STATUS "Version: " ${WISE_VERSION} ".")
    add_definitions(-DWISE_VERSION=\"${WISE_VERSION}\")
endif()

if(PLATFORM)
    add_definitions(-DWISE_PLATFORM=\"${PLATFORM}\")
    message(STATUS "Platform: " ${PLATFORM} ".")
else()
    add_definitions(-DWISE_PLATFORM="host")
    message(STATUS "Platform: host.")
endif()

if(TYPE)
    add_definitions(-DWISE_TYPE=\"${TYPE}\")
    message(STATUS "Type: " ${TYPE} ".")
else()
    add_definitions(-DWISE_TYPE="example")
    message(STATUS "Type: example.")
endif()

#######################
#### DOCUMENTATION ####
#######################
find_package(Doxygen)
if (DOXYGEN_FOUND)
    set(DOXYGEN_IN ${PROJECT_SOURCE_DIR}/doc/doxygen.in)
    set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen.out)

    configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
    add_custom_target( doc_doxygen
        COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/doc
        COMMENT "Generating API documentation with Doxygen"
        VERBATIM )
else (DOXYGEN_FOUND)
  message(STATUS "Doxygen need to be installed to generate the doxygen documentation")
  message(STATUS "Recommended is to install dot (graphviz)")
endif (DOXYGEN_FOUND)

add_definitions(-DNOSTACKTRACE)
add_definitions(-DNO_PERSISTENCE)

find_library(PTHREAD_LIB pthread)
find_library(CURL_LIB curl)
find_package(OpenSSL REQUIRED)

message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")

include_directories(${WISE_SDK_INCLUDE_DIRS})

add_definitions(-DOPENSSL)

add_library(wisesdk SHARED
            ${PAHO_SOURCE_FILES} ${PAHO_HEADER_FILES}
            ${MESSENGER_SOURCE_FILES} ${MESSENGER_HEADER_FILES}
            ${UTIL_SOURCE_FILES} ${UTIL_HEADER_FILES}
            ${SSDP_SOURCE_FILES} ${SSDP_HEADER_FILES}
            ${IPDEVICE_SOURCE_FILES} ${IPDEVICE_HEADER_FILES}
            ${JZON_SOURCE_FILES} ${JZON_HEADER_FILES}
            )

target_link_libraries(wisesdk ${CURL_LIB} ${PTHREAD_LIB} OpenSSL::SSL OpenSSL::Crypto)

set_target_properties(wisesdk
            PROPERTIES
            ARCHIVE_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_SOURCE_DIR}/output/lib
            LIBRARY_OUTPUT_DIRECTORY  ${CMAKE_CURRENT_SOURCE_DIR}/output/lib)

install (TARGETS wisesdk
         ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
         LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
         RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
