project(ExampleApplication CXX C)
cmake_minimum_required(VERSION 2.8)

#########################
##### CMAKE OPTIONS #####
#########################

option (WITH_OPENSSL "Include SSL support?" ON)
option (WITH_POCO_STATIC "Use Poco as a static library?" OFF)
set (EXAMPLE_APP_OUTPUT_DIR "${PROJECT_SOURCE_DIR}/bins")
set (POCO_LIB_DIR "${PROJECT_SOURCE_DIR}/libs/poco")
set (OBLO_MESSENGER_LIB_DIR "${PROJECT_SOURCE_DIR}/libs/oblomessenger")

##### Additional, but not set options. #####
#set (EXAMPLE_APP_OPENSSL_INCLUDE_PATH "${PROJECT_SOURCE_DIR}/libs/openssl/include")
#set (EXAMPLE_APP_OPENSSL_LIB_PATH "${PROJECT_SOURCE_DIR}/libs/openssl/lib")

#################
##### FLAGS #####
#################

if(MSVC)
    # Force to always compile with W4
    if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
        string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
    else()
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
    endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fdata-sections -ffunction-sections -Wl,--gc-sections")
endif()

###################
##### DEFINES #####
###################

if ( ${WITH_OPENSSL} STREQUAL ON )
    add_definitions(-DUSE_SECURE_CONNECTION)
    message(STATUS "Using OpenSSL support.")
endif( ${WITH_OPENSSL} STREQUAL ON )

if ( EXAMPLE_APP_OPENSSL_INCLUDE_PATH )
    message(STATUS "OpenSSL include path: " ${EXAMPLE_APP_OPENSSL_INCLUDE_PATH} )
endif()
if ( EXAMPLE_APP_OPENSSL_LIB_PATH )
    message(STATUS "OpenSSL library path: " ${EXAMPLE_APP_OPENSSL_LIB_PATH} )
endif()

if ( ${WITH_POCO_STATIC} STREQUAL ON )
    add_definitions(-DPOCO_STATIC)
    message(STATUS "Using Poco static.")
endif( ${WITH_POCO_STATIC} STREQUAL ON )

#####################
##### LIBRARIES #####
#####################

# Poco C++
list(APPEND EXAMPLE_APP_INCLUDE_DIRS
        ${POCO_LIB_DIR}/include)
list(APPEND EXAMPLE_APP_LINK_DIRS
        ${POCO_LIB_DIR}/lib)
list(APPEND EXAMPLE_APP_LINK_LIBS
        PocoUtil
        PocoFoundation)

##### OBLO messenger #####
if( EXAMPLE_APP_OPENSSL_INCLUDE_PATH AND EXAMPLE_APP_OPENSSL_LIB_PATH )
    set(MESSENGER_OPENSSL_INCLUDE_PATH ${EXAMPLE_APP_OPENSSL_INCLUDE_PATH})
    set(MESSENGER_OPENSSL_LIB_PATH ${EXAMPLE_APP_OPENSSL_LIB_PATH})
endif()
set(OBLO_MESSENGER_LIB_SOURCE_DIR "${PROJECT_SOURCE_DIR}/libs/oblomessenger")

list(APPEND EXAMPLE_APP_INCLUDE_DIRS
        ${OBLO_MESSENGER_LIB_DIR}/include
        ${OBLO_MESSENGER_LIB_DIR}/include/paho)
list(APPEND EXAMPLE_APP_LINK_DIRS
        ${OBLO_MESSENGER_LIB_DIR}/lib)
list(APPEND EXAMPLE_APP_LINK_LIBS
        oblomessenger)

##### OpenSSL #####
list(APPEND EXAMPLE_APP_INCLUDE_DIRS
        ${EXAMPLE_APP_OPENSSL_INCLUDE_PATH})
list(APPEND EXAMPLE_APP_LINK_DIRS
        ${EXAMPLE_APP_OPENSSL_LIB_PATH})

###################
##### SOURCES #####
###################

list(APPEND EXAMPLE_APP_INCLUDE_DIRS
        "${PROJECT_SOURCE_DIR}"
        "${PROJECT_SOURCE_DIR}/src")

list(APPEND EXAMPLE_APP_SOURCE_FILES
    src/main.cpp)


#######################
##### APPLICATION #####
#######################

include_directories(${EXAMPLE_APP_INCLUDE_DIRS})
link_directories(${EXAMPLE_APP_LINK_DIRS})

add_executable(example ${EXAMPLE_APP_SOURCE_FILES} ${EXAMPLE_APP_HEADER_FILES})

target_link_libraries(example ${EXAMPLE_APP_LINK_LIBS})

set_target_properties( example PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXAMPLE_APP_OUTPUT_DIR} )

if(MSVC)
    set_target_properties( example PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${EXAMPLE_APP_OUTPUT_DIR} )
    set_target_properties( example PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${EXAMPLE_APP_OUTPUT_DIR} )
endif()
