cmake_minimum_required (VERSION 3.8)

project(redkite VERSION 1.3.1)

option(ENABLE_EXAMPLES "Build examples" OFF)

if (CMAKE_SYSTEM_NAME MATCHES Windows)
  message(STATUS "Build Redkite for Windows")
  add_compile_options(-DRK_OS_WIN)
  add_compile_options(-DRK_FOR_SHARED)
elseif(CMAKE_SYSTEM_NAME MATCHES Darwin)
  message(FATAL_ERROR "Redkite is not implemented yet for Mac OS X")
elseif (CMAKE_SYSTEM_NAME MATCHES Linux)
  message(STATUS " Build Redkite for GNU/Linux")
elseif (CMAKE_SYSTEM_NAME MATCHES FreeBSD)
  message(STATUS " Build Redkite for FreeBSD")
else()
  message(FATAL_ERROR "Redkite is not implemented yet for ${CMAKE_SYSTEM_NAME}")
endif()

set(RK_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/include)
set(RK_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src)
set(RK_EXAMPLES_PATH ${CMAKE_CURRENT_SOURCE_DIR}/examples)
set(RK_TOOLS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/tools)
set(RK_DOC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/doc)

if (NOT CMAKE_BUILD_TYPE)
  message(STATUS "no build type selected, default to Release")
  set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type Release" FORCE)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "-Wall ${CMAKE_CXX_FLAGS} -fvisibility=hidden")
set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS} -fvisibility=hidden")

if (NOT RK_EXPORT_INTERFACE)
  message(STATUS "don't export Redkite interface")
else ()
  message(STATUS "export Redkite interface")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRK_EXPORT_INTERFACE")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRK_EXPORT_INTERFACE")
endif ()

if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set (CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "default install path" FORCE)
endif()

if (NOT CMAKE_INSTALL_LIBDIR)
  message(STATUS "setting the default lib dir path to /usr/lib")
  set(CMAKE_INSTALL_LIBDIR /usr/lib CACHE STRING "lib dir to /usr/lib" FORCE)
endif()

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  message(STATUS "enable logging")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRK_LOG_DEBUG_LEVEL")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRK_LOG_DEBUG_LEVEL")
endif()

if (NOT RK_GRAPHICS_BACKEND)
  message(STATUS "use default Cairo graphics backend")
  set(RK_GRAPHICS_BACKEND "Cairo")
#  find_package(Cairo REQUIRED)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRK_GRAPHICS_CAIRO_BACKEND")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRK_GRAPHICS_CAIRO_BACKEND")
elseif (RK_GRAPHICS_BACKEND MATCHES Cairo)
#  find_package(Cairo REQUIRED)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DRK_GRAPHICS_CAIRO_BACKEND")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRK_GRAPHICS_CAIRO_BACKEND")
endif()

set(RK_HEADERS
  ${RK_INCLUDE_PATH}/Rk.h
  ${RK_INCLUDE_PATH}/RkVariant.h
  ${RK_INCLUDE_PATH}/RkObserver.h
  ${RK_INCLUDE_PATH}/RkObject.h
  ${RK_INCLUDE_PATH}/RkAction.h
  ${RK_INCLUDE_PATH}/RkLog.h
  ${RK_INCLUDE_PATH}/RkPoint.h
  ${RK_INCLUDE_PATH}/RkRealPoint.h
  ${RK_INCLUDE_PATH}/RkSize.h
  ${RK_INCLUDE_PATH}/RkRect.h
  ${RK_INCLUDE_PATH}/RkColor.h
  ${RK_INCLUDE_PATH}/RkPen.h
  ${RK_INCLUDE_PATH}/RkFont.h
  ${RK_INCLUDE_PATH}/RkPlatform.h
  ${RK_INCLUDE_PATH}/RkEvent.h
  ${RK_INCLUDE_PATH}/RkEventQueue.h
  ${RK_INCLUDE_PATH}/RkTimer.h
  ${RK_INCLUDE_PATH}/RkWidget.h
  ${RK_INCLUDE_PATH}/RkLabel.h
  ${RK_INCLUDE_PATH}/RkButton.h
  ${RK_INCLUDE_PATH}/RkLineEdit.h
  ${RK_INCLUDE_PATH}/RkList.h
  ${RK_INCLUDE_PATH}/RkProgressBar.h
  ${RK_INCLUDE_PATH}/RkCanvas.h
  ${RK_INCLUDE_PATH}/RkImage.h
  ${RK_INCLUDE_PATH}/RkPainter.h
  ${RK_INCLUDE_PATH}/RkMain.h
  ${RK_INCLUDE_PATH}/RkModel.h
  ${RK_INCLUDE_PATH}/RkContainerItem.h
  ${RK_INCLUDE_PATH}/RkContainerWidgetItem.h
  ${RK_INCLUDE_PATH}/RkContainer.h
  ${RK_INCLUDE_PATH}/RkTransition.h)

