build: silence automake build system
[automake.git] / lib / Automake / VarDef.pm
blob568c82afa64fae263e436987fed3e994a9a2d43e
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, see <http://www.gnu.org/licenses/>.
16 package Automake::VarDef;
17 use strict;
18 use Carp;
19 use Automake::ChannelDefs;
20 use Automake::ItemDef;
22 require Exporter;
23 use vars '@ISA', '@EXPORT';
24 @ISA = qw/Automake::ItemDef Exporter/;
25 @EXPORT = qw (&VAR_AUTOMAKE &VAR_CONFIGURE &VAR_MAKEFILE
26 &VAR_ASIS &VAR_PRETTY &VAR_SILENT &VAR_SORTED);
28 =head1 NAME
30 Automake::VarDef - a class for variable definitions
32 =head1 SYNOPSIS
34 use Automake::VarDef;
35 use Automake::Location;
37 # Create a VarDef for a definition such as
38 # | # any comment
39 # | foo = bar # more comment
40 # in Makefile.am
41 my $loc = new Automake::Location 'Makefile.am:2';
42 my $def = new Automake::VarDef ('foo', 'bar # more comment',
43 '# any comment',
44 $loc, '', VAR_MAKEFILE, VAR_ASIS);
46 # Appending to a definition.
47 $def->append ('value to append', 'comment to append');
49 # Accessors.
50 my $value = $def->value; # with trailing `#' comments and
51 # continuation ("\\\n") omitted.
52 my $value = $def->raw_value; # the real value, as passed to new().
53 my $comment = $def->comment;
54 my $location = $def->location;
55 my $type = $def->type;
56 my $owner = $def->owner;
57 my $pretty = $def->pretty;
59 # Changing owner.
60 $def->set_owner (VAR_CONFIGURE,
61 new Automake::Location 'configure.ac:15');
63 # Marking examined definitions.
64 $def->set_seen;
65 my $seen_p = $def->seen;
67 # Printing a variable for debugging.
68 print STDERR $def->dump;
70 =head1 DESCRIPTION
72 This class gathers data related to one Makefile-variable definition.
74 =head2 Constants
76 =over 4
78 =item C<VAR_AUTOMAKE>, C<VAR_CONFIGURE>, C<VAR_MAKEFILE>
80 Possible owners for variables. A variable can be defined
81 by Automake, in F<configure.ac> (using C<AC_SUBST>), or in
82 the user's F<Makefile.am>.
84 =cut
86 # Defined so that the owner of a variable can only be increased (e.g
87 # Automake should not override a configure or Makefile variable).
88 use constant VAR_AUTOMAKE => 0; # Variable defined by Automake.
89 use constant VAR_CONFIGURE => 1;# Variable defined in configure.ac.
90 use constant VAR_MAKEFILE => 2; # Variable defined in Makefile.am.
92 =item C<VAR_ASIS>, C<VAR_PRETTY>, C<VAR_SILENT>, C<VAR_SORTED>
94 Possible print styles. C<VAR_ASIS> variables should be output as-is.
95 C<VAR_PRETTY> variables are wrapped on multiple lines if they cannot
96 fit on one. C<VAR_SILENT> variables are not output at all. Finally,
97 C<VAR_SORTED> variables should be sorted and then handled as
98 C<VAR_PRETTY> variables.
100 C<VAR_SILENT> variables can also be overridden silently (unlike the
101 other kinds of variables whose overriding may sometimes produce
102 warnings).
104 =cut
106 # Possible values for pretty.
107 use constant VAR_ASIS => 0; # Output as-is.
108 use constant VAR_PRETTY => 1; # Pretty printed on output.
109 use constant VAR_SILENT => 2; # Not output. (Can also be
110 # overridden silently.)
111 use constant VAR_SORTED => 3; # Sorted and pretty-printed.
113 =back
115 =head2 Methods
117 C<VarDef> defines the following methods in addition to those inherited
118 from L<Automake::ItemDef>.
120 =over 4
122 =item C<my $def = new Automake::VarDef ($varname, $value, $comment, $location, $type, $owner, $pretty)>
124 Create a new Makefile-variable definition. C<$varname> is the name of
125 the variable being defined and C<$value> its value.
127 C<$comment> is any comment preceding the definition. (Because
128 Automake reorders variable definitions in the output, it also tries to
129 carry comments around.)
131 C<$location> is the place where the definition occurred, it should be
132 an instance of L<Automake::Location>.
134 C<$type> should be C<''> for definitions made with C<=>, and C<':'>
135 for those made with C<:=>.
137 C<$owner> specifies who owns the variables, it can be one of
138 C<VAR_AUTOMAKE>, C<VAR_CONFIGURE>, or C<VAR_MAKEFILE> (see these
139 definitions).
141 Finally, C<$pretty> tells how the variable should be output, and can
142 be one of C<VAR_ASIS>, C<VAR_PRETTY>, or C<VAR_SILENT>, or
143 C<VAR_SORTED> (see these definitions).
145 =cut
147 sub new ($$$$$$$$)
149 my ($class, $var, $value, $comment, $location, $type, $owner, $pretty) = @_;
151 # A user variable must be set by either `=' or `:=', and later
152 # promoted to `+='.
153 if ($owner != VAR_AUTOMAKE && $type eq '+')
155 error $location, "$var must be set with `=' before using `+='";
158 my $self = Automake::ItemDef::new ($class, $comment, $location, $owner);
159 $self->{'value'} = $value;
160 $self->{'type'} = $type;
161 $self->{'pretty'} = $pretty;
162 $self->{'seen'} = 0;
163 return $self;
166 =item C<$def-E<gt>append ($value, $comment)>
168 Append C<$value> and <$comment> to the existing value and comment of
169 C<$def>. This is normally called on C<+=> definitions.
171 =cut
173 sub append ($$$)
175 my ($self, $value, $comment) = @_;
176 $self->{'comment'} .= $comment;
178 my $val = $self->{'value'};
180 # Strip comments from augmented variables. This is so that
181 # VAR = foo # com
182 # VAR += bar
183 # does not become
184 # VAR = foo # com bar
185 # Furthermore keeping `#' would not be portable if the variable is
186 # output on multiple lines.
187 $val =~ s/ ?#.*//;
188 # Insert a separator, if required.
189 $val .= ' ' if $val;
190 $self->{'value'} = $val . $value;
191 # Turn ASIS appended variables into PRETTY variables. This is to
192 # cope with `make' implementation that cannot read very long lines.
193 $self->{'pretty'} = VAR_PRETTY if $self->{'pretty'} == VAR_ASIS;
196 =item C<$def-E<gt>value>
198 =item C<$def-E<gt>type>
200 =item C<$def-E<gt>pretty>
202 Accessors to the various constituents of a C<VarDef>. See the
203 documentation of C<new>'s arguments for a description of these.
205 =cut
207 sub value ($)
209 my ($self) = @_;
210 my $val = $self->raw_value;
211 # Strip anything past `#'. `#' characters cannot be escaped
212 # in Makefiles, so we don't have to be smart.
213 $val =~ s/#.*$//s;
214 # Strip backslashes.
215 $val =~ s/\\$/ /mg;
216 return $val;
219 sub raw_value ($)
221 my ($self) = @_;
222 return $self->{'value'};
225 sub type ($)
227 my ($self) = @_;
228 return $self->{'type'};
231 sub pretty ($)
233 my ($self) = @_;
234 return $self->{'pretty'};
237 =item C<$def-E<gt>set_owner ($owner, $location)>
239 Change the owner of a definition. This usually happens because
240 the user used C<+=> on an Automake variable, so (s)he now owns
241 the content. C<$location> should be an instance of L<Automake::Location>
242 indicating where the change took place.
244 =cut
246 sub set_owner ($$$)
248 my ($self, $owner, $location) = @_;
249 # We always adjust the location when the owner changes (even for
250 # `+=' statements). The risk otherwise is to warn about
251 # a VAR_MAKEFILE variable and locate it in configure.ac...
252 $self->{'owner'} = $owner;
253 $self->{'location'} = $location;
256 =item C<$def-E<gt>set_seen>
258 =item C<$bool = $def-E<gt>seen>
260 These function allows Automake to mark (C<set_seen>) variable that
261 it has examined in some way, and latter check (using C<seen>) for
262 unused variables. Unused variables usually indicate typos.
264 =cut
266 sub set_seen ($)
268 my ($self) = @_;
269 $self->{'seen'} = 1;
272 sub seen ($)
274 my ($self) = @_;
275 return $self->{'seen'};
278 =item C<$str = $def-E<gt>dump>
280 Format the contents of C<$def> as a human-readable string,
281 for debugging.
283 =cut
285 sub dump ($)
287 my ($self) = @_;
288 my $owner = $self->owner;
290 if ($owner == VAR_AUTOMAKE)
292 $owner = 'Automake';
294 elsif ($owner == VAR_CONFIGURE)
296 $owner = 'Configure';
298 elsif ($owner == VAR_MAKEFILE)
300 $owner = 'Makefile';
302 else
304 prog_error ("unexpected owner");
307 my $where = $self->location->dump;
308 my $comment = $self->comment;
309 my $value = $self->raw_value;
310 my $type = $self->type;
312 return "{
313 type: $type=
314 where: $where comment: $comment
315 value: $value
316 owner: $owner
317 }\n";
320 =back
322 =head1 SEE ALSO
324 L<Automake::Variable>, L<Automake::ItemDef>.
326 =cut
330 ### Setup "GNU" style for perl-mode and cperl-mode.
331 ## Local Variables:
332 ## perl-indent-level: 2
333 ## perl-continued-statement-offset: 2
334 ## perl-continued-brace-offset: 0
335 ## perl-brace-offset: 0
336 ## perl-brace-imaginary-offset: 0
337 ## perl-label-offset: -2
338 ## cperl-indent-level: 2
339 ## cperl-brace-offset: 0
340 ## cperl-continued-brace-offset: 0
341 ## cperl-label-offset: -2
342 ## cperl-extra-newline-before-brace: t
343 ## cperl-merge-trailing-else: nil
344 ## cperl-continued-statement-offset: 2
345 ## End: