cmake_minimum_required( VERSION 3.1 FATAL_ERROR )

project( mars_client C CXX )

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

include( ecbuild_system NO_POLICY_SCOPE )

ecbuild_requires_macro_version( 2.9 )

ecbuild_declare_project()

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

###############################################################################
### dependencies

option( ECMWF "build the client as for ECMWF"  OFF )

### eccodes

ecbuild_use_package( PROJECT eccodes VERSION 0.14 REQUIRED )
set( GRIB_API_INCLUDE_DIRS ${ECCODES_INCLUDE_DIRS} )
set( GRIB_API_LIBRARIES    ${ECCODES_LIBRARIES} )
set( GRIB_API_DEFINITIONS  ${ECCODES_DEFINITIONS} )
set( grib_api_BASE_DIR     ${eccodes_BASE_DIR} )

### eckit

ecbuild_add_option( FEATURE UDP_STATS
    DESCRIPTION "Send statistics over UDP"
    DEFAULT ON
    REQUIRED_PACKAGES "PROJECT eckit  VERSION 1.0" )

if( HAVE_UDP_STATS )
    list( APPEND MARS_FEATURE_LIBRARIES eckit )
endif()

### mir

ecbuild_add_option( FEATURE PPROC_MIR
    DESCRIPTION "compile with MIR interpolation"
    DEFAULT ON
    REQUIRED_PACKAGES "PROJECT mir" )

if( HAVE_PPROC_MIR )
    list( APPEND MARS_FEATURE_LIBRARIES mir )
endif()

### libemos

ecbuild_add_option( FEATURE PPROC_EMOS
    DESCRIPTION "compile with EMOSLIB interpolation"
    DEFAULT ON
    REQUIRED_PACKAGES "PROJECT libemos" )

if( HAVE_PPROC_EMOS )
    list( APPEND MARS_FEATURE_LIBRARIES emos )
endif()


ecbuild_add_option( FEATURE BUFR_TOOLS
    DESCRIPTION "compile BUFR tools"
    DEFAULT ON
    REQUIRED_PACKAGES "PROJECT libemos" )

### odb

ecbuild_add_option( FEATURE ODB
    DESCRIPTION "compile with ODB support"
    DEFAULT ON
    REQUIRED_PACKAGES "PROJECT odb_api  VERSION 0.10 " )

if( HAVE_ODB )
  list( APPEND MARS_FEATURE_LIBRARIES Odb )
endif()


ecbuild_add_option( FEATURE MARS_USER_ENVIRONMENT
    DESCRIPTION "Mars user will be in $MARS_USER"
    DEFAULT OFF
)

### mars-server for ODB direct access

ecbuild_add_option( FEATURE ODBDIRECT
    DESCRIPTION "compile with ODB direct support"
    DEFAULT ${ECMWF}
    REQUIRED_PACKAGES "PROJECT mars_server VERSION 7.12" )

if( HAVE_ODBDIRECT )
  list( APPEND MARS_FEATURE_LIBRARIES Odb Odbsvr )
endif()

ecbuild_add_option( FEATURE FDB
    DEFAULT ${ECMWF}
    DESCRIPTION "support for FDB"
    REQUIRED_PACKAGES "PROJECT fdb VERSION 4.6" )

if( HAVE_FDB )
  list( APPEND MARS_FEATURE_LIBRARIES fdb )
endif()

ecbuild_add_option( FEATURE FDB5
    DEFAULT ${ECMWF}
    DESCRIPTION "support for FDB5"
    REQUIRED_PACKAGES "PROJECT fdb5 VERSION 5.0" )

if( HAVE_FDB5 )
    list( APPEND MARS_FEATURE_LIBRARIES fdb5 )
endif()

### netcdf

ecbuild_add_option( FEATURE NETCDF
    DEFAULT ON
    DESCRIPTION "support for NetCDF"
    REQUIRED_PACKAGES NetCDF )

if( HAVE_NETCDF )
  list( APPEND MARS_FEATURE_LIBRARIES ${NETCDF_LIBRARIES} )
endif()

### others

find_package( CURL )
find_package( CMath )

set( CMAKE_THREAD_PREFER_PTHREAD 1 ) # find thread library, but prefer pthreads
find_package(Threads REQUIRED)

ecbuild_add_option( FEATURE ECMWF_DEVELOPMENT
    DEFAULT OFF
    DESCRIPTION "Special mode for development, activates ECMWF but deactivates auth, ems and schedule" )

###############################################################################
# sanity checks -- these are more pain than helpful to be honest

if(ECMWF)

    if( NOT HAVE_PPROC_MIR OR NOT HAVE_PPROC_EMOS  )
        message( FATAL_ERROR "At ECMWF mars-client requires PPROC (for which MIR or EMOSLIB is required)" )
    endif()

    if( NOT TRANSI_HAVE_FFTW AND NOT ATLAS_HAVE_FFTW )
        message( FATAL_ERROR "At ECMWF FFTW library is required" )
    endif()

    if( NOT HAVE_ODB )
      message( FATAL_ERROR "At ECMWF mars-client requires ODB" )
    endif()

endif()

###############################################################################
### build source code

set( MARS_CLIENT_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src )

include_directories( ${MARS_CLIENT_INCLUDE_DIRS} )

add_subdirectory( src )
add_subdirectory( tests )

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

ecbuild_install_project( NAME mars-client )

ecbuild_print_summary() # prints the summary of the configuration
