############################################################################################
# cmake options:
#
#       -DCMAKE_BUILD_TYPE=Debug|RelWithDebInfo|Release|Production
#
#       -DCMAKE_MODULE_PATH=/path/to/ecbuild/cmake
#
#       -DCMAKE_C_COMPILER=gcc
#       -DCMAKE_C_COMPILER=g++
#
#       -DCMAKE_PREFIX_PATH=/path/to/jasper:/path/to/any/package/out/of/place
#       -DBUILD_SHARED_LIBS=OFF
#
#  Metview-specific:
#  -DMETVIEW_SITE=ecmwf | other
#  -DMETVIEW_SCRIPT=name-of-generated-startup-script
#  -DMARS_HOME=/path/to/MARS/home  (requires WITH_MARS=ON)
#  -DMAGICS_PATH=/path/to/magics   (requires WITH_PLOTTING=ON)
#  -DEXTRA_TITLE=extra-title-string
#  -DLOG_DIR=/path/to/dir/for/module/log/files
#  -DODB1_USE_SCRIPT_PATH=/path/to/odb1/use/script

cmake_minimum_required( VERSION 2.8.11 FATAL_ERROR )

project( metview C CXX Fortran)


# All executables and scripts apart from the startup script should go into MV_BIN_DIR.
# Users can override by setting METVIEW_INSTALL_EXE_BIN_DIR.
# It should be relative to the root of the install directory.
if(DEFINED METVIEW_INSTALL_EXE_BIN_DIR)
    set(MV_BIN_DIR ${METVIEW_INSTALL_EXE_BIN_DIR})
else()
    set(MV_BIN_DIR bin/metview_bin)
endif()


set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild/cmake")
set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE OFF)

set(INSTALL_BIN_DIR "${MV_BIN_DIR}" CACHE PATH "Metview installation directory for executable files")

include( ecbuild_system NO_POLICY_SCOPE )


ecbuild_requires_macro_version( 1.9 )

ecbuild_enable_fortran( REQUIRED )


###############################################################################
# some options of this project

option( ENABLE_UI            "enable the user interface"                          ON )
option( ENABLE_MOTIF         "enable the classic Motif-based user interface"      OFF )
option( ENABLE_PLOTTING      "enable the plotting module"                         ON )
option( ENABLE_OPERA_RADAR   "enable OPERA radar filter module (requires proj4)"  AUTO )
option( ENABLE_MARS          "enable MARS access"                                 OFF )
option( ENABLE_ODB           "enable ODB"                                         OFF )
option( ENABLE_MARS_ODB      "enable ODB in MARS"                                 OFF )
option( ENABLE_USAGE_LOG     "enable usage logging (only at ECMWF)"               OFF )
option( ENABLE_QT_DEBUG      "enable Qt debugging messages"                       OFF )
option( ENABLE_QT5           "enable Qt5"                                         OFF )
option( ENABLE_INPE          "enable INPE modules"                                ON )
option( ENABLE_URL_DOWNLOAD  "enable downloading of files from URLs"              ON )
option( ENABLE_WEATHER_ROOM  "enable Weather Room plot export (only at ECMWF)"    OFF )
option( ENABLE_NETWORK_PROXY "enable network proxy settings for WMS"              OFF )
option( ENABLE_EXPERIMENTAL  "enable experimental modules"                        OFF )
option( ENABLE_CONTRIB       "enable externally contributed modules"              OFF )
 
###############################################################################


# ensure we can add non-existent dependencies - required for generating icon files
if( ${CMAKE_VERSION} VERSION_GREATER "2.9.9" )
    cmake_policy(SET CMP0046 OLD)
endif()



# if we don't explicitly state that we're at ECMWF, then assume we're not, and use the generic config
if(NOT METVIEW_SITE STREQUAL ecmwf)
    set( SITE_WMO_CODE "255")    # DO WE NEED AN OPTION TO ALLOW INSTALLERS TO SPECIFY THIS?
    set( MV_ENVIRON    "common")
    set( AT_ECMWF "FALSE" )
    ecbuild_info("Building outside ECMWF")
else()
    set( SITE_WMO_CODE "098")
    set( MV_ENVIRON    "ecm_lnx64")
    set( AT_ECMWF "TRUE" )
    add_definitions( -DECMWF )
    ecbuild_info("Building inside ECMWF")
endif()


if(DEFINED EXTRA_CONFIG_PATH)
    ecbuild_info("Will search ${EXTRA_CONFIG_PATH} for additional config files")
endif()



# default startup script name
if(NOT DEFINED METVIEW_SCRIPT )
    set( METVIEW_SCRIPT "metview" )
endif()

set(FULL_STARTUP_SCRIPT_PATH ${CMAKE_BINARY_DIR}/bin/${METVIEW_SCRIPT})

# ensure we don't build shared libraries
set(BUILD_SHARED_LIBS OFF)


# Weather Room plot export (ECMWF only)
if(ENABLE_WEATHER_ROOM)
    if(AT_ECMWF)
        ecbuild_add_extra_search_paths( boost ) # Weather Room export needs Boost
        find_package( Boost 1.49.0 )            # Weather Room export needs Boost
        set(MV_WEATHER_ROOM_BUILT true)
    else()
        ecbuild_error("ENABLE_WEATHER_ROOM only available when building at ECMWF")
    endif()
else()
    set(MV_WEATHER_ROOM_BUILT false)
endif()


if(ENABLE_INPE)
    set(METVIEW_INPE true)
endif()


# --------------------------------
# look for MARS client source code
# --------------------------------

if(MARS_SOURCE_PATH)
    # if the user specified a path, then only look there
    set(MARS_SOURCE_PATHS ${MARS_SOURCE_PATH}/src)
else()
    # otherwise look in some default locations
    set(MARS_SOURCE_PATHS ${CMAKE_SOURCE_DIR}/src/libMars         # embedded in source
                          ${CMAKE_SOURCE_DIR}/src/libMarsClient   # embedded in source
                          ${CMAKE_SOURCE_DIR}/mars-client/src     # bundle
                          ${CMAKE_SOURCE_DIR}/mars_client/src     # bundle
                          ${CMAKE_SOURCE_DIR}/../client/src       # in external dir
                          ${CMAKE_SOURCE_DIR}/../mars-client/src  # in external dir
                          ${CMAKE_SOURCE_DIR}/../mars_client/src) # in external dir
endif()

ecbuild_debug("Looking for MARS source in ${MARS_SOURCE_PATHS}")
find_path( MARS_SOURCE request.c
           HINTS ${MARS_SOURCE_PATHS}
           PATH_SUFFIXES src
           DOC "Path to MARS client source code"
           NO_DEFAULT_PATH )

if (MARS_SOURCE)
    ecbuild_info("Found MARS source at ${MARS_SOURCE}")
else()
    ecbuild_critical("MARS source is required, but was not found in  ${MARS_SOURCE_PATHS}")
endif()


# ensure the MARS client source is included in the tarball (if necessary)
if(NOT ${MARS_SOURCE} STREQUAL ${CMAKE_SOURCE_DIR}/src/libMars)
    list( APPEND CPACK_SOURCE_INSTALLED_DIRECTORIES
            "${MARS_SOURCE}" "src/libMarsClient")
endif()



# look for curl because it is needed for the Mars Web API client
find_package(CURL)

# local MARS access
if(ENABLE_MARS)
    set( MARS_ACCESS MARS_local )
    set( METVIEW_MARS 1 )
    if(DEFINED MARS_LOCAL_HOME)
        ecbuild_info("MARS_LOCAL_HOME=${MARS_LOCAL_HOME}")
        if(NOT EXISTS ${MARS_LOCAL_HOME})
            ecbuild_critical("MARS_LOCAL_HOME (${MARS_LOCAL_HOME}) does not exist")
        else()
            set(MARS_HOME ${MARS_LOCAL_HOME})
        endif()
    else()
        ecbuild_critical("If setting local MARS access, -DMARS_LOCAL_HOME=/path/to/mars/home must be provided.")
    endif()


    # FDB
    ecbuild_add_option( FEATURE FDB5
        DEFAULT OFF
        DESCRIPTION "support for FDB5"
        REQUIRED_PACKAGES "PROJECT mars-server VERSION 7.7" )




    if(AT_ECMWF)
        ecbuild_use_package( PROJECT FDB REQUIRED )
    else()
        ecbuild_use_package( PROJECT FDB )
    endif()

    ecbuild_debug("FDB: ${FDB_LIBRARIES}")

    if( NOT FDB_FOUND )
        ecbuild_info("NO FDB")
    endif()


    if(ENABLE_MARS_ODB)
        set(ENABLE_ODB 1)
        set(METVIEW_MARS_ODB 1)
    endif()

    #find_library( FDB  REQUIRED )
    #ecbuild_debug("FDB: ${FDB_LIBRARIES}" )

else()
    if(${CURL_FOUND})
        set( MARS_ACCESS MARS_webapi )
    else()
        set( MARS_ACCESS MARS_none )
        add_definitions(-DNOCURL)
        ecbuild_warn("Could not find the Curl library - disabling Web API Mars")
    endif()
endif()


# Network access (download via URLs)
if(ENABLE_URL_DOWNLOAD)
    if(NOT CURL_FOUND)
        ecbuild_critical("URL_DOWNLOAD was enabled, but the 'curl' development package was not found.")
    endif()
endif()




###############################################################################
# local project requirements

# ecbuild_use_package( PROJECT eckit VERSION 0.3 REQUIRED )



set( ECCODES_FAIL_MSG "Note: grib_api can be used instead (select with -DENABLE_ECCODES=OFF), "
                      "but we strongly advise you to upgrade to ecCodes. "
                      "See https://software.ecmwf.int/wiki/display/ECC/ecCodes+Home\n" )
ecbuild_add_option( FEATURE ECCODES DESCRIPTION "Use eccodes instead of grib_api"
                    REQUIRED_PACKAGES "PROJECT eccodes VERSION 0.14 REQUIRED FAILURE_MSG ECCODES_FAIL_MSG"
                    DEFAULT ON )
 
if( HAVE_ECCODES )
  set( GRIB_API_INCLUDE_DIRS  ${ECCODES_INCLUDE_DIRS} )
  set( GRIB_API_LIBRARIES     ${ECCODES_LIBRARIES} )
  set( GRIB_API_DEFINITIONS   ${ECCODES_DEFINITIONS} )
  set( GRIB_API_TPL_LIBRARIES ${ECCODES_TPL_LIBRARIES} )
  set( grib_api_BASE_DIR      ${eccodes_BASE_DIR} )
  add_definitions(-DGRIB_HANDLING_PACKAGE=ecCodes)
