cmake_minimum_required(VERSION 3.10)

project(libosmscout VERSION 1.1.1 LANGUAGES C CXX)

# If we are called from conan, include and activate it cmake additions
if(EXISTS ${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
  message("Loading conan definitions...")
  include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
  conan_basic_setup()
endif()

# global settings
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_VERBOSE_MAKEFILE OFF)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" "$ENV{QTDIR}" "${QTDIR}" "$ENV{QTDIR}/lib/cmake" "${QTDIR}/lib/cmake")
if(NOT CMAKE_DEBUG_POSTFIX)
  if(APPLE)
    set(CMAKE_DEBUG_POSTFIX _debug)
  else()
    set(CMAKE_DEBUG_POSTFIX d)
  endif()
endif()
set(OSMSCOUT_BASE_DIR_SOURCE ${CMAKE_CURRENT_SOURCE_DIR})
set(OSMSCOUT_BASE_DIR_BUILD ${CMAKE_CURRENT_BINARY_DIR})
set(OSMSCOUT_LIBRARY_VERSION ${PROJECT_VERSION})
include_directories(${OSMSCOUT_BASE_DIR_BUILD}/include)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
if(IOS)
  set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "" FORCE)
else()
  option(BUILD_SHARED_LIBS "Shared libraries" ON)
endif()

# default build type
if(CMAKE_BUILD_TYPE STREQUAL "")
  set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None (CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()

# check minimal compiler
if(MSVC)
  if(MSVC_VERSION LESS 1900)
    message(FATAL_ERROR "For minimal support of C++17 at least Visual Studio 2015 is required!")
  endif()
endif()
# TODO: check gcc, clang, etc. version for C++17

# feature detection (libraries, header, etc.)
include(features)

# options
option(OSMSCOUT_BUILD_WITH_OPENMP "Enable OpenMP support" ${OPENMP_FOUND})
if(OSMSCOUT_BUILD_WITH_OPENMP)
  if(OPENMP_FOUND)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  else()
    message(FATAL_ERROR "OpenMP support enabled, but not supported")
  endif()
endif()

option(OSMSCOUT_BUILD_IMPORT_TOOL_FOR_DISTRIBUTION "Import tool for distribution" OFF)
if(APPLE)
  option(OSMSCOUT_BUILD_FRAMEWORKS "Enable build of libraries as frameworks" ON)
endif()

# options for extra debugging of map renderer
option(OSMSCOUT_DEBUG_LABEL_LAYOUTER "Print extra debug messages during label layouting" OFF)
option(OSMSCOUT_DEBUG_GROUNDTILES "Print extra debug messages while rendering ground tiles" OFF)

# options for extra debugging of import
option(OSMSCOUT_DEBUG_COASTLINE "Print extra debug messages while importing coastline" OFF)
option(OSMSCOUT_DEBUG_TILING "Print extra debug messages related with map tiles" OFF)

# options for extra debugging of routing
option(OSMSCOUT_DEBUG_ROUTING "Print extra debug messages while routing" OFF)

# compiler settings
include(CheckCXXCompilerFlag)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX OR CMAKE_COMPILER_IS_GNUCC)
  set(OSMSCOUT_WARNING_FLAGS "-Wall -Winit-self -Wno-overloaded-virtual -Wcast-qual -Wwrite-strings -Wextra -Wno-long-long")
  if(EMSCRIPTEN)
    set(OSMSCOUT_WARNING_FLAGS "${OSMSCOUT_WARNING_FLAGS} -Wno-warn-absolute-paths")
  elseif(NOT APPLE)
    set(OSMSCOUT_WARNING_FLAGS "${OSMSCOUT_WARNING_FLAGS} -Wno-unused-but-set-parameter")
  endif()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OSMSCOUT_WARNING_FLAGS}")
  if(UNIX)
    add_definitions(-ldl -lm -lpthread)
  endif()
