diff options
author | Dana Robinson <derobins@hdfgroup.org> | 2015-09-01 16:28:05 (GMT) |
---|---|---|
committer | Dana Robinson <derobins@hdfgroup.org> | 2015-09-01 16:28:05 (GMT) |
commit | 77525ea95d9a63e6a006fed055d964568eb9df93 (patch) | |
tree | b04d5d861a45b20739affbc35a9a59b2c2c15330 /bin/h5vers.pl | |
parent | d2cbacb94588f1a27e08e1b12b65c25d81d842d3 (diff) | |
download | hdf5-77525ea95d9a63e6a006fed055d964568eb9df93.zip hdf5-77525ea95d9a63e6a006fed055d964568eb9df93.tar.gz hdf5-77525ea95d9a63e6a006fed055d964568eb9df93.tar.bz2 |
[svn-r27655] Add .pl extension to Perl scripts in bin (part of HDFFV-9513)
This makes things easier on Windows, where we will have to run
Perl scripts as a part of CMake.
Tested on: jam
Diffstat (limited to 'bin/h5vers.pl')
-rwxr-xr-x | bin/h5vers.pl | 446 |
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: |