CMAKE_MINIMUM_REQUIRED(VERSION 3.7)
project(dxirc-fox)
set(PROJECT_VERSION "1.40.1")

set(DXIRCFOX_LIBS "")
set(DXIRCFOX_INCLUDE_DIRS "")

if(APPLE)
    set(FOX_HAVE_TRAY FALSE)
else(APPLE)
    option(FOX_HAVE_TRAY "Enable trayicon" TRUE)
endif(APPLE)
option(FOX_ENABLE_IPV6 "Enable IPv6 support" TRUE)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

if(PKG_CONFIG_FOUND)
    pkg_check_modules(FOX fox)
    list(APPEND DXIRCFOX_LIBS ${FOX_LIBRARIES})
    list(APPEND DXIRCFOX_INCLUDE_DIRS ${FOX_INCLUDE_DIRS})
endif(PKG_CONFIG_FOUND)

if(NOT FOX_FOUND)
    set(FOX_INCLUDE_DIR "" CACHE PATH "Path to fox include dir")
    set(FOX_LIBRARY "" CACHE FILEPATH "Filepath to fox library")
    set(PNG_INCLUDE_DIR "" CACHE PATH "Path to png include dir")
    set(PNG_LIBRARY "" CACHE FILEPATH "Filepath to png library")
    if(FOX_INCLUDE_DIR AND PNG_INCLUDE_DIR)
        set(FOX_FOUND true)
        list(APPEND DXIRCFOX_LIBS ${FOX_LIBRARY} ${PNG_LIBRARY})
        list(APPEND DXIRCFOX_INCLUDE_DIRS ${FOX_INCLUDE_DIR} ${PNG_INCLUDE_DIR})
    endif()
endif()

if(NOT FOX_FOUND)
    message(FATAL_ERROR "Fox library not found. Can't build dxirc")
endif()

if(ENABLE_NLS)
    list(APPEND DXIRCFOX_LIBS ${LIBINTL_LIBRARIES})
    list(APPEND DXIRCFOX_INCLUDE_DIRS ${LIBINTL_INCLUDE_DIR})
endif()

set(HAVE_X11 FALSE)
if(NOT WIN32)
    if(PKG_CONFIG_FOUND)
        pkg_check_modules(X11 x11)
        list(APPEND DXIRCFOX_LIBS ${X11_LIBRARIES})
        list(APPEND DXIRCFOX_INCLUDE_DIRS ${X11_INCLUDE_DIRS})
        if(X11_FOUND)
            set(HAVE_X11 TRUE)
        else(X11_FOUND)
            set(FOX_HAVE_TRAY FALSE)
        endif(X11_FOUND)
    endif(PKG_CONFIG_FOUND)
else(NOT WIN32)
    list(APPEND DXIRCFOX_LIBS "ws2_32" "winmm")
endif(NOT WIN32)

