summaryrefslogtreecommitdiff
path: root/lib/Automake/CondStack.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Automake/CondStack.pm')
-rw-r--r--lib/Automake/CondStack.pm150
1 files changed, 150 insertions, 0 deletions
diff --git a/lib/Automake/CondStack.pm b/lib/Automake/CondStack.pm
new file mode 100644
index 000000000..5d5260719
--- /dev/null
+++ b/lib/Automake/CondStack.pm
@@ -0,0 +1,150 @@
+# Copyright (C) 2018 Free Software Foundation, Inc.
+
+# 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 3 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::CondStack;
+
+use 5.006;
+use strict;
+
+use Exporter;
+use Automake::Condition qw (TRUE FALSE);
+use Automake::Global;
+use Automake::Channels;
+use Automake::ChannelDefs;
+
+use vars qw (@ISA @EXPORT);
+
+@ISA = qw (Exporter);
+@EXPORT = qw (cond_stack_if cond_stack_else cond_stack_endif);
+
+my %_am_macro_for_cond =
+ (
+ AMDEP => "one of the compiler tests\n"
+ . " AC_PROG_CC, AC_PROG_CXX, AC_PROG_OBJC, AC_PROG_OBJCXX,\n"
+ . " AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC",
+ am__fastdepCC => 'AC_PROG_CC',
+ am__fastdepCCAS => 'AM_PROG_AS',
+ am__fastdepCXX => 'AC_PROG_CXX',
+ am__fastdepGCJ => 'AM_PROG_GCJ',
+ am__fastdepOBJC => 'AC_PROG_OBJC',
+ am__fastdepOBJCXX => 'AC_PROG_OBJCXX',
+ am__fastdepUPC => 'AM_PROG_UPC'
+ );
+
+
+# $STRING
+# _make_conditional_string ($NEGATE, $COND)
+# ----------------------------------------
+sub _make_conditional_string
+{
+ my ($negate, $cond) = @_;
+ $cond = "${cond}_TRUE"
+ unless $cond =~ /^TRUE|FALSE$/;
+ $cond = Automake::Condition::conditional_negate ($cond)
+ if $negate;
+ return $cond;
+}
+
+
+# $COND
+# cond_stack_if ($NEGATE, $COND, $WHERE)
+# --------------------------------------
+sub cond_stack_if
+{
+ my ($negate, $cond, $where) = @_;
+
+ if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/)
+ {
+ my $text = "$cond does not appear in AM_CONDITIONAL";
+ my $scope = US_LOCAL;
+ if (exists $_am_macro_for_cond{$cond})
+ {
+ my $mac = $_am_macro_for_cond{$cond};
+ $text .= "\n The usual way to define '$cond' is to add ";
+ $text .= ($mac =~ / /) ? $mac : "'$mac'";
+ $text .= "\n to '$configure_ac' and run 'aclocal' and 'autoconf' again";
+ # These warnings appear in Automake files (depend2.am),
+ # so there is no need to display them more than once:
+ $scope = US_GLOBAL;
+ }
+ error $where, $text, uniq_scope => $scope;
+ }
+
+ push (@cond_stack, _make_conditional_string ($negate, $cond));
+
+ return new Automake::Condition (@cond_stack);
+}
+
+
+# $COND
+# cond_stack_else ($NEGATE, $COND, $WHERE)
+# ----------------------------------------
+sub cond_stack_else
+{
+ my ($negate, $cond, $where) = @_;
+
+ if (! @cond_stack)
+ {
+ error $where, "else without if";
+ return FALSE;
+ }
+
+ $cond_stack[$#cond_stack] =
+ Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]);
+
+ # If $COND is given, check against it.
+ if (defined $cond)
+ {
+ $cond = _make_conditional_string ($negate, $cond);
+
+ error ($where, "else reminder ($negate$cond) incompatible with "
+ . "current conditional: $cond_stack[$#cond_stack]")
+ if $cond_stack[$#cond_stack] ne $cond;
+ }
+
+ return new Automake::Condition (@cond_stack);
+}
+
+
+# $COND
+# cond_stack_endif ($NEGATE, $COND, $WHERE)
+# -----------------------------------------
+sub cond_stack_endif
+{
+ my ($negate, $cond, $where) = @_;
+ my $old_cond;
+
+ if (! @cond_stack)
+ {
+ error $where, "endif without if";
+ return TRUE;
+ }
+
+ # If $COND is given, check against it.
+ if (defined $cond)
+ {
+ $cond = _make_conditional_string ($negate, $cond);
+
+ error ($where, "endif reminder ($negate$cond) incompatible with "
+ . "current conditional: $cond_stack[$#cond_stack]")
+ if $cond_stack[$#cond_stack] ne $cond;
+ }
+
+ pop @cond_stack;
+
+ return new Automake::Condition (@cond_stack);
+}
+
+1;