summaryrefslogtreecommitdiff
path: root/lib/Automake/ConfVars.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Automake/ConfVars.pm')
-rw-r--r--lib/Automake/ConfVars.pm214
1 files changed, 213 insertions, 1 deletions
diff --git a/lib/Automake/ConfVars.pm b/lib/Automake/ConfVars.pm
index 8d834e217..df122e059 100644
--- a/lib/Automake/ConfVars.pm
+++ b/lib/Automake/ConfVars.pm
@@ -26,6 +26,7 @@ use Automake::File;
use Automake::Global;
use Automake::Location;
use Automake::Utils;
+use Automake::Options;
use Automake::VarDef;
use Automake::Variable;
use Exporter 'import';
@@ -33,7 +34,7 @@ use Exporter 'import';
use vars qw (@EXPORT);
@EXPORT = qw (%configure_vars %ignored_configure_vars $output_vars
- &define_standard_variables);
+ &define_standard_variables &am_install_var);
# Hash table of discovered configure substitutions. Keys are names,
# values are 'FILE:LINE' strings which are used by error message
@@ -81,4 +82,215 @@ sub define_standard_variables ()
$output_vars .= $comments . $rules;
}
+
+# am_install_var (-OPTION..., file, HOW, where...)>
+# --------------------------------------------------
+# Handle 'where_HOW' variable magic. Does all lookups, generates
+# install code, and possibly generates code to define the primary
+# variable. The first argument is the name of the .am file to munge,
+# the second argument is the primary variable (e.g. HEADERS), and all
+# subsequent arguments are possible installation locations.
+#
+# Returns list of [$location, $value] pairs, where
+# $value's are the values in all where_HOW variable, and $location
+# there associated location (the place here their parent variables were
+# defined).
+sub am_install_var
+{
+ my (@args) = @_;
+
+ my $do_require = 1;
+ my $can_dist = 0;
+ my $default_dist = 0;
+ while (@args)
+ {
+ if ($args[0] eq '-noextra')
+ {
+ $do_require = 0;
+ }
+ elsif ($args[0] eq '-candist')
+ {
+ $can_dist = 1;
+ }
+ elsif ($args[0] eq '-defaultdist')
+ {
+ $default_dist = 1;
+ $can_dist = 1;
+ }
+ elsif ($args[0] !~ /^-/)
+ {
+ last;
+ }
+ shift (@args);
+ }
+
+ my ($file, $primary, @prefix) = @args;
+
+ # Now that configure substitutions are allowed in where_HOW
+ # variables, it is an error to actually define the primary. We
+ # allow 'JAVA', as it is customarily used to mean the Java
+ # interpreter. This is but one of several Java hacks. Similarly,
+ # 'PYTHON' is customarily used to mean the Python interpreter.
+ reject_var $primary, "'$primary' is an anachronism"
+ unless $primary eq 'JAVA' || $primary eq 'PYTHON';
+
+ # Get the prefixes which are valid and actually used.
+ @prefix = am_primary_prefixes ($primary, $can_dist, @prefix);
+
+ # If a primary includes a configure substitution, then the EXTRA_
+ # form is required. Otherwise we can't properly do our job.
+ my $require_extra;
+
+ my @used = ();
+ my @result = ();
+
+ foreach my $X (@prefix)
+ {
+ my $nodir_name = $X;
+ my $one_name = $X . '_' . $primary;
+ my $one_var = var $one_name;
+
+ my $strip_subdir = 1;
+ # If subdir prefix should be preserved, do so.
+ if ($nodir_name =~ /^nobase_/)
+ {
+ $strip_subdir = 0;
+ $nodir_name =~ s/^nobase_//;
+ }
+
+ # If files should be distributed, do so.
+ my $dist_p = 0;
+ if ($can_dist)
+ {
+ $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
+ || (! $default_dist && $nodir_name =~ /^dist_/));
+ $nodir_name =~ s/^(dist|nodist)_//;
+ }
+
+
+ # Use the location of the currently processed variable.
+ # We are not processing a particular condition, so pick the first
+ # available.
+ my $tmpcond = $one_var->conditions->one_cond;
+ my $where = $one_var->rdef ($tmpcond)->location->clone;
+
+ # Append actual contents of where_PRIMARY variable to
+ # @result, skipping @substitutions@.
+ foreach my $locvals ($one_var->value_as_list_recursive (location => 1))
+ {
+ my ($loc, $value) = @$locvals;
+ # Skip configure substitutions.
+ if ($value =~ /^\@.*\@$/)
+ {
+ if ($nodir_name eq 'EXTRA')
+ {
+ error ($where,
+ "'$one_name' contains configure substitution, "
+ . "but shouldn't");
+ }
+ # Check here to make sure variables defined in
+ # configure.ac do not imply that EXTRA_PRIMARY
+ # must be defined.
+ elsif (! defined $configure_vars{$one_name})
+ {
+ $require_extra = $one_name
+ if $do_require;
+ }
+ }
+ else
+ {
+ # Strip any $(EXEEXT) suffix the user might have added,
+ # or this will confuse handle_source_transform() and
+ # check_canonical_spelling().
+ # We'll add $(EXEEXT) back later anyway.
+ # Do it here rather than in handle_programs so the
+ # uniquifying at the end of this function works.
+ ${$locvals}[1] =~ s/\$\(EXEEXT\)$//
+ if $primary eq 'PROGRAMS';
+
+ push (@result, $locvals);
+ }
+ }
+ # A blatant hack: we rewrite each _PROGRAMS primary to include
+ # EXEEXT.
+ append_exeext { 1 } $one_name
+ if $primary eq 'PROGRAMS';
+ # "EXTRA" shouldn't be used when generating clean targets,
+ # all, or install targets. We used to warn if EXTRA_FOO was
+ # defined uselessly, but this was annoying.
+ next
+ if $nodir_name eq 'EXTRA';
+
+ if ($nodir_name eq 'check')
+ {
+ push (@check, '$(' . $one_name . ')');
+ }
+ else
+ {
+ push (@used, '$(' . $one_name . ')');
+ }
+
+ # Is this to be installed?
+ my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
+
+ # If so, with install-exec? (or install-data?).
+ my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o);
+
+ my $check_options_p = $install_p && !! option 'std-options';
+
+ # Use the location of the currently processed variable as context.
+ $where->push_context ("while processing '$one_name'");
+
+ # The variable containing all files to distribute.
+ my $distvar = "\$($one_name)";
+ $distvar = shadow_unconditionally ($one_name, $where)
+ if ($dist_p && $one_var->has_conditional_contents);
+
+ # Singular form of $PRIMARY.
+ (my $one_primary = $primary) =~ s/S$//;
+ $output_rules .= file_contents ($file, $where,
+ PRIMARY => $primary,
+ ONE_PRIMARY => $one_primary,
+ DIR => $X,
+ NDIR => $nodir_name,
+ BASE => $strip_subdir,
+ EXEC => $exec_p,
+ INSTALL => $install_p,
+ DIST => $dist_p,
+ DISTVAR => $distvar,
+ 'CK-OPTS' => $check_options_p);
+ }
+
+ # The JAVA variable is used as the name of the Java interpreter.
+ # The PYTHON variable is used as the name of the Python interpreter.
+ if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
+ {
+ # Define it.
+ define_pretty_variable ($primary, TRUE, INTERNAL, @used);
+ $output_vars .= "\n";
+ }
+
+ err_var ($require_extra,
+ "'$require_extra' contains configure substitution,\n"
+ . "but 'EXTRA_$primary' not defined")
+ if ($require_extra && ! var ('EXTRA_' . $primary));
+
+ # Push here because PRIMARY might be configure time determined.
+ push (@all, '$(' . $primary . ')')
+ if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
+
+ # Make the result unique. This lets the user use conditionals in
+ # a natural way, but still lets us program lazily -- we don't have
+ # to worry about handling a particular object more than once.
+ # We will keep only one location per object.
+ my %result = ();
+ for my $pair (@result)
+ {
+ my ($loc, $val) = @$pair;
+ $result{$val} = $loc;
+ }
+ my @l = sort keys %result;
+ return map { [$result{$_}->clone, $_] } @l;
+}
+
1;