From: Magnus Lundborg Date: Mon, 23 Jun 2014 10:07:23 +0000 (+0200) Subject: Update TNG build system X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=ef40a754c64c6807f56610a40ca4e0eab68342f5;p=alexxy%2Fgromacs.git Update TNG build system GROMACS can now find and use a copy of TNG installed on the system. The default is still to compile the version shipped with GROMACS. That compilation is now handled using the BuildTNG.cmake script, so there is no duplication between the GROMACS and TNG CMake code that builds TNG, and the result is fully portable with all supported environments and CMake versions. Moved TNG handling into src/gromacs/CMakeLists.txt where it is actually used. Bumped the version of the TNG library to 1.6. Corresponds to commit ba9aea42b01 in the TNG repository. Renamed md5 things with GROMACS prefixes, so that there is no internal name clash with the md5 things in TNG, and no client of libgromacs can get unexpected behaviour. Updated GMX_USE_TNG=off to work, and silenced unused-parameter warnings associated with that setting. Refs #1453 (partial fix) Fixes #1520 Change-Id: I7ac9b578e45b8e75c67c9df9440eed968a3a9371 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index ba6b311505..15c9cff038 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -848,26 +848,6 @@ else() endif() endif() -if(GMX_USE_TNG) - find_package(ZLIB QUIET) - include(gmxTestZLib) - gmx_test_zlib(HAVE_ZLIB) - set(TNG_BUILD_WITH_ZLIB ${HAVE_ZLIB} CACHE BOOL "Build TNG with zlib compression") - set(TNG_BUILD_FORTRAN OFF CACHE BOOL "Build Fortran compatible TNG library and examples for testing") - set(TNG_BUILD_EXAMPLES OFF CACHE BOOL "Build examples showing usage of the TNG API") - set(TNG_BUILD_COMPRESSION_TESTS OFF CACHE BOOL "Build tests of the TNG compression library") - set(TNG_BUILD_DOCUMENTATION OFF CACHE BOOL "Use Doxygen to create the HTML based TNG API documentation") - set(TNG_BUILD_TEST OFF CACHE BOOL "Build TNG testing binary.") - add_subdirectory(${CMAKE_SOURCE_DIR}/src/external/tng_io) - set(GMX_TNG_LIBRARIES tng_io) -endif() -mark_as_advanced(TNG_BUILD_FORTRAN) -mark_as_advanced(TNG_BUILD_EXAMPLES) -mark_as_advanced(TNG_BUILD_COMPRESSION_TESTS) -mark_as_advanced(TNG_BUILD_DOCUMENTATION) -mark_as_advanced(TNG_BUILD_TEST) -mark_as_advanced(TNG_EXAMPLE_FILES_DIR) - if (GMX_BUILD_FOR_COVERAGE) # Code heavy with asserts makes conditional coverage close to useless metric, # as by design most of the false branches are impossible to trigger in diff --git a/src/external/tng_io/BuildTNG.cmake b/src/external/tng_io/BuildTNG.cmake new file mode 100644 index 0000000000..f4f2caf1d4 --- /dev/null +++ b/src/external/tng_io/BuildTNG.cmake @@ -0,0 +1,71 @@ +set(TNG_ROOT_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}) +file(RELATIVE_PATH TNG_ROOT_BINARY_DIR ${CMAKE_SOURCE_DIR} ${TNG_ROOT_SOURCE_DIR}) +set(TNG_ROOT_BINARY_DIR ${CMAKE_BINARY_DIR}/${TNG_ROOT_BINARY_DIR}) + +function (TNG_GENERATE_VERSION_H) + set(TNG_MAJOR_VERSION "1") + set(TNG_MINOR_VERSION "6") + set(TNG_VERSION_PATCH_LEVEL "0") + set(TNG_IO_VERSION "${TNG_MAJOR_VERSION}.${TNG_MINOR_VERSION}.${TNG_VERSION_PATCH_LEVEL}") + set(TNG_API_VERSION "6") + configure_file(${TNG_ROOT_SOURCE_DIR}/include/tng/version.h.in + ${TNG_ROOT_BINARY_DIR}/include/tng/version.h) + + set(TNG_MAJOR_VERSION ${TNG_MAJOR_VERSION} PARENT_SCOPE) + set(TNG_IO_VERSION ${TNG_IO_VERSION} PARENT_SCOPE) +endfunction() + +tng_generate_version_h() + +include(TestBigEndian) +test_big_endian(TNG_INTEGER_BIG_ENDIAN) +include(CheckIncludeFile) +check_include_file(inttypes.h TNG_HAVE_INTTYPES_H) + +macro(TNG_GET_SOURCE_LIST TNG_SOURCELIST TNG_COMPILEDEFS) + include_directories(${TNG_ROOT_SOURCE_DIR}/include) + include_directories(${TNG_ROOT_BINARY_DIR}/include) + set(_tng_compression_sources bwlzh.c bwt.c coder.c dict.c fixpoint.c huffman.c huffmem.c lz77.c merge_sort.c mtf.c rle.c tng_compress.c vals16.c warnmalloc.c widemuldiv.c xtc2.c xtc3.c) + set(_tng_io_sources tng_io.c md5.c) + set(${TNG_SOURCELIST}) + set(${TNG_COMPILEDEFS}) + foreach(_file ${_tng_compression_sources}) + list(APPEND ${TNG_SOURCELIST} ${TNG_ROOT_SOURCE_DIR}/src/compression/${_file}) + endforeach() + foreach(_file ${_tng_io_sources}) + list(APPEND ${TNG_SOURCELIST} ${TNG_ROOT_SOURCE_DIR}/src/lib/${_file}) + endforeach() + if(TNG_BUILD_FORTRAN) + list(APPEND ${TNG_SOURCELIST} ${TNG_ROOT_SOURCE_DIR}/src/lib/tng_io_fortran.c) + endif() + if (TNG_HAVE_INTTYPES_H) + list(APPEND ${TNG_COMPILEDEFS} USE_STD_INTTYPES_H) + endif() +endmacro() + +macro(TNG_SET_SOURCE_PROPERTIES) + set(_tng_with_zlib OFF) + set(_curr_var) + foreach (_arg ${ARGN}) + if (_arg STREQUAL "WITH_ZLIB") + set(_curr_var with_zlib) + elseif (_curr_var) + set(_tng_${_curr_var} ${_arg}) + set(_curr_var "") + else() + message(FATAL_ERROR "Invalid argument ${_arg} to TNG_SET_SOURCE_PROPERTIES") + endif() + endforeach() + if (_tng_with_zlib) + set_property(SOURCE ${TNG_ROOT_SOURCE_DIR}/src/lib/tng_io.c + APPEND PROPERTY COMPILE_DEFINITIONS USE_ZLIB) + endif() + if (TNG_HAVE_INTTYPES_H) + set_property(SOURCE ${TNG_ROOT_SOURCE_DIR}/src/lib/tng_io.c + APPEND PROPERTY COMPILE_DEFINITIONS USE_STD_INTTYPES_H) + endif() + if (TNG_INTEGER_BIG_ENDIAN) + set_property(SOURCE ${TNG_ROOT_SOURCE_DIR}/src/lib/md5.c + APPEND PROPERTY COMPILE_DEFINITIONS TNG_INTEGER_BIG_ENDIAN) + endif() +endmacro() diff --git a/src/external/tng_io/CMakeLists.txt b/src/external/tng_io/CMakeLists.txt index 871d17e26e..7fc6ad6503 100644 --- a/src/external/tng_io/CMakeLists.txt +++ b/src/external/tng_io/CMakeLists.txt @@ -1,12 +1,7 @@ cmake_minimum_required(VERSION 2.8.8) project(TNG_IO) -set(PROJECT_VERSION "1.5") -set(API_VERSION "5") -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/version.h.in - ${CMAKE_BINARY_DIR}/include/version.h ) -include_directories(${CMAKE_BINARY_DIR}/include) if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall") @@ -31,9 +26,47 @@ option(TNG_BUILD_WITH_ZLIB "Build TNG with zlib compression" ${ZLIB_FOUND}) include(CheckIncludeFile) check_include_file(inttypes.h HAVE_INTTYPES_H) -add_subdirectory(src) +include(BuildTNG.cmake) +tng_get_source_list(TNG_SOURCES TNG_COMPILE_DEFS) + +tng_set_source_properties(WITH_ZLIB ${ZLIB_FOUND}) + +if (ZLIB_FOUND) + list(APPEND EXTRA_LIBRARIES ${ZLIB_LIBRARIES}) +endif() + +if (UNIX) + list(APPEND EXTRA_LIBRARIES m) +endif() + +add_library(tng_io ${TNG_SOURCES}) + +target_link_libraries(tng_io ${EXTRA_LIBRARIES}) -install(FILES include/tng_io.h include/tng_io_fwd.h DESTINATION include/) +set_target_properties(tng_io PROPERTIES VERSION ${TNG_IO_VERSION} SOVERSION ${TNG_MAJOR_VERSION}) + +# Create the tng_ioConfig.cmake and tng_ioConfigVersion.cmake files for the install tree +set(CONF_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/include") +configure_file( src/lib/tng_io-config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/cmake/tng_io-config.cmake" @ONLY) +configure_file( src/lib/tng_io-configVersion.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/cmake/tng_io-configVersion.cmake" @ONLY) + +# Use GNUInstallDirst to set paths on multiarch systems +include(GNUInstallDirs) + +# Install the tng_ioConfig.cmake and tng_ioConfigVersion.cmake +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/cmake/tng_io-config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/cmake/tng_io-configVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/tng_io") + +install(TARGETS tng_io + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +install(FILES include/tng/tng_io.h include/tng/tng_io_fwd.h ${CMAKE_CURRENT_BINARY_DIR}/include/tng/version.h + DESTINATION include/tng) #-- Add an Option to toggle the generation of the API documentation option(TNG_BUILD_DOCUMENTATION "Use Doxygen to create the HTML based API documentation" OFF) @@ -57,3 +90,5 @@ if(TNG_BUILD_DOCUMENTATION) DESTINATION share/tng/doc) endif() +add_subdirectory(src) + diff --git a/src/external/tng_io/Doxyfile.in b/src/external/tng_io/Doxyfile.in index 3d6f0f7d43..03ba55355a 100644 --- a/src/external/tng_io/Doxyfile.in +++ b/src/external/tng_io/Doxyfile.in @@ -658,7 +658,7 @@ RECURSIVE = NO # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = @PROJECT_SOURCE_DIR@/src/lib/md5.c @PROJECT_SOURCE_DIR@/include/md5.h @PROJECT_SOURCE_DIR@/include/tng_io.hpp @PROJECT_SOURCE_DIR@/src/lib/tng_io.c +EXCLUDE = @PROJECT_SOURCE_DIR@/src/lib/md5.c @PROJECT_SOURCE_DIR@/include/tng/md5.h @PROJECT_SOURCE_DIR@/include/tng/tng_io.hpp @PROJECT_SOURCE_DIR@/src/lib/tng_io.c # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/src/external/tng_io/include/md5.h b/src/external/tng_io/include/tng/md5.h similarity index 100% rename from src/external/tng_io/include/md5.h rename to src/external/tng_io/include/tng/md5.h diff --git a/src/external/tng_io/include/tng_io.h b/src/external/tng_io/include/tng/tng_io.h similarity index 98% rename from src/external/tng_io/include/tng_io.h rename to src/external/tng_io/include/tng/tng_io.h index 5b89cd6357..42119a5328 100644 --- a/src/external/tng_io/include/tng_io.h +++ b/src/external/tng_io/include/tng/tng_io.h @@ -21,9 +21,9 @@ * Each block can contain MD5 hashes to verify data integrity and the file * can be signed by the user to ensure that the origin is correct. * - * This is version 1.4 of the TNG API. The intention is that this version of - * the API and ABI should be stable, but it is still possible that future - * changes might make that impossible, in which case that will be clarified. + * The intention is that the API and ABI should be stable, but it is + * still possible that future changes might make that impossible, in which + * case that will be clarified. * * The API and all examples are released without any warranties. Use them at * your own risk. @@ -76,6 +76,16 @@ * * Revisions * + * v. 1.6 - Fourth stable release of the API. + * + * - Removed OpenMP option when building. + * - Functionality for migrating data blocks. + * - Improved handling of molecules. + * - Improved installation of TNG documentation. + * - Enhancements to CMake usage. + * - Required CMake version raised to 2.8.8. + * - Bugs fixed. + * * v. 1.5 - Third stable release of the API. * * - Fortran wrapper split into separate file @@ -173,7 +183,7 @@ * \code * #include * #include - * #include "tng_io.h" + * #include "tng/tng_io.h" * * int main(int argc, char **argv) * { @@ -530,6 +540,59 @@ extern "C" * @{ */ +/** + * @brief Get the major version of the TNG library. + * @param tng_data is a trajectory data container, it does not have + * to be initialized beforehand. + * @param version is pointing to a value set to the major version of + * the library. + * @return TNG_SUCCESS (0) if successful. + */ +tng_function_status DECLSPECDLLEXPORT tng_version_major + (const tng_trajectory_t tng_data, + int *version); + +/** + * @brief Get the minor version of the TNG library. + * @param tng_data is a trajectory data container, it does not have + * to be initialized beforehand. + * @param version is pointing to a value set to the minor version of + * the library. + * @return TNG_SUCCESS (0) if successful. + */ +tng_function_status DECLSPECDLLEXPORT tng_version_minor + (const tng_trajectory_t tng_data, + int *version); + +/** + * @brief Get the patch level of the TNG library. + * @param tng_data is a trajectory data container, it does not have + * to be initialized beforehand. + * @param patch_level is the string to fill with the full version, + * memory must be allocated before. + * @return TNG_SUCCESS (0) if successful. + */ +tng_function_status DECLSPECDLLEXPORT tng_version_patchlevel + (const tng_trajectory_t tng_data, + int *patch_level); + +/** + * @brief Get the full version string of the TNG library. + * @param tng_data is a trajectory data container, it does not have + * to be initialized beforehand. + * @param version is pointing to a value set to the major version of + * the library. + * @param max_len maximum char length of the string, i.e. how much memory has + * been reserved for version. This includes \0 terminating character. + * @pre \code version != 0 \endcode The pointer to the name string + * must not be a NULL pointer. + * @return TNG_SUCCESS (0) if successful. + */ +tng_function_status DECLSPECDLLEXPORT tng_version + (const tng_trajectory_t tng_data, + char *version, + const int max_len); + /** * @brief Setup a trajectory data container. * @param tng_data_p a pointer to memory to initialise as a trajectory. @@ -4677,7 +4740,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_frame_current_compression_get (tng_trajectory_t tng_data, const int64_t block_id, int64_t *codec_id, - float *factor); + double *factor); /** @brief High-level function for determining the next frame with data and what * data blocks have data for that frame. The search can be limited to certain diff --git a/src/external/tng_io/include/tng_io.hpp b/src/external/tng_io/include/tng/tng_io.hpp similarity index 100% rename from src/external/tng_io/include/tng_io.hpp rename to src/external/tng_io/include/tng/tng_io.hpp diff --git a/src/external/tng_io/include/tng_io_fwd.h b/src/external/tng_io/include/tng/tng_io_fwd.h similarity index 100% rename from src/external/tng_io/include/tng_io_fwd.h rename to src/external/tng_io/include/tng/tng_io_fwd.h diff --git a/src/external/tng_io/include/tng/version.h.in b/src/external/tng_io/include/tng/version.h.in new file mode 100644 index 0000000000..662e68ff75 --- /dev/null +++ b/src/external/tng_io/include/tng/version.h.in @@ -0,0 +1,16 @@ +#ifndef VERSION_CONFIG_H +#define VERSION_CONFIG_H + +/* define the API version (integer) */ +#define TNG_API_VERSION @TNG_API_VERSION@ + +/* define the major and minor versions + of the library */ +#define TNG_VERSION_MAJOR @TNG_MAJOR_VERSION@ +#define TNG_VERSION_MINOR @TNG_MINOR_VERSION@ +/* define the patchlevel of the library */ +#define TNG_VERSION_PATCHLEVEL @TNG_VERSION_PATCH_LEVEL@ +/* define the full version of the library (string) */ +#define TNG_VERSION "@TNG_IO_VERSION@" + +#endif diff --git a/src/external/tng_io/include/version.h.in b/src/external/tng_io/include/version.h.in deleted file mode 100644 index 840e454fe8..0000000000 --- a/src/external/tng_io/include/version.h.in +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef VERSION_CONFIG_H -#define VERSION_CONFIG_H - -/* define the API version */ -#define TNG_API_VERSION @API_VERSION@ - -#endif diff --git a/src/external/tng_io/src/CMakeLists.txt b/src/external/tng_io/src/CMakeLists.txt index d5f2bc0a20..88c0516360 100644 --- a/src/external/tng_io/src/CMakeLists.txt +++ b/src/external/tng_io/src/CMakeLists.txt @@ -1,3 +1 @@ -add_subdirectory(compression) -add_subdirectory(lib) add_subdirectory(tests) diff --git a/src/external/tng_io/src/compression/CMakeLists.txt b/src/external/tng_io/src/compression/CMakeLists.txt deleted file mode 100644 index 8bb0220aa7..0000000000 --- a/src/external/tng_io/src/compression/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -set(source_files bwlzh.c bwt.c coder.c dict.c fixpoint.c huffman.c huffmem.c lz77.c merge_sort.c mtf.c rle.c tng_compress.c vals16.c warnmalloc.c widemuldiv.c xtc2.c xtc3.c) - -add_library(tng_compress ${source_files}) - -# Append the required library dependencies -if(UNIX) - target_link_libraries(tng_compress m) -endif() - -# Use GNUInstallDirst to set paths on multiarch systems -include(GNUInstallDirs) - -install(TARGETS tng_compress - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/src/external/tng_io/src/lib/CMakeLists.txt b/src/external/tng_io/src/lib/CMakeLists.txt deleted file mode 100644 index 838f827c58..0000000000 --- a/src/external/tng_io/src/lib/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -set(source_files tng_io.c md5.c) -if(TNG_BUILD_FORTRAN) - list(APPEND source_files tng_io_fortran.c) -endif() - -add_library(tng_io ${source_files}) - -# Now add source-file compilation properties to the source-file -# targets - -if(HAVE_INTTYPES_H) - set_property(SOURCE tng_io.c APPEND PROPERTY COMPILE_DEFINITIONS USE_STD_INTTYPES_H) -endif() -if(TNG_BUILD_WITH_ZLIB) - set_property(SOURCE tng_io.c APPEND PROPERTY COMPILE_DEFINITIONS USE_ZLIB) -endif() - -# This test is for md5. The TNG library itself determines the actual byte order - -# not just if it is small or big endian. -include(TestBigEndian) -test_big_endian(TNG_INTEGER_BIG_ENDIAN) -if(TNG_INTEGER_BIG_ENDIAN) - set_property(SOURCE md5.c APPEND PROPERTY COMPILE_DEFINITIONS TNG_INTEGER_BIG_ENDIAN) -endif() - -# Append the required library dependencies -target_link_libraries(tng_io tng_compress) -if(TNG_BUILD_WITH_ZLIB) - target_link_libraries(tng_io ${ZLIB_LIBRARIES}) -endif() - -# Use GNUInstallDirst to set paths on multiarch systems -include(GNUInstallDirs) - -install(TARGETS tng_io - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/src/external/tng_io/src/lib/md5.c b/src/external/tng_io/src/lib/md5.c index ea8bb37b5e..f6a2391635 100644 --- a/src/external/tng_io/src/lib/md5.c +++ b/src/external/tng_io/src/lib/md5.c @@ -75,7 +75,7 @@ 1999-05-03 lpd Original version. */ -#include "../../include/md5.h" +#include "tng/md5.h" #include #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ diff --git a/src/external/tng_io/src/lib/tng_io-config.cmake.in b/src/external/tng_io/src/lib/tng_io-config.cmake.in new file mode 100644 index 0000000000..06c0470677 --- /dev/null +++ b/src/external/tng_io/src/lib/tng_io-config.cmake.in @@ -0,0 +1,13 @@ +# - Config file for the TNG_IO package +# It defines the following variables +# TNG_IO_INCLUDE_DIRS - include directories for TNG_IO +# TNG_IO_LIBRARIES - libraries to link against +# TNG_IO_DEFINITIONS - definitions used when compiling + +# Compute paths +get_filename_component(TNG_IO_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +set(TNG_IO_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@") +set(TNG_IO_DEFINITIONS "@TNG_COMPILE_DEFS@") + +set(TNG_IO_LIBRARIES tng_io) + diff --git a/src/external/tng_io/src/lib/tng_io-configVersion.cmake.in b/src/external/tng_io/src/lib/tng_io-configVersion.cmake.in new file mode 100644 index 0000000000..8946f5eb02 --- /dev/null +++ b/src/external/tng_io/src/lib/tng_io-configVersion.cmake.in @@ -0,0 +1,12 @@ +set(PACKAGE_VERSION "@TNG_IO_VERSION@") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + diff --git a/src/external/tng_io/src/lib/tng_io.c b/src/external/tng_io/src/lib/tng_io.c index 252cbb2901..792be2e929 100644 --- a/src/external/tng_io/src/lib/tng_io.c +++ b/src/external/tng_io/src/lib/tng_io.c @@ -22,10 +22,10 @@ #include #endif -#include "../../include/tng_io.h" -#include "../../include/md5.h" -#include "../../include/compression/tng_compress.h" -#include "../include/version.h" +#include "tng/tng_io.h" +#include "tng/md5.h" +#include "compression/tng_compress.h" +#include "tng/version.h" struct tng_bond { @@ -7852,6 +7852,52 @@ static tng_function_status tng_atom_destroy(tng_atom_t atom) return(TNG_SUCCESS); } +tng_function_status DECLSPECDLLEXPORT tng_version_major + (const tng_trajectory_t tng_data, + int *version) +{ + (void)tng_data; + + *version = TNG_VERSION_MAJOR; + + return(TNG_SUCCESS); +} + +tng_function_status DECLSPECDLLEXPORT tng_version_minor + (const tng_trajectory_t tng_data, + int *version) +{ + (void)tng_data; + + *version = TNG_VERSION_MINOR; + + return(TNG_SUCCESS); +} + +tng_function_status DECLSPECDLLEXPORT tng_version_patchlevel + (const tng_trajectory_t tng_data, + int *patch_level) +{ + (void)tng_data; + + *patch_level = TNG_VERSION_PATCHLEVEL; + + return(TNG_SUCCESS); +} + +tng_function_status DECLSPECDLLEXPORT tng_version + (const tng_trajectory_t tng_data, + char *version, + const int max_len) +{ + (void)tng_data; + TNG_ASSERT(version, "TNG library: version must not be a NULL pointer"); + + TNG_SNPRINTF(version, max_len, "%s", TNG_VERSION); + + return(TNG_SUCCESS); +} + tng_function_status DECLSPECDLLEXPORT tng_molecule_add (tng_trajectory_t tng_data, const char *name, @@ -18889,7 +18935,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_frame_current_compression_get (tng_trajectory_t tng_data, const int64_t block_id, int64_t *codec_id, - float *factor) + double *factor) { tng_trajectory_frame_set_t frame_set; tng_particle_data_t p_data = 0; @@ -18986,12 +19032,12 @@ tng_function_status DECLSPECDLLEXPORT tng_util_frame_current_compression_get if(block_type == TNG_PARTICLE_BLOCK_DATA) { *codec_id = p_data->codec_id; - *factor = (float)p_data->compression_multiplier; + *factor = p_data->compression_multiplier; } else if(block_type == TNG_NON_PARTICLE_BLOCK_DATA) { *codec_id = np_data->codec_id; - *factor = (float)np_data->compression_multiplier; + *factor = np_data->compression_multiplier; } return(TNG_SUCCESS); } diff --git a/src/external/tng_io/src/tests/compression/CMakeLists.txt b/src/external/tng_io/src/tests/compression/CMakeLists.txt index 075b06b747..d29791b65d 100644 --- a/src/external/tng_io/src/tests/compression/CMakeLists.txt +++ b/src/external/tng_io/src/tests/compression/CMakeLists.txt @@ -4,8 +4,6 @@ add_definitions(-DTNG_COMPRESS_FILES_DIR="${CMAKE_BINARY_DIR}/test_tng_compress_ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/test_tng_compress_files) -include_directories(${CMAKE_BINARY_DIR}/include/) - set(number 0) set(numtests 78) @@ -14,7 +12,7 @@ while( number LESS ${numtests}) math( EXPR number "${number} + 1" ) add_executable(test_tng_compress_gen${number} testsuite.c) -target_link_libraries(test_tng_compress_gen${number} tng_compress) +target_link_libraries(test_tng_compress_gen${number} tng_io) if(UNIX) target_link_libraries(test_tng_compress_gen${number} m) endif() @@ -25,7 +23,7 @@ add_dependencies(test_tng_compress_gen${number} test${number}.h) set_property(TARGET test_tng_compress_gen${number} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/compression_tests) add_executable(test_tng_compress_read${number} testsuite.c) -target_link_libraries(test_tng_compress_read${number} tng_compress) +target_link_libraries(test_tng_compress_read${number} tng_io) if(UNIX) target_link_libraries(test_tng_compress_read${number} m) endif() diff --git a/src/external/tng_io/src/tests/compression/testsuite.c b/src/external/tng_io/src/tests/compression/testsuite.c index 2cfe05e97f..e266c110b8 100644 --- a/src/external/tng_io/src/tests/compression/testsuite.c +++ b/src/external/tng_io/src/tests/compression/testsuite.c @@ -8,7 +8,7 @@ #include #include #include -#include "../../../include/compression/tng_compress.h" +#include "compression/tng_compress.h" #include TESTPARAM #ifdef TEST_FLOAT diff --git a/src/external/tng_io/src/tests/md_openmp.c b/src/external/tng_io/src/tests/md_openmp.c index fd9f4b0e77..aac8b3b7bd 100644 --- a/src/external/tng_io/src/tests/md_openmp.c +++ b/src/external/tng_io/src/tests/md_openmp.c @@ -1,11 +1,11 @@ #ifdef TNG_BUILD_OPENMP_EXAMPLES -# include -# include -# include -# include -# include -#include "../../include/tng_io.h" +#include +#include +#include +#include +#include +#include "tng/tng_io.h" int main (); void compute ( int np, int nd, double pos[], double vel[], diff --git a/src/external/tng_io/src/tests/md_openmp_util.c b/src/external/tng_io/src/tests/md_openmp_util.c index 8c332f32ee..9fe6c91b60 100644 --- a/src/external/tng_io/src/tests/md_openmp_util.c +++ b/src/external/tng_io/src/tests/md_openmp_util.c @@ -1,11 +1,11 @@ #ifdef TNG_BUILD_OPENMP_EXAMPLES -# include -# include -# include -# include -# include -#include "../../include/tng_io.h" +#include +#include +#include +#include +#include +#include "tng/tng_io.h" int main (); void compute ( int np, int nd, float pos[], float vel[], diff --git a/src/external/tng_io/src/tests/tng_io_read_pos.c b/src/external/tng_io/src/tests/tng_io_read_pos.c index 2a0bb09741..b29cec7cd1 100644 --- a/src/external/tng_io/src/tests/tng_io_read_pos.c +++ b/src/external/tng_io/src/tests/tng_io_read_pos.c @@ -15,7 +15,7 @@ #include #include -#include "../../include/tng_io.h" +#include "tng/tng_io.h" int main(int argc, char **argv) { diff --git a/src/external/tng_io/src/tests/tng_io_read_pos_util.c b/src/external/tng_io/src/tests/tng_io_read_pos_util.c index 1667bae2d8..b237dad03d 100644 --- a/src/external/tng_io/src/tests/tng_io_read_pos_util.c +++ b/src/external/tng_io/src/tests/tng_io_read_pos_util.c @@ -17,7 +17,7 @@ #include #include -#include "../../include/tng_io.h" +#include "tng/tng_io.h" int main(int argc, char **argv) { diff --git a/src/external/tng_io/src/tests/tng_io_testing.c b/src/external/tng_io/src/tests/tng_io_testing.c index dd13d925d3..e1e2726db1 100644 --- a/src/external/tng_io/src/tests/tng_io_testing.c +++ b/src/external/tng_io/src/tests/tng_io_testing.c @@ -15,7 +15,8 @@ #include #include -#include "../../include/tng_io.h" +#include "tng/tng_io.h" +#include "tng/version.h" static tng_function_status tng_test_setup_molecules(tng_trajectory_t traj) { @@ -595,6 +596,17 @@ int main() tng_trajectory_t traj; tng_function_status stat; char time_str[TNG_MAX_DATE_STR_LEN]; + char version_str[TNG_MAX_STR_LEN]; + + tng_version(traj, version_str, TNG_MAX_STR_LEN); + if(strncmp(TNG_VERSION, version_str, TNG_MAX_STR_LEN) == 0) + { + printf("Test version control: \t\t\t\tSucceeded.\n"); + } + else + { + printf("Test version control: \t\t\t\tFailed.\n"); + } if(tng_trajectory_init(&traj) != TNG_SUCCESS) { diff --git a/src/external/tng_io/src/tests/tng_parallel_read.c b/src/external/tng_io/src/tests/tng_parallel_read.c index e2e23c6b4f..44e8f796b7 100644 --- a/src/external/tng_io/src/tests/tng_parallel_read.c +++ b/src/external/tng_io/src/tests/tng_parallel_read.c @@ -13,7 +13,7 @@ #include #include -#include "../../include/tng_io.h" +#include "tng/tng_io.h" /* N.B. this code is for testing parallel reading of trajectory frame sets. The diff --git a/src/gromacs/CMakeLists.txt b/src/gromacs/CMakeLists.txt index efbebe7607..2045cebcc6 100644 --- a/src/gromacs/CMakeLists.txt +++ b/src/gromacs/CMakeLists.txt @@ -45,6 +45,39 @@ function (gmx_install_headers DESTINATION) endif() endfunction () +if(GMX_USE_TNG) + option(GMX_EXTERNAL_TNG "Use external TNG instead of compiling the version shipped with GROMACS." + OFF) + # Detect TNG if GMX_EXTERNAL_TNG is explicitly ON + if(GMX_EXTERNAL_TNG) + find_package(TNG_IO 1.6.0) + if(NOT TNG_IO_FOUND) + message(FATAL_ERROR + "TNG >= 1.6.0 not found. " + "You can set GMX_EXTERNAL_TNG=OFF to compile TNG.") + endif() + include_directories(${TNG_IO_INCLUDE_DIRS}) + endif() + if(NOT GMX_EXTERNAL_TNG) + # TNG wants zlib if it is available + find_package(ZLIB QUIET) + include(gmxTestZLib) + gmx_test_zlib(HAVE_ZLIB) + + include(${CMAKE_SOURCE_DIR}/src/external/tng_io/BuildTNG.cmake) + tng_get_source_list(TNG_SOURCES TNG_IO_DEFINITIONS) + list(APPEND LIBGROMACS_SOURCES ${TNG_SOURCES}) + tng_set_source_properties(WITH_ZLIB ${HAVE_ZLIB}) + + if (HAVE_ZLIB) + list(APPEND GMX_EXTRA_LIBRARIES ${ZLIB_LIBRARIES}) + endif() + endif() +else() + # We still need to get tng/tng_io_fwd.h from somewhere! + include_directories(${CMAKE_SOURCE_DIR}/src/external/tng_io/include) +endif() + add_subdirectory(gmxlib) add_subdirectory(mdlib) add_subdirectory(gmxpreprocess) @@ -157,7 +190,7 @@ target_link_libraries(libgromacs ${EXTRAE_LIBRARIES} ${GMX_GPU_LIBRARIES} ${GMX_EXTRA_LIBRARIES} - ${GMX_TNG_LIBRARIES} + ${TNG_IO_LIBRARIES} ${FFT_LIBRARIES} ${LINEAR_ALGEBRA_LIBRARIES} ${XML_LIBRARIES} ${THREAD_LIB} ${GMX_SHARED_LINKER_FLAGS}) diff --git a/src/gromacs/fileio/CMakeLists.txt b/src/gromacs/fileio/CMakeLists.txt index 18078dee81..7d3d02c5f7 100644 --- a/src/gromacs/fileio/CMakeLists.txt +++ b/src/gromacs/fileio/CMakeLists.txt @@ -61,13 +61,11 @@ set(FILEIO_PUBLIC_HEADERS ) gmx_install_headers(fileio ${FILEIO_PUBLIC_HEADERS}) -# These files include tng_io.h from the TNG library. That header needs to know -# whether inttypes.h exists or not. -include(CheckIncludeFiles) -check_include_file(inttypes.h HAVE_INTTYPES_H) -if(HAVE_INTTYPES_H) - set_property(SOURCE tngio.cpp APPEND PROPERTY COMPILE_DEFINITIONS USE_STD_INTTYPES_H) - set_property(SOURCE tngio_for_tools.cpp APPEND PROPERTY COMPILE_DEFINITIONS USE_STD_INTTYPES_H) +if (GMX_USE_TNG AND TNG_IO_DEFINITIONS) + set_property(SOURCE tngio.cpp + APPEND PROPERTY COMPILE_DEFINITIONS ${TNG_IO_DEFINITIONS}) + set_property(SOURCE tngio_for_tools.cpp + APPEND PROPERTY COMPILE_DEFINITIONS ${TNG_IO_DEFINITIONS}) endif() if (BUILD_TESTING) diff --git a/src/gromacs/fileio/gmxfio.c b/src/gromacs/fileio/gmxfio.c index ab627936dc..d9909d56ac 100644 --- a/src/gromacs/fileio/gmxfio.c +++ b/src/gromacs/fileio/gmxfio.c @@ -751,9 +751,9 @@ static int gmx_fio_int_get_file_md5(t_fileio *fio, gmx_off_t offset, if (!ret) { - md5_init(&state); - md5_append(&state, buf, read_len); - md5_finish(&state, digest); + gmx_md5_init(&state); + gmx_md5_append(&state, buf, read_len); + gmx_md5_finish(&state, digest); ret = read_len; } sfree(buf); diff --git a/src/gromacs/fileio/md5.c b/src/gromacs/fileio/md5.c index ca27dbb75a..8154a6e811 100644 --- a/src/gromacs/fileio/md5.c +++ b/src/gromacs/fileio/md5.c @@ -32,6 +32,10 @@ * To help us fund GROMACS development, we humbly ask that you cite * the research papers on the package. Check out http://www.gromacs.org. */ +/* This software has been altered by GROMACS for its use, including + * the use of GMX_INTEGER_BIG_ENDIAN, and the renaming of the + * functions md5_init, md5_append and md5_finish to have a gmx_ prefix + * (to avoid name clashes). */ #ifdef HAVE_CONFIG_H #include #endif @@ -359,7 +363,7 @@ md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) } void -md5_init(md5_state_t *pms) +gmx_md5_init(md5_state_t *pms) { pms->count[0] = pms->count[1] = 0; pms->abcd[0] = 0x67452301; @@ -369,7 +373,7 @@ md5_init(md5_state_t *pms) } void -md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) +gmx_md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) { const md5_byte_t *p = data; int left = nbytes; @@ -418,7 +422,7 @@ md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) } void -md5_finish(md5_state_t *pms, md5_byte_t digest[16]) +gmx_md5_finish(md5_state_t *pms, md5_byte_t digest[16]) { static const md5_byte_t pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -435,9 +439,9 @@ md5_finish(md5_state_t *pms, md5_byte_t digest[16]) data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); } /* Pad to 56 bytes mod 64. */ - md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + gmx_md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); /* Append the length. */ - md5_append(pms, data, 8); + gmx_md5_append(pms, data, 8); for (i = 0; i < 16; ++i) { digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); diff --git a/src/gromacs/fileio/md5.h b/src/gromacs/fileio/md5.h index 5e0d6223e5..ae49d27748 100644 --- a/src/gromacs/fileio/md5.h +++ b/src/gromacs/fileio/md5.h @@ -32,6 +32,10 @@ * To help us fund GROMACS development, we humbly ask that you cite * the research papers on the package. Check out http://www.gromacs.org. */ +/* This software has been altered by GROMACS for its use, including + * the renaming of the functions md5_init, md5_append and md5_finish + * to have a gmx_ prefix, and the #include guard md5_INCLUDED to have + * a GMX_ prefix (both to avoid name clashes). */ /* Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. @@ -80,8 +84,8 @@ 1999-05-03 lpd Original version. */ -#ifndef md5_INCLUDED -# define md5_INCLUDED +#ifndef GMX_md5_INCLUDED +# define GMX_md5_INCLUDED /* * This package supports both compile-time and run-time determination of CPU @@ -109,16 +113,16 @@ extern "C" #endif /* Initialize the algorithm. */ -void md5_init(md5_state_t *pms); +void gmx_md5_init(md5_state_t *pms); /* Append a string to the message. */ -void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); +void gmx_md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); /* Finish the message and return the digest. */ -void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); +void gmx_md5_finish(md5_state_t *pms, md5_byte_t digest[16]); #ifdef __cplusplus } /* end extern "C" */ #endif -#endif /* md5_INCLUDED */ +#endif diff --git a/src/gromacs/fileio/tngio.cpp b/src/gromacs/fileio/tngio.cpp index da7a7f12fb..6cef6532d0 100644 --- a/src/gromacs/fileio/tngio.cpp +++ b/src/gromacs/fileio/tngio.cpp @@ -43,7 +43,7 @@ #endif #ifdef GMX_USE_TNG -#include "../../external/tng_io/include/tng_io.h" +#include "tng/tng_io.h" #endif #include "gromacs/legacyheaders/copyrite.h" diff --git a/src/gromacs/fileio/tngio.h b/src/gromacs/fileio/tngio.h index e899a23373..1f439c537a 100644 --- a/src/gromacs/fileio/tngio.h +++ b/src/gromacs/fileio/tngio.h @@ -1,7 +1,7 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2013, by the GROMACS development team, led by + * Copyright (c) 2013,2014, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -37,7 +37,7 @@ #define GMX_FILEIO_TNGIO_H #include "gromacs/legacyheaders/typedefs.h" -#include "../../external/tng_io/include/tng_io_fwd.h" +#include "tng/tng_io_fwd.h" #ifdef __cplusplus extern "C" { diff --git a/src/gromacs/fileio/tngio_for_tools.cpp b/src/gromacs/fileio/tngio_for_tools.cpp index 3d7954d136..1c579a6f81 100644 --- a/src/gromacs/fileio/tngio_for_tools.cpp +++ b/src/gromacs/fileio/tngio_for_tools.cpp @@ -44,7 +44,7 @@ #include "trx.h" #ifdef GMX_USE_TNG -#include "../../external/tng_io/include/tng_io.h" +#include "tng/tng_io.h" #endif #include "gromacs/legacyheaders/types/atoms.h" @@ -171,6 +171,9 @@ void gmx_prepare_tng_writing(const char *filename, GMX_UNUSED_VALUE(input); GMX_UNUSED_VALUE(output); GMX_UNUSED_VALUE(nAtoms); + GMX_UNUSED_VALUE(mtop); + GMX_UNUSED_VALUE(index); + GMX_UNUSED_VALUE(indexGroupName); #endif } @@ -201,6 +204,7 @@ void gmx_write_tng_from_trxframe(tng_trajectory_t output, #else GMX_UNUSED_VALUE(output); GMX_UNUSED_VALUE(frame); + GMX_UNUSED_VALUE(natoms); #endif } @@ -427,7 +431,7 @@ gmx_bool gmx_read_next_tng_frame(tng_trajectory_t input, void *values = NULL; double frameTime = -1.0; int size, blockDependency; - float prec; + double prec; const int defaultNumIds = 5; static gmx_int64_t fallbackRequestedIds[defaultNumIds] = { @@ -617,6 +621,7 @@ gmx_bool gmx_read_next_tng_frame(tng_trajectory_t input, GMX_UNUSED_VALUE(input); GMX_UNUSED_VALUE(fr); GMX_UNUSED_VALUE(requestedIds); + GMX_UNUSED_VALUE(numRequestedIds); return FALSE; #endif } @@ -778,7 +783,7 @@ gmx_bool gmx_get_tng_data_next_frame_of_block_type(tng_trajectory_t input, gmx_int64_t codecId; int blockDependency; void *data = 0; - float localPrec; + double localPrec; stat = tng_data_block_name_get(input, blockId, name, maxLen); if (stat != TNG_SUCCESS) diff --git a/src/gromacs/fileio/tngio_for_tools.h b/src/gromacs/fileio/tngio_for_tools.h index ed9cc84a67..f0a31eb250 100644 --- a/src/gromacs/fileio/tngio_for_tools.h +++ b/src/gromacs/fileio/tngio_for_tools.h @@ -37,7 +37,7 @@ #define GMX_FILEIO_TNGIO_FOR_TOOLS_H #include "gromacs/legacyheaders/typedefs.h" -#include "../../external/tng_io/include/tng_io_fwd.h" +#include "tng/tng_io_fwd.h" #ifdef __cplusplus extern "C" { diff --git a/tests/CppCheck.cmake b/tests/CppCheck.cmake index 1d7ac5c8e8..9d4a3d52ee 100644 --- a/tests/CppCheck.cmake +++ b/tests/CppCheck.cmake @@ -71,6 +71,7 @@ if (CPPCHECK_EXECUTABLE AND UNIX) --enable=style -DLINUX -I src/gromacs/legacyheaders -I src -I src/external/thread_mpi/include + -I src/external/tng_io/include -I ${CMAKE_BINARY_DIR}/src -I ${CMAKE_BINARY_DIR}/src/gromacs/utility --quiet ${_outputopt})