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 $ D34862-VIIRS-M7.xml SVM07_tgd.h5) ENDIF (BUILD_TESTING)