else()
  ecbuild_use_package( PROJECT grib_api VERSION 1.14.3 REQUIRED
                       FAILURE_MSG "We strongly advise to use ecCodes (enable with -DENABLE_ECCODES=ON)" )
  add_definitions(-DGRIB_HANDLING_PACKAGE=GRIB_API)
endif()


if(ENABLE_ODB)
    ecbuild_use_package( PROJECT odb_api  VERSION 0.10.1 ) # requires at least this version
    if( ODB_API_FOUND )

        set( METVIEW_ODB_API_LIBRARIES Odb )
        # does this version use eckit?
        list(FIND ODB_API_LIBRARIES eckit ODB_ECKIT_INDEX)
   

        if ((NOT ODB_ECKIT_INDEX EQUAL -1) OR (DEFINED ODB_ECKIT))  # is an eckit version
            if (DEFINED SEPARATE_ECKIT)
                ecbuild_use_package( PROJECT eckit VERSION 0.6 REQUIRED )
            endif()
            add_definitions(-DODB_ECKIT)
        endif()

        set(METVIEW_ODB 1)

        if(ODB_API_PATH)
            set(ODB_API_LIB_DIR ${ODB_API_PATH}/lib)
            set(ODB_API_BIN_DIR ${ODB_API_PATH}/bin)
        endif()

        add_definitions(-DMETVIEW_ODB_NEW -DMETVIEW_ODB)
        set(METVIEW_ODB_API_INCLUDE_DIRS ${ODB_API_INCLUDE_DIRS}
                                         ${ODB_API_INCLUDE_DIRS}/..
                                         ${ODB_API_INCLUDE_DIRS}/../eclib
                                         ${ODB_API_INCLUDE_DIRS}/../eclib/eclib
                                         ${ODB_API_INCLUDE_DIRS}/odblib
                                         ${ECKIT_INCLUDE_DIRS}) 
    else()
        if(ENABLE_MARS_ODB)
            ecbuild_critical("ENABLE_ODB was set, but ODB not found")
            set(ENABLE_MARS_ODB 0)
            set(METVIEW_MARS_ODB 0)
        endif()
    endif()
    ###list( APPEND METVIEW_TPLS odb_api )


    # ODB-1

    ecbuild_use_package( PROJECT ODB )
    
    if(ODB_FOUND)
        if(EXISTS ${ODB_PATH}/bin)
            if(EXISTS ${ODB_PATH}/bin/odbsql)
                add_definitions(-DMETVIEW_ODB_OLD)
                set(ENABLE_ODB1 "ON")

                if(ODB1_USE_SCRIPT) # was an ODB-1 use script name passed?
                    set(ODB1_LOAD_ENV "MV_ODB1_USE_SCRIPT=${ODB1_USE_SCRIPT}")
                endif()

                if(ODB1_MODULE) # was an ODB-1 module name passed?
                    set(ODB1_LOAD_ENV "MV_ODB1_MODULE=${ODB1_MODULE}")
                endif()

                if(ODB1_VERSION) # was an ODB-1 module name passed?
                    set(MV_ODB1_VERSION ${ODB1_VERSION})
                else()
                    set(MV_ODB1_VERSION "ANY")
                endif()

            else()
                ecbuild_warn("ODB-1 support is DISABLED - No odbsql script found in ${ODB_PATH}/bin")
            endif()
        else()
            ecbuild_warn("ODB-1 found, but no bin directory in ${ODB_PATH}")
        endif()
    else()
        ecbuild_warn("ODB-1 not found!")
    endif()
endif()


ecbuild_use_package( PROJECT libemos VERSION 4.0.5 REQUIRED )

if(ENABLE_PLOTTING)
    ecbuild_use_package( PROJECT magics VERSION 2.24.4)
    if( MAGICS_FOUND )

        set(MAGICS_LIB_DIR "${magics_BASE_DIR}/lib")

        if(ENABLE_UI AND (NOT MAGICS_HAVE_METVIEW))
            ecbuild_critical("Magics must be built with Metview and Qt support!")
        endif()

        if((NOT ENABLE_UI) AND (NOT MAGICS_HAVE_METVIEW_NO_QT))
            ecbuild_critical("No UI: Magics must be built with Metview but no Qt support!")
        endif()

        if(NOT MAGICS_HAVE_NETCDF)
            ecbuild_critical("Magics must be built with netCDF support!")
        endif()

        if(MAGICS_HAVE_ODB)
            add_definitions(-DMETVIEW_ODB_PLOT)
        else()
            if(ENABLE_ODB)
                ecbuild_warn("ODB plotting is disabled, because Magics was built without ODB support! Please, rebuild Magics with ODB support to enable ODB plotting!")  #xxx should be at end
            endif()
        endif()

        if(NOT MAGICS_HAVE_CAIRO)
            ecbuild_warn("NO PNG and PDF plotting support (disabled in Magics)")  #xxx should be at end
        endif()

        if(NOT MAGICS_HAVE_BUFR)
            ecbuild_warn("NO BUFR plotting support (disabled in Magics)")  #xxx should be at end
        endif()

    else()
        ecbuild_critical("Magics was not found, and it is required if ENABLE_PLOTTING=ON. Please supply MAGICS_PATH if necessary.")
    endif()
endif()


