cmake_minimum_required (VERSION 2.8)
PROJECT (HDF5JPSS)

#-----------------------------------------------------------------------------
# Instructions for use : Normal Build
#
# For standard build of HDF5 JPSS Augmentation tool.
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Set the target names of all the libraries (from FindHDF5.cmake)
#-----------------------------------------------------------------------------
SET (HDF5_LIB_TARGET              "hdf5")
SET (HDF5_HL_LIB_TARGET           "hdf5_hl")

#-----------------------------------------------------------------------------
# Define some CMake variables for use later in the project
#-----------------------------------------------------------------------------
SET (HDF5JPSS_RESOURCES_DIR      ${HDF5JPSS_SOURCE_DIR}/config/cmake)
SET (HDF5JPSS_SRC_DIR            ${HDF5JPSS_SOURCE_DIR})

#-----------------------------------------------------------------------------
# Include some macros for reusable code
#-----------------------------------------------------------------------------
INCLUDE (${HDF5JPSS_RESOURCES_DIR}/HDFMacros.cmake)

#-----------------------------------------------------------------------------
# Setup output Directories
#-----------------------------------------------------------------------------
SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY
    ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Executables."
)
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY
    ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all Libraries"
)
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY
    ${PROJECT_BINARY_DIR}/bin CACHE PATH "Single Directory for all static libraries."
)
SET (CMAKE_Fortran_MODULE_DIRECTORY
    ${PROJECT_BINARY_DIR}/bin/fortran CACHE PATH "Single Directory for all fortran modules."
)

#-----------------------------------------------------------------------------
# When building utility executables that generate other (source) files :
# we make use of the following variables defined in the root CMakeLists.
# Certain systems may add /Debug or /Release to output paths
# and we need to call the executable from inside the CMake configuration
#-----------------------------------------------------------------------------
SET (EXE_EXT "")
IF (WIN32)
  SET (EXE_EXT ".exe")
  IF (NOT CYGWIN)
    ADD_DEFINITIONS (-DBIND_TO_CURRENT_VCLIBS_VERSION=1)
    ADD_DEFINITIONS (-D_CRT_SECURE_NO_WARNINGS)
  ENDIF (NOT CYGWIN)
ENDIF (WIN32)

SET (MAKE_SYSTEM)
IF (CMAKE_BUILD_TOOL MATCHES "make")
  SET (MAKE_SYSTEM 1)
ENDIF (CMAKE_BUILD_TOOL MATCHES "make")

SET (CFG_INIT "/${CMAKE_CFG_INTDIR}")
IF (MAKE_SYSTEM)
  SET (CFG_INIT "")
ENDIF (MAKE_SYSTEM)

#-----------------------------------------------------------------------------
# Compiler specific flags : Shouldn't there be compiler tests for these
#-----------------------------------------------------------------------------
IF (CMAKE_COMPILER_IS_GNUCC)
  SET (CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS} -std=c99 -fomit-frame-pointer -finline-functions -fno-common")
ENDIF (CMAKE_COMPILER_IS_GNUCC)

#-----------------------------------------------------------------------------
# HDF5 support
#-----------------------------------------------------------------------------
SET (CMAKE_MODULE_PATH ${HDF5JPSS_RESOURCES_DIR} ${CMAKE_MODULE_PATH})

IF (NOT BUILD_SHARED_LIBS)
  SET (HDF5_USE_STATIC_LIBRARIES 1)
ENDIF (NOT BUILD_SHARED_LIBS)

IF (NOT HDF5JPSS_HDF5_HEADER)
  FIND_PACKAGE (HDF5 REQUIRED)
  IF (HDF5_FOUND)
    SET (HDF5_HAVE_H5PUBCONF_H 1)
    SET (HDF5_HAVE_HDF5 1)
    SET (HDF5_HDF5_HEADER "h5pubconf.h")
    SET (HDF5_INCLUDE_DIR_GEN ${HDF5_INCLUDE_DIR})
    MESSAGE (STATUS "HDF5 found")
  ELSE (HDF5_FOUND)
    MESSAGE (FATAL_ERROR " HDF5 is Required for HDF5 Examples")
  ENDIF (HDF5_FOUND)
ELSE (NOT HDF5JPSS_HDF5_HEADER)
  # This project is being called from within another and HDF5 is already configured
  SET (HDF5_HAVE_H5PUBCONF_H 1)
  SET (HDF5_HAVE_HDF5 1)
ENDIF (NOT HDF5JPSS_HDF5_HEADER)
IF (NOT HDF5_LIBRARY)
  SET (HDF5_LIBRARY ${HDF5_LIBRARIES})
