diff --git a/.github/workflows/netcdf-cmake.yml b/.github/workflows/netcdf-cmake.yml index 739d1d9536..9daec154dd 100644 --- a/.github/workflows/netcdf-cmake.yml +++ b/.github/workflows/netcdf-cmake.yml @@ -79,9 +79,9 @@ jobs: cmake -C $GITHUB_WORKSPACE/hdf5/config/cmake/cacheinit.cmake \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ - -DHDF5_BUILD_FORTRAN:BOOL=OFF \ - -DHDF5_BUILD_JAVA:BOOL=OFF \ - -DHDF5_BUILD_EXAMPLES:BOOL=OFF \ + -DHDF4_BUILD_FORTRAN:BOOL=OFF \ + -DHDF4_BUILD_JAVA:BOOL=OFF \ + -DHDF4_BUILD_EXAMPLES:BOOL=OFF \ -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ -DBUILD_TESTING:BOOL=OFF \ @@ -109,6 +109,6 @@ jobs: run: | mkdir "netcdf-c/build" cd "netcdf-c/build" - cmake .. -DUILD_SHARED_LIBS=ON -DNETCDF_ENABLE_HDF5=ON -DNETCDF_ENABLE_HDF4=ON + cmake .. -DUILD_SHARED_LIBS=ON -DNETCDF_ENABLE_HDF4=ON -DNETCDF_ENABLE_HDF5=ON make make test diff --git a/CMakeFilters.cmake b/CMakeFilters.cmake index f45e1a606b..18cf35b0e4 100644 --- a/CMakeFilters.cmake +++ b/CMakeFilters.cmake @@ -6,11 +6,17 @@ option (HDF4_USE_ZLIB_NG "Use zlib-ng library as zlib library" OFF) option (HDF4_USE_ZLIB_STATIC "Find static zlib library" OFF) option (HDF4_USE_LIBAEC_STATIC "Find static AEC library" OFF) option (JPEG_USE_EXTERNAL "Use External Library Building for JPEG" OFF) +mark_as_advanced (JPEG_USE_EXTERNAL) option (ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" OFF) +mark_as_advanced (ZLIB_USE_EXTERNAL) option (SZIP_USE_EXTERNAL "Use External Library Building for SZIP" OFF) +mark_as_advanced (SZIP_USE_EXTERNAL) option (JPEG_USE_LOCALCONTENT "Use local file for JPEG FetchContent" OFF) +mark_as_advanced (JPEG_USE_LOCALCONTENT) option (ZLIB_USE_LOCALCONTENT "Use local file for ZLIB FetchContent" OFF) +mark_as_advanced (ZLIB_USE_LOCALCONTENT) option (LIBAEC_USE_LOCALCONTENT "Use local file for LIBAEC FetchContent" OFF) +mark_as_advanced (LIBAEC_USE_LOCALCONTENT) if (NOT JPEG_USE_LOCALCONTENT) set (JPEG_URL ${JPEG_TGZ_ORIGPATH}/${JPEG_TGZ_NAME}) @@ -95,26 +101,40 @@ set(H4_JPEG_FOUND FALSE) if (HDF4_ENABLE_JPEG_LIB_SUPPORT) if (NOT H4_JPEGLIB_HEADER) if (NOT JPEG_USE_EXTERNAL) - set(JPE_FOUND FALSE) - find_package (JPEG NAMES ${JPEG_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS static shared) - if (NOT JPEG_FOUND) - find_package (JPEG) # Legacy find + option (HDF4_MODULE_MODE_JPEG "Prefer module mode to find JPEG" ON) + mark_as_advanced (HDF4_MODULE_MODE_JPEG) + set(JPEG_FOUND FALSE) + if (HDF4_MODULE_MODE_JPEG) + # Expect that the default shared library is expected with FindJPEG.cmake + find_package (JPEG MODULE) + else () + # Expect that a correctly built library with CMake config files is available + if (HDF4_USE_JPEG_STATIC) + set(JPEG_SEARCH_TYPE static) + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + set(JPEG_USE_STATIC_LIBS ${HDF4_USE_JPEG_STATIC}) + endif() + else () + set(JPEG_SEARCH_TYPE shared) + endif () + find_package (JPEG NAMES ${JPEG_PACKAGE_NAME}${HDF_PACKAGE_EXT} CONFIG OPTIONAL_COMPONENTS ${JPEG_SEARCH_TYPE}) endif () set(H4_JPEG_FOUND ${JPEG_FOUND}) if (H4_JPEG_FOUND) set (H4_JPEGLIB_HEADER "jpeglib.h") set (H4_JPEG_INCLUDE_DIR_GEN ${JPEG_INCLUDE_DIR}) - set (H4_JPEG_INCLUDE_DIRS ${H4_JPEG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR}) + set (H4_JPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIRS} ${JPEG_INCLUDE_DIR}) set (LINK_COMP_LIBS ${LINK_COMP_LIBS} ${JPEG_LIBRARIES}) endif () else () if (HDF4_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF4_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ") EXTERNAL_JPEG_LIBRARY (${HDF4_ALLOW_EXTERNAL_SUPPORT}) - message (VERBOSE "JPEGLIB is built") + message (VERBOSE "Filter JPEG is built") set (LINK_COMP_LIBS ${LINK_COMP_LIBS} ${H4_JPEG_STATIC_LIBRARY}) endif () endif () else () + # This project is being called from within another and JPEGLib is already configured set(H4_JPEG_FOUND TRUE) endif () if (H4_JPEG_FOUND) @@ -143,26 +163,32 @@ endif () if (HDF4_ENABLE_Z_LIB_SUPPORT) if (NOT H4_ZLIB_HEADER) if (NOT ZLIB_USE_EXTERNAL) + option (HDF4_MODULE_MODE_ZLIB "Prefer module mode to find ZLIB" ON) + mark_as_advanced (HDF4_MODULE_MODE_ZLIB) if (HDF4_USE_ZLIB_NG) + set (HDF4_MODULE_MODE_ZLIB OFF CACHE BOOL "" FORCE) set (PACKAGE_NAME ${ZLIBNG_PACKAGE_NAME}${HDF_PACKAGE_EXT}) else () set (PACKAGE_NAME ${ZLIB_PACKAGE_NAME}${HDF_PACKAGE_EXT}) endif () set(ZLIB_FOUND FALSE) - if (HDF5_USE_ZLIB_STATIC) - set(ZLIB_SEARCH_TYPE static) + message (VERBOSE "Filter ZLIB package name:${PACKAGE_NAME}") + if (HDF4_MODULE_MODE_ZLIB) + # Expect that the default shared library is expected with FindZLIB.cmake + find_package (ZLIB MODULE) else () - set(ZLIB_SEARCH_TYPE shared) - endif () - # Search pure Config mode first - find_package (ZLIB NAMES ${PACKAGE_NAME} OPTIONAL_COMPONENTS ${ZLIB_SEARCH_TYPE}) - if (NOT ZLIB_FOUND) - if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") - set(ZLIB_USE_STATIC_LIBS ${HDF5_USE_ZLIB_STATIC}) - endif() - find_package (ZLIB) # Legacy find + # Expect that a correctly built library with CMake config files is available + if (HDF4_USE_ZLIB_STATIC) + set(ZLIB_SEARCH_TYPE static) + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + set(ZLIB_USE_STATIC_LIBS ${HDF4_USE_ZLIB_STATIC}) + endif() + else () + set(ZLIB_SEARCH_TYPE shared) + endif () + find_package (ZLIB NAMES ${PACKAGE_NAME} CONFIG OPTIONAL_COMPONENTS ${ZLIB_SEARCH_TYPE}) endif () - set(H4_ZLIB_FOUND ${ZLIB_FOUND}) + set(H4_ZLIB_FOUND ZLIB_FOUND}) if (H4_ZLIB_FOUND) if (HDF4_USE_ZLIB_NG) set (H4_ZLIB_HEADER "zlib-ng.h") @@ -170,18 +196,20 @@ if (HDF4_ENABLE_Z_LIB_SUPPORT) set (H4_ZLIB_HEADER "zlib.h") endif () set (H4_ZLIB_INCLUDE_DIR_GEN ${ZLIB_INCLUDE_DIR}) - set (H4_ZLIB_INCLUDE_DIRS ${H5_ZLIB_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}) - # The FindZLIB.cmake module does not set an OUTPUT_NAME - # on the target. The target returned is: ZLIB::ZLIB - get_filename_component (libname ${ZLIB_LIBRARIES} NAME_WLE) - string (REGEX REPLACE "^lib" "" libname ${libname}) - set_target_properties (ZLIB::ZLIB PROPERTIES OUTPUT_NAME ${libname}) + set (H4_ZLIB_INCLUDE_DIRS ${H4_ZLIB_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}) + if (NOT WIN32) #windows has a list of names + # The FindZLIB.cmake module does not set an OUTPUT_NAME + # on the target. The target returned is: ZLIB::ZLIB + get_filename_component (libname ${ZLIB_LIBRARIES} NAME_WLE) + string (REGEX REPLACE "^lib" "" libname ${libname}) + set_target_properties (ZLIB::ZLIB PROPERTIES OUTPUT_NAME ${libname}) + endif () set (LINK_COMP_LIBS ${LINK_COMP_LIBS} ZLIB::ZLIB) endif () else () if (HDF4_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF4_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ") EXTERNAL_ZLIB_LIBRARY (${HDF4_ALLOW_EXTERNAL_SUPPORT}) - message (VERBOSE "Filter HDF4_ZLIB is built") + message (VERBOSE "Filter ZLIB is built") set (LINK_COMP_LIBS ${LINK_COMP_LIBS} ${H4_ZLIB_STATIC_LIBRARY}) endif () endif () @@ -196,14 +224,13 @@ if (HDF4_ENABLE_Z_LIB_SUPPORT) set (H4_HAVE_ZLIBNG_H 1) endif () set (H4_HAVE_LIBZ 1) - message (VERBOSE "Filter HDF4_ZLIB is ON") set (HDF4_COMP_INCLUDE_DIRECTORIES "${HDF4_COMP_INCLUDE_DIRECTORIES};${H4_ZLIB_INCLUDE_DIRS}") - message (VERBOSE "Filter HDF4_ZLIB is ON") + message (VERBOSE "Filter ZLIB is ON") else () set (HDF4_ENABLE_Z_LIB_SUPPORT OFF CACHE BOOL "" FORCE) message (FATAL_ERROR " ZLib support in HDF4 is required but not found") endif () - message(STATUS "H4_ZLIB_HEADER=${H4_ZLIB_HEADER}") + message (VERBOSE "H4_ZLIB_HEADER=${H4_ZLIB_HEADER}") endif () #----------------------------------------------------------------------------- diff --git a/CMakeLists.txt b/CMakeLists.txt index d731212c19..f13b30eda9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,11 @@ if (POLICY CMP0074) cmake_policy (SET CMP0074 NEW) endif () +if (POLICY CMP0144) + # is the upper-cased package name. + cmake_policy (SET CMP0144 NEW) +endif () + if (POLICY CMP0083) # To control generation of Position Independent Executable (PIE) or not, # some flags are required at link time. @@ -128,8 +133,8 @@ mark_as_advanced (HDF4_EXTERNAL_LIB_SUFFIX) # else () # set (H4_SZIP_HEADER "prj_szip.h") # # Set vars that FindSZIP would have set if used in sub project -# set (SZIP_INCLUDE_DIRS "${PRJ_SZIP_INCLUDE_DIRS}") -# set (SZIP_LIBRARIES prjszip) +# set (H4_SZIP_INCLUDE_DIRS "${PRJ_H4_SZIP_INCLUDE_DIRS}") +# set (H4_SZIP_LIBRARIES prjszip) # endif () # endif () # @@ -253,9 +258,9 @@ set (HDF4_JAVA_JNI_SRC_DIR ${HDF4_SOURCE_DIR}/java/src/jni) set (HDF4_JAVA_HDF_SRC_DIR ${HDF4_SOURCE_DIR}/java/src/hdf) set (HDF4_JAVA_TEST_SRC_DIR ${HDF4_SOURCE_DIR}/java/test) set (HDF4_JAVA_LIB_DIR ${HDF4_SOURCE_DIR}/java/lib) -set (HDF4_JAVA_LOGGING_JAR ${HDF4_SOURCE_DIR}/java/lib/slf4j-api-2.0.6.jar) -set (HDF4_JAVA_LOGGING_NOP_JAR ${HDF4_SOURCE_DIR}/java/lib/ext/slf4j-nop-2.0.6.jar) -set (HDF4_JAVA_LOGGING_SIMPLE_JAR ${HDF4_SOURCE_DIR}/java/lib/ext/slf4j-simple-2.0.6.jar) +set (HDF4_JAVA_LOGGING_JAR ${HDF4_SOURCE_DIR}/java/lib/slf4j-api-2.0.16.jar) +set (HDF4_JAVA_LOGGING_NOP_JAR ${HDF4_SOURCE_DIR}/java/lib/ext/slf4j-nop-2.0.16.jar) +set (HDF4_JAVA_LOGGING_SIMPLE_JAR ${HDF4_SOURCE_DIR}/java/lib/ext/slf4j-simple-2.0.16.jar) set (HDF4_DOXYGEN_DIR ${HDF4_SOURCE_DIR}/doxygen) set (HDF4_SRC_INCLUDE_DIRS ${HDF4_HDFSOURCE_DIR} ${HDF4_MFHDFSOURCE_DIR}) @@ -452,7 +457,7 @@ endif () # Option to Build Shared and Static libs, default is both #----------------------------------------------------------------------------- option (HDF4_ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF) -mark_as_advanced (ONLY_SHARED_LIBS) +mark_as_advanced (HDF4_ONLY_SHARED_LIBS) option (BUILD_STATIC_LIBS "Build Static Libraries" ON) set (H4_ENABLE_STATIC_LIB NO) option (BUILD_SHARED_LIBS "Build Shared Libraries" ON) @@ -462,11 +467,11 @@ option (HDF4_BUILD_STATIC_TOOLS "Build Static Tools NOT Shared Tools" OFF) # only shared libraries/tools is true if user forces static OFF if (NOT BUILD_STATIC_LIBS) - set (ONLY_SHARED_LIBS ON CACHE BOOL "Only Build Shared Libraries" FORCE) + set (HDF4_ONLY_SHARED_LIBS ON CACHE BOOL "Only Build Shared Libraries" FORCE) endif () # only shared libraries is set ON by user then force settings -if (ONLY_SHARED_LIBS) +if (HDF4_ONLY_SHARED_LIBS) set (H4_ENABLE_STATIC_LIB NO) set (BUILD_SHARED_LIBS ON CACHE BOOL "Build Shared Libraries" FORCE) set (BUILD_STATIC_LIBS OFF CACHE BOOL "Build Static Libraries" FORCE) @@ -611,7 +616,7 @@ if (HDF4_BUILD_DOC AND IS_DIRECTORY "${HDF4_DOXYGEN_DIR}") option (HDF4_ENABLE_DOXY_WARNINGS "Enable fail if doxygen parsing has warnings." OFF) mark_as_advanced (HDF4_ENABLE_DOXY_WARNINGS) if (HDF4_ENABLE_DOXY_WARNINGS) - set (HDF4_DOXY_WARNINGS "FAIL_ON_WARNINGS") + set (HDF4_DOXY_WARNINGS "FAIL_ON_WARNINGS_PRINT") else () set (HDF4_DOXY_WARNINGS "NO") endif () diff --git a/CMakePresets.json b/CMakePresets.json index c92e3a543c..b0a80755b1 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -25,7 +25,7 @@ "ZLIB_TGZ_NAME": {"type": "STRING", "value": "zlib-1.3.1.tar.gz"}, "ZLIBNG_PACKAGE_NAME": {"type": "STRING", "value": "zlib-ng"}, "ZLIBNG_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/zlib-ng/zlib-ng/archive/refs/tags"}, - "ZLIBNG_TGZ_NAME": {"type": "STRING", "value": "2.2.2.tar.gz"}, + "ZLIBNG_TGZ_NAME": {"type": "STRING", "value": "2.2.4.tar.gz"}, "LIBAEC_PACKAGE_NAME": {"type": "STRING", "value": "libaec"}, "LIBAEC_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3"}, "LIBAEC_TGZ_NAME": {"type": "STRING", "value": "libaec-1.1.3.tar.gz"} @@ -39,12 +39,12 @@ "HDF4_PACKAGE_EXTLIBS": "ON", "HDF4_ENABLE_SZIP_SUPPORT": "ON", "HDF4_ENABLE_SZIP_ENCODING": "ON", - "HDF5_USE_ZLIB_NG": "OFF", + "HDF4_USE_ZLIB_NG": "OFF", "JPEG_USE_LOCALCONTENT": "OFF", "ZLIB_USE_LOCALCONTENT": "OFF", "LIBAEC_USE_LOCALCONTENT": "OFF", - "HDF5_USE_ZLIB_STATIC": "ON", - "HDF5_USE_LIBAEC_STATIC": "ON" + "HDF4_USE_ZLIB_STATIC": "ON", + "HDF4_USE_LIBAEC_STATIC": "ON" } }, { @@ -167,15 +167,6 @@ "ci-x64-Release-Clang" ] }, - { - "name": "ci-StdShar-GNUC", - "description": "GNUC Standard Build for x64 (Release)", - "configurePreset": "ci-StdShar-GNUC", - "verbose": true, - "inherits": [ - "ci-x64-Release-GNUC" - ] - }, { "name": "ci-StdShar-macos-Clang", "description": "Clang Standard Build for macos (Release)", @@ -193,6 +184,15 @@ "ci-macos-Release-GNUC" ] }, + { + "name": "ci-StdShar-GNUC", + "description": "GNUC Standard Build for x64 (Release)", + "configurePreset": "ci-StdShar-GNUC", + "verbose": true, + "inherits": [ + "ci-x64-Release-GNUC" + ] + }, { "name": "ci-StdShar-GNUC-Fortran", "description": "GNUC Standard Fortran Build for x64 (Release)", @@ -303,11 +303,6 @@ "configurePreset": "ci-StdShar-Clang-Fortran", "inherits": "ci-x64-Release-Clang" }, - { - "name": "ci-StdShar-GNUC", - "configurePreset": "ci-StdShar-GNUC", - "inherits": "ci-x64-Release-GNUC" - }, { "name": "ci-StdShar-macos-Clang", "configurePreset": "ci-StdShar-macos-Clang", @@ -318,6 +313,11 @@ "configurePreset": "ci-StdShar-macos-GNUC", "inherits": "ci-macos-Release-GNUC" }, + { + "name": "ci-StdShar-GNUC", + "configurePreset": "ci-StdShar-GNUC", + "inherits": "ci-x64-Release-GNUC" + }, { "name": "ci-StdShar-GNUC-Fortran", "configurePreset": "ci-StdShar-GNUC-Fortran", diff --git a/HDF4Examples/CMakeLists.txt b/HDF4Examples/CMakeLists.txt index 8f37c6fe0f..ab7a8fa982 100644 --- a/HDF4Examples/CMakeLists.txt +++ b/HDF4Examples/CMakeLists.txt @@ -103,9 +103,7 @@ endif () #----------------------------------------------------------------------------- # Build examples #----------------------------------------------------------------------------- -if (H4EX_BUILD_C) - add_subdirectory (C) -endif () +add_subdirectory (C) if (H4EX_BUILD_FORTRAN AND HDF4_BUILD_FORTRAN) add_subdirectory (FORTRAN) endif () diff --git a/HDF4Examples/config/cmake/HDFExampleMacros.cmake b/HDF4Examples/config/cmake/HDFExampleMacros.cmake index 136ae0e004..0bfee1fa43 100644 --- a/HDF4Examples/config/cmake/HDFExampleMacros.cmake +++ b/HDF4Examples/config/cmake/HDFExampleMacros.cmake @@ -94,7 +94,7 @@ macro (BASIC_SETTINGS varname) endmacro () macro (HDF4_SUPPORT) - set (CMAKE_MODULE_PATH ${H4_RESOURCES_DIR} ${CMAKE_MODULE_PATH}) + set (CMAKE_MODULE_PATH ${H4EX_RESOURCES_DIR} ${CMAKE_MODULE_PATH}) option (USE_SHARED_LIBS "Use Shared Libraries" ON) if (NOT H4EX_HDF4_HEADER) diff --git a/HDF4Examples/config/cmake/grepTest.cmake b/HDF4Examples/config/cmake/grepTest.cmake index ea28282ad2..bf02406125 100644 --- a/HDF4Examples/config/cmake/grepTest.cmake +++ b/HDF4Examples/config/cmake/grepTest.cmake @@ -11,12 +11,12 @@ endif () if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () -if (NOT TEST_FILTER) - message (STATUS "Optional TEST_FILTER to be defined") -endif () if (NOT TEST_REFERENCE) message (FATAL_ERROR "Require TEST_REFERENCE to be defined") endif () +if (NOT TEST_FILTER) + message (VERBOSE "Optional TEST_FILTER is not defined") +endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) @@ -28,7 +28,7 @@ endif () message (STATUS "COMMAND: ${TEST_EMULATOR} ${TEST_PROGRAM} ${TEST_ARGS}") -if (TEST_LIBRARY_DIRECTORY) +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH if (WIN32) set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") elseif (APPLE) @@ -53,45 +53,52 @@ execute_process ( OUTPUT_VARIABLE TEST_OUT ERROR_VARIABLE TEST_ERROR ) - message (STATUS "COMMAND Result: ${TEST_RESULT}") message (STATUS "COMMAND Error: ${TEST_ERROR}") -# remove special output +# remove special regex text from the output if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) string (FIND "${TEST_STREAM}" "_pmi_alps" TEST_FIND_RESULT) if (TEST_FIND_RESULT GREATER -1) string (REGEX REPLACE "^.*_pmi_alps[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () string (FIND "${TEST_STREAM}" "ulimit -s" TEST_FIND_RESULT) if (TEST_FIND_RESULT GREATER -1) string (REGEX REPLACE "^.*ulimit -s[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () endif () # if the TEST_ERRREF exists grep the error output with the error reference -set (TEST_ERRREF_RESULT 0) +set (TEST_ERRREF_RESULT 0) # grep result variable; 0 is success +# TEST_ERRREF should always be matched if (TEST_ERRREF) # if the .err file exists grep the error output with the error reference before comparing stdout if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_ERR_STREAM) list (LENGTH TEST_ERR_STREAM test_len) + # verify there is text output in the error file if (test_len GREATER 0) - # TEST_ERRREF should always be matched string (REGEX MATCH "${TEST_ERRREF}" TEST_MATCH ${TEST_ERR_STREAM}) string (COMPARE EQUAL "${TEST_ERRREF}" "${TEST_MATCH}" TEST_ERRREF_RESULT) if (NOT TEST_ERRREF_RESULT) - message (FATAL_ERROR "Failed: The error output of ${TEST_PROGRAM} did not contain ${TEST_ERRREF}") + # dump the output unless nodisplay option is set + if (NOT TEST_NO_DISPLAY) + execute_process ( + COMMAND ${CMAKE_COMMAND} -E echo ${TEST_ERR_STREAM} + RESULT_VARIABLE TEST_ERRREF_RESULT + ) + endif () + message (FATAL_ERROR "Failed: The error output of ${TEST_PROGRAM} did not contain '${TEST_ERRREF}'. Error output was: '${TEST_ERR_STREAM}'") endif () endif () endif () - #always compare output file to reference unless this must be skipped - set (TEST_COMPARE_RESULT 0) + # compare output files to references unless this must be skipped + set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) @@ -117,17 +124,25 @@ if (TEST_ERRREF) list (SORT v1) list (SORT v2) if (NOT v1 STREQUAL v2) - set(TEST_COMPARE_RESULT 1) + set (TEST_COMPARE_RESULT 1) endif () endif () + # only compare files if previous operations were successful if (TEST_COMPARE_RESULT) set (TEST_COMPARE_RESULT 0) file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) list (LENGTH test_act len_act) file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) list (LENGTH test_ref len_ref) + if (NOT len_act EQUAL len_ref) + set (TEST_COMPARE_RESULT 1) + endif () if (len_act GREATER 0 AND len_ref GREATER 0) + if (TEST_SORT_COMPARE) + list (SORT test_act) + list (SORT test_ref) + endif () math (EXPR _FP_LEN "${len_ref} - 1") foreach (line RANGE 0 ${_FP_LEN}) list (GET test_act ${line} str_act) @@ -159,35 +174,42 @@ if (TEST_ERRREF) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () - endif () -else () - # else grep the output with the reference - set (TEST_GREP_RESULT 0) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - # TEST_REFERENCE should always be matched - string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM}) - string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_GREP_RESULT) - if (NOT TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") + endif () # end of TEST_SKIP_COMPARE +else () # TEST_ERRREF is not defined + # TEST_REFERENCE should always be matched unless TEST_GREP_COMPARE is set to 0 + set (TEST_GREP_RESULT 0) # grep result variable; 0 is success + if (TEST_GREP_COMPARE AND EXISTS "${TEST_PROCESSED_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM}) + string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_GREP_RESULT) + if (NOT TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") + endif () endif () endif () endif () - +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 if (TEST_FILTER) - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) + if (EXISTS "${TEST_PROCESSED_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") + endif () endif () endif () endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) diff --git a/HDF4Examples/config/cmake/jrunTest.cmake b/HDF4Examples/config/cmake/jrunTest.cmake index a02a0c52d7..938f73a0d6 100644 --- a/HDF4Examples/config/cmake/jrunTest.cmake +++ b/HDF4Examples/config/cmake/jrunTest.cmake @@ -1,6 +1,7 @@ # jrunTest.cmake executes a command and captures the output in a file. File is then compared # against a reference file. Exit status of command can also be compared. cmake_policy(SET CMP0007 NEW) +cmake_policy(SET CMP0053 NEW) # arguments checking if (NOT TEST_TESTER) @@ -9,17 +10,17 @@ endif () if (NOT TEST_PROGRAM) message (FATAL_ERROR "Require TEST_PROGRAM to be defined") endif () -if (NOT TEST_LIBRARY_DIRECTORY) - message (STATUS "Require TEST_LIBRARY_DIRECTORY to be defined") -endif () if (NOT TEST_FOLDER) message (FATAL_ERROR "Require TEST_FOLDER to be defined") endif () if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () +if (NOT TEST_LIBRARY_DIRECTORY) # Directory to add to PATH + message (VERBOSE "Optional TEST_LIBRARY_DIRECTORY is not defined") +endif () if (NOT TEST_CLASSPATH) - message (STATUS "Require TEST_CLASSPATH to be defined") + message (VERBOSE "Optional TEST_CLASSPATH is not defined") endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") @@ -30,7 +31,7 @@ if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err) endif () -if (NOT TEST_LOG_LEVEL) +if (NOT TEST_LOG_LEVEL) # java logger verbosity level set (LOG_LEVEL "info") else () set (LOG_LEVEL "${TEST_LOG_LEVEL}") @@ -38,12 +39,19 @@ endif () message (STATUS "COMMAND: ${TEST_TESTER} -Xmx1024M -Dorg.slf4j.simpleLogger.defaultLog=${LOG_LEVEL} -Djava.library.path=\"${TEST_LIBRARY_DIRECTORY}\" -cp \"${TEST_CLASSPATH}\" ${TEST_ARGS} ${TEST_PROGRAM} ${ARGN}") -if (WIN32) - set (ENV{PATH} "$ENV{PATH}\\;${TEST_LIBRARY_DIRECTORY}") -elseif (APPLE) - set (ENV{DYLD_LIBRARY_PATH} "$ENV{DYLD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") -else () - set (ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH + if (WIN32) + set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") + elseif (APPLE) + set (ENV{DYLD_LIBRARY_PATH} "$ENV{DYLD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") + else () + set (ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") + endif () +endif () + +if (TEST_ENV_VAR) + set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}") + message (TRACE "ENV:${TEST_ENV_VAR}=$ENV{${TEST_ENV_VAR}}") endif () # run the test program, capture the stdout/stderr and the result var @@ -60,24 +68,25 @@ execute_process ( OUTPUT_VARIABLE TEST_OUT ERROR_VARIABLE TEST_ERROR ) - message (STATUS "COMMAND Result: ${TEST_RESULT}") +message (STATUS "COMMAND Error: ${TEST_ERROR}") + # if the .err file exists and ERRROR_APPEND is enabled if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) list (LENGTH TEST_STREAM test_len) if (test_len GREATER 0) - if (TEST_MASK_FILE) + if (TEST_MASK_FILE) # replace directory name with generic name STRING(REGEX REPLACE "CurrentDir is [^\n]+\n" "CurrentDir is (dir name)\n" TEST_STREAM "${TEST_STREAM}") endif () if (NOT ERROR_APPEND) # write back to original .err file - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) else () # append error output to the stdout output file - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () endif () endif () @@ -86,10 +95,14 @@ endif () if (TEST_MASK_ERROR) if (NOT TEST_ERRREF) # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + endif () else () # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + endif () endif () string (REGEX REPLACE "Time:[^\n]+\n" "Time: XXXX\n" TEST_STREAM "${TEST_STREAM}") string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}") @@ -99,9 +112,9 @@ if (TEST_MASK_ERROR) string (REGEX REPLACE "HDF4 .[1-9]*[.][0-9]*[.][0-9]*[^)]*" "HDF4 (version (number)" TEST_STREAM "${TEST_STREAM}") # write back the changes to the original files if (NOT TEST_ERRREF) - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) endif () endif () @@ -111,71 +124,81 @@ if (NOT TEST_RESULT EQUAL TEST_EXPECT) message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != 0.\n${TEST_ERROR}") endif () -message (STATUS "COMMAND Error: ${TEST_ERROR}") - # compare output files to references unless this must be skipped -set (TEST_COMPARE_RESULT 0) +set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - if (WIN32) - configure_file(${TEST_FOLDER}/${TEST_REFERENCE} ${TEST_FOLDER}/${TEST_REFERENCE}.tmp NEWLINE_STYLE CRLF) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}.tmp") - file(RENAME ${TEST_FOLDER}/${TEST_REFERENCE}.tmp ${TEST_FOLDER}/${TEST_REFERENCE}) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + # verify there is text output in the reference file + if (test_len GREATER 0) + if (WIN32) + configure_file(${TEST_FOLDER}/${TEST_REFERENCE} ${TEST_FOLDER}/${TEST_REFERENCE}.tmp NEWLINE_STYLE CRLF) + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}.tmp") + file(RENAME ${TEST_FOLDER}/${TEST_REFERENCE}.tmp ${TEST_FOLDER}/${TEST_REFERENCE}) + endif () endif () - #file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - #file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") - endif () - if (NOT TEST_SORT_COMPARE) - # now compare the output with the reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} - RESULT_VARIABLE TEST_COMPARE_RESULT - ) - else () - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) - list (SORT v1) - list (SORT v2) - if (NOT v1 STREQUAL v2) - set(TEST_COMPARE_RESULT 1) + if (NOT TEST_SORT_COMPARE) + # now compare the output with the reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} + RESULT_VARIABLE TEST_COMPARE_RESULT + ) + else () # sort the output files first before comparing + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) + list (SORT v1) + list (SORT v2) + if (NOT v1 STREQUAL v2) + set (TEST_COMPARE_RESULT 1) + endif () endif () - endif () - if (TEST_COMPARE_RESULT) - set (TEST_COMPARE_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) - list (LENGTH test_ref len_ref) - if (len_act GREATER 0 AND len_ref GREATER 0) - math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) + # only compare files if previous operations were successful + if (TEST_COMPARE_RESULT) + set (TEST_COMPARE_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) + list (LENGTH test_ref len_ref) + if (NOT len_act EQUAL len_ref) + set (TEST_COMPARE_RESULT 1) + endif () + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + if (line GREATER_EQUAL len_act) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_OUTPUT}") set (TEST_COMPARE_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + break () + elseif (line GREATER_EQUAL len_ref) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_REFERENCE}") + set (TEST_COMPARE_RESULT 1) + break () + else () + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_COMPARE_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") - endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_COMPARE_RESULT 1) - endif () - endif () - endif () + endif () # TEST_COMPARE_RESULT + endif () # test_len GREATER 0 + endif () # EXISTS "${TEST_FOLDER}/${TEST_REFERENCE} message (STATUS "COMPARE Result: ${TEST_COMPARE_RESULT}") @@ -183,72 +206,75 @@ if (NOT TEST_SKIP_COMPARE) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () # now compare the .err file with the error reference, if supplied - set (TEST_ERRREF_RESULT 0) - if (TEST_ERRREF) - file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - if (WIN32) - configure_file(${TEST_FOLDER}/${TEST_ERRREF} ${TEST_FOLDER}/${TEST_ERRREF}.tmp NEWLINE_STYLE CRLF) - if (EXISTS "${TEST_FOLDER}/${TEST_ERRREF}.tmp") - file(RENAME ${TEST_FOLDER}/${TEST_ERRREF}.tmp ${TEST_FOLDER}/${TEST_ERRREF}) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + set (TEST_ERRREF_RESULT 0) + if (TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF}") + file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + if (WIN32) + configure_file(${TEST_FOLDER}/${TEST_ERRREF} ${TEST_FOLDER}/${TEST_ERRREF}.tmp NEWLINE_STYLE CRLF) + if (EXISTS "${TEST_FOLDER}/${TEST_ERRREF}.tmp") + file(RENAME ${TEST_FOLDER}/${TEST_ERRREF}.tmp ${TEST_FOLDER}/${TEST_ERRREF}) + endif () endif () - #file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - #file (WRITE ${TEST_FOLDER}/${TEST_ERRREF} "${TEST_STREAM}") - endif () - - # now compare the error output with the error reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} - RESULT_VARIABLE TEST_ERRREF_RESULT - ) - if (TEST_ERRREF_RESULT) - set (TEST_ERRREF_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) - list (LENGTH test_ref len_ref) - math (EXPR _FP_LEN "${len_ref} - 1") - if (len_act GREATER 0 AND len_ref GREATER 0) + # now compare the error output with the error reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} + RESULT_VARIABLE TEST_ERRREF_RESULT + ) + if (TEST_ERRREF_RESULT) + set (TEST_ERRREF_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) + list (LENGTH test_ref len_ref) math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) - set (TEST_ERRREF_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_ERRREF_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") + if (NOT len_act EQUAL len_ref) + set (TEST_ERRREF_RESULT 1) endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_ERRREF_RESULT 1) - endif () - endif () - endif () + endif () # TEST_ERRREF_RESULT + endif () # test_len GREATER 0 - message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") + message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") - # again, if return value is !=0 scream and shout - if (TEST_ERRREF_RESULT) - message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") - endif () + # again, if return value is !=0 scream and shout + if (TEST_ERRREF_RESULT) + message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") + endif () + endif () # TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF} + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT}.err does not exist") endif () endif () set (TEST_GREP_RESULT 0) -if (TEST_GREP_COMPARE) +if (TEST_GREP_COMPARE AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") # now grep the output with the reference file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) list (LENGTH TEST_STREAM test_len) @@ -259,29 +285,32 @@ if (TEST_GREP_COMPARE) if (NOT TEST_GREP_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") endif () + endif () +endif () - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) - # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") - endif () +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 +if (TEST_FILTER AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) + # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") endif () endif () endif () # dump the output unless nodisplay option is set -if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - execute_process ( - COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} - RESULT_VARIABLE TEST_RESULT - ) - endif () +if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + execute_process ( + COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} + RESULT_VARIABLE TEST_RESULT + ) endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) diff --git a/HDF4Examples/config/cmake/runTest.cmake b/HDF4Examples/config/cmake/runTest.cmake index c7927d54da..89ec1e242e 100644 --- a/HDF4Examples/config/cmake/runTest.cmake +++ b/HDF4Examples/config/cmake/runTest.cmake @@ -1,6 +1,7 @@ # runTest.cmake executes a command and captures the output in a file. File is then compared # against a reference file. Exit status of command can also be compared. cmake_policy(SET CMP0007 NEW) +cmake_policy(SET CMP0053 NEW) # arguments checking if (NOT TEST_PROGRAM) @@ -13,7 +14,7 @@ if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () if (NOT TEST_EXPECT) - message (STATUS "Require TEST_EXPECT to be defined") + message (VERBOSE "Optional TEST_EXPECT is not defined") endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") @@ -26,7 +27,7 @@ endif () message (STATUS "COMMAND: ${TEST_EMULATOR} ${TEST_PROGRAM} ${TEST_ARGS}") -if (TEST_LIBRARY_DIRECTORY) +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH if (WIN32) set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") elseif (APPLE) @@ -38,7 +39,7 @@ endif () if (TEST_ENV_VAR) set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}") - #message (STATUS "ENV:${TEST_ENV_VAR}=$ENV{${TEST_ENV_VAR}}") + message (TRACE "ENV:${TEST_ENV_VAR}=$ENV{${TEST_ENV_VAR}}") endif () if (NOT TEST_INPUT) @@ -66,44 +67,59 @@ else () ) endif () +message (STATUS "COMMAND Result: ${TEST_RESULT}") + +# append the test result status with a predefined text +if (TEST_APPEND) + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n") +endif () + +message (STATUS "COMMAND Error: ${TEST_ERROR}") + +############################################# +# Begin of file filtering +############################################# if (TEST_REGEX) - # TEST_REGEX should always be matched - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX MATCH "${TEST_REGEX}" REGEX_MATCH ${TEST_STREAM}) - string (COMPARE EQUAL "${REGEX_MATCH}" "${TEST_MATCH}" REGEX_RESULT) - if (NOT REGEX_RESULT) - message (STATUS "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_MATCH}") + # TEST_REGEX and TEST_MATCH should always be checked + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_REGEX}" REGEX_MATCH ${TEST_STREAM}) + string (COMPARE EQUAL "${REGEX_MATCH}" "${TEST_MATCH}" REGEX_RESULT) + if (NOT REGEX_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_MATCH}") + endif () + else () + message (STATUS "Failed: No output of ${TEST_PROGRAM}") endif () endif () -message (STATUS "COMMAND Result: ${TEST_RESULT}") - -# if the .err file exists and ERRROR_APPEND is enabled +# if the .err file exists if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) list (LENGTH TEST_STREAM test_len) if (test_len GREATER 0) - if (TEST_MASK_FILE) + if (TEST_MASK_FILE) # replace directory name with generic name STRING(REGEX REPLACE "CurrentDir is [^\n]+\n" "CurrentDir is (dir name)\n" TEST_STREAM "${TEST_STREAM}") endif () # remove special output string (REGEX REPLACE "^.*_pmi_alps[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) + if (TEST_FIND_RESULT GREATER -1) + string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + # write back the changes to the original files + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + endif () if (NOT ERROR_APPEND) # write back to original .err file - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) else () # append error output to the stdout output file - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () endif () endif () -# append the test result status with a predefined text -if (TEST_APPEND) - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n") -endif () - # if the return value is !=${TEST_EXPECT} bail out if (NOT TEST_RESULT EQUAL TEST_EXPECT) if (NOT TEST_NOERRDISPLAY) @@ -119,64 +135,48 @@ if (NOT TEST_RESULT EQUAL TEST_EXPECT) message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}") endif () -message (STATUS "COMMAND Error: ${TEST_ERROR}") - -# remove special output +# remove special regex text from the output if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) string (FIND "${TEST_STREAM}" "_pmi_alps" TEST_FIND_RESULT) if (TEST_FIND_RESULT GREATER -1) string (REGEX REPLACE "^.*_pmi_alps[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () string (FIND "${TEST_STREAM}" "ulimit -s" TEST_FIND_RESULT) if (TEST_FIND_RESULT GREATER -1) string (REGEX REPLACE "^.*ulimit -s[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) + endif () + string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) + if (TEST_FIND_RESULT GREATER -1) + string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") endif () -endif () - -# remove special error output -if (NOT TEST_ERRREF) - # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) -else () - # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) -endif () -string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) -if (TEST_FIND_RESULT GREATER -1) - string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") - # write back the changes to the original files - if (NOT TEST_ERRREF) + # if the output file needs Storage text masked out + if (TEST_MASK_STORE) + string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:
\n" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + endif () + # if the output file needs Modified text removed + if (TEST_MASK_MOD) + string (REGEX REPLACE "Modified:[^\n]+\n" "Modified: XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}") file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") - else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") endif () -endif () - -# if the output file needs Storage text removed -if (TEST_MASK) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:
\n" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") -endif () - -# if the output file needs Modified text removed -if (TEST_MASK_MOD) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "Modified:[^\n]+\n" "Modified: XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") endif () # if the output file or the .err file needs to mask out error stack info if (TEST_MASK_ERROR) if (NOT TEST_ERRREF) # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + endif () else () # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + endif () endif () string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}") string (REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}") @@ -185,85 +185,117 @@ if (TEST_MASK_ERROR) string (REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}") # write back the changes to the original files if (NOT TEST_ERRREF) - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) + endif () +endif () + +if (TEST_REF_FILTER) + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + string (REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") endif () endif () -# remove text from the output file +# replace text from the output file if (TEST_FILTER) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "${TEST_FILTER}" "${TEST_FILTER_REPLACE}" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + message (STATUS "TEST_FILTER: ${TEST_FILTER} TEST_FILTER_REPLACE: ${TEST_FILTER_REPLACE}") + string (REGEX REPLACE "${TEST_FILTER}" "${TEST_FILTER_REPLACE}" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + endif () endif () -if (TEST_REF_FILTER) - #message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - string (REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") +# mask text in the output file +set(TEST_PROCESSED_OUTPUT "${TEST_FOLDER}/${TEST_OUTPUT}") +set(TEST_PROCESSED_REFERENCE "${TEST_FOLDER}/${TEST_REFERENCE}") + +if (TEST_MASK AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + H4_MASK_FILE("${TEST_FOLDER}/${TEST_OUTPUT}") + # Later comparisons should use the masked value + set(TEST_PROCESSED_OUTPUT "${TEST_FOLDER}/${TEST_OUTPUT}_masked") + set(TEST_PROCESSED_REFERENCE "${TEST_FOLDER}/${TEST_REFERENCE}_masked") endif () +############################################# +# End of file filtering +############################################# + # compare output files to references unless this must be skipped -set (TEST_COMPARE_RESULT 0) +set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - - if (NOT TEST_SORT_COMPARE) - # now compare the output with the reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} - RESULT_VARIABLE TEST_COMPARE_RESULT - ) - else () - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) - list (SORT v1) - list (SORT v2) - if (NOT v1 STREQUAL v2) - set (TEST_COMPARE_RESULT 1) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + # verify there is text output in the reference file + if (test_len GREATER 0) + if (NOT TEST_SORT_COMPARE) + # now compare the output with the reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_PROCESSED_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} + RESULT_VARIABLE TEST_COMPARE_RESULT + ) + else () # sort the output files first before comparing + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) + list (SORT v1) + list (SORT v2) + if (NOT v1 STREQUAL v2) + set (TEST_COMPARE_RESULT 1) + endif () endif () - endif () - if (TEST_COMPARE_RESULT) - set (TEST_COMPARE_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) - list (LENGTH test_ref len_ref) - if (NOT len_act EQUAL len_ref) - set (TEST_COMPARE_RESULT 1) - endif () - if (len_act GREATER 0 AND len_ref GREATER 0) - if (TEST_SORT_COMPARE) - list (SORT test_act) - list (SORT test_ref) + # only compare files if previous operations were successful + if (TEST_COMPARE_RESULT) + set (TEST_COMPARE_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) + list (LENGTH test_ref len_ref) + if (NOT len_act EQUAL len_ref) + set (TEST_COMPARE_RESULT 1) endif () - math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) + if (len_act GREATER 0 AND len_ref GREATER 0) + if (TEST_SORT_COMPARE) + list (SORT test_act) + list (SORT test_ref) + endif () + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + if (line GREATER_EQUAL len_act) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_PROCESSED_OUTPUT}") + set (TEST_COMPARE_RESULT 1) + break () + elseif (line GREATER_EQUAL len_ref) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_PROCESSED_REFERENCE}") set (TEST_COMPARE_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + break () + else () + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_COMPARE_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") - endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endif () - endif () - endif () + endif () # TEST_COMPARE_RESULT + endif () # test_len GREATER 0 + endif () # EXISTS "${TEST_FOLDER}/${TEST_REFERENCE} message (STATUS "COMPARE Result: ${TEST_COMPARE_RESULT}") @@ -271,64 +303,69 @@ if (NOT TEST_SKIP_COMPARE) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () # now compare the .err file with the error reference, if supplied - set (TEST_ERRREF_RESULT 0) - if (TEST_ERRREF) - file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - - # now compare the error output with the error reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} - RESULT_VARIABLE TEST_ERRREF_RESULT - ) - if (TEST_ERRREF_RESULT) - set (TEST_ERRREF_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) - list (LENGTH test_ref len_ref) - math (EXPR _FP_LEN "${len_ref} - 1") - if (len_act GREATER 0 AND len_ref GREATER 0) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + set (TEST_ERRREF_RESULT 0) + if (TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF}") + file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + # now compare the error output with the error reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} + RESULT_VARIABLE TEST_ERRREF_RESULT + ) + if (TEST_ERRREF_RESULT) + set (TEST_ERRREF_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) + list (LENGTH test_ref len_ref) math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) - set (TEST_ERRREF_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_ERRREF_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") + if (NOT len_act EQUAL len_ref) + set (TEST_ERRREF_RESULT 1) endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_ERRREF_RESULT 1) - endif () - endif () - endif () + endif () # TEST_ERRREF_RESULT + endif () # test_len GREATER 0 - message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") + message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") - # again, if return value is !=0 scream and shout - if (TEST_ERRREF_RESULT) - message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") - endif () + # again, if return value is !=0 scream and shout + if (TEST_ERRREF_RESULT) + message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") + endif () + endif () # TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF} + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT}.err does not exist") endif () -endif () +endif () # TEST_SKIP_COMPARE set (TEST_GREP_RESULT 0) -if (TEST_GREP_COMPARE) +if (TEST_GREP_COMPARE AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") # now grep the output with the reference file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) list (LENGTH TEST_STREAM test_len) @@ -339,20 +376,24 @@ if (TEST_GREP_COMPARE) if (NOT TEST_GREP_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") endif () + endif () +endif () - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) - # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") - endif () +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 +if (TEST_FILTER AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) + # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") endif () endif () endif () # dump the output unless nodisplay option is set -if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) +if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) execute_process ( COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} @@ -360,11 +401,8 @@ if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) ) endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}" AND NOT TEST_SAVE) - file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) - endif () - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err) endif () diff --git a/config/cmake/CTestCustom.cmake b/config/cmake/CTestCustom.cmake index 46ee93c817..8b82d2098e 100644 --- a/config/cmake/CTestCustom.cmake +++ b/config/cmake/CTestCustom.cmake @@ -1,28 +1,36 @@ # CTestCustom.cmake set (CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 3000) +# Allow full output to go to CDash set to 0 +set (CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE 50000) +set (CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE 50000) +# WARNING! This could be a lot of output and could overwhelm CDash and the +# MySQL DB so this might not be a good idea! set (CTEST_CUSTOM_WARNING_EXCEPTION ${CTEST_CUSTOM_WARNING_EXCEPTION} + "note.*expected.*void.*but argument is of type.*volatile" + "plugin-build.*:[ \t]*warning" + "stamp.verify" + "CMake Warning*stamp" + "src.ZLIB.*:[ \t]*warning" + "src.ZLIB.*:[ \t]*warning" + "warning LNK4197:.*ZLIB-prefix" + "src.SZIP.*:[ \t]*warning" + "disabling jobserver mode" + "config.cmake.xlatefile.c" + "warning.*unknown pragma" + "warning.*unrecognized .pragma" +# "note: expanded from macro" + "This directive is not standard" ".*note.*expected.*void.*but argument is of type.*volatile.*" - ".*src.SZIP.*" - ".*src.ZLIB.*" - ".*src.JPEG.*" - ".*szip.src.*" - ".*zlib.src.*" - ".*jpeg.src.*" + ".*src.SZIP.*:[ \t]*warning.*" + ".*src.ZLIB.*:[ \t]*warning.*" + ".*src.ZLIB.*:[ \t]*warning.*" + ".*src.JPEG.*:[ \t]*warning.*" ".*POSIX name for this item is deprecated.*" ".*disabling jobserver mode.*" ".*warning.*implicit declaration of function.*" ".*note: expanded from macro.*" - "note.*expected.*void.*but argument is of type.*volatile.*" - "stamp.verify" - "CMake Warning*stamp" - "warning LNK4197:.*ZLIB-prefix" - "warning LNK4197:.*SZIP-prefix" - "warning LNK4197:.*JPEG-prefix" - "POSIX name for this item is deprecated.*" - "disabling jobserver mode.*" -# "note: expanded from macro.*" ) set (CTEST_CUSTOM_MEMCHECK_IGNORE diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake index 94aa710c90..70f4bea8e1 100644 --- a/config/cmake/ConfigureChecks.cmake +++ b/config/cmake/ConfigureChecks.cmake @@ -45,7 +45,6 @@ if (MINGW) set (${HDF_PREFIX}_HAVE_MINGW 1) set (WINDOWS 1) # MinGW tries to imitate Windows set (CMAKE_REQUIRED_FLAGS "-DWIN32_LEAN_AND_MEAN=1 -DNOGDI=1") - set (${HDF_PREFIX}_HAVE_WINSOCK2_H 1) set (__USE_MINGW_ANSI_STDIO 1) endif () @@ -62,7 +61,7 @@ if (WIN32 AND NOT MINGW) endif () if (WINDOWS) - set (CMAKE_REQUIRED_LIBRARIES "ws2_32.lib;wsock32.lib") + set (HDF4_REQUIRED_LIBRARIES "ws2_32.lib;wsock32.lib") set (${HDF_PREFIX}_HAVE_WIN32_API 1) set (${HDF_PREFIX}_HAVE_SYSTEM 1) if (NOT UNIX AND NOT CYGWIN) @@ -93,19 +92,19 @@ endmacro () # Check for the existence of certain header files #----------------------------------------------------------------------------- CHECK_INCLUDE_FILE_CONCAT ("fcntl.h" ${HDF_PREFIX}_HAVE_FCNTL_H) -CHECK_INCLUDE_FILE_CONCAT ("unistd.h" ${HDF_PREFIX}_HAVE_UNISTD_H) -CHECK_INCLUDE_FILE_CONCAT ("arpa/inet.h" ${HDF_PREFIX}_HAVE_INET_H) -CHECK_INCLUDE_FILE_CONCAT ("netinet/in.h" ${HDF_PREFIX}_HAVE_NETINET_IN_H) CHECK_INCLUDE_FILE_CONCAT ("sys/file.h" ${HDF_PREFIX}_HAVE_SYS_FILE_H) CHECK_INCLUDE_FILE_CONCAT ("sys/resource.h" ${HDF_PREFIX}_HAVE_SYS_RESOURCE_H) CHECK_INCLUDE_FILE_CONCAT ("sys/stat.h" ${HDF_PREFIX}_HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE_CONCAT ("sys/time.h" ${HDF_PREFIX}_HAVE_SYS_TIME_H) CHECK_INCLUDE_FILE_CONCAT ("sys/types.h" ${HDF_PREFIX}_HAVE_SYS_TYPES_H) +CHECK_INCLUDE_FILE_CONCAT ("unistd.h" ${HDF_PREFIX}_HAVE_UNISTD_H) +CHECK_INCLUDE_FILE_CONCAT ("netinet/in.h" ${HDF_PREFIX}_HAVE_NETINET_IN_H) +CHECK_INCLUDE_FILE_CONCAT ("arpa/inet.h" ${HDF_PREFIX}_HAVE_INET_H) CHECK_INCLUDE_FILE_CONCAT ("sys/wait.h" ${HDF_PREFIX}_HAVE_SYS_WAIT_H) -# Windows -if (NOT CYGWIN) - CHECK_INCLUDE_FILE_CONCAT ("winsock2.h" ${HDF_PREFIX}_HAVE_WINSOCK2_H) +if (MINGW OR CYGWIN) + set (CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE") + add_definitions ("-D_GNU_SOURCE") endif () #----------------------------------------------------------------------------- @@ -130,32 +129,59 @@ endif () #----------------------------------------------------------------------------- set (HDF_EXTRA_C_FLAGS) -set (HDF_EXTRA_FLAGS) -if (MINGW OR NOT WINDOWS) - # Might want to check explicitly for Linux and possibly Cygwin - # instead of checking for not Solaris or Darwin. - if (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN) - # Linux Specific flags - # - # This is needed so strdup, etc. are exposed properly - # - # POSIX feature information can be found in the gcc manual at: - # http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html - set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200809L) - - set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${HDF_EXTRA_FLAGS}) - endif () -endif () -if (CYGWIN) - set (CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE") - add_definitions ("-D_GNU_SOURCE") +# Linux-specific flags +if (CMAKE_SYSTEM_NAME MATCHES "Linux") + # This was originally defined as _POSIX_SOURCE which was updated to + # _POSIX_C_SOURCE=199506L to expose a greater amount of POSIX + # functionality so clock_gettime and CLOCK_MONOTONIC are defined + # correctly. This was later updated to 200112L so that + # posix_memalign() is visible for the direct VFD code on Linux + # systems. Even later, this was changed to 200809L to support + # pread/pwrite in VFDs. + # + # POSIX feature information can be found in the gcc manual at: + # http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html + set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200809L) + + # Need to add this so that O_DIRECT is visible for the direct + # VFD on Linux systems. + set (HDF_EXTRA_C_FLAGS ${HDF_EXTRA_C_FLAGS} -D_GNU_SOURCE) + + # Set up large file support. This is only necessary on 32-bit systems + # but is used on all Linux systems. It has no effect on 64-bit systems + # so it's not worth hacking up a 32/64-bit test to selectively include it. + # + # The library currently does not use any of the 64-flavored API calls + # or types + set (HDF_EXTRA_C_FLAGS ${HDF_EXTRA_C_FLAGS} -D_LARGEFILE_SOURCE) + set (HDF_EXTRA_C_FLAGS ${HDF_EXTRA_C_FLAGS} -D_FILE_OFFSET_BITS=64) + + set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${HDF_EXTRA_C_FLAGS}) endif () -add_definitions (${HDF_EXTRA_FLAGS}) +# As of 2024, both AIX and Solaris are uncommon, but still exist! The default +# compiler options are also often set to -m32, which produces 32-bit binaries. + +# 32-bit AIX compiles might require _LARGE_FILES, but we don't have a system on +# which to test this (yet). +# +# https://www.ibm.com/docs/en/aix/7.1?topic=volumes-writing-programs-that-access-large-files + +# 32-bit Solaris probably needs _LARGEFILE_SOURCE and _FILE_OFFSET_BITS=64, +# as in Linux, above. +# +# https://docs.oracle.com/cd/E23824_01/html/821-1474/lfcompile-5.html + +# MinGW and Cygwin +if (MINGW OR CYGWIN) + set (CMAKE_REQUIRED_DEFINITIONS + "${CURRENT_TEST_DEFINITIONS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" + ) +endif () #----------------------------------------------------------------------------- -# Check the size in bytes of all the int and float types +# Check the size in bytes of types #----------------------------------------------------------------------------- macro (HDF_CHECK_TYPE_SIZE type var) set (aType ${type}) @@ -168,7 +194,9 @@ macro (HDF_CHECK_TYPE_SIZE type var) endif () endmacro () -HDF_CHECK_TYPE_SIZE (long ${HDF_PREFIX}_SIZEOF_LONG) +if (NOT APPLE) + HDF_CHECK_TYPE_SIZE (long ${HDF_PREFIX}_SIZEOF_LONG) +endif () #----------------------------------------------------------------------------- # Check for some functions that are used diff --git a/config/cmake/HDFCompilerFlags.cmake b/config/cmake/HDFCompilerFlags.cmake index 99641757f3..c6f0bd9155 100644 --- a/config/cmake/HDFCompilerFlags.cmake +++ b/config/cmake/HDFCompilerFlags.cmake @@ -25,6 +25,7 @@ if (MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS) endif () if (MSVC) + add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stack:10000000") endif () diff --git a/config/cmake/HDFLibMacros.cmake b/config/cmake/HDFLibMacros.cmake index bebb9c1c33..9339abab45 100644 --- a/config/cmake/HDFLibMacros.cmake +++ b/config/cmake/HDFLibMacros.cmake @@ -6,16 +6,21 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type) set (zlib_folder "ZLIB") endif () if (${compress_type} MATCHES "GIT") - FetchContent_Declare (HDF4_ZLIB + if (${ZLIB_BRANCH} MATCHES "develop") + set (ZLIB_FILE "devCMakeLists") + else () + set (ZLIB_FILE "CMakeLists") + endif () + FetchContent_Declare (ZLIB GIT_REPOSITORY ${ZLIB_URL} GIT_TAG ${ZLIB_BRANCH} PATCH_COMMAND ${CMAKE_COMMAND} -E copy - ${HDF_RESOURCES_DIR}/${zlib_folder}/CMakeLists.txt + ${HDF_RESOURCES_DIR}/${zlib_folder}/${ZLIB_FILE}.txt /CMakeLists.txt ) elseif (${compress_type} MATCHES "TGZ") message (VERBOSE "Filter ZLIB file ${ZLIB_URL}") - FetchContent_Declare (HDF4_ZLIB + FetchContent_Declare (ZLIB URL ${ZLIB_URL} URL_HASH "" PATCH_COMMAND ${CMAKE_COMMAND} -E copy @@ -24,7 +29,7 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type) ) endif () - FetchContent_MakeAvailable(HDF4_ZLIB) + FetchContent_MakeAvailable(ZLIB) add_library(${HDF_PACKAGE_NAMESPACE}zlib-static ALIAS zlib-static) set (H4_ZLIB_STATIC_LIBRARY "${HDF_PACKAGE_NAMESPACE}zlib-static") @@ -35,11 +40,11 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type) set (H4_ZLIB_HEADER "zlib.h") endif () - set (H4_ZLIB_INCLUDE_DIR_GEN "${hdf4_zlib_BINARY_DIR}") - set (H4_ZLIB_INCLUDE_DIR "${hdf4_zlib_SOURCE_DIR}") + set (H4_ZLIB_INCLUDE_DIR_GEN "${zlib_BINARY_DIR}") + set (H4_ZLIB_INCLUDE_DIR "${zlib_SOURCE_DIR}") set (H4_ZLIB_FOUND 1) set (H4_ZLIB_INCLUDE_DIRS ${H4_ZLIB_INCLUDE_DIR_GEN} ${H4_ZLIB_INCLUDE_DIR}) - message (VERBOSE "ZLIB link libs: ${H4_ZLIB_LIBRARIES}") + message (VERBOSE "H4_ZLIB link libs: ${H4_ZLIB_LIBRARIES} with ${H4_ZLIB_INCLUDE_DIRS}") endmacro () #------------------------------------------------------------------------------- @@ -62,6 +67,7 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type) /CMakeLists.txt ) endif () + FetchContent_MakeAvailable(JPEG) add_library(${HDF_PACKAGE_NAMESPACE}jpeg-static ALIAS jpeg-static) @@ -72,7 +78,7 @@ macro (EXTERNAL_JPEG_LIBRARY compress_type) set (H4_JPEG_INCLUDE_DIR "${jpeg_SOURCE_DIR}") set (H4_JPEG_FOUND 1) set (H4_JPEG_INCLUDE_DIRS ${H4_JPEG_INCLUDE_DIR_GEN} ${H4_JPEG_INCLUDE_DIR}) - message (VERBOSE "JPEG link libs: ${H4_JPEG_LIBRARIES}") + message (VERBOSE "JPEG link libs: ${H4_JPEG_LIBRARIES} with ${H4_JPEG_INCLUDE_DIRS}") endmacro () #------------------------------------------------------------------------------- @@ -107,5 +113,5 @@ macro (EXTERNAL_SZIP_LIBRARY compress_type encoding) set (H4_SZIP_INCLUDE_DIR "${szip_SOURCE_DIR}/include") set (H4_SZIP_FOUND 1) set (H4_SZIP_INCLUDE_DIRS ${H4_SZIP_INCLUDE_DIR_GEN} ${H4_SZIP_INCLUDE_DIR}) - message (VERBOSE "SZIP link libs: ${H4_SZIP_LIBRARIES}") + message (VERBOSE "SZIP link libs: ${H4_SZIP_LIBRARIES} with ${H4_SZIP_INCLUDE_DIRS}") endmacro () diff --git a/config/cmake/HDFMacros.cmake b/config/cmake/HDFMacros.cmake index 2db5e00f13..301fe3aec4 100644 --- a/config/cmake/HDFMacros.cmake +++ b/config/cmake/HDFMacros.cmake @@ -445,24 +445,14 @@ macro (HDF_DIR_PATHS package_prefix) endif () message(STATUS "Final: ${${package_prefix}_INSTALL_DOC_DIR}") - # Always use full RPATH, i.e. don't skip the full RPATH for the build tree - set (CMAKE_SKIP_BUILD_RPATH OFF) - # when building, don't use the install RPATH already - # (but later on when installing) - set (CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) - # add the automatically determined parts of the RPATH - # which point to directories outside the build tree to the install RPATH - set (CMAKE_BUILD_WITH_INSTALL_RPATH ON) + # Append the needed INSTALL_RPATH for HDF Standard binary packages if (APPLE) - set (CMAKE_INSTALL_NAME_DIR "@rpath") - set (CMAKE_INSTALL_RPATH - "@executable_path/../${${package_prefix}_INSTALL_LIB_DIR}" - "@executable_path/" + list (APPEND CMAKE_INSTALL_RPATH "@loader_path/../${${package_prefix}_INSTALL_LIB_DIR}" "@loader_path/" ) else () - set (CMAKE_INSTALL_RPATH "\$ORIGIN/../${${package_prefix}_INSTALL_LIB_DIR}:\$ORIGIN/") + list (APPEND CMAKE_INSTALL_RPATH "\$ORIGIN/../${${package_prefix}_INSTALL_LIB_DIR}:\$ORIGIN/") endif () if (DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}") diff --git a/config/cmake/ZLIB/devCMakeLists.txt b/config/cmake/ZLIB/devCMakeLists.txt new file mode 100644 index 0000000000..bc1cfff83a --- /dev/null +++ b/config/cmake/ZLIB/devCMakeLists.txt @@ -0,0 +1,386 @@ +cmake_minimum_required (VERSION 3.18) + +project( + ZLIB + LANGUAGES C + VERSION 1.4.1.1 + HOMEPAGE_URL "https://zlib.net/" + DESCRIPTION "a general-purpose lossless data-compression library") +set (CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) + +#----------------------------------------------------------------------------- +# Basic ZLIB stuff here +#----------------------------------------------------------------------------- +set (CMAKE_POSITION_INDEPENDENT_CODE ON) + +set (ZLIB_PACKAGE_EXT ${HDF_PACKAGE_EXT}) +set (HDF_USE_GNU_DIRS ${HDF4_USE_GNU_DIRS}) +set (CMAKE_OSX_ARCHITECTURES ${CMAKE_OSX_ARCHITECTURES}) +set (CMAKE_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE}) +set (PACKAGE_NAMESPACE ${HDF_PACKAGE_NAMESPACE}) +if (MINGW) + set (WINDOWS 1) # MinGW tries to imitate Windows +endif () +if (WINDOWS) + set (HAVE_STDDEF_H 1) + set (HAVE_SYS_TYPES_H 1) +endif () +# ============================================================================ +# configuration +# ============================================================================ + +option(ZLIB_BUILD_TESTING "Enable Zlib Examples as tests" OFF) +option(ZLIB_BUILD_SHARED "Enable building zlib shared library" OFF) +option(ZLIB_BUILD_STATIC "Enable building zlib static library" ON) +option(ZLIB_BUILD_MINIZIP "Enable building libminizip contrib library" OFF) +option(ZLIB_INSTALL "Enable installation of zlib" OFF) +option(ZLIB_PREFIX "prefix for all types and library functions, see zconf.h.in" + OFF) +mark_as_advanced(ZLIB_PREFIX) + +if(WIN32) + option(ZLIB_INSTALL_COMPAT_DLL "Install a copy as zlib1.dll" ON) +endif(WIN32) + +get_property(IS_MULTI GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + +if(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI) + message(STATUS "No CMAKE_BUILD_TYPE set -- using Release") + set(CMAKE_BUILD_TYPE Release) +endif(NOT DEFINED CMAKE_BUILD_TYPE AND NOT IS_MULTI) + +include(CheckCSourceCompiles) +include(CheckFunctionExists) +include(CheckIncludeFile) +include(CMakePackageConfigHelpers) +include(CheckTypeSize) +include(CPack) +include(GNUInstallDirs) + +set(CPACK_INCLUDED FALSE) + +if(NOT ZLIB_CONF_WRITTEN) + set(Z_PREFIX ${ZLIB_PREFIX}) + set(CONF_OUT_FILE ${ZLIB_BINARY_DIR}/zconf.h.cmakein) + file(READ ${ZLIB_SOURCE_DIR}/zconf.h ZCONF_CONTENT LIMIT 245) + file(WRITE ${CONF_OUT_FILE} ${ZCONF_CONTENT}) + file(APPEND ${CONF_OUT_FILE} "#cmakedefine Z_PREFIX 1\n") + file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_STDARG_H 1\n") + file(APPEND ${CONF_OUT_FILE} "#cmakedefine HAVE_UNISTD_H 1\n") + file(READ ${ZLIB_SOURCE_DIR}/zconf.h ZCONF_CONTENT OFFSET 244) + set(FIRST_ITEM TRUE) + + foreach(item IN LISTS ZCONF_CONTENT) + if(FIRST_ITEM) + string(APPEND OUT_CONTENT ${item}) + set(FIRST_ITEM FALSE) + else(FIRST_ITEM) + string(APPEND OUT_CONTENT "\;" ${item}) + endif(FIRST_ITEM) + endforeach(item IN LISTS ${ZCONF_CONTENT}) + + file(APPEND ${CONF_OUT_FILE} ${OUT_CONTENT}) + set(ZLIB_CONF_WRITTEN + TRUE + CACHE BOOL "zconf.h.cmakein was created") + mark_as_advanced(ZLIB_CONF_WRITTEN) +endif(NOT ZLIB_CONF_WRITTEN) + +# +# Check to see if we have large file support +# +set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1) +check_type_size(off64_t OFF64_T) +unset(CMAKE_REQUIRED_DEFINITIONS) # clear variable + +# +# Check for fseeko +# +check_function_exists(fseeko HAVE_FSEEKO) + +# +# Check for stdarg.h +# +check_include_file(stdarg.h HAVE_STDARG_H) + +# +# Check for unistd.h +# +check_include_file(unistd.h HAVE_UNISTD_H) + +# +# Check visibility attribute is supported +# +if(MSVC) + set(CMAKE_REQUIRED_FLAGS "-WX") +else(MSVC) + set(CMAKE_REQUIRED_FLAGS "-WError") +endif(MSVC) + +check_c_source_compiles( + " + #include + static void f(void) __attribute__ ((visibility(\"hidden\"))); + int main(void) {return 0;} + " + HAVE___ATTR__VIS_HIDDEN) + +unset(CMAKE_COMPILE_FLAGS) +set(ZLIB_PC ${ZLIB_BINARY_DIR}/zlib.pc) +configure_file(${ZLIB_SOURCE_DIR}/zlib.pc.cmakein ${ZLIB_PC} @ONLY) +configure_file(${ZLIB_BINARY_DIR}/zconf.h.cmakein ${ZLIB_BINARY_DIR}/zconf.h) +include_directories(${ZLIB_BINARY_DIR} ${ZLIB_SOURCE_DIR}) + +#----------------------------------------------------------------------------- +# Define some CMake variables for use later in the project +#----------------------------------------------------------------------------- +set (ZLIB_RESOURCES_DIR ${HDF_RESOURCES_DIR}/ZLIB) +set (ZLIB_SRC_DIR ${ZLIB_SOURCE_DIR}) + +#----------------------------------------------------------------------------- +# Set the core names of all the libraries +#----------------------------------------------------------------------------- +set (ZLIB_LIB_CORENAME "zlib-static") + +#----------------------------------------------------------------------------- +# Set the true names of all the libraries if customized by external project +#----------------------------------------------------------------------------- +set (ZLIB_LIB_NAME "${ZLIB_EXTERNAL_LIB_PREFIX}${ZLIB_LIB_CORENAME}") + +#----------------------------------------------------------------------------- +# Set the target names of all the libraries +#----------------------------------------------------------------------------- +set (ZLIB_LIB_TARGET "zlib-static") + +set (zlib_VERS_MAJOR 1) +set (zlib_VERS_MINOR 4) +set (zlib_VERS_RELEASE 1) + +#----------------------------------------------------------------------------- +set (ZLIB_PACKAGE "zlib") +set (ZLIB_PACKAGE_NAME "ZLIB") +set (ZLIB_PACKAGE_VERSION "${zlib_VERS_MAJOR}.${zlib_VERS_MINOR}") +set (ZLIB_PACKAGE_VERSION_MAJOR "${zlib_VERS_MAJOR}.${zlib_VERS_MINOR}") +set (ZLIB_PACKAGE_VERSION_MINOR "${zlib_VERS_RELEASE}") +set (ZLIB_PACKAGE_STRING "${ZLIB_PACKAGE_NAME} ${ZLIB_PACKAGE_VERSION}") +set (ZLIB_PACKAGE_TARNAME "${ZLIB_PACKAGE_NAME}${ZLIB_PACKAGE_EXT}") +set (ZLIB_PACKAGE_URL "http://www.hdfgroup.org") +set (ZLIB_PACKAGE_BUGREPORT "help@hdfgroup.org") +set (ZLIB_PACKAGE_SOVERSION "${zlib_VERS_MAJOR}.${zlib_VERS_MINOR}.${zlib_VERS_RELEASE}") +set (ZLIB_PACKAGE_SOVERSION_MAJOR "${zlib_VERS_MAJOR}") + +HDF_DIR_PATHS(${ZLIB_PACKAGE_NAME}) + +#----------------------------------------------------------------------------- +# Targets built within this project are exported at Install time for use +# by other projects +#----------------------------------------------------------------------------- +if (NOT ZLIB_EXPORTED_TARGETS) + set (ZLIB_EXPORTED_TARGETS "zlib-targets") +endif () + +set_global_variable (ZLIB_LIBRARIES_TO_EXPORT "") + +#----------------------------------------------------------------------------- +# All libs/tests/examples need the main include directories +#----------------------------------------------------------------------------- +set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES + "${ZLIB_BINARY_DIR};${ZLIB_SOURCE_DIR};${CMAKE_RUNTIME_OUTPUT_DIRECTORY}" +) + +if (MSVC) + set(CMAKE_DEBUG_POSTFIX "d") + add_definitions (-D_BIND_TO_CURRENT_VCLIBS_VERSION=1) + add_definitions (-D_CRT_SECURE_NO_WARNINGS) + add_definitions (-D_CONSOLE) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +endif () + +if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) + # If we're doing an out of source build and the user has a zconf.h + # in their source tree... + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h) + message(VERBOSE "Renaming") + message(VERBOSE " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h") + message(VERBOSE "to 'zconf.h.included' because this file is included with zlib") + message(VERBOSE "but CMake generates it automatically in the build directory.") + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included) + endif() +endif() +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}) + + +#----------------------------------------------------------------------------- +# Define ZLIB Library +#----------------------------------------------------------------------------- + +set(ZLIB_PUBLIC_HDRS ${ZLIB_BINARY_DIR}/zconf.h zlib.h) + +set(ZLIB_PRIVATE_HDRS + crc32.h + deflate.h + gzguts.h + inffast.h + inffixed.h + inflate.h + inftrees.h + trees.h + zutil.h) + +set(ZLIB_SRCS + adler32.c + compress.c + crc32.c + deflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c + inflate.c + infback.c + inftrees.c + inffast.c + trees.c + uncompr.c + zutil.c) + +add_library(${ZLIB_LIB_TARGET} STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) + target_include_directories( + ${ZLIB_LIB_TARGET} + PUBLIC $ + $ + $) +target_compile_definitions( + ${ZLIB_LIB_TARGET} + PRIVATE $<$:NO_FSEEKO> + $<$:HAVE_HIDDEN> + $<$:_CRT_SECURE_NO_DEPRECATE> + $<$:_CRT_NONSTDC_NO_DEPRECATE> + $<$:_BIND_TO_CURRENT_VCLIBS_VERSION=1> + $<$:_CRT_SECURE_NO_WARNINGS> + $<$:_CONSOLE> + PUBLIC $<$:_LARGEFILE64_SOURCE=1>) +target_include_directories(${ZLIB_LIB_TARGET} + PRIVATE "${CMAKE_BINARY_DIR}" + PUBLIC "${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}" +) +if (MSVC AND CMAKE_CL_64) + set_target_properties (${ZLIB_LIB_TARGET} PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64") +endif () +set_target_properties(${ZLIB_LIB_TARGET} PROPERTIES + PUBLIC_HEADER "" + LINKER_LANGUAGE C + INTERFACE_INCLUDE_DIRECTORIES "$/include>" +) + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(${ZLIB_LIB_TARGET} PRIVATE -Wno-strict-prototypes -Wno-implicit-function-declaration) +endif () +if (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" OR CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") + target_compile_options(${ZLIB_LIB_TARGET} PRIVATE -Wno-implicit-function-declaration) +endif () +if (CMAKE_C_COMPILER_ID STREQUAL "GNU") + target_compile_options(${ZLIB_LIB_TARGET} PRIVATE -fmessage-length=0) +endif () + +set_target_properties(${ZLIB_LIB_TARGET} PROPERTIES OUTPUT_NAME zlib-static) + +set_global_variable (ZLIB_LIBRARIES_TO_EXPORT "${ZLIB_LIB_TARGET}") +set (install_targets ${ZLIB_LIB_TARGET}) + +#----------------------------------------------------------------------------- +# Add Target(s) to CMake Install for import into other projects +#----------------------------------------------------------------------------- +if (ZLIB_EXPORTED_TARGETS) + install ( + TARGETS + ${install_targets} + EXPORT + ${ZLIB_EXPORTED_TARGETS} + LIBRARY DESTINATION ${ZLIB_INSTALL_LIB_DIR} COMPONENT libraries + ARCHIVE DESTINATION ${ZLIB_INSTALL_LIB_DIR} COMPONENT libraries + RUNTIME DESTINATION ${ZLIB_INSTALL_BIN_DIR} COMPONENT libraries + FRAMEWORK DESTINATION ${ZLIB_INSTALL_FWRK_DIR} COMPONENT libraries + PUBLIC_HEADER DESTINATION ${ZLIB_INSTALL_INCLUDE_DIR} COMPONENT headers + ) +endif () + +include (CMakePackageConfigHelpers) + +#----------------------------------------------------------------------------- +# Configure the zlib-config.cmake file for the build directory +#----------------------------------------------------------------------------- +set (INCLUDE_INSTALL_DIR ${ZLIB_INSTALL_INCLUDE_DIR}) +set (SHARE_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/${ZLIB_INSTALL_CMAKE_DIR}" ) +set (CURRENT_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}" ) +configure_package_config_file ( + ${ZLIB_RESOURCES_DIR}/zlib-config.cmake.in + "${ZLIB_BINARY_DIR}/zlib-config.cmake" + INSTALL_DESTINATION "${ZLIB_INSTALL_CMAKE_DIR}" + PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR + INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}" +) + +#----------------------------------------------------------------------------- +# Configure the zlib-config.cmake file for the install directory +#----------------------------------------------------------------------------- +set (INCLUDE_INSTALL_DIR ${ZLIB_INSTALL_INCLUDE_DIR}) +set (SHARE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${ZLIB_INSTALL_CMAKE_DIR}" ) +set (CURRENT_BUILD_DIR "${CMAKE_INSTALL_PREFIX}") +configure_package_config_file ( + ${ZLIB_RESOURCES_DIR}/zlib-config.cmake.in + "${ZLIB_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/zlib-config.cmake" + INSTALL_DESTINATION "${ZLIB_INSTALL_CMAKE_DIR}" + PATH_VARS INCLUDE_INSTALL_DIR SHARE_INSTALL_DIR CURRENT_BUILD_DIR +) +if (NOT ZLIB_EXTERNALLY_CONFIGURED) + install ( + FILES ${ZLIB_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/zlib-config.cmake + DESTINATION ${ZLIB_INSTALL_CMAKE_DIR} + COMPONENT configinstall + ) +endif () + +#----------------------------------------------------------------------------- +# Configure the ZLIB-config-version.cmake file for the install directory +#----------------------------------------------------------------------------- +if (NOT ZLIB_EXTERNALLY_CONFIGURED) + configure_file ( + ${ZLIB_RESOURCES_DIR}/zlib-config-version.cmake.in + ${ZLIB_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/zlib-config-version.cmake @ONLY + ) + install ( + FILES ${ZLIB_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/zlib-config-version.cmake + DESTINATION ${ZLIB_INSTALL_CMAKE_DIR} + COMPONENT configinstall + ) +endif () + +#----------------------------------------------------------------------------- +# Add Target(s) to CMake Install for import into other projects +#----------------------------------------------------------------------------- +if (NOT ZLIB_EXTERNALLY_CONFIGURED) + install ( + EXPORT ${ZLIB_EXPORTED_TARGETS} + DESTINATION ${ZLIB_INSTALL_CMAKE_DIR} + FILE zlib-targets.cmake + NAMESPACE ${PACKAGE_NAMESPACE} + COMPONENT configinstall + ) +endif () + +#----------------------------------------------------------------------------- +# Export all exported targets to the build tree for use by parent project +#----------------------------------------------------------------------------- +if (NOT ZLIB_EXTERNALLY_CONFIGURED) + export ( + TARGETS ${ZLIB_LIBRARIES_TO_EXPORT} + FILE zlib-targets.cmake + NAMESPACE ${PACKAGE_NAMESPACE} + ) + export (PACKAGE zlib) +endif () + diff --git a/config/cmake/cacheinit.cmake b/config/cmake/cacheinit.cmake index be2266af64..253ab948c0 100644 --- a/config/cmake/cacheinit.cmake +++ b/config/cmake/cacheinit.cmake @@ -33,15 +33,15 @@ set_property (CACHE HDF4_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT TGZ) # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) -set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE) set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) -set (HDF5_USE_ZLIB_STATIC ON CACHE BOOL "Use static zlib library" FORCE) +set (HDF4_USE_ZLIB_STATIC ON CACHE BOOL "Use static zlib library" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) -set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIBNG_TGZ_NAME "2.2.4.tar.gz" CACHE STRING "Use ZLibNG from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) @@ -54,11 +54,17 @@ set (LIBAEC_GIT_URL "https://github.com/MathisRosenhauer/libaec.git" CACHE STRIN set (LIBAEC_GIT_BRANCH "v1.1.3" CACHE STRING "" FORCE) set (HDF4_USE_LIBAEC_STATIC ON CACHE BOOL "Use static AEC library" FORCE) -set (JPEG_PACKAGE_NAME "jpeg" CACHE STRING "Name of JPEG package" FORCE) -set (JPEG_TGZ_ORIGPATH "https://www.ijg.org/filesz" CACHE STRING "Use JPEG from original location" FORCE) -set (JPEG_TGZ_NAME "jpegsrc.v9e.tar.gz" CACHE STRING "Use JPEG from original compressed file" FORCE) -set (JPEG_USE_LOCALCONTENT ON CACHE BOOL "Use local file for JPEG FetchContent" FORCE) +####### +# jpeg +####### + set (JPEG_GIT_URL "https://github.com/libjpeg-turbo/libjpeg-turbo.git" CACHE STRING "Use JPEG from TurboJPEG" FORCE) set (JPEG_GIT_BRANCH "jpeg-9e" CACHE STRING "" FORCE) #set (JPEG_GIT_URL "https://github.com/LuaDist/libjpeg.git" CACHE STRING "Use JPEG from ILG" FORCE) #set (JPEG_GIT_BRANCH "master" CACHE STRING "" FORCE) + +set (JPEG_TGZ_ORIGPATH "https://www.ijg.org/files" CACHE STRING "Use JPEG from original location" FORCE) +set (JPEG_TGZ_NAME "jpegsrc.v9e.tar.gz" CACHE STRING "Use JPEG from original compressed file" FORCE) +set (JPEG_USE_LOCALCONTENT ON CACHE BOOL "Use local file for JPEG FetchContent" FORCE) + +set (JPEG_PACKAGE_NAME "jpeg" CACHE STRING "Name of JPEG package" FORCE) diff --git a/config/cmake/examples/HDF4_Examples.cmake.in b/config/cmake/examples/HDF4_Examples.cmake.in index 90f3c3e97b..dd51b1574d 100644 --- a/config/cmake/examples/HDF4_Examples.cmake.in +++ b/config/cmake/examples/HDF4_Examples.cmake.in @@ -18,7 +18,6 @@ set(CTEST_DASHBOARD_ROOT ${CTEST_SCRIPT_DIRECTORY}) #INSTALLDIR - HDF4 root folder #CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo #CTEST_SOURCE_NAME - name of source folder; HDF4Examples -#CTEST_TOOLCHAIN_FILE - name and path in source of toolchain file if(DEFINED CTEST_SCRIPT_ARG) # transform ctest script arguments of the form # script.ctest,var1=value1,var2=value2 diff --git a/config/cmake/grepTest.cmake b/config/cmake/grepTest.cmake index a978a6f220..14ad8a0e04 100644 --- a/config/cmake/grepTest.cmake +++ b/config/cmake/grepTest.cmake @@ -1,6 +1,7 @@ # grepTest.cmake executes a command and captures the output in a file. File is then compared # against a reference file. Exit status of command can also be compared. cmake_policy(SET CMP0007 NEW) +cmake_policy(SET CMP0053 NEW) # arguments checking if (NOT TEST_PROGRAM) @@ -12,12 +13,12 @@ endif () if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () -if (NOT TEST_FILTER) - message (VERBOSE "Optional TEST_FILTER to be defined") -endif () if (NOT TEST_REFERENCE) message (FATAL_ERROR "Require TEST_REFERENCE to be defined") endif () +if (NOT TEST_FILTER) + message (VERBOSE "Optional TEST_FILTER is not defined") +endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) @@ -29,7 +30,7 @@ endif () message (STATUS "COMMAND: ${TEST_EMULATOR} ${TEST_PROGRAM} ${TEST_ARGS}") -if (TEST_LIBRARY_DIRECTORY) +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH if (WIN32) set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") elseif (APPLE) @@ -54,17 +55,11 @@ execute_process ( OUTPUT_VARIABLE TEST_OUT ERROR_VARIABLE TEST_ERROR ) - message (STATUS "COMMAND Result: ${TEST_RESULT}") -# append the test result status with a predefined text -if (TEST_APPEND) - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n") -endif () - message (STATUS "COMMAND Error: ${TEST_ERROR}") -# remove special output +# remove special regex text from the output if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) string (FIND "${TEST_STREAM}" "_pmi_alps" TEST_FIND_RESULT) @@ -79,22 +74,16 @@ if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") endif () endif () -if (TEST_REF_FILTER) - #message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - string (REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") -endif () - # if the TEST_ERRREF exists grep the error output with the error reference -set (TEST_ERRREF_RESULT 0) +set (TEST_ERRREF_RESULT 0) # grep result variable; 0 is success +# TEST_ERRREF should always be matched if (TEST_ERRREF) # if the .err file exists grep the error output with the error reference before comparing stdout if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_ERR_STREAM) list (LENGTH TEST_ERR_STREAM test_len) + # verify there is text output in the error file if (test_len GREATER 0) - # TEST_ERRREF should always be matched string (REGEX MATCH "${TEST_ERRREF}" TEST_MATCH ${TEST_ERR_STREAM}) string (COMPARE EQUAL "${TEST_ERRREF}" "${TEST_MATCH}" TEST_ERRREF_RESULT) if (NOT TEST_ERRREF_RESULT) @@ -111,12 +100,21 @@ if (TEST_ERRREF) endif () # compare output files to references unless this must be skipped - set (TEST_COMPARE_RESULT 0) + set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) list (LENGTH TEST_STREAM test_len) + # verify there is text output in the reference file if (test_len GREATER 0) + if (WIN32) + configure_file(${TEST_FOLDER}/${TEST_REFERENCE} ${TEST_FOLDER}/${TEST_REFERENCE}.tmp NEWLINE_STYLE CRLF) + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}.tmp") + file(RENAME ${TEST_FOLDER}/${TEST_REFERENCE}.tmp ${TEST_FOLDER}/${TEST_REFERENCE}) + endif () + #file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + #file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") + endif () if (NOT TEST_SORT_COMPARE) # now compare the output with the reference execute_process ( @@ -129,10 +127,11 @@ if (TEST_ERRREF) list (SORT v1) list (SORT v2) if (NOT v1 STREQUAL v2) - set(TEST_COMPARE_RESULT 1) + set (TEST_COMPARE_RESULT 1) endif () endif () + # only compare files if previous operations were successful if (TEST_COMPARE_RESULT) set (TEST_COMPARE_RESULT 0) file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) @@ -178,37 +177,44 @@ if (TEST_ERRREF) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () - endif () -else () - # else grep the output with the reference - set (TEST_GREP_RESULT 0) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - # TEST_REFERENCE should always be matched - string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM}) - string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_GREP_RESULT) - if (NOT TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") + endif () # end of TEST_SKIP_COMPARE +else () # TEST_ERRREF is not defined + # TEST_REFERENCE should always be matched unless TEST_GREP_COMPARE is set to 0 + set (TEST_GREP_RESULT 0) # grep result variable; 0 is success + if (TEST_GREP_COMPARE AND EXISTS "${TEST_PROCESSED_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + string (REGEX MATCH "${TEST_REFERENCE}" TEST_MATCH ${TEST_STREAM}) + string (COMPARE EQUAL "${TEST_REFERENCE}" "${TEST_MATCH}" TEST_GREP_RESULT) + if (NOT TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") + endif () endif () endif () endif () - +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 if (TEST_FILTER) - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) + if (EXISTS "${TEST_PROCESSED_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") + endif () endif () endif () endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}" AND NOT TEST_SAVE) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) endif () diff --git a/config/cmake/hdf4-config.cmake.in b/config/cmake/hdf4-config.cmake.in index 7912856b4b..d8dba76c7e 100644 --- a/config/cmake/hdf4-config.cmake.in +++ b/config/cmake/hdf4-config.cmake.in @@ -48,8 +48,8 @@ set (${HDF4_PACKAGE_NAME}_TOOLSET "@CMAKE_GENERATOR_TOOLSET@") if (${HDF4_PACKAGE_NAME}_BUILD_JAVA) set (${HDF4_PACKAGE_NAME}_JAVA_INCLUDE_DIRS @PACKAGE_CURRENT_BUILD_DIR@/lib/jarhdf-@HDF4_VERSION_STRING@.jar - @PACKAGE_CURRENT_BUILD_DIR@/lib/slf4j-api-2.0.6.jar - @PACKAGE_CURRENT_BUILD_DIR@/lib/slf4j-nop-2.0.6.jar + @PACKAGE_CURRENT_BUILD_DIR@/lib/slf4j-api-2.0.16.jar + @PACKAGE_CURRENT_BUILD_DIR@/lib/slf4j-nop-2.0.16.jar ) endif () diff --git a/config/cmake/jrunTest.cmake b/config/cmake/jrunTest.cmake index 2447efb1c5..938f73a0d6 100644 --- a/config/cmake/jrunTest.cmake +++ b/config/cmake/jrunTest.cmake @@ -1,6 +1,7 @@ # jrunTest.cmake executes a command and captures the output in a file. File is then compared # against a reference file. Exit status of command can also be compared. cmake_policy(SET CMP0007 NEW) +cmake_policy(SET CMP0053 NEW) # arguments checking if (NOT TEST_TESTER) @@ -9,17 +10,17 @@ endif () if (NOT TEST_PROGRAM) message (FATAL_ERROR "Require TEST_PROGRAM to be defined") endif () -if (NOT TEST_LIBRARY_DIRECTORY) - message (VERBOSE "Require TEST_LIBRARY_DIRECTORY to be defined") -endif () if (NOT TEST_FOLDER) message (FATAL_ERROR "Require TEST_FOLDER to be defined") endif () if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () +if (NOT TEST_LIBRARY_DIRECTORY) # Directory to add to PATH + message (VERBOSE "Optional TEST_LIBRARY_DIRECTORY is not defined") +endif () if (NOT TEST_CLASSPATH) - message (VERBOSE "Require TEST_CLASSPATH to be defined") + message (VERBOSE "Optional TEST_CLASSPATH is not defined") endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") @@ -30,7 +31,7 @@ if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err) endif () -if (NOT TEST_LOG_LEVEL) +if (NOT TEST_LOG_LEVEL) # java logger verbosity level set (LOG_LEVEL "info") else () set (LOG_LEVEL "${TEST_LOG_LEVEL}") @@ -38,12 +39,19 @@ endif () message (STATUS "COMMAND: ${TEST_TESTER} -Xmx1024M -Dorg.slf4j.simpleLogger.defaultLog=${LOG_LEVEL} -Djava.library.path=\"${TEST_LIBRARY_DIRECTORY}\" -cp \"${TEST_CLASSPATH}\" ${TEST_ARGS} ${TEST_PROGRAM} ${ARGN}") -if (WIN32) - set (ENV{PATH} "$ENV{PATH}\\;${TEST_LIBRARY_DIRECTORY}") -elseif (APPLE) - set (ENV{DYLD_LIBRARY_PATH} "$ENV{DYLD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") -else () - set (ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH + if (WIN32) + set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") + elseif (APPLE) + set (ENV{DYLD_LIBRARY_PATH} "$ENV{DYLD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") + else () + set (ENV{LD_LIBRARY_PATH} "$ENV{LD_LIBRARY_PATH}:${TEST_LIBRARY_DIRECTORY}") + endif () +endif () + +if (TEST_ENV_VAR) + set (ENV{${TEST_ENV_VAR}} "${TEST_ENV_VALUE}") + message (TRACE "ENV:${TEST_ENV_VAR}=$ENV{${TEST_ENV_VAR}}") endif () # run the test program, capture the stdout/stderr and the result var @@ -60,24 +68,25 @@ execute_process ( OUTPUT_VARIABLE TEST_OUT ERROR_VARIABLE TEST_ERROR ) - message (STATUS "COMMAND Result: ${TEST_RESULT}") +message (STATUS "COMMAND Error: ${TEST_ERROR}") + # if the .err file exists and ERRROR_APPEND is enabled if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) list (LENGTH TEST_STREAM test_len) if (test_len GREATER 0) - if (TEST_MASK_FILE) + if (TEST_MASK_FILE) # replace directory name with generic name STRING(REGEX REPLACE "CurrentDir is [^\n]+\n" "CurrentDir is (dir name)\n" TEST_STREAM "${TEST_STREAM}") endif () if (NOT ERROR_APPEND) # write back to original .err file - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) else () # append error output to the stdout output file - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () endif () endif () @@ -86,10 +95,14 @@ endif () if (TEST_MASK_ERROR) if (NOT TEST_ERRREF) # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + endif () else () # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + endif () endif () string (REGEX REPLACE "Time:[^\n]+\n" "Time: XXXX\n" TEST_STREAM "${TEST_STREAM}") string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}") @@ -99,9 +112,9 @@ if (TEST_MASK_ERROR) string (REGEX REPLACE "HDF4 .[1-9]*[.][0-9]*[.][0-9]*[^)]*" "HDF4 (version (number)" TEST_STREAM "${TEST_STREAM}") # write back the changes to the original files if (NOT TEST_ERRREF) - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) endif () endif () @@ -111,71 +124,81 @@ if (NOT TEST_RESULT EQUAL TEST_EXPECT) message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != 0.\n${TEST_ERROR}") endif () -message (STATUS "COMMAND Error: ${TEST_ERROR}") - # compare output files to references unless this must be skipped -set (TEST_COMPARE_RESULT 0) +set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - if (WIN32) - configure_file(${TEST_FOLDER}/${TEST_REFERENCE} ${TEST_FOLDER}/${TEST_REFERENCE}.tmp NEWLINE_STYLE CRLF) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}.tmp") - file(RENAME ${TEST_FOLDER}/${TEST_REFERENCE}.tmp ${TEST_FOLDER}/${TEST_REFERENCE}) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + # verify there is text output in the reference file + if (test_len GREATER 0) + if (WIN32) + configure_file(${TEST_FOLDER}/${TEST_REFERENCE} ${TEST_FOLDER}/${TEST_REFERENCE}.tmp NEWLINE_STYLE CRLF) + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}.tmp") + file(RENAME ${TEST_FOLDER}/${TEST_REFERENCE}.tmp ${TEST_FOLDER}/${TEST_REFERENCE}) + endif () endif () - #file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - #file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") - endif () - if (NOT TEST_SORT_COMPARE) - # now compare the output with the reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} - RESULT_VARIABLE TEST_COMPARE_RESULT - ) - else () - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) - list (SORT v1) - list (SORT v2) - if (NOT v1 STREQUAL v2) - set(TEST_COMPARE_RESULT 1) + if (NOT TEST_SORT_COMPARE) + # now compare the output with the reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} + RESULT_VARIABLE TEST_COMPARE_RESULT + ) + else () # sort the output files first before comparing + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) + list (SORT v1) + list (SORT v2) + if (NOT v1 STREQUAL v2) + set (TEST_COMPARE_RESULT 1) + endif () endif () - endif () - if (TEST_COMPARE_RESULT) - set (TEST_COMPARE_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) - list (LENGTH test_ref len_ref) - if (len_act GREATER 0 AND len_ref GREATER 0) - math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) + # only compare files if previous operations were successful + if (TEST_COMPARE_RESULT) + set (TEST_COMPARE_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) + list (LENGTH test_ref len_ref) + if (NOT len_act EQUAL len_ref) + set (TEST_COMPARE_RESULT 1) + endif () + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + if (line GREATER_EQUAL len_act) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_OUTPUT}") set (TEST_COMPARE_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + break () + elseif (line GREATER_EQUAL len_ref) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_REFERENCE}") + set (TEST_COMPARE_RESULT 1) + break () + else () + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_COMPARE_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") - endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_COMPARE_RESULT 1) - endif () - endif () - endif () + endif () # TEST_COMPARE_RESULT + endif () # test_len GREATER 0 + endif () # EXISTS "${TEST_FOLDER}/${TEST_REFERENCE} message (STATUS "COMPARE Result: ${TEST_COMPARE_RESULT}") @@ -183,72 +206,75 @@ if (NOT TEST_SKIP_COMPARE) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () # now compare the .err file with the error reference, if supplied - set (TEST_ERRREF_RESULT 0) - if (TEST_ERRREF) - file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - if (WIN32) - configure_file(${TEST_FOLDER}/${TEST_ERRREF} ${TEST_FOLDER}/${TEST_ERRREF}.tmp NEWLINE_STYLE CRLF) - if (EXISTS "${TEST_FOLDER}/${TEST_ERRREF}.tmp") - file(RENAME ${TEST_FOLDER}/${TEST_ERRREF}.tmp ${TEST_FOLDER}/${TEST_ERRREF}) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + set (TEST_ERRREF_RESULT 0) + if (TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF}") + file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + if (WIN32) + configure_file(${TEST_FOLDER}/${TEST_ERRREF} ${TEST_FOLDER}/${TEST_ERRREF}.tmp NEWLINE_STYLE CRLF) + if (EXISTS "${TEST_FOLDER}/${TEST_ERRREF}.tmp") + file(RENAME ${TEST_FOLDER}/${TEST_ERRREF}.tmp ${TEST_FOLDER}/${TEST_ERRREF}) + endif () endif () - #file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - #file (WRITE ${TEST_FOLDER}/${TEST_ERRREF} "${TEST_STREAM}") - endif () - - # now compare the error output with the error reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} - RESULT_VARIABLE TEST_ERRREF_RESULT - ) - if (TEST_ERRREF_RESULT) - set (TEST_ERRREF_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) - list (LENGTH test_ref len_ref) - math (EXPR _FP_LEN "${len_ref} - 1") - if (len_act GREATER 0 AND len_ref GREATER 0) + # now compare the error output with the error reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} + RESULT_VARIABLE TEST_ERRREF_RESULT + ) + if (TEST_ERRREF_RESULT) + set (TEST_ERRREF_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) + list (LENGTH test_ref len_ref) math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) - set (TEST_ERRREF_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_ERRREF_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") + if (NOT len_act EQUAL len_ref) + set (TEST_ERRREF_RESULT 1) endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_ERRREF_RESULT 1) - endif () - endif () - endif () + endif () # TEST_ERRREF_RESULT + endif () # test_len GREATER 0 - message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") + message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") - # again, if return value is !=0 scream and shout - if (TEST_ERRREF_RESULT) - message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") - endif () + # again, if return value is !=0 scream and shout + if (TEST_ERRREF_RESULT) + message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") + endif () + endif () # TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF} + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT}.err does not exist") endif () endif () set (TEST_GREP_RESULT 0) -if (TEST_GREP_COMPARE) +if (TEST_GREP_COMPARE AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") # now grep the output with the reference file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) list (LENGTH TEST_STREAM test_len) @@ -259,29 +285,32 @@ if (TEST_GREP_COMPARE) if (NOT TEST_GREP_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") endif () + endif () +endif () - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) - # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") - endif () +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 +if (TEST_FILTER AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) + # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") endif () endif () endif () # dump the output unless nodisplay option is set -if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - execute_process ( - COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} - RESULT_VARIABLE TEST_RESULT - ) - endif () +if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + execute_process ( + COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} + RESULT_VARIABLE TEST_RESULT + ) endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) diff --git a/config/cmake/libh4cc.in b/config/cmake/libh4cc.in index 03a04aa66e..07d753f0fd 100755 --- a/config/cmake/libh4cc.in +++ b/config/cmake/libh4cc.in @@ -1,7 +1,6 @@ #! /bin/sh ## # Copyright by The HDF Group. -# Copyright by the Board of Trustees of the University of Illinois. # All rights reserved. # # This file is part of HDF. The full HDF copyright notice, including @@ -22,21 +21,43 @@ fi dir=$( cd -P -- "$(dirname -- "$prg")/.." && pwd -P ) || exit -prg=$dir/$(basename -- "$prg") || exit +prg=$dir/bin/$(basename -- "$prg") || exit -printf '%s\n' "$prg" -printf 'dir is %s\n' "$dir" +#printf '%s\n' "$prg" +#printf 'dir is %s\n' "$dir" +pc_args="" # Show the configuration summary of the library recorded in the # libhdf4.settings file residing in the lib directory. showconfigure() { - cat $dir/lib/libhdf4.settings + cat $dir/@HDF4_INSTALL_LIB_DIR@/libhdf4.settings status=$? } -export PKG_CONFIG_PATH=$dir/lib/pkgconfig +usage() { + # "How-to use" message. + echo "usage: $prg [OPTIONS] " + echo " OPTIONS:" + echo " -help This help message." + echo " -show Show the commands without executing them" + echo " -showconfig Show the HDF4 library configuration summary" + echo " " + echo " - the pkg-config compile line options for the compiler" + echo " that was used to compile HDF4." + echo " Use pkg-config --help for more information" + echo " on which options are available. $prg passes pkg-config options" + echo " through as those options use double-underscores." + echo " " + echo " NOTE: pkg-config is required to be installed on your system and" + echo " using --static requires a static version of the C runtime library" + echo " to be have been installed on your system." + echo " " + exit $EXIT_FAILURE +} + +export PKG_CONFIG_PATH=$dir/@HDF4_INSTALL_LIB_DIR@/pkgconfig for arg in $@ ; do case "$arg" in @@ -44,8 +65,21 @@ for arg in $@ ; do showconfigure exit $status ;; + -show) + shift + echo @_PKG_CONFIG_COMPILER@ "$@" `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@` + exit $status + ;; + -help) + usage + exit $status + ;; + --*) + # gather pkg-config specific options + pc_args="$pc_args $arg" + ;; *) - @_PKG_CONFIG_COMPILER@ $@ `pkg-config --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@` + @_PKG_CONFIG_COMPILER@ "$@" `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@` status=$? exit $status ;; diff --git a/config/cmake/mccacheinit.cmake b/config/cmake/mccacheinit.cmake index 1f93ac7047..762f6dc171 100644 --- a/config/cmake/mccacheinit.cmake +++ b/config/cmake/mccacheinit.cmake @@ -16,6 +16,8 @@ set (HDF4_BUILD_UTILS ON CACHE BOOL "Build HDF4 Library Utilities" FORCE) set (HDF4_BUILD_GENERATORS OFF CACHE BOOL "Build Test Generators" FORCE) +set (HDF4_ENABLE_JPEG_LIB_SUPPORT ON CACHE BOOL "Use JPEG Filter" FORCE) + set (HDF4_ENABLE_SZIP_SUPPORT OFF CACHE BOOL "Use SZip Filter" FORCE) set (HDF4_ENABLE_SZIP_ENCODING OFF CACHE BOOL "Use SZip Encoding" FORCE) @@ -39,14 +41,14 @@ set_property (CACHE HDF4_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT TGZ) # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) -set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF4_ZLib from compressed file" FORCE) set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) -set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) diff --git a/config/cmake/runTest.cmake b/config/cmake/runTest.cmake index c79febb5ff..89ec1e242e 100644 --- a/config/cmake/runTest.cmake +++ b/config/cmake/runTest.cmake @@ -1,6 +1,7 @@ # runTest.cmake executes a command and captures the output in a file. File is then compared # against a reference file. Exit status of command can also be compared. cmake_policy(SET CMP0007 NEW) +cmake_policy(SET CMP0053 NEW) # arguments checking if (NOT TEST_PROGRAM) @@ -13,7 +14,7 @@ if (NOT TEST_OUTPUT) message (FATAL_ERROR "Require TEST_OUTPUT to be defined") endif () if (NOT TEST_EXPECT) - message (STATUS "Require TEST_EXPECT to be defined") + message (VERBOSE "Optional TEST_EXPECT is not defined") endif () if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") @@ -26,7 +27,7 @@ endif () message (STATUS "COMMAND: ${TEST_EMULATOR} ${TEST_PROGRAM} ${TEST_ARGS}") -if (TEST_LIBRARY_DIRECTORY) +if (TEST_LIBRARY_DIRECTORY) # Directory to add to PATH if (WIN32) set (ENV{PATH} "$ENV{PATH};${TEST_LIBRARY_DIRECTORY}") elseif (APPLE) @@ -66,44 +67,59 @@ else () ) endif () +message (STATUS "COMMAND Result: ${TEST_RESULT}") + +# append the test result status with a predefined text +if (TEST_APPEND) + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n") +endif () + +message (STATUS "COMMAND Error: ${TEST_ERROR}") + +############################################# +# Begin of file filtering +############################################# if (TEST_REGEX) - # TEST_REGEX should always be matched - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX MATCH "${TEST_REGEX}" REGEX_MATCH ${TEST_STREAM}) - string (COMPARE EQUAL "${REGEX_MATCH}" "${TEST_MATCH}" REGEX_RESULT) - if (NOT REGEX_RESULT) - message (STATUS "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_MATCH}") + # TEST_REGEX and TEST_MATCH should always be checked + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_REGEX}" REGEX_MATCH ${TEST_STREAM}) + string (COMPARE EQUAL "${REGEX_MATCH}" "${TEST_MATCH}" REGEX_RESULT) + if (NOT REGEX_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_MATCH}") + endif () + else () + message (STATUS "Failed: No output of ${TEST_PROGRAM}") endif () endif () -message (STATUS "COMMAND Result: ${TEST_RESULT}") - -# if the .err file exists and ERRROR_APPEND is enabled +# if the .err file exists if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) list (LENGTH TEST_STREAM test_len) if (test_len GREATER 0) - if (TEST_MASK_FILE) + if (TEST_MASK_FILE) # replace directory name with generic name STRING(REGEX REPLACE "CurrentDir is [^\n]+\n" "CurrentDir is (dir name)\n" TEST_STREAM "${TEST_STREAM}") endif () # remove special output string (REGEX REPLACE "^.*_pmi_alps[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) + if (TEST_FIND_RESULT GREATER -1) + string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + # write back the changes to the original files + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + endif () if (NOT ERROR_APPEND) # write back to original .err file - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) else () # append error output to the stdout output file - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () endif () endif () -# append the test result status with a predefined text -if (TEST_APPEND) - file (APPEND ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_APPEND} ${TEST_RESULT}\n") -endif () - # if the return value is !=${TEST_EXPECT} bail out if (NOT TEST_RESULT EQUAL TEST_EXPECT) if (NOT TEST_NOERRDISPLAY) @@ -119,9 +135,7 @@ if (NOT TEST_RESULT EQUAL TEST_EXPECT) message (FATAL_ERROR "Failed: Test program ${TEST_PROGRAM} exited != ${TEST_EXPECT}.\n${TEST_ERROR}") endif () -message (STATUS "COMMAND Error: ${TEST_ERROR}") - -# remove special output +# remove special regex text from the output if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) string (FIND "${TEST_STREAM}" "_pmi_alps" TEST_FIND_RESULT) @@ -134,49 +148,35 @@ if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") string (REGEX REPLACE "^.*ulimit -s[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) endif () -endif () - -# remove special error output -if (NOT TEST_ERRREF) - # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) -else () - # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) -endif () -string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) -if (TEST_FIND_RESULT GREATER -1) - string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") - # write back the changes to the original files - if (NOT TEST_ERRREF) + string (FIND "${TEST_STREAM}" "no version information available" TEST_FIND_RESULT) + if (TEST_FIND_RESULT GREATER -1) + string (REGEX REPLACE "^.*no version information available[^\n]+\n" "" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + endif () + # if the output file needs Storage text masked out + if (TEST_MASK_STORE) + string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:
\n" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + endif () + # if the output file needs Modified text removed + if (TEST_MASK_MOD) + string (REGEX REPLACE "Modified:[^\n]+\n" "Modified: XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}") file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") - else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") endif () -endif () - -# if the output file needs Storage text removed -if (TEST_MASK_STORE) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "Storage:[^\n]+\n" "Storage:
\n" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") -endif () - -# if the output file needs Modified text removed -if (TEST_MASK_MOD) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "Modified:[^\n]+\n" "Modified: XXXX-XX-XX XX:XX:XX XXX\n" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") endif () # if the output file or the .err file needs to mask out error stack info if (TEST_MASK_ERROR) if (NOT TEST_ERRREF) # the error stack has been appended to the output file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + endif () else () # the error stack remains in the .err file - file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT}.err TEST_STREAM) + endif () endif () string (REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}") string (REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}") @@ -185,102 +185,117 @@ if (TEST_MASK_ERROR) string (REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}") # write back the changes to the original files if (NOT TEST_ERRREF) - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_STREAM}) else () - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_STREAM}) endif () endif () -# remove text from the output file -if (TEST_MASK) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - string (REGEX REPLACE "${TEST_MASK}" "" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") +if (TEST_REF_FILTER) + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + string (REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") + endif () endif () # replace text from the output file if (TEST_FILTER) - file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) - message (STATUS "TEST_FILTER: ${TEST_FILTER} TEST_FILTER_REPLACE: ${TEST_FILTER_REPLACE}") - string (REGEX REPLACE "${TEST_FILTER}" "${TEST_FILTER_REPLACE}" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) + message (STATUS "TEST_FILTER: ${TEST_FILTER} TEST_FILTER_REPLACE: ${TEST_FILTER_REPLACE}") + string (REGEX REPLACE "${TEST_FILTER}" "${TEST_FILTER_REPLACE}" TEST_STREAM "${TEST_STREAM}") + file (WRITE ${TEST_FOLDER}/${TEST_OUTPUT} "${TEST_STREAM}") + endif () endif () -if (TEST_REF_FILTER) - #message (STATUS "TEST_REF_FILTER: ${TEST_APPEND}${TEST_REF_FILTER}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - string (REGEX REPLACE "${TEST_REF_APPEND}" "${TEST_REF_FILTER}" TEST_STREAM "${TEST_STREAM}") - file (WRITE ${TEST_FOLDER}/${TEST_REFERENCE} "${TEST_STREAM}") +# mask text in the output file +set(TEST_PROCESSED_OUTPUT "${TEST_FOLDER}/${TEST_OUTPUT}") +set(TEST_PROCESSED_REFERENCE "${TEST_FOLDER}/${TEST_REFERENCE}") + +if (TEST_MASK AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + H4_MASK_FILE("${TEST_FOLDER}/${TEST_OUTPUT}") + # Later comparisons should use the masked value + set(TEST_PROCESSED_OUTPUT "${TEST_FOLDER}/${TEST_OUTPUT}_masked") + set(TEST_PROCESSED_REFERENCE "${TEST_FOLDER}/${TEST_REFERENCE}_masked") endif () +############################################# +# End of file filtering +############################################# + # compare output files to references unless this must be skipped -set (TEST_COMPARE_RESULT 0) +set (TEST_COMPARE_RESULT 0) # grep result variable; 0 is success if (NOT TEST_SKIP_COMPARE) - if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") - file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - if (NOT TEST_SORT_COMPARE) - # now compare the output with the reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} - RESULT_VARIABLE TEST_COMPARE_RESULT - ) - else () - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) - list (SORT v1) - list (SORT v2) - if (NOT v1 STREQUAL v2) - set (TEST_COMPARE_RESULT 1) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + if (EXISTS "${TEST_FOLDER}/${TEST_REFERENCE}") + file (READ ${TEST_FOLDER}/${TEST_REFERENCE} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + # verify there is text output in the reference file + if (test_len GREATER 0) + if (NOT TEST_SORT_COMPARE) + # now compare the output with the reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_PROCESSED_OUTPUT} ${TEST_FOLDER}/${TEST_REFERENCE} + RESULT_VARIABLE TEST_COMPARE_RESULT + ) + else () # sort the output files first before comparing + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} v1) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} v2) + list (SORT v1) + list (SORT v2) + if (NOT v1 STREQUAL v2) + set (TEST_COMPARE_RESULT 1) + endif () endif () - endif () - if (TEST_COMPARE_RESULT) - set (TEST_COMPARE_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) - list (LENGTH test_ref len_ref) - if (NOT len_act EQUAL len_ref) - set (TEST_COMPARE_RESULT 1) - endif () - if (len_act GREATER 0 AND len_ref GREATER 0) - if (TEST_SORT_COMPARE) - list (SORT test_act) - list (SORT test_ref) + # only compare files if previous operations were successful + if (TEST_COMPARE_RESULT) + set (TEST_COMPARE_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT} test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_REFERENCE} test_ref) + list (LENGTH test_ref len_ref) + if (NOT len_act EQUAL len_ref) + set (TEST_COMPARE_RESULT 1) endif () - math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - if (line GREATER_EQUAL len_act) - message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_OUTPUT}") - set (TEST_COMPARE_RESULT 1) - break () - elseif (line GREATER_EQUAL len_ref) - message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_FOLDER}/${TEST_REFERENCE}") - set (TEST_COMPARE_RESULT 1) - break () - else () - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) - set (TEST_COMPARE_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + if (len_act GREATER 0 AND len_ref GREATER 0) + if (TEST_SORT_COMPARE) + list (SORT test_act) + list (SORT test_ref) + endif () + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + if (line GREATER_EQUAL len_act) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_PROCESSED_OUTPUT}") + set (TEST_COMPARE_RESULT 1) + break () + elseif (line GREATER_EQUAL len_ref) + message (STATUS "COMPARE FAILED: ran out of lines in ${TEST_PROCESSED_REFERENCE}") + set (TEST_COMPARE_RESULT 1) + break () + else () + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_COMPARE_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT} is empty") - endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_REFERENCE} is empty") endif () - endif () - endif () - endif () + endif () # TEST_COMPARE_RESULT + endif () # test_len GREATER 0 + endif () # EXISTS "${TEST_FOLDER}/${TEST_REFERENCE} message (STATUS "COMPARE Result: ${TEST_COMPARE_RESULT}") @@ -288,64 +303,69 @@ if (NOT TEST_SKIP_COMPARE) if (TEST_COMPARE_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_OUTPUT} did not match ${TEST_REFERENCE}") endif () + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT} does not exist") endif () # now compare the .err file with the error reference, if supplied - set (TEST_ERRREF_RESULT 0) - if (TEST_ERRREF) - file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) - list (LENGTH TEST_STREAM test_len) - if (test_len GREATER 0) - - # now compare the error output with the error reference - execute_process ( - COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} - RESULT_VARIABLE TEST_ERRREF_RESULT - ) - if (TEST_ERRREF_RESULT) - set (TEST_ERRREF_RESULT 0) - file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) - list (LENGTH test_act len_act) - file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) - list (LENGTH test_ref len_ref) - math (EXPR _FP_LEN "${len_ref} - 1") - if (len_act GREATER 0 AND len_ref GREATER 0) + if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") + set (TEST_ERRREF_RESULT 0) + if (TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF}") + file (READ ${TEST_FOLDER}/${TEST_ERRREF} TEST_STREAM) + list (LENGTH TEST_STREAM test_len) + if (test_len GREATER 0) + # now compare the error output with the error reference + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files --ignore-eol ${TEST_FOLDER}/${TEST_OUTPUT}.err ${TEST_FOLDER}/${TEST_ERRREF} + RESULT_VARIABLE TEST_ERRREF_RESULT + ) + if (TEST_ERRREF_RESULT) + set (TEST_ERRREF_RESULT 0) + file (STRINGS ${TEST_FOLDER}/${TEST_OUTPUT}.err test_act) + list (LENGTH test_act len_act) + file (STRINGS ${TEST_FOLDER}/${TEST_ERRREF} test_ref) + list (LENGTH test_ref len_ref) math (EXPR _FP_LEN "${len_ref} - 1") - foreach (line RANGE 0 ${_FP_LEN}) - list (GET test_act ${line} str_act) - list (GET test_ref ${line} str_ref) - if (NOT str_act STREQUAL str_ref) - if (str_act) - set (TEST_ERRREF_RESULT 1) - message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + if (len_act GREATER 0 AND len_ref GREATER 0) + math (EXPR _FP_LEN "${len_ref} - 1") + foreach (line RANGE 0 ${_FP_LEN}) + list (GET test_act ${line} str_act) + list (GET test_ref ${line} str_ref) + if (NOT str_act STREQUAL str_ref) + if (str_act) + set (TEST_ERRREF_RESULT 1) + message (STATUS "line = ${line}\n***ACTUAL: ${str_act}\n****REFER: ${str_ref}\n") + endif () endif () + endforeach () + else () # len_act GREATER 0 AND len_ref GREATER 0 + if (len_act EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") + endif () + if (len_ref EQUAL 0) + message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") endif () - endforeach () - else () - if (len_act EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_OUTPUT}.err is empty") endif () - if (len_ref EQUAL 0) - message (STATUS "COMPARE Failed: ${TEST_FOLDER}/${TEST_ERRREF} is empty") + if (NOT len_act EQUAL len_ref) + set (TEST_ERRREF_RESULT 1) endif () - endif () - if (NOT len_act EQUAL len_ref) - set (TEST_ERRREF_RESULT 1) - endif () - endif () - endif () + endif () # TEST_ERRREF_RESULT + endif () # test_len GREATER 0 - message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") + message (STATUS "COMPARE Result: ${TEST_ERRREF_RESULT}") - # again, if return value is !=0 scream and shout - if (TEST_ERRREF_RESULT) - message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") - endif () + # again, if return value is !=0 scream and shout + if (TEST_ERRREF_RESULT) + message (FATAL_ERROR "Failed: The error output of ${TEST_OUTPUT}.err did not match ${TEST_ERRREF}") + endif () + endif () # TEST_ERRREF AND EXISTS "${TEST_FOLDER}/${TEST_ERRREF} + else () + message (TRACE "Test output file ${TEST_FOLDER}/${TEST_OUTPUT}.err does not exist") endif () -endif () +endif () # TEST_SKIP_COMPARE set (TEST_GREP_RESULT 0) -if (TEST_GREP_COMPARE) +if (TEST_GREP_COMPARE AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") # now grep the output with the reference file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) list (LENGTH TEST_STREAM test_len) @@ -356,20 +376,24 @@ if (TEST_GREP_COMPARE) if (NOT TEST_GREP_RESULT) message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did not contain ${TEST_REFERENCE}") endif () + endif () +endif () - string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) - if (TEST_EXPECT) - # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match - string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) - if (TEST_GREP_RESULT) - message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") - endif () +# Check that TEST_FILTER text is not in the output when TEST_EXPECT is set to 1 +if (TEST_FILTER AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") + file (READ ${TEST_PROCESSED_OUTPUT} TEST_STREAM) + string (REGEX MATCH "${TEST_FILTER}" TEST_MATCH ${TEST_STREAM}) + # TEST_EXPECT (1) interprets TEST_FILTER as; NOT to match + if (TEST_EXPECT) + string (LENGTH "${TEST_MATCH}" TEST_GREP_RESULT) + if (TEST_GREP_RESULT) + message (FATAL_ERROR "Failed: The output of ${TEST_PROGRAM} did contain ${TEST_FILTER}") endif () endif () endif () # dump the output unless nodisplay option is set -if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) +if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY AND EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}") file (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) execute_process ( COMMAND ${CMAKE_COMMAND} -E echo ${TEST_STREAM} @@ -377,11 +401,8 @@ if (TEST_SKIP_COMPARE AND NOT TEST_NO_DISPLAY) ) endif () +# Check if the output files should not be removed if (NOT DEFINED ENV{HDF4_NOCLEANUP}) - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}" AND NOT TEST_SAVE) - file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}) - endif () - if (EXISTS "${TEST_FOLDER}/${TEST_OUTPUT}.err") file (REMOVE ${TEST_FOLDER}/${TEST_OUTPUT}.err) endif () diff --git a/config/sanitizer/README.md b/config/sanitizer/README.md index 2c35375671..edb101c0e8 100644 --- a/config/sanitizer/README.md +++ b/config/sanitizer/README.md @@ -54,7 +54,7 @@ These are used by declaring the `HDF4_USE_SANITIZER` CMake variable as string co - Leak - CFI -Multiple values are allowed, e.g. `-DHDF4_USE_SANITIZER=Address,Leak` but some sanitizers cannot be combined together, e.g.`-DHDF4_USE_SANITIZER=Address,Memory` will result in configuration error. The delimiter character is not required and `-DHDF5_USE_SANITIZER=AddressLeak` would work as well. +Multiple values are allowed, e.g. `-DHDF4_USE_SANITIZER=Address,Leak` but some sanitizers cannot be combined together, e.g.`-DHDF4_USE_SANITIZER=Address,Memory` will result in configuration error. The delimiter character is not required and `-DHDF4_USE_SANITIZER=AddressLeak` would work as well. ## Code Coverage [`code-coverage.cmake`](code-coverage.cmake) diff --git a/config/sanitizer/sanitizers.cmake b/config/sanitizer/sanitizers.cmake index 73ae994b48..dfd2bf745a 100644 --- a/config/sanitizer/sanitizers.cmake +++ b/config/sanitizer/sanitizers.cmake @@ -56,7 +56,7 @@ if(HDF4_USE_SANITIZER) if(UNIX) append("-fno-omit-frame-pointer" CMAKE_C_FLAGS) - message(STATUS "Building with sanitize, base flags=${CMAKE_C_FLAGS}") + message(STATUS "Building with sanitize, base flags=${CMAKE_C_SANITIZER_FLAGS}") if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") append("-O1" CMAKE_C_FLAGS) @@ -177,7 +177,8 @@ if(HDF4_USE_SANITIZER) message(STATUS " Building with ${SANITIZER_SELECTED_FLAGS}") append("${SANITIZER_SELECTED_FLAGS}" CMAKE_C_FLAGS) else() - message(FATAL_ERROR "Unsupported value of HDF4_USE_SANITIZER: ${HDF4_USE_SANITIZER}") + message( + FATAL_ERROR "Unsupported value of HDF4_USE_SANITIZER: ${HDF4_USE_SANITIZER}") endif() elseif(MSVC) if(HDF4_USE_SANITIZER MATCHES "([Aa]ddress)") diff --git a/config/toolchain/clang.cmake b/config/toolchain/clang.cmake index 2a856077f1..bad6bef16b 100644 --- a/config/toolchain/clang.cmake +++ b/config/toolchain/clang.cmake @@ -9,7 +9,7 @@ if(WIN32) else() set (CMAKE_C_COMPILER clang) set (CMAKE_CXX_COMPILER clang++) - #set (CMAKE_Fortran_COMPILER flang-new) + #set (CMAKE_Fortran_COMPILER flang) endif() set (CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/doxygen/aliases b/doxygen/aliases index ec2f2b23ee..3e3d4f9477 100644 --- a/doxygen/aliases +++ b/doxygen/aliases @@ -99,7 +99,6 @@ ALIASES += fgdta_loc_obj_id{1}="\loc_obj_id{\1}. The identifier may be that of a # Others ################################################################################ -ALIASES += cpp_c_api_note="\attention \Bold{C++ Developers using HDF5 C-API functions beware:}\n Several functions in this C-API take function pointers or callbacks as arguments. Examples include H5Pset_elink_cb(), H5Pset_type_conv_cb(), H5Tconvert(), and H5Ewalk2(). Application code must ensure that those callback functions return normally such to allow the HDF5 to manage its resources and maintain a consistent state. For instance, those functions must not use the C \c setjmp / \c longjmp mechanism to leave those callback functions. Within the context of C++, any exceptions thrown within the callback function must be caught, such as with a \TText{catch(…)} statement. Any exception state can be placed within the provided user data function call arguments, and may be thrown again once the calling function has returned. Exceptions raised and not handled inside the callback are not supported as it might leave the HDF5 library in an inconsistent state. Similarly, using C++20 coroutines cannot be used as callbacks, since they do not support plain return statements. If a callback function yields execution to another C++20 coroutine calling HDF5 functions as well, this may lead to undefined behavior." ALIASES += par_compr_note="\attention If you are planning to use compression with parallel HDF5, ensure that calls to H5Dwrite() occur in collective mode. In other words, all MPI ranks (in the relevant communicator) call H5Dwrite() and pass a dataset transfer property list with the MPI-IO collective option property set to #H5FD_MPIO_COLLECTIVE_IO.\n Note that data transformations are currently \Bold{not} supported when writing to datasets in parallel and with compression enabled." ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_coll_metadata_write() \li H5Pset_all_coll_metadata_ops() \li H5Pset_coll_metadata_write() \li \ref maybe_metadata_reads" @@ -110,13 +109,13 @@ ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_co ALIASES += click4more="(Click on a enumerator, field, or type for more information.)" ALIASES += csets="
#H5T_CSET_ASCIIUS ASCII
#H5T_CSET_UTF8UTF-8 Unicode encoding
" ALIASES += datatype_class=" \li #H5T_INTEGER \li #H5T_FLOAT \li #H5T_STRING \li #H5T_BITFIELD \li #H5T_OPAQUE \li #H5T_COMPOUND \li #H5T_REFERENCE \li #H5T_ENUM \li #H5T_VLEN \li #H5T_ARRAY" -ALIASES += file_access="
#H5F_ACC_RDWRFile was opened with read/write access.
#H5F_ACC_RDONLYFile was opened with read-only access.
#H5F_ACC_SWMR_WRITEFile was opened with read/write access for a single-writer/multiple-reader (SWMR) scenario. Note that the writer process must also open the file with the #H5F_ACC_RDWR flag.
#H5F_ACC_SWMR_READFile was opened with read-only access for a single-writer/multiple-reader (SWMR) scenario. Note that the reader process must also open the file with the #H5F_ACC_RDONLY flag.
" +ALIASES += file_access="
#H5F_ACC_RDWRFile was opened with read/write access.
#H5F_ACC_RDONLYFile was opened with read-only access.
#H5F_ACC_SWMR_WRITEFile was opened with read/write access for a single-writer/multiple-reader (SWMR) scenario. Note that the writer process must also open the file with the #H4F_ACC_RDWR flag.
#H5F_ACC_SWMR_READFile was opened with read-only access for a single-writer/multiple-reader (SWMR) scenario. Note that the reader process must also open the file with the #H5F_ACC_RDONLY flag.
" ALIASES += id_types="
#H5I_FILEFile
#H5I_GROUPGroup
#H5I_DATATYPEDatatype
#H5I_DATASPACEDataspace
#H5I_DATASETDataset
#H5I_ATTRAttribute
" ALIASES += indexes="
#H5_INDEX_NAMELexicographic order on name
#H5_INDEX_CRT_ORDERIndex on creation order
" ALIASES += link_types="
#H5L_TYPE_HARDHard link
#H5L_TYPE_SOFTSoft link
#H5L_TYPE_EXTERNALExternal link
#H5L_TYPE_ERRORError
" ALIASES += mem_types="
#H5FD_MEM_DEFAULTThe default file memory allocation type
#H5FD_MEM_SUPERFile memory allocated for Superblock
#H5FD_MEM_BTREEFile memory allocated for B-tree
#H5FD_MEM_DRAWFile memory allocated for raw data
#H5FD_MEM_GHEAPFile memory allocated for Global Heap
#H5FD_MEM_LHEAPFile memory allocated for Local Heap
#H5FD_MEM_OHDRFile memory allocated for Object Header
" ALIASES += norm_type="
#H5T_NORM_IMPLIED0MSB of mantissa is not stored, always 1
#H5T_NORM_MSBSET1MSB of mantissa is always 1
#H5T_NORM_NONE2Mantissa is not normalized
" -ALIASES += obj_types="
#H5F_OBJ_FILEFiles only
#H5F_OBJ_DATASETDatasets only
#H5F_OBJ_GROUPGroups only
#H5F_OBJ_DATATYPENamed datatypes only
#H5F_OBJ_ATTRAttributes only
#H5F_OBJ_ALLAll of the above
#H5F_OBJ_LOCALRestrict search to objects opened through current file identifier.
\attention #H5F_OBJ_LOCAL does not stand alone; it is effective only when used in combination with one or more of the preceding types. For example, #H5F_OBJ_DATASET | #H5F_OBJ_GROUP | #H5F_OBJ_LOCAL would count all datasets and groups opened through the current file identifier." +ALIASES += obj_types="
#H5F_OBJ_FILEFiles only
#H5F_OBJ_DATASETDatasets only
#H5F_OBJ_GROUPGroups only
#H5F_OBJ_DATATYPENamed datatypes only
#H5F_OBJ_ATTRAttributes only
#H5F_OBJ_ALLAll of the above
#H4F_OBJ_LOCALRestrict search to objects opened through current file identifier.
\attention #H5F_OBJ_LOCAL does not stand alone; it is effective only when used in combination with one or more of the preceding types. For example, #H5F_OBJ_DATASET | #H5F_OBJ_GROUP | #H5F_OBJ_LOCAL would count all datasets and groups opened through the current file identifier." ALIASES += orders="
#H5_ITER_INCIncreasing order
#H5_ITER_DECDecreasing order
#H5_ITER_NATIVEFastest available order
" ALIASES += padding_type="
#H5T_PAD_ZERO0Set background to zeros
#H5T_PAD_ONE1Set background to ones
#H5T_PAD_BACKGROUND2Leave background alone
" ALIASES += scopes="
#H5F_SCOPE_GLOBALFlushes the entire virtual file
#H5F_SCOPE_LOCALFlushes only the specified file
" diff --git a/java/lib/ext/slf4j-nop-2.0.16.jar b/java/lib/ext/slf4j-nop-2.0.16.jar new file mode 100644 index 0000000000..0fac10585d Binary files /dev/null and b/java/lib/ext/slf4j-nop-2.0.16.jar differ diff --git a/java/lib/ext/slf4j-nop-2.0.6.jar b/java/lib/ext/slf4j-nop-2.0.6.jar deleted file mode 100644 index 27740a5b2a..0000000000 Binary files a/java/lib/ext/slf4j-nop-2.0.6.jar and /dev/null differ diff --git a/java/lib/ext/slf4j-simple-2.0.16.jar b/java/lib/ext/slf4j-simple-2.0.16.jar new file mode 100644 index 0000000000..d3d8bd9199 Binary files /dev/null and b/java/lib/ext/slf4j-simple-2.0.16.jar differ diff --git a/java/lib/ext/slf4j-simple-2.0.6.jar b/java/lib/ext/slf4j-simple-2.0.6.jar deleted file mode 100644 index f8913c0a8c..0000000000 Binary files a/java/lib/ext/slf4j-simple-2.0.6.jar and /dev/null differ diff --git a/java/lib/hamcrest-core.jar b/java/lib/hamcrest-core.jar deleted file mode 100644 index 9d5fe16e3d..0000000000 Binary files a/java/lib/hamcrest-core.jar and /dev/null differ diff --git a/java/lib/org.hamcrest.jar b/java/lib/org.hamcrest.jar new file mode 100644 index 0000000000..71065788d5 Binary files /dev/null and b/java/lib/org.hamcrest.jar differ diff --git a/java/lib/junit.jar b/java/lib/org.junit.jar similarity index 60% rename from java/lib/junit.jar rename to java/lib/org.junit.jar index 6da55d8b85..6e28200503 100644 Binary files a/java/lib/junit.jar and b/java/lib/org.junit.jar differ diff --git a/java/lib/slf4j-api-2.0.16.jar b/java/lib/slf4j-api-2.0.16.jar new file mode 100644 index 0000000000..cbb5448d07 Binary files /dev/null and b/java/lib/slf4j-api-2.0.16.jar differ diff --git a/java/lib/slf4j-api-2.0.6.jar b/java/lib/slf4j-api-2.0.6.jar deleted file mode 100644 index a2cb8020a5..0000000000 Binary files a/java/lib/slf4j-api-2.0.6.jar and /dev/null differ diff --git a/java/src/hdf/hdflib/CMakeLists.txt b/java/src/hdf/hdflib/CMakeLists.txt index 28f30248c0..4e259281a5 100644 --- a/java/src/hdf/hdflib/CMakeLists.txt +++ b/java/src/hdf/hdflib/CMakeLists.txt @@ -36,7 +36,7 @@ set (HDF4_JAVA_HDF_HDF4_SRCS set (CMAKE_JNI_TARGET TRUE) file (WRITE ${PROJECT_BINARY_DIR}/Manifest.txt -" +"Enable-Native-Access: ALL-UNNAMED " ) diff --git a/java/test/CMakeLists.txt b/java/test/CMakeLists.txt index 5d2239a32f..864f934710 100644 --- a/java/test/CMakeLists.txt +++ b/java/test/CMakeLists.txt @@ -18,7 +18,7 @@ set (HDF4_JAVA_TEST_SOURCES TestH4VSparams ) -set (CMAKE_JAVA_INCLUDE_PATH "${HDF4_JAVA_LIB_DIR}/junit.jar;${HDF4_JAVA_LIB_DIR}/hamcrest-core.jar;${HDF4_JAVA_JARS};${HDF4_JAVA_LOGGING_JAR};${HDF4_JAVA_LOGGING_SIMPLE_JAR}") +set (CMAKE_JAVA_INCLUDE_PATH "${HDF4_JAVA_LIB_DIR}/org.junit.jar;${HDF4_JAVA_LIB_DIR}/org.hamcrest.jar;${HDF4_JAVA_JARS};${HDF4_JAVA_LOGGING_JAR};${HDF4_JAVA_LOGGING_SIMPLE_JAR}") foreach (test_file ${HDF4_JAVA_TEST_SOURCES}) diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt index 42d44e7233..c408916226 100644 --- a/release_docs/INSTALL_CMake.txt +++ b/release_docs/INSTALL_CMake.txt @@ -527,14 +527,14 @@ These five steps are described in detail below. # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) - set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) + set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE) set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) - set (HDF5_USE_ZLIB_NG OFF CACHE BOOL "Use zlib-ng library as zlib library" FORCE) + set (HDF4_USE_ZLIB_NG OFF CACHE BOOL "Use zlib-ng library as zlib library" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) - set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) + set (ZLIBNG_TGZ_NAME "2.2.4.tar.gz" CACHE STRING "Use ZLib from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) diff --git a/release_docs/USING_CMake_Examples.txt b/release_docs/USING_CMake_Examples.txt index 6f2f24c77f..4d597bd967 100644 --- a/release_docs/USING_CMake_Examples.txt +++ b/release_docs/USING_CMake_Examples.txt @@ -65,7 +65,7 @@ Default installation process: Shared libraries can be used with the STATIC_ONLY script option set to "NO". Shared libraries and other options can be changed by editing the - HDF5_Examples_options.cmake file. + HDF4_Examples_options.cmake file. If the defaults are okay, execute from this directory: ctest -S HDF4_Examples.cmake -C Release -V -O test.log