summaryrefslogtreecommitdiff
path: root/lib/Automake/VarAppend.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Automake/VarAppend.pm')
-rw-r--r--lib/Automake/VarAppend.pm124
1 files changed, 124 insertions, 0 deletions
diff --git a/lib/Automake/VarAppend.pm b/lib/Automake/VarAppend.pm
new file mode 100644
index 000000000..8f114cfef
--- /dev/null
+++ b/lib/Automake/VarAppend.pm
@@ -0,0 +1,124 @@
+# Copyright (C) 2018 Matthias Paulmier
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package Automake::VarAppend;
+
+use strict;
+use 5.006;
+
+use Automake::Channels;
+use Automake::Condition qw (TRUE FALSE);
+use Automake::Item;
+use Automake::VarDef;
+use Exporter;
+
+use vars '@ISA', '@EXPORT';
+
+@ISA = qw (Automake::Item Exporter);
+
+@EXPORT = qw (append_var_cur_cond first_assign_var am_check_definitions);
+
+=head1 NAME
+
+Automake::VarAppend - Helper methods for appending to variables
+
+=head1 DESCRIPTION
+
+This package provides methods for appending values to variables.
+
+It is used by the C<Automake::Variable> class in its C<define> function.
+
+=head2 Functions
+
+=item C<append_var_cur_cond ($self, $var, $owner, $where, $def, $value,
+$comment)>
+
+Append $value to an existing $var defined for the current condition. This is
+only used in the define method of this file.
+
+=cut
+
+sub append_var_cur_cond ($$$$$$$)
+{
+ my ($self, $var, $owner, $where, $def, $value, $comment) = @_;
+ $def->append ($value, $comment);
+ $self->{'last-append'} = [];
+
+ # Only increase owners. A VAR_CONFIGURE variable augmented in a
+ # Makefile.am becomes a VAR_MAKEFILE variable.
+ $def->set_owner ($owner, $where->clone)
+ if $owner > $def->owner;
+}
+
+
+=item C<first_assign_var ($sefl, $var, $cond, $owner, $where, $def, $value, $pretty, $comment, $new_var, $type)>
+
+Method that assign a value to a variable for the first time or for total
+redefinition of an Automake variable or an AC_SUBST variable for an existing
+condition.
+
+=cut
+
+sub first_assign_var ($$$$$$$$$$$)
+{
+ my ($self, $var, $cond, $owner, $where, $def, $value, $pretty, $comment, $new_var, $type) = @_;
+
+ # Never decrease an owner.
+ $owner = $def->owner
+ if ! $new_var && $owner < $def->owner;
+
+ # Assignments to a macro set its location. We don't adjust
+ # locations for '+='. Ideally I suppose we would associate
+ # line numbers with random bits of text.
+ $def = new Automake::VarDef ($var, $value, $comment, $where->clone,
+ $type, $owner, $pretty);
+ $self->set ($cond, $def);
+}
+
+
+=item am_check_definitions ($var, $cond, $def, $type, $where)
+
+Additional checks for Automake definitions
+
+=cut
+
+sub am_check_definitions ($$$$$)
+{
+ my ($var, $cond, $def, $type, $where) = @_;
+ # An Automake variable must be consistently defined with the same
+ # sign by Automake.
+ if ($def->type ne $type && $def->owner == VAR_AUTOMAKE)
+ {
+ error ($def->location,
+ "Automake variable '$var' was set with '"
+ . $def->type . "=' here ...", partial => 1);
+ error ($where, "... and is now set with '$type=' here.");
+ prog_error ("Automake variable assignments should be consistently\n"
+ . "defined with the same sign");
+ }
+}
+
+
+=back
+
+=head1 SEE ALSO
+
+L<Automake::VarDef>, L<Automake::Variable>,
+L<Automake::Condition>, L<Automake::Item>,
+L<Automake::Channels>.
+
+=cut
+
+1;