ENDIF (NOT HDF5_LIBRARY)
SET (LINK_LIBS ${LINK_LIBS} ${HDF5_LIBRARIES})
INCLUDE_DIRECTORIES (${HDF5_INCLUDE_DIRS})

#-----------------------------------------------------------------------------
# Option to use Shared/Static libs, default is static
#-----------------------------------------------------------------------------
SET (LIB_TYPE STATIC)
IF (BUILD_SHARED_LIBS)
  SET (LIB_TYPE SHARED)
  SET (H5_BUILT_AS_DYNAMIC_LIB 1)
ELSE (BUILD_SHARED_LIBS)
  IF (NOT WIN32)
    # should this be a user setting : Everyone uses it anyway ?
    ADD_DEFINITIONS (-DPIC)
  ENDIF (NOT WIN32)
ENDIF (BUILD_SHARED_LIBS)

IF (MSVC)
  SET (CMAKE_MFC_FLAG 0)
ENDIF (MSVC)

FIND_PACKAGE (LibXml2)
IF (LIBXML2_FOUND)
  MESSAGE (STATUS "LibXml2 found")
ELSE (LIBXML2_FOUND)
  MESSAGE (FATAL_ERROR " LibXml2 is Required for HDF5AUGJPSS")
ENDIF (LIBXML2_FOUND)
INCLUDE_DIRECTORIES (${LIBXML2_INCLUDE_DIR})

FIND_PACKAGE (ZLIB)
IF (ZLIB_FOUND)
  MESSAGE (STATUS "ZLIB found")
ELSE (ZLIB_FOUND)
  MESSAGE (FATAL_ERROR " ZLIB is Required for HDF5AUGJPSS")
ENDIF (ZLIB_FOUND)
INCLUDE_DIRECTORIES (${ZLIB_INCLUDE_DIRS})

