PROJECT(cr3)
cmake_minimum_required(VERSION 3.0)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")

#INCLUDE(CPack)

if( ${CMAKE_SYSTEM} MATCHES "Darwin" )
  message("MAC OSX build")
  SET(MAC 1)
endif( ${CMAKE_SYSTEM} MATCHES "Darwin" )

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release CACHE STRING
	  "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
	  FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

IF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
  ADD_DEFINITIONS( -D_DEBUG=1 -DDEBUG=1 )
ELSE()
  ADD_DEFINITIONS( -DNDEBUG=1 )
ENDIF(${CMAKE_BUILD_TYPE} STREQUAL Debug)

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)
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic -std=c++11 -fPIC -Wno-misleading-indentation")
endif()

if (NOT DEFINED GUI)
  SET(GUI QT5)
  message("GUI type is not specified!\n")
  message("Using ${GUI} as default\n")
  message("Add cmake parameter -D GUI={QT|QT5|WX|CRGUI_XCB|CRGUI_NANOX|CRGUI_PB|CRGUI_QT|CRGUI_JINKE_PLUGIN|CRGUI_WIN32|FB2PROPS} to use another GUI frontend\n")
else ()
  message("Using GUI frontend ${GUI}\n")
endif (NOT DEFINED GUI)



# Determines whether to use external app EDICT for dictionary
if (NOT DEFINED USE_EXTERNAL_EDICT_DICTIONARY)
  SET(USE_EXTERNAL_EDICT_DICTIONARY 0)
else()
  SET(USE_EXTERNAL_EDICT_DICTIONARY ${USE_EXTERNAL_EDICT_DICTIONARY})
endif (NOT DEFINED USE_EXTERNAL_EDICT_DICTIONARY)
message("using USE_EXTERNAL_EDICT_DICTIONARY=${USE_EXTERNAL_EDICT_DICTIONARY}")
ADD_DEFINITIONS( -DUSE_EXTERNAL_EDICT_DICTIONARY=${USE_EXTERNAL_EDICT_DICTIONARY} )


# Document buffer cache / compression settings

#whether to compress data
if (NOT DEFINED DOC_DATA_COMPRESSION_LEVEL)
  message("-D DOC_DATA_COMPRESSION_LEVEL=0|1|2|3|4|5 parameter is not defined: will use default value")
  SET(DOC_DATA_COMPRESSION_LEVEL 1)
else()
  SET(DOC_DATA_COMPRESSION_LEVEL ${DOC_DATA_COMPRESSION_LEVEL})
endif (NOT DEFINED DOC_DATA_COMPRESSION_LEVEL)
message("using TEXT_COMPRESSION_LEVEL=${DOC_DATA_COMPRESSION_LEVEL}")
ADD_DEFINITIONS( -DDOC_DATA_COMPRESSION_LEVEL=${DOC_DATA_COMPRESSION_LEVEL} )

# Total RAM buffers size for document
if (NOT DEFINED DOC_BUFFER_SIZE)
  message("-D DOC_BUFFER_SIZE=N parameter is not defined: will use default value")
  SET(DOC_BUFFER_SIZE 0x400000)
else()
  SET(DOC_BUFFER_SIZE ${DOC_BUFFER_SIZE})
endif (NOT DEFINED DOC_BUFFER_SIZE)
message("using DOC_BUFFER_SIZE=${DOC_BUFFER_SIZE}")
ADD_DEFINITIONS( -DDOC_BUFFER_SIZE=${DOC_BUFFER_SIZE} )

# big page margins support
if (NOT DEFINED BIG_PAGE_MARGINS)
  SET(BIG_PAGE_MARGINS 0)
else()
  SET(BIG_PAGE_MARGINS ${BIG_PAGE_MARGINS})
endif (NOT DEFINED BIG_PAGE_MARGINS)
ADD_DEFINITIONS( -DBIG_PAGE_MARGINS=${BIG_PAGE_MARGINS} )

# big page margins support
if (NOT DEFINED MAX_IMAGE_SCALE_MUL)
  SET(MAX_IMAGE_SCALE_MUL 0)
else()
  SET(MAX_IMAGE_SCALE_MUL ${MAX_IMAGE_SCALE_MUL})
endif (NOT DEFINED MAX_IMAGE_SCALE_MUL)
ADD_DEFINITIONS( -DMAX_IMAGE_SCALE_MUL=${MAX_IMAGE_SCALE_MUL} )
message("using MAX_IMAGE_SCALE_MUL=${MAX_IMAGE_SCALE_MUL}")


if(MAC)
  ADD_DEFINITIONS( -DMAC=1 -DLINUX=1 -D_LINUX=1 -DCR_EMULATE_GETTEXT=1 )
elseif ( WIN32 )
  ADD_DEFINITIONS( -DWIN32=1 -D_WIN32=1 -DCR_EMULATE_GETTEXT=1 -DNOMINMAX=1 -D_CRT_SECURE_NO_WARNINGS )
else()
  ADD_DEFINITIONS( -DLINUX=1 -D_LINUX=1 )
endif(MAC)

if (NOT DEFINED GRAY_BACKBUFFER_BITS)
  SET(GRAY_BACKBUFFER_BITS 2)
endif (NOT DEFINED GRAY_BACKBUFFER_BITS)
if (NOT DEFINED ENABLE_DBUS_VIEWER_EVENTS)
  SET(ENABLE_DBUS_VIEWER_EVENTS 0)
endif (NOT DEFINED ENABLE_DBUS_VIEWER_EVENTS)


SET (CRGUI_DEFS -DCOLOR_BACKBUFFER=0 -DLDOM_USE_OWN_MEM_MAN=0 -DGRAY_BACKBUFFER_BITS=${GRAY_BACKBUFFER_BITS}
	  -DENABLE_DBUS_VIEWER_EVENTS=${ENABLE_DBUS_VIEWER_EVENTS})
SET (DESKTOP_DEFS -DCOLOR_BACKBUFFER=1 -DLDOM_USE_OWN_MEM_MAN=1 -DUSE_FREETYPE=1 )

if( ${GUI} STREQUAL QT )
FIND_PACKAGE( Qt4 REQUIRED )
INCLUDE(${QT_USE_FILE})
SET(QT_3RDPARTY_DIR ${QT_INCLUDE_DIR}/../src/3rdparty)
endif( ${GUI} STREQUAL QT )

if( ${GUI} STREQUAL QT5 )
  FIND_PACKAGE( Qt5Core REQUIRED )
  FIND_PACKAGE( Qt5Widgets REQUIRED )
  FIND_PACKAGE( Qt5LinguistTools REQUIRED )
  include_directories(${Qt5Widgets_INCLUDE_DIRS})
  add_definitions(${Qt5Widgets_DEFINITIONS})
  include_directories(${Qt5Core_INCLUDE_DIRS})
  add_definitions(${Qt5Core_DEFINITIONS})
endif( ${GUI} STREQUAL QT5 )

#UNRAR support
if(DEFINED USE_UNRAR)
  message("Will build static UNRAR library")
  SET(USE_UNRAR 1)
  SET(UNRAR_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/unrar)
  SET(UNRAR_LIBRARIES unrar)
  ADD_DEFINITIONS(-DUSE_UNRAR=1)
  INCLUDE_DIRECTORIES(${UNRAR_INCLUDE_DIR})
  ADD_SUBDIRECTORY(thirdparty/unrar)
else()
  message("NO_UNRAR parameter specified: Will not support UNRAR")
  SET(UNRAR_INCLUDE_DIR)
  SET(UNRAR_LIBRARIES)
  ADD_DEFINITIONS(-DUSE_UNRAR=0)
  SET(USE_UNRAR 0)
endif(DEFINED USE_UNRAR)