endif()
if(MSVC)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /we4028")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast /wd4251 /MP")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Oi")
  if(OSMSCOUT_PLATFORM_X64)
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
  endif()
  add_definitions(-D_WIN32_WINNT=0x0A00 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
endif()
if(MINGW OR MSYS)
  add_definitions(-D_WIN32_WINNT=0x0600)
  if(NOT OSMSCOUT_PLATFORM_X64)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686")
    # provide more addressable memory on win 32bit builds
    # see https://msdn.microsoft.com/en-us/library/aa366778
    set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware")
  endif ()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -fno-tree-slp-vectorize -Wno-error=cast-qual -Wno-unused-local-typedefs")
endif()
if((CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX OR CMAKE_COMPILER_IS_GNUCC) AND NOT MINGW)
  add_definitions( -Wall -pedantic )
  check_cxx_compiler_flag(-fvisibility=hidden OSMSCOUT_GCC_VISIBILITY)
  if(OSMSCOUT_GCC_VISIBILITY)
    execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE OSMSCOUT_GCC_VERSION)
    message(STATUS "Detected g++ ${OSMSCOUT_GCC_VERSION}")
    message(STATUS "Enabling GCC visibility flags")
    set(OSMSCOUT_GCC_VISIBILITY_FLAGS "-fvisibility=hidden")
    set(XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN "YES")
    string(TOLOWER "${CMAKE_BUILD_TYPE}" OSMSCOUT_BUILD_TYPE)

    if(OSMSCOUT_BUILD_TYPE STREQUAL "debug" AND OSMSCOUT_GCC_VERSION VERSION_LESS "4.2")
      message(STATUS "Skipping -fvisibility-inlines-hidden due to possible bug in g++ < 4.2")
    else()
      if(APPLE)
        message(STATUS "Skipping -fvisibility-inlines-hidden due to linker issues")
        set(XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN[arch=x86_64] "YES")
      else()
        set(OSMSCOUT_VISIBILITY_FLAGS "${OSMSCOUT_GCC_VISIBILITY_FLAGS} -fvisibility-inlines-hidden")
        set(XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN "YES")
      endif()
    endif()
  endif()
  if(NOT APPLE)
    add_definitions(-fPIC)
  endif()
endif()
if(APPLE)
  if(IOS)
    set(CMAKE_SIZEOF_VOID_P 4)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc -fembed-bitcode")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fobjc-arc")
  endif()
  set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++17")
  set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
endif()
if(NOT BUILD_SHARED_LIBS)
  add_definitions(-DOSMSCOUT_STATIC)
endif()
include(ProjectConfig)
add_definitions(-D_USE_MATH_DEFINES)

# Test large file support
include(TestLargeFiles)
OPJ_TEST_LARGE_FILES(OPJ_HAVE_LARGEFILES)

# Qt DLLs
if(WIN32 AND TARGET Qt5::qmake AND NOT TARGET Qt5::windeployqt)
  get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
  execute_process(
    COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
    RESULT_VARIABLE return_code
    OUTPUT_VARIABLE qt5_install_prefix
    OUTPUT_STRIP_TRAILING_WHITESPACE
  )
  set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe")
  if(EXISTS ${imported_location})
    add_executable(Qt5::windeployqt IMPORTED)
    set_target_properties(Qt5::windeployqt PROPERTIES IMPORTED_LOCATION ${imported_location})
  endif()
  option(OSMSCOUT_INSTALL_QT_DLL "Copies the DLLs from Qt to the installation directory" OFF)
  mark_as_advanced(OSMSCOUT_INSTALL_QT_DLL)
endif()

# components
set(OSMSCOUT_BUILD_CORE ON CACHE INTERNAL "" FORCE)
add_subdirectory(libosmscout)

option(OSMSCOUT_BUILD_IMPORT "Enable build of import library" ON)
if(OSMSCOUT_BUILD_IMPORT)
  add_subdirectory(libosmscout-import)
endif()

option(OSMSCOUT_BUILD_GPX "Enable build of gpx library" ON)
if(OSMSCOUT_BUILD_GPX)
  add_subdirectory(libosmscout-gpx)
endif()

set(OSMSCOUT_BUILD_MAP ON CACHE INTERNAL "" FORCE)
add_subdirectory(libosmscout-map)

if(LIBAGG_FOUND AND LIBAGGFT2_LIBRARIES AND FREETYPE_FOUND AND OSMSCOUT_BUILD_MAP)
  set(OSMSCOUT_BUILD_MAP_AGG_CACHE ON)
else()
  set(OSMSCOUT_BUILD_MAP_AGG_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_MAP_AGG "Enable build of agg map drawing backend" ${OSMSCOUT_BUILD_MAP_AGG_CACHE})
