mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-21 08:39:46 +08:00
f3e711e2b8
re: https://github.com/Unidata/netcdf-c/issues/2177 re: https://github.com/Unidata/netcdf-c/pull/2178 Provide get/set functions to store global data alignment information and apply it when a file is created. The api is as follows: ```` int nc_set_alignment(int threshold, int alignment); int nc_get_alignment(int* thresholdp, int* alignmentp); ```` If defined, then for every file created opened after the call to nc_set_alignment, for every new variable added to the file, the most recently set threshold and alignment values will be applied to that variable. The nc_get_alignment function return the last values set by nc_set_alignment. If nc_set_alignment has not been called, then it returns the value 0 for both threshold and alignment. The alignment parameters are stored in the NCglobalstate object (see below) for use as needed. Repeated calls to nc_set_alignment will overwrite any existing values in NCglobalstate. The alignment parameters are applied in libhdf5/hdf5create.c and libhdf5/hdf5open.c The set/get alignment functions are defined in libsrc4/nc4internal.c. A test program was added as nc_test4/tst_alignment.c. ## Misc. Changes Unrelated to Alignment * The NCRCglobalstate type was renamed to NCglobalstate to indicate that it represented more general global state than just .rc data. It was also moved to nc4internal.h. This led to a large number of small changes: mostly renaming. The global state management functions were moved to nc4internal.c. * The global chunk cache variables have been moved into NCglobalstate. As warranted, other global state will be moved as well. * Some misc. problems with the nczarr performance tests were corrected.
390 lines
12 KiB
Plaintext
390 lines
12 KiB
Plaintext
dnl UD macros for netcdf configure
|
|
|
|
dnl
|
|
dnl UD_CHECK_IEEE
|
|
dnl If the 'double' is not an IEEE double
|
|
dnl or the 'float' is not and IEEE single,
|
|
dnl define NO_IEEE_FLOAT
|
|
dnl
|
|
AC_DEFUN([UD_CHECK_IEEE],
|
|
[
|
|
AC_MSG_CHECKING(for IEEE floating point format)
|
|
AC_TRY_RUN([#ifndef NO_FLOAT_H
|
|
#include <float.h>
|
|
#endif
|
|
|
|
#define EXIT_NOTIEEE 1
|
|
#define EXIT_MAYBEIEEE 0
|
|
|
|
int
|
|
main()
|
|
{
|
|
#if defined(FLT_RADIX) && FLT_RADIX != 2
|
|
return EXIT_NOTIEEE;
|
|
#elif defined(DBL_MAX_EXP) && DBL_MAX_EXP != 1024
|
|
return EXIT_NOTIEEE;
|
|
#elif defined(DBL_MANT_DIG) && DBL_MANT_DIG != 53
|
|
return EXIT_NOTIEEE;
|
|
#elif defined(FLT_MAX_EXP) && !(FLT_MAX_EXP == 1024 || FLT_MAX_EXP == 128)
|
|
return EXIT_NOTIEEE;
|
|
#elif defined(FLT_MANT_DIG) && !(FLT_MANT_DIG == 53 || FLT_MANT_DIG == 24)
|
|
return EXIT_NOTIEEE;
|
|
#else
|
|
/* (assuming eight bit char) */
|
|
if(sizeof(double) != 8)
|
|
return EXIT_NOTIEEE;
|
|
if(!(sizeof(float) == 4 || sizeof(float) == 8))
|
|
return EXIT_NOTIEEE;
|
|
|
|
return EXIT_MAYBEIEEE;
|
|
#endif
|
|
}],ac_cv_c_ieeefloat=yes, ac_cv_c_ieeefloat=no, :)
|
|
AC_MSG_RESULT($ac_cv_c_ieeefloat)
|
|
if test "$ac_cv_c_ieeefloat" = no; then
|
|
AC_DEFINE([NO_IEEE_FLOAT], [], [no IEEE float on this platform])
|
|
fi
|
|
])
|
|
|
|
|
|
dnl
|
|
dnl Print which compilers are going to be used, the flags, and their
|
|
dnl locations. This is all to assist in debugging, and help with
|
|
dnl support questions.
|
|
dnl
|
|
AC_DEFUN([UD_DISPLAY_RESULTS],
|
|
[
|
|
AC_MSG_CHECKING(CPPFLAGS)
|
|
AC_MSG_RESULT($CPPFLAGS)
|
|
AC_MSG_CHECKING(CC CFLAGS)
|
|
AC_MSG_RESULT($CC $CFLAGS)
|
|
ud_type_cc=`type $CC`
|
|
AC_MSG_CHECKING(type $CC)
|
|
AC_MSG_RESULT($ud_type_cc)
|
|
|
|
AC_MSG_CHECKING(CXX)
|
|
if test -n "$CXX"; then
|
|
AC_MSG_RESULT($CXX)
|
|
AC_MSG_CHECKING(CXXFLAGS)
|
|
AC_MSG_RESULT($CXXFLAGS)
|
|
ud_type_CXX=`type $CXX`
|
|
AC_MSG_CHECKING(type $CXX)
|
|
AC_MSG_RESULT($ud_type_CXX)
|
|
else
|
|
AC_MSG_RESULT(unset)
|
|
fi
|
|
|
|
AC_MSG_CHECKING(FC)
|
|
if test -n "$FC"; then
|
|
AC_MSG_RESULT($FC)
|
|
AC_MSG_CHECKING(FFLAGS)
|
|
AC_MSG_RESULT($FFLAGS)
|
|
ud_type_fc=`type $FC`
|
|
AC_MSG_CHECKING(type $FC)
|
|
AC_MSG_RESULT($ud_type_fc)
|
|
else
|
|
AC_MSG_RESULT(unset)
|
|
fi
|
|
|
|
AC_MSG_CHECKING(F90)
|
|
if test -n "$F90"; then
|
|
AC_MSG_RESULT($F90)
|
|
AC_MSG_CHECKING(FCFLAGS)
|
|
AC_MSG_RESULT($FCFLAGS)
|
|
ud_type_F90=`type $F90`
|
|
AC_MSG_CHECKING(type $F90)
|
|
AC_MSG_RESULT($ud_type_F90)
|
|
else
|
|
AC_MSG_RESULT(unset)
|
|
fi
|
|
|
|
AC_MSG_CHECKING(AR)
|
|
if test -n "$AR"; then
|
|
AC_MSG_RESULT($AR)
|
|
AC_MSG_CHECKING(AR_FLAGS)
|
|
AC_MSG_RESULT($AR_FLAGS)
|
|
ud_type_AR=`type $AR`
|
|
AC_MSG_CHECKING(type $AR)
|
|
AC_MSG_RESULT($ud_type_AR)
|
|
else
|
|
AC_MSG_RESULT(unset)
|
|
fi
|
|
|
|
AC_MSG_CHECKING(NM)
|
|
if test -n "$NM"; then
|
|
AC_MSG_RESULT($NM)
|
|
AC_MSG_CHECKING(NMFLAGS)
|
|
AC_MSG_RESULT($NMFLAGS)
|
|
# ud_type_NM=`type $NM`
|
|
# AC_MSG_CHECKING(type $NM)
|
|
# AC_MSG_RESULT($ud_type_NM)
|
|
else
|
|
AC_MSG_RESULT(unset)
|
|
fi
|
|
|
|
])
|
|
|
|
dnl Find the full path of a header file
|
|
dnl
|
|
dnl UD_CHECK_HEADER_PATH(file, [action-if-found], [action-if-not-found])
|
|
dnl Example:
|
|
dnl UD_CHECK_HEADER_PATH([math.h])
|
|
dnl AC_MSG_NOTICE([ac_cv_header_path_math_h=$ac_cv_header_path_math_h])
|
|
dnl
|
|
dnl
|
|
AC_DEFUN([UD_CHECK_HEADER_PATH],
|
|
[
|
|
AS_VAR_PUSHDEF([ac_Path], [ac_cv_header_path_$1])dnl
|
|
AC_CACHE_CHECK(
|
|
[for full path of header file $1], [ac_Path],
|
|
[AC_PREPROC_IFELSE(
|
|
[AC_LANG_PROGRAM([[#include <$1>]])],
|
|
[AS_VAR_SET([ac_Path], [`sed -n '/\.h"/s/.*"\(.*\)".*/\1/p' conftest.i | grep -m 1 $1`])],
|
|
[AC_MSG_RESULT([not found])]
|
|
)])
|
|
AS_VAR_SET_IF([ac_Path], [$2], [$3])
|
|
AS_VAR_POPDEF([ac_Path])dnl
|
|
])
|
|
|
|
# ===========================================================================
|
|
# https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html
|
|
# ===========================================================================
|
|
#
|
|
# SYNOPSIS
|
|
#
|
|
# AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off)
|
|
# AX_VALGRIND_CHECK()
|
|
#
|
|
# DESCRIPTION
|
|
#
|
|
# AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows
|
|
# running `make check` under a variety of Valgrind tools to check for
|
|
# memory and threading errors.
|
|
#
|
|
# Defines VALGRIND_CHECK_RULES which should be substituted in your
|
|
# Makefile; and $enable_valgrind which can be used in subsequent configure
|
|
# output. VALGRIND_ENABLED is defined and substituted, and corresponds to
|
|
# the value of the --enable-valgrind option, which defaults to being
|
|
# enabled if Valgrind is installed and disabled otherwise. Individual
|
|
# Valgrind tools can be disabled via --disable-valgrind-<tool>, the
|
|
# default is configurable via the AX_VALGRIND_DFLT command or is to use
|
|
# all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT
|
|
# calls must be made before the call to AX_VALGRIND_CHECK.
|
|
#
|
|
# If unit tests are written using a shell script and automake's
|
|
# LOG_COMPILER system, the $(VALGRIND) variable can be used within the
|
|
# shell scripts to enable Valgrind, as described here:
|
|
#
|
|
# https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html
|
|
#
|
|
# Usage example:
|
|
#
|
|
# configure.ac:
|
|
#
|
|
# AX_VALGRIND_DFLT([sgcheck], [off])
|
|
# AX_VALGRIND_CHECK
|
|
#
|
|
# in each Makefile.am with tests:
|
|
#
|
|
# @VALGRIND_CHECK_RULES@
|
|
# VALGRIND_SUPPRESSIONS_FILES = my-project.supp
|
|
# EXTRA_DIST = my-project.supp
|
|
#
|
|
# This results in a "check-valgrind" rule being added. Running `make
|
|
# check-valgrind` in that directory will recursively run the module's test
|
|
# suite (`make check`) once for each of the available Valgrind tools (out
|
|
# of memcheck, helgrind and drd) while the sgcheck will be skipped unless
|
|
# enabled again on the commandline with --enable-valgrind-sgcheck. The
|
|
# results for each check will be output to test-suite-$toolname.log. The
|
|
# target will succeed if there are zero errors and fail otherwise.
|
|
#
|
|
# Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in
|
|
# memcheck, helgrind, drd and sgcheck. These are useful because often only
|
|
# some of those tools can be ran cleanly on a codebase.
|
|
#
|
|
# The macro supports running with and without libtool.
|
|
#
|
|
# LICENSE
|
|
#
|
|
# Copyright (c) 2014, 2015, 2016 Philip Withnall <philip.withnall@collabora.co.uk>
|
|
#
|
|
# Copying and distribution of this file, with or without modification, are
|
|
# permitted in any medium without royalty provided the copyright notice
|
|
# and this notice are preserved. This file is offered as-is, without any
|
|
# warranty.
|
|
|
|
# serial-17
|
|
|
|
dnl Configured tools
|
|
m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]])
|
|
m4_set_add_all([valgrind_exp_tool_set], [sgcheck])
|
|
m4_foreach([vgtool], [valgrind_tool_list],
|
|
[m4_define([en_dflt_valgrind_]vgtool, [on])])
|
|
|
|
AC_DEFUN([AX_VALGRIND_DFLT],[
|
|
m4_define([en_dflt_valgrind_$1], [$2])
|
|
])dnl
|
|
|
|
AM_EXTRA_RECURSIVE_TARGETS([check-valgrind])
|
|
m4_foreach([vgtool], [valgrind_tool_list],
|
|
[AM_EXTRA_RECURSIVE_TARGETS([check-valgrind-]vgtool)])
|
|
|
|
AC_DEFUN([AX_VALGRIND_CHECK],[
|
|
dnl Check for --enable-valgrind
|
|
AC_ARG_ENABLE([valgrind],
|
|
[AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])],
|
|
[enable_valgrind=$enableval],[enable_valgrind=])
|
|
|
|
AS_IF([test "$enable_valgrind" != "no"],[
|
|
# Check for Valgrind.
|
|
AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind])
|
|
AS_IF([test "$VALGRIND" = ""],[
|
|
AS_IF([test "$enable_valgrind" = "yes"],[
|
|
AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind])
|
|
],[
|
|
enable_valgrind=no
|
|
])
|
|
],[
|
|
enable_valgrind=yes
|
|
])
|
|
])
|
|
|
|
AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"])
|
|
AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind])
|
|
|
|
# Check for Valgrind tools we care about.
|
|
[valgrind_enabled_tools=]
|
|
m4_foreach([vgtool],[valgrind_tool_list],[
|
|
AC_ARG_ENABLE([valgrind-]vgtool,
|
|
m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl
|
|
[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl
|
|
[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]),
|
|
[enable_valgrind_]vgtool[=$enableval],
|
|
[enable_valgrind_]vgtool[=])
|
|
AS_IF([test "$enable_valgrind" = "no"],[
|
|
enable_valgrind_]vgtool[=no],
|
|
[test "$enable_valgrind_]vgtool[" ]dnl
|
|
m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[
|
|
AC_CACHE_CHECK([for Valgrind tool ]vgtool,
|
|
[ax_cv_valgrind_tool_]vgtool,[
|
|
ax_cv_valgrind_tool_]vgtool[=no
|
|
m4_set_contains([valgrind_exp_tool_set],vgtool,
|
|
[m4_define([vgtoolx],[exp-]vgtool)],
|
|
[m4_define([vgtoolx],vgtool)])
|
|
AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[
|
|
ax_cv_valgrind_tool_]vgtool[=yes
|
|
])
|
|
])
|
|
AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[
|
|
AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
|
|
AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool)
|
|
],[
|
|
enable_valgrind_]vgtool[=no
|
|
])
|
|
],[
|
|
enable_valgrind_]vgtool[=yes
|
|
])
|
|
])
|
|
AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[
|
|
valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])["
|
|
])
|
|
AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool)
|
|
])
|
|
AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["])
|
|
AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools])
|
|
|
|
[VALGRIND_CHECK_RULES='
|
|
# Valgrind check
|
|
#
|
|
# Optional:
|
|
# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions
|
|
# files to load. (Default: empty)
|
|
# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools.
|
|
# (Default: --num-callers=30)
|
|
# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of:
|
|
# memcheck, helgrind, drd, sgcheck). (Default: various)
|
|
|
|
# Optional variables
|
|
VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES))
|
|
VALGRIND_FLAGS ?= --num-callers=30
|
|
VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no
|
|
VALGRIND_helgrind_FLAGS ?= --history-level=approx
|
|
VALGRIND_drd_FLAGS ?=
|
|
VALGRIND_sgcheck_FLAGS ?=
|
|
|
|
# Internal use
|
|
valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools)))
|
|
|
|
valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS)
|
|
valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS)
|
|
valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS)
|
|
valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS)
|
|
|
|
valgrind_quiet = $(valgrind_quiet_$(V))
|
|
valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY))
|
|
valgrind_quiet_0 = --quiet
|
|
valgrind_v_use = $(valgrind_v_use_$(V))
|
|
valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY))
|
|
valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%-am,%,$''@):;
|
|
|
|
# Support running with and without libtool.
|
|
ifneq ($(LIBTOOL),)
|
|
valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute
|
|
else
|
|
valgrind_lt =
|
|
endif
|
|
|
|
# Use recursive makes in order to ignore errors during check
|
|
check-valgrind-am:
|
|
ifeq ($(VALGRIND_ENABLED),yes)
|
|
$(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \
|
|
$(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool))
|
|
else
|
|
@echo "Need to reconfigure with --enable-valgrind"
|
|
endif
|
|
|
|
# Valgrind running
|
|
VALGRIND_TESTS_ENVIRONMENT = \
|
|
$(TESTS_ENVIRONMENT) \
|
|
env VALGRIND=$(VALGRIND) \
|
|
G_SLICE=always-malloc,debug-blocks \
|
|
G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly
|
|
|
|
VALGRIND_LOG_COMPILER = \
|
|
$(valgrind_lt) \
|
|
$(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS)
|
|
|
|
define valgrind_tool_rule
|
|
check-valgrind-$(1)-am:
|
|
ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes)
|
|
ifneq ($$(TESTS),)
|
|
$$(valgrind_v_use)$$(MAKE) check-TESTS \
|
|
TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \
|
|
LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \
|
|
LOG_FLAGS="$$(valgrind_$(1)_flags)" \
|
|
TEST_SUITE_LOG=test-suite-$(1).log
|
|
endif
|
|
else ifeq ($$(VALGRIND_ENABLED),yes)
|
|
@echo "Need to reconfigure with --enable-valgrind-$(1)"
|
|
else
|
|
@echo "Need to reconfigure with --enable-valgrind"
|
|
endif
|
|
endef
|
|
|
|
$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool))))
|
|
|
|
A''M_DISTCHECK_CONFIGURE_FLAGS ?=
|
|
A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind
|
|
|
|
MOSTLYCLEANFILES ?=
|
|
MOSTLYCLEANFILES += $(valgrind_log_files)
|
|
|
|
.PHONY: check-valgrind $(add-prefix check-valgrind-,$(valgrind_tools))
|
|
']
|
|
|
|
AC_SUBST([VALGRIND_CHECK_RULES])
|
|
m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])])
|
|
])
|
|
|
|
AC_DEFUN([_AC_FINALIZE],[])
|
|
|