if (MAC)
  message("will use zlib, libpng, libjpeg, freetype from Qt static library")
  SET(ZLIB_INCLUDE_DIR ${QT_3RDPARTY_DIR}/zlib)
  SET(ZLIB_LIBRARIES )
  SET(PNG_INCLUDE_DIR ${QT_3RDPARTY_DIR}/libpng)
  SET(PNG_LIBRARIES )
  SET(FREETYPE_INCLUDE_DIRS ${QT_3RDPARTY_DIR}/freetype/include)
  SET(FREETYPE_LIBRARIES )
  SET(JPEG_INCLUDE_DIR ${QT_3RDPARTY_DIR}/libjpeg)
  SET(JPEG_LIBRARIES )
endif(MAC)

if (NOT MAC)
if (DEFINED USE_QT_ZLIB)
  SET(ZLIB_INCLUDE_DIR ${QT_INCLUDE_DIR}/../src/3rdparty/zlib)
  message("Using QT ZLIB ${USE_QT_ZLIB} include dir: ${ZLIB_INCLUDE_DIR}\n")
# SET(ZLIB_LIBRARIES "")
else()

if (NOT MSVC AND NOT DEFINED USE_STATIC_ZLIB)
FIND_PACKAGE(ZLIB)
endif (NOT MSVC AND NOT DEFINED USE_STATIC_ZLIB)

if (NOT ZLIB_FOUND)
  message("System ZLIB not found, will build local one\n")
  #to disable #include <qconfig.h>
  ADD_DEFINITIONS(-DCR3_PATCH=1)
  ADD_SUBDIRECTORY(thirdparty/zlib)
  SET(ZLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/zlib)
  SET(ZLIB_LIBRARIES z)
endif (NOT ZLIB_FOUND)
endif(DEFINED USE_QT_ZLIB)
endif(NOT MAC)

if (NOT ${GUI} STREQUAL FB2PROPS )
if (NOT MAC)
if (NOT MSVC AND NOT CR3_PNG)
FIND_PACKAGE(PNG)
endif (NOT MSVC AND NOT CR3_PNG)

if (NOT PNG_FOUND)
  message("System LIBPNG not found, will build local one\n")
  #to disable #include <qconfig.h>
  ADD_DEFINITIONS(-DCR3_PATCH=1)
  INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
  ADD_SUBDIRECTORY(thirdparty/libpng)
  SET(PNG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpng)
  SET(PNG_LIBRARIES png)
endif (NOT PNG_FOUND)

if (NOT MSVC AND NOT CR3_JPEG)
FIND_PACKAGE(JPEG)
endif (NOT MSVC AND NOT CR3_JPEG)
if (NOT JPEG_FOUND)
  message("System LIBJPEG not found, will build local one\n")
  ADD_SUBDIRECTORY(thirdparty/libjpeg)
  SET(JPEG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libjpeg)
  SET(JPEG_LIBRARIES jpeg)
endif (NOT JPEG_FOUND)

if (NOT MSVC AND NOT CR3_FREETYPE)
FIND_PACKAGE(Freetype)
FIND_PACKAGE(HarfBuzz)
endif (NOT MSVC AND NOT CR3_FREETYPE)

if (NOT FREETYPE_FOUND)
  message("System FREETYPE not found, will build local one\n")
  if (NOT HarfBuzz_FOUND)
	SET(HARFBUZZ_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/harfbuzz/src)
	SET(HARFBUZZ_LIBRARIES harfbuzz)
  endif (NOT HarfBuzz_FOUND)
  ADD_SUBDIRECTORY(thirdparty/freetype)
  SET(FREETYPE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/freetype/include)
  SET(FREETYPE_LIBRARIES freetype)
endif (NOT FREETYPE_FOUND)

if (NOT HarfBuzz_FOUND)
  message("System HarfBuzz not found, will build local one\n")
  SET(HB_HAVE_FREETYPE ON CACHE BOOL "Enable freetype interop helpers" FORCE)
  SET(HB_BUILD_TESTS OFF CACHE BOOL "Build harfbuzz tests" FORCE)
  ADD_SUBDIRECTORY(thirdparty/harfbuzz)
  SET(HARFBUZZ_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/harfbuzz/src)
  SET(HARFBUZZ_LIBRARY harfbuzz)
endif (NOT HarfBuzz_FOUND)

