use Time::Local;
my $pristine = 1;
-my $kernver;
+my $kernver = "";
+# Use the CVS tag first otherwise use the portals version
sub get_tag()
{
my $tag;
+ my $line;
my $tagfile = new IO::File;
- if (!$tagfile->open("CVS/Tag")) {
- return "HEAD";
+ if (!$tagfile->open("lustre/CVS/Tag")) {
+ # is there a good way to do this with git or should the git case just
+ # fall through to use config.h? it is always nice to know if we are
+ # working on a tag or branch.
+ my $verfile = new IO::File;
+ if (!$verfile->open("config.h")) {
+ return "UNKNOWN";
+ }
+ while(defined($line = <$verfile>)) {
+ $line =~ /\#define VERSION "(.*)"/;
+ if ($1) {
+ $tag = $1;
+ last;
+ }
+ }
+ $verfile->close();
+ return $tag
} else {
my $tmp = <$tagfile>;
$tagfile->close();
- $tmp =~ m/T(.*)/;
+ $tmp =~ m/[TN](.*)/;
return $1;
}
}
"Nov" => 10, "Dec" => 11);
my $last_mtime = 0;
- my @entries = `find . -name Entries`;
- my $entry_file;
- foreach $entry_file (@entries) {
- chomp($entry_file);
- my $entry = new IO::File;
- if (!$entry->open($entry_file)) {
- die "unable to open $entry_file: $!\n";
- }
- my $line;
- while (defined($line = <$entry>)) {
- chomp($line);
- #print "line: $line\n";
- my ($junk, $file, $version, $date) = split(/\//, $line);
-
- #print "junk: $junk\nfile: $file\nver: $version\ndate: $date\n";
- #print "last_mtime: " . localtime($last_mtime) . "\n";
-
- if ($junk eq "D" ||
- $file eq "lustre.spec.in" ||
- $file !~ m/\.(c|h|am|in)$/) {
- next;
- }
- my $cur_dir = $entry_file;
- $cur_dir =~ s/\/CVS\/Entries$//;
- my @statbuf = stat("$cur_dir/$file");
- my $mtime = $statbuf[9];
- my $local_date = gmtime($mtime);
- if ($local_date ne $date &&
- $file ne "lustre.spec.in") {
- #print "$file : " . localtime($mtime) . "\n";
- $pristine = 0;
+ # a CVS checkout
+ if (-d "CVS") {
+ # if we got here, we are operating in a CVS checkout
+ my @entries = `find . -name Entries`;
+ my $entry_file;
+ foreach $entry_file (@entries) {
+ chomp($entry_file);
+ my $entry = new IO::File;
+ if (!$entry->open($entry_file)) {
+ die "unable to open $entry_file: $!\n";
}
+ my $line;
+ while (defined($line = <$entry>)) {
+ chomp($line);
+ #print "line: $line\n";
+ my ($junk, $file, $version, $date) = split(/\//, $line);
- if ($mtime > $last_mtime) {
- $last_mtime = $mtime;
- }
+ #print "junk: $junk\nfile: $file\nver: $version\ndate: $date\n";
+ #print "last_mtime: " . localtime($last_mtime) . "\n";
- if ($date) {
- my @t = split(/ +/, $date);
- if (int(@t) != 5) {
- #print "skipping: $date\n";
+ if ($junk eq "D" ||
+ $file eq "lustre.spec.in") {
+ # also used to skip: "$file !~ m/\.(c|h|am|in)$/" but I see
+ # no good reason why only the above file patterns should
+ # count towards pristine/changed. it should be any file,
+ # surely.
next;
}
- my ($hours, $min, $sec) = split(/:/, $t[3]);
- my ($mon, $mday, $year) = ($t[1], $t[2], $t[4]);
- my $secs = 0;
- $mon = $months{$mon};
- $secs = timelocal($sec, $min, $hours, $mday, $mon, $year);
- if ($secs > $last_mtime) {
- $last_mtime = $secs;
+
+ my $cur_dir = $entry_file;
+ $cur_dir =~ s/\/CVS\/Entries$//;
+ my @statbuf = stat("$cur_dir/$file");
+ my $mtime = $statbuf[9];
+ if (!defined($mtime)) {
+ next;
+ }
+ my $local_date = gmtime($mtime);
+ if ($local_date ne $date &&
+ $file ne "lustre.spec.in") {
+ #print "$file : " . localtime($mtime) . "\n";
+ $pristine = 0;
+ }
+
+ if ($mtime > $last_mtime) {
+ $last_mtime = $mtime;
+ }
+
+ if ($date) {
+ my @t = split(/ +/, $date);
+ if (int(@t) != 5) {
+ #print "skipping: $date\n";
+ next;
+ }
+ my ($hours, $min, $sec) = split(/:/, $t[3]);
+ my ($mon, $mday, $year) = ($t[1], $t[2], $t[4]);
+ my $secs = 0;
+ $mon = $months{$mon};
+ $secs = timelocal($sec, $min, $hours, $mday, $mon, $year);
+ if ($secs > $last_mtime) {
+ $last_mtime = $secs;
+ }
}
}
+ $entry->close();
+ }
+ } elsif (-d ".git") {
+ # a git checkout
+ # TODO: figure out how to determine the most recently modified file
+ # in a git working copy.
+ # NOTE: this is not simply the newest file in the whole tree,
+ # but the newest file in the tree that is from the
+ # repository.
+ $last_mtime = time();
+ } else {
+ my $tree_status = new IO::File;
+ if (!$tree_status->open("tree_status")) {
+ die "unable to open the tree_status file: $!\n";
+ }
+ my $line;
+ while (defined($line = <$tree_status>)) {
+ if ($line =~ /^PRISTINE\s*=\s*(\d)/) {
+ $pristine = $1;
+ } elsif ($line =~ /^MTIME\s*=\s*(\d+)/) {
+ $last_mtime = $1;
+ }
}
- $entry->close();
}
return $last_mtime;
+
}
sub get_linuxdir()
{
my $config = new IO::File;
- my ($line, $dir);
- if (!$config->open("Makefile")) {
+ my ($line, $dir, $objdir);
+ if (!$config->open("autoMakefile")) {
die "Run ./configure first\n";
}
while (defined($line = <$config>)) {
chomp($line);
- if ($line =~ /LINUX = (.*)/) {
+ if ($line =~ /LINUX :?= (.*)/) {
$dir = $1;
- last;
+ } elsif ($line =~ /LINUX_OBJ :?= (.*)/) {
+ $objdir = $1;
+ } elsif ($line =~ /MODULES_TRUE = #/ ||
+ $line =~ /MODULE_TARGET = $/) {
+ # nothing to do if modules are not being built
+ return ""
}
}
$config->close();
my $ver = new IO::File;
- if (!$ver->open("$dir/include/linux/version.h")) {
- die "Run make dep on $dir\n";
- }
+ if (!$ver->open("$objdir/include/linux/utsrelease.h") &&
+ !$ver->open("$objdir/include/linux/version.h") &&
+ !$ver->open("$dir/include/linux/utsrelease.h") &&
+ !$ver->open("$dir/include/linux/version.h")) {
+ die "Run make dep on '$dir'\n";
+ }
+
while(defined($line = <$ver>)) {
$line =~ /\#define UTS_RELEASE "(.*)"/;
if ($1) {
return $dir;
}
+sub mtime2date($)
+{
+ my $mtime = shift;
+
+ my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
+ localtime($mtime);
+ $year += 1900;
+ $mon++;
+ my $show_last = sprintf("%04d%02d%02d%02d%02d%02d", $year, $mon, $mday,
+ $hour, $min, $sec);
+
+ return $show_last;
+}
+
sub generate_ver($$$)
{
my $tag = shift;
my $mtime = shift;
my $linuxdir = shift;
+ # assume building without modules
+ my $postfix = "";
+
+ if ($linuxdir ne "") {
+ $postfix = "-$kernver";
+ }
+
#print "localtime: " . localtime($mtime) . "\n";
- my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) =
- localtime($mtime);
- $year += 1900;
- $mon++;
- my $show_last = $year . $mon . $mday . $hour . $min . $sec;
+ my $lustre_vers = $ENV{LUSTRE_VERS};
print "#define BUILD_VERSION \"";
+
+ if ($lustre_vers) {
+ print "$tag-$lustre_vers\"\n";
+ return 0;
+ }
+
+ my $show_last = mtime2date($mtime);
+
+ # if we want to get rid of the PRISTINE/CHANGED thing, get rid of these
+ # lines. maybe we only want to print -CHANGED when something is changed
+ # and print nothing when it's pristine
if ($pristine) {
- print "$tag-$show_last-PRISTINE-$linuxdir-$kernver\"\n";
+ print "$tag-$show_last-PRISTINE$postfix\"\n";
} else {
- print "$tag-$show_last-CHANGED-$linuxdir-$kernver\"\n";
+ print "$tag-$show_last-CHANGED$postfix\"\n";
}
}
+my $progname = $0;
+$progname =~ s/.*\///;
+
+if ($progname eq "tree_status.pl" && !-d "CVS" && !-d ".git") {
+ die("a tree status can only be determined in an source code control system checkout\n");
+}
+
+chomp(my $cwd = `pwd`);
+
+# ARGV[0] = srcdir
+# ARGV[1] = builddir
+
+# for get_latest_mtime and get_tag you need to be in srcdir
+
if ($ARGV[0]) {
chdir($ARGV[0]);
}
-my $linuxdir = get_linuxdir();
my $tag = get_tag();
-my $mtime = get_latest_mtime();
-generate_ver($tag, $mtime, $linuxdir);
+my $mtime = get_latest_mtime()
+ if (!defined($ENV{LUSTRE_VERS}));
+
+if ($progname eq "version_tag.pl") {
+ my $linuxdir = get_linuxdir();
+ $linuxdir =~ s/\//\./g;
+ generate_ver($tag, $mtime, $linuxdir);
+} elsif ($progname eq "tree_status.pl") {
+ print "PRISTINE = $pristine\n";
+ print "MTIME = $mtime\n";
+}
exit(0);