if(OSMSCOUT_BUILD_MAP_AGG)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for agg map drawing backend")
	set(OSMSCOUT_BUILD_MAP_AGG OFF)
  endif()
  if(NOT LIBAGG_FOUND)
    message(SEND_ERROR "libagg is required for agg map drawing backend")
	set(OSMSCOUT_BUILD_MAP_AGG OFF)
  endif()
  if(NOT LIBAGGFT2_LIBRARIES)
    message(SEND_ERROR "libaggft2 is required for agg map drawing backend")
	set(OSMSCOUT_BUILD_MAP_AGG OFF)
  endif()
  if(NOT FREETYPE_FOUND)
    message(SEND_ERROR "freetype2 is required for agg map drawing backend")
	set(OSMSCOUT_BUILD_MAP_AGG OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_AGG)
    add_subdirectory(libosmscout-map-agg)
  endif()
endif()

if(CAIRO_FOUND AND PNG_FOUND AND OSMSCOUT_BUILD_MAP)
  set(OSMSCOUT_BUILD_MAP_CAIRO_CACHE ON)
else()
  set(OSMSCOUT_BUILD_MAP_CAIRO_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_MAP_CAIRO "Enable build of cairo map drawing backend" ${OSMSCOUT_BUILD_MAP_CAIRO_CACHE})
if(OSMSCOUT_BUILD_MAP_CAIRO)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for cairo map drawing backend")
    set(OSMSCOUT_BUILD_MAP_CAIRO OFF)
  endif()
  if(NOT CAIRO_FOUND)
    message(SEND_ERROR "Cairo is required for cairo map drawing backend")
    set(OSMSCOUT_BUILD_MAP_CAIRO OFF)
  endif()
  if(NOT PNG_FOUND)
    message(SEND_ERROR "libpng is required for cairo map drawing backend")
    set(OSMSCOUT_BUILD_MAP_CAIRO OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_CAIRO)
    add_subdirectory(libosmscout-map-cairo)
  endif()
endif()

if(WIN32)
  if(Direct2D_FOUND AND OSMSCOUT_BUILD_MAP AND NOT MSYS)
    set(OSMSCOUT_BUILD_MAP_DIRECTX_CACHE ON)
  else()
    set(OSMSCOUT_BUILD_MAP_DIRECTX_CACHE OFF)
  endif()
  option(OSMSCOUT_BUILD_MAP_DIRECTX "Enable build of DirectX map drawing backend" ${OSMSCOUT_BUILD_MAP_DIRECTX_CACHE})
  option(OSMSCOUT_BUILD_MAP_GDI "Enable build of GDI+ map drawing backend" ON)
else()
  set(OSMSCOUT_BUILD_MAP_DIRECTX OFF)
  set(OSMSCOUT_BUILD_MAP_GDI OFF)
endif()
if(OSMSCOUT_BUILD_MAP_DIRECTX)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for DirectX map drawing backend")
    set(OSMSCOUT_BUILD_MAP_DIRECTX OFF)
  endif()
  if(NOT Direct2D_FOUND)
    message(SEND_ERROR "Direct2D is required for DirectX map drawing backend")
    set(OSMSCOUT_BUILD_MAP_DIRECTX OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_DIRECTX)
    add_subdirectory(libosmscout-map-directx)
  endif()
endif()
if(OSMSCOUT_BUILD_MAP_GDI)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for GDI+ map drawing backend")
    set(OSMSCOUT_BUILD_MAP_GDI OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_GDI)
    add_subdirectory(libosmscout-map-gdi)
  endif()
endif(OSMSCOUT_BUILD_MAP_GDI)

if(APPLE)
  option(OSMSCOUT_BUILD_MAP_IOSX "Enable build of iOS/OSX map drawing backend" ${OSMSCOUT_BUILD_MAP})
  if(OSMSCOUT_BUILD_MAP_IOSX)
    if(NOT ${OSMSCOUT_BUILD_MAP})
      message(SEND_ERROR "The main map drawing interface is required for cairo map drawing backend")
      set(OSMSCOUT_BUILD_MAP_IOSX OFF)
    endif()
    if(OSMSCOUT_BUILD_MAP_IOSX)
      add_subdirectory(libosmscout-map-iosx)
    endif()
  endif()
else()
  set(OSMSCOUT_BUILD_MAP_IOSX OFF CACHE INTERNAL "" FORCE)
endif()

if(OPENGL_FOUND AND GLEW_FOUND AND GLM_FOUND AND PNG_FOUND AND OSMSCOUT_BUILD_MAP)
  set(OSMSCOUT_BUILD_MAP_OPENGL_CACHE ON)
