CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)

# Project properties
PROJECT(qtspell)
SET(QTSPELL_VERSION 0.8.5)


# Soname
# MAJOR is incremented when symbols are removed or changed in an incompatible way
# MINOR is incremented when new symbols are added
SET(QTSPELL_MAJOR 0)
SET(QTSPELL_MINOR 3)


# Variables
SET(LIB_INSTALL_DIR lib${LIB_SUFFIX} CACHE PATH "Library installation dir")
SET(INCLUDE_INSTALL_DIR include CACHE PATH "Header installation dir")
SET(ISO_CODES_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Prefix for the iso-codes package")
SET(BUILD_STATIC_LIBS OFF CACHE BOOL "Whether to also build static libs")
SET(USE_QT5 ON CACHE PATH "Do the Qt5 build")

STRING(REGEX REPLACE "^${CMAKE_INSTALL_PREFIX}/" "" PC_INCLUDE_DIR ${INCLUDE_INSTALL_DIR})
STRING(REGEX REPLACE "^${CMAKE_INSTALL_PREFIX}/" "" PC_LIB_DIR ${LIB_INSTALL_DIR} )


# Dependencies
FIND_PACKAGE(PkgConfig)
PKG_CHECK_MODULES(ENCHANT enchant-2)
IF(ENCHANT_FOUND)
    ADD_DEFINITIONS(-DQTSPELL_ENCHANT2)
ELSE(ENCHANT_FOUND)
    PKG_CHECK_MODULES(ENCHANT REQUIRED enchant)
    IF(ENCHANT_VERSION VERSION_GREATER_EQUAL 2)
        ADD_DEFINITIONS(-DQTSPELL_ENCHANT2)
    ENDIF()
ENDIF(ENCHANT_FOUND)
INCLUDE_DIRECTORIES(${ENCHANT_INCLUDE_DIRS})

IF(USE_QT5)
    FIND_PACKAGE(Qt5Widgets REQUIRED)
    FIND_PACKAGE(Qt5LinguistTools REQUIRED)
ELSE(USE_QT5)
    FIND_PACKAGE(Qt4 REQUIRED)
ENDIF(USE_QT5)

FIND_PACKAGE(Doxygen)


# Library
SET(qtspell_SRCS src/Checker.cpp src/Codetable.cpp src/TextEditChecker.cpp src/UndoRedoStack.cpp)
SET(qtspell_HDRS src/TextEditChecker_p.hpp)
SET(qtspell_MOC_HDRS src/QtSpell.hpp src/UndoRedoStack.hpp)
FILE(GLOB qtspell_TS locale/*.ts)

ADD_DEFINITIONS(-DQTSPELL_LIBRARY)

STRING(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_TOLOWER)
IF(NOT CMAKE_BUILD_TYPE_TOLOWER MATCHES "debug")
    ADD_DEFINITIONS(-DQT_NO_DEBUG_OUTPUT)
ENDIF()

SET(QTSPELL_LIB_VERSION ${QTSPELL_MAJOR}.${QTSPELL_MINOR}.0)
SET(QTSPELL_SO_VERSION ${QTSPELL_MAJOR})

IF(USE_QT5)
    SET(QT_VER "qt5")
    QT5_ADD_TRANSLATION(qtspell_QM ${qtspell_TS})
    QT5_WRAP_CPP(qtspell_MOC ${qtspell_MOC_HDRS})
ELSE(USE_QT5)
    SET(QT_VER "qt4")
    QT4_ADD_TRANSLATION(qtspell_QM ${qtspell_TS})
    QT4_WRAP_CPP(qtspell_MOC ${qtspell_MOC_HDRS})
ENDIF(USE_QT5)

ADD_LIBRARY(qtspell SHARED ${qtspell_SRCS} ${qtspell_MOC} ${qtspell_HDRS} ${qtspell_MOC_HDRS} ${qtspell_QM})
IF(USE_QT5)
    TARGET_LINK_LIBRARIES(qtspell Qt5::Core Qt5::Widgets)
ELSE(USE_QT5)
    QT4_USE_MODULES(qtspell Core Gui)
ENDIF(USE_QT5)
SET_TARGET_PROPERTIES(qtspell PROPERTIES COMPILE_DEFINITIONS "ISO_CODES_PREFIX=\"${ISO_CODES_PREFIX}\"")
SET_TARGET_PROPERTIES(qtspell PROPERTIES VERSION ${QTSPELL_LIB_VERSION} SOVERSION ${QTSPELL_SO_VERSION})
SET_TARGET_PROPERTIES(qtspell PROPERTIES OUTPUT_NAME qtspell-${QT_VER})
IF(WIN32)
    SET_TARGET_PROPERTIES(qtspell PROPERTIES SUFFIX "-${QTSPELL_SO_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
ENDIF(WIN32)
IF(WIN32)
    SET(INTL_LDFLAGS -lintl)
ENDIF(WIN32)
TARGET_LINK_LIBRARIES(qtspell ${ENCHANT_LDFLAGS} ${INTL_LDFLAGS})

IF(${BUILD_STATIC_LIBS})
    ADD_LIBRARY(qtspell-static STATIC ${qtspell_SRCS} ${qtspell_MOC} ${qtspell_HDRS} ${qtspell_MOC_HDRS} ${qtspell_QM})
    IF(USE_QT5)
        TARGET_LINK_LIBRARIES(qtspell-static Qt5::Core Qt5::Widgets)
    ELSE(USE_QT5)
        QT4_USE_MODULES(qtspell-static Core Gui)
    ENDIF(USE_QT5)
    SET_TARGET_PROPERTIES(qtspell-static PROPERTIES COMPILE_DEFINITIONS "ISO_CODES_PREFIX=\"${ISO_CODES_PREFIX}\"")
    SET_TARGET_PROPERTIES(qtspell-static PROPERTIES VERSION ${QTSPELL_LIB_VERSION} SOVERSION ${QTSPELL_SO_VERSION})
    SET_TARGET_PROPERTIES(qtspell-static PROPERTIES OUTPUT_NAME qtspell-${QT_VER})
ENDIF(${BUILD_STATIC_LIBS})

CONFIGURE_FILE(QtSpell.pc.in QtSpell-${QT_VER}.pc @ONLY)

INSTALL(TARGETS qtspell
    RUNTIME DESTINATION bin COMPONENT libraries
    ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT libraries
    LIBRARY DESTINATION ${LIB_INSTALL_DIR} COMPONENT libraries
)
IF(${BUILD_STATIC_LIBS})
    INSTALL(TARGETS qtspell-static ARCHIVE DESTINATION ${LIB_INSTALL_DIR} COMPONENT libraries)
ENDIF(${BUILD_STATIC_LIBS})
INSTALL(FILES src/QtSpell.hpp DESTINATION ${INCLUDE_INSTALL_DIR}/QtSpell-${QT_VER})
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/QtSpell-${QT_VER}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig)
INSTALL(FILES ${qtspell_QM} DESTINATION share/${QT_VER}/translations)


# Example
IF(USE_QT5)
    QT5_WRAP_CPP(example_MOC examples/example.hpp)
ELSE(USE_QT5)
    QT4_WRAP_CPP(example_MOC examples/example.hpp)
ENDIF(USE_QT5)
ADD_EXECUTABLE(example examples/example.cpp ${example_MOC})
IF(USE_QT5)
    TARGET_LINK_LIBRARIES(example Qt5::Core Qt5::Widgets)
ELSE(USE_QT5)
    QT4_USE_MODULES(example Core Gui)
ENDIF(USE_QT5)
INCLUDE_DIRECTORIES(src/)
TARGET_LINK_LIBRARIES(example qtspell)


# Documentation
IF(DOXYGEN_FOUND)
CONFIGURE_FILE(doc/Doxyfile.in doc/Doxyfile @ONLY)

add_custom_target(doc
    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doc/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc
    COMMENT "Generating API documentation with Doxygen" VERBATIM
)

ENDIF(DOXYGEN_FOUND)


# spec and debian changelog
set(ENV{LC_ALL} "C")
EXECUTE_PROCESS(COMMAND date +%a\ %b\ %d\ %Y OUTPUT_VARIABLE SPEC_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS(COMMAND date -R OUTPUT_VARIABLE RFC_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
CONFIGURE_FILE(packaging/qtspell.spec.in qtspell.spec @ONLY)
CONFIGURE_FILE(packaging/debian/changelog.in debian/changelog @ONLY)


# Dist
ADD_CUSTOM_TARGET(dist
    COMMAND git archive --format=tar --prefix=${CMAKE_PROJECT_NAME}-${QTSPELL_VERSION}/ HEAD | xz > ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${QTSPELL_VERSION}.tar.xz
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