#-----------------------------------------------------------------------------
# Option to allow the user to disable compiler warnings
#-----------------------------------------------------------------------------
OPTION (HDF5JPSS_DISABLE_COMPILER_WARNINGS "Disable compiler warnings" OFF)
IF (HDF5JPSS_DISABLE_COMPILER_WARNINGS)
  # MSVC uses /w to suppress warnings.  It also complains if another
  # warning level is given, so remove it.
  IF (MSVC)
    SET (HDF5_WARNINGS_BLOCKED 1)
    STRING (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " "
        CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
    SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /w")
  ENDIF (MSVC)
  IF (WIN32 AND NOT CYGWIN)
    ADD_DEFINITIONS (-D_CRT_SECURE_NO_WARNINGS)
  ENDIF (WIN32 AND NOT CYGWIN)
  # Borland uses -w- to suppress warnings.
  IF (BORLAND)
    SET (HDF5_WARNINGS_BLOCKED 1)
    SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w-")
  ENDIF (BORLAND)

  # Most compilers use -w to suppress warnings.
  IF (NOT HDF5_WARNINGS_BLOCKED)
    SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")
  ENDIF (NOT HDF5_WARNINGS_BLOCKED)
ENDIF (HDF5JPSS_DISABLE_COMPILER_WARNINGS)

#-----------------------------------------------------------------------------
# This is in here to help some of the GCC based IDES like Eclipse
# and code blocks parse the compiler errors and warnings better.
#-----------------------------------------------------------------------------
IF (CMAKE_COMPILER_IS_GNUCC)
  SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0")
ENDIF (CMAKE_COMPILER_IS_GNUCC)
IF (CMAKE_COMPILER_IS_GNUCXX)
  SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0")
ENDIF (CMAKE_COMPILER_IS_GNUCXX)

#-----------------------------------------------------------------------------
# All examples need the main include directories
#-----------------------------------------------------------------------------
INCLUDE_DIRECTORIES (${HDF5JPSS_BINARY_DIR})

#-----------------------------------------------------------------------------
# Option to Enable MPI Parallel
#-----------------------------------------------------------------------------
SET (CMAKE_MODULE_PATH ${HDF5JPSS_RESOURCES_DIR} ${CMAKE_MODULE_PATH})
IF (HDF5JPSS_ENABLE_PARALLEL)
  INCLUDE (FindMPI)
  INCLUDE_DIRECTORIES (${MPI_INCLUDE_PATH})
  IF (MPI_FOUND)
    SET (H5_HAVE_PARALLEL 1)
    # MPI checks, only do these if MPI_FOUND is true, otherwise they always fail
    # and once set, they are cached as false and not regenerated
    SET (CMAKE_REQUIRED_LIBRARIES "${MPI_LIBRARY};${MPI_EXTRA_LIBRARY}" )
    CHECK_FUNCTION_EXISTS (MPI_File_get_size H5_HAVE_MPI_GET_SIZE) 
    # Used by Fortran + MPI
    CHECK_SYMBOL_EXISTS (MPI_Comm_c2f "${MPI_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Comm)
    CHECK_SYMBOL_EXISTS (MPI_Info_c2f "${MPI_INCLUDE_PATH}/mpi.h"  H5_HAVE_MPI_MULTI_LANG_Info)
  ENDIF (MPI_FOUND)
ENDIF (HDF5JPSS_ENABLE_PARALLEL)

# Parallel IO usage requires MPI to be Linked and Included
IF (H5_HAVE_PARALLEL)
  SET (LINK_LIBS ${LINK_LIBS} ${MPI_LIBRARY})
  IF (MPI_LINK_FLAGS)
    SET (CMAKE_EXE_LINKER_FLAGS ${MPI_LINK_FLAGS} ${CMAKE_EXE_LINKER_FLAGS})
  ENDIF (MPI_LINK_FLAGS)
  IF (MPI_EXTRA_LIBRARY)
    SET (LINK_LIBS ${LINK_LIBS} ${MPI_EXTRA_LIBRARY})
  ENDIF (MPI_EXTRA_LIBRARY)
ENDIF (H5_HAVE_PARALLEL)

#-----------------------------------------------------------------------------
# Option to use threadsafe
# Note: Currently CMake only allows configuring of threadsafe on WINDOWS.
#-----------------------------------------------------------------------------
IF (WIN32 AND NOT CYGWIN)
  IF (HDF5JPSS_ENABLE_THREADSAFE)
    # check for unsupported options
    IF (HDF5JPSS_ENABLE_PARALLEL)
      MESSAGE (FATAL " **** Parallel and Threadsafe options are mutually exclusive **** ")
    ENDIF (HDF5JPSS_ENABLE_PARALLEL)
    SET (H5_HAVE_WIN_THREADS 1)
    SET (H5_HAVE_THREADSAFE 1)
  ENDIF (HDF5JPSS_ENABLE_THREADSAFE)
ENDIF (WIN32 AND NOT CYGWIN)

#-----------------------------------------------------------------------------
# Build utility to copy and strip X lines of file
#-----------------------------------------------------------------------------
IF (BUILD_TESTING)
  SET (XLATE_UTILITY "xlatefile")
  ADD_EXECUTABLE(${XLATE_UTILITY} ${HDF5JPSS_RESOURCES_DIR}/xlatefile.c)
ENDIF (BUILD_TESTING)

#-----------------------------------------------------------------------------
# Dashboard and Testing Settings
#-----------------------------------------------------------------------------
OPTION (BUILD_TESTING "Build HDF5JPSS Testing" OFF)
IF (BUILD_TESTING)
  SET (DART_TESTING_TIMEOUT 1200
      CACHE INTEGER
      "Timeout in seconds for each test (default 1200=20minutes)"
  )
  ENABLE_TESTING ()
  INCLUDE (CTest)
  INCLUDE (${HDF5JPSS_SOURCE_DIR}/CTestConfig.cmake)
  CONFIGURE_FILE (${HDF5JPSS_RESOURCES_DIR}/CTestCustom.cmake ${HDF5JPSS_BINARY_DIR}/CTestCustom.ctest @ONLY)
ENDIF (BUILD_TESTING)

#-----------------------------------------------------------------------------
# Build program
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Define Sources
#-----------------------------------------------------------------------------
SET (h5augjpss_SRCS
    h5aj_main.c
    h5aj_command.c
    h5aj_read_xml.c
    h5aj_writenc4.c
    h5aj_restore.c
    h5augjpss.h
    h5aj_private.h
)

ADD_EXECUTABLE (h5augjpss ${h5augjpss_SRCS})
H5_NAMING (h5augjpss)
TARGET_LINK_LIBRARIES (h5augjpss ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARIES})

IF (BUILD_TESTING)
  SET (AUGJPSS_TEST_FILES
      GMODO_tgd.h5
      SVM07_tgd.h5
      D34862-VIIRS-M7.xml
  )

  FOREACH (h5_file ${AUGJPSS_TEST_FILES})
    SET (dest "${PROJECT_BINARY_DIR}/${h5_file}")
    #MESSAGE (STATUS " Copying ${h5_file}")
    ADD_CUSTOM_COMMAND (
        TARGET     h5augjpss
        POST_BUILD
        COMMAND    ${CMAKE_COMMAND}
        ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/testfiles/${h5_file} ${dest}
    )
  ENDFOREACH (h5_file ${AUGJPSS_TEST_FILES})
  
  ADD_TEST (NAME h5augjpss COMMAND $<TARGET_FILE:h5augjpss> D34862-VIIRS-M7.xml SVM07_tgd.h5)
ENDIF (BUILD_TESTING)
