#! /bin/sh perl -x -S $0 "$@" exit #! perl require 5.003; use strict; # 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://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have # access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. # # Robb Matzke # 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 [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.in will also change in this case to be # something like: AC_INIT([HDF5], [hdf5-1.2.3-pre1], [hdfhelp@ncsa.uiuc.edu]) ############################################################################## 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 <; 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 = ""; $FORTRAN_CONFIGURE = ""; $CXX_CONFIGURE = ""; @newver = @curver; } # 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]; } # 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 README.txt file if ($README) { open FILE, $README or die "$README: $!\n"; my @contents = ; 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 = ; 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; } sub gen_configure { my ($name, $conf) = @_; open FILE, $conf or die "$conf: $!\n"; my @contents = ; close FILE; for (my $i = 0; $i < $#contents; ++$i) { if ($contents[$i] =~ /^AC_INIT/) { $contents[$i] = sprintf("AC_INIT([$name], [%d.%d.%d%s], [hdfhelp\@ncsa.uiuc.edu])\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.in$/; } # Update the configure.in files and regenerate them gen_configure("HDF5", $CONFIGURE) if $CONFIGURE; gen_configure("HDF5 Fortran", $FORTRAN_CONFIGURE) if $FORTRAN_CONFIGURE; gen_configure("HDF5 C++", $CXX_CONFIGURE) if $CXX_CONFIGURE; # Reconfigure once (which will update all three configure files) if ($1) { system("cd $1 && bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache"); } else { system("bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache"); } # 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: