Don't let autom4te compute the `include' traces several times:

first check that the trace cache file is up to date, and then
compare its timestamp with that of the output.
* bin/autom4te.in, bin/autoupdate.in, bin/autoscan.in: Normalize
the preamble.  Don't require 5.005 as Autom4te::General does it,
and better yet (use `use', not `require'!).
* lib/Autom4te/Struct.pm: Rename the last occurrences of
Class::Struct as Autom4te::Struct.
* lib/Autom4te/General.pm (File::stat): Use it.
(&mtime): New, export it.
* bin/autom4te.in: Use it.
Declare `$req' is invalid if it is outdated.
Don't declare it valid before saving it if something went wrong.
This commit is contained in:
Akim Demaille 2001-08-04 13:14:39 +00:00
parent 4eea9f6530
commit 4ffd4212d6
8 changed files with 138 additions and 76 deletions

View File

@ -1,3 +1,20 @@
2001-08-04 Akim Demaille <akim@epita.fr>
Don't let autom4te compute the `include' traces several times:
first check that the trace cache file is up to date, and then
compare its timestamp with that of the output.
* bin/autom4te.in, bin/autoupdate.in, bin/autoscan.in: Normalize
the preamble. Don't require 5.005 as Autom4te::General does it,
and better yet (use `use', not `require'!).
* lib/Autom4te/Struct.pm: Rename the last occurrences of
Class::Struct as Autom4te::Struct.
* lib/Autom4te/General.pm (File::stat): Use it.
(&mtime): New, export it.
* bin/autom4te.in: Use it.
Declare `$req' is invalid if it is outdated.
Don't declare it valid before saving it if something went wrong.
2001-08-04 Akim Demaille <akim@epita.fr>
Autom4te shall not encode Autoconf data, and preselecting traces

View File

@ -23,10 +23,13 @@ eval 'exec @PERL@ -S $0 ${1+"$@"}'
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
require 5.005;
use File::Basename;
my $me = basename ($0);
BEGIN
{
my $prefix = "@prefix@";
my $perllibdir = $ENV{'autom4te_perllibdir'} || "@datadir@";
unshift @INC, "$perllibdir";
}
## --------- ##
## Request. ##
@ -34,14 +37,6 @@ my $me = basename ($0);
package Request;
BEGIN
{
my $prefix = "@prefix@";
# FIXME: Import Struct into Autoconf.
my $perllibdir = $ENV{'autom4te_perllibdir'} || "@datadir@";
unshift @INC, "$perllibdir";
}
use Data::Dumper;
use Autom4te::General;
use Autom4te::Struct;
@ -62,7 +57,7 @@ struct
(
# The key of the cache file.
'cache' => "\$",
# True if the cache file is up to date.
# True iff %MACRO contains all the macros we want to trace.
'valid' => "\$",
# The include path.
'path' => '@',
@ -75,7 +70,11 @@ struct
);
# $REQUEST-OBJ
# retrieve ($SELF, %ATTR)
# -----------------------
# Find a request with the same path and source.
# Private.
sub retrieve
{
my ($self, %attr) = @_;
@ -97,8 +96,13 @@ sub retrieve
return undef;
}
# $REQUEST-OBJ
# register ($SELF, %ATTR)
# -----------------------
# NEW should not be called directly.
sub register
# Private.
sub register ($%)
{
my ($self, %attr) = @_;
@ -114,27 +118,33 @@ sub register
}
# request(%REQUEST)
# -----------------
# $REQUEST-OBJ
# request($SELF, %REQUEST)
# ------------------------
# Return a request corresponding to $REQUEST{path} and $REQUEST{source},
# using a cache value if it exists.
sub request
sub request ($%)
{
my ($self, %request) = @_;
my $obj = Request->retrieve (%request) || Request->register (%request);
my $req = Request->retrieve (%request) || Request->register (%request);
# If there are new traces to produce, then we are not valid.
foreach (@{$request{'macro'}})
{
if (! exists ${$obj->macro}{$_})
if (! exists ${$req->macro}{$_})
{
${$obj->macro}{$_} = 1;
$obj->valid (0);
}
${$req->macro}{$_} = 1;
$req->valid (0);
}
}
return $obj;
# It would be great to have $REQ check that it up to date wrt its
# dependencies, but that requires gettting traces (to fetch the
# included files), which is out of the scope of Request
# (currently?).
return $req;
}
# Serialize a request or all the current requests.
@ -848,23 +858,24 @@ EOF
# $BOOL
# up_to_date_p ($REQ, $FILE)
# --------------------------
# If $FILE up to date?
# We need $REQ since we check $FILE against all its dependencies,
# and we use the traces on `include' to find them.
sub up_to_date_p ($$)
# up_to_date_p ($REQ)
# -------------------
# Is the cache file of $REQ up to date?
# $REQ is `valid' if it corresponds to the request and exists, which
# does not mean it is up to date. It is up to date if, in addition,
# it's younger than its dependencies.
sub up_to_date_p ($)
{
my ($req, $file) = @_;
my ($req) = @_;
# If STDOUT or doesn't exist, it sure is outdated!
return 0
if $file eq '-' || ! -f $file;
if ! $req->valid;
# We can't answer properly if the traces are not computed since we
# need to know what other files were included.
my $file = "$me.cache/" . $req->cache;
return 0
if ! -f "$me.cache/" . $req->cache;
if ! -f $file;
# We depend at least upon the arguments.
my @dep = @ARGV;
@ -875,13 +886,13 @@ sub up_to_date_p ($$)
handle_traces ($req, "$tmp/dependencies",
('include' => '$1',
'm4_include' => '$1'));
my $mtime = (stat ($file))[9];
my $mtime = mtime ($file);
my $deps = new IO::File ("$tmp/dependencies");
push @dep, map { chomp; find_file ($_) } $deps->getlines;
foreach (@dep)
{
verbose "$file depends on $_";
if ($mtime < (stat ($_))[9])
if ($mtime < mtime ($_))
{
verbose "$file depends on $_ which is more recent";
return 0;
@ -912,45 +923,51 @@ Request->load ("$me.cache/requests")
# Add the new trace requests.
my $req = Request->request ('source' => \@ARGV,
'path' => \@include,
'macro' => [keys %trace, @preselect]);
'path' => \@include,
'macro' => [keys %trace, @preselect]);
# If $REQ is not up to date, declare it invalid.
$req->valid (0)
if ! up_to_date_p ($req);
# We now know whether we can trust the Request object. Say it.
if ($verbose)
{
print STDERR "$me: the trace request object is:\n";
print STDERR $req->marshall;
}
# We need to run M4 if
# - for traces
# + there is no cache, or
# + it does not include the traces we need, or
# + it exists but is outdated
# - for output if it is not /dev/null and
# + it doesn't exist, or
# + it is outdated
# We need to run M4 if (i) $REQ is invalid, or (ii) we are expanding
# (i.e., not tracing) and the output is older than the cache file
# (since the later is valid if it's older than the dependencies).
# STDOUT is pretty old.
my $output_mtime = mtime ($output);
handle_m4 ($req, keys %{$req->macro})
if (! $req->valid
|| ! up_to_date_p ($req, "$me.cache/" . $req->cache)
|| (! %trace && ! up_to_date_p ($req, "$output")));
|| (! %trace && $output_mtime < mtime ("$me.cache/" . $req->cache)));
# Now output...
if (%trace)
{
# Producing traces.
# Trying to produce the output only when needed is very
# error prone here, as you'd have to check that the trace
# requests have not changed etc.
# Always produce traces, since even if the output is young enough,
# there is no guarantee that the traces use the same *format*
# (e.g., `-t FOO:foo' and `-t FOO:bar' are both using the same M4
# traces, hence the M4 traces cache is usable, but its formating
# will yield different results).
handle_traces ($req, $output, %trace);
}
else
{
# Actual M4 expansion.
# Actual M4 expansion, only if $output is too old.
handle_output ($output)
if ! up_to_date_p ($req, $output);
if $output_mtime < mtime ("$me.cache/" . $req->cache);
}
# All went fine, the cache is valid.
$req->valid (1);
# If all went fine, the cache is valid.
$req->valid (1)
if $exit_status == 0;
Request->save ("$me.cache/requests");

View File

@ -20,12 +20,9 @@
# Written by David MacKenzie <djm@gnu.ai.mit.edu>.
use 5.005;
BEGIN
{
my $prefix = "@prefix@";
# FIXME: Import Struct into Autoconf.
my $perllibdir = $ENV{'autom4te_perllibdir'} || "@datadir@";
unshift @INC, "$perllibdir";
}

View File

@ -21,12 +21,9 @@
# Originally written by David MacKenzie <djm@gnu.ai.mit.edu>.
# Rewritten by Akim Demaille <akim@freefriends.org>.
use 5.005;
BEGIN
{
my $prefix = "@prefix@";
# FIXME: Import Struct into Autoconf.
my $perllibdir = $ENV{'autom4te_perllibdir'} || "@datadir@";
unshift @INC, "$perllibdir";
}

View File

@ -21,12 +21,15 @@ package Autom4te::General;
use 5.005;
use Exporter;
use File::Basename;
use File::stat;
use Carp;
use strict;
use vars qw (@ISA @EXPORT $me);
use vars qw (@ISA @EXPORT);
@ISA = qw (Exporter);
@EXPORT = qw (&find_configure_ac &find_peer &mktmpdir &uniq &verbose &xsystem
@EXPORT = qw (&find_configure_ac &find_peer &mktmpdir &mtime
&uniq &verbose &xsystem
$me $verbose $debug $tmp);
# Variable we share with the main package. Be sure to have a single
@ -164,6 +167,25 @@ sub mktmpdir ($)
}
# $MTIME
# MTIME ($FILE)
# -------------
# Return the mtime of $FILE. Missing files, or `-' standing for STDIN
# or STDOUT are ``obsolete'', i.e., as old as possible.
sub mtime ($)
{
my ($file) = @_;
return 0
if $file eq '-' || ! -f $file;
my $stat = stat ($file)
or croak "$me: cannot stat $file: $!\n";
return $stat->mtime;
}
# @RES
# uniq (@LIST)
# ------------

View File

@ -16,6 +16,12 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# This file is basically Perl 5.6's Class::Struct, but made compatible
# with Perl 5.5. If someday this has to be updated, be sure to rename
# all the occurrences of Class::Struct into Autom4te::Struct, otherwise
# if we `use' a Perl module (e.g., File::stat) that uses Class::Struct,
# we would have two packages defining the same symbols. Boom.
package Autom4te::Struct;
## See POD after __END__
@ -43,7 +49,7 @@ sub printem {
}
{
package Class::Struct::Tie_ISA;
package Autom4te::Struct::Tie_ISA;
sub TIEARRAY {
my $class = shift;
@ -52,7 +58,7 @@ sub printem {
sub STORE {
my ($self, $index, $value) = @_;
Class::Struct::_subclass_error();
Autom4te::Struct::_subclass_error();
}
sub FETCH {
@ -102,7 +108,7 @@ sub struct {
\@{$class . '::ISA'};
};
_subclass_error() if @$isa;
tie @$isa, 'Class::Struct::Tie_ISA';
tie @$isa, 'Autom4te::Struct::Tie_ISA';
# Create constructor.
@ -244,24 +250,24 @@ __END__
=head1 NAME
Class::Struct - declare struct-like datatypes as Perl classes
Autom4te::Struct - declare struct-like datatypes as Perl classes
=head1 SYNOPSIS
use Class::Struct;
use Autom4te::Struct;
# declare struct, based on array:
struct( CLASS_NAME => [ ELEMENT_NAME => ELEMENT_TYPE, ... ]);
# declare struct, based on hash:
struct( CLASS_NAME => { ELEMENT_NAME => ELEMENT_TYPE, ... });
package CLASS_NAME;
use Class::Struct;
use Autom4te::Struct;
# declare struct, based on array, implicit class name:
struct( ELEMENT_NAME => ELEMENT_TYPE, ... );
package Myobj;
use Class::Struct;
use Autom4te::Struct;
# declare struct with four types of elements:
struct( s => '$', a => '@', h => '%', c => 'My_Other_Class' );
@ -289,7 +295,7 @@ Class::Struct - declare struct-like datatypes as Perl classes
=head1 DESCRIPTION
C<Class::Struct> exports a single function, C<struct>.
C<Autom4te::Struct> exports a single function, C<struct>.
Given a list of element names and types, and optionally
a class name, C<struct> creates a Perl 5 class that implements
a "struct-like" data structure.
@ -439,7 +445,7 @@ structs are nested. Here, C<timeval> represents a time (seconds and
microseconds), and C<rusage> has two elements, each of which is of
type C<timeval>.
use Class::Struct;
use Autom4te::Struct;
struct( rusage => {
ru_utime => timeval, # seconds
@ -470,7 +476,7 @@ element always to be nonnegative, so we redefine the C<count>
accessor accordingly.
package MyObj;
use Class::Struct;
use Autom4te::Struct;
# declare the struct
struct ( 'MyObj', { count => '$', stuff => '%' } );
@ -510,7 +516,7 @@ as an anonymous hash of initializers, which is passed on to the nested
struct's constructor.
use Class::Struct;
use Autom4te::Struct;
struct Breed =>
{
@ -541,6 +547,12 @@ struct's constructor.
=head1 Author and Modification History
Modified by Akim Demaille, 2001-08-03
Rename as Autom4te::Struct to avoid name clashes with
Class::Struct.
Make it compatible with Perl 5.5.
Modified by Damian Conway, 1999-03-05, v0.58.

View File

@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.24.
.TH AUTOSCAN "1" "August 2001" "GNU Autoconf 2.52b" FSF
.TH AUTOSCAN "1" "August 2001" "GNU Autoconf 2.52c" FSF
.SH NAME
autoscan \- Generate a preliminary configure.in
.SH SYNOPSIS

View File

@ -1,5 +1,5 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.24.
.TH AUTOUPDATE "1" "August 2001" "GNU Autoconf 2.52b" FSF
.TH AUTOUPDATE "1" "August 2001" "GNU Autoconf 2.52c" FSF
.SH NAME
autoupdate \- Update a configure.in to a newer Autoconf
.SH SYNOPSIS
@ -35,7 +35,7 @@ M4
GNU M4 1.4 or above
.TP
AUTOCONF
autoconf 2.52b
autoconf 2.52c
.SH AUTHOR
Written by David J. MacKenzie and Akim Demaille.
.PP