if (NOT MSVC)
	find_package(FontConfig)
endif(NOT MSVC)

if (FONTCONFIG_FOUND)
	message("System FontConfig found")
	set(DESKTOP_DEFS ${DESKTOP_DEFS} -DUSE_FONTCONFIG=1)
else()
	message("System FontConfig not found")
	set(DESKTOP_DEFS ${DESKTOP_DEFS} -DUSE_FONTCONFIG=0)
endif (FONTCONFIG_FOUND)

endif (NOT MAC)

#if (ENABLE_CHM)
message("Will build patched LIBCHM library\n")
ADD_SUBDIRECTORY(thirdparty/chmlib)
SET(CHM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/chmlib/src)
SET(CHM_LIBRARIES chmlib)
ADD_DEFINITIONS(-DCHM_SUPPORT_ENABLED=1)
#else()
#ADD_DEFINITIONS(-DCHM_SUPPORT_ENABLED=0)
#endif(ENABLE_CHM)

message("Will build patched ANTIWORD library\n")
ADD_DEFINITIONS(-DCR3_ANTIWORD_PATCH=1)
ADD_SUBDIRECTORY(thirdparty/antiword)
SET(ANTIWORD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/antiword)
SET(ANTIWORD_LIBRARIES antiword)
ADD_DEFINITIONS(-DENABLE_ANTIWORD=1)
INCLUDE_DIRECTORIES( ${ANTIWORD_INCLUDE_DIR} )
endif ( NOT ${GUI} STREQUAL FB2PROPS )


INCLUDE_DIRECTORIES(
  ${PNG_INCLUDE_DIR}
  ${JPEG_INCLUDE_DIR}
  ${ZLIB_INCLUDE_DIR}
  ${FREETYPE_INCLUDE_DIRS}
  ${HARFBUZZ_INCLUDE_DIR}
  ${ANTIWORD_INCLUDE_DIR}
  ${CHM_INCLUDE_DIR}
)

if ( ${GUI} STREQUAL FB2PROPS )
SET(STD_LIBS
  ${ZLIB_LIBRARIES}
)
else()
SET(STD_LIBS
  ${JPEG_LIBRARIES}
  ${FREETYPE_LIBRARIES}
  ${HARFBUZZ_LIBRARY}
  ${PNG_LIBRARIES}
  ${ZLIB_LIBRARIES}
  ${CHM_LIBRARIES}
  ${ZLIB_LIBRARIES}
  ${ANTIWORD_LIBRARIES}
)
if (FONTCONFIG_FOUND)
	set(STD_LIBS ${STD_LIBS} ${FONTCONFIG_LIBRARIES})
endif (FONTCONFIG_FOUND)
include_directories(${FT_INCLUDE_PATH})
endif ( ${GUI} STREQUAL FB2PROPS )

include_directories(crengine/include)

if ( NOT ${GUI} STREQUAL FB2PROPS )
include_directories(tinydict)
message("Will make tinydict library - .dict format support")
ADD_SUBDIRECTORY(tinydict)
endif ( NOT ${GUI} STREQUAL FB2PROPS )


include(FindPkgConfig)

if ( ${GUI} STREQUAL CRGUI_XCB )
  message("Will make CR3GUI for XCB")
  ADD_DEFINITIONS( -DCR_USE_XCB=1 ${CRGUI_DEFS} )
  ADD_DEFINITIONS( -DCR_INTERNAL_PAGE_ORIENTATION=0 ${CRGUI_DEFS} )
  message("Freetype include dir: ${FREETYPE_INCLUDE_DIRS}")
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
elseif ( ${GUI} STREQUAL CRGUI_NANOX )
  message("Will make CR3GUI for NanoX")
  if (ENABLE_DBUS_VIEWER_EVENTS)
	message("Will handle DBUS messages")
	pkg_check_modules( DBUS REQUIRED dbus-1 )
	message("dbus include dir: ${DBUS_INCLUDE_DIRS} path ${DBUS_INCLUDE_PATH}")
	include_directories(${DBUS_INCLUDE_DIRS})
  endif (ENABLE_DBUS_VIEWER_EVENTS)
  ADD_DEFINITIONS( -DLBOOK=1 -DWITH_JINKE=1 -DCR_USE_JINKE=1
	-DJINKE_VIEWER ${CRGUI_DEFS} -DENABLE_UPDATE_MODE_SETTING=1 )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
elseif ( ${GUI} STREQUAL CRGUI_JINKE_PLUGIN )
  message("Will make CR3GUI plugin for Jinke Viewer")
  ADD_DEFINITIONS( -DLBOOK=1 -DWITH_JINKE=1 -DWITH_JINKE_APP=1
	-DCR_USE_JINKE=1 ${CRGUI_DEFS}
	-DENABLE_UPDATE_MODE_SETTING=1 )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
elseif ( ${GUI} STREQUAL FB2PROPS )
  message("Will make LIBFB2PROPS plugin for Jinke Bookshelf")
  ADD_DEFINITIONS( -DLBOOK=1 -DWITH_JINKE=1 -DCR_USE_JINKE=1 -DBUILD_LITE=1 ${CRGUI_DEFS} )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(fb2props)
elseif ( ${GUI} STREQUAL CRGUI_WIN32 )
  message("Will make CR3GUI for Win32")
  ADD_DEFINITIONS( ${CRGUI_DEFS} )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
elseif ( ${GUI} STREQUAL QT )
  message("Will make CR3/QT")
  ADD_DEFINITIONS( ${DESKTOP_DEFS} )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3qt)
elseif ( ${GUI} STREQUAL QT5 )
  message("Will make CR3/QT5")
  ADD_DEFINITIONS( ${DESKTOP_DEFS} )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3qt)
elseif ( ${GUI} STREQUAL WX )
  message("Will make CR3/WX")
  ADD_DEFINITIONS( ${DESKTOP_DEFS} -DCR_WX_SUPPORT=1 )
  SET(wxWidgets_USE_LIBS base core )
  FIND_PACKAGE(wxWidgets 2.8)
  IF (wxWidgets_FOUND)
	INCLUDE(${wxWidgets_USE_FILE})
	include_directories( ${wxWidgets_INCLUDE_DIRS} )
	message( "WX include: ${wxWidgets_INCLUDE_DIRS}" )
  ELSE (wxWidgets_FOUND)
	message("wxWidgets library not found!")
  ENDIF (wxWidgets_FOUND)
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3wx)
elseif ( ${GUI} STREQUAL CRGUI_PB )
  message("Will make CR3GUI for PocketBook")
  ADD_DEFINITIONS( -DLBOOK=1 -DCR_POCKETBOOK=1
   ${CRGUI_DEFS} -DCR_USE_INVERT_FOR_SELECTION_MARKS=1 -DENABLE_UPDATE_MODE_SETTING=1)
  ADD_DEFINITIONS( -DCR_INTERNAL_PAGE_ORIENTATION=0 )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
  FIND_PATH (INKVIEW_INCLUDE_DIR inkview.h)
  IF (INKVIEW_INCLUDE_DIR)
	include_directories(${INKVIEW_INCLUDE_DIR})
  ELSE (INKVIEW_INCLUDE_DIR)
	message("inkview.h not found")
  ENDIF (INKVIEW_INCLUDE_DIR)
elseif ( ${GUI} STREQUAL CRGUI_QT )
  message("Will make CR3GUI with Qt backend")
  ADD_DEFINITIONS( -DCR_USE_QT=1 -DCRGUI_QT=1 -DCR_USE_INVERT_FOR_SELECTION_MARKS=1)
  ADD_DEFINITIONS( -DCR_INTERNAL_PAGE_ORIENTATION=0 ${CRGUI_DEFS} )
  ADD_SUBDIRECTORY(crengine)
  ADD_SUBDIRECTORY(cr3gui)
else ( ${GUI} STREQUAL CRGUI_XCB )
  message("Unknown GUI type ${GUI}")
endif ( ${GUI} STREQUAL CRGUI_XCB )
