diff --git a/bin/automake.in b/bin/automake.in
index 06c09f9..219c748 100755
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -50,7 +50,6 @@
       import Thread::Queue;
     }
 }
-use Automake::TmpModule;
 use Automake::ChannelDefs;
 use Automake::Channels;
 use Automake::CondStack;
diff --git a/lib/Automake/ConfVars.pm b/lib/Automake/ConfVars.pm
index 8d834e2..df122e0 100644
--- a/lib/Automake/ConfVars.pm
+++ b/lib/Automake/ConfVars.pm
@@ -26,6 +26,7 @@
 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 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 @@
   $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;
diff --git a/lib/Automake/LangHandling.pm b/lib/Automake/LangHandling.pm
index 0406269..37e9af8 100644
--- a/lib/Automake/LangHandling.pm
+++ b/lib/Automake/LangHandling.pm
@@ -15,8 +15,8 @@
 
 package Automake::LangHandling;
 
-use Automake::TmpModule;
 use Automake::Condition qw (TRUE FALSE);
+use Automake::ConfVars;
 use Automake::ChannelDefs;
 use Automake::Global;
 use Automake::Language;
diff --git a/lib/Automake/TmpModule.pm b/lib/Automake/TmpModule.pm
deleted file mode 100644
index b98aab2..0000000
--- a/lib/Automake/TmpModule.pm
+++ /dev/null
@@ -1,379 +0,0 @@
-# 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 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/>.
-
-# FIXME: This is a temporary package.  The functions it holds should be moved
-# elsewhere
-package Automake::TmpModule;
-
-use 5.006;
-use strict;
-
-use Automake::ChannelDefs;
-use Automake::Condition qw /TRUE FALSE/;
-use Automake::ConfVars;
-use Automake::File;
-use Automake::General;
-use Automake::Global;
-use Automake::Location;
-use Automake::Options;
-use Automake::Utils;
-use Automake::VarDef;
-use Automake::Variable;
-use Exporter 'import';
-
-use vars qw (@EXPORT);
-
-@EXPORT = qw (append_exeext am_install_var am_primary_prefixes
-    shadow_unconditionally);
-
-
-# append_exeext { PREDICATE } $MACRO
-# ----------------------------------
-# Append $(EXEEXT) to each filename in $F appearing in the Makefile
-# variable $MACRO if &PREDICATE($F) is true.  @substitutions@ are
-# ignored.
-#
-# This is typically used on all filenames of *_PROGRAMS, and filenames
-# of TESTS that are programs.
-sub append_exeext (&$)
-{
-  my ($pred, $macro) = @_;
-
-  transform_variable_recursively
-    ($macro, $macro, 'am__EXEEXT', 0, INTERNAL,
-     sub {
-       my ($subvar, $val, $cond, $full_cond) = @_;
-       # Append $(EXEEXT) unless the user did it already, or it's a
-       # @substitution@.
-       $val .= '$(EXEEXT)'
-	 if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val);
-       return $val;
-     });
-}
-
-
-# shadow_unconditionally ($varname, $where)
-# -----------------------------------------
-# Return a $(variable) that contains all possible values
-# $varname can take.
-# If the VAR wasn't defined conditionally, return $(VAR).
-# Otherwise we create an am__VAR_DIST variable which contains
-# all possible values, and return $(am__VAR_DIST).
-sub shadow_unconditionally
-{
-  my ($varname, $where) = @_;
-  my $var = var $varname;
-  if ($var->has_conditional_contents)
-    {
-      $varname = "am__${varname}_DIST";
-      my @files = uniq ($var->value_as_list_recursive);
-      define_pretty_variable ($varname, TRUE, $where, @files);
-    }
-  return "\$($varname)"
-}
-
-
-# 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).
-#
-# FIXME: this should be rewritten to be cleaner.  It should be broken
-# up into multiple functions.
-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;
-}
-
-
-# @PREFIX
-# am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)
-# ----------------------------------------------------
-# Find all variable prefixes that are used for install directories.  A
-# prefix 'zar' qualifies iff:
-#
-# * 'zardir' is a variable.
-# * 'zar_PRIMARY' is a variable.
-#
-# As a side effect, it looks for misspellings.  It is an error to have
-# a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
-# "bni_PROGRAMS".  However, unusual prefixes are allowed if a variable
-# of the same name (with "dir" appended) exists.  For instance, if the
-# variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
-# This is to provide a little extra flexibility in those cases which
-# need it.
-sub am_primary_prefixes
-{
-  my ($primary, $can_dist, @prefixes) = @_;
-
-  local $_;
-  my %valid = map { $_ => 0 } @prefixes;
-  $valid{'EXTRA'} = 0;
-  foreach my $var (variables $primary)
-    {
-      # Automake is allowed to define variables that look like primaries
-      # but which aren't.  E.g. INSTALL_sh_DATA.
-      # Autoconf can also define variables like INSTALL_DATA, so
-      # ignore all configure variables (at least those which are not
-      # redefined in Makefile.am).
-      # FIXME: We should make sure that these variables are not
-      # conditionally defined (or else adjust the condition below).
-      my $def = $var->def (TRUE);
-      next if $def && $def->owner != VAR_MAKEFILE;
-
-      my $varname = $var->name;
-
-      if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
-	{
-	  my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
-	  if ($dist ne '' && ! $can_dist)
-	    {
-	      err_var ($var,
-		       "invalid variable '$varname': 'dist' is forbidden");
-	    }
-	  # Standard directories must be explicitly allowed.
-	  elsif (! defined $valid{$X} && exists $standard_prefix{$X})
-	    {
-	      err_var ($var,
-		       "'${X}dir' is not a legitimate directory " .
-		       "for '$primary'");
-	    }
-	  # A not explicitly valid directory is allowed if Xdir is defined.
-	  elsif (! defined $valid{$X} &&
-		 $var->requires_variables ("'$varname' is used", "${X}dir"))
-	    {
-	      # Nothing to do.  Any error message has been output
-	      # by $var->requires_variables.
-	    }
-	  else
-	    {
-	      # Ensure all extended prefixes are actually used.
- $valid{"$base$dist$X"} = 1;
-	    }
-	}
-      else
-	{
-	  prog_error "unexpected variable name: $varname";
-	}
-    }
-
-  # Return only those which are actually defined.
-  return sort grep { var ($_ . '_' . $primary) } keys %valid;
-}
-
-
-1;
diff --git a/lib/Automake/Variable.pm b/lib/Automake/Variable.pm
index 0004814..48c8d7f 100644
--- a/lib/Automake/Variable.pm
+++ b/lib/Automake/Variable.pm
@@ -34,26 +34,16 @@
 use Automake::Wrap 'makefile_wrap';
 use Exporter 'import';
 