else()
  set(OSMSCOUT_BUILD_MAP_OPENGL_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_MAP_OPENGL "Enable build of OpenGL map drawing backend" ${OSMSCOUT_BUILD_MAP_OPENGL_CACHE})
if(OSMSCOUT_BUILD_MAP_OPENGL)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for OpenGL map drawing backend")
	set(OSMSCOUT_BUILD_MAP_OPENGL OFF)
  endif()
  if(NOT PNG_FOUND)
    message(SEND_ERROR "libpng is required for OpenGL map drawing backend")
	set(OSMSCOUT_BUILD_MAP_OPENGL OFF)
  endif()
  if(NOT FREETYPE_FOUND)
    message(SEND_ERROR "freetype2 is required for OpenGL map drawing backend")
	set(OSMSCOUT_BUILD_MAP_OPENGL OFF)
  endif()
  if(NOT GLEW_FOUND)
    message(SEND_ERROR "GLEW is required for OpenGL map drawing backend")
	set(OSMSCOUT_BUILD_MAP_OPENGL OFF)
  endif()
  if(NOT GLM_FOUND)
    message(SEND_ERROR "GLM is required for OpenGL map drawing backend")
	set(OSMSCOUT_BUILD_MAP_OPENGL OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_OPENGL)
    add_subdirectory(libosmscout-map-opengl)
  endif()
endif()

if(Qt5Gui_FOUND AND Qt5Svg_FOUND AND OSMSCOUT_BUILD_MAP)
  set(OSMSCOUT_BUILD_MAP_QT_CACHE ON)
else()
  set(OSMSCOUT_BUILD_MAP_QT_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_MAP_QT "Enable build of Qt map drawing backend" ${OSMSCOUT_BUILD_MAP_QT_CACHE})
if(OSMSCOUT_BUILD_MAP_QT)
  if(NOT Qt5Gui_FOUND OR NOT Qt5Svg_FOUND)
    message(SEND_ERROR "Qt5 is required for Qt map drawing backend")
	set(OSMSCOUT_BUILD_MAP_QT OFF)
  endif()
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for Qt map drawing backend")
	set(OSMSCOUT_BUILD_MAP_QT OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_QT)
    add_subdirectory(libosmscout-map-qt)
  endif()
endif()

option(OSMSCOUT_BUILD_MAP_SVG "Enable build of SVG map drawing backend" ${OSMSCOUT_BUILD_MAP})
if(OSMSCOUT_BUILD_MAP_SVG)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for SVG map drawing backend")
	set(OSMSCOUT_BUILD_MAP_SVG OFF)
  endif()
  if(OSMSCOUT_BUILD_MAP_SVG)
    add_subdirectory(libosmscout-map-svg)
  endif()
endif()

if(Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Quick_FOUND AND Qt5Multimedia_FOUND AND OSMSCOUT_BUILD_MAP_QT)
  set(OSMSCOUT_BUILD_CLIENT_QT_CACHE ON)
else()
  set(OSMSCOUT_BUILD_CLIENT_QT_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_CLIENT_QT "Enable build of Qt client library" ${OSMSCOUT_BUILD_CLIENT_QT_CACHE})
