From 1f1081e039bea766161cb7055589b74267764c9b Mon Sep 17 00:00:00 2001 From: Albert Cheng Date: Thu, 8 Oct 2015 15:50:15 -0500 Subject: [svn-r28009] HDFFV-9536: Changed H5check_version() to use libtool shared library version numbers instead of the library version numbers. bin/h5vers: Changed to copy the shared lib version from lt_vers.am to H5public.h (Thanks to Larry who made the changes.) src/H5public.h: Changed by bin/h5vers. src/H5.c: Changed H5check_version() to use shared library version for compatibility checking. test/tcheck_version.c: test/testcheck_version.sh.in: Changed to use shared library version numbers instead of the HDF5 library version numbers for testing. Tested: tested in Jam and Kituo. --- bin/h5vers | 60 +++++++++++++++++++++++++++-------------- src/H5.c | 63 +++++++++++++++++++++++++++++++++++--------- src/H5public.h | 12 ++++++--- test/tcheck_version.c | 12 ++++----- test/testcheck_version.sh.in | 11 ++++---- 5 files changed, 110 insertions(+), 48 deletions(-) diff --git a/bin/h5vers b/bin/h5vers index 2fe9105..35d2212 100755 --- a/bin/h5vers +++ b/bin/h5vers @@ -105,6 +105,13 @@ sub setvers { $vers[3]?"-":"", $vers[3])/me; } +sub setltvers { + my ($contents, @vers) = @_; + $_[0] =~ s/^(\#\s*define\s+LT_VERS_INTERFACE\s+)\d+/$1$vers[0]/m; + $_[0] =~ s/^(\#\s*define\s+LT_VERS_REVISION\s+)\d+/$1$vers[1]/m; + $_[0] =~ s/^(\#\s*define\s+LT_VERS_AGE\s+)\d+/$1$vers[2]/m; +} + sub usage { my ($prog) = $0 =~ /([^\/]+)$/; print STDERR < $version_increased="true"; } +my @newltver; +# Update the libtool shared library version in src/H5public.h +if ($LT_VERS) { + open FILE, $LT_VERS or die "$LT_VERS: $!\n"; + my ($contentsy) = join "", ; + close FILE; + + local($_) = $contentsy; + + # Don't increment LT_VERS_REVISION, but instead copy LT_VERS_* values + # to H5public.h. + # my ($lt_revision) = /^LT_VERS_REVISION\s*=\s*(\d+)/m; + # my $new_lt_revision = $lt_revision+1; + # ($contentsy) =~ s/^(LT_VERS_REVISION\s*=\s*)\d+/$1$new_lt_revision/m; + + # open FILE, ">$LT_VERS" or die "$LT_VERS: $!\n"; + # print FILE $contentsy; + # close FILE; + + my ($lt_interface) = /^LT_VERS_INTERFACE\s*=\s*(\d+)/m; + my ($lt_revision) = /^LT_VERS_REVISION\s*=\s*(\d+)/m; + my ($lt_age) = /^LT_VERS_AGE\s*=\s*(\d+)/m; + + @newltver = ($lt_interface, $lt_revision, $lt_age); + +} + # Update the version number if it changed. if ($newver[0]!=$curver[0] || $newver[1]!=$curver[1] || $newver[2]!=$curver[2] || $newver[3]ne$curver[3]) { setvers $contents, @newver or die "unable to set version\n"; +} + setltvers $contents, @newltver or die "unable to set lt version\n"; rename $file, "$file~" or die "unable to save backup file\n"; open FILE, ">$file" or die "unable to open $file but backup saved!\n"; print FILE $contents; close FILE; -} - -# Update the libtool shared library version in src/Makefile.am if -# the version number has increased. -if ($LT_VERS && $version_increased) { - open FILE, $LT_VERS or die "$LT_VERS: $!\n"; - my ($contentsy) = join "", ; - close FILE; - - local($_) = $contentsy; - - my ($lt_revision) = /^LT_VERS_REVISION\s*=\s*(\d+)/m; - my $new_lt_revision = $lt_revision+1; - ($contentsy) =~ s/^(LT_VERS_REVISION\s*=\s*)\d+/$1$new_lt_revision/m; - - open FILE, ">$LT_VERS" or die "$LT_VERS: $!\n"; - print FILE $contentsy; - close FILE; -} # Update the README.txt file if ($README) { @@ -436,6 +453,9 @@ if ($verbose) { $newver[3] eq "" ? "" : "-".$newver[3]); } +# print shared lib version in the format of interface.revision.age +printf("Shared lib version %d.%d.%d\n", @newltver[0,1,2]); + exit 0; # Because the first line of this file looks like a Bourne shell script, we diff --git a/src/H5.c b/src/H5.c index 8826879..3993753 100644 --- a/src/H5.c +++ b/src/H5.c @@ -675,6 +675,31 @@ done: * called from user to verify that the versions of header files * compiled into the application match the version of the hdf5 * library. + * Algorithm: + * + * Definitions: + * Compile-time (aka headers, defined in src/H5public.h): + * the three arguments supplied + * interface: compile time interface + * revision: compile time revision + * age: compiler time age + * + * Link-time (aka values library has from its version of src/H5public.h): + * LT_VERS_INTERFACE + * LT_VERS_REVISION + * LT_VERS_AGE + * + * Verification criteria: + * Assert interface >= age and LT_VERS_INTERFACE >= LT_VERS_AGE + * + * if ((LT_VERS_INTERFACE - LT_VERS_AGE) .ne. (interface - age)) then + * mesg “incompatible” + * else + * if (age > LT_VERS_AGE) then + * mesg “incompatible” + * endif + * endif + * * * Return: Success: SUCCEED * @@ -686,6 +711,8 @@ done: * Modifications: * Albert Cheng, May 12, 2001 * Added verification of H5_VERS_INFO. + * Albert Cheng, Oct 8, 2015 + * Changed to use shared library version for verification criteria. * *------------------------------------------------------------------------- */ @@ -700,33 +727,43 @@ done: "settings such as 'LD_LIBRARY_PATH'.\n" herr_t -H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) +H5check_version(unsigned interface, unsigned revision, unsigned age) { char lib_str[256]; char substr[] = H5_VERS_SUBRELEASE; static int checked = 0; /* If we've already checked the version info */ static unsigned int disable_version_check = 0; /* Set if the version check should be disabled */ static const char *version_mismatch_warning = VERSION_MISMATCH_WARNING; + const char *s; /* Environment string for disabling version check */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_API_NOINIT_NOERR_NOFS - H5TRACE3("e", "IuIuIu", majnum, minnum, relnum); + H5TRACE3("e", "IuIuIu", interface, revision, age); /* Don't check again, if we already have */ if (checked) HGOTO_DONE(SUCCEED) - { const char *s; /* Environment string for disabling version check */ + /* Check if the user wishes to allow different versions of the header */ + /* files and the library. */ + s = HDgetenv ("HDF5_DISABLE_VERSION_CHECK"); - /* Allow different versions of the header files and library? */ - s = HDgetenv ("HDF5_DISABLE_VERSION_CHECK"); + if (s && HDisdigit(*s)) + disable_version_check = (unsigned int)HDstrtol (s, NULL, 0); - if (s && HDisdigit(*s)) - disable_version_check = (unsigned int)HDstrtol (s, NULL, 0); + /* assert version sanity */ + if ((LT_VERS_INTERFACE < LT_VERS_AGE) || (interface < age)){ + HDfprintf(stderr, "It is illegal for interface is less than age\n" + "LT_VERS_INTERFACE=%u, LT_VERS_AGE=%u, interface=%u, age=%u\n", + LT_VERS_INTERFACE, LT_VERS_AGE, interface, age); + /* Bail out now. */ + + HDfputs ("Bye...\n", stderr); + HDabort (); } - if (H5_VERS_MAJOR!=majnum || H5_VERS_MINOR!=minnum || - H5_VERS_RELEASE!=relnum) { + if (((LT_VERS_INTERFACE - LT_VERS_AGE) != (interface - age)) || \ + (age > LT_VERS_AGE)) { switch (disable_version_check) { case 0: HDfprintf(stderr, "%s%s", version_mismatch_warning, @@ -735,8 +772,8 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) "Setting it to 2 or higher will suppress the warning messages totally.\n"); /* Mention the versions we are referring to */ HDfprintf (stderr, "Headers are %u.%u.%u, library is %u.%u.%u\n", - majnum, minnum, relnum, - (unsigned)H5_VERS_MAJOR, (unsigned)H5_VERS_MINOR, (unsigned)H5_VERS_RELEASE); + interface, revision, age, + (unsigned)LT_VERS_INTERFACE, (unsigned)LT_VERS_REVISION, (unsigned)LT_VERS_AGE); /* Show library settings if available */ HDfprintf (stderr, "%s", H5libhdf5_settings); @@ -753,8 +790,8 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) version_mismatch_warning, disable_version_check); /* Mention the versions we are referring to */ HDfprintf (stderr, "Headers are %u.%u.%u, library is %u.%u.%u\n", - majnum, minnum, relnum, - (unsigned)H5_VERS_MAJOR, (unsigned)H5_VERS_MINOR, (unsigned)H5_VERS_RELEASE); + interface, revision, age, + (unsigned)LT_VERS_INTERFACE, (unsigned)LT_VERS_REVISION, (unsigned)LT_VERS_AGE); /* Show library settings if available */ HDfprintf (stderr, "%s", H5libhdf5_settings); break; diff --git a/src/H5public.h b/src/H5public.h index 5c43298..d1ac819 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -99,8 +99,8 @@ extern "C" { /* Empty string for real releases. */ #define H5_VERS_INFO "HDF5 library version: 1.8.16-snap18" /* Full version string */ -#define H5check() H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR, \ - H5_VERS_RELEASE) +#define H5check() H5check_version(LT_VERS_INTERFACE, LT_VERS_REVISION, \ + LT_VERS_AGE) /* macros for comparing the version */ #define H5_VERSION_GE(Maj,Min,Rel) \ @@ -113,6 +113,11 @@ extern "C" { ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR: Test by changing (adding 1 to) the to trigger\n"); printf("\t\t the warning. can be:\n"); - printf("\t\t\tM for Major version number (%d)\n", H5_VERS_MAJOR); - printf("\t\t\tm for Minor version number (%d)\n", H5_VERS_MINOR); - printf("\t\t\tr for Release number (%d)\n", H5_VERS_RELEASE); + printf("\t\t\tM for Major version number (%d)\n", LT_VERS_INTERFACE); + printf("\t\t\tm for Minor version number (%d)\n", LT_VERS_REVISION); + printf("\t\t\tr for Release number (%d)\n", LT_VERS_AGE); } diff --git a/test/testcheck_version.sh.in b/test/testcheck_version.sh.in index ed9845e..f89480e 100644 --- a/test/testcheck_version.sh.in +++ b/test/testcheck_version.sh.in @@ -217,10 +217,11 @@ h5libsettings=../src/libhdf5.settings PURPOSE -# Figure out library version numbers from the header file. -h5versmajor=`grep '#define H5_VERS_MAJOR' $srcdir/../src/H5public.h | cut -f2` -h5versminor=`grep '#define H5_VERS_MINOR' $srcdir/../src/H5public.h | cut -f2` -h5versrelease=`grep '#define H5_VERS_RELEASE' $srcdir/../src/H5public.h | cut -f2` +# Figure out lt version numbers from the header file. +# sed uses spaces and tabs as white spaces. +h5versmajor=`sed -e 's/#define[ ]*LT_VERS_INTERFACE[ ]*//p;d' $srcdir/../src/H5public.h` +h5versminor=`sed -e 's/#define[ ]*LT_VERS_REVISION[ ]*//p;d' $srcdir/../src/H5public.h` +h5versrelease=`sed -e 's/#define[ ]*LT_VERS_AGE[ ]*//p;d' $srcdir/../src/H5public.h` DEBUGPRINT $h5versmajor.$h5versminor.$h5versrelease case "$h5versmajor$h5versminor$h5versrelease" in [0-9]*) # good. noop. @@ -247,7 +248,7 @@ fi # HDF5_DISABLE_VERSION_CHECK, as unset, "", -1, 0, 1, 2, 3 for val_disable_version_check in unset "" -1 0 1 2 3; do - for wrong_version in none M m r; do + for wrong_version in none M r ; do TESTING "$val_disable_version_check" "$wrong_version" done done -- cgit v0.12