set(RK_HEADERS_IMPL
  ${RK_INCLUDE_PATH}/impl/RkMainImpl.h
  ${RK_INCLUDE_PATH}/impl/RkObjectImpl.h
  ${RK_INCLUDE_PATH}/impl/RkShortcut.h
  ${RK_INCLUDE_PATH}/impl/RkEventQueueImpl.h
  ${RK_INCLUDE_PATH}/impl/RkWidgetImpl.h
  ${RK_INCLUDE_PATH}/impl/RkLabelImpl.h
  ${RK_INCLUDE_PATH}/impl/RkListImpl.h
  ${RK_INCLUDE_PATH}/impl/RkModelImpl.h
  ${RK_INCLUDE_PATH}/impl/RkButtonImpl.h
  ${RK_INCLUDE_PATH}/impl/RkLineEditImpl.h
  ${RK_INCLUDE_PATH}/impl/RkProgressBarImpl.h
  ${RK_INCLUDE_PATH}/impl/RkCanvasInfo.h
  ${RK_INCLUDE_PATH}/impl/RkImageImpl.h
  ${RK_INCLUDE_PATH}/impl/RkPainterImpl.h)

if (RK_GRAPHICS_BACKEND MATCHES Cairo)
  set(RK_GRAPHICS_BACKEND_HEADRES
    ${RK_INCLUDE_PATH}/impl/RkCairoGraphicsBackend.h
    ${RK_INCLUDE_PATH}/impl/RkCairoImageBackendCanvas.h)
  set(RK_GRAPHICS_BACKEND_SOURCES
    ${RK_SRC_PATH}/RkCairoGraphicsBackend.cpp
    ${RK_SRC_PATH}/RkCairoImageBackendCanvas.cpp)
endif()

if(CMAKE_SYSTEM_NAME MATCHES Windows)
set(RK_HEADERS_PLATFORM
  ${RK_INCLUDE_PATH}/impl/platforms/win/RkWindowWin.h
  ${RK_INCLUDE_PATH}/impl/platforms/win/RkEventQueueWin.h)
elseif (CMAKE_SYSTEM_NAME MATCHES Darwin)
set(RK_HEADERS_PLATFORM
  ${RK_INCLUDE_PATH}/impl/platforms/mac/RkWindowMac.h
  ${RK_INCLUDE_PATH}/impl/platforms/mac/RkEventQueueMac.h)
else() # defaut GNU/Linux
  set(RK_HEADERS_PLATFORM
  ${RK_INCLUDE_PATH}/impl/platforms/xwin/RkWindowX.h
  ${RK_INCLUDE_PATH}/impl/platforms/xwin/RkEventQueueX.h)
endif()

set(RK_SOURCES
  ${RK_SRC_PATH}/RkObject.cpp
  ${RK_SRC_PATH}/RkObjectImpl.cpp
  ${RK_SRC_PATH}/RkWidget.cpp
  ${RK_SRC_PATH}/RkWidgetImpl.cpp
  ${RK_SRC_PATH}/RkMain.cpp
  ${RK_SRC_PATH}/RkEventQueue.cpp
  ${RK_SRC_PATH}/RkTimer.cpp
  ${RK_SRC_PATH}/RkEventQueueImpl.cpp
  ${RK_SRC_PATH}/RkMainImpl.cpp
  ${RK_SRC_PATH}/RkModel.cpp
  ${RK_SRC_PATH}/RkModelImpl.cpp
  ${RK_SRC_PATH}/RkLabel.cpp
  ${RK_SRC_PATH}/RkLabelImpl.cpp
  ${RK_SRC_PATH}/RkButton.cpp
  ${RK_SRC_PATH}/RkButtonImpl.cpp
  ${RK_SRC_PATH}/RkLineEdit.cpp
  ${RK_SRC_PATH}/RkLineEditImpl.cpp
  ${RK_SRC_PATH}/RkList.cpp
  ${RK_SRC_PATH}/RkListImpl.cpp
  ${RK_SRC_PATH}/RkProgressBar.cpp
  ${RK_SRC_PATH}/RkProgressBarImpl.cpp
  ${RK_SRC_PATH}/RkPainter.cpp
  ${RK_SRC_PATH}/RkImage.cpp
  ${RK_SRC_PATH}/RkImageImpl.cpp
  ${RK_SRC_PATH}/RkPainterImpl.cpp
  ${RK_SRC_PATH}/RkContainer.cpp)

if (CMAKE_SYSTEM_NAME MATCHES Windows)
  set(RK_SOURCES_PLATFORM
    ${RK_SRC_PATH}/platforms/win/RkLogWin.cpp
    ${RK_SRC_PATH}/platforms/win/RkPlatformWin.cpp
    ${RK_SRC_PATH}/platforms/win/RkWindowWin.cpp
    ${RK_SRC_PATH}/platforms/win/RkEventQueueWin.cpp)
elseif (CMAKE_SYSTEM_NAME MATCHES Darwin)
  set(RK_SOURCES_PLATFORM
    ${RK_SRC_PATH}/platforms/mac/RkPlatformMac.cpp
    ${RK_SRC_PATH}/platforms/mac/RkWindowMac.cpp
    ${RK_SRC_PATH}/platforms/mac/RkEventQueueMac.cpp)
else() # defaut GNU/Linux
  set(RK_SOURCES_PLATFORM
    ${RK_SRC_PATH}/platforms/xwin/RkLogX.cpp
    ${RK_SRC_PATH}/platforms/xwin/RkPlatformX.cpp
    ${RK_SRC_PATH}/platforms/xwin/RkWindowX.cpp
    ${RK_SRC_PATH}/platforms/xwin/RkEventQueueX.cpp)
endif()

add_definitions(-fPIC)
include_directories(${RK_INCLUDE_PATH})
include_directories(${RK_INCLUDE_PATH}/impl)

if (CMAKE_SYSTEM_NAME MATCHES Windows)
  include_directories(${RK_INCLUDE_PATH}/impl/platforms/win)
elseif (CMAKE_SYSTEM_NAME MATCHES Darwin)
  include_directories(${RK_INCLUDE_PATH}/impl/platforms/mac)
# not implemented yet
else() # defualt GNU/Linux
include_directories(${RK_INCLUDE_PATH}/impl/platforms/xwin)
endif()

# Redkite is not supposed to be provided as shared library,
# it must be only as static library for development.
add_library(redkite STATIC
  ${RK_HEADERS}
  ${RK_HEADERS_IMPL}
  ${RK_HEADERS_PLATFORM}
  ${RK_GRAPHICS_BACKEND_HEADRES}
  ${RK_GRAPHICS_BACKEND_SOURCES}
  ${RK_SOURCES}
  ${RK_SOURCES_PLATFORM})

#if (CMAKE_SYSTEM_NAME MATCHES Windows)
#  install(TARGETS redkite DESTINATION ${CMAKE_INSTALL_PREFIX})
#  install(FILES ${RK_HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
#elseif(CMAKE_SYSTEM_NAME MATCHES Darwin)
# Not implemented
#else()
#  install(TARGETS redkite DESTINATION ${CMAKE_INSTALL_LIBDIR})
#  install(FILES ${RK_HEADERS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/redkite)
#endif()

add_subdirectory(tools)
if (ENABLE_EXAMPLES)
  add_subdirectory(examples)
endif (ENABLE_EXAMPLES)