if(OSMSCOUT_BUILD_CLIENT_QT)
  if(NOT ${OSMSCOUT_BUILD_MAP})
    message(SEND_ERROR "The main map drawing interface is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(NOT ${OSMSCOUT_BUILD_MAP_QT})
    message(SEND_ERROR "The Qt map drawing interface is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(NOT Qt5Core_FOUND)
    message(SEND_ERROR "Qt5Core is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(NOT Qt5Gui_FOUND)
    message(SEND_ERROR "Qt5Gui is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(NOT Qt5Quick_FOUND)
    message(SEND_ERROR "Qt5Quick is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(NOT Qt5Multimedia_FOUND)
    message(SEND_ERROR "Qt5Multimedia is required for OSMScout Qt client library")
	set(OSMSCOUT_BUILD_CLIENT_QT OFF)
  endif()
  if(OSMSCOUT_BUILD_CLIENT_QT)
    add_subdirectory(libosmscout-client-qt)
  endif()
endif()

option(OSMSCOUT_BUILD_DEMOS "Enable build of demo applications" TRUE)
if(OSMSCOUT_BUILD_DEMOS)
  add_subdirectory(Demos)
endif()

option(OSMSCOUT_BUILD_TOOL_IMPORT "Enable build of import applications" ${OSMSCOUT_BUILD_IMPORT})
if(OSMSCOUT_BUILD_TOOL_IMPORT)
  add_subdirectory(Import)
  add_subdirectory(BasemapImport)
endif()

option(OSMSCOUT_BUILD_TOOL_DUMPDATA "Enable build of DumpData tool" TRUE)
if(OSMSCOUT_BUILD_TOOL_DUMPDATA)
  add_subdirectory(DumpData)
endif()

option(OSMSCOUT_BUILD_TOOL_PUBLICTRANSPORTMAP "Enable build of PublicTransportMap tool" TRUE)
if(OSMSCOUT_BUILD_TOOL_PUBLICTRANSPORTMAP)
  add_subdirectory(PublicTransportMap)
endif()

if(OSMSCOUT_BUILD_MAP_QT AND OSMSCOUT_BUILD_CLIENT_QT AND Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Widgets_FOUND AND Qt5Qml_FOUND AND Qt5Quick_FOUND)
  set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2_CACHE ON)
else()
  set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 "Enable build of OSMSCout2 demo" ${OSMSCOUT_BUILD_TOOL_OSMSCOUT2_CACHE})
if(OSMSCOUT_BUILD_TOOL_OSMSCOUT2)
  if(NOT ${OSMSCOUT_BUILD_MAP_QT})
    message(SEND_ERROR "The Qt map drawing backend is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT ${OSMSCOUT_BUILD_CLIENT_QT})
    message(SEND_ERROR "The Qt client lib is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT ${OSMSCOUT_BUILD_GPX})
    message(SEND_ERROR "The Gpx lib is required for OSMScout2 application")
  	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT Qt5Core_FOUND)
    message(SEND_ERROR "Qt5Core is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT Qt5Gui_FOUND)
    message(SEND_ERROR "Qt5Gui is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT Qt5Widgets_FOUND)
    message(SEND_ERROR "Qt5Widgets is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT Qt5Qml_FOUND)
    message(SEND_ERROR "Qt5Qml is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(NOT Qt5Quick_FOUND)
    message(SEND_ERROR "Qt5Quick is required for OSMScout2 application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUT2 OFF)
  endif()
  if(OSMSCOUT_BUILD_TOOL_OSMSCOUT2)
    add_subdirectory(OSMScout2)
  endif()
endif()

if(${OSMSCOUT_BUILD_MAP_OPENGL} AND GLFW_FOUND)
  set(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL_CACHE ON)
else()
  set(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL "Enable build of OSMScoutOpenGL applications" ${OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL_CACHE})
if(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL)
  if(NOT ${OSMSCOUT_BUILD_MAP_OPENGL})
    message(SEND_ERROR "The OpenGL map drawing backend is required for OSMScoutOpenGL application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL OFF)
  endif()
  if(NOT GLFW_FOUND)
    message(SEND_ERROR "GLFW is required for OSMScoutOpenGL application")
	set(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL OFF)
  endif()
  if(OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL)
    add_subdirectory(OSMScoutOpenGL)
  endif()
endif()

if(OSMSCOUT_BUILD_MAP_QT AND OSMSCOUT_BUILD_CLIENT_QT AND Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Widgets_FOUND AND Qt5Qml_FOUND AND Qt5Quick_FOUND)
  set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR_CACHE ON)
else()
  set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_TOOL_STYLEEDITOR "Enable build of StyleEditor application" ${OSMSCOUT_BUILD_TOOL_STYLEEDITOR_CACHE})
if(OSMSCOUT_BUILD_TOOL_STYLEEDITOR)
  if(NOT ${OSMSCOUT_BUILD_MAP_QT})
    message(SEND_ERROR "The Qt map drawing backend is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT ${OSMSCOUT_BUILD_CLIENT_QT})
    message(SEND_ERROR "The Qt client lib is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT Qt5Core_FOUND)
    message(SEND_ERROR "Qt5Core is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT Qt5Gui_FOUND)
    message(SEND_ERROR "Qt5Gui is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT Qt5Widgets_FOUND)
    message(SEND_ERROR "Qt5Widgets is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT Qt5Qml_FOUND)
    message(SEND_ERROR "Qt5Qml is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(NOT Qt5Quick_FOUND)
    message(SEND_ERROR "Qt5Quick is required for StyleEditor application")
    set(OSMSCOUT_BUILD_TOOL_STYLEEDITOR OFF)
  endif()
  if(OSMSCOUT_BUILD_TOOL_STYLEEDITOR)
    add_subdirectory(StyleEditor)
  endif()
endif()

if(DOXYGEN_FOUND)
  set(OSMSCOUT_BUILD_DOC_API_CACHE ON)
else()
  set(OSMSCOUT_BUILD_DOC_API_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_DOC_API "Enable generation of api documentation" ${OSMSCOUT_BUILD_DOC_API_CACHE})
if(OSMSCOUT_BUILD_DOC_API)
  if(NOT DOXYGEN_FOUND)
    message(SEND_ERROR "Doxygen is required to build the documentation.")
  else()
    add_subdirectory(Documentation)
  endif()
endif()

if (HUGO_PATH)
  set(OSMSCOUT_BUILD_WEBPAGE_CACHE ON)
else()
  set(OSMSCOUT_BUILD_WEBPAGE_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_WEBPAGE "Enable generation of webpage" ${OSMSCOUT_BUILD_WEBPAGE_CACHE})
if(OSMSCOUT_BUILD_WEBPAGE)
  add_subdirectory(webpage)
endif()

#if(SWIG_FOUND)
#  if(JNI_FOUND)
#    set(OSMSCOUT_BUILD_BINDING_JAVA_CACHE ON)
#  else()
#    set(OSMSCOUT_BUILD_BINDING_JAVA_CACHE OFF)
#  endif()
#  option(OSMSCOUT_BUILD_BINDING_JAVA "Enable generation of java binding" ${OSMSCOUT_BUILD_BINDING_JAVA_CACHE})
#  if(MSVC)
#    option(OSMSCOUT_BUILD_BINDING_CSHARP "Enable generation of c# binding" ON)
#  else()
#    set(OSMSCOUT_BUILD_BINDING_CSHARP OFF CACHE INTERNAL "CMake only supports Visual Studio with C#" FORCE)
#  endif()
#  if(PYTHONLIBS_FOUND)
#    set(OSMSCOUT_BUILD_BINDING_PYTHON_CACHE ON)
#  else()
#    set(OSMSCOUT_BUILD_BINDING_PYTHON_CACHE OFF)
#  endif()
#  option(OSMSCOUT_BUILD_BINDING_PYTHON "Enable generation of python binding" ${OSMSCOUT_BUILD_BINDING_PYTHON_CACHE})
#  add_subdirectory(libosmscout-binding)
#  add_subdirectory(libosmscout-map-binding)
#endif()

if(MATLAB_FOUND)
  set(OSMSCOUT_BUILD_EXTERN_MATLAB_CACHE ON)
else()
  set(OSMSCOUT_BUILD_EXTERN_MATLAB_CACHE OFF)
endif()
option(OSMSCOUT_BUILD_EXTERN_MATLAB "Enable generation of MATLAB mex function" ${OSMSCOUT_BUILD_EXTERN_MATLAB_CACHE})
add_subdirectory(libosmscout-extern)

# Tests
option(OSMSCOUT_BUILD_TESTS "Enable build of test applications" ON)
if(OSMSCOUT_BUILD_TESTS)
  enable_testing()
  add_subdirectory(libosmscout-test)
  add_subdirectory(Tests)
endif()

# display build configuration
message(STATUS "libosmscout ${PROJECT_VERSION} build configuration:")
message(STATUS "Shared libraries:                ${BUILD_SHARED_LIBS}")
if(APPLE)
  message(STATUS "Build frameworks:                ${BUILD_FRAMEWORKS}")
endif()
message(STATUS "Qt libraries:")
message(STATUS " - Core:                         ${Qt5Core_FOUND}")
message(STATUS " - Gui:                          ${Qt5Gui_FOUND}")
message(STATUS " - Svg:                          ${Qt5Svg_FOUND}")
message(STATUS " - Widgets:                      ${Qt5Widgets_FOUND}")
message(STATUS " - Qml:                          ${Qt5Qml_FOUND}")
message(STATUS " - Quick:                        ${Qt5Quick_FOUND}")
message(STATUS " - Multimedia:                   ${Qt5Multimedia_FOUND}")
message(STATUS "core library:                    ${OSMSCOUT_BUILD_CORE}")
if (OSMSCOUT_BUILD_CORE)
  message(STATUS " - marisa support:               ${MARISA_FOUND}")
endif()
message(STATUS "import library:                  ${OSMSCOUT_BUILD_IMPORT}")
if (OSMSCOUT_BUILD_IMPORT)
  message(STATUS " - libxml2 support:              ${LIBXML2_FOUND}")
  message(STATUS " - protobuf support:             ${PROTOBUF_FOUND}")
  message(STATUS " - C++17 parallel execution:     ${HAVE_STD_EXECUTION}")
endif()
message(STATUS "gpx library:                     ${OSMSCOUT_BUILD_GPX}")
message(STATUS " - libxml2 support:              ${LIBXML2_FOUND}")
message(STATUS "map drawing interface:           ${OSMSCOUT_BUILD_MAP}")
message(STATUS " - Agg map drawing backend:      ${OSMSCOUT_BUILD_MAP_AGG}")
message(STATUS " - Cairo map drawing backend:    ${OSMSCOUT_BUILD_MAP_CAIRO}")
message(STATUS " - OpenGL map drawing backend:   ${OSMSCOUT_BUILD_MAP_OPENGL}")
message(STATUS " - DirectX map drawing backend:  ${OSMSCOUT_BUILD_MAP_DIRECTX}")
message(STATUS " - Qt map drawing backend:       ${OSMSCOUT_BUILD_MAP_QT}")
message(STATUS " - SVG map drawing backend:      ${OSMSCOUT_BUILD_MAP_SVG}")
message(STATUS " - OS X/iOS map drawing backend: ${OSMSCOUT_BUILD_MAP_IOSX}")
message(STATUS " - GDI+ map drawing backend:     ${OSMSCOUT_BUILD_MAP_GDI}")
message(STATUS "client libraries:")
message(STATUS " - Qt client library:            ${OSMSCOUT_BUILD_CLIENT_QT}")
message(STATUS "tools:")
message(STATUS " - Import/Import:                ${OSMSCOUT_BUILD_TOOL_IMPORT}")
message(STATUS " - Import/BasemapImport:         ${OSMSCOUT_BUILD_TOOL_IMPORT}")
message(STATUS " - DumpData:                     ${OSMSCOUT_BUILD_TOOL_DUMPDATA}")
message(STATUS " - OSMScout2:                    ${OSMSCOUT_BUILD_TOOL_OSMSCOUT2}")
message(STATUS " - OSMScoutOpenGL:               ${OSMSCOUT_BUILD_TOOL_OSMSCOUTOPENGL}")
message(STATUS " - StyleEditor:                  ${OSMSCOUT_BUILD_TOOL_STYLEEDITOR}")
message(STATUS "tests:                           ${OSMSCOUT_BUILD_TESTS}")
message(STATUS "demos:                           ${OSMSCOUT_BUILD_DEMOS}")
message(STATUS " - heap profiler (Gperftools)    ${GPERFTOOLS_USAGE}")
message(STATUS "bindings:")
message(STATUS " - Java binding:                 ${OSMSCOUT_BUILD_BINDING_JAVA}")
message(STATUS " - C# binding:                   ${OSMSCOUT_BUILD_BINDING_CSHARP}")
message(STATUS "external interfaces:")
message(STATUS " - MATLAB mex function:          ${OSMSCOUT_BUILD_EXTERN_MATLAB}")
message(STATUS "doxygen:                         ${DOXYGEN_FOUND}")
message(STATUS "documentation:                   ${OSMSCOUT_BUILD_DOC_API}")
message(STATUS "webpage:                         ${OSMSCOUT_BUILD_WEBPAGE}")
if(CCACHE_PROGRAM)
  message(STATUS "Using ccache:                    ${CCACHE_PROGRAM}")
endif()

install(DIRECTORY ${CMAKE_SOURCE_DIR}/stylesheets DESTINATION share/osmscout)
if(OSMSCOUT_INSTALL_QT_DLL AND TARGET Qt5::windeployqt)
	install(DIRECTORY "${CMAKE_BINARY_DIR}/windeployqt/" DESTINATION bin)
endif()

if(UNIX)
  set(config_install_dir "${CMAKE_INSTALL_PREFIX}/lib/cmake/${PROJECT_NAME}")
else()
  set(config_install_dir CMake)
endif()

set(version_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
set(project_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake")
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${version_config}" COMPATIBILITY SameMajorVersion)
configure_package_config_file("cmake/libosmscoutConfig.cmake.in" "${project_config}" INSTALL_DESTINATION "${config_install_dir}")
install(FILES "${project_config}" "${version_config}" DESTINATION "${config_install_dir}")
