summaryrefslogtreecommitdiffstats
path: root/bin/h5vers.pl
diff options
context:
space:
mode:
Diffstat (limited to 'bin/h5vers.pl')
-rwxr-xr-xbin/h5vers.pl446
1 files changed, 446 insertions, 0 deletions
diff --git a/bin/h5vers.pl b/bin/h5vers.pl
new file mode 100755
index 0000000..18c5854
--- /dev/null
+++ b/bin/h5vers.pl
@@ -0,0 +1,446 @@
+#! /bin/sh
+perl -x -S $0 "$@"
+exit
+
+#! perl
+require 5.003;
+use strict;
+
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from help@hdfgroup.org.
+#
+# Robb Matzke <matzke@llnl.gov>
+# 17 July 1998
+
+### Purpose
+# Increments the hdf5 version number by changing the value of
+# constants in the src/H5public.h file. The new version number is
+# printed on the standard output. An alternate source file name can be
+# specified as an argument. In any case, the original file is saved
+# by appending a tilde `~' to the name.
+
+### Usage:
+# h5vers.pl [OPTIONS] [FILE]
+
+# Without options this program only displays the current version and
+# doesn't modify any files or create backups. The default is to print
+# the version number like X.Y.Z-A where X is the major version number,
+# Y is the minor version number, Z is the release number, and A is
+# a short annotation string (the `-' is printed only if A is not empty).
+# If the `-v' switch is given the version will be printed like:
+#
+# version X.Y release Z (A)
+#
+# The space and parentheses around A are only printed if A is not empty.
+#
+# The `-s VERSION' switch will set the version as specified. If the
+# string contains a dotted triple then it will be used as the version
+# number, otherwise up to three numbers will be read from the end of
+# the string and used as the major version, minor version, and release
+# number. If any numbers are missing then zero is assumed. This
+# allows versions to be specified like `-s "version 2.1 release 8"' or
+# `-s hdf5-2.1.8.tar.bz2'. If the new version is less than the old
+# version then a warning message is generated on standard error. The
+# annotation string, A, is set only if it appears immediately after the
+# third number, separated by a dash (e.g., `1.2.3-pre1') or in parentheses
+# (e.g., `version 1.2 release 3 (pre1)').
+#
+# The `-i [major|minor|release|annot|last]' option increments the major
+# number, minor number, release number, or annotation string. The `last'
+# switch increments the annotation string if present, otherwise the
+# release number. If the release number is incremented then the annotation
+# string is cleared. If the minor number is incremented then the release
+# number is set to zero and the annotation string is cleared; if the major
+# number is incremented then the minor and release numbers are set to zero
+# and the annotation string is cleared.
+#
+# If a file is specified then that file is used instead of
+# ./H5public.h or ./src/H5public.h.
+#
+# If the version number is changed (either `-s' or `-i' was used on
+# the command line) then the first line of the README.txt and RELEASE.txt files
+# one directory above the H5public.h file is also modified so it looks
+# something like: This is hdf5-1.2.3-pre1 currently under development.
+# The AC_INIT macro in configure.ac will also change in this case to be
+# something like: AC_INIT([HDF5], [hdf5-1.2.3-pre1], [help@hdfgroup.org])
+# Version changes are also reflected in the Windows-maintained H5pubconf.h
+# file.
+#
+# Whenever the version changes, this script will increment the revision
+# field in HDF5's libtool shared library version in config/lt_vers.am,
+# which is included in src/Makefile.am. Incrementing the revision field
+# indicates that the source code has changed since the last version
+# (which it probably has).
+##############################################################################
+
+sub getvers {
+ local ($_) = @_;
+ my (@vers);
+
+ ($vers[0]) = /^\#\s*define\s+H5_VERS_MAJOR\s+(\d+)/m;
+ ($vers[1]) = /^\#\s*define\s+H5_VERS_MINOR\s+(\d+)/m;
+ ($vers[2]) = /^\#\s*define\s+H5_VERS_RELEASE\s+(\d+)/m;
+ ($vers[3]) = /^\#\s*define\s+H5_VERS_SUBRELEASE\s+\"([^\"]*)\"/m;
+ return @vers;
+}
+
+sub setvers {
+ my ($contents, @vers) = @_;
+ $_[0] =~ s/^(\#\s*define\s+H5_VERS_MAJOR\s+)\d+/$1$vers[0]/m;
+ $_[0] =~ s/^(\#\s*define\s+H5_VERS_MINOR\s+)\d+/$1$vers[1]/m;
+ $_[0] =~ s/^(\#\s*define\s+H5_VERS_RELEASE\s+)\d+/$1$vers[2]/m;
+ $_[0] =~ s/^(\#\s*define\s+H5_VERS_SUBRELEASE\s+\")[^\"]*/$1$vers[3]/m;
+ $_[0] =~ s/^(\#\s*define\s+H5_VERS_INFO\s+\")[^\"]*/
+ sprintf("%sHDF5 library version: %d.%d.%d%s%s", $1, @vers[0,1,2],
+ $vers[3]?"-":"", $vers[3])/me;
+}
+
+sub usage {
+ my ($prog) = $0 =~ /([^\/]+)$/;
+ print STDERR <<EOF;
+Usage: $prog [OPTS] [FILE]
+ -i major|minor|release|annot
+ Increment specified version component and set following components
+ to zero.
+ -s VERSION
+ Set the version as specified. The version number can be embedded in
+ some other string such as \"hdf5-1.1.0-pre1.tar.bz2\" or even
+ \"this is HDF5 library version 1.1 release 0 (pre1)\" for convenience.
+ -v
+ Instead of displaying only a dotted triple version number a line such
+ as \"version 1.1 release 0 (pre1)\" will be printed.
+ FILE
+ The name of the file that contains version information. This is
+ seldom necessary since files H5public.h, src/H5public.h and
+ ../src/H5public.h are automatically checked.
+EOF
+ exit 1;
+}
+
+# Parse arguments
+my ($verbose, $set, $inc, $file, $rc);
+my (@files) = ("H5public.h", "src/H5public.h", "../src/H5public.h");
+while ($_ = shift) {
+ $_ eq "-s" && do {
+ die "-s switch needs a version number\n" unless @ARGV;
+ $set = shift;
+ next;
+ };
+
+ $_ eq "-i" && do {
+ if (@ARGV && $ARGV[0]=~/^(major|minor|release|annot)$/) {
+ $inc = shift;
+ } else {
+ $inc = "last";
+ }
+ next;
+ };
+
+ $_ eq "-v" && do {
+ $verbose = 1;
+ next;
+ };
+
+ /^-(h|\?|-?help)$/ && usage;
+ /^-/ && die "unrecognized option: $_\n";
+ die "only one file name can be specified\n" if $file;
+ $file = $_;
+}
+die "mutually exclusive options given\n" if $set && $inc;
+
+# Determine file to use as H5public.h, README.txt,
+# release_docs/RELEASE.txt, configure.ac, windows/src/H5pubconf.h
+# and config/lt_vers.am.
+# The README.txt, release_docs/RELEASE.txt, configure.ac,
+# windows/src/H5pubconf.h, and config/lt_vers.am
+# files are always in the directory above H5public.h
+unless ($file) {
+ for (@files) {
+ ($file=$_,last) if -f $_;
+ }
+}
+die "unable to find source files\n" unless defined $file;
+die "unable to read file: $file\n" unless -r $file;
+# config/lt_vers.am
+my $LT_VERS = $file;
+$LT_VERS =~ s/[^\/]*$/..\/config\/lt_vers.am/;
+die "unable to read file: $LT_VERS\n" unless -r $file;
+# README.txt
+my $README = $file;
+$README =~ s/[^\/]*$/..\/README.txt/;
+die "unable to read file: $README\n" unless -r $file;
+# release_docs/RELEASE.txt
+my $RELEASE = $file;
+$RELEASE =~ s/[^\/]*$/..\/release_docs\/RELEASE.txt/;
+die "unable to read file: $RELEASE\n" unless -r $file;
+# configure.ac
+my $CONFIGURE = $file;
+$CONFIGURE =~ s/[^\/]*$/..\/configure.ac/;
+die "unable to read file: $CONFIGURE\n" unless -r $file;
+# cpp_doc_config
+my $CPP_DOC_CONFIG = $file;
+$CPP_DOC_CONFIG =~ s/[^\/]*$/..\/c++\/src\/cpp_doc_config/;
+die "unable to read file: $CPP_DOC_CONFIG\n" unless -r $file;
+
+# Get the current version number.
+open FILE, $file or die "unable to open $file: $!\n";
+my ($contents) = join "", <FILE>;
+close FILE;
+my (@curver) = getvers $contents;
+
+# Determine the new version number.
+my @newver; #new version
+if ($set) {
+ if ($set =~ /(\d+)\.(\d+)\.(\d+)(-([a-zA-Z]\w*))?/) {
+ @newver = ($1, $2, $3, $5);
+ } elsif ($set =~ /(\d+)\D+(\d+)\D+(\d+)(\s*\(([a-zA-Z]\w*)\))?\D*$/) {
+ @newver = ($1, $2, $3, $5);
+ } elsif ($set =~ /(\d+)\D+(\d+)\D*$/) {
+ @newver = ($1, $2, 0, "");
+ } elsif ($set =~ /(\d+)\D*$/) {
+ @newver = ($1, 0, 0, "");
+ } else {
+ die "illegal version number specified: $set\n";
+ }
+} elsif ($inc) {
+ $inc = $curver[3] eq "" ? 'release' : 'annot' if $inc eq 'last';
+ if ($inc eq "major") {
+ $newver[0] = $curver[0]+1;
+ @newver[1,2,3] = (0,0,"");
+ } elsif ($inc eq "minor") {
+ $newver[0] = $curver[0];
+ $newver[1] = $curver[1]+1;
+ @newver[2,3] = (0,"");
+ } elsif ($inc eq "release") {
+ @newver[0,1] = @curver[0,1];
+ $newver[2] = $curver[2]+1;
+ $newver[3] = "";
+ } elsif ($inc eq "annot") {
+ @newver[0,1,2] = @curver[0,1,2];
+ $newver[3] = $curver[3];
+ $newver[3] =~ s/(\d+)\D*$/$1+1/e or
+ die "Annotation \"".$newver[3]."\" cannot be incremented.\n";
+ } else {
+ die "unknown increment field: $inc\n";
+ }
+} else {
+ # Nothing to do but print result
+ $README = "";
+ $RELEASE = "";
+ $CONFIGURE = "";
+ $CPP_DOC_CONFIG = "";
+ $LT_VERS = "";
+ @newver = @curver;
+}
+
+# Note if the version increased or decreased
+my $version_increased="";
+# Print a warning if the version got smaller (don't check annot field)
+if ($newver[0]*1000000 + $newver[1]*1000 + $newver[2] <
+ $curver[0]*1000000 + $curver[1]*1000 + $curver[2]) {
+ printf STDERR "Warning: version decreased from %d.%d.%d to %d.%d.%d\n",
+ @curver[0,1,2], @newver[0,1,2];
+}
+if ($newver[0]*1000000 + $newver[1]*1000 + $newver[2] >
+ $curver[0]*1000000 + $curver[1]*1000 + $curver[2]) {
+ $version_increased="true";
+}
+
+# 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";
+ 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 "", <FILE>;
+ 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) {
+ open FILE, $README or die "$README: $!\n";
+ my @contents = <FILE>;
+ close FILE;
+ $contents[0] = sprintf("HDF5 version %d.%d.%d%s %s",
+ @newver[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3],
+ "currently under development\n");
+ open FILE, ">$README" or die "$README: $!\n";
+ print FILE @contents;
+ close FILE;
+}
+
+# Update the release_docs/RELEASE.txt file
+if ($RELEASE) {
+ open FILE, $RELEASE or die "$RELEASE: $!\n";
+ my @contents = <FILE>;
+ close FILE;
+ $contents[0] = sprintf("HDF5 version %d.%d.%d%s %s",
+ @newver[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3],
+ "currently under development\n");
+ open FILE, ">$RELEASE" or die "$RELEASE: $!\n";
+ print FILE @contents;
+ close FILE;
+}
+
+# Update the c++/src/cpp_doc_config file
+if ($CPP_DOC_CONFIG) {
+ my $data = read_file($CPP_DOC_CONFIG);
+ my $version_string = sprintf("\"%d.%d.%d%s %s\"",
+ @newver[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3],
+ "currently under development");
+
+ $data =~ s/PROJECT_NUMBER\s*=.*/PROJECT_NUMBER = $version_string/;
+
+ write_file($CPP_DOC_CONFIG, $data);
+}
+
+# helper function to read the file for updating c++/src/cpp_doc_config file.
+# The version string in that file is not at the top, so the string replacement
+# is not for the first line, and reading/writing the entire file as one string
+# facilitates the substring replacement.
+sub read_file {
+ my ($filename) = @_;
+
+ open my $in, $filename or die "Could not open '$filename' for reading $!";
+ local $/ = undef;
+ my $all = <$in>;
+ close $in;
+
+ return $all;
+}
+
+# helper function to write the file for updating c++/src/cpp_doc_config file.
+sub write_file {
+ my ($filename, $content) = @_;
+
+ open my $out, ">$filename" or die "Could not open '$filename' for writing $!";;
+ print $out $content;
+ close $out;
+
+ return;
+}
+
+
+sub gen_configure {
+ my ($name, $conf) = @_;
+
+ open FILE, $conf or die "$conf: $!\n";
+ my @contents = <FILE>;
+ close FILE;
+
+ for (my $i = 0; $i < $#contents; ++$i) {
+ if ($contents[$i] =~ /^AC_INIT/) {
+ $contents[$i] = sprintf("AC_INIT([$name], [%d.%d.%d%s], [help\@hdfgroup.org])\n",
+ @newver[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3]);
+ last;
+ }
+ }
+
+ open FILE, ">$conf" or die "$conf: $!\n";
+ print FILE @contents;
+ close FILE;
+
+ $conf =~ /^(.*?)\/?configure.ac$/;
+
+ if ($1) {
+ $rc = system("cd $1 && bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+ } else {
+ $rc = system("bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+ }
+ if ($rc) {
+ printf("bin/reconfigure failed with exit code %d. Aborted.\n", $rc);
+ exit 1;
+ }
+}
+
+# Update the configure.ac files and regenerate them
+gen_configure("HDF5", $CONFIGURE) if $CONFIGURE;
+
+sub gen_h5pubconf {
+ my ($name, $pubconf, @vers) = @_;
+
+ my $namelc = lc($name);
+ my $nameuc = uc($name);
+
+ open FILE, $pubconf or die "$pubconf: $!\n";
+ my @contents = <FILE>;
+ close FILE;
+
+ for (my $i = 0; $i < $#contents; ++$i) {
+ if ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE\s+/) {
+ $contents[$i] = "\#define H5_PACKAGE \"$namelc\"\n";
+ } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_NAME\s+/) {
+ $contents[$i] = "\#define H5_PACKAGE_NAME \"$nameuc\"\n";
+ } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_STRING\s+/) {
+ $contents[$i] = sprintf("\#define H5_PACKAGE_STRING \"$nameuc %d.%d.%d%s\"\n",
+ @vers[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3]);
+ } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_TARNAME\s+/) {
+ $contents[$i] = "\#define H5_PACKAGE_TARNAME \"$namelc\"\n";
+ } elsif ($contents[$i] =~ /\#\s*define\s+H5_PACKAGE_VERSION\s+/) {
+ $contents[$i] = sprintf("\#define H5_PACKAGE_VERSION \"%d.%d.%d%s\"\n",
+ @vers[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3]);
+ } elsif ($contents[$i] =~ /\#\s*define\s+H5_VERSION\s+/) {
+ $contents[$i] = sprintf("\#define H5_VERSION \"%d.%d.%d%s\"\n",
+ @vers[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3]);
+ }
+ }
+
+ open FILE, ">$pubconf" or die "$pubconf: $!\n";
+ print FILE @contents;
+ close FILE;
+}
+
+# Print the new version number
+if ($verbose) {
+ printf("version %d.%d release %d%s\n", @newver[0,1,2],
+ $newver[3] eq "" ? "" : " (".$newver[3].")");
+} else {
+ printf("%d.%d.%d%s\n", @newver[0,1,2],
+ $newver[3] eq "" ? "" : "-".$newver[3]);
+}
+
+exit 0;
+
+# Because the first line of this file looks like a Bourne shell script, we
+# must tell XEmacs explicitly that this is really a perl script.
+#
+# Local Variables:
+# mode:perl
+# End: