cmake_minimum_required (VERSION 3.1.0)
project (XyGrib)
set(VERSION_MAJOR 1)
set(VERSION_MINOR 2)
set(VERSION_PATCH 6)

set(XYGRIB_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
set(XYGRIB_VERSION_DATE "2019-07-05")

set(CMAKE_VERBOSE_MAKEFILE ON)

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Unfotunately cmake <3.9 is not able to handle the coding style of XyGrib and AUTOMOC misses many classes. Once the code is fixed or we can expect newer cmake everywhere, we can enable this and get rid of the QT5_WRAP_CPP() macros
## Instruct CMake to run moc automatically when needed
#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTOMOC_RELAXED_MODE TRUE)

# Unfotunately AUTOUIC_SEARCH_PATHS is not available before cmake 3.9 so we can't use this on all the current platforms
# At some future moment, turn this on and simplify src/GUI/CMakeLists.txt
## Create code from a list of Qt designer ui files
#set(CMAKE_AUTOUIC ON)
#set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/src/GUI")

set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
if(UNIX AND NOT APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC")
endif()

# Add support for address etc sanitizers, part 1/2 (other half after ADD_EXECUTABLE)
if ( CMAKE_VERSION VERSION_GREATER 3.4 )
  set(ENABLE_SANITIZER "none" CACHE STRING "Add clang sanitizer to the build")
  set_property(CACHE ENABLE_SANITIZER PROPERTY STRINGS none address memory thread undefined)
  if (NOT "${ENABLE_SANITIZER}" MATCHES "none")
    add_compile_options(-fsanitize=${ENABLE_SANITIZER})
  endif()
endif()

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

set(CMAKE_FIND_FRAMEWORK LAST)

# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)
include_directories(${Qt5Widgets_INCLUDE_DIRS})
find_package(Qt5Core CONFIG REQUIRED)
find_package(Qt5Gui CONFIG REQUIRED)
find_package(Qt5Network CONFIG REQUIRED)
include_directories(${Qt5Network_INCLUDE_DIRS})
find_package(Qt5PrintSupport CONFIG REQUIRED)
include_directories(${Qt5PrintSupport_INCLUDE_DIRS})
find_package(Qt5Xml CONFIG REQUIRED)
include_directories(${Qt5Xml_INCLUDE_DIRS})

find_library(LIBNOVA_LIBRARY
     NAMES "libnova.a" "libnova.so"
     PATHS
     $ENV{EXTERNLIBS}/lib
     ~/Library/Frameworks
     /Library/Frameworks
     /usr/local
     /usr
     /sw
     /opt/local
     /opt/csw
     /opt
     PATH_SUFFIXES lib lib64 lib/x86_64-linux-gnu lib/i386-linux-gnu lib/armhf-linux-gnu lib/arm64-linux-gnu
     REQUIRED
 )
find_path(LIBNOVA_INCLUDE_DIR
     NAMES "libnova/libnova.h" "libnova.h"
     PATHS
     $ENV{EXTERNLIBS}/include
     ~/Library/Frameworks/include
     /Library/Frameworks/include
     /usr/local/include
     /usr/include
     /sw/include # Fink
     /opt/local/include # DarwinPorts
     /opt/csw/include # Blastwave
     /opt/include
     REQUIRED
 )
include_directories(${LIBNOVA_INCLUDE_DIR})

#find_package(OpenJPEG REQUIRED)
find_library(OPENJPEG_LIBRARIES
#     NAMES "libopenjp2.a" "libopenjp2.so" "libopenjpeg.so.2" "libopenjp2.dll.a"
     NAMES "libopenjp2.so.7" "libopenjp2.so" "libopenjp2.a" "libopenjpeg.so.2" "libopenjp2.dll.a"
     PATHS
     $ENV{EXTERNLIBS}/lib
     ~/Library/Frameworks
     /Library/Frameworks
     /usr/local
     /usr
     /sw
     /opt/local
     /opt/csw
     /opt
     PATH_SUFFIXES lib lib64
     REQUIRED
 )
find_path(OPENJPEG_INCLUDE_DIR
     NAMES "openjpeg.h"
     PATHS
     $ENV{EXTERNLIBS}/include
     ~/Library/Frameworks/include
     /Library/Frameworks/include
     /usr/local/include
     /usr/local/include/openjpeg-2.3
     /usr/include/openjpeg-2.3
     /usr/local/include/openjpeg-2.1
     /usr/include/openjpeg-2.1
     /usr/local/include/openjpeg-2.2
     /usr/include/openjpeg-2.2
     /usr/include
     /sw/include # Fink
     /opt/local/include # DarwinPorts
     /opt/csw/include # Blastwave
     /opt/include
     REQUIRED
 )
include_directories(${OPENJPEG_INCLUDE_DIR})

if(NOT WIN32)
    include(cmake/FindPROJ4.cmake)
    if(NOT PROJ4_FOUND)
      message(FATAL_ERROR "PROJ.4 library not found!")
    endif()
    include_directories(${PROJ4_INCLUDE_DIRS})
endif()
if(WIN32)
    find_library(PROJ4_LIBRARIES
        NAME "libproj.a"
        PATHS
        $ENV{EXTERNLIBS}/lib
         /opt/lib
        REQUIRED
    )
    find_path(PROJ4_INCLUDE_DIRS
         NAMES "proj_api.h"
         PATHS
         $ENV{EXTERNLIBS}/include
         /opt/include
         REQUIRED
     )
endif()
if(WIN32)
    message(STATUS "Search WIN32 BZIP2")
    find_library(BZIP2_LIBRARIES
        NAME "libbz2.a"
        PATHS
        $ENV{EXTERNLIBS}/lib
         /opt/lib
        REQUIRED
    )
    find_path(BZIP2_INCLUDE_DIR
         NAMES "bzlib.h"
         PATHS
         $ENV{EXTERNLIBS}/include
         /opt/include
         REQUIRED
     )
else()
    find_package(BZip2 REQUIRED)
endif()
include_directories(${BZIP2_INCLUDE_DIR})

if(WIN32)
    find_library(ZLIB_LIBRARIES
        NAME "libz.a"
        PATHS
        $ENV{EXTERNLIBS}/lib
        /opt/lib
        REQUIRED
    )
    find_path(ZLIB_INCLUDE_DIR
         NAMES "zlib.h"
         PATHS
         $ENV{EXTERNLIBS}/include
         /opt/include
         REQUIRED
     )
else()
    find_package(ZLIB REQUIRED)
endif()

include_directories(${ZLIB_INCLUDE_DIR})

if(WIN32)
    find_library(PNG_LIBRARIES
        NAME "libpng.a"
        PATHS
        $ENV{EXTERNLIBS}/lib
        /opt/lib
        REQUIRED
    )
    find_path(PNG_INCLUDE_DIR
         NAMES "png.h"
         PATHS
         $ENV{EXTERNLIBS}/include
         /opt/include
         REQUIRED
     )
else()
    find_package(PNG REQUIRED)
endif()

include_directories(${PNG_INCLUDE_DIR})

configure_file(cmake/Version.h.in ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/include/Version.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/include)

if(APPLE)
set(PREFIX_BIN ${PROJECT_NAME})
set(PREFIX_PKGDATA ${PROJECT_NAME})
endif()
if(WIN32)
set(PREFIX_BIN ".")
set(PREFIX_PKGDATA ".")
endif()
if(UNIX AND NOT APPLE)
# This is not exactly a good idea on linux - the code should be changed so that the executable would go to /usr/local/bin and the data to /usr/local/share/XyGrib
set(PREFIX_BIN ${PROJECT_NAME})
set(PREFIX_PKGDATA ${PROJECT_NAME})
endif()

add_subdirectory(src)
add_subdirectory(data/tr)

# Installation
# macOS bundle parameters
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/cmake/MacOSXBundleInfo.plist.in")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_ICON_FILE "xyGrib.icns")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_NAME}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${XYGRIB_VERSION}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${PROJECT_NAME}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING "${XYGRIB_VERSION}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_VERSION "${XYGRIB_VERSION}")
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_COPYRIGHT "${PROJECT_NAME} Authors")
# Install data
install(DIRECTORY data DESTINATION ${PREFIX_PKGDATA})