-use vars '@ISA', '@EXPORT', '@EXPORT_OK';
+use vars '@ISA', '@EXPORT';
 
 @ISA = qw (Automake::Item);
-@EXPORT = qw (err_var msg_var msg_cond_var reject_var
-	      var rvar vardef rvardef
-	      variables
-	      scan_variable_expansions check_variable_expansions
-	      variable_delete
-	      variables_dump
-	      set_seen
-	      require_variables
-	      variable_value
-	      output_variables
-	      transform_variable_recursively
-	      verbose_var
-	      define_verbose_var
-	      define_verbose_tagvar
-	      define_pretty_variable
-	      define_variable
-	      define_files_variable);
+@EXPORT = qw (err_var msg_var msg_cond_var reject_var var rvar vardef rvardef
+    variables scan_variable_expansions check_variable_expansions
+    variable_delete variables_dump set_seen require_variables variable_value
+    output_variables transform_variable_recursively append_exeext verbose_var
+    define_verbose_var define_verbose_tagvar define_pretty_variable
+    define_variable define_files_variable am_primary_prefixes
+    shadow_unconditionally);
 
 =head1 NAME
 
@@ -1644,6 +1634,31 @@
   return $res;
 }
 
+=item C<append_exeext { PREDICATE } $MACRO>
+
+Append $(EXEEXT) to each filename in $F appearing in the Makefile variable
+$MACRO if &PREDICATE($F) is true.  @substitutions@ are ignored.
+
+This is typically used on all filenames of *_PROGRAMS, and filenames of TESTS
+that are programs.
+
+=cut
+sub append_exeext (&$)
+{
+  my ($pred, $macro) = @_;
+
+  transform_variable_recursively
+    ($macro, $macro, 'am__EXEEXT', 0, INTERNAL,
+     sub {
+       my ($subvar, $val, $cond, $full_cond) = @_;
+       # Append $(EXEEXT) unless the user did it already, or it's a
+       # @substitution@.
+       $val .= '$(EXEEXT)'
+	 if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val);
+       return $val;
+     });
+}
+
 # _verbose_private_var (NAME)
 # --------------------------
 # The naming policy for the private variables for silent rules.