ecbuild_declare_project()
ecbuild_debug("VERSION: ${METVIEW_VERSION_STR}")

###############################################################################
# Find external dependencies

#set( CMAKE_THREAD_PREFER_PTHREAD 1 )
#find_package( Threads ) 

#ecbuild_add_extra_search_paths( boost )
#find_package( Boost 1.49.0 )


# some systems require libquadmath, so we add it if it exists on the system
# NOTE that it should not really be necessary - it is a MISTAKE to require
# to link quadmath, but it can easily happen...

if(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
    find_library(QUADMATH_LIB quadmath)
    if(QUADMATH_LIB)
        ecbuild_debug("quadmath found: ${QUADMATH_LIB}")
        list( APPEND METVIEW_EXTRA_LIBRARIES ${QUADMATH_LIB} )
    else()
        # sometimes CMake does not properly detect libquadmath

        if (EXISTS /usr/lib64/libquadmath.so.0)
            list( APPEND METVIEW_EXTRA_LIBRARIES /usr/lib64/libquadmath.so.0 )
        endif()
    endif()
endif()


find_library(PTHREAD_LIB pthread)
if(PTHREAD_LIB)
    ecbuild_debug("pthread found: ${PTHREAD_LIB}")
else()
    ecbuild_critical("library pthread not found")
endif()



if(NOT (ENABLE_OPERA_RADAR STREQUAL "OFF"))

    find_package(Proj4)

    if(NOT DEFINED PROJ4_FOUND)
        if(ENABLE_OPERA_RADAR STREQUAL "ON") # user wanted library, but it could not be found
            ecbuild_critical("proj4 library not found - it is required for OPERA radar support (or set ENABLE_OPERA_RADAR=OFF)")
        else()
            set(ENABLE_OPERA_RADAR "OFF")    # not found, but setting=AUTO so just set it to OFF
        endif()
    else()
        set(ENABLE_OPERA_RADAR "ON")
        ecbuild_debug("OPERA Radar enabled - proj 4 include: ${PROJ4_INCLUDE_DIRS}")
        ecbuild_debug("OPERA Radar enabled - proj 4 lib:     ${PROJ4_LIBRARIES}")
    endif()

endif()


# FLEXTRA

if(DEFINED FLEXTRA_PATH)
    if(EXISTS ${FLEXTRA_PATH})
        set(MV_FLEXTRA_PATH_SET "MV_FLEXTRA_EXE=${FLEXTRA_PATH}")
    else()
        ecbuild_critical("FLEXTRA_PATH: (${FLEXTRA_PATH}) does not exist")
    endif()
endif()



# Network proxy

if(ENABLE_NETWORK_PROXY)
    if(NOT DEFINED PROXY_URL)
        ecbuild_critical("ENABLE_NETWORK_PROXY is ON but PROXY_URL is not defined")
    endif()

    if(NOT DEFINED PROXY_PORT)
        ecbuild_critical("ENABLE_NETWORK_PROXY is ON but PROXY_PORT is not defined")
    endif()

    if(NOT DEFINED NO_PROXY_FOR)
        ecbuild_critical("ENABLE_NETWORK_PROXY is ON but NO_PROXY_FOR is not defined")
    endif()

    set(USE_NETWORK_PROXY YES)
else()
    set(USE_NETWORK_PROXY NO)
    set(PROXY_URL proxy.url)  # does not matter what it is in this case
    set(PROXY_PORT 1234)      # does not matter what it is in this case
    set(NO_PROXY_FOR none)    # does not matter what it is in this case
endif()



# find_package( EXPAT  )

find_package(FLEX  REQUIRED)
find_package(BISON REQUIRED)


# netCDF
# NEW system with ecBuild 1.6.0
set( NETCDF_CXX 1 )
find_package( NetCDF 4 COMPONENTS CXX)
if( NETCDF_FOUND )
    list( APPEND METVIEW_TPLS  NetCDF )
else()
    ecbuild_critical("NetCDF was not found")
endif()


find_library(GDBM_LIB gdbm )
find_path( GDBM_INCLUDE gdbm.h )
if(GDBM_LIB AND GDBM_INCLUDE)
    ecbuild_debug("gdbm found")
    ecbuild_debug("  library: ${GDBM_LIB}")
    ecbuild_debug("  include: ${GDBM_INCLUDE}")
else()
    ecbuild_critical("library gdbm not found")
endif()


if( ENABLE_UI )

 if( ENABLE_QT5 )

      if( ENABLE_MOTIF )
        ecbuild_critical("Metview does not support the Motif user interface with Qt5. Please set ENABLE_MOTIF=OFF in the CMake arguments")
      endif()

      find_package(Qt5Widgets      REQUIRED)
      find_package(Qt5Gui          REQUIRED)
      find_package(Qt5Network      REQUIRED)
      find_package(Qt5Xml          REQUIRED)
      find_package(Qt5XmlPatterns  REQUIRED)
      find_package(Qt5PrintSupport REQUIRED)
      find_package(Qt5Svg          REQUIRED)

      #if( ENABLE_MOTIF )
        #find_package(Qt5X11Extras REQUIRED)
        # we would add this to include_directories()  : ${Qt5X11Extras_INCLUDE_DIRS}
        # But... the X11 interface has changed in Qt5 and there's probably no demand
        # to support both Motif and Qt anymore.
      #endif()

      if( Qt5Widgets_FOUND )
          ecbuild_debug("Qt5 version ${Qt5Widgets_VERSION_STRING} was found")
          include_directories(${Qt5Widgets_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} ${Qt5XmlPatterns_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS} ${Qt5PrintSupport_INCLUDE_DIRS})
          set( METVIEW_QT 1)
          set( METVIEW_QT5 true)
          add_definitions( -DMETVIEW_QT5 )
      else()
          ecbuild_critical("Qt5 was NOT found ...")
      endif()
  else( ENABLE_QT5 )
    find_package(Qt4 4.6.2 REQUIRED QtCore QtNetwork QtGui QtXml QtXmlPatterns QtSvg) #  QtWebKit QtHelp
    if( QT_FOUND )
        include( ${QT_USE_FILE} )
        set( METVIEW_QT 1)
    else()
        ecbuild_critical("Qt not found - this is required for the user interface")
    endif()
  endif( ENABLE_QT5 )


    if( ENABLE_MOTIF )
      find_package(Motif REQUIRED)
      if(MOTIF_FOUND)
        ecbuild_debug("MOTIF_INCLUDE_DIR:  ${MOTIF_INCLUDE_DIR}")
        ecbuild_debug("MOTIF_LIBRARIES:    ${MOTIF_LIBRARIES}")
      endif()
      add_definitions( -DMETVIEW_MOTIF )
    endif()

    find_package(X11 REQUIRED)
    if(X11_FOUND)
        # hack? we want to use the R6 version if available
        ecbuild_debug("X11_INCLUDE_DIR:  ${X11_INCLUDE_DIR}")
        set(X11_INCLUDE_DIR "/usr/X11R6/include;\;${X11_INCLUDE_DIR}")
        ecbuild_debug("X11_INCLUDE_DIR:  ${X11_INCLUDE_DIR}")
        ecbuild_debug("X11_LIBRARIES:    ${X11_LIBRARIES}")
        if(X11_Xpm_FOUND)
            ecbuild_debug("  X11_Xpm_INCLUDE_PATH:  ${X11_Xpm_INCLUDE_PATH}")
            ecbuild_debug("  X11_Xpm_LIB:           ${X11_Xpm_LIB}  (adding to X11_LIBRARIES)")
            list(APPEND X11_INCLUDE_DIR ${X11_Xpm_INCLUDE_PATH})
            list(APPEND X11_LIBRARIES   ${X11_Xpm_LIB})
        endif()

        # some platforms (e.g. openSUSE 13.1) also require libXt in the link command
        if(X11_Xt_FOUND)
            ecbuild_debug("  X11_Xt_INCLUDE_PATH:  ${X11_Xt_INCLUDE_PATH}")
            ecbuild_debug("  X11_Xt_LIB:           ${X11_Xt_LIB}  (adding to X11_LIBRARIES)")
            list(APPEND X11_INCLUDE_DIR ${X11_Xt_INCLUDE_PATH})
            list(APPEND X11_LIBRARIES   ${X11_Xt_LIB})
        else()
            ecbuild_warn("NO X11 Xt found!!!!!!!")
        endif()
   
        # some platforms (e.g. openSUSE 13.1) also require libXmu in the link command
        if(X11_Xmu_FOUND)
            ecbuild_debug("  X11_Xmu_INCLUDE_PATH:  ${X11_Xmu_INCLUDE_PATH}")
            ecbuild_debug("  X11_Xmu_LIB:           ${X11_Xmu_LIB}  (adding to X11_LIBRARIES)")
            list(APPEND X11_INCLUDE_DIR ${X11_Xmu_INCLUDE_PATH})
            list(APPEND X11_LIBRARIES   ${X11_Xmu_LIB})
        else()
            ecbuild_warn("NO X11 Xmu found!!!!!!!")
        endif()

    else()
        ecbuild_warn("X11 NOT FOUND")
    endif()

    set( METVIEW_GUI_BUILT true )
else()
    set( METVIEW_GUI_BUILT false )
endif()



if( NOT ENABLE_QT_DEBUG )
    add_definitions( -DQT_NO_DEBUG_OUTPUT )
endif()



###############################################################################
# contents

######set( METVIEW_TPLS grib_api odb_api EXPAT NetCDF PangoCairo Proj4 libemos)

set( METVIEW_STANDARD_INCLUDE_DIRS 
        ${CMAKE_CURRENT_SOURCE_DIR}/src/libMetview
        ${CMAKE_CURRENT_SOURCE_DIR}/src/libUtil
        ${MARS_SOURCE}
        ${CMAKE_CURRENT_SOURCE_DIR}/src/libMars
        ${CMAKE_CURRENT_BINARY_DIR}/src/libMars        # for generated header files
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/src/libFTimeUtil
        ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvNetCDF
        ${Boost_INCLUDE_DIRS} )

if (MOTIF_FOUND)
    set(METVIEW_MOTIF_LIBS MvMotif)
    set(METVIEW_MOTIF_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvMotif)
endif()


if( METVIEW_ODB )
    list( APPEND METVIEW_STANDARD_INCLUDE_DIRS
        ${CMAKE_CURRENT_SOURCE_DIR}/src/Odb 
        ${ODB_API_INCLUDE_DIRS}/../eclib 
    )
endif()

set(STANDARD_METVIEW_LIBS Metview FTimeUtil Util MvNetCDF MvMars ${LIBEMOS_LIBRARIES}) ### ${METVIEW_3RDPARTY_LIBS}"
set(METVIEW_MACRO_API_F90_LIB macro_api_f90)

unset( LIBEMOS_DEFINITIONS ) # no need to use exported libemos definitions 

# only want certain third-party libraries linked with all modules - the rest
# are on a per-module basis
set(METVIEW_TPLS grib_api NetCDF)
foreach( _tpl ${METVIEW_TPLS} )
    string( TOUPPER ${_tpl} TPL )
    list( APPEND METVIEW_EXTRA_DEFINITIONS   ${${TPL}_DEFINITIONS}  )
    list( APPEND METVIEW_EXTRA_INCLUDE_DIRS  ${${TPL}_INCLUDE_DIRS} )
    list( APPEND METVIEW_EXTRA_LIBRARIES     ${${TPL}_LIBRARIES} )
    ecbuild_debug("xTPL_LIBRARIES: ${TPL}_LIBRARIES")
endforeach()


###list( APPEND METVIEW_EXTRA_DEFINITIONS   fortfloat=double fortint=int boolean=bool )

if( ENABLE_UI )
  if( METVIEW_QT5 )
    list( APPEND METVIEW_QT_INCLUDE_DIRS ${Qt5Widgets_INCLUDE_DIR} ${Qt5Gui_INCLUDE_DIR} ${Qt5Xml_INCLUDE_DIR} ${Qt5XmlPatterns_INCLUDE_DIR} ${Qt5Network_INCLUDE_DIR} ${Qt5PrintSupport_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvQtUtil ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvQtGui )
    list( APPEND METVIEW_QT_LIBRARIES  MvQtGui MvQtUtil ${Qt5Widgets_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5XmlPatterns_LIBRARIES} ${Qt5Network_LIBRARIES} ${Qt5PrintSupport_LIBRARIES})
  else()
    list( APPEND METVIEW_QT_INCLUDE_DIRS  ${QT_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvQtUtil ${CMAKE_CURRENT_SOURCE_DIR}/src/libMvQtGui )
    list( APPEND METVIEW_QT_LIBRARIES     MvQtGui MvQtUtil ${QT_LIBRARIES} )
endif()
endif()


ecbuild_info("METVIEW_EXTRA_DEFINITIONS  => ${METVIEW_EXTRA_DEFINITIONS}")
ecbuild_info("METVIEW_EXTRA_INCLUDE_DIRS => ${METVIEW_EXTRA_INCLUDE_DIRS}")
ecbuild_info("METVIEW_EXTRA_LIBRARIES    => ${METVIEW_EXTRA_LIBRARIES}")
ecbuild_info("STANDARD_METVIEW_LIBS      => ${STANDARD_METVIEW_LIBS}")
ecbuild_info("LIBEMOS_LIBRARIES          => ${LIBEMOS_LIBRARIES}")


###get_directory_property( MAGICS_DEFINITIONS COMPILE_DEFINITIONS )

# we need to make sure that 
#set(CMAKE_INCLUDE_DIRECTORIES_BEFORE "ON")

###include_directories( ${METVIEW_INCLUDE_DIRS} ${METVIEW_EXTRA_INCLUDE_DIRS} )
set(METVIEW_STANDARD_INCLUDES ${METVIEW_STANDARD_INCLUDE_DIRS} ${METVIEW_EXTRA_INCLUDE_DIRS} )
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib )
ecbuild_info("METVIEW_STANDARD_INCLUDE_DIRS  => ${METVIEW_STANDARD_INCLUDES}")


set(  __metview_inc_tmp ${METVIEW_EXTRA_INCLUDE_DIRS} )
set(METVIEW_EXTRA_INCLUDES "")

foreach( inc ${__metview_inc_tmp} ) 
  set(METVIEW_EXTRA_INCLUDES "${METVIEW_EXTRA_INCLUDES} -I${inc}" )
endforeach()

### from MARS add_definitions( -DECMWF -DR64 -DODB_SUPPORT )

add_definitions( -DR64 -DMETVIEW -DH_INCLUDES_CC -DUSE_NEW_IO )

# ecbuild automatically test endiness and sets variable EC_BIG_ENDIAN or EC_LITTLE_ENDIAN
if( EC_LITTLE_ENDIAN )
	add_definitions(-DLITTLE_END) # needed for libMars/bufr.h
endif()

# -------------------------
# compiler-specific options
# -------------------------

if     (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
    ecbuild_add_cxx_flags("-fpermissive -Wno-write-strings -Wno-deprecated")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "clang" )
    ecbuild_add_cxx_flags("-fpermissive -Wno-deprecated -undefined dynamic_lookup")
endif()

if     (CMAKE_C_COMPILER_ID STREQUAL "clang" )
    ecbuild_add_c_flags("-undefined dynamic_lookup")     #  "-fno-common  -mmacosx-version-min=10.8")
endif()


# Fortran flags

# ensure double-precision REALs

if(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI")
    ecbuild_add_fortran_flags("-r8")
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
    ecbuild_add_fortran_flags("-r8")
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
    # NOTE that if we add -fdefault-real-8 then we NEED -fdefault-double-8 to avoid quadmath
    ecbuild_add_fortran_flags("-fdefault-real-8 -fdefault-double-8")
endif()

# for grib_api.mod
if(GRIB_API_INCLUDE_DIR)
    ecbuild_add_fortran_flags("-I${GRIB_API_INCLUDE_DIR}")
endif()


# we have to create the share directories now, because otherwise module-specific
# etc/xpm files will be copied to etc before it is created and etc will become a
# file rather than a directory
make_directory(${CMAKE_BINARY_DIR}/share/metview/etc/)
make_directory(${CMAKE_BINARY_DIR}/share/metview/icons/)


set(ModuleObjectSpecFiles) # empty to start with
set(ModuleXpmFiles)        # empty to start with
set(ModuleSvgFiles)        # empty to start with


# ------------------------------------------------------------------------
# MACRO metview_module_files
# Ensures the files listed in ETC_FILES are copied to the build directory
# and that they will be installed at install time. Same with icon files,
# but they will additionally be added to a list of files to convert.
# ------------------------------------------------------------------------

macro(metview_module_files)
    set(options )
    set(single_value_args )
    set(multi_value_args ETC_FILES XPM_FILES SVG_FILES)
    cmake_parse_arguments( PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )

    foreach( etc ${PAR_ETC_FILES} )
        # copy to the build 'etc' directory
        configure_file(${etc} ${CMAKE_BINARY_DIR}/share/metview/etc/ COPYONLY)


        # ensure file is installed at install time
        install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/${etc}  
                 DESTINATION share/metview/etc
                 PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)


        # pick out the ObjectSpec files and add them to a list which we propagate to
        # the parent scope so that it is shared between all directories
        if(${etc} MATCHES ObjectSpec*)
            set(ModuleObjectSpecFiles ${ModuleObjectSpecFiles} ${CMAKE_BINARY_DIR}/share/metview/etc/${etc})
            set(ModuleObjectSpecFiles ${ModuleObjectSpecFiles} PARENT_SCOPE) # make it visible outside
        endif()

    endforeach()

    foreach( xpm ${PAR_XPM_FILES} )
        # copy to the build 'etc' directory
        set(ModuleXpmFiles ${ModuleXpmFiles} ${CMAKE_CURRENT_SOURCE_DIR}/${xpm})
        set(ModuleXpmFiles ${ModuleXpmFiles}  PARENT_SCOPE)

        #configure_file(${xpm} ${CMAKE_BINARY_DIR}/share/metview/icons/ COPYONLY)


        # ensure file is installed at install time
        #install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/${xpm}  
        #         DESTINATION share/metview/xpm
        #         PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)

    endforeach()

    foreach( svg ${PAR_SVG_FILES} )

        # copy to the build 'etc' directory
        set(ModuleSvgFiles ${ModuleSvgFiles} ${CMAKE_CURRENT_SOURCE_DIR}/${svg})
        set(ModuleSvgFiles ${ModuleSvgFiles}  PARENT_SCOPE)

    endforeach()

endmacro()


# ------------------------------------------------------------------------
# MACRO metview_script_files
# Ensures the files listed in SCRIPT_FILES are copied to the build
# directory and that they will be installed at install time.
#
# Searches in the current source directory, EXTRA_CONFIG_PATH if given and
# metview-ecmwf-configs inside and parallel to the metview source root.
# ------------------------------------------------------------------------

macro(metview_script_files)
    set(options )
    set(single_value_args )
    set(multi_value_args SCRIPT_FILES)
    cmake_parse_arguments( PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )

    foreach( script ${PAR_SCRIPT_FILES} )

        find_file( SCRIPT_${script} ${script}
                   PATHS ${CMAKE_CURRENT_SOURCE_DIR}
                         ${EXTRA_CONFIG_PATH}
                         ${CMAKE_SOURCE_DIR}/metview-ecmwf-configs
                         ${CMAKE_SOURCE_DIR}/../metview-ecmwf-configs )

        if( NOT SCRIPT_${script} )
          ecbuild_critical( "Could not find script ${script}. Specify the path to the script with -DEXTRA_CONFIG_PATH=...")
        else()
          ecbuild_debug("metview_script_files: found ${script} at ${SCRIPT_${script}}")
        endif()

        # we need this line to ensure that the target/dependency relationship is correct
        configure_file( ${SCRIPT_${script}} ${CMAKE_BINARY_DIR}/bin COPYONLY)


        # copy to the build 'bin' directory, setting exe permissions
        file(COPY ${SCRIPT_${script}}
             DESTINATION ${CMAKE_BINARY_DIR}/bin
             FILE_PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ OWNER_EXECUTE GROUP_EXECUTE
             )


        # ensure file is installed at install time
        install( FILES ${CMAKE_BINARY_DIR}/bin/${script}
                 DESTINATION ${MV_BIN_DIR}
                 PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)

    endforeach()

endmacro()




# ---------------------------
# traverse the subdirectories
# ---------------------------

# source files
add_subdirectory( src )

if(ENABLE_CONTRIB)
    add_subdirectory( contrib )
endif()

add_subdirectory( scripts )
add_subdirectory( share )
add_subdirectory( test )


if(AT_ECMWF)
    add_subdirectory( docs/confluence )
endif()


# install the metview.desktop file
install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/metview.desktop
         DESTINATION share/applications/
         PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ )



### not for Metview?? configure_file( metview-config.in  metview-config @ONLY )                    

#ecbuild_dont_pack(REGEX "~*")
ecbuild_dont_pack(REGEX "src/*.xd")
ecbuild_dont_pack(REGEX "*.mdbg")
ecbuild_dont_pack(REGEX "share/metview/icons/*.svg")
ecbuild_dont_pack(REGEX "configure*.sh")
ecbuild_dont_pack(REGEX "Makefile.am")
ecbuild_dont_pack(REGEX "Makefile.in")
#ecbuild_dont_pack(DIRS  "rpms;metview-ecmwf-configs" )
#ecbuild_dont_pack(REGEX "metview-ecmwf-configs/*")
ecbuild_dont_pack(FILES "rpms;metview-ecmwf-configs;bamboo" )

ecbuild_dont_pack(DIRS  "m4/;src/libMars-Odb;src/libMars-old;src/MvApp/MARS")
ecbuild_dont_pack(DIRS  "src/DataAccess;src/ForwardApp")
ecbuild_dont_pack(DIRS  "share/metview/etc/MSMARS")
#ecbuild_add_resources(TARGET all SOURCES_PACK src/libMars/MARS/mars.h)
#ecbuild_pack(FILES src/libMars/MARS/mars.h)
ecbuild_dont_pack(FILES "README.ECMWF.Obsoletes;" )
ecbuild_dont_pack(FILES "README.developers" )
ecbuild_dont_pack(FILES "license.pl;LICENSE_for_source_files.txt" )
ecbuild_dont_pack(FILES "license_dir.sh;license_log.txt;prepare_new_p4_view" )
ecbuild_dont_pack(FILES "bootstrap;version.sh;ecmwf_setup.sh;configure.ecmwf;src/generateNewModule.sh" )

ecbuild_dont_pack(FILES "share/metview/etc_mv3;share/metview/icons_mv3;src/xd" )
ecbuild_dont_pack(FILES "lib;bin;config" )
ecbuild_dont_pack(FILES "metview.sublime-workspace;metview.sublime-project;autom4te.cache;aux_build;docs" )
ecbuild_dont_pack(FILES "MetviewFixLog" )
ecbuild_dont_pack(FILES "src/Traj" )
ecbuild_dont_pack(FILES "src/Budget" )
ecbuild_dont_pack(FILES "src/TropCycTrack" )
ecbuild_dont_pack(FILES "share/metview/grib_seed" )


#file(GLOB_RECURSE IGNORE_FILES_XD  "${CMAKE_SOURCE_DIR}/src/*.xd")
#file(GLOB IGNORE_FILES_SVG "${CMAKE_SOURCE_DIR}/share/metview/icons/*.svg")
#file(GLOB IGNORE_FILES_CONFIGURE "${CMAKE_SOURCE_DIR}/configure.*")
#file(GLOB IGNORE_FILES_MAKEFILES_AM "${CMAKE_SOURCE_DIR}/*/*/Makefile.am")
#file(GLOB IGNORE_FILES_MAKEFILES_IN "${CMAKE_SOURCE_DIR}/*/*/Makefile.in")
#file(GLOB IGNORE_FILES_LOCAL_ECM    "${CMAKE_SOURCE_DIR}/scripts/metview_local*.ecm_*")

#SET(ECBUILD_DONT_PACK_FILES "${CMAKE_BINARY_DIR}/;${CMAKE_SOURCE_DIR}/m4/;${CMAKE_SOURCE_DIR}/src/libMars-Odb/MARS/")
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/LICENSE_for_source_files.txt;" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/README.ECMWF.Obsoletes;" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/README.developers" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/license.pl;${CMAKE_SOURCE_DIR}/LICENSE_for_source_files.txt" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/license_dir.sh;${CMAKE_SOURCE_DIR}/license_log.txt;${CMAKE_SOURCE_DIR}/prepare_new_p4_view" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/ecmwf_setup.sh;${IGNORE_FILES_CONFIGURE}" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${IGNORE_FILES_MAKEFILES_AM};${IGNORE_FILES_MAKEFILES_IN};${IGNORE_FILES_LOCAL_ECM}" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/scripts/mv_cp" )


#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/share/metview/etc_mv3;${CMAKE_SOURCE_DIR}/share/metview/icons_mv3;${CMAKE_SOURCE_DIR}/src/xd;${CMAKE_SOURCE_DIR}/src/MarsCatalog" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/lib;${CMAKE_SOURCE_DIR}/bin;${CMAKE_SOURCE_DIR}/config" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/autom4te.cache;${CMAKE_SOURCE_DIR}/aux_build;${CMAKE_SOURCE_DIR}/docs" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/rpms;${CMAKE_SOURCE_DIR}/tools" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${IGNORE_FILES_XD};${IGNORE_FILES_SVG}" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/src/Traj" )
#list( APPEND ECBUILD_DONT_PACK_FILES "${CMAKE_SOURCE_DIR}/share/metview/grib_seed" )

#ecbuild_debug("NOPACK: ${ECBUILD_DONT_PACK_FILES}")

#CPACK_SOURCE_IGNORE_FILES

#ecbuild_add_resources(TARGET package_source SOURCES_PACK ${CMAKE_CURRENT_SOURCE_DIR}/../ecbuild/cmake/ecbuild_find_python.cmake)

############################################################################################
# finalize


# print all variables
#get_cmake_property(_variableNames VARIABLES)
#foreach (_variableName ${_variableNames})
#    ecbuild_info("${_variableName}=${${_variableName}}")
#endforeach()


ecbuild_install_project( NAME Metview )

ecbuild_print_summary()