set(HAVE_OPENSSL FALSE)
find_package(OpenSSL)
if(OPENSSL_FOUND)
    if(WIN32)
        # On windows/mingw we need libeay32 too...
        find_library(LIB_EAY NAMES libeay32MD eay libeay libeay32)
        if(LIB_EAY)
            list(APPEND DXIRCFOX_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
            list(APPEND DXIRCFOX_LIBS ${OPENSSL_LIBRARIES} ${LIB_EAY})
            set(HAVE_OPENSSL TRUE)
        endif()
    else()
        list(APPEND DXIRCFOX_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
        list(APPEND DXIRCFOX_LIBS ${OPENSSL_LIBRARIES})
        set(HAVE_OPENSSL TRUE)
        # CMake FindOpenSSL is incomplete and does not add -lcrypto to LIBS...
        list(APPEND DXIRCFOX_LIBS -lcrypto)
    endif()
endif()

if(HAVE_LUA)
    list(APPEND DXIRCFOX_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
    list(APPEND DXIRCFOX_LIBS ${LUA_LIBRARIES})
endif(HAVE_LUA)

set(HAVE_ENCHANT FALSE)
set(HAVE_ENCHANT2 FALSE)
if(USE_ENCHANT)
    if(PKG_CONFIG_FOUND)
        pkg_check_modules(ENCHANT enchant-2)
        list(APPEND DXIRCFOX_LIBS ${ENCHANT_LIBRARIES})
        list(APPEND DXIRCFOX_INCLUDE_DIRS ${ENCHANT_INCLUDE_DIRS})
        set(HAVE_ENCHANT TRUE)
        if(${ENCHANT_VERSION} VERSION_GREATER "1.6")
            set(HAVE_ENCHANT2 TRUE)
        endif()
        if(NOT ENCHANT_FOUND)
            pkg_check_modules(ENCHANT enchant)
            list(APPEND DXIRCFOX_LIBS ${ENCHANT_LIBRARIES})
            list(APPEND DXIRCFOX_INCLUDE_DIRS ${ENCHANT_INCLUDE_DIRS})
            set(HAVE_ENCHANT TRUE)
            if(${ENCHANT_VERSION} VERSION_GREATER "1.6")
                set(HAVE_ENCHANT2 TRUE)
            endif()
        endif()
    endif(PKG_CONFIG_FOUND)
    if(NOT ENCHANT_FOUND)
        set(ENCHANT_INCLUDE_DIR "" CACHE PATH "Path to enchant include dir")
        set(ENCHANT_LIBRARY "" CACHE FILEPATH "Filepath to enchant library")
        set(ENCHANT_VERSION "" CACHE STRING "Enchant verison")
        if(ENCHANT_INCLUDE_DIR)
            list(APPEND DXIRCFOX_LIBS ${ENCHANT_LIBRARY})
            list(APPEND DXIRCFOX_INCLUDE_DIRS ${ENCHANT_INCLUDE_DIR})
            set(HAVE_ENCHANT TRUE)
            if(${ENCHANT_VERSION} VERSION_GREATER "1.6")
                set(HAVE_ENCHANT2 TRUE)
            endif()
        else()
            set(HAVE_ENCHANT FALSE)
        endif()
    endif()
endif(USE_ENCHANT)

include(CheckFunctionExists)
CHECK_FUNCTION_EXISTS("inet_ntop" HAVE_INET_NTOP_EXISTS)
if(HAVE_INET_NTOP_EXISTS)
    set(HAVE_INET_NTOP 1)
endif()
CHECK_FUNCTION_EXISTS("inet_pton" HAVE_INET_PTON_EXISTS)
if(HAVE_INET_PTON_EXISTS)
    set(HAVE_INET_PTON 1)
endif()
if(WIN32)
    CHECK_FUNCTION_EXISTS("strncasecmp" HAVE_STRNCASECMP_EXISTS)
    if(HAVE_STRNCASECMP_EXISTS)
        set(HAVE_STRNCASECMP 1)
    endif()
endif(WIN32)
include(CheckIncludeFiles)
CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
CHECK_INCLUDE_FILES(sys/socket.h HAVE_SYS_SOCKET_H)
CHECK_INCLUDE_FILES(netinet/in.h HAVE_NETINET_IN_H)
CHECK_INCLUDE_FILES(arpa/inet.h HAVE_ARPA_INET_H)

set(ENABLE_IPV6 ${FOX_ENABLE_IPV6})
set(HAVE_TRAY ${FOX_HAVE_TRAY})
configure_file(config.h.cmake
               ${CMAKE_CURRENT_BINARY_DIR}/config.h
)
list(APPEND DXIRCFOX_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR})

add_definitions(-DHAVE_CONFIG_H)
if(WIN32)
add_definitions(-DWIN32)
add_definitions(-DFOXDLL)
add_definitions(-DUNICODE)
add_definitions(-D_UNICODE)
endif(WIN32)

set(SOURCES
dxirc.cpp
dxmessagechannel.cpp
dxpipe.cpp
dxtext.cpp
dxtextfield.cpp
dxutils.cpp
fxext.cpp
icons.cpp
logthread.cpp
preferences.cpp
dialogs/aboutdialog.cpp
dialogs/aliasdialog.cpp
dialogs/configdialog.cpp
dialogs/dccdialog.cpp
dialogs/helpdialog.cpp
dialogs/keybindingsdialog.cpp
dialogs/logviewer.cpp
dialogs/scriptdialog.cpp
dialogs/serverdialog.cpp
dialogs/listdialog.cpp
tabitems/dcctabitem.cpp
tabitems/dxtabbook.cpp
tabitems/dxtabitem.cpp
tabitems/irctabitem.cpp
tabitems/tetristabitem.cpp
tabitems/boatstabitem.cpp
engine/dccengine.cpp
engine/dxsocket.cpp
engine/ircengine.cpp
)

set(TRAY_SOURCES
 FXTrayApp.cpp
 FXTrayIcon.cpp
)

include_directories(${DXIRCFOX_INCLUDE_DIRS}
 ${CMAKE_CURRENT_SOURCE_DIR}
 ${CMAKE_CURRENT_BINARY_DIR}
 ${CMAKE_BINARY_DIR}
)

if(FOX_HAVE_TRAY)
 set(SRCS ${SOURCES} ${TRAY_SOURCES})
else(FOX_HAVE_TRAY)
 set(SRCS ${SOURCES})
endif(FOX_HAVE_TRAY)

if(WIN32)
list(APPEND DXIRCFOX_LIBS ws2_32)
list(APPEND DXIRCFOX_LIBS winmm)
endif(WIN32)

if(MINGW)
    # resource compilation for MinGW
    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/windxirc.o
                    COMMAND ${CMAKE_RC_COMPILER} -I${CMAKE_CURRENT_SOURCE_DIR} -i${CMAKE_CURRENT_SOURCE_DIR}/dxirc-fox.rc
                    -o ${CMAKE_CURRENT_BINARY_DIR}/windxirc.o )
    set(SRCS ${SRCS} ${CMAKE_CURRENT_BINARY_DIR}/windxirc.o)
else(MINGW)
    set(SRCS ${SRCS} dxirc-fox.rc)
endif(MINGW)

ADD_EXECUTABLE(dxirc-fox ${SRCS})
if(WIN32)
    target_link_libraries(dxirc-fox "-Wl,--subsystem,windows -mwindows" ${DXIRCFOX_LIBS})
else(WIN32)
    target_link_libraries(dxirc-fox ${DXIRCFOX_LIBS})
endif(WIN32)

install(TARGETS dxirc-fox DESTINATION bin)

message(STATUS "dxirc-fox")
message(STATUS "Install prefix:                             ${CMAKE_INSTALL_PREFIX}")
message(STATUS "Build with IPv6:                            ${FOX_ENABLE_IPV6}")
message(STATUS "Build with tray support:                    ${FOX_HAVE_TRAY}")
if(HAVE_LUA)
message(STATUS "Build with lua scripting support:           ${HAVE_LUA}/${LUA_VERSION_STRING}")
else(HAVE_LUA)
message(STATUS "Build with lua scripting support:           ${HAVE_LUA}")
endif(HAVE_LUA)
message(STATUS "Build with SSL:                             ${HAVE_OPENSSL}")
if(HAVE_ENCHANT)
message(STATUS "Build with spellchecking support:           ${HAVE_ENCHANT}/${ENCHANT_VERSION}")
else(HAVE_ENCHANT)
message(STATUS "Build with spellchecking support:           ${HAVE_ENCHANT}")
endif(HAVE_ENCHANT)