@@ -1761,6 +1776,104 @@
 		   $where);
 }
 
+=item C<am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)>
+
+Find all variable prefixes that are used for install directories.  A
+prefix 'zar' qualifies iff:
+
+* 'zardir' is a variable.
+* 'zar_PRIMARY' is a variable.
+
+As a side effect, it looks for misspellings.  It is an error to have
+a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
+"bni_PROGRAMS".  However, unusual prefixes are allowed if a variable
+of the same name (with "dir" appended) exists.  For instance, if the
+variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
+This is to provide a little extra flexibility in those cases which
+need it.
+
+=cut
+sub am_primary_prefixes
+{
+  my ($primary, $can_dist, @prefixes) = @_;
+
+  local $_;
+  my %valid = map { $_ => 0 } @prefixes;
+  $valid{'EXTRA'} = 0;
+  foreach my $var (variables $primary)
+    {
+      # Automake is allowed to define variables that look like primaries
+      # but which aren't.  E.g. INSTALL_sh_DATA.
+      # Autoconf can also define variables like INSTALL_DATA, so
+      # ignore all configure variables (at least those which are not
+      # redefined in Makefile.am).
+      # FIXME: We should make sure that these variables are not
+      # conditionally defined (or else adjust the condition below).
+      my $def = $var->def (TRUE);
+      next if $def && $def->owner != VAR_MAKEFILE;
+
+      my $varname = $var->name;
+
+      if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
+	{
+	  my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
+	  if ($dist ne '' && ! $can_dist)
+	    {
+	      err_var ($var,
+		       "invalid variable '$varname': 'dist' is forbidden");
+	    }
+	  # Standard directories must be explicitly allowed.
+	  elsif (! defined $valid{$X} && exists $standard_prefix{$X})
+	    {
+	      err_var ($var,
+		       "'${X}dir' is not a legitimate directory " .
+		       "for '$primary'");
+	    }
+	  # A not explicitly valid directory is allowed if Xdir is defined.
+	  elsif (! defined $valid{$X} &&
+		 $var->requires_variables ("'$varname' is used", "${X}dir"))
+	    {
+	      # Nothing to do.  Any error message has been output
+	      # by $var->requires_variables.
+	    }
+	  else
+	    {
+	      # Ensure all extended prefixes are actually used.
+ $valid{"$base$dist$X"} = 1;
+	    }
+	}
+      else
+	{
+	  prog_error "unexpected variable name: $varname";
+	}
+    }
+
+  # Return only those which are actually defined.
+  return sort grep { var ($_ . '_' . $primary) } keys %valid;
+}
+
+=item C<shadow_unconditionally ($varname, $where)>
+
+Return a $(variable) that contains all possible values
+$varname can take.
+If the VAR wasn't defined conditionally, return $(VAR).
+Otherwise we create an am__VAR_DIST variable which contains
+all possible values, and return $(am__VAR_DIST).
+
+=cut
+
+sub shadow_unconditionally
+{
+  my ($varname, $where) = @_;
+  my $var = var $varname;
+  if ($var->has_conditional_contents)
+    {
+      $varname = "am__${varname}_DIST";
+      my @files = uniq ($var->value_as_list_recursive);
+      define_pretty_variable ($varname, TRUE, $where, @files);
+    }
+  return "\$($varname)"
+}
 
 =back
 
diff --git a/lib/Automake/local.mk b/lib/Automake/local.mk
index 6a40a18..8eb2e18 100644
--- a/lib/Automake/local.mk
+++ b/lib/Automake/local.mk
@@ -21,7 +21,6 @@
 perllibdir = $(pkgvdatadir)/Automake
 
 dist_perllib_DATA = \
-  %D%/TmpModule.pm \
   %D%/ChannelDefs.pm \
   %D%/Channels.pm \
   %D%/Condition.pm \
