Resurrect autoconf from the 'full' branch
[msysgit.git] / share / automake-1.10 / Automake / VarDef.pm
blob0ee00782cf3e6222ae2abd3eed98327bf228ced0
1 # Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2, or (at your option)
6 # any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 # 02110-1301, USA.
18 package Automake::VarDef;
19 use strict;
20 use Carp;
21 use Automake::ChannelDefs;
22 use Automake::ItemDef;
24 require Exporter;
25 use vars '@ISA', '@EXPORT';
26 @ISA = qw/Automake::ItemDef Exporter/;
27 @EXPORT = qw (&VAR_AUTOMAKE &VAR_CONFIGURE &VAR_MAKEFILE
28 &VAR_ASIS &VAR_PRETTY &VAR_SILENT &VAR_SORTED);
30 =head1 NAME
32 Automake::VarDef - a class for variable definitions
34 =head1 SYNOPSIS
36 use Automake::VarDef;
37 use Automake::Location;
39 # Create a VarDef for a definition such as
40 # | # any comment
41 # | foo = bar # more comment
42 # in Makefile.am
43 my $loc = new Automake::Location 'Makefile.am:2';
44 my $def = new Automake::VarDef ('foo', 'bar # more comment',
45 '# any comment',
46 $loc, '', VAR_MAKEFILE, VAR_ASIS);
48 # Appending to a definition.
49 $def->append ('value to append', 'comment to append');
51 # Accessors.
52 my $value = $def->value; # with trailing `#' comments and
53 # continuation ("\\\n") omitted.
54 my $value = $def->raw_value; # the real value, as passed to new().
55 my $comment = $def->comment;
56 my $location = $def->location;
57 my $type = $def->type;
58 my $owner = $def->owner;
59 my $pretty = $def->pretty;
61 # Changing owner.
62 $def->set_owner (VAR_CONFIGURE,
63 new Automake::Location 'configure.ac:15');
65 # Marking examined definitions.
66 $def->set_seen;
67 my $seen_p = $def->seen;
69 # Printing a variable for debugging.
70 print STDERR $def->dump;
72 =head1 DESCRIPTION
74 This class gathers data related to one Makefile-variable definition.
76 =head2 Constants
78 =over 4
80 =item C<VAR_AUTOMAKE>, C<VAR_CONFIGURE>, C<VAR_MAKEFILE>
82 Possible owners for variables. A variable can be defined
83 by Automake, in F<configure.ac> (using C<AC_SUBST>), or in
84 the user's F<Makefile.am>.
86 =cut
88 # Defined so that the owner of a variable can only be increased (e.g
89 # Automake should not override a configure or Makefile variable).
90 use constant VAR_AUTOMAKE => 0; # Variable defined by Automake.
91 use constant VAR_CONFIGURE => 1;# Variable defined in configure.ac.
92 use constant VAR_MAKEFILE => 2; # Variable defined in Makefile.am.
94 =item C<VAR_ASIS>, C<VAR_PRETTY>, C<VAR_SILENT>, C<VAR_SORTED>
96 Possible print styles. C<VAR_ASIS> variables should be output as-is.
97 C<VAR_PRETTY> variables are wrapped on multiple lines if they cannot
98 fit on one. C<VAR_SILENT> variables are not output at all. Finally,
99 C<VAR_SORTED> variables should be sorted and then handled as
100 C<VAR_PRETTY> variables.
102 C<VAR_SILENT> variables can also be overridden silently (unlike the
103 other kinds of variables whose overridding may sometimes produce
104 warnings).
106 =cut
108 # Possible values for pretty.
109 use constant VAR_ASIS => 0; # Output as-is.
110 use constant VAR_PRETTY => 1; # Pretty printed on output.
111 use constant VAR_SILENT => 2; # Not output. (Can also be
112 # overridden silently.)
113 use constant VAR_SORTED => 3; # Sorted and pretty-printed.
115 =back
117 =head2 Methods
119 C<VarDef> defines the following methods in addition to those inherited
120 from L<Automake::ItemDef>.
122 =over 4
124 =item C<my $def = new Automake::VarDef ($varname, $value, $comment, $location, $type, $owner, $pretty)>
126 Create a new Makefile-variable definition. C<$varname> is the name of
127 the variable being defined and C<$value> its value.
129 C<$comment> is any comment preceding the definition. (Because
130 Automake reorders variable definitions in the output, it also tries to
131 carry comments around.)
133 C<$location> is the place where the definition occured, it should be
134 an instance of L<Automake::Location>.
136 C<$type> should be C<''> for definitions made with C<=>, and C<':'>
137 for those made with C<:=>.
139 C<$owner> specifies who owns the variables, it can be one of
140 C<VAR_AUTOMAKE>, C<VAR_CONFIGURE>, or C<VAR_MAKEFILE> (see these
141 definitions).
143 Finally, C<$pretty> tells how the variable should be output, and can
144 be one of C<VAR_ASIS>, C<VAR_PRETTY>, or C<VAR_SILENT>, or
145 C<VAR_SORTED> (see these definitions).
147 =cut
149 sub new ($$$$$$$$)
151 my ($class, $var, $value, $comment, $location, $type, $owner, $pretty) = @_;
153 # A user variable must be set by either `=' or `:=', and later
154 # promoted to `+='.
155 if ($owner != VAR_AUTOMAKE && $type eq '+')
157 error $location, "$var must be set with `=' before using `+='";
160 my $self = Automake::ItemDef::new ($class, $comment, $location, $owner);
161 $self->{'value'} = $value;
162 $self->{'type'} = $type;
163 $self->{'pretty'} = $pretty;
164 $self->{'seen'} = 0;
165 return $self;
168 =item C<$def-E<gt>append ($value, $comment)>
170 Append C<$value> and <$comment> to the exisiting value and comment of
171 C<$def>. This is normally called on C<+=> definitions.
173 =cut
175 sub append ($$$)
177 my ($self, $value, $comment) = @_;
178 $self->{'comment'} .= $comment;
180 my $val = $self->{'value'};
182 # Strip comments from augmented variables. This is so that
183 # VAR = foo # com
184 # VAR += bar
185 # does not become
186 # VAR = foo # com bar
187 # Furthermore keeping `#' would not be portable if the variable is
188 # output on multiple lines.
189 $val =~ s/ ?#.*//;
191 if (chomp $val)
193 # Insert a backslash before a trailing newline.
194 $val .= "\\\n";
196 elsif ($val)
198 # Insert a separator.
199 $val .= ' ';
201 $self->{'value'} = $val . $value;
202 # Turn ASIS appended variables into PRETTY variables. This is to
203 # cope with `make' implementation that cannot read very long lines.
204 $self->{'pretty'} = VAR_PRETTY if $self->{'pretty'} == VAR_ASIS;
207 =item C<$def-E<gt>value>
209 =item C<$def-E<gt>type>
211 =item C<$def-E<gt>pretty>
213 Accessors to the various constituents of a C<VarDef>. See the
214 documentation of C<new>'s arguments for a description of these.
216 =cut
218 sub value ($)
220 my ($self) = @_;
221 my $val = $self->raw_value;
222 # Strip anything past `#'. `#' characters cannot be escaped
223 # in Makefiles, so we don't have to be smart.
224 $val =~ s/#.*$//s;
225 # Strip backslashes.
226 $val =~ s/\\$/ /mg;
227 return $val;
230 sub raw_value ($)
232 my ($self) = @_;
233 return $self->{'value'};
236 sub type ($)
238 my ($self) = @_;
239 return $self->{'type'};
242 sub pretty ($)
244 my ($self) = @_;
245 return $self->{'pretty'};
248 =item C<$def-E<gt>set_owner ($owner, $location)>
250 Change the owner of a definition. This usually happens because
251 the user used C<+=> on an Automake variable, so (s)he now owns
252 the content. C<$location> should be an instance of L<Automake::Location>
253 indicating where the change took place.
255 =cut
257 sub set_owner ($$$)
259 my ($self, $owner, $location) = @_;
260 # We always adjust the location when the owner changes (even for
261 # `+=' statements). The risk otherwise is to warn about
262 # a VAR_MAKEFILE variable and locate it in configure.ac...
263 $self->{'owner'} = $owner;
264 $self->{'location'} = $location;
267 =item C<$def-E<gt>set_seen>
269 =item C<$bool = $def-E<gt>seen>
271 These function allows Automake to mark (C<set_seen>) variable that
272 it has examined in some way, and latter check (using C<seen>) for
273 unused variables. Unused variables usually indicate typos.
275 =cut
277 sub set_seen ($)
279 my ($self) = @_;
280 $self->{'seen'} = 1;
283 sub seen ($)
285 my ($self) = @_;
286 return $self->{'seen'};
289 =item C<$str = $def-E<gt>dump>
291 Format the contents of C<$def> as a human-readable string,
292 for debugging.
294 =cut
296 sub dump ($)
298 my ($self) = @_;
299 my $owner = $self->owner;
301 if ($owner == VAR_AUTOMAKE)
303 $owner = 'Automake';
305 elsif ($owner == VAR_CONFIGURE)
307 $owner = 'Configure';
309 elsif ($owner == VAR_MAKEFILE)
311 $owner = 'Makefile';
313 else
315 prog_error ("unexpected owner");
318 my $where = $self->location->dump;
319 my $comment = $self->comment;
320 my $value = $self->raw_value;
321 my $type = $self->type;
323 return "{
324 type: $type=
325 where: $where comment: $comment
326 value: $value
327 owner: $owner
328 }\n";
331 =back
333 =head1 SEE ALSO
335 L<Automake::Variable>, L<Automake::ItemDef>.
337 =cut
341 ### Setup "GNU" style for perl-mode and cperl-mode.
342 ## Local Variables:
343 ## perl-indent-level: 2
344 ## perl-continued-statement-offset: 2
345 ## perl-continued-brace-offset: 0
346 ## perl-brace-offset: 0
347 ## perl-brace-imaginary-offset: 0
348 ## perl-label-offset: -2
349 ## cperl-indent-level: 2
350 ## cperl-brace-offset: 0
351 ## cperl-continued-brace-offset: 0
352 ## cperl-label-offset: -2
353 ## cperl-extra-newline-before-brace: t
354 ## cperl-merge-trailing-else: nil
355 ## cperl-continued-statement-offset: 2
356 ## End: