#!/usr/bin/perl -w
# -*- perl -*-
# Generated from automake.in; do not edit by hand.

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;

# automake - create Makefile.in from Makefile.am
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009  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, 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/>.

# Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
# Perl reimplementation by Tom Tromey <tromey@redhat.com>, and
# Alexandre Duret-Lutz <adl@gnu.org>.

package Language;

BEGIN
{
  my $perllibdir = $ENV{'perllibdir'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/automake-1.11';
  unshift @INC, (split ':', $perllibdir);

  # Override SHELL.  This is required on DJGPP so that system() uses
  # bash, not COMMAND.COM which doesn't quote arguments properly.
  # Other systems aren't expected to use $SHELL when Automake
  # runs, but it should be safe to drop the `if DJGPP' guard if
  # it turns up other systems need the same thing.  After all,
  # if SHELL is used, ./configure's SHELL is always better than
  # the user's SHELL (which may be something like tcsh).
  $ENV{'SHELL'} = '/bin/sh' if exists $ENV{'DJDIR'};
}

use Automake::Struct;
struct (# Short name of the language (c, f77...).
	'name' => "\$",
	# Nice name of the language (C, Fortran 77...).
	'Name' => "\$",

	# List of configure variables which must be defined.
	'config_vars' => '@',

	'ansi'    => "\$",
	# `pure' is `1' or `'.  A `pure' language is one where, if
	# all the files in a directory are of that language, then we
	# do not require the C compiler or any code to call it.
	'pure'   => "\$",

	'autodep' => "\$",

	# Name of the compiling variable (COMPILE).
	'compiler'  => "\$",
	# Content of the compiling variable.
	'compile'  => "\$",
	# Flag to require compilation without linking (-c).
	'compile_flag' => "\$",
	'extensions' => '@',
	# A subroutine to compute a list of possible extensions of
	# the product given the input extensions.
	# (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo'))
	'output_extensions' => "\$",
	# A list of flag variables used in 'compile'.
	# (defaults to [])
	'flags' => "@",

	# Any tag to pass to libtool while compiling.
	'libtool_tag' => "\$",

	# The file to use when generating rules for this language.
	# The default is 'depend2'.
	'rule_file' => "\$",

	# Name of the linking variable (LINK).
	'linker' => "\$",
	# Content of the linking variable.
	'link' => "\$",

	# Name of the compiler variable (CC).
	'ccer' => "\$",

	# Name of the linker variable (LD).
	'lder' => "\$",
	# Content of the linker variable ($(CC)).
	'ld' => "\$",

	# Flag to specify the output file (-o).
	'output_flag' => "\$",
	'_finish' => "\$",

	# This is a subroutine which is called whenever we finally
	# determine the context in which a source file will be
	# compiled.
	'_target_hook' => "\$",

	# If TRUE, nodist_ sources will be compiled using specific rules
	# (i.e. not inference rules).  The default is FALSE.
	'nodist_specific' => "\$");


sub finish ($)
{
  my ($self) = @_;
  if (defined $self->_finish)
    {
      &{$self->_finish} (@_);
    }
}

sub target_hook ($$$$%)
{
    my ($self) = @_;
    if (defined $self->_target_hook)
    {
	&{$self->_target_hook} (@_);
    }
}

package Automake;

use strict;
use Automake::Config;
BEGIN
{
  if ($perl_threads)
    {
      require threads;
      import threads;
      require Thread::Queue;
      import Thread::Queue;
    }
}
use Automake::General;
use Automake::XFile;
use Automake::Channels;
use Automake::ChannelDefs;
use Automake::Configure_ac;
use Automake::FileUtils;
use Automake::Location;
use Automake::Condition qw/TRUE FALSE/;
use Automake::DisjConditions;
use Automake::Options;
use Automake::Version;
use Automake::Variable;
use Automake::VarDef;
use Automake::Rule;
use Automake::RuleDef;
use Automake::Wrap 'makefile_wrap';
use File::Basename;
use File::Spec;
use Carp;

## ----------- ##
## Constants.  ##
## ----------- ##

# Some regular expressions.  One reason to put them here is that it
# makes indentation work better in Emacs.

# Writing singled-quoted-$-terminated regexes is a pain because
# perl-mode thinks of $' as the ${'} variable (instead of a $ followed
# by a closing quote.  Letting perl-mode think the quote is not closed
# leads to all sort of misindentations.  On the other hand, defining
# regexes as double-quoted strings is far less readable.  So usually
# we will write:
#
#  $REGEX = '^regex_value' . "\$";

my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
my $WHITE_PATTERN = '^\s*' . "\$";
my $COMMENT_PATTERN = '^#';
my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*';
# A rule has three parts: a list of targets, a list of dependencies,
# and optionally actions.
my $RULE_PATTERN =
  "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";

# Only recognize leading spaces, not leading tabs.  If we recognize
# leading tabs here then we need to make the reader smarter, because
# otherwise it will think rules like `foo=bar; \' are errors.
my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$";
# This pattern recognizes a Gnits version id and sets $1 if the
# release is an alpha release.  We also allow a suffix which can be
# used to extend the version number with a "fork" identifier.
my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';

my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$";
my $ELSE_PATTERN =
  '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
my $ENDIF_PATTERN =
  '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
my $PATH_PATTERN = '(\w|[+/.-])+';
# This will pass through anything not of the prescribed form.
my $INCLUDE_PATTERN = ('^include\s+'
		       . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
		       . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
		       . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$");

# Match `-d' as a command-line argument in a string.
my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)";
# Directories installed during 'install-exec' phase.
my $EXEC_DIR_PATTERN =
  '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$";

# Values for AC_CANONICAL_*
use constant AC_CANONICAL_BUILD  => 1;
use constant AC_CANONICAL_HOST   => 2;
use constant AC_CANONICAL_TARGET => 3;

# Values indicating when something should be cleaned.
use constant MOSTLY_CLEAN     => 0;
use constant CLEAN            => 1;
use constant DIST_CLEAN       => 2;
use constant MAINTAINER_CLEAN => 3;

# Libtool files.
my @libtool_files = qw(ltmain.sh config.guess config.sub);
# ltconfig appears here for compatibility with old versions of libtool.
my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh);

# Commonly found files we look for and automatically include in
# DISTFILES.
my @common_files =
    (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB
	COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO
	ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub
	depcomp elisp-comp install-sh libversion.in mdate-sh missing
	mkinstalldirs py-compile texinfo.tex ylwrap),
     @libtool_files, @libtool_sometimes);

# Commonly used files we auto-include, but only sometimes.  This list
# is used for the --help output only.
my @common_sometimes =
  qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure
     configure.ac configure.in stamp-vti);

# Standard directories from the GNU Coding Standards, and additional
# pkg* directories from Automake.  Stored in a hash for fast member check.
my %standard_prefix =
    map { $_ => 1 } (qw(bin data dataroot dvi exec html include info
			lib libexec lisp localstate man man1 man2 man3
			man4 man5 man6 man7 man8 man9 oldinclude pdf
			pkgdatadir pkgincludedir pkglibdir pkglibexecdir
			ps sbin sharedstate sysconf));

# Copyright on generated Makefile.ins.
my $gen_copyright = "\
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
# Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
";

# These constants are returned by the lang_*_rewrite functions.
# LANG_SUBDIR means that the resulting object file should be in a
# subdir if the source file is.  In this case the file name cannot
# have `..' components.
use constant LANG_IGNORE  => 0;
use constant LANG_PROCESS => 1;
use constant LANG_SUBDIR  => 2;

# These are used when keeping track of whether an object can be built
# by two different paths.
use constant COMPILE_LIBTOOL  => 1;
use constant COMPILE_ORDINARY => 2;

# We can't always associate a location to a variable or a rule,
# when it's defined by Automake.  We use INTERNAL in this case.
use constant INTERNAL => new Automake::Location;

# Serialization keys for message queues.
use constant QUEUE_MESSAGE   => "msg";
use constant QUEUE_CONF_FILE => "conf file";
use constant QUEUE_LOCATION  => "location";
use constant QUEUE_STRING    => "string";


## ---------------------------------- ##
## Variables related to the options.  ##
## ---------------------------------- ##

# TRUE if we should always generate Makefile.in.
my $force_generation = 1;

# From the Perl manual.
my $symlink_exists = (eval 'symlink ("", "");', $@ eq '');

# TRUE if missing standard files should be installed.
my $add_missing = 0;

# TRUE if we should copy missing files; otherwise symlink if possible.
my $copy_missing = 0;

# TRUE if we should always update files that we know about.
my $force_missing = 0;


## ---------------------------------------- ##
## Variables filled during files scanning.  ##
## ---------------------------------------- ##

# Name of the configure.ac file.
my $configure_ac;

# Files found by scanning configure.ac for LIBOBJS.
my %libsources = ();

# Names used in AC_CONFIG_HEADER call.
my @config_headers = ();

# Names used in AC_CONFIG_LINKS call.
my @config_links = ();

# Directory where output files go.  Actually, output files are
# relative to this directory.
my $output_directory;

# List of Makefile.am's to process, and their corresponding outputs.
my @input_files = ();
my %output_files = ();

# Complete list of Makefile.am's that exist.
my @configure_input_files = ();

# List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's,
# and their outputs.
my @other_input_files = ();
# Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADER appears.
# The keys are the files created by these macros.
my %ac_config_files_location = ();
# The condition under which AC_CONFIG_FOOS appears.
my %ac_config_files_condition = ();

# Directory to search for configure-required files.  This
# will be computed by &locate_aux_dir and can be set using
# AC_CONFIG_AUX_DIR in configure.ac.
# $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree.
my $config_aux_dir = '';
my $config_aux_dir_set_in_configure_ac = 0;
# $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used
# in Makefiles.
my $am_config_aux_dir = '';

# Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR
# in configure.ac.
my $config_libobj_dir = '';

# Whether AM_GNU_GETTEXT has been seen in configure.ac.
my $seen_gettext = 0;
# Whether AM_GNU_GETTEXT([external]) is used.
my $seen_gettext_external = 0;
# Where AM_GNU_GETTEXT appears.
my $ac_gettext_location;
# Whether AM_GNU_GETTEXT_INTL_SUBDIR has been seen.
my $seen_gettext_intl = 0;

# Lists of tags supported by Libtool.
my %libtool_tags = ();
# 1 if Libtool uses LT_SUPPORTED_TAG.  If it does, then it also
# uses AC_REQUIRE_AUX_FILE.
my $libtool_new_api = 0;

# Most important AC_CANONICAL_* macro seen so far.
my $seen_canonical = 0;
# Location of that macro.
my $canonical_location;

# Where AM_MAINTAINER_MODE appears.
my $seen_maint_mode;

# Actual version we've seen.
my $package_version = '';

# Where version is defined.
my $package_version_location;

# TRUE if we've seen AM_ENABLE_MULTILIB.
my $seen_multilib = 0;

# TRUE if we've seen AM_PROG_CC_C_O
my $seen_cc_c_o = 0;

# Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument.
my %required_aux_file = ();

# Where AM_INIT_AUTOMAKE is called;
my $seen_init_automake = 0;

# TRUE if we've seen AM_AUTOMAKE_VERSION.
my $seen_automake_version = 0;

# Hash table of discovered configure substitutions.  Keys are names,
# values are `FILE:LINE' strings which are used by error message
# generation.
my %configure_vars = ();

# Ignored configure substitutions (i.e., variables not to be output in
# Makefile.in)
my %ignored_configure_vars = ();

# Files included by $configure_ac.
my @configure_deps = ();

# Greatest timestamp of configure's dependencies.
my $configure_deps_greatest_timestamp = 0;

# Hash table of AM_CONDITIONAL variables seen in configure.
my %configure_cond = ();

# This maps extensions onto language names.
my %extension_map = ();

# List of the DIST_COMMON files we discovered while reading
# configure.in
my $configure_dist_common = '';

# This maps languages names onto objects.
my %languages = ();
# Maps each linker variable onto a language object.
my %link_languages = ();

# maps extensions to needed source flags.
my %sourceflags = ();

# List of targets we must always output.
# FIXME: Complete, and remove falsely required targets.
my %required_targets =
  (
   'all'          => 1,
   'dvi'	  => 1,
   'pdf'	  => 1,
   'ps'		  => 1,
   'info'	  => 1,
   'install-info' => 1,
   'install'      => 1,
   'install-data' => 1,
   'install-exec' => 1,
   'uninstall'    => 1,

   # FIXME: Not required, temporary hacks.
   # Well, actually they are sort of required: the -recursive
   # targets will run them anyway...
   'html-am'         => 1,
   'dvi-am'          => 1,
   'pdf-am'          => 1,
   'ps-am'           => 1,
   'info-am'         => 1,
   'install-data-am' => 1,
   'install-exec-am' => 1,
   'install-html-am' => 1,
   'install-dvi-am'  => 1,
   'install-pdf-am'  => 1,
   'install-ps-am'   => 1,
   'install-info-am' => 1,
   'installcheck-am' => 1,
   'uninstall-am' => 1,

   'install-man' => 1,
  );

# Set to 1 if this run will create the Makefile.in that distributes
# the files in config_aux_dir.
my $automake_will_process_aux_dir = 0;

# The name of the Makefile currently being processed.
my $am_file = 'BUG';


################################################################

## ------------------------------------------ ##
## Variables reset by &initialize_per_input.  ##
## ------------------------------------------ ##

# Basename and relative dir of the input file.
my $am_file_name;
my $am_relative_dir;

# Same but wrt Makefile.in.
my $in_file_name;
my $relative_dir;

# Relative path to the top directory.
my $topsrcdir;

# Greatest timestamp of the output's dependencies (excluding
# configure's dependencies).
my $output_deps_greatest_timestamp;

# These variables are used when generating each Makefile.in.
# They hold the Makefile.in until it is ready to be printed.
my $output_vars;
my $output_all;
my $output_header;
my $output_rules;
my $output_trailer;

# This is the conditional stack, updated on if/else/endif, and
# used to build Condition objects.
my @cond_stack;

# This holds the set of included files.
my @include_stack;

# List of dependencies for the obvious targets.
my @all;
my @check;
my @check_tests;

# Keys in this hash table are files to delete.  The associated
# value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.)
my %clean_files;

# Keys in this hash table are object files or other files in
# subdirectories which need to be removed.  This only holds files
# which are created by compilations.  The value in the hash indicates
# when the file should be removed.
my %compile_clean_files;

# Keys in this hash table are directories where we expect to build a
# libtool object.  We use this information to decide what directories
# to delete.
my %libtool_clean_directories;

# Value of `$(SOURCES)', used by tags.am.
my @sources;
# Sources which go in the distribution.
my @dist_sources;

# This hash maps object file names onto their corresponding source
# file names.  This is used to ensure that each object is created
# by a single source file.
my %object_map;

# This hash maps object file names onto an integer value representing
# whether this object has been built via ordinary compilation or
# libtool compilation (the COMPILE_* constants).
my %object_compilation_map;


# This keeps track of the directories for which we've already
# created dirstamp code.  Keys are directories, values are stamp files.
# Several keys can share the same stamp files if they are equivalent
# (as are `.//foo' and `foo').
my %directory_map;

# All .P files.
my %dep_files;

# This is a list of all targets to run during "make dist".
my @dist_targets;

# Keep track of all programs declared in this Makefile, without
# $(EXEEXT).  @substitutions@ are not listed.
my %known_programs;
my %known_libraries;

# Keys in this hash are the basenames of files which must depend on
# ansi2knr.  Values are either the empty string, or the directory in
# which the ANSI source file appears; the directory must have a
# trailing `/'.
my %de_ansi_files;

# This keeps track of which extensions we've seen (that we care
# about).
my %extension_seen;

# This is random scratch space for the language finish functions.
# Don't randomly overwrite it; examine other uses of keys first.
my %language_scratch;

# We keep track of which objects need special (per-executable)
# handling on a per-language basis.
my %lang_specific_files;

# This is set when `handle_dist' has finished.  Once this happens,
# we should no longer push on dist_common.
my $handle_dist_run;

# Used to store a set of linkers needed to generate the sources currently
# under consideration.
my %linkers_used;

# True if we need `LINK' defined.  This is a hack.
my $need_link;

# Was get_object_extension run?
# FIXME: This is a hack. a better switch should be found.
my $get_object_extension_was_run;

# Record each file processed by make_paragraphs.
my %transformed_files;


################################################################

## ---------------------------------------------- ##
## Variables not reset by &initialize_per_input.  ##
## ---------------------------------------------- ##

# Cache each file processed by make_paragraphs.
# (This is different from %transformed_files because
# %transformed_files is reset for each file while %am_file_cache
# it global to the run.)
my %am_file_cache;

################################################################

# var_SUFFIXES_trigger ($TYPE, $VALUE)
# ------------------------------------
# This is called by Automake::Variable::define() when SUFFIXES
# is defined ($TYPE eq '') or appended ($TYPE eq '+').
# The work here needs to be performed as a side-effect of the
# macro_define() call because SUFFIXES definitions impact
# on $KNOWN_EXTENSIONS_PATTERN which is used used when parsing
# the input am file.
sub var_SUFFIXES_trigger ($$)
{
    my ($type, $value) = @_;
    accept_extensions (split (' ', $value));
}
Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger);

################################################################

## --------------------------------- ##
## Forward subroutine declarations.  ##
## --------------------------------- ##
sub register_language (%);
sub file_contents_internal ($$$%);
sub define_files_variable ($\@$$);


# &initialize_per_input ()
# ------------------------
# (Re)-Initialize per-Makefile.am variables.
sub initialize_per_input ()
{
    reset_local_duplicates ();

    $am_file_name = undef;
    $am_relative_dir = undef;

    $in_file_name = undef;
    $relative_dir = undef;
    $topsrcdir = undef;

    $output_deps_greatest_timestamp = 0;

    $output_vars = '';
    $output_all = '';
    $output_header = '';
    $output_rules = '';
    $output_trailer = '';

    Automake::Options::reset;
    Automake::Variable::reset;
    Automake::Rule::reset;

    @cond_stack = ();

    @include_stack = ();

    @all = ();
    @check = ();
    @check_tests = ();

    %clean_files = ();
    %compile_clean_files = ();

    # We always include `.'.  This isn't strictly correct.
    %libtool_clean_directories = ('.' => 1);

    @sources = ();
    @dist_sources = ();

    %object_map = ();
    %object_compilation_map = ();

    %directory_map = ();

    %dep_files = ();

    @dist_targets = ();

    %known_programs = ();
    %known_libraries= ();

    %de_ansi_files = ();

    %extension_seen = ();

    %language_scratch = ();

    %lang_specific_files = ();

    $handle_dist_run = 0;

    $need_link = 0;

    $get_object_extension_was_run = 0;

    %transformed_files = ();
}


################################################################

# Initialize our list of languages that are internally supported.

# C.
register_language ('name' => 'c',
		   'Name' => 'C',
		   'config_vars' => ['CC'],
		   'ansi' => 1,
		   'autodep' => '',
		   'flags' => ['CFLAGS', 'CPPFLAGS'],
		   'ccer' => 'CC',
		   'compiler' => 'COMPILE',
		   'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)',
		   'lder' => 'CCLD',
		   'ld' => '$(CC)',
		   'linker' => 'LINK',
		   'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'compile_flag' => '-c',
		   'libtool_tag' => 'CC',
		   'extensions' => ['.c'],
		   '_finish' => \&lang_c_finish);

# C++.
register_language ('name' => 'cxx',
		   'Name' => 'C++',
		   'config_vars' => ['CXX'],
		   'linker' => 'CXXLINK',
		   'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'autodep' => 'CXX',
		   'flags' => ['CXXFLAGS', 'CPPFLAGS'],
		   'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)',
		   'ccer' => 'CXX',
		   'compiler' => 'CXXCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'CXX',
		   'lder' => 'CXXLD',
		   'ld' => '$(CXX)',
		   'pure' => 1,
		   'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']);

# Objective C.
register_language ('name' => 'objc',
		   'Name' => 'Objective C',
		   'config_vars' => ['OBJC'],
		   'linker' => 'OBJCLINK',
		   'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'autodep' => 'OBJC',
		   'flags' => ['OBJCFLAGS', 'CPPFLAGS'],
		   'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)',
		   'ccer' => 'OBJC',
		   'compiler' => 'OBJCCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'lder' => 'OBJCLD',
		   'ld' => '$(OBJC)',
		   'pure' => 1,
		   'extensions' => ['.m']);

# Unified Parallel C.
register_language ('name' => 'upc',
		   'Name' => 'Unified Parallel C',
		   'config_vars' => ['UPC'],
		   'linker' => 'UPCLINK',
		   'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'autodep' => 'UPC',
		   'flags' => ['UPCFLAGS', 'CPPFLAGS'],
		   'compile' => '$(UPC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_UPCFLAGS) $(UPCFLAGS)',
		   'ccer' => 'UPC',
		   'compiler' => 'UPCCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'lder' => 'UPCLD',
		   'ld' => '$(UPC)',
		   'pure' => 1,
		   'extensions' => ['.upc']);

# Headers.
register_language ('name' => 'header',
		   'Name' => 'Header',
		   'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh',
				    '.hpp', '.inc'],
		   # No output.
		   'output_extensions' => sub { return () },
		   # Nothing to do.
		   '_finish' => sub { });

# Vala
register_language ('name' => 'vala',
		   'Name' => 'Vala',
		   'config_vars' => ['VALAC'],
		   'flags' => [],
		   'compile' => '$(VALAC) $(AM_VALAFLAGS) $(VALAFLAGS)',
		   'ccer' => 'VALAC',
		   'compiler' => 'VALACOMPILE',
		   'extensions' => ['.vala'],
		   'output_extensions' => sub { (my $ext = $_[0]) =~ s/vala$/c/;
						return ($ext,) },
		   'rule_file' => 'vala',
		   '_finish' => \&lang_vala_finish,
		   '_target_hook' => \&lang_vala_target_hook,
		   'nodist_specific' => 1);

# Yacc (C & C++).
register_language ('name' => 'yacc',
		   'Name' => 'Yacc',
		   'config_vars' => ['YACC'],
		   'flags' => ['YFLAGS'],
		   'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
		   'ccer' => 'YACC',
		   'compiler' => 'YACCCOMPILE',
		   'extensions' => ['.y'],
		   'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
						return ($ext,) },
		   'rule_file' => 'yacc',
		   '_finish' => \&lang_yacc_finish,
		   '_target_hook' => \&lang_yacc_target_hook,
		   'nodist_specific' => 1);
register_language ('name' => 'yaccxx',
		   'Name' => 'Yacc (C++)',
		   'config_vars' => ['YACC'],
		   'rule_file' => 'yacc',
		   'flags' => ['YFLAGS'],
		   'ccer' => 'YACC',
		   'compiler' => 'YACCCOMPILE',
		   'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
		   'extensions' => ['.y++', '.yy', '.yxx', '.ypp'],
		   'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
						return ($ext,) },
		   '_finish' => \&lang_yacc_finish,
		   '_target_hook' => \&lang_yacc_target_hook,
		   'nodist_specific' => 1);

# Lex (C & C++).
register_language ('name' => 'lex',
		   'Name' => 'Lex',
		   'config_vars' => ['LEX'],
		   'rule_file' => 'lex',
		   'flags' => ['LFLAGS'],
		   'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
		   'ccer' => 'LEX',
		   'compiler' => 'LEXCOMPILE',
		   'extensions' => ['.l'],
		   'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
						return ($ext,) },
		   '_finish' => \&lang_lex_finish,
		   '_target_hook' => \&lang_lex_target_hook,
		   'nodist_specific' => 1);
register_language ('name' => 'lexxx',
		   'Name' => 'Lex (C++)',
		   'config_vars' => ['LEX'],
		   'rule_file' => 'lex',
		   'flags' => ['LFLAGS'],
		   'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
		   'ccer' => 'LEX',
		   'compiler' => 'LEXCOMPILE',
		   'extensions' => ['.l++', '.ll', '.lxx', '.lpp'],
		   'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
						return ($ext,) },
		   '_finish' => \&lang_lex_finish,
		   '_target_hook' => \&lang_lex_target_hook,
		   'nodist_specific' => 1);

# Assembler.
register_language ('name' => 'asm',
		   'Name' => 'Assembler',
		   'config_vars' => ['CCAS', 'CCASFLAGS'],

		   'flags' => ['CCASFLAGS'],
		   # Users can set AM_CCASFLAGS to include DEFS, INCLUDES,
		   # or anything else required.  They can also set CCAS.
		   # Or simply use Preprocessed Assembler.
		   'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)',
		   'ccer' => 'CCAS',
		   'compiler' => 'CCASCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'extensions' => ['.s'],

		   # With assembly we still use the C linker.
		   '_finish' => \&lang_c_finish);

# Preprocessed Assembler.
register_language ('name' => 'cppasm',
		   'Name' => 'Preprocessed Assembler',
		   'config_vars' => ['CCAS', 'CCASFLAGS'],

		   'autodep' => 'CCAS',
		   'flags' => ['CCASFLAGS', 'CPPFLAGS'],
		   'compile' => '$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)',
		   'ccer' => 'CPPAS',
		   'compiler' => 'CPPASCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'extensions' => ['.S', '.sx'],

		   # With assembly we still use the C linker.
		   '_finish' => \&lang_c_finish);

# Fortran 77
register_language ('name' => 'f77',
		   'Name' => 'Fortran 77',
		   'config_vars' => ['F77'],
		   'linker' => 'F77LINK',
		   'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'flags' => ['FFLAGS'],
		   'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)',
		   'ccer' => 'F77',
		   'compiler' => 'F77COMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'F77',
		   'lder' => 'F77LD',
		   'ld' => '$(F77)',
		   'pure' => 1,
		   'extensions' => ['.f', '.for']);

# Fortran
register_language ('name' => 'fc',
		   'Name' => 'Fortran',
		   'config_vars' => ['FC'],
		   'linker' => 'FCLINK',
		   'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'flags' => ['FCFLAGS'],
		   'compile' => '$(FC) $(AM_FCFLAGS) $(FCFLAGS)',
		   'ccer' => 'FC',
		   'compiler' => 'FCCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'FC',
		   'lder' => 'FCLD',
		   'ld' => '$(FC)',
		   'pure' => 1,
		   'extensions' => ['.f90', '.f95', '.f03', '.f08']);

# Preprocessed Fortran
register_language ('name' => 'ppfc',
		   'Name' => 'Preprocessed Fortran',
		   'config_vars' => ['FC'],
		   'linker' => 'FCLINK',
		   'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'lder' => 'FCLD',
		   'ld' => '$(FC)',
		   'flags' => ['FCFLAGS', 'CPPFLAGS'],
		   'ccer' => 'PPFC',
		   'compiler' => 'PPFCCOMPILE',
		   'compile' => '$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'FC',
		   'pure' => 1,
		   'extensions' => ['.F90','.F95', '.F03', '.F08']);

# Preprocessed Fortran 77
#
# The current support for preprocessing Fortran 77 just involves
# passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
# $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since
# this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51
# for `make' Version 3.76 Beta' (specifically, from info file
# `(make)Catalogue of Rules').
#
# A better approach would be to write an Autoconf test
# (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all
# Fortran 77 compilers know how to do preprocessing.  The Autoconf
# macro AC_PROG_FPP should test the Fortran 77 compiler first for
# preprocessing capabilities, and then fall back on cpp (if cpp were
# available).
register_language ('name' => 'ppf77',
		   'Name' => 'Preprocessed Fortran 77',
		   'config_vars' => ['F77'],
		   'linker' => 'F77LINK',
		   'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'lder' => 'F77LD',
		   'ld' => '$(F77)',
		   'flags' => ['FFLAGS', 'CPPFLAGS'],
		   'ccer' => 'PPF77',
		   'compiler' => 'PPF77COMPILE',
		   'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'F77',
		   'pure' => 1,
		   'extensions' => ['.F']);

# Ratfor.
register_language ('name' => 'ratfor',
		   'Name' => 'Ratfor',
		   'config_vars' => ['F77'],
		   'linker' => 'F77LINK',
		   'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'lder' => 'F77LD',
		   'ld' => '$(F77)',
		   'flags' => ['RFLAGS', 'FFLAGS'],
		   # FIXME also FFLAGS.
		   'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)',
		   'ccer' => 'F77',
		   'compiler' => 'RCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'F77',
		   'pure' => 1,
		   'extensions' => ['.r']);

# Java via gcj.
register_language ('name' => 'java',
		   'Name' => 'Java',
		   'config_vars' => ['GCJ'],
		   'linker' => 'GCJLINK',
		   'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
		   'autodep' => 'GCJ',
		   'flags' => ['GCJFLAGS'],
		   'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)',
		   'ccer' => 'GCJ',
		   'compiler' => 'GCJCOMPILE',
		   'compile_flag' => '-c',
		   'output_flag' => '-o',
		   'libtool_tag' => 'GCJ',
		   'lder' => 'GCJLD',
		   'ld' => '$(GCJ)',
		   'pure' => 1,
		   'extensions' => ['.java', '.class', '.zip', '.jar']);

################################################################

# Error reporting functions.

# err_am ($MESSAGE, [%OPTIONS])
# -----------------------------
# Uncategorized errors about the current Makefile.am.
sub err_am ($;%)
{
  msg_am ('error', @_);
}

# err_ac ($MESSAGE, [%OPTIONS])
# -----------------------------
# Uncategorized errors about configure.ac.
sub err_ac ($;%)
{
  msg_ac ('error', @_);
}

# msg_am ($CHANNEL, $MESSAGE, [%OPTIONS])
# ---------------------------------------
# Messages about about the current Makefile.am.
sub msg_am ($$;%)
{
  my ($channel, $msg, %opts) = @_;
  msg $channel, "${am_file}.am", $msg, %opts;
}

# msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS])
# ---------------------------------------
# Messages about about configure.ac.
sub msg_ac ($$;%)
{
  my ($channel, $msg, %opts) = @_;
  msg $channel, $configure_ac, $msg, %opts;
}

################################################################

# subst ($TEXT)
# -------------
# Return a configure-style substitution using the indicated text.
# We do this to avoid having the substitutions directly in automake.in;
# when we do that they are sometimes removed and this causes confusion
# and bugs.
sub subst ($)
{
    my ($text) = @_;
    return '@' . $text . '@';
}

################################################################


# $BACKPATH
# &backname ($REL-DIR)
# --------------------
# If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'.
# For instance `src/foo' => `../..'.
# Works with non strictly increasing paths, i.e., `src/../lib' => `..'.
sub backname ($)
{
    my ($file) = @_;
    my @res;
    foreach (split (/\//, $file))
    {
	next if $_ eq '.' || $_ eq '';
	if ($_ eq '..')
	{
	    pop @res
	      or prog_error ("trying to reverse path `$file' pointing outside tree");
	}
	else
	{
	    push (@res, '..');
	}
    }
    return join ('/', @res) || '.';
}

################################################################

# `silent-rules' mode handling functions.

# verbose_var (NAME)
# ------------------
# The public variable stem used to implement `silent-rules'.
sub verbose_var ($)
{
    my ($name) = @_;
    return 'AM_V_' . $name;
}

# verbose_private_var (NAME)
# --------------------------
# The naming policy for the private variables for `silent-rules'.
sub verbose_private_var ($)
{
    my ($name) = @_;
    return 'am__v_' . $name;
}

# define_verbose_var (NAME, VAL)
# ------------------------------
# For `silent-rules' mode, setup VAR and dispatcher, to expand to VAL if silent.
sub define_verbose_var ($$)
{
    my ($name, $val) = @_;
    my $var = verbose_var ($name);
    my $pvar = verbose_private_var ($name);
    my $silent_var = $pvar . '_0';
    if (option 'silent-rules')
      {
	# Using `$V' instead of `$(V)' breaks IRIX make.
	define_variable ($var, '$(' . $pvar . '_$(V))', INTERNAL);
	define_variable ($pvar . '_', '$(' . $pvar . '_$(AM_DEFAULT_VERBOSITY))', INTERNAL);
	Automake::Variable::define ($silent_var, VAR_AUTOMAKE, '', TRUE, $val,
				    '', INTERNAL, VAR_ASIS)
	  if (! vardef ($silent_var, TRUE));
      }
}

# Above should not be needed in the general automake code.

# verbose_flag (NAME)
# -------------------
# Contents of %VERBOSE%: variable to expand before rule command.
sub verbose_flag ($)
{
    my ($name) = @_;
    return '$(' . verbose_var ($name) . ')'
      if (option 'silent-rules');
    return '';
}

# silent_flag
# -----------
# Contents of %SILENT%: variable to expand to `@' when silent.
sub silent_flag ()
{
    return verbose_flag ('at');
}

# define_verbose_tagvar (NAME)
# ----------------------------
# Engage the needed `silent-rules' machinery for tag NAME.
sub define_verbose_tagvar ($)
{
    my ($name) = @_;
    if (option 'silent-rules')
      {
	define_verbose_var ($name, '@echo "  '. $name . ' ' x (6 - length ($name)) . '" $@;');
	define_verbose_var ('at', '@');
      }
}

# define_verbose_libtool
# ----------------------
# Engage the needed `silent-rules' machinery for `libtool --silent'.
sub define_verbose_libtool ()
{
    define_verbose_var ('lt', '--silent');
    return verbose_flag ('lt');
}


################################################################


# Handle AUTOMAKE_OPTIONS variable.  Return 1 on error, 0 otherwise.
sub handle_options
{
  my $var = var ('AUTOMAKE_OPTIONS');
  if ($var)
    {
      if ($var->has_conditional_contents)
	{
	  msg_var ('unsupported', $var,
		   "`AUTOMAKE_OPTIONS' cannot have conditional contents");
	}
      foreach my $locvals ($var->value_as_list_recursive (cond_filter => TRUE,
							  location => 1))
	{
	  my ($loc, $value) = @$locvals;
	  return 1 if (process_option_list ($loc, $value))
	}
    }

  # Override portability-recursive warning.
  switch_warning ('no-portability-recursive')
    if option 'silent-rules';

  if ($strictness == GNITS)
    {
      set_option ('readme-alpha', INTERNAL);
      set_option ('std-options', INTERNAL);
      set_option ('check-news', INTERNAL);
    }

  return 0;
}

# 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)"
}

# get_object_extension ($EXTENSION)
# ---------------------------------
# Prefix $EXTENSION with $U if ansi2knr is in use.
sub get_object_extension ($)
{
    my ($extension) = @_;

    # Check for automatic de-ANSI-fication.
    $extension = '$U' . $extension
      if option 'ansi2knr';

    $get_object_extension_was_run = 1;

    return $extension;
}

# check_user_variables (@LIST)
# ----------------------------
# Make sure each variable VAR in @LIST does not exist, suggest using AM_VAR
# otherwise.
sub check_user_variables (@)
{
  my @dont_override = @_;
  foreach my $flag (@dont_override)
    {
      my $var = var $flag;
      if ($var)
	{
	  for my $cond ($var->conditions->conds)
	    {
	      if ($var->rdef ($cond)->owner == VAR_MAKEFILE)
		{
		  msg_cond_var ('gnu', $cond, $flag,
				"`$flag' is a user variable, "
				. "you should not override it;\n"
				. "use `AM_$flag' instead.");
		}
	    }
	}
    }
}

# Call finish function for each language that was used.
sub handle_languages
{
    if (! option 'no-dependencies')
    {
	# Include auto-dep code.  Don't include it if DEP_FILES would
	# be empty.
	if (&saw_sources_p (0) && keys %dep_files)
	{
	    # Set location of depcomp.
	    &define_variable ('depcomp',
			      "\$(SHELL) $am_config_aux_dir/depcomp",
			      INTERNAL);
	    &define_variable ('am__depfiles_maybe', 'depfiles', INTERNAL);

	    require_conf_file ("$am_file.am", FOREIGN, 'depcomp');

	    my @deplist = sort keys %dep_files;
	    # Generate each `include' individually.  Irix 6 make will
	    # not properly include several files resulting from a
	    # variable expansion; generating many separate includes
	    # seems safest.
	    $output_rules .= "\n";
	    foreach my $iter (@deplist)
	    {
		$output_rules .= (subst ('AMDEP_TRUE')
				  . subst ('am__include')
				  . ' '
				  . subst ('am__quote')
				  . $iter
				  . subst ('am__quote')
				  . "\n");
	    }

	    # Compute the set of directories to remove in distclean-depend.
	    my @depdirs = uniq (map { dirname ($_) } @deplist);
	    $output_rules .= &file_contents ('depend',
					     new Automake::Location,
					     DEPDIRS => "@depdirs");
	}
    }
    else
    {
	&define_variable ('depcomp', '', INTERNAL);
	&define_variable ('am__depfiles_maybe', '', INTERNAL);
    }

    my %done;

    # Is the c linker needed?
    my $needs_c = 0;
    foreach my $ext (sort keys %extension_seen)
    {
	next unless $extension_map{$ext};

	my $lang = $languages{$extension_map{$ext}};

	my $rule_file = $lang->rule_file || 'depend2';

	# Get information on $LANG.
	my $pfx = $lang->autodep;
	my $fpfx = ($pfx eq '') ? 'CC' : $pfx;

	my ($AMDEP, $FASTDEP) =
	  (option 'no-dependencies' || $lang->autodep eq 'no')
	  ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx");

	my $verbose = verbose_flag ($lang->ccer || 'GEN');
	my $silent = silent_flag ();

	my %transform = ('EXT'     => $ext,
			 'PFX'     => $pfx,
			 'FPFX'    => $fpfx,
			 'AMDEP'   => $AMDEP,
			 'FASTDEP' => $FASTDEP,
			 '-c'      => $lang->compile_flag || '',
			 # These are not used, but they need to be defined
			 # so &transform do not complain.
			 SUBDIROBJ     => 0,
			 'DERIVED-EXT' => 'BUG',
			 DIST_SOURCE   => 1,
			 VERBOSE   => $verbose,
			 SILENT    => $silent,
			);

	# Generate the appropriate rules for this extension.
	if (((! option 'no-dependencies') && $lang->autodep ne 'no')
	    || defined $lang->compile)
	{
	    # Some C compilers don't support -c -o.  Use it only if really
	    # needed.
	    my $output_flag = $lang->output_flag || '';
	    $output_flag = '-o'
	      if (! $output_flag
		  && $lang->name eq 'c'
		  && option 'subdir-objects');

	    # Compute a possible derived extension.
	    # This is not used by depend2.am.
	    my $der_ext = (&{$lang->output_extensions} ($ext))[0];

	    # When we output an inference rule like `.c.o:' we
	    # have two cases to consider: either subdir-objects
	    # is used, or it is not.
	    #
	    # In the latter case the rule is used to build objects
	    # in the current directory, and dependencies always
	    # go into `./$(DEPDIR)/'.  We can hard-code this value.
	    #
	    # In the former case the rule can be used to build
	    # objects in sub-directories too.  Dependencies should
	    # go into the appropriate sub-directories, e.g.,
	    # `sub/$(DEPDIR)/'.  The value of this directory
	    # needs to be computed on-the-fly.
	    #
	    # DEPBASE holds the name of this directory, plus the
	    # basename part of the object file (extensions Po, TPo,
	    # Plo, TPlo will be added later as appropriate).  It is
	    # either hardcoded, or a shell variable (`$depbase') that
	    # will be computed by the rule.
	    my $depbase =
	      option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*';
	    $output_rules .=
	      file_contents ($rule_file,
			     new Automake::Location,
			     %transform,
			     GENERIC   => 1,

			     'DERIVED-EXT' => $der_ext,

			     DEPBASE   => $depbase,
			     BASE      => '$*',
			     SOURCE    => '$<',
			     SOURCEFLAG => $sourceflags{$ext} || '',
			     OBJ       => '$@',
			     OBJOBJ    => '$@',
			     LTOBJ     => '$@',

			     COMPILE   => '$(' . $lang->compiler . ')',
			     LTCOMPILE => '$(LT' . $lang->compiler . ')',
			     -o        => $output_flag,
			     SUBDIROBJ => !! option 'subdir-objects');
	}

	# Now include code for each specially handled object with this
	# language.
	my %seen_files = ();
	foreach my $file (@{$lang_specific_files{$lang->name}})
	{
	    my ($derived, $source, $obj, $myext, $srcext, %file_transform) = @$file;

	    # We might see a given object twice, for instance if it is
	    # used under different conditions.
	    next if defined $seen_files{$obj};
	    $seen_files{$obj} = 1;

	    prog_error ("found " . $lang->name .
			" in handle_languages, but compiler not defined")
	      unless defined $lang->compile;

	    my $obj_compile = $lang->compile;

	    # Rewrite each occurrence of `AM_$flag' in the compile
	    # rule into `${derived}_$flag' if it exists.
	    for my $flag (@{$lang->flags})
	      {
		my $val = "${derived}_$flag";
		$obj_compile =~ s/\(AM_$flag\)/\($val\)/
		  if set_seen ($val);
	      }

	    my $libtool_tag = '';
	    if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag})
	      {
		$libtool_tag = '--tag=' . $lang->libtool_tag . ' '
	      }

	    my $ptltflags = "${derived}_LIBTOOLFLAGS";
	    $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags;

	    my $ltverbose = define_verbose_libtool ();
	    my $obj_ltcompile =
	      "\$(LIBTOOL) $ltverbose $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) "
	      . "--mode=compile $obj_compile";

	    # We _need_ `-o' for per object rules.
	    my $output_flag = $lang->output_flag || '-o';

	    my $depbase = dirname ($obj);
	    $depbase = ''
		if $depbase eq '.';
	    $depbase .= '/'
		unless $depbase eq '';
	    $depbase .= '$(DEPDIR)/' . basename ($obj);

	    # Support for deansified files in subdirectories is ugly
	    # enough to deserve an explanation.
	    #
	    # A Note about normal ansi2knr processing first.  On
	    #
	    #   AUTOMAKE_OPTIONS = ansi2knr
	    #   bin_PROGRAMS = foo
	    #   foo_SOURCES = foo.c
	    #
	    # we generate rules similar to:
	    #
	    #   foo: foo$U.o; link ...
	    #   foo$U.o: foo$U.c; compile ...
	    #   foo_.c: foo.c; ansi2knr ...
	    #
	    # this is fairly compact, and will call ansi2knr depending
	    # on the value of $U (`' or `_').
	    #
	    # It's harder with subdir sources. On
	    #
	    #   AUTOMAKE_OPTIONS = ansi2knr
	    #   bin_PROGRAMS = foo
	    #   foo_SOURCES = sub/foo.c
	    #
	    # we have to create foo_.c in the current directory.
	    # (Unless the user asks 'subdir-objects'.)  This is important
	    # in case the same file (`foo.c') is compiled from other
	    # directories with different cpp options: foo_.c would
	    # be preprocessed for only one set of options if it were
	    # put in the subdirectory.
	    #
	    # Because foo$U.o must be built from either foo_.c or
	    # sub/foo.c we can't be as concise as in the first example.
	    # Instead we output
	    #
	    #   foo: foo$U.o; link ...
	    #   foo_.o: foo_.c; compile ...
	    #   foo.o: sub/foo.c; compile ...
	    #   foo_.c: foo.c; ansi2knr ...
	    #
	    # This is why we'll now transform $rule_file twice
	    # if we detect this case.
	    # A first time we output the compile rule with `$U'
	    # replaced by `_' and the source directory removed,
	    # and another time we simply remove `$U'.
	    #
	    # Note that at this point $source (as computed by
	    # &handle_single_transform) is `sub/foo$U.c'.
	    # This can be confusing: it can be used as-is when
	    # subdir-objects is set, otherwise you have to know
	    # it really means `foo_.c' or `sub/foo.c'.
	    my $objdir = dirname ($obj);
	    my $srcdir = dirname ($source);
	    if ($lang->ansi && $obj =~ /\$U/)
	      {
		prog_error "`$obj' contains \$U, but `$source' doesn't."
		  if $source !~ /\$U/;

		(my $source_ = $source) =~ s/\$U/_/g;
		# Output an additional rule if _.c and .c are not in
		# the same directory.  (_.c is always in $objdir.)
		if ($objdir ne $srcdir)
		  {
		    (my $obj_ = $obj) =~ s/\$U/_/g;
		    (my $depbase_ = $depbase) =~ s/\$U/_/g;
		    $source_ = basename ($source_);

		    $output_rules .=
		      file_contents ($rule_file,
				     new Automake::Location,
				     %transform,
				     GENERIC   => 0,

				     DEPBASE   => $depbase_,
				     BASE      => $obj_,
				     SOURCE    => $source_,
				     SOURCEFLAG => $sourceflags{$srcext} || '',
				     OBJ       => "$obj_$myext",
				     OBJOBJ    => "$obj_.obj",
				     LTOBJ     => "$obj_.lo",

				     COMPILE   => $obj_compile,
				     LTCOMPILE => $obj_ltcompile,
				     -o        => $output_flag,
				     %file_transform);
		    $obj =~ s/\$U//g;
		    $depbase =~ s/\$U//g;
		    $source =~ s/\$U//g;
		  }
	      }

	    $output_rules .=
	      file_contents ($rule_file,
			     new Automake::Location,
			     %transform,
			     GENERIC   => 0,

			     DEPBASE   => $depbase,
			     BASE      => $obj,
			     SOURCE    => $source,
			     SOURCEFLAG => $sourceflags{$srcext} || '',
			     # Use $myext and not `.o' here, in case
			     # we are actually building a new source
			     # file -- e.g. via yacc.
			     OBJ       => "$obj$myext",
			     OBJOBJ    => "$obj.obj",
			     LTOBJ     => "$obj.lo",

			     VERBOSE   => $verbose,
			     SILENT    => $silent,
			     COMPILE   => $obj_compile,
			     LTCOMPILE => $obj_ltcompile,
			     -o        => $output_flag,
			     %file_transform);
	}

	# The rest of the loop is done once per language.
	next if defined $done{$lang};
	$done{$lang} = 1;

	# Load the language dependent Makefile chunks.
	my %lang = map { uc ($_) => 0 } keys %languages;
	$lang{uc ($lang->name)} = 1;
	$output_rules .= file_contents ('lang-compile',
					new Automake::Location,
					%transform, %lang);

	# If the source to a program consists entirely of code from a
	# `pure' language, for instance C++ or Fortran 77, then we
	# don't need the C compiler code.  However if we run into
	# something unusual then we do generate the C code.  There are
	# probably corner cases here that do not work properly.
	# People linking Java code to Fortran code deserve pain.
	$needs_c ||= ! $lang->pure;

	define_compiler_variable ($lang)
	  if ($lang->compile);

	define_linker_variable ($lang)
	  if ($lang->link);

	require_variables ("$am_file.am", $lang->Name . " source seen",
			   TRUE, @{$lang->config_vars});

	# Call the finisher.
	$lang->finish;

	# Flags listed in `->flags' are user variables (per GNU Standards),
	# they should not be overridden in the Makefile...
	my @dont_override = @{$lang->flags};
	# ... and so is LDFLAGS.
	push @dont_override, 'LDFLAGS' if $lang->link;

	check_user_variables @dont_override;
    }

    # If the project is entirely C++ or entirely Fortran 77 (i.e., 1
    # suffix rule was learned), don't bother with the C stuff.  But if
    # anything else creeps in, then use it.
    $needs_c = 1
      if $need_link || suffix_rules_count > 1;

    if ($needs_c)
      {
	&define_compiler_variable ($languages{'c'})
	  unless defined $done{$languages{'c'}};
	define_linker_variable ($languages{'c'});
      }

    # Always provide the user with `AM_V_GEN' for `silent-rules' mode.
    define_verbose_tagvar ('GEN');
}


# 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;
     });
}


# Check to make sure a source defined in LIBOBJS is not explicitly
# mentioned.  This is a separate function (as opposed to being inlined
# in handle_source_transform) because it isn't always appropriate to
# do this check.
sub check_libobjs_sources
{
  my ($one_file, $unxformed) = @_;

  foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
		      'dist_EXTRA_', 'nodist_EXTRA_')
    {
      my @files;
      my $varname = $prefix . $one_file . '_SOURCES';
      my $var = var ($varname);
      if ($var)
	{
	  @files = $var->value_as_list_recursive;
	}
      elsif ($prefix eq '')
	{
	  @files = ($unxformed . '.c');
	}
      else
	{
	  next;
	}

      foreach my $file (@files)
	{
	  err_var ($prefix . $one_file . '_SOURCES',
		   "automatically discovered file `$file' should not" .
		   " be explicitly mentioned")
	    if defined $libsources{$file};
	}
    }
}


# @OBJECTS
# handle_single_transform ($VAR, $TOPPARENT, $DERIVED, $OBJ, $FILE, %TRANSFORM)
# -----------------------------------------------------------------------------
# Does much of the actual work for handle_source_transform.
# Arguments are:
#   $VAR is the name of the variable that the source filenames come from
#   $TOPPARENT is the name of the _SOURCES variable which is being processed
#   $DERIVED is the name of resulting executable or library
#   $OBJ is the object extension (e.g., `$U.lo')
#   $FILE the source file to transform
#   %TRANSFORM contains extras arguments to pass to file_contents
#     when producing explicit rules
# Result is a list of the names of objects
# %linkers_used will be updated with any linkers needed
sub handle_single_transform ($$$$$%)
{
    my ($var, $topparent, $derived, $obj, $_file, %transform) = @_;
    my @files = ($_file);
    my @result = ();
    my $nonansi_obj = $obj;
    $nonansi_obj =~ s/\$U//g;

    # Turn sources into objects.  We use a while loop like this
    # because we might add to @files in the loop.
    while (scalar @files > 0)
    {
	$_ = shift @files;

	# Configure substitutions in _SOURCES variables are errors.
	if (/^\@.*\@$/)
	{
	  my $parent_msg = '';
	  $parent_msg = "\nand is referred to from `$topparent'"
	    if $topparent ne $var->name;
	  err_var ($var,
		   "`" . $var->name . "' includes configure substitution `$_'"
		   . $parent_msg . ";\nconfigure " .
		   "substitutions are not allowed in _SOURCES variables");
	  next;
	}

	# If the source file is in a subdirectory then the `.o' is put
	# into the current directory, unless the subdir-objects option
	# is in effect.

	# Split file name into base and extension.
	next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/;
	my $full = $_;
	my $directory = $1 || '';
	my $base = $2;
	my $extension = $3;

	# We must generate a rule for the object if it requires its own flags.
	my $renamed = 0;
	my ($linker, $object);

	# This records whether we've seen a derived source file (e.g.
	# yacc output).
	my $derived_source = 0;

	# This holds the `aggregate context' of the file we are
	# currently examining.  If the file is compiled with
	# per-object flags, then it will be the name of the object.
	# Otherwise it will be `AM'.  This is used by the target hook
	# language function.
	my $aggregate = 'AM';

	$extension = &derive_suffix ($extension, $nonansi_obj);
	my $lang;
	if ($extension_map{$extension} &&
	    ($lang = $languages{$extension_map{$extension}}))
	{
	    # Found the language, so see what it says.
	    &saw_extension ($extension);

	    # Do we have per-executable flags for this executable?
	    my $have_per_exec_flags = 0;
	    my @peflags = @{$lang->flags};
	    push @peflags, 'LIBTOOLFLAGS' if $nonansi_obj eq '.lo';
	    foreach my $flag (@peflags)
	      {
		if (set_seen ("${derived}_$flag"))
		  {
		    $have_per_exec_flags = 1;
		    last;
		  }
	      }

	    # Note: computed subr call.  The language rewrite function
	    # should return one of the LANG_* constants.  It could
	    # also return a list whose first value is such a constant
	    # and whose second value is a new source extension which
	    # should be applied.  This means this particular language
	    # generates another source file which we must then process
	    # further.
	    my $subr = \&{'lang_' . $lang->name . '_rewrite'};
	    my ($r, $source_extension)
		= &$subr ($directory, $base, $extension,
			  $nonansi_obj, $have_per_exec_flags, $var);
	    # Skip this entry if we were asked not to process it.
	    next if $r == LANG_IGNORE;

	    # Now extract linker and other info.
	    $linker = $lang->linker;

	    my $this_obj_ext;
	    if (defined $source_extension)
	    {
		$this_obj_ext = $source_extension;
		$derived_source = 1;
	    }
	    elsif ($lang->ansi)
	    {
		$this_obj_ext = $obj;
	    }
	    else
	    {
		$this_obj_ext = $nonansi_obj;
	    }
	    $object = $base . $this_obj_ext;

	    if ($have_per_exec_flags)
	    {
		# We have a per-executable flag in effect for this
		# object.  In this case we rewrite the object's
		# name to ensure it is unique.

		# We choose the name `DERIVED_OBJECT' to ensure
		# (1) uniqueness, and (2) continuity between
		# invocations.  However, this will result in a
		# name that is too long for losing systems, in
		# some situations.  So we provide _SHORTNAME to
		# override.

		my $dname = $derived;
		my $var = var ($derived . '_SHORTNAME');
		if ($var)
		{
		    # FIXME: should use the same Condition as
		    # the _SOURCES variable.  But this is really
		    # silly overkill -- nobody should have
		    # conditional shortnames.
		    $dname = $var->variable_value;
		}
		$object = $dname . '-' . $object;

		prog_error ($lang->name . " flags defined without compiler")
		  if ! defined $lang->compile;

		$renamed = 1;
	    }

	    # If rewrite said it was ok, put the object into a
	    # subdir.
	    if ($r == LANG_SUBDIR && $directory ne '')
	    {
		$object = $directory . '/' . $object;
	    }

	    # If the object file has been renamed (because per-target
	    # flags are used) we cannot compile the file with an
	    # inference rule: we need an explicit rule.
	    #
	    # If the source is in a subdirectory and the object is in
	    # the current directory, we also need an explicit rule.
	    #
	    # If both source and object files are in a subdirectory
	    # (this happens when the subdir-objects option is used),
	    # then the inference will work.
	    #
	    # The latter case deserves a historical note.  When the
	    # subdir-objects option was added on 1999-04-11 it was
	    # thought that inferences rules would work for
	    # subdirectory objects too.  Later, on 1999-11-22,
	    # automake was changed to output explicit rules even for
	    # subdir-objects.  Nobody remembers why, but this occurred
	    # soon after the merge of the user-dep-gen-branch so it
	    # might be related.  In late 2003 people complained about
	    # the size of the generated Makefile.ins (libgcj, with
	    # 2200+ subdir objects was reported to have a 9MB
	    # Makefile), so we now rely on inference rules again.
	    # Maybe we'll run across the same issue as in the past,
	    # but at least this time we can document it.  However since
	    # dependency tracking has evolved it is possible that
	    # our old problem no longer exists.
	    # Using inference rules for subdir-objects has been tested
	    # with GNU make, Solaris make, Ultrix make, BSD make,
	    # HP-UX make, and OSF1 make successfully.
	    if ($renamed
		|| ($directory ne '' && ! option 'subdir-objects')
		# We must also use specific rules for a nodist_ source
		# if its language requests it.
		|| ($lang->nodist_specific && ! $transform{'DIST_SOURCE'}))
	    {
		my $obj_sans_ext = substr ($object, 0,
					   - length ($this_obj_ext));
		my $full_ansi;
		if ($directory ne '')
	          {
			$full_ansi = $directory . '/' . $base . $extension;
	          }
		else
	          {
			$full_ansi = $base . $extension;
	          }

		if ($lang->ansi && option 'ansi2knr')
		  {
		    $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/;
		    $obj_sans_ext .= '$U';
		  }

		my @specifics = ($full_ansi, $obj_sans_ext,
				 # Only use $this_obj_ext in the derived
				 # source case because in the other case we
				 # *don't* want $(OBJEXT) to appear here.
				 ($derived_source ? $this_obj_ext : '.o'),
				 $extension);

		# If we renamed the object then we want to use the
		# per-executable flag name.  But if this is simply a
		# subdir build then we still want to use the AM_ flag
		# name.
		if ($renamed)
		  {
		    unshift @specifics, $derived;
		    $aggregate = $derived;
		  }
		else
		  {
		    unshift @specifics, 'AM';
		  }

		# Each item on this list is a reference to a list consisting
		# of four values followed by additional transform flags for
		# file_contents.   The four values are the derived flag prefix
		# (e.g. for `foo_CFLAGS', it is `foo'), the name of the
		# source file, the base name of the output file, and
		# the extension for the object file.
		push (@{$lang_specific_files{$lang->name}},
		      [@specifics, %transform]);
	    }
	}
	elsif ($extension eq $nonansi_obj)
	{
	    # This is probably the result of a direct suffix rule.
	    # In this case we just accept the rewrite.
	    $object = "$base$extension";
	    $object = "$directory/$object" if $directory ne '';
	    $linker = '';
	}
	else
	{
	    # No error message here.  Used to have one, but it was
	    # very unpopular.
	    # FIXME: we could potentially do more processing here,
	    # perhaps treating the new extension as though it were a
	    # new source extension (as above).  This would require
	    # more restructuring than is appropriate right now.
	    next;
	}

	err_am "object `$object' created by `$full' and `$object_map{$object}'"
	  if (defined $object_map{$object}
	      && $object_map{$object} ne $full);

	my $comp_val = (($object =~ /\.lo$/)
			? COMPILE_LIBTOOL : COMPILE_ORDINARY);
	(my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/;
	if (defined $object_compilation_map{$comp_obj}
	    && $object_compilation_map{$comp_obj} != 0
	    # Only see the error once.
	    && ($object_compilation_map{$comp_obj}
		!= (COMPILE_LIBTOOL | COMPILE_ORDINARY))
	    && $object_compilation_map{$comp_obj} != $comp_val)
	  {
	    err_am "object `$comp_obj' created both with libtool and without";
	  }
	$object_compilation_map{$comp_obj} |= $comp_val;

	if (defined $lang)
	{
	    # Let the language do some special magic if required.
	    $lang->target_hook ($aggregate, $object, $full, %transform);
	}

	if ($derived_source)
	  {
	    prog_error ($lang->name . " has automatic dependency tracking")
	      if $lang->autodep ne 'no';
	    # Make sure this new source file is handled next.  That will
	    # make it appear to be at the right place in the list.
	    unshift (@files, $object);
	    # Distribute derived sources unless the source they are
	    # derived from is not.
	    &push_dist_common ($object)
	      unless ($topparent =~ /^(?:nobase_)?nodist_/);
	    next;
	  }

	$linkers_used{$linker} = 1;

	push (@result, $object);

	if (! defined $object_map{$object})
	{
	    my @dep_list = ();
	    $object_map{$object} = $full;

	    # If resulting object is in subdir, we need to make
	    # sure the subdir exists at build time.
	    if ($object =~ /\//)
	    {
		# FIXME: check that $DIRECTORY is somewhere in the
		# project

		# For Java, the way we're handling it right now, a
		# `..' component doesn't make sense.
		if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//)
		  {
		    err_am "`$full' should not contain a `..' component";
		  }

		# Make sure object is removed by `make mostlyclean'.
		$compile_clean_files{$object} = MOSTLY_CLEAN;
		# If we have a libtool object then we also must remove
		# the ordinary .o.
		if ($object =~ /\.lo$/)
		{
		    (my $xobj = $object) =~ s,lo$,\$(OBJEXT),;
		    $compile_clean_files{$xobj} = MOSTLY_CLEAN;

		    # Remove any libtool object in this directory.
		    $libtool_clean_directories{$directory} = 1;
		}

		push (@dep_list, require_build_directory ($directory));

		# If we're generating dependencies, we also want
		# to make sure that the appropriate subdir of the
		# .deps directory is created.
		push (@dep_list,
		      require_build_directory ($directory . '/$(DEPDIR)'))
		  unless option 'no-dependencies';
	    }

	    &pretty_print_rule ($object . ':', "\t", @dep_list)
		if scalar @dep_list > 0;
	}

	# Transform .o or $o file into .P file (for automatic
	# dependency code).
	if ($lang && $lang->autodep ne 'no')
	{
	    my $depfile = $object;
	    $depfile =~ s/\.([^.]*)$/.P$1/;
	    $depfile =~ s/\$\(OBJEXT\)$/o/;
	    $dep_files{dirname ($depfile) . '/$(DEPDIR)/'
			 . basename ($depfile)} = 1;
	}
    }

    return @result;
}


# $LINKER
# define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE,
#                              $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM)
# ---------------------------------------------------------------------------
# Define an _OBJECTS variable for a _SOURCES variable (or subvariable)
#
# Arguments are:
#   $VAR is the name of the _SOURCES variable
#   $OBJVAR is the name of the _OBJECTS variable if known (otherwise
#     it will be generated and returned).
#   $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but
#     work done to determine the linker will be).
#   $ONE_FILE is the canonical (transformed) name of object to build
#   $OBJ is the object extension (i.e. either `.o' or `.lo').
#   $TOPPARENT is the _SOURCES variable being processed.
#   $WHERE context into which this definition is done
#   %TRANSFORM extra arguments to pass to file_contents when producing
#     rules
#
# Result is a pair ($LINKER, $OBJVAR):
#    $LINKER is a boolean, true if a linker is needed to deal with the objects
sub define_objects_from_sources ($$$$$$$%)
{
  my ($var, $objvar, $nodefine, $one_file,
      $obj, $topparent, $where, %transform) = @_;

  my $needlinker = "";

  transform_variable_recursively
    ($var, $objvar, 'am__objects', $nodefine, $where,
     # The transform code to run on each filename.
     sub {
       my ($subvar, $val, $cond, $full_cond) = @_;
       my @trans = handle_single_transform ($subvar, $topparent,
					    $one_file, $obj, $val,
					    %transform);
       $needlinker = "true" if @trans;
       return @trans;
     });

  return $needlinker;
}


# handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM)
# -----------------------------------------------------------------------------
# Handle SOURCE->OBJECT transform for one program or library.
# Arguments are:
#   canonical (transformed) name of target to build
#   actual target of object to build
#   object extension (i.e., either `.o' or `$o')
#   location of the source variable
#   extra arguments to pass to file_contents when producing rules
# Return the name of the linker variable that must be used.
# Empty return means just use `LINK'.
sub handle_source_transform ($$$$%)
{
    # one_file is canonical name.  unxformed is given name.  obj is
    # object extension.
    my ($one_file, $unxformed, $obj, $where, %transform) = @_;

    my $linker = '';

    # No point in continuing if _OBJECTS is defined.
    return if reject_var ($one_file . '_OBJECTS',
			  $one_file . '_OBJECTS should not be defined');

    my %used_pfx = ();
    my $needlinker;
    %linkers_used = ();
    foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
			'dist_EXTRA_', 'nodist_EXTRA_')
    {
	my $varname = $prefix . $one_file . "_SOURCES";
	my $var = var $varname;
	next unless $var;

	# We are going to define _OBJECTS variables using the prefix.
	# Then we glom them all together.  So we can't use the null
	# prefix here as we need it later.
	my $xpfx = ($prefix eq '') ? 'am_' : $prefix;

	# Keep track of which prefixes we saw.
	$used_pfx{$xpfx} = 1
	  unless $prefix =~ /EXTRA_/;

	push @sources, "\$($varname)";
	push @dist_sources, shadow_unconditionally ($varname, $where)
	  unless (option ('no-dist') || $prefix =~ /^nodist_/);

	$needlinker |=
	    define_objects_from_sources ($varname,
					 $xpfx . $one_file . '_OBJECTS',
					 $prefix =~ /EXTRA_/,
					 $one_file, $obj, $varname, $where,
					 DIST_SOURCE => ($prefix !~ /^nodist_/),
					 %transform);
    }
    if ($needlinker)
    {
	$linker ||= &resolve_linker (%linkers_used);
    }

    my @keys = sort keys %used_pfx;
    if (scalar @keys == 0)
    {
	# The default source for libfoo.la is libfoo.c, but for
	# backward compatibility we first look at libfoo_la.c,
	# if no default source suffix is given.
	my $old_default_source = "$one_file.c";
	my $ext_var = var ('AM_DEFAULT_SOURCE_EXT');
	my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c';
	msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most one value")
	  if $default_source_ext =~ /[\t ]/;
	(my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,$default_source_ext,;
	if ($old_default_source ne $default_source
	    && !$ext_var
	    && (rule $old_default_source
		|| rule '$(srcdir)/' . $old_default_source
		|| rule '${srcdir}/' . $old_default_source
		|| -f $old_default_source))
	  {
	    my $loc = $where->clone;
	    $loc->pop_context;
	    msg ('obsolete', $loc,
		 "the default source for `$unxformed' has been changed "
		 . "to `$default_source'.\n(Using `$old_default_source' for "
		 . "backward compatibility.)");
	    $default_source = $old_default_source;
	  }
	# If a rule exists to build this source with a $(srcdir)
	# prefix, use that prefix in our variables too.  This is for
	# the sake of BSD Make.
	if (rule '$(srcdir)/' . $default_source
	    || rule '${srcdir}/' . $default_source)
	  {
	    $default_source = '$(srcdir)/' . $default_source;
	  }

	&define_variable ($one_file . "_SOURCES", $default_source, $where);
	push (@sources, $default_source);
	push (@dist_sources, $default_source);

	%linkers_used = ();
	my (@result) =
	  handle_single_transform ($one_file . '_SOURCES',
				   $one_file . '_SOURCES',
				   $one_file, $obj,
				   $default_source, %transform);
	$linker ||= &resolve_linker (%linkers_used);
	define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result);
    }
    else
    {
	@keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys;
	define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys);
    }

    # If we want to use `LINK' we must make sure it is defined.
    if ($linker eq '')
    {
	$need_link = 1;
    }

    return $linker;
}


# handle_lib_objects ($XNAME, $VAR)
# ---------------------------------
# Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables.
# Also, generate _DEPENDENCIES variable if appropriate.
# Arguments are:
#   transformed name of object being built, or empty string if no object
#   name of _LDADD/_LIBADD-type variable to examine
# Returns 1 if LIBOBJS seen, 0 otherwise.
sub handle_lib_objects
{
  my ($xname, $varname) = @_;

  my $var = var ($varname);
  prog_error "handle_lib_objects: `$varname' undefined"
    unless $var;
  prog_error "handle_lib_objects: unexpected variable name `$varname'"
    unless $varname =~ /^(.*)(?:LIB|LD)ADD$/;
  my $prefix = $1 || 'AM_';

  my $seen_libobjs = 0;
  my $flagvar = 0;

  transform_variable_recursively
    ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES',
     ! $xname, INTERNAL,
     # Transformation function, run on each filename.
     sub {
       my ($subvar, $val, $cond, $full_cond) = @_;

       if ($val =~ /^-/)
	 {
	   # Skip -lfoo and -Ldir silently; these are explicitly allowed.
	   if ($val !~ /^-[lL]/ &&
	       # Skip -dlopen and -dlpreopen; these are explicitly allowed
	       # for Libtool libraries or programs.  (Actually we are a bit
	       # laxe here since this code also applies to non-libtool
	       # libraries or programs, for which -dlopen and -dlopreopen
	       # are pure nonsense.  Diagnosing this doesn't seem very
	       # important: the developer will quickly get complaints from
	       # the linker.)
	       $val !~ /^-dl(?:pre)?open$/ &&
	       # Only get this error once.
	       ! $flagvar)
	     {
	       $flagvar = 1;
	       # FIXME: should display a stack of nested variables
	       # as context when $var != $subvar.
	       err_var ($var, "linker flags such as `$val' belong in "
			. "`${prefix}LDFLAGS");
	     }
	   return ();
	 }
       elsif ($val !~ /^\@.*\@$/)
	 {
	   # Assume we have a file of some sort, and output it into the
	   # dependency variable.  Autoconf substitutions are not output;
	   # rarely is a new dependency substituted into e.g. foo_LDADD
	   # -- but bad things (e.g. -lX11) are routinely substituted.
	   # Note that LIBOBJS and ALLOCA are exceptions to this rule,
	   # and handled specially below.
	   return $val;
	 }
       elsif ($val =~ /^\@(LT)?LIBOBJS\@$/)
	 {
	   handle_LIBOBJS ($subvar, $cond, $1);
	   $seen_libobjs = 1;
	   return $val;
	 }
       elsif ($val =~ /^\@(LT)?ALLOCA\@$/)
	 {
	   handle_ALLOCA ($subvar, $cond, $1);
	   return $val;
	 }
       else
	 {
	   return ();
	 }
     });

  return $seen_libobjs;
}

# handle_LIBOBJS_or_ALLOCA ($VAR)
# -------------------------------
# Definitions common to LIBOBJS and ALLOCA.
# VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA.
sub handle_LIBOBJS_or_ALLOCA ($)
{
  my ($var) = @_;

  my $dir = '';

  # If LIBOBJS files must be built in another directory we have
  # to define LIBOBJDIR and ensure the files get cleaned.
  # Otherwise LIBOBJDIR can be left undefined, and the cleaning
  # is achieved by `rm -f *.$(OBJEXT)' in compile.am.
  if ($config_libobj_dir
      && $relative_dir ne $config_libobj_dir)
    {
      if (option 'subdir-objects')
	{
	  # In the top-level Makefile we do not use $(top_builddir), because
	  # we are already there, and since the targets are built without
	  # a $(top_builddir), it helps BSD Make to match them with
	  # dependencies.
	  $dir = "$config_libobj_dir/" if $config_libobj_dir ne '.';
	  $dir = "$topsrcdir/$dir" if $relative_dir ne '.';
	  define_variable ('LIBOBJDIR', "$dir", INTERNAL);
	  $clean_files{"\$($var)"} = MOSTLY_CLEAN;
	  # If LTLIBOBJS is used, we must also clear LIBOBJS (which might
	  # be created by libtool as a side-effect of creating LTLIBOBJS).
	  $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//;
	}
      else
	{
	  error ("`\$($var)' cannot be used outside `$config_libobj_dir' if"
		 . " `subdir-objects' is not set");
	}
    }

  return $dir;
}

sub handle_LIBOBJS ($$$)
{
  my ($var, $cond, $lt) = @_;
  my $myobjext = $lt ? 'lo' : 'o';
  $lt ||= '';

  $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS')
    if ! keys %libsources;

  my $dir = handle_LIBOBJS_or_ALLOCA "${lt}LIBOBJS";

  foreach my $iter (keys %libsources)
    {
      if ($iter =~ /\.[cly]$/)
	{
	  &saw_extension ($&);
	  &saw_extension ('.c');
	}

      if ($iter =~ /\.h$/)
	{
	  require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
	}
      elsif ($iter ne 'alloca.c')
	{
	  my $rewrite = $iter;
	  $rewrite =~ s/\.c$/.P$myobjext/;
	  $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1;
	  $rewrite = "^" . quotemeta ($iter) . "\$";
	  # Only require the file if it is not a built source.
	  my $bs = var ('BUILT_SOURCES');
	  if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive))
	    {
	      require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
	    }
	}
    }
}

sub handle_ALLOCA ($$$)
{
  my ($var, $cond, $lt) = @_;
  my $myobjext = $lt ? 'lo' : 'o';
  $lt ||= '';
  my $dir = handle_LIBOBJS_or_ALLOCA "${lt}ALLOCA";

  $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA');
  $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1;
  require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c');
  &saw_extension ('.c');
}

# Canonicalize the input parameter
sub canonicalize
{
    my ($string) = @_;
    $string =~ tr/A-Za-z0-9_\@/_/c;
    return $string;
}

# Canonicalize a name, and check to make sure the non-canonical name
# is never used.  Returns canonical name.  Arguments are name and a
# list of suffixes to check for.
sub check_canonical_spelling
{
  my ($name, @suffixes) = @_;

  my $xname = &canonicalize ($name);
  if ($xname ne $name)
    {
      foreach my $xt (@suffixes)
	{
	  reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'");
	}
    }

  return $xname;
}


# handle_compile ()
# -----------------
# Set up the compile suite.
sub handle_compile ()
{
    return
      unless $get_object_extension_was_run;

    # Boilerplate.
    my $default_includes = '';
    if (! option 'nostdinc')
      {
	my @incs = ('-I.', subst ('am__isrc'));

	my $var = var 'CONFIG_HEADER';
	if ($var)
	  {
	    foreach my $hdr (split (' ', $var->variable_value))
	      {
		push @incs, '-I' . dirname ($hdr);
	      }
	  }
	# We want `-I. -I$(srcdir)', but the latter -I is redundant
	# and unaesthetic in non-VPATH builds.  We use `-I.@am__isrc@`
	# instead.  It will be replaced by '-I.' or '-I. -I$(srcdir)'.
	# Items in CONFIG_HEADER are never in $(srcdir) so it is safe
	# to just put @am__isrc@ right after `-I.', without a space.
	($default_includes = ' ' . uniq (@incs)) =~ s/ @/@/;
      }

    my (@mostly_rms, @dist_rms);
    foreach my $item (sort keys %compile_clean_files)
    {
	if ($compile_clean_files{$item} == MOSTLY_CLEAN)
	{
	    push (@mostly_rms, "\t-rm -f $item");
	}
	elsif ($compile_clean_files{$item} == DIST_CLEAN)
	{
	    push (@dist_rms, "\t-rm -f $item");
	}
	else
	{
	  prog_error 'invalid entry in %compile_clean_files';
	}
    }

    my ($coms, $vars, $rules) =
      &file_contents_internal (1, "$libdir/am/compile.am",
			       new Automake::Location,
			       ('DEFAULT_INCLUDES' => $default_includes,
				'MOSTLYRMS' => join ("\n", @mostly_rms),
				'DISTRMS' => join ("\n", @dist_rms)));
    $output_vars .= $vars;
    $output_rules .= "$coms$rules";

    # Check for automatic de-ANSI-fication.
    if (option 'ansi2knr')
      {
	my ($ansi2knr_filename, $ansi2knr_where) = @{option 'ansi2knr'};
	my $ansi2knr_dir = '';

	require_variables ($ansi2knr_where, "option `ansi2knr' is used",
			   TRUE, "ANSI2KNR", "U");

	# topdir is where ansi2knr should be.
	if ($ansi2knr_filename eq 'ansi2knr')
	  {
	    # Only require ansi2knr files if they should appear in
	    # this directory.
	    require_file ($ansi2knr_where, FOREIGN,
			  'ansi2knr.c', 'ansi2knr.1');

	    # ansi2knr needs to be built before subdirs, so unshift it.
	    unshift (@all, '$(ANSI2KNR)');
	  }
	else
	  {
	    $ansi2knr_dir = dirname ($ansi2knr_filename);
	  }

	$output_rules .= &file_contents ('ansi2knr',
					 new Automake::Location,
					 'ANSI2KNR-DIR' => $ansi2knr_dir);

    }
}

# handle_libtool ()
# -----------------
# Handle libtool rules.
sub handle_libtool
{
  return unless var ('LIBTOOL');

  # Libtool requires some files, but only at top level.
  # (Starting with Libtool 2.0 we do not have to bother.  These
  # requirements are done with AC_REQUIRE_AUX_FILE.)
  require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files)
    if $relative_dir eq '.' && ! $libtool_new_api;

  my @libtool_rms;
  foreach my $item (sort keys %libtool_clean_directories)
    {
      my $dir = ($item eq '.') ? '' : "$item/";
      # .libs is for Unix, _libs for DOS.
      push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs");
    }

  check_user_variables 'LIBTOOLFLAGS';

  # Output the libtool compilation rules.
  $output_rules .= &file_contents ('libtool',
				   new Automake::Location,
				   LTRMS => join ("\n", @libtool_rms));
}

# handle_programs ()
# ------------------
# Handle C programs.
sub handle_programs
{
  my @proglist = &am_install_var ('progs', 'PROGRAMS',
				  'bin', 'sbin', 'libexec', 'pkglib',
				  'noinst', 'check');
  return if ! @proglist;

  my $seen_global_libobjs =
    var ('LDADD') && &handle_lib_objects ('', 'LDADD');

  foreach my $pair (@proglist)
    {
      my ($where, $one_file) = @$pair;

      my $seen_libobjs = 0;
      my $obj = get_object_extension '.$(OBJEXT)';

      $known_programs{$one_file} = $where;

      # Canonicalize names and check for misspellings.
      my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
					     '_SOURCES', '_OBJECTS',
					     '_DEPENDENCIES');

      $where->push_context ("while processing program `$one_file'");
      $where->set (INTERNAL->get);

      my $linker = &handle_source_transform ($xname, $one_file, $obj, $where,
					     NONLIBTOOL => 1, LIBTOOL => 0);

      if (var ($xname . "_LDADD"))
	{
	  $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD');
	}
      else
	{
	  # User didn't define prog_LDADD override.  So do it.
	  &define_variable ($xname . '_LDADD', '$(LDADD)', $where);

	  # This does a bit too much work.  But we need it to
	  # generate _DEPENDENCIES when appropriate.
	  if (var ('LDADD'))
	    {
	      $seen_libobjs = &handle_lib_objects ($xname, 'LDADD');
	    }
	}

      reject_var ($xname . '_LIBADD',
		  "use `${xname}_LDADD', not `${xname}_LIBADD'");

      set_seen ($xname . '_DEPENDENCIES');
      set_seen ($xname . '_LDFLAGS');

      # Determine program to use for link.
      my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xname);
      $vlink = verbose_flag ($vlink || 'GEN');

      # If the resulting program lies into a subdirectory,
      # make sure this directory will exist.
      my $dirstamp = require_build_directory_maybe ($one_file);

      $libtool_clean_directories{dirname ($one_file)} = 1;

      $output_rules .= &file_contents ('program',
				       $where,
				       PROGRAM  => $one_file,
				       XPROGRAM => $xname,
				       XLINK    => $xlink,
				       VERBOSE  => $vlink,
				       DIRSTAMP => $dirstamp,
				       EXEEXT   => '$(EXEEXT)');

      if ($seen_libobjs || $seen_global_libobjs)
	{
	  if (var ($xname . '_LDADD'))
	    {
	      &check_libobjs_sources ($xname, $xname . '_LDADD');
	    }
	  elsif (var ('LDADD'))
	    {
	      &check_libobjs_sources ($xname, 'LDADD');
	    }
	}
    }
}


# handle_libraries ()
# -------------------
# Handle libraries.
sub handle_libraries
{
  my @liblist = &am_install_var ('libs', 'LIBRARIES',
				 'lib', 'pkglib', 'noinst', 'check');
  return if ! @liblist;

  my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
				    'noinst', 'check');

  if (@prefix)
    {
      my $var = rvar ($prefix[0] . '_LIBRARIES');
      $var->requires_variables ('library used', 'RANLIB');
    }

  &define_variable ('AR', 'ar', INTERNAL);
  &define_variable ('ARFLAGS', 'cru', INTERNAL);
  &define_verbose_tagvar ('AR');

  foreach my $pair (@liblist)
    {
      my ($where, $onelib) = @$pair;

      my $seen_libobjs = 0;
      # Check that the library fits the standard naming convention.
      my $bn = basename ($onelib);
      if ($bn !~ /^lib.*\.a$/)
	{
	  $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/;
	  my $suggestion = dirname ($onelib) . "/$bn";
	  $suggestion =~ s|^\./||g;
	  msg ('error-gnu/warn', $where,
	       "`$onelib' is not a standard library name\n"
	       . "did you mean `$suggestion'?")
	}

      ($known_libraries{$onelib} = $bn) =~ s/\.a$//;

      $where->push_context ("while processing library `$onelib'");
      $where->set (INTERNAL->get);

      my $obj = get_object_extension '.$(OBJEXT)';

      # Canonicalize names and check for misspellings.
      my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
					    '_OBJECTS', '_DEPENDENCIES',
					    '_AR');

      if (! var ($xlib . '_AR'))
	{
	  &define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where);
	}

      # Generate support for conditional object inclusion in
      # libraries.
      if (var ($xlib . '_LIBADD'))
	{
	  if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
	    {
	      $seen_libobjs = 1;
	    }
	}
      else
	{
	  &define_variable ($xlib . "_LIBADD", '', $where);
	}

      reject_var ($xlib . '_LDADD',
		  "use `${xlib}_LIBADD', not `${xlib}_LDADD'");

      # Make sure we at look at this.
      set_seen ($xlib . '_DEPENDENCIES');

      &handle_source_transform ($xlib, $onelib, $obj, $where,
				NONLIBTOOL => 1, LIBTOOL => 0);

      # If the resulting library lies into a subdirectory,
      # make sure this directory will exist.
      my $dirstamp = require_build_directory_maybe ($onelib);
      my $verbose = verbose_flag ('AR');
      my $silent = silent_flag ();

      $output_rules .= &file_contents ('library',
				       $where,
				       VERBOSE  => $verbose,
				       SILENT   => $silent,
				       LIBRARY  => $onelib,
				       XLIBRARY => $xlib,
				       DIRSTAMP => $dirstamp);

      if ($seen_libobjs)
	{
	  if (var ($xlib . '_LIBADD'))
	    {
	      &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
	    }
	}
    }
}


# handle_ltlibraries ()
# ---------------------
# Handle shared libraries.
sub handle_ltlibraries
{
  my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES',
				 'noinst', 'lib', 'pkglib', 'check');
  return if ! @liblist;

  my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
				    'noinst', 'check');

  if (@prefix)
    {
      my $var = rvar ($prefix[0] . '_LTLIBRARIES');
      $var->requires_variables ('Libtool library used', 'LIBTOOL');
    }

  my %instdirs = ();
  my %instsubdirs = ();
  my %instconds = ();
  my %liblocations = ();	# Location (in Makefile.am) of each library.

  foreach my $key (@prefix)
    {
      # Get the installation directory of each library.
      my $dir = $key;
      my $strip_subdir = 1;
      if ($dir =~ /^nobase_/)
        {
	  $dir =~ s/^nobase_//;
	  $strip_subdir = 0;
	}
      my $var = rvar ($key . '_LTLIBRARIES');

      # We reject libraries which are installed in several places
      # in the same condition, because we can only specify one
      # `-rpath' option.
      $var->traverse_recursively
	(sub
	 {
	   my ($var, $val, $cond, $full_cond) = @_;
	   my $hcond = $full_cond->human;
	   my $where = $var->rdef ($cond)->location;
	   my $ldir = '';
	   $ldir = '/' . dirname ($val)
	     if (!$strip_subdir);
	   # A library cannot be installed in different directories
	   # in overlapping conditions.
	   if (exists $instconds{$val})
	     {
	       my ($msg, $acond) =
		 $instconds{$val}->ambiguous_p ($val, $full_cond);

	       if ($msg)
		 {
		   error ($where, $msg, partial => 1);
		   my $dirtxt = "installed " . ($strip_subdir ? "in" : "below") . " `$dir'";
		   $dirtxt = "built for `$dir'"
		     if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check';
		   my $dircond =
		     $full_cond->true ? "" : " in condition $hcond";

		   error ($where, "`$val' should be $dirtxt$dircond ...",
			  partial => 1);

		   my $hacond = $acond->human;
		   my $adir = $instdirs{$val}{$acond};
		   my $adirtxt = "installed in `$adir'";
		   $adirtxt = "built for `$adir'"
		     if ($adir eq 'EXTRA' || $adir eq 'noinst'
			 || $adir eq 'check');
		   my $adircond = $acond->true ? "" : " in condition $hacond";

		   my $onlyone = ($dir ne $adir) ?
		     ("\nLibtool libraries can be built for only one "
		      . "destination.") : "";

		   error ($liblocations{$val}{$acond},
			  "... and should also be $adirtxt$adircond.$onlyone");
		   return;
		 }
	     }
	   else
	     {
	       $instconds{$val} = new Automake::DisjConditions;
	     }
	   $instdirs{$val}{$full_cond} = $dir;
	   $instsubdirs{$val}{$full_cond} = $ldir;
	   $liblocations{$val}{$full_cond} = $where;
	   $instconds{$val} = $instconds{$val}->merge ($full_cond);
	 },
	 sub
	 {
	   return ();
	 },
	 skip_ac_subst => 1);
    }

  foreach my $pair (@liblist)
    {
      my ($where, $onelib) = @$pair;

      my $seen_libobjs = 0;
      my $obj = get_object_extension '.lo';

      # Canonicalize names and check for misspellings.
      my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
					    '_SOURCES', '_OBJECTS',
					    '_DEPENDENCIES');

      # Check that the library fits the standard naming convention.
      my $libname_rx = '^lib.*\.la';
      my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS');
      my $ldvar2 = var ('LDFLAGS');
      if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive))
	  || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive)))
	{
	  # Relax name checking for libtool modules.
	  $libname_rx = '\.la';
	}

      my $bn = basename ($onelib);
      if ($bn !~ /$libname_rx$/)
	{
	  my $type = 'library';
	  if ($libname_rx eq '\.la')
	    {
	      $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/;
	      $type = 'module';
	    }
	  else
	    {
	      $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/;
	    }
	  my $suggestion = dirname ($onelib) . "/$bn";
	  $suggestion =~ s|^\./||g;
	  msg ('error-gnu/warn', $where,
	       "`$onelib' is not a standard libtool $type name\n"
	       . "did you mean `$suggestion'?")
	}

      ($known_libraries{$onelib} = $bn) =~ s/\.la$//;

      $where->push_context ("while processing Libtool library `$onelib'");
      $where->set (INTERNAL->get);

      # Make sure we look at these.
      set_seen ($xlib . '_LDFLAGS');
      set_seen ($xlib . '_DEPENDENCIES');

      # Generate support for conditional object inclusion in
      # libraries.
      if (var ($xlib . '_LIBADD'))
	{
	  if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
	    {
	      $seen_libobjs = 1;
	    }
	}
      else
	{
	  &define_variable ($xlib . "_LIBADD", '', $where);
	}

      reject_var ("${xlib}_LDADD",
		  "use `${xlib}_LIBADD', not `${xlib}_LDADD'");


      my $linker = &handle_source_transform ($xlib, $onelib, $obj, $where,
					     NONLIBTOOL => 0, LIBTOOL => 1);

      # Determine program to use for link.
      my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xlib);
      $vlink = verbose_flag ($vlink || 'GEN');

      my $rpathvar = "am_${xlib}_rpath";
      my $rpath = "\$($rpathvar)";
      foreach my $rcond ($instconds{$onelib}->conds)
	{
	  my $val;
	  if ($instdirs{$onelib}{$rcond} eq 'EXTRA'
	      || $instdirs{$onelib}{$rcond} eq 'noinst'
	      || $instdirs{$onelib}{$rcond} eq 'check')
	    {
	      # It's an EXTRA_ library, so we can't specify -rpath,
	      # because we don't know where the library will end up.
	      # The user probably knows, but generally speaking automake
	      # doesn't -- and in fact configure could decide
	      # dynamically between two different locations.
	      $val = '';
	    }
	  else
	    {
	      $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)');
	      $val .= $instsubdirs{$onelib}{$rcond}
	        if defined $instsubdirs{$onelib}{$rcond};
	    }
	  if ($rcond->true)
	    {
	      # If $rcond is true there is only one condition and
	      # there is no point defining an helper variable.
	      $rpath = $val;
	    }
	  else
	    {
	      define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val);
	    }
	}

      # If the resulting library lies into a subdirectory,
      # make sure this directory will exist.
      my $dirstamp = require_build_directory_maybe ($onelib);

      # Remember to cleanup .libs/ in this directory.
      my $dirname = dirname $onelib;
      $libtool_clean_directories{$dirname} = 1;

      $output_rules .= &file_contents ('ltlibrary',
				       $where,
				       LTLIBRARY  => $onelib,
				       XLTLIBRARY => $xlib,
				       RPATH      => $rpath,
				       XLINK      => $xlink,
				       VERBOSE    => $vlink,
				       DIRSTAMP   => $dirstamp);
      if ($seen_libobjs)
	{
	  if (var ($xlib . '_LIBADD'))
	    {
	      &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
	    }
	}
    }
}

# See if any _SOURCES variable were misspelled.
sub check_typos ()
{
  # It is ok if the user sets this particular variable.
  set_seen 'AM_LDFLAGS';

  foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES')
    {
      foreach my $var (variables $primary)
	{
	  my $varname = $var->name;
	  # A configure variable is always legitimate.
	  next if exists $configure_vars{$varname};

	  for my $cond ($var->conditions->conds)
	    {
	      $varname =~ /^(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/;
	      msg_var ('syntax', $var, "variable `$varname' is defined but no"
		       . " program or\nlibrary has `$1' as canonical name"
		       . " (possible typo)")
		unless $var->rdef ($cond)->seen;
	    }
	}
    }
}


# Handle scripts.
sub handle_scripts
{
    # NOTE we no longer automatically clean SCRIPTS, because it is
    # useful to sometimes distribute scripts verbatim.  This happens
    # e.g. in Automake itself.
    &am_install_var ('-candist', 'scripts', 'SCRIPTS',
		     'bin', 'sbin', 'libexec', 'pkgdata',
		     'noinst', 'check');
}




## ------------------------ ##
## Handling Texinfo files.  ##
## ------------------------ ##

# ($OUTFILE, $VFILE, @CLEAN_FILES)
# &scan_texinfo_file ($FILENAME)
# ------------------------------
# $OUTFILE     - name of the info file produced by $FILENAME.
# $VFILE       - name of the version.texi file used (undef if none).
# @CLEAN_FILES - list of byproducts (indexes etc.)
sub scan_texinfo_file ($)
{
  my ($filename) = @_;

  # Some of the following extensions are always created, no matter
  # whether indexes are used or not.  Other (like cps, fns, ... pgs)
  # are only created when they are used.  We used to scan $FILENAME
  # for their use, but that is not enough: they could be used in
  # included files.  We can't scan included files because we don't
  # know the include path.  Therefore we always erase these files, no
  # matter whether they are used or not.
  #
  # (tmp is only created if an @macro is used and a certain e-TeX
  # feature is not available.)
  my %clean_suffixes =
    map { $_ => 1 } (qw(aux log toc tmp
			cp cps
			fn fns
			ky kys
			vr vrs
			tp tps
			pg pgs)); # grep 'new.*index' texinfo.tex

  my $texi = new Automake::XFile "< $filename";
  verb "reading $filename";

  my ($outfile, $vfile);
  while ($_ = $texi->getline)
    {
      if (/^\@setfilename +(\S+)/)
	{
	  # Honor only the first @setfilename.  (It's possible to have
	  # more occurrences later if the manual shows examples of how
	  # to use @setfilename...)
	  next if $outfile;

	  $outfile = $1;
	  if ($outfile =~ /\.([^.]+)$/ && $1 ne 'info')
	    {
	      error ("$filename:$.",
		     "output `$outfile' has unrecognized extension");
	      return;
	    }
	}
      # A "version.texi" file is actually any file whose name matches
      # "vers*.texi".
      elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/)
	{
	  $vfile = $1;
	}

      # Try to find new or unused indexes.

      # Creating a new category of index.
      elsif (/^\@def(code)?index (\w+)/)
	{
	  $clean_suffixes{$2} = 1;
	  $clean_suffixes{"$2s"} = 1;
	}

      # Merging an index into an another.
      elsif (/^\@syn(code)?index (\w+) (\w+)/)
	{
	  delete $clean_suffixes{"$2s"};
	  $clean_suffixes{"$3s"} = 1;
	}

    }

  if (! $outfile)
    {
      err_am "`$filename' missing \@setfilename";
      return;
    }

  my $infobase = basename ($filename);
  $infobase =~ s/\.te?xi(nfo)?$//;
  return ($outfile, $vfile,
	  map { "$infobase.$_" } (sort keys %clean_suffixes));
}


# ($DIRSTAMP, @CLEAN_FILES)
# output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES)
# ------------------------------------------------------------------
# SOURCE - the source Texinfo file
# DEST - the destination Info file
# INSRC - wether DEST should be built in the source tree
# DEPENDENCIES - known dependencies
sub output_texinfo_build_rules ($$$@)
{
  my ($source, $dest, $insrc, @deps) = @_;

  # Split `a.texi' into `a' and `.texi'.
  my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/);
  my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/);

  $ssfx ||= "";
  $dsfx ||= "";

  # We can output two kinds of rules: the "generic" rules use Make
  # suffix rules and are appropriate when $source and $dest do not lie
  # in a sub-directory; the "specific" rules are needed in the other
  # case.
  #
  # The former are output only once (this is not really apparent here,
  # but just remember that some logic deeper in Automake will not
  # output the same rule twice); while the later need to be output for
  # each Texinfo source.
  my $generic;
  my $makeinfoflags;
  my $sdir = dirname $source;
  if ($sdir eq '.' && dirname ($dest) eq '.')
    {
      $generic = 1;
      $makeinfoflags = '-I $(srcdir)';
    }
  else
    {
      $generic = 0;
      $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir";
    }

  # A directory can contain two kinds of info files: some built in the
  # source tree, and some built in the build tree.  The rules are
  # different in each case.  However we cannot output two different
  # set of generic rules.  Because in-source builds are more usual, we
  # use generic rules in this case and fall back to "specific" rules
  # for build-dir builds.  (It should not be a problem to invert this
  # if needed.)
  $generic = 0 unless $insrc;

  # We cannot use a suffix rule to build info files with an empty
  # extension.  Otherwise we would output a single suffix inference
  # rule, with separate dependencies, as in
  #
  #    .texi:
  #             $(MAKEINFO) ...
  #    foo.info: foo.texi
  #
  # which confuse Solaris make.  (See the Autoconf manual for
  # details.)  Therefore we use a specific rule in this case.  This
  # applies to info files only (dvi and pdf files always have an
  # extension).
  my $generic_info = ($generic && $dsfx) ? 1 : 0;

  # If the resulting file lie into a subdirectory,
  # make sure this directory will exist.
  my $dirstamp = require_build_directory_maybe ($dest);

  my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx;

  $output_rules .= file_contents ('texibuild',
				  new Automake::Location,
				  DEPS             => "@deps",
				  DEST_PREFIX      => $dpfx,
				  DEST_INFO_PREFIX => $dipfx,
				  DEST_SUFFIX      => $dsfx,
				  DIRSTAMP         => $dirstamp,
				  GENERIC          => $generic,
				  GENERIC_INFO     => $generic_info,
				  INSRC		   => $insrc,
				  MAKEINFOFLAGS    => $makeinfoflags,
				  SOURCE           => ($generic
						       ? '$<' : $source),
				  SOURCE_INFO      => ($generic_info
						       ? '$<' : $source),
				  SOURCE_REAL      => $source,
				  SOURCE_SUFFIX    => $ssfx,
				  );
  return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html");
}


# ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN)
# handle_texinfo_helper ($info_texinfos)
# --------------------------------------
# Handle all Texinfo source; helper for handle_texinfo.
sub handle_texinfo_helper ($)
{
  my ($info_texinfos) = @_;
  my (@infobase, @info_deps_list, @texi_deps);
  my %versions;
  my $done = 0;
  my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', '');

  # Build a regex matching user-cleaned files.
  my $d = var 'DISTCLEANFILES';
  my $c = var 'CLEANFILES';
  my @f = ();
  push @f, $d->value_as_list_recursive (inner_expand => 1) if $d;
  push @f, $c->value_as_list_recursive (inner_expand => 1) if $c;
  @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f;
  my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$';

  foreach my $texi
      ($info_texinfos->value_as_list_recursive (inner_expand => 1))
    {
      my $infobase = $texi;
      $infobase =~ s/\.(txi|texinfo|texi)$//;

      if ($infobase eq $texi)
	{
	  # FIXME: report line number.
	  err_am "texinfo file `$texi' has unrecognized extension";
	  next;
	}

      push @infobase, $infobase;

      # If 'version.texi' is referenced by input file, then include
      # automatic versioning capability.
      my ($out_file, $vtexi, @clean_files) =
	scan_texinfo_file ("$relative_dir/$texi")
	or next;
      push (@mostly_cleans, @clean_files);

      # If the Texinfo source is in a subdirectory, create the
      # resulting info in this subdirectory.  If it is in the current
      # directory, try hard to not prefix "./" because it breaks the
      # generic rules.
      my $outdir = dirname ($texi) . '/';
      $outdir = "" if $outdir eq './';
      $out_file =  $outdir . $out_file;

      # Until Automake 1.6.3, .info files were built in the
      # source tree.  This was an obstacle to the support of
      # non-distributed .info files, and non-distributed .texi
      # files.
      #
      # * Non-distributed .texi files is important in some packages
      #   where .texi files are built at make time, probably using
      #   other binaries built in the package itself, maybe using
      #   tools or information found on the build host.  Because
      #   these files are not distributed they are always rebuilt
      #   at make time; they should therefore not lie in the source
      #   directory.  One plan was to support this using
      #   nodist_info_TEXINFOS or something similar.  (Doing this
      #   requires some sanity checks.  For instance Automake should
      #   not allow:
      #      dist_info_TEXINFOS = foo.texi
      #      nodist_foo_TEXINFOS = included.texi
      #   because a distributed file should never depend on a
      #   non-distributed file.)
      #
      # * If .texi files are not distributed, then .info files should
      #   not be distributed either.  There are also cases where one
      #   wants to distribute .texi files, but does not want to
      #   distribute the .info files.  For instance the Texinfo package
      #   distributes the tool used to build these files; it would
      #   be a waste of space to distribute them.  It's not clear
      #   which syntax we should use to indicate that .info files should
      #   not be distributed.  Akim Demaille suggested that eventually
      #   we switch to a new syntax:
      #   |  Maybe we should take some inspiration from what's already
      #   |  done in the rest of Automake.  Maybe there is too much
      #   |  syntactic sugar here, and you want
      #   |     nodist_INFO = bar.info
      #   |     dist_bar_info_SOURCES = bar.texi
      #   |     bar_texi_DEPENDENCIES = foo.texi
      #   |  with a bit of magic to have bar.info represent the whole
      #   |  bar*info set.  That's a lot more verbose that the current
      #   |  situation, but it is # not new, hence the user has less
      #   |  to learn.
      #	  |
      #   |  But there is still too much room for meaningless specs:
      #   |     nodist_INFO = bar.info
      #   |     dist_bar_info_SOURCES = bar.texi
      #   |     dist_PS = bar.ps something-written-by-hand.ps
      #   |     nodist_bar_ps_SOURCES = bar.texi
      #   |     bar_texi_DEPENDENCIES = foo.texi
      #   |  here bar.texi is dist_ in line 2, and nodist_ in 4.
      #
      # Back to the point, it should be clear that in order to support
      # non-distributed .info files, we need to build them in the
      # build tree, not in the source tree (non-distributed .texi
      # files are less of a problem, because we do not output build
      # rules for them).  In Automake 1.7 .info build rules have been
      # largely cleaned up so that .info files get always build in the
      # build tree, even when distributed.  The idea was that
      #   (1) if during a VPATH build the .info file was found to be
      #       absent or out-of-date (in the source tree or in the
      #       build tree), Make would rebuild it in the build tree.
      #       If an up-to-date source-tree of the .info file existed,
      #       make would not rebuild it in the build tree.
      #   (2) having two copies of .info files, one in the source tree
      #       and one (newer) in the build tree is not a problem
      #       because `make dist' always pick files in the build tree
      #       first.
      # However it turned out the be a bad idea for several reasons:
      #   * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave
      #     like GNU Make on point (1) above.  These implementations
      #     of Make would always rebuild .info files in the build
      #     tree, even if such files were up to date in the source
      #     tree.  Consequently, it was impossible to perform a VPATH
      #     build of a package containing Texinfo files using these
      #     Make implementations.
      #     (Refer to the Autoconf Manual, section "Limitation of
      #     Make", paragraph "VPATH", item "target lookup", for
      #     an account of the differences between these
      #     implementations.)
      #   * The GNU Coding Standards require these files to be built
      #     in the source-tree (when they are distributed, that is).
      #   * Keeping a fresher copy of distributed files in the
      #     build tree can be annoying during development because
      #     - if the files is kept under CVS, you really want it
      #       to be updated in the source tree
      #     - it is confusing that `make distclean' does not erase
      #       all files in the build tree.
      #
      # Consequently, starting with Automake 1.8, .info files are
      # built in the source tree again.  Because we still plan to
      # support non-distributed .info files at some point, we
      # have a single variable ($INSRC) that controls whether
      # the current .info file must be built in the source tree
      # or in the build tree.  Actually this variable is switched
      # off for .info files that appear to be cleaned; this is
      # for backward compatibility with package such as Texinfo,
      # which do things like
      #   info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
      #   DISTCLEANFILES = texinfo texinfo-* info*.info*
      #   # Do not create info files for distribution.
      #   dist-info:
      # in order not to distribute .info files.
      my $insrc = ($out_file =~ $user_cleaned_files) ? 0 : 1;

      my $soutdir = '$(srcdir)/' . $outdir;
      $outdir = $soutdir if $insrc;

      # If user specified file_TEXINFOS, then use that as explicit
      # dependency list.
      @texi_deps = ();
      push (@texi_deps, "$soutdir$vtexi") if $vtexi;

      my $canonical = canonicalize ($infobase);
      if (var ($canonical . "_TEXINFOS"))
	{
	  push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
	  push_dist_common ('$(' . $canonical . '_TEXINFOS)');
	}

      my ($dirstamp, @cfiles) =
	output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps);
      push (@texi_cleans, @cfiles);

      push (@info_deps_list, $out_file);

      # If a vers*.texi file is needed, emit the rule.
      if ($vtexi)
	{
	  err_am ("`$vtexi', included in `$texi', "
		  . "also included in `$versions{$vtexi}'")
	    if defined $versions{$vtexi};
	  $versions{$vtexi} = $texi;

	  # We number the stamp-vti files.  This is doable since the
	  # actual names don't matter much.  We only number starting
	  # with the second one, so that the common case looks nice.
	  my $vti = ($done ? $done : 'vti');
	  ++$done;

	  # This is ugly, but it is our historical practice.
	  if ($config_aux_dir_set_in_configure_ac)
	    {
	      require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
					    'mdate-sh');
	    }
	  else
	    {
	      require_file_with_macro (TRUE, 'info_TEXINFOS',
				       FOREIGN, 'mdate-sh');
	    }

	  my $conf_dir;
	  if ($config_aux_dir_set_in_configure_ac)
	    {
	      $conf_dir = "$am_config_aux_dir/";
	    }
	  else
	    {
	      $conf_dir = '$(srcdir)/';
	    }
	  $output_rules .= file_contents ('texi-vers',
					  new Automake::Location,
					  TEXI     => $texi,
					  VTI      => $vti,
					  STAMPVTI => "${soutdir}stamp-$vti",
					  VTEXI    => "$soutdir$vtexi",
					  MDDIR    => $conf_dir,
					  DIRSTAMP => $dirstamp);
	}
    }

  # Handle location of texinfo.tex.
  my $need_texi_file = 0;
  my $texinfodir;
  if (var ('TEXINFO_TEX'))
    {
      # The user defined TEXINFO_TEX so assume he knows what he is
      # doing.
      $texinfodir = ('$(srcdir)/'
		     . dirname (variable_value ('TEXINFO_TEX')));
    }
  elsif (option 'cygnus')
    {
      $texinfodir = '$(top_srcdir)/../texinfo';
      define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
    }
  elsif ($config_aux_dir_set_in_configure_ac)
    {
      $texinfodir = $am_config_aux_dir;
      define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
      $need_texi_file = 2; # so that we require_conf_file later
    }
  else
    {
      $texinfodir = '$(srcdir)';
      $need_texi_file = 1;
    }
  define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL);

  push (@dist_targets, 'dist-info');

  if (! option 'no-installinfo')
    {
      # Make sure documentation is made and installed first.  Use
      # $(INFO_DEPS), not 'info', because otherwise recursive makes
      # get run twice during "make all".
      unshift (@all, '$(INFO_DEPS)');
    }

  define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL);
  define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL);
  define_files_variable ("PSS", @infobase, 'ps', INTERNAL);
  define_files_variable ("HTMLS", @infobase, 'html', INTERNAL);

  # This next isn't strictly needed now -- the places that look here
  # could easily be changed to look in info_TEXINFOS.  But this is
  # probably better, in case noinst_TEXINFOS is ever supported.
  define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL);

  # Do some error checking.  Note that this file is not required
  # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly
  # up above.
  if ($need_texi_file && ! option 'no-texinfo.tex')
    {
      if ($need_texi_file > 1)
	{
	  require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
					'texinfo.tex');
	}
      else
	{
	  require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
				   'texinfo.tex');
	}
    }

  return (makefile_wrap ("", "\t  ", @mostly_cleans),
	  makefile_wrap ("", "\t  ", @texi_cleans),
	  makefile_wrap ("", "\t  ", @maint_cleans));
}


# handle_texinfo ()
# -----------------
# Handle all Texinfo source.
sub handle_texinfo ()
{
  reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'";
  # FIXME: I think this is an obsolete future feature name.
  reject_var 'html_TEXINFOS', "HTML generation not yet supported";

  my $info_texinfos = var ('info_TEXINFOS');
  my ($mostlyclean, $clean, $maintclean) = ('', '', '');
  if ($info_texinfos)
    {
      ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos);
      chomp $mostlyclean;
      chomp $clean;
      chomp $maintclean;
    }

  $output_rules .=  file_contents ('texinfos',
				   new Automake::Location,
				   MOSTLYCLEAN   => $mostlyclean,
				   TEXICLEAN     => $clean,
				   MAINTCLEAN    => $maintclean,
				   'LOCAL-TEXIS' => !!$info_texinfos);
}


# Handle any man pages.
sub handle_man_pages
{
  reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'";

  # Find all the sections in use.  We do this by first looking for
  # "standard" sections, and then looking for any additional
  # sections used in man_MANS.
  my (%sections, %notrans_sections, %trans_sections,
      %notrans_vars, %trans_vars, %notrans_sect_vars, %trans_sect_vars);
  # We handle nodist_ for uniformity.  man pages aren't distributed
  # by default so it isn't actually very important.
  foreach my $npfx ('', 'notrans_')
    {
      foreach my $pfx ('', 'dist_', 'nodist_')
	{
	  # Add more sections as needed.
	  foreach my $section ('0'..'9', 'n', 'l')
	    {
	      my $varname = $npfx . $pfx . 'man' . $section . '_MANS';
	      if (var ($varname))
		{
		  $sections{$section} = 1;
		  $varname = '$(' . $varname . ')';
		  if ($npfx eq 'notrans_')
		    {
		      $notrans_sections{$section} = 1;
		      $notrans_sect_vars{$varname} = 1;
		    }
		  else
		    {
		      $trans_sections{$section} = 1;
		      $trans_sect_vars{$varname} = 1;
		    }

		  &push_dist_common ($varname)
		    if $pfx eq 'dist_';
		}
	    }

	  my $varname = $npfx . $pfx . 'man_MANS';
	  my $var = var ($varname);
	  if ($var)
	    {
	      foreach ($var->value_as_list_recursive)
		{
		  # A page like `foo.1c' goes into man1dir.
		  if (/\.([0-9a-z])([a-z]*)$/)
		    {
		      $sections{$1} = 1;
		      if ($npfx eq 'notrans_')
			{
			  $notrans_sections{$1} = 1;
			}
		      else
			{
			  $trans_sections{$1} = 1;
			}
		    }
		}

	      $varname = '$(' . $varname . ')';
	      if ($npfx eq 'notrans_')
		{
		  $notrans_vars{$varname} = 1;
		}
	      else
		{
		  $trans_vars{$varname} = 1;
		}
	      &push_dist_common ($varname)
		if $pfx eq 'dist_';
	    }
	}
    }

  return unless %sections;

  my @unsorted_deps;

  # Build section independent variables.
  my $have_notrans = %notrans_vars;
  my @notrans_list = sort keys %notrans_vars;
  my $have_trans = %trans_vars;
  my @trans_list = sort keys %trans_vars;

  # Now for each section, generate an install and uninstall rule.
  # Sort sections so output is deterministic.
  foreach my $section (sort keys %sections)
    {
      # Build section dependent variables.
      my $notrans_mans = $have_notrans || exists $notrans_sections{$section};
      my $trans_mans = $have_trans || exists $trans_sections{$section};
      my (%notrans_this_sect, %trans_this_sect);
      my $expr = 'man' . $section . '_MANS';
      foreach my $varname (keys %notrans_sect_vars)
	{
	  if ($varname =~ /$expr/)
	    {
	      $notrans_this_sect{$varname} = 1;
	    }
	}
      foreach my $varname (keys %trans_sect_vars)
	{
	  if ($varname =~ /$expr/)
	    {
	      $trans_this_sect{$varname} = 1;
	    }
	}
      my @notrans_sect_list = sort keys %notrans_this_sect;
      my @trans_sect_list = sort keys %trans_this_sect;
      @unsorted_deps = (keys %notrans_vars, keys %trans_vars,
                        keys %notrans_this_sect, keys %trans_this_sect);
      my @deps = sort @unsorted_deps;
      $output_rules .= &file_contents ('mans',
				       new Automake::Location,
				       SECTION           => $section,
				       DEPS              => "@deps",
				       NOTRANS_MANS      => $notrans_mans,
				       NOTRANS_SECT_LIST => "@notrans_sect_list",
				       HAVE_NOTRANS      => $have_notrans,
				       NOTRANS_LIST      => "@notrans_list",
				       TRANS_MANS        => $trans_mans,
				       TRANS_SECT_LIST   => "@trans_sect_list",
				       HAVE_TRANS        => $have_trans,
				       TRANS_LIST        => "@trans_list");
    }

  @unsorted_deps  = (keys %notrans_vars, keys %trans_vars,
                     keys %notrans_sect_vars, keys %trans_sect_vars);
  my @mans = sort @unsorted_deps;
  $output_vars .= file_contents ('mans-vars',
				 new Automake::Location,
				 MANS => "@mans");

  push (@all, '$(MANS)')
    unless option 'no-installman';
}

# Handle DATA variables.
sub handle_data
{
    &am_install_var ('-noextra', '-candist', 'data', 'DATA',
		     'data', 'dataroot', 'dvi', 'html', 'pdf', 'ps',
		     'sysconf', 'sharedstate', 'localstate',
		     'pkgdata', 'lisp', 'noinst', 'check');
}

# Handle TAGS.
sub handle_tags
{
    my @tag_deps = ();
    my @ctag_deps = ();
    if (var ('SUBDIRS'))
    {
	$output_rules .= ("tags-recursive:\n"
			  . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
			  # Never fail here if a subdir fails; it
			  # isn't important.
			  . "\t  test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir"
			  . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n"
			  . "\tdone\n");
	push (@tag_deps, 'tags-recursive');
	&depend ('.PHONY', 'tags-recursive');
	&depend ('.MAKE', 'tags-recursive');

	$output_rules .= ("ctags-recursive:\n"
			  . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
			  # Never fail here if a subdir fails; it
			  # isn't important.
			  . "\t  test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir"
			  . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n"
			  . "\tdone\n");
	push (@ctag_deps, 'ctags-recursive');
	&depend ('.PHONY', 'ctags-recursive');
	&depend ('.MAKE', 'ctags-recursive');
    }

    if (&saw_sources_p (1)
	|| var ('ETAGS_ARGS')
	|| @tag_deps)
    {
	my @config;
	foreach my $spec (@config_headers)
	{
	    my ($out, @ins) = split_config_file_spec ($spec);
	    foreach my $in (@ins)
	      {
		# If the config header source is in this directory,
		# require it.
		push @config, basename ($in)
		  if $relative_dir eq dirname ($in);
	      }
	}
	$output_rules .= &file_contents ('tags',
					 new Automake::Location,
					 CONFIG    => "@config",
					 TAGSDIRS  => "@tag_deps",
					 CTAGSDIRS => "@ctag_deps");

	set_seen 'TAGS_DEPENDENCIES';
    }
    elsif (reject_var ('TAGS_DEPENDENCIES',
		       "doesn't make sense to define `TAGS_DEPENDENCIES'"
		       . "without\nsources or `ETAGS_ARGS'"))
    {
    }
    else
    {
	# Every Makefile must define some sort of TAGS rule.
	# Otherwise, it would be possible for a top-level "make TAGS"
	# to fail because some subdirectory failed.
	$output_rules .= "tags: TAGS\nTAGS:\n\n";
	# Ditto ctags.
	$output_rules .= "ctags: CTAGS\nCTAGS:\n\n";
    }
}

# Handle multilib support.
sub handle_multilib
{
  if ($seen_multilib && $relative_dir eq '.')
    {
      $output_rules .= &file_contents ('multilib', new Automake::Location);
      push (@all, 'all-multi');
    }
}


# user_phony_rule ($NAME)
# -----------------------
# Return false if rule $NAME does not exist.  Otherwise,
# declare it as phony, complete its definition (in case it is
# conditional), and return its Automake::Rule instance.
sub user_phony_rule ($)
{
  my ($name) = @_;
  my $rule = rule $name;
  if ($rule)
    {
      depend ('.PHONY', $name);
      # Define $NAME in all condition where it is not already defined,
      # so that it is always OK to depend on $NAME.
      for my $c ($rule->not_always_defined_in_cond (TRUE)->conds)
	{
	  Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE,
				  $c, INTERNAL);
	  $output_rules .= $c->subst_string . "$name:\n";
	}
    }
  return $rule;
}


# $BOOLEAN
# &for_dist_common ($A, $B)
# -------------------------
# Subroutine for &handle_dist: sort files to dist.
#
# We put README first because it then becomes easier to make a
# Usenet-compliant shar file (in these, README must be first).
#
# FIXME: do more ordering of files here.
sub for_dist_common
{
    return 0
	if $a eq $b;
    return -1
	if $a eq 'README';
    return 1
	if $b eq 'README';
    return $a cmp $b;
}

# handle_dist
# -----------
# Handle 'dist' target.
sub handle_dist ()
{
  # Substitutions for distdir.am
  my %transform;

  # Define DIST_SUBDIRS.  This must always be done, regardless of the
  # no-dist setting: target like `distclean' or `maintainer-clean' use it.
  my $subdirs = var ('SUBDIRS');
  if ($subdirs)
    {
      # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS
      # to all possible directories, and use it.  If DIST_SUBDIRS is
      # defined, just use it.

      # Note that we check DIST_SUBDIRS first on purpose, so that
      # we don't call has_conditional_contents for now reason.
      # (In the past one project used so many conditional subdirectories
      # that calling has_conditional_contents on SUBDIRS caused
      # automake to grow to 150Mb -- this should not happen with
      # the current implementation of has_conditional_contents,
      # but it's more efficient to avoid the call anyway.)
      if (var ('DIST_SUBDIRS'))
	{
	}
      elsif ($subdirs->has_conditional_contents)
	{
	  define_pretty_variable
	    ('DIST_SUBDIRS', TRUE, INTERNAL,
	     uniq ($subdirs->value_as_list_recursive));
	}
      else
	{
	  # We always define this because that is what `distclean'
	  # wants.
	  define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL,
				  '$(SUBDIRS)');
	}
    }

  # The remaining definitions are only required when a dist target is used.
  return if option 'no-dist';

  # At least one of the archive formats must be enabled.
  if ($relative_dir eq '.')
    {
      my $archive_defined = option 'no-dist-gzip' ? 0 : 1;
      $archive_defined ||=
	grep { option "dist-$_" } qw(shar zip tarZ bzip2 lzma xz);
      error (option 'no-dist-gzip',
	     "no-dist-gzip specified but no dist-* specified, "
	     . "at least one archive format must be enabled")
	unless $archive_defined;
    }

  # Look for common files that should be included in distribution.
  # If the aux dir is set, and it does not have a Makefile.am, then
  # we check for these files there as well.
  my $check_aux = 0;
  if ($relative_dir eq '.'
      && $config_aux_dir_set_in_configure_ac)
    {
      if (! &is_make_dir ($config_aux_dir))
	{
	  $check_aux = 1;
	}
    }
  foreach my $cfile (@common_files)
    {
      if (dir_has_case_matching_file ($relative_dir, $cfile)
	  # The file might be absent, but if it can be built it's ok.
	  || rule $cfile)
	{
	  &push_dist_common ($cfile);
	}

      # Don't use `elsif' here because a file might meaningfully
      # appear in both directories.
      if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile))
	{
	  &push_dist_common ("$config_aux_dir/$cfile")
	}
    }

  # We might copy elements from $configure_dist_common to
  # %dist_common if we think we need to.  If the file appears in our
  # directory, we would have discovered it already, so we don't
  # check that.  But if the file is in a subdir without a Makefile,
  # we want to distribute it here if we are doing `.'.  Ugly!
  if ($relative_dir eq '.')
    {
      foreach my $file (split (' ' , $configure_dist_common))
	{
	  push_dist_common ($file)
	    unless is_make_dir (dirname ($file));
	}
    }

  # Files to distributed.  Don't use ->value_as_list_recursive
  # as it recursively expands `$(dist_pkgdata_DATA)' etc.
  my @dist_common = split (' ', rvar ('DIST_COMMON')->variable_value);
  @dist_common = uniq (sort for_dist_common (@dist_common));
  variable_delete 'DIST_COMMON';
  define_pretty_variable ('DIST_COMMON', TRUE, INTERNAL, @dist_common);

  # Now that we've processed DIST_COMMON, disallow further attempts
  # to set it.
  $handle_dist_run = 1;

  # Scan EXTRA_DIST to see if we need to distribute anything from a
  # subdir.  If so, add it to the list.  I didn't want to do this
  # originally, but there were so many requests that I finally
  # relented.
  my $extra_dist = var ('EXTRA_DIST');

  $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook';
  $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external;

  # If the target `dist-hook' exists, make sure it is run.  This
  # allows users to do random weird things to the distribution
  # before it is packaged up.
  push (@dist_targets, 'dist-hook')
    if user_phony_rule 'dist-hook';
  $transform{'DIST-TARGETS'} = join (' ', @dist_targets);

  my $flm = option ('filename-length-max');
  my $filename_filter = $flm ? '.' x $flm->[1] : '';

  $output_rules .= &file_contents ('distdir',
				   new Automake::Location,
				   %transform,
				   FILENAME_FILTER => $filename_filter);
}


# check_directory ($NAME, $WHERE)
# -------------------------------
# Ensure $NAME is a directory, and that it uses a sane name.
# Use $WHERE as a location in the diagnostic, if any.
sub check_directory ($$)
{
  my ($dir, $where) = @_;

  error $where, "required directory $relative_dir/$dir does not exist"
    unless -d "$relative_dir/$dir";

  # If an `obj/' directory exists, BSD make will enter it before
  # reading `Makefile'.  Hence the `Makefile' in the current directory
  # will not be read.
  #
  #  % cat Makefile
  #  all:
  #          echo Hello
  #  % cat obj/Makefile
  #  all:
  #          echo World
  #  % make      # GNU make
  #  echo Hello
  #  Hello
  #  % pmake     # BSD make
  #  echo World
  #  World
  msg ('portability', $where,
       "naming a subdirectory `obj' causes troubles with BSD make")
    if $dir eq 'obj';

  # `aux' is probably the most important of the following forbidden name,
  # since it's tempting to use it as an AC_CONFIG_AUX_DIR.
  msg ('portability', $where,
       "name `$dir' is reserved on W32 and DOS platforms")
    if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/);
}

# check_directories_in_var ($VARIABLE)
# ------------------------------------
# Recursively check all items in variables $VARIABLE as directories
sub check_directories_in_var ($)
{
  my ($var) = @_;
  $var->traverse_recursively
    (sub
     {
       my ($var, $val, $cond, $full_cond) = @_;
       check_directory ($val, $var->rdef ($cond)->location);
       return ();
     },
     undef,
     skip_ac_subst => 1);
}

# &handle_subdirs ()
# ------------------
# Handle subdirectories.
sub handle_subdirs ()
{
  my $subdirs = var ('SUBDIRS');
  return
    unless $subdirs;

  check_directories_in_var $subdirs;

  my $dsubdirs = var ('DIST_SUBDIRS');
  check_directories_in_var $dsubdirs
    if $dsubdirs;

  $output_rules .= &file_contents ('subdirs', new Automake::Location);
  rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross!
}


# ($REGEN, @DEPENDENCIES)
# &scan_aclocal_m4
# ----------------
# If aclocal.m4 creation is automated, return the list of its dependencies.
sub scan_aclocal_m4 ()
{
  my $regen_aclocal = 0;

  set_seen 'CONFIG_STATUS_DEPENDENCIES';
  set_seen 'CONFIGURE_DEPENDENCIES';

  if (-f 'aclocal.m4')
    {
      &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL);

      my $aclocal = new Automake::XFile "< aclocal.m4";
      my $line = $aclocal->getline;
      $regen_aclocal = $line =~ 'generated automatically by aclocal';
    }

  my @ac_deps = ();

  if (set_seen ('ACLOCAL_M4_SOURCES'))
    {
      push (@ac_deps, '$(ACLOCAL_M4_SOURCES)');
      msg_var ('obsolete', 'ACLOCAL_M4_SOURCES',
	       "`ACLOCAL_M4_SOURCES' is obsolete.\n"
	       . "It should be safe to simply remove it.");
    }

  # Note that it might be possible that aclocal.m4 doesn't exist but
  # should be auto-generated.  This case probably isn't very
  # important.

  return ($regen_aclocal, @ac_deps);
}


# Helper function for substitute_ac_subst_variables.
sub substitute_ac_subst_variables_worker($)
{
  my ($token) = @_;
  return "\@$token\@" if var $token;
  return "\${$token\}";
}

# substitute_ac_subst_variables ($TEXT)
# -------------------------------------
# Replace any occurrence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST
# variable.
sub substitute_ac_subst_variables ($)
{
  my ($text) = @_;
  $text =~ s/\${([^ \t=:+{}]+)}/&substitute_ac_subst_variables_worker ($1)/ge;
  return $text;
}

# @DEPENDENCIES
# &prepend_srcdir (@INPUTS)
# -------------------------
# Prepend $(srcdir) or $(top_srcdir) to all @INPUTS.  The idea is that
# if an input file has a directory part the same as the current
# directory, then the directory part is simply replaced by $(srcdir).
# But if the directory part is different, then $(top_srcdir) is
# prepended.
sub prepend_srcdir (@)
{
  my (@inputs) = @_;
  my @newinputs;

  foreach my $single (@inputs)
    {
      if (dirname ($single) eq $relative_dir)
	{
	  push (@newinputs, '$(srcdir)/' . basename ($single));
	}
      else
	{
	  push (@newinputs, '$(top_srcdir)/' . $single);
	}
    }
  return @newinputs;
}

# @DEPENDENCIES
# rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS)
# ---------------------------------------------------
# Compute a list of dependencies appropriate for the rebuild
# rule of
#   AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...)
# Also distribute $INPUTs which are not built by another AC_CONFIG_FOOS.
sub rewrite_inputs_into_dependencies ($@)
{
  my ($file, @inputs) = @_;
  my @res = ();

  for my $i (@inputs)
    {
      # We cannot create dependencies on shell variables.
      next if (substitute_ac_subst_variables $i) =~ /\$/;

      if (exists $ac_config_files_location{$i} && $i ne $file)
	{
	  my $di = dirname $i;
	  if ($di eq $relative_dir)
	    {
	      $i = basename $i;
	    }
	  # In the top-level Makefile we do not use $(top_builddir), because
	  # we are already there, and since the targets are built without
	  # a $(top_builddir), it helps BSD Make to match them with
	  # dependencies.
	  elsif ($relative_dir ne '.')
	    {
	      $i = '$(top_builddir)/' . $i;
	    }
	}
      else
	{
	  msg ('error', $ac_config_files_location{$file},
	       "required file `$i' not found")
	    unless $i =~ /\$/ || exists $output_files{$i} || -f $i;
	  ($i) = prepend_srcdir ($i);
	  push_dist_common ($i);
	}
      push @res, $i;
    }
  return @res;
}



# &handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS)
# ------------------------------------------------------------------
# Handle remaking and configure stuff.
# We need the name of the input file, to do proper remaking rules.
sub handle_configure ($$$@)
{
  my ($makefile_am, $makefile_in, $makefile, @inputs) = @_;

  prog_error 'empty @inputs'
    unless @inputs;

  my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am,
							    $makefile_in);
  my $rel_makefile = basename $makefile;

  my $colon_infile = ':' . join (':', @inputs);
  $colon_infile = '' if $colon_infile eq ":$makefile.in";
  my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs);
  my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4;
  define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL,
			  @configure_deps, @aclocal_m4_deps,
			  '$(top_srcdir)/' . $configure_ac);
  my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)');
  push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4';
  define_pretty_variable ('am__configure_deps', TRUE, INTERNAL,
			  @configuredeps);

  my $automake_options = '--' . (global_option 'cygnus' ? 'cygnus' : $strictness_name)
			 . (global_option 'no-dependencies' ? ' --ignore-deps' : '');

  $output_rules .= file_contents
    ('configure',
     new Automake::Location,
     MAKEFILE              => $rel_makefile,
     'MAKEFILE-DEPS'       => "@rewritten",
     'CONFIG-MAKEFILE'     => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@',
     'MAKEFILE-IN'         => $rel_makefile_in,
     'MAKEFILE-IN-DEPS'    => "@include_stack",
     'MAKEFILE-AM'         => $rel_makefile_am,
     'AUTOMAKE-OPTIONS'    => $automake_options,
     'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile",
     'REGEN-ACLOCAL-M4'    => $regen_aclocal_m4,
     VERBOSE               => verbose_flag ('GEN'));

  if ($relative_dir eq '.')
    {
      &push_dist_common ('acconfig.h')
	if -f 'acconfig.h';
    }

  # If we have a configure header, require it.
  my $hdr_index = 0;
  my @distclean_config;
  foreach my $spec (@config_headers)
    {
      $hdr_index += 1;
      # $CONFIG_H_PATH: config.h from top level.
      my ($config_h_path, @ins) = split_config_file_spec ($spec);
      my $config_h_dir = dirname ($config_h_path);

      # If the header is in the current directory we want to build
      # the header here.  Otherwise, if we're at the topmost
      # directory and the header's directory doesn't have a
      # Makefile, then we also want to build the header.
      if ($relative_dir eq $config_h_dir
	  || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir)))
	{
	  my ($cn_sans_dir, $stamp_dir);
	  if ($relative_dir eq $config_h_dir)
	    {
	      $cn_sans_dir = basename ($config_h_path);
	      $stamp_dir = '';
	    }
	  else
	    {
	      $cn_sans_dir = $config_h_path;
	      if ($config_h_dir eq '.')
		{
		  $stamp_dir = '';
		}
	      else
		{
		  $stamp_dir = $config_h_dir . '/';
		}
	    }

	  # This will also distribute all inputs.
	  @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins);

	  # Cannot define rebuild rules for filenames with shell variables.
	  next if (substitute_ac_subst_variables $config_h_path) =~ /\$/;

	  # Header defined in this directory.
	  my @files;
	  if (-f $config_h_path . '.top')
	    {
	      push (@files, "$cn_sans_dir.top");
	    }
	  if (-f $config_h_path . '.bot')
	    {
	      push (@files, "$cn_sans_dir.bot");
	    }

	  push_dist_common (@files);

	  # For now, acconfig.h can only appear in the top srcdir.
	  if (-f 'acconfig.h')
	    {
	      push (@files, '$(top_srcdir)/acconfig.h');
	    }

	  my $stamp = "${stamp_dir}stamp-h${hdr_index}";
	  $output_rules .=
	    file_contents ('remake-hdr',
			   new Automake::Location,
			   FILES            => "@files",
			   CONFIG_H         => $cn_sans_dir,
			   CONFIG_HIN       => $ins[0],
			   CONFIG_H_DEPS    => "@ins",
			   CONFIG_H_PATH    => $config_h_path,
			   STAMP            => "$stamp");

	  push @distclean_config, $cn_sans_dir, $stamp;
	}
    }

  $output_rules .= file_contents ('clean-hdr',
				  new Automake::Location,
				  FILES => "@distclean_config")
    if @distclean_config;

  # Distribute and define mkinstalldirs only if it is already present
  # in the package, for backward compatibility (some people may still
  # use $(mkinstalldirs)).
  my $mkidpath = "$config_aux_dir/mkinstalldirs";
  if (-f $mkidpath)
    {
      # Use require_file so that any existing script gets updated
      # by --force-missing.
      require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs');
      define_variable ('mkinstalldirs',
		       "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL);
    }
  else
    {
      # Use $(install_sh), not $(MKDIR_P) because the latter requires
      # at least one argument, and $(mkinstalldirs) used to work
      # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)).
      define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL);
    }

  reject_var ('CONFIG_HEADER',
	      "`CONFIG_HEADER' is an anachronism; now determined "
	      . "automatically\nfrom `$configure_ac'");

  my @config_h;
  foreach my $spec (@config_headers)
    {
      my ($out, @ins) = split_config_file_spec ($spec);
      # Generate CONFIG_HEADER define.
      if ($relative_dir eq dirname ($out))
	{
	  push @config_h, basename ($out);
	}
      else
	{
	  push @config_h, "\$(top_builddir)/$out";
	}
    }
  define_variable ("CONFIG_HEADER", "@config_h", INTERNAL)
    if @config_h;

  # Now look for other files in this directory which must be remade
  # by config.status, and generate rules for them.
  my @actual_other_files = ();
  # These get cleaned only in a VPATH build.
  my @actual_other_vpath_files = ();
  foreach my $lfile (@other_input_files)
    {
      my $file;
      my @inputs;
      if ($lfile =~ /^([^:]*):(.*)$/)
	{
	  # This is the ":" syntax of AC_OUTPUT.
	  $file = $1;
	  @inputs = split (':', $2);
	}
      else
	{
	  # Normal usage.
	  $file = $lfile;
	  @inputs = $file . '.in';
	}

      # Automake files should not be stored in here, but in %MAKE_LIST.
      prog_error ("$lfile in \@other_input_files\n"
		  . "\@other_input_files = (@other_input_files)")
	if -f $file . '.am';

      my $local = basename ($file);

      # We skip files that aren't in this directory.  However, if
      # the file's directory does not have a Makefile, and we are
      # currently doing `.', then we create a rule to rebuild the
      # file in the subdir.
      my $fd = dirname ($file);
      if ($fd ne $relative_dir)
	{
	  if ($relative_dir eq '.' && ! &is_make_dir ($fd))
	    {
	      $local = $file;
	    }
	  else
	    {
	      next;
	    }
	}

      my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs);

      # Cannot output rules for shell variables.
      next if (substitute_ac_subst_variables $local) =~ /\$/;

      my $condstr = '';
      my $cond = $ac_config_files_condition{$lfile};
      if (defined $cond)
        {
	  $condstr = $cond->subst_string;
	  Automake::Rule::define ($local, $configure_ac, RULE_AUTOMAKE, $cond,
				  $ac_config_files_location{$file});
        }
      $output_rules .= ($condstr . $local . ': '
			. '$(top_builddir)/config.status '
			. "@rewritten_inputs\n"
			. $condstr . "\t"
			. 'cd $(top_builddir) && '
			. '$(SHELL) ./config.status '
			. ($relative_dir eq '.' ? '' : '$(subdir)/')
			. '$@'
			. "\n");
      push (@actual_other_files, $local);
    }

  # For links we should clean destinations and distribute sources.
  foreach my $spec (@config_links)
    {
      my ($link, $file) = split /:/, $spec;
      # Some people do AC_CONFIG_LINKS($computed).  We only handle
      # the DEST:SRC form.
      next unless $file;
      my $where = $ac_config_files_location{$link};

      # Skip destinations that contain shell variables.
      if ((substitute_ac_subst_variables $link) !~ /\$/)
	{
	  # We skip links that aren't in this directory.  However, if
	  # the link's directory does not have a Makefile, and we are
	  # currently doing `.', then we add the link to CONFIG_CLEAN_FILES
	  # in `.'s Makefile.in.
	  my $local = basename ($link);
	  my $fd = dirname ($link);
	  if ($fd ne $relative_dir)
	    {
	      if ($relative_dir eq '.' && ! &is_make_dir ($fd))
		{
		  $local = $link;
		}
	      else
		{
		  $local = undef;
		}
	    }
	  if ($file ne $link)
	    {
	      push @actual_other_files, $local if $local;
	    }
	  else
	    {
	      push @actual_other_vpath_files, $local if $local;
	    }
	}

      # Do not process sources that contain shell variables.
      if ((substitute_ac_subst_variables $file) !~ /\$/)
	{
	  my $fd = dirname ($file);

	  # We distribute files that are in this directory.
	  # At the top-level (`.') we also distribute files whose
	  # directory does not have a Makefile.
	  if (($fd eq $relative_dir)
	      || ($relative_dir eq '.' && ! &is_make_dir ($fd)))
	    {
	      # The following will distribute $file as a side-effect when
	      # it is appropriate (i.e., when $file is not already an output).
	      # We do not need the result, just the side-effect.
	      rewrite_inputs_into_dependencies ($link, $file);
	    }
	}
    }

  # These files get removed by "make distclean".
  define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL,
			  @actual_other_files);
  define_pretty_variable ('CONFIG_CLEAN_VPATH_FILES', TRUE, INTERNAL,
			  @actual_other_vpath_files);
}

# Handle C headers.
sub handle_headers
{
    my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include',
			     'oldinclude', 'pkginclude',
			     'noinst', 'check');
    foreach (@r)
    {
      next unless $_->[1] =~ /\..*$/;
      &saw_extension ($&);
    }
}

sub handle_gettext
{
  return if ! $seen_gettext || $relative_dir ne '.';

  my $subdirs = var 'SUBDIRS';

  if (! $subdirs)
    {
      err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined";
      return;
    }

  # Perform some sanity checks to help users get the right setup.
  # We disable these tests when po/ doesn't exist in order not to disallow
  # unusual gettext setups.
  #
  # Bruno Haible:
  # | The idea is:
  # |
  # |  1) If a package doesn't have a directory po/ at top level, it
  # |     will likely have multiple po/ directories in subpackages.
  # |
  # |  2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT
  # |     is used without 'external'. It is also useful to warn for the
  # |     presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both
  # |     warnings apply only to the usual layout of packages, therefore
  # |     they should both be disabled if no po/ directory is found at
  # |     top level.

  if (-d 'po')
    {
      my @subdirs = $subdirs->value_as_list_recursive;

      msg_var ('syntax', $subdirs,
	       "AM_GNU_GETTEXT used but `po' not in SUBDIRS")
	if ! grep ($_ eq 'po', @subdirs);

      # intl/ is not required when AM_GNU_GETTEXT is called with the
      # `external' option and AM_GNU_GETTEXT_INTL_SUBDIR is not called.
      msg_var ('syntax', $subdirs,
	       "AM_GNU_GETTEXT used but `intl' not in SUBDIRS")
	if (! ($seen_gettext_external && ! $seen_gettext_intl)
	    && ! grep ($_ eq 'intl', @subdirs));

      # intl/ should not be used with AM_GNU_GETTEXT([external]), except
      # if AM_GNU_GETTEXT_INTL_SUBDIR is called.
      msg_var ('syntax', $subdirs,
	       "`intl' should not be in SUBDIRS when "
	       . "AM_GNU_GETTEXT([external]) is used")
	if ($seen_gettext_external && ! $seen_gettext_intl
	    && grep ($_ eq 'intl', @subdirs));
    }

  require_file ($ac_gettext_location, GNU, 'ABOUT-NLS');
}

# Handle footer elements.
sub handle_footer
{
    reject_rule ('.SUFFIXES',
		 "use variable `SUFFIXES', not target `.SUFFIXES'");

    # Note: AIX 4.1 /bin/make will fail if any suffix rule appears
    # before .SUFFIXES.  So we make sure that .SUFFIXES appears before
    # anything else, by sticking it right after the default: target.
    $output_header .= ".SUFFIXES:\n";
    my $suffixes = var 'SUFFIXES';
    my @suffixes = Automake::Rule::suffixes;
    if (@suffixes || $suffixes)
    {
	# Make sure SUFFIXES has unique elements.  Sort them to ensure
	# the output remains consistent.  However, $(SUFFIXES) is
	# always at the start of the list, unsorted.  This is done
	# because make will choose rules depending on the ordering of
	# suffixes, and this lets the user have some control.  Push
	# actual suffixes, and not $(SUFFIXES).  Some versions of make
	# do not like variable substitutions on the .SUFFIXES line.
	my @user_suffixes = ($suffixes
			     ? $suffixes->value_as_list_recursive : ());

	my %suffixes = map { $_ => 1 } @suffixes;
	delete @suffixes{@user_suffixes};

	$output_header .= (".SUFFIXES: "
			   . join (' ', @user_suffixes, sort keys %suffixes)
			   . "\n");
    }

    $output_trailer .= file_contents ('footer', new Automake::Location);
}


# Generate `make install' rules.
sub handle_install ()
{
  $output_rules .= &file_contents
    ('install',
     new Automake::Location,
     maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES')
			     ? (" \$(BUILT_SOURCES)\n"
				. "\t\$(MAKE) \$(AM_MAKEFLAGS)")
			     : ''),
     'installdirs-local' => (user_phony_rule 'installdirs-local'
			     ? ' installdirs-local' : ''),
     am__installdirs => variable_value ('am__installdirs') || '');
}


# Deal with all and all-am.
sub handle_all ($)
{
    my ($makefile) = @_;

    # Output `all-am'.

    # Put this at the beginning for the sake of non-GNU makes.  This
    # is still wrong if these makes can run parallel jobs.  But it is
    # right enough.
    unshift (@all, basename ($makefile));

    foreach my $spec (@config_headers)
      {
	my ($out, @ins) = split_config_file_spec ($spec);
	push (@all, basename ($out))
	  if dirname ($out) eq $relative_dir;
      }

    # Install `all' hooks.
    push (@all, "all-local")
      if user_phony_rule "all-local";

    &pretty_print_rule ("all-am:", "\t\t", @all);
    &depend ('.PHONY', 'all-am', 'all');


    # Output `all'.

    my @local_headers = ();
    push @local_headers, '$(BUILT_SOURCES)'
      if var ('BUILT_SOURCES');
    foreach my $spec (@config_headers)
      {
	my ($out, @ins) = split_config_file_spec ($spec);
	push @local_headers, basename ($out)
	  if dirname ($out) eq $relative_dir;
      }

    if (@local_headers)
      {
	# We need to make sure config.h is built before we recurse.
	# We also want to make sure that built sources are built
	# before any ordinary `all' targets are run.  We can't do this
	# by changing the order of dependencies to the "all" because
	# that breaks when using parallel makes.  Instead we handle
	# things explicitly.
	$output_all .= ("all: @local_headers"
			. "\n\t"
			. '$(MAKE) $(AM_MAKEFLAGS) '
			. (var ('SUBDIRS') ? 'all-recursive' : 'all-am')
			. "\n\n");
        depend ('.MAKE', 'all');
      }
    else
      {
	$output_all .= "all: " . (var ('SUBDIRS')
				  ? 'all-recursive' : 'all-am') . "\n\n";
      }
}


# &do_check_merge_target ()
# -------------------------
# Handle check merge target specially.
sub do_check_merge_target ()
{
  # Include user-defined local form of target.
  push @check_tests, 'check-local'
    if user_phony_rule 'check-local';

  # In --cygnus mode, check doesn't depend on all.
  if (option 'cygnus')
    {
      # Just run the local check rules.
      pretty_print_rule ('check-am:', "\t\t", @check);
    }
  else
    {
      # The check target must depend on the local equivalent of
      # `all', to ensure all the primary targets are built.  Then it
      # must build the local check rules.
      $output_rules .= "check-am: all-am\n";
      if (@check)
        {
	  pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
			     @check);
	  depend ('.MAKE', 'check-am');
	}
    }
  if (@check_tests)
    {
      pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
			 @check_tests);
      depend ('.MAKE', 'check-am');
    }

  depend '.PHONY', 'check', 'check-am';
  # Handle recursion.  We have to honor BUILT_SOURCES like for `all:'.
  $output_rules .= ("check: "
		    . (var ('BUILT_SOURCES')
		       ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) "
		       : '')
		    . (var ('SUBDIRS') ? 'check-recursive' : 'check-am')
		    . "\n");
  depend ('.MAKE', 'check')
    if var ('BUILT_SOURCES');
}

# handle_clean ($MAKEFILE)
# ------------------------
# Handle all 'clean' targets.
sub handle_clean ($)
{
  my ($makefile) = @_;

  # Clean the files listed in user variables if they exist.
  $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN
    if var ('MOSTLYCLEANFILES');
  $clean_files{'$(CLEANFILES)'} = CLEAN
    if var ('CLEANFILES');
  $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN
    if var ('DISTCLEANFILES');
  $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN
    if var ('MAINTAINERCLEANFILES');

  # Built sources are automatically removed by maintainer-clean.
  $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN
    if var ('BUILT_SOURCES');

  # Compute a list of "rm"s to run for each target.
  my %rms = (MOSTLY_CLEAN, [],
	     CLEAN, [],
	     DIST_CLEAN, [],
	     MAINTAINER_CLEAN, []);

  foreach my $file (keys %clean_files)
    {
      my $when = $clean_files{$file};
      prog_error 'invalid entry in %clean_files'
	unless exists $rms{$when};

      my $rm = "rm -f $file";
      # If file is a variable, make sure when don't call `rm -f' without args.
      $rm ="test -z \"$file\" || $rm"
	if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/);

      push @{$rms{$when}}, "\t-$rm\n";
    }

  $output_rules .= &file_contents
    ('clean',
     new Automake::Location,
     MOSTLYCLEAN_RMS      => join ('', sort @{$rms{&MOSTLY_CLEAN}}),
     CLEAN_RMS            => join ('', sort @{$rms{&CLEAN}}),
     DISTCLEAN_RMS        => join ('', sort @{$rms{&DIST_CLEAN}}),
     MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}),
     MAKEFILE             => basename $makefile,
     );
}


# &target_cmp ($A, $B)
# --------------------
# Subroutine for &handle_factored_dependencies to let `.PHONY' and
# other `.TARGETS' be last.
sub target_cmp
{
  return 0 if $a eq $b;

  my $a1 = substr ($a, 0, 1);
  my $b1 = substr ($b, 0, 1);
  if ($a1 ne $b1)
    {
      return -1 if $b1 eq '.';
      return 1 if $a1 eq '.';
    }
  return $a cmp $b;
}


# &handle_factored_dependencies ()
# --------------------------------
# Handle everything related to gathered targets.
sub handle_factored_dependencies
{
  # Reject bad hooks.
  foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook',
		     'uninstall-exec-local', 'uninstall-exec-hook',
		     'uninstall-dvi-local',
		     'uninstall-html-local',
		     'uninstall-info-local',
		     'uninstall-pdf-local',
		     'uninstall-ps-local')
    {
      my $x = $utarg;
      $x =~ s/-.*-/-/;
      reject_rule ($utarg, "use `$x', not `$utarg'");
    }

  reject_rule ('install-local',
	       "use `install-data-local' or `install-exec-local', "
	       . "not `install-local'");

  reject_rule ('install-hook',
	       "use `install-data-hook' or `install-exec-hook', "
	       . "not `install-hook'");

  # Install the -local hooks.
  foreach (keys %dependencies)
    {
      # Hooks are installed on the -am targets.
      s/-am$// or next;
      depend ("$_-am", "$_-local")
	if user_phony_rule "$_-local";
    }

  # Install the -hook hooks.
  # FIXME: Why not be as liberal as we are with -local hooks?
  foreach ('install-exec', 'install-data', 'uninstall')
    {
      if (user_phony_rule "$_-hook")
	{
	  depend ('.MAKE', "$_-am");
	  register_action("$_-am",
			  ("\t\@\$(NORMAL_INSTALL)\n"
			   . "\t\$(MAKE) \$(AM_MAKEFLAGS) $_-hook"));
	}
    }

  # All the required targets are phony.
  depend ('.PHONY', keys %required_targets);

  # Actually output gathered targets.
  foreach (sort target_cmp keys %dependencies)
    {
      # If there is nothing about this guy, skip it.
      next
	unless (@{$dependencies{$_}}
		|| $actions{$_}
		|| $required_targets{$_});

      # Define gathered targets in undefined conditions.
      # FIXME: Right now we must handle .PHONY as an exception,
      # because people write things like
      #    .PHONY: myphonytarget
      # to append dependencies.  This would not work if Automake
      # refrained from defining its own .PHONY target as it does
      # with other overridden targets.
      # Likewise for `.MAKE'.
      my @undefined_conds = (TRUE,);
      if ($_ ne '.PHONY' && $_ ne '.MAKE')
	{
	  @undefined_conds =
	    Automake::Rule::define ($_, 'internal',
				    RULE_AUTOMAKE, TRUE, INTERNAL);
	}
      my @uniq_deps = uniq (sort @{$dependencies{$_}});
      foreach my $cond (@undefined_conds)
	{
	  my $condstr = $cond->subst_string;
	  &pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps);
	  $output_rules .= $actions{$_} if defined $actions{$_};
	  $output_rules .= "\n";
	}
    }
}


# &handle_tests_dejagnu ()
# ------------------------
sub handle_tests_dejagnu
{
    push (@check_tests, 'check-DEJAGNU');
    $output_rules .= file_contents ('dejagnu', new Automake::Location);
}


# Handle TESTS variable and other checks.
sub handle_tests
{
  if (option 'dejagnu')
    {
      &handle_tests_dejagnu;
    }
  else
    {
      foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
	{
	  reject_var ($c, "`$c' defined but `dejagnu' not in "
		      . "`AUTOMAKE_OPTIONS'");
	}
    }

  if (var ('TESTS'))
    {
      push (@check_tests, 'check-TESTS');
      $output_rules .= &file_contents ('check', new Automake::Location,
				       COLOR => !! option 'color-tests',
				       PARALLEL_TESTS => !! option 'parallel-tests');

      # Tests that are known programs should have $(EXEEXT) appended.
      # For matching purposes, we need to adjust XFAIL_TESTS as well.
      append_exeext { exists $known_programs{$_[0]} } 'TESTS';
      append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS'
	if (var ('XFAIL_TESTS'));

      if (option 'parallel-tests')
        {
	  define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL);
	  define_variable ('TEST_SUITE_HTML', '$(TEST_SUITE_LOG:.log=.html)', INTERNAL);
	  my $suff = '.test';
	  my $at_exeext = '';
	  my $handle_exeext = exists $configure_vars{'EXEEXT'};
	  if ($handle_exeext)
	    {
	      $at_exeext = subst ('EXEEXT');
	      $suff = $at_exeext  . ' ' . $suff;
	    }
	  define_variable ('TEST_EXTENSIONS', $suff, INTERNAL);
	  # FIXME: this mishandles conditions.
	  my @test_suffixes = (var 'TEST_EXTENSIONS')->value_as_list_recursive;
	  if ($handle_exeext)
	    {
	      unshift (@test_suffixes, $at_exeext)
	        unless $test_suffixes[0] eq $at_exeext;
	    }
	  unshift (@test_suffixes, '');

	  transform_variable_recursively
	    ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL,
	      sub {
	        my ($subvar, $val, $cond, $full_cond) = @_;
		my $obj = $val;
		return $obj
		  if $val =~ /^\@.*\@$/;
		$obj =~ s/\$\(EXEEXT\)$//o;

		if ($val =~ /(\$\((top_)?srcdir\))\//o)
		  {
		    msg ('error', $subvar->rdef ($cond)->location,
			 "parallel-tests: using `$1' in TESTS is currently broken: `$val'");
		  }

		foreach my $test_suffix (@test_suffixes)
		  {
		    next
		      if $test_suffix eq $at_exeext || $test_suffix eq '';
		    return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log'
		      if substr ($obj, - length ($test_suffix)) eq $test_suffix;
		  }
		$obj .= '.log';
		my $compile = 'LOG_COMPILE';
		define_variable ($compile,
				 '$(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)', INTERNAL);
		$output_rules .= file_contents ('check2', new Automake::Location,
						GENERIC => 0,
						OBJ => $obj,
						SOURCE => $val,
						COMPILE =>'$(' . $compile . ')',
						EXT => '',
						am__EXEEXT => 'FALSE');
	        return $obj;
	      });

	  my $nhelper=1;
	  my $prev = 'TESTS';
	  my $post = '';
	  my $last_suffix = $test_suffixes[$#test_suffixes];
	  my $cur = '';
	  foreach my $test_suffix (@test_suffixes)
	    {
	      if ($test_suffix eq $last_suffix)
	        {
		  $cur = 'TEST_LOGS';
		}
	      else
	        {
		  $cur = 'am__test_logs' . $nhelper;
		}
	      define_variable ($cur,
		'$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL);
	      $post = '.log';
	      $prev = $cur;
	      $nhelper++;
	      if ($test_suffix ne $at_exeext && $test_suffix ne '')
	        {
		  (my $ext = $test_suffix) =~ s/^\.//;
		  $ext = uc $ext;
		  my $compile = $ext . '_LOG_COMPILE';
		  define_variable ($compile,
				   '$(' . $ext . '_LOG_COMPILER) $(AM_' .  $ext . '_LOG_FLAGS)'
				   . ' $(' . $ext . '_LOG_FLAGS)', INTERNAL);
		  my $am_exeext = $handle_exeext ? 'am__EXEEXT' : 'FALSE';
		  $output_rules .= file_contents ('check2', new Automake::Location,
						  GENERIC => 1,
						  OBJ => '',
						  SOURCE => '$<',
						  COMPILE => '$(' . $compile . ')',
						  EXT => $test_suffix,
						  am__EXEEXT => $am_exeext);
	        }
	    }

	  define_variable ('TEST_LOGS_TMP', '$(TEST_LOGS:.log=.log-t)', INTERNAL);

	  $clean_files{'$(TEST_LOGS_TMP)'} = MOSTLY_CLEAN;
	  $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN;
	  $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN;
	  $clean_files{'$(TEST_SUITE_HTML)'} = MOSTLY_CLEAN;
	}
    }
}

# Handle Emacs Lisp.
sub handle_emacs_lisp
{
  my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP',
				 'lisp', 'noinst');

  return if ! @elfiles;

  define_pretty_variable ('am__ELFILES', TRUE, INTERNAL,
			  map { $_->[1] } @elfiles);
  define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL,
			  '$(am__ELFILES:.el=.elc)');
  # This one can be overridden by users.
  define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)');

  push @all, '$(ELCFILES)';

  require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
		     'EMACS', 'lispdir');
  require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp');
  &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL);
}

# Handle Python
sub handle_python
{
  my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON',
				 'noinst');
  return if ! @pyfiles;

  require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
  require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
  &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
}

# Handle Java.
sub handle_java
{
    my @sourcelist = &am_install_var ('-candist',
				      'java', 'JAVA',
				      'java', 'noinst', 'check');
    return if ! @sourcelist;

    my @prefix = am_primary_prefixes ('JAVA', 1,
				      'java', 'noinst', 'check');

    my $dir;
    foreach my $curs (@prefix)
      {
	next
	  if $curs eq 'EXTRA';

	err_var "${curs}_JAVA", "multiple _JAVA primaries in use"
	  if defined $dir;
	$dir = $curs;
      }


    push (@all, 'class' . $dir . '.stamp');
}


# Handle some of the minor options.
sub handle_minor_options
{
  if (option 'readme-alpha')
    {
      if ($relative_dir eq '.')
	{
	  if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
	    {
	      msg ('error-gnits', $package_version_location,
		   "version `$package_version' doesn't follow " .
		   "Gnits standards");
	    }
	  if (defined $1 && -f 'README-alpha')
	    {
	      # This means we have an alpha release.  See
	      # GNITS_VERSION_PATTERN for details.
	      push_dist_common ('README-alpha');
	    }
	}
    }
}

################################################################

# ($OUTPUT, @INPUTS)
# &split_config_file_spec ($SPEC)
# -------------------------------
# Decode the Autoconf syntax for config files (files, headers, links
# etc.).
sub split_config_file_spec ($)
{
  my ($spec) = @_;
  my ($output, @inputs) = split (/:/, $spec);

  push @inputs, "$output.in"
    unless @inputs;

  return ($output, @inputs);
}

# $input
# locate_am (@POSSIBLE_SOURCES)
# -----------------------------
# AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in
# This functions returns the first *.in file for which a *.am exists.
# It returns undef otherwise.
sub locate_am (@)
{
  my (@rest) = @_;
  my $input;
  foreach my $file (@rest)
    {
      if (($file =~ /^(.*)\.in$/) && -f "$1.am")
	{
	  $input = $file;
	  last;
	}
    }
  return $input;
}

my %make_list;

# &scan_autoconf_config_files ($WHERE, $CONFIG-FILES)
# ---------------------------------------------------
# Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
# (or AC_OUTPUT).
sub scan_autoconf_config_files ($$)
{
  my ($where, $config_files) = @_;

  # Look at potential Makefile.am's.
  foreach (split ' ', $config_files)
    {
      # Must skip empty string for Perl 4.
      next if $_ eq "\\" || $_ eq '';

      # Handle $local:$input syntax.
      my ($local, @rest) = split (/:/);
      @rest = ("$local.in",) unless @rest;
      msg ('portability', $where,
	  "Omit leading `./' from config file names such as `$local',"
	  . "\nas not all make implementations treat `file' and `./file' equally.")
	if ($local =~ /^\.\//);
      my $input = locate_am @rest;
      if ($input)
	{
	  # We have a file that automake should generate.
	  $make_list{$input} = join (':', ($local, @rest));
	}
      else
	{
	  # We have a file that automake should cause to be
	  # rebuilt, but shouldn't generate itself.
	  push (@other_input_files, $_);
	}
      $ac_config_files_location{$local} = $where;
      $ac_config_files_condition{$local} =
        new Automake::Condition (@cond_stack)
          if (@cond_stack);
    }
}


# &scan_autoconf_traces ($FILENAME)
# ---------------------------------
sub scan_autoconf_traces ($)
{
  my ($filename) = @_;

  # Macros to trace, with their minimal number of arguments.
  #
  # IMPORTANT: If you add a macro here, you should also add this macro
  # =========  to Automake-preselection in autoconf/lib/autom4te.in.
  my %traced = (
		AC_CANONICAL_BUILD => 0,
		AC_CANONICAL_HOST => 0,
		AC_CANONICAL_TARGET => 0,
		AC_CONFIG_AUX_DIR => 1,
		AC_CONFIG_FILES => 1,
		AC_CONFIG_HEADERS => 1,
		AC_CONFIG_LIBOBJ_DIR => 1,
		AC_CONFIG_LINKS => 1,
		AC_FC_SRCEXT => 1,
		AC_INIT => 0,
		AC_LIBSOURCE => 1,
		AC_REQUIRE_AUX_FILE => 1,
		AC_SUBST_TRACE => 1,
		AM_AUTOMAKE_VERSION => 1,
		AM_CONDITIONAL => 2,
		AM_ENABLE_MULTILIB => 0,
		AM_GNU_GETTEXT => 0,
		AM_GNU_GETTEXT_INTL_SUBDIR => 0,
		AM_INIT_AUTOMAKE => 0,
		AM_MAINTAINER_MODE => 0,
		AM_PROG_CC_C_O => 0,
		AM_SILENT_RULES => 0,
		_AM_SUBST_NOTMAKE => 1,
		_AM_COND_IF => 1,
		_AM_COND_ELSE => 1,
		_AM_COND_ENDIF => 1,
		LT_SUPPORTED_TAG => 1,
		_LT_AC_TAGCONFIG => 0,
		m4_include => 1,
		m4_sinclude => 1,
		sinclude => 1,
	      );

  my $traces = ($ENV{AUTOCONF} || 'autoconf') . " ";

  # Use a separator unlikely to be used, not `:', the default, which
  # has a precise meaning for AC_CONFIG_FILES and so on.
  $traces .= join (' ',
		   map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' }
		   (keys %traced));

  my $tracefh = new Automake::XFile ("$traces $filename |");
  verb "reading $traces";

  @cond_stack = ();
  my $where;

  while ($_ = $tracefh->getline)
    {
      chomp;
      my ($here, $depth, @args) = split (/::/);
      $where = new Automake::Location $here;
      my $macro = $args[0];

      prog_error ("unrequested trace `$macro'")
	unless exists $traced{$macro};

      # Skip and diagnose malformed calls.
      if ($#args < $traced{$macro})
	{
	  msg ('syntax', $where, "not enough arguments for $macro");
	  next;
	}

      # Alphabetical ordering please.
      if ($macro eq 'AC_CANONICAL_BUILD')
	{
	  if ($seen_canonical <= AC_CANONICAL_BUILD)
	    {
	      $seen_canonical = AC_CANONICAL_BUILD;
	      $canonical_location = $where;
	    }
	}
      elsif ($macro eq 'AC_CANONICAL_HOST')
	{
	  if ($seen_canonical <= AC_CANONICAL_HOST)
	    {
	      $seen_canonical = AC_CANONICAL_HOST;
	      $canonical_location = $where;
	    }
	}
      elsif ($macro eq 'AC_CANONICAL_TARGET')
	{
	  $seen_canonical = AC_CANONICAL_TARGET;
	  $canonical_location = $where;
	}
      elsif ($macro eq 'AC_CONFIG_AUX_DIR')
	{
	  if ($seen_init_automake)
	    {
	      error ($where, "AC_CONFIG_AUX_DIR must be called before "
		     . "AM_INIT_AUTOMAKE...", partial => 1);
	      error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here");
	    }
	  $config_aux_dir = $args[1];
	  $config_aux_dir_set_in_configure_ac = 1;
	  $relative_dir = '.';
	  check_directory ($config_aux_dir, $where);
	}
      elsif ($macro eq 'AC_CONFIG_FILES')
	{
	  # Look at potential Makefile.am's.
	  scan_autoconf_config_files ($where, $args[1]);
	}
      elsif ($macro eq 'AC_CONFIG_HEADERS')
	{
	  foreach my $spec (split (' ', $args[1]))
	    {
	      my ($dest, @src) = split (':', $spec);
	      $ac_config_files_location{$dest} = $where;
	      push @config_headers, $spec;
	    }
	}
      elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR')
	{
	  $config_libobj_dir = $args[1];
	  $relative_dir = '.';
	  check_directory ($config_libobj_dir, $where);
	}
      elsif ($macro eq 'AC_CONFIG_LINKS')
	{
	  foreach my $spec (split (' ', $args[1]))
	    {
	      my ($dest, $src) = split (':', $spec);
	      $ac_config_files_location{$dest} = $where;
	      push @config_links, $spec;
	    }
	}
      elsif ($macro eq 'AC_FC_SRCEXT')
	{
	  my $suffix = $args[1];
	  # These flags are used as %SOURCEFLAG% in depend2.am,
	  # where the trailing space is important.
	  $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') '
	    if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08');
	}
      elsif ($macro eq 'AC_INIT')
	{
	  if (defined $args[2])
	    {
	      $package_version = $args[2];
	      $package_version_location = $where;
	    }
	}
      elsif ($macro eq 'AC_LIBSOURCE')
	{
	  $libsources{$args[1]} = $here;
	}
      elsif ($macro eq 'AC_REQUIRE_AUX_FILE')
	{
	  # Only remember the first time a file is required.
	  $required_aux_file{$args[1]} = $where
	    unless exists $required_aux_file{$args[1]};
	}
      elsif ($macro eq 'AC_SUBST_TRACE')
	{
	  # Just check for alphanumeric in AC_SUBST_TRACE.  If you do
	  # AC_SUBST(5), then too bad.
	  $configure_vars{$args[1]} = $where
	    if $args[1] =~ /^\w+$/;
	}
      elsif ($macro eq 'AM_AUTOMAKE_VERSION')
	{
	  error ($where,
		 "version mismatch.  This is Automake $VERSION,\n" .
		 "but the definition used by this AM_INIT_AUTOMAKE\n" .
		 "comes from Automake $args[1].  You should recreate\n" .
		 "aclocal.m4 with aclocal and run automake again.\n",
		 # $? = 63 is used to indicate version mismatch to missing.
		 exit_code => 63)
	    if $VERSION ne $args[1];

	  $seen_automake_version = 1;
	}
      elsif ($macro eq 'AM_CONDITIONAL')
	{
	  $configure_cond{$args[1]} = $where;
	}
      elsif ($macro eq 'AM_ENABLE_MULTILIB')
	{
	  $seen_multilib = $where;
	}
      elsif ($macro eq 'AM_GNU_GETTEXT')
	{
	  $seen_gettext = $where;
	  $ac_gettext_location = $where;
	  $seen_gettext_external = grep ($_ eq 'external', @args);
	}
      elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR')
	{
	  $seen_gettext_intl = $where;
	}
      elsif ($macro eq 'AM_INIT_AUTOMAKE')
	{
	  $seen_init_automake = $where;
	  if (defined $args[2])
	    {
	      $package_version = $args[2];
	      $package_version_location = $where;
	    }
	  elsif (defined $args[1])
	    {
	      exit $exit_code
		if (process_global_option_list ($where,
						split (' ', $args[1])));
	    }
	}
      elsif ($macro eq 'AM_MAINTAINER_MODE')
	{
	  $seen_maint_mode = $where;
	}
      elsif ($macro eq 'AM_PROG_CC_C_O')
	{
	  $seen_cc_c_o = $where;
	}
      elsif ($macro eq 'AM_SILENT_RULES')
        {
	  set_global_option ('silent-rules', $where);
	}
      elsif ($macro eq '_AM_COND_IF')
        {
	  cond_stack_if ('', $args[1], $where);
	  error ($where, "missing m4 quoting, macro depth $depth")
	    if ($depth != 1);
	}
      elsif ($macro eq '_AM_COND_ELSE')
        {
	  cond_stack_else ('!', $args[1], $where);
	  error ($where, "missing m4 quoting, macro depth $depth")
	    if ($depth != 1);
	}
      elsif ($macro eq '_AM_COND_ENDIF')
        {
	  cond_stack_endif (undef, undef, $where);
	  error ($where, "missing m4 quoting, macro depth $depth")
	    if ($depth != 1);
	}
      elsif ($macro eq '_AM_SUBST_NOTMAKE')
	{
	  $ignored_configure_vars{$args[1]} = $where;
	}
      elsif ($macro eq 'm4_include'
	     || $macro eq 'm4_sinclude'
	     || $macro eq 'sinclude')
	{
	  # Skip missing `sinclude'd files.
	  next if $macro ne 'm4_include' && ! -f $args[1];

	  # Some modified versions of Autoconf don't use
	  # frozen files.  Consequently it's possible that we see all
	  # m4_include's performed during Autoconf's startup.
	  # Obviously we don't want to distribute Autoconf's files
	  # so we skip absolute filenames here.
	  push @configure_deps, '$(top_srcdir)/' . $args[1]
	    unless $here =~ m,^(?:\w:)?[\\/],;
	  # Keep track of the greatest timestamp.
	  if (-e $args[1])
	    {
	      my $mtime = mtime $args[1];
	      $configure_deps_greatest_timestamp = $mtime
		if $mtime > $configure_deps_greatest_timestamp;
	    }
	}
      elsif ($macro eq 'LT_SUPPORTED_TAG')
	{
	  $libtool_tags{$args[1]} = 1;
	  $libtool_new_api = 1;
	}
      elsif ($macro eq '_LT_AC_TAGCONFIG')
	{
	  # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5.
	  # We use it to detect whether tags are supported.  Our
	  # preferred interface is LT_SUPPORTED_TAG, but it was
	  # introduced in Libtool 1.6.
	  if (0 == keys %libtool_tags)
	    {
	      # Hardcode the tags supported by Libtool 1.5.
	      %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1);
	    }
	}
    }

  error ($where, "condition stack not properly closed")
    if (@cond_stack);

  $tracefh->close;
}


# &scan_autoconf_files ()
# -----------------------
# Check whether we use `configure.ac' or `configure.in'.
# Scan it (and possibly `aclocal.m4') for interesting things.
# We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
sub scan_autoconf_files ()
{
  # Reinitialize libsources here.  This isn't really necessary,
  # since we currently assume there is only one configure.ac.  But
  # that won't always be the case.
  %libsources = ();

  # Keep track of the youngest configure dependency.
  $configure_deps_greatest_timestamp = mtime $configure_ac;
  if (-e 'aclocal.m4')
    {
      my $mtime = mtime 'aclocal.m4';
      $configure_deps_greatest_timestamp = $mtime
	if $mtime > $configure_deps_greatest_timestamp;
    }

  scan_autoconf_traces ($configure_ac);

  @configure_input_files = sort keys %make_list;
  # Set input and output files if not specified by user.
  if (! @input_files)
    {
      @input_files = @configure_input_files;
      %output_files = %make_list;
    }


  if (! $seen_init_automake)
    {
      err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou "
	      . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE,"
	      . "\nthat aclocal.m4 is present in the top-level directory,\n"
	      . "and that aclocal.m4 was recently regenerated "
	      . "(using aclocal).");
    }
  else
    {
      if (! $seen_automake_version)
	{
	  if (-f 'aclocal.m4')
	    {
	      error ($seen_init_automake,
		     "your implementation of AM_INIT_AUTOMAKE comes from " .
		     "an\nold Automake version.  You should recreate " .
		     "aclocal.m4\nwith aclocal and run automake again.\n",
		     # $? = 63 is used to indicate version mismatch to missing.
		     exit_code => 63);
	    }
	  else
	    {
	      error ($seen_init_automake,
		     "no proper implementation of AM_INIT_AUTOMAKE was " .
		     "found,\nprobably because aclocal.m4 is missing...\n" .
		     "You should run aclocal to create this file, then\n" .
		     "run automake again.\n");
	    }
	}
    }

  locate_aux_dir ();

  # Reorder @input_files so that the Makefile that distributes aux
  # files is processed last.  This is important because each directory
  # can require auxiliary scripts and we should wait until they have
  # been installed before distributing them.

  # The Makefile.in that distribute the aux files is the one in
  # $config_aux_dir or the top-level Makefile.
  my $auxdirdist = is_make_dir ($config_aux_dir) ? $config_aux_dir : '.';
  my @new_input_files = ();
  while (@input_files)
    {
      my $in = pop @input_files;
      my @ins = split (/:/, $output_files{$in});
      if (dirname ($ins[0]) eq $auxdirdist)
	{
	  push @new_input_files, $in;
	  $automake_will_process_aux_dir = 1;
	}
      else
	{
	  unshift @new_input_files, $in;
	}
    }
  @input_files = @new_input_files;

  # If neither the auxdir/Makefile nor the ./Makefile are generated
  # by Automake, we won't distribute the aux files anyway.  Assume
  # the user know what (s)he does, and pretend we will distribute
  # them to disable the error in require_file_internal.
  $automake_will_process_aux_dir = 1 if ! is_make_dir ($auxdirdist);

  # Look for some files we need.  Always check for these.  This
  # check must be done for every run, even those where we are only
  # looking at a subdir Makefile.  We must set relative_dir for
  # maybe_push_required_file to work.
  # Sort the files for stable verbose output.
  $relative_dir = '.';
  foreach my $file (sort keys %required_aux_file)
    {
      require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file)
    }
  err_am "`install.sh' is an anachronism; use `install-sh' instead"
    if -f $config_aux_dir . '/install.sh';

  # Preserve dist_common for later.
  $configure_dist_common = variable_value ('DIST_COMMON') || '';

}

################################################################

# Set up for Cygnus mode.
sub check_cygnus
{
  my $cygnus = option 'cygnus';
  return unless $cygnus;

  set_strictness ('foreign');
  set_option ('no-installinfo', $cygnus);
  set_option ('no-dependencies', $cygnus);
  set_option ('no-dist', $cygnus);

  err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified"
    if !$seen_maint_mode;
}

# Do any extra checking for GNU standards.
sub check_gnu_standards
{
  if ($relative_dir eq '.')
    {
      # In top level (or only) directory.
      require_file ("$am_file.am", GNU,
		    qw/INSTALL NEWS README AUTHORS ChangeLog/);

      # Accept one of these three licenses; default to COPYING.
      # Make sure we do not overwrite an existing license.
      my $license;
      foreach (qw /COPYING COPYING.LIB COPYING.LESSER/)
	{
	  if (-f $_)
	    {
	      $license = $_;
	      last;
	    }
	}
      require_file ("$am_file.am", GNU, 'COPYING')
	unless $license;
    }

  for my $opt ('no-installman', 'no-installinfo')
    {
      msg ('error-gnu', option $opt,
	   "option `$opt' disallowed by GNU standards")
	if option $opt;
    }
}

# Do any extra checking for GNITS standards.
sub check_gnits_standards
{
  if ($relative_dir eq '.')
    {
      # In top level (or only) directory.
      require_file ("$am_file.am", GNITS, 'THANKS');
    }
}

################################################################
#
# Functions to handle files of each language.

# Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
# simple formula: Return value is LANG_SUBDIR if the resulting object
# file should be in a subdir if the source file is, LANG_PROCESS if
# file is to be dealt with, LANG_IGNORE otherwise.

# Much of the actual processing is handled in
# handle_single_transform.  These functions exist so that
# auxiliary information can be recorded for a later cleanup pass.
# Note that the calls to these functions are computed, so don't bother
# searching for their precise names in the source.

# This is just a convenience function that can be used to determine
# when a subdir object should be used.
sub lang_sub_obj
{
    return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS;
}

# Rewrite a single C source file.
sub lang_c_rewrite
{
  my ($directory, $base, $ext, $nonansi_obj, $have_per_exec_flags, $var) = @_;

  if (option 'ansi2knr' && $base =~ /_$/)
    {
      # FIXME: include line number in error.
      err_am "C source file `$base.c' would be deleted by ansi2knr rules";
    }

  my $r = LANG_PROCESS;
  if (option 'subdir-objects')
    {
      $r = LANG_SUBDIR;
      if ($directory && $directory ne '.')
	{
	  $base = $directory . '/' . $base;

	  # libtool is always able to put the object at the proper place,
	  # so we do not have to require AM_PROG_CC_C_O when building .lo files.
	  msg_var ('portability', $var,
		   "compiling `$base.c' in subdir requires "
		   . "`AM_PROG_CC_C_O' in `$configure_ac'",
		   uniq_scope => US_GLOBAL,
		   uniq_part => 'AM_PROG_CC_C_O subdir')
	    unless $seen_cc_c_o || $nonansi_obj eq '.lo';
	}

      # In this case we already have the directory information, so
      # don't add it again.
      $de_ansi_files{$base} = '';
    }
  else
    {
      $de_ansi_files{$base} = (($directory eq '.' || $directory eq '')
			       ? ''
			       : "$directory/");
    }

  if (! $seen_cc_c_o
      && $have_per_exec_flags
      && ! option 'subdir-objects'
      && $nonansi_obj ne '.lo')
    {
      msg_var ('portability',
	       $var, "compiling `$base.c' with per-target flags requires "
	       . "`AM_PROG_CC_C_O' in `$configure_ac'",
	       uniq_scope => US_GLOBAL,
	       uniq_part => 'AM_PROG_CC_C_O per-target')
    }

    return $r;
}

# Rewrite a single C++ source file.
sub lang_cxx_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single header file.
sub lang_header_rewrite
{
    # Header files are simply ignored.
    return LANG_IGNORE;
}

# Rewrite a single Vala source file.
sub lang_vala_rewrite
{
    my ($directory, $base, $ext) = @_;

    (my $newext = $ext) =~ s/vala$/c/;
    return (LANG_SUBDIR, $newext);
}

# Rewrite a single yacc file.
sub lang_yacc_rewrite
{
    my ($directory, $base, $ext) = @_;

    my $r = &lang_sub_obj;
    (my $newext = $ext) =~ tr/y/c/;
    return ($r, $newext);
}

# Rewrite a single yacc++ file.
sub lang_yaccxx_rewrite
{
    my ($directory, $base, $ext) = @_;

    my $r = &lang_sub_obj;
    (my $newext = $ext) =~ tr/y/c/;
    return ($r, $newext);
}

# Rewrite a single lex file.
sub lang_lex_rewrite
{
    my ($directory, $base, $ext) = @_;

    my $r = &lang_sub_obj;
    (my $newext = $ext) =~ tr/l/c/;
    return ($r, $newext);
}

# Rewrite a single lex++ file.
sub lang_lexxx_rewrite
{
    my ($directory, $base, $ext) = @_;

    my $r = &lang_sub_obj;
    (my $newext = $ext) =~ tr/l/c/;
    return ($r, $newext);
}

# Rewrite a single assembly file.
sub lang_asm_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single preprocessed assembly file.
sub lang_cppasm_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single Fortran 77 file.
sub lang_f77_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single Fortran file.
sub lang_fc_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single preprocessed Fortran file.
sub lang_ppfc_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single preprocessed Fortran 77 file.
sub lang_ppf77_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single ratfor file.
sub lang_ratfor_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single Objective C file.
sub lang_objc_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single Unified Parallel C file.
sub lang_upc_rewrite
{
    return &lang_sub_obj;
}

# Rewrite a single Java file.
sub lang_java_rewrite
{
    return LANG_SUBDIR;
}

# The lang_X_finish functions are called after all source file
# processing is done.  Each should handle defining rules for the
# language, etc.  A finish function is only called if a source file of
# the appropriate type has been seen.

sub lang_c_finish
{
    # Push all libobjs files onto de_ansi_files.  We actually only
    # push files which exist in the current directory, and which are
    # genuine source files.
    foreach my $file (keys %libsources)
    {
	if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file")
	{
	    $de_ansi_files{$1} = ''
	}
    }

    if (option 'ansi2knr' && keys %de_ansi_files)
    {
	# Make all _.c files depend on their corresponding .c files.
	my @objects;
	foreach my $base (sort keys %de_ansi_files)
	{
	    # Each _.c file must depend on ansi2knr; otherwise it
	    # might be used in a parallel build before it is built.
	    # We need to support files in the srcdir and in the build
	    # dir (because these files might be auto-generated.  But
	    # we can't use $< -- some makes only define $< during a
	    # suffix rule.
	    my $ansfile = $de_ansi_files{$base} . $base . '.c';
	    $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t"
			      . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) '
			      . '`if test -f $(srcdir)/' . $ansfile
			      . '; then echo $(srcdir)/' . $ansfile
			      . '; else echo ' . $ansfile . '; fi` '
			      . "| sed 's/^# \\([0-9]\\)/#line \\1/' "
			      . '| $(ANSI2KNR) > $@'
			      # If ansi2knr fails then we shouldn't
			      # create the _.c file
			      . " || rm -f \$\@\n");
	    push (@objects, $base . '_.$(OBJEXT)');
	    push (@objects, $base . '_.lo')
	      if var ('LIBTOOL');

	    # Explicitly clean the _.c files if they are in a
	    # subdirectory. (In the current directory they get erased
	    # by a `rm -f *_.c' rule.)
	    $clean_files{$base . '_.c'} = MOSTLY_CLEAN
	      if dirname ($base) ne '.';
	}

	# Make all _.o (and _.lo) files depend on ansi2knr.
	# Use a sneaky little hack to make it print nicely.
	&pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)');
    }
}

sub lang_vala_finish_target ($$)
{
  my ($self, $name) = @_;

  my $derived = canonicalize ($name);
  my $varname = $derived . '_SOURCES';
  my $var = var ($varname);

  if ($var)
    {
      foreach my $file ($var->value_as_list_recursive)
        {
          $output_rules .= "\$(srcdir)/$file: \$(srcdir)/${derived}_vala.stamp\n".
            "\t\@if test -f \$@; then :; else \\\n".
            "\t  rm -f \$(srcdir)/${derived}_vala.stamp; \\\n".
            "\t  \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n".
            "\tfi\n"
            if $file =~ s/(.*)\.vala$/$1.c/;
        }
    }

  # Add rebuild rules for generated header and vapi files
  my $flags = var ($derived . '_VALAFLAGS');
  if ($flags)
    {
      my $lastflag = '';
      foreach my $flag ($flags->value_as_list_recursive)
	{
	  if (grep (/$lastflag/, ('-H', '-h', '--header', '--internal-header',
	                          '--vapi', '--internal-vapi', '--gir')))
	    {
	      my $headerfile = $flag;
	      $output_rules .= "\$(srcdir)/$headerfile: \$(srcdir)/${derived}_vala.stamp\n".
		"\t\@if test -f \$@; then :; else \\\n".
		"\t  rm -f \$(srcdir)/${derived}_vala.stamp; \\\n".
		"\t  \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n".
		"\tfi\n";

	      # valac is not used when building from dist tarballs
	      # distribute the generated files
	      push_dist_common ($headerfile);
	      $clean_files{$headerfile} = MAINTAINER_CLEAN;
	    }
	  $lastflag = $flag;
	}
    }

  my $compile = $self->compile;

  # Rewrite each occurrence of `AM_VALAFLAGS' in the compile
  # rule into `${derived}_VALAFLAGS' if it exists.
  my $val = "${derived}_VALAFLAGS";
  $compile =~ s/\(AM_VALAFLAGS\)/\($val\)/
    if set_seen ($val);

  # VALAFLAGS is a user variable (per GNU Standards),
  # it should not be overridden in the Makefile...
  check_user_variables ['VALAFLAGS'];

  my $dirname = dirname ($name);

  # Only generate C code, do not run C compiler
  $compile .= " -C";

  my $verbose = verbose_flag ('VALAC');
  my $silent = silent_flag ();

  $output_rules .=
    "${derived}_vala.stamp: \$(${derived}_SOURCES)\n".
    "\t${verbose}${compile} \$(${derived}_SOURCES)\n".
    "\t${silent}touch \$@\n";

  push_dist_common ("${derived}_vala.stamp");

  $clean_files{"${derived}_vala.stamp"} = MAINTAINER_CLEAN;
}

# Add output rules to invoke valac and create stamp file as a witness
# to handle multiple outputs. This function is called after all source
# file processing is done.
sub lang_vala_finish
{
  my ($self) = @_;

  foreach my $prog (keys %known_programs)
    {
      lang_vala_finish_target ($self, $prog);
    }

  while (my ($name) = each %known_libraries)
    {
      lang_vala_finish_target ($self, $name);
    }
}

# The built .c files should be cleaned only on maintainer-clean
# as the .c files are distributed. This function is called for each
# .vala source file.
sub lang_vala_target_hook
{
  my ($self, $aggregate, $output, $input, %transform) = @_;

  $clean_files{$output} = MAINTAINER_CLEAN;
}

# This is a yacc helper which is called whenever we have decided to
# compile a yacc file.
sub lang_yacc_target_hook
{
    my ($self, $aggregate, $output, $input, %transform) = @_;

    my $flag = $aggregate . "_YFLAGS";
    my $flagvar = var $flag;
    my $YFLAGSvar = var 'YFLAGS';
    if (($flagvar && $flagvar->variable_value =~ /$DASH_D_PATTERN/o)
	|| ($YFLAGSvar && $YFLAGSvar->variable_value =~ /$DASH_D_PATTERN/o))
    {
	(my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//;
	my $header = $output_base . '.h';

	# Found a `-d' that applies to the compilation of this file.
	# Add a dependency for the generated header file, and arrange
	# for that file to be included in the distribution.
	foreach my $cond (Automake::Rule::define (${header}, 'internal',
						  RULE_AUTOMAKE, TRUE,
						  INTERNAL))
	  {
	    my $condstr = $cond->subst_string;
	    $output_rules .=
	      "$condstr${header}: $output\n"
	      # Recover from removal of $header
	      . "$condstr\t\@if test ! -f \$@; then \\\n"
	      . "$condstr\t  rm -f $output; \\\n"
	      . "$condstr\t  \$(MAKE) \$(AM_MAKEFLAGS) $output; \\\n"
	      . "$condstr\telse :; fi\n";
	  }
	# Distribute the generated file, unless its .y source was
	# listed in a nodist_ variable.  (&handle_source_transform
	# will set DIST_SOURCE.)
	&push_dist_common ($header)
	  if $transform{'DIST_SOURCE'};

	# If the files are built in the build directory, then we want
	# to remove them with `make clean'.  If they are in srcdir
	# they shouldn't be touched.  However, we can't determine this
	# statically, and the GNU rules say that yacc/lex output files
	# should be removed by maintainer-clean.  So that's what we
	# do.
	$clean_files{$header} = MAINTAINER_CLEAN;
    }
    # Erase $OUTPUT on `make maintainer-clean' (by GNU standards).
    # See the comment above for $HEADER.
    $clean_files{$output} = MAINTAINER_CLEAN;
}

# This is a lex helper which is called whenever we have decided to
# compile a lex file.
sub lang_lex_target_hook
{
    my ($self, $aggregate, $output, $input) = @_;
    # If the files are built in the build directory, then we want to
    # remove them with `make clean'.  If they are in srcdir they
    # shouldn't be touched.  However, we can't determine this
    # statically, and the GNU rules say that yacc/lex output files
    # should be removed by maintainer-clean.  So that's what we do.
    $clean_files{$output} = MAINTAINER_CLEAN;
}

# This is a helper for both lex and yacc.
sub yacc_lex_finish_helper
{
  return if defined $language_scratch{'lex-yacc-done'};
  $language_scratch{'lex-yacc-done'} = 1;

  # FIXME: for now, no line number.
  require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
  &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
}

sub lang_yacc_finish
{
  return if defined $language_scratch{'yacc-done'};
  $language_scratch{'yacc-done'} = 1;

  reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead";

  yacc_lex_finish_helper;
}


sub lang_lex_finish
{
  return if defined $language_scratch{'lex-done'};
  $language_scratch{'lex-done'} = 1;

  yacc_lex_finish_helper;
}


# Given a hash table of linker names, pick the name that has the most
# precedence.  This is lame, but something has to have global
# knowledge in order to eliminate the conflict.  Add more linkers as
# required.
sub resolve_linker
{
    my (%linkers) = @_;

    foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK))
    {
	return $l if defined $linkers{$l};
    }
    return 'LINK';
}

# Called to indicate that an extension was used.
sub saw_extension
{
    my ($ext) = @_;
    if (! defined $extension_seen{$ext})
    {
	$extension_seen{$ext} = 1;
    }
    else
    {
	++$extension_seen{$ext};
    }
}

# Return the number of files seen for a given language.  Knows about
# special cases we care about.  FIXME: this is hideous.  We need
# something that involves real language objects.  For instance yacc
# and yaccxx could both derive from a common yacc class which would
# know about the strange ylwrap requirement.  (Or better yet we could
# just not support legacy yacc!)
sub count_files_for_language
{
    my ($name) = @_;

    my @names;
    if ($name eq 'yacc' || $name eq 'yaccxx')
    {
	@names = ('yacc', 'yaccxx');
    }
    elsif ($name eq 'lex' || $name eq 'lexxx')
    {
	@names = ('lex', 'lexxx');
    }
    else
    {
	@names = ($name);
    }

    my $r = 0;
    foreach $name (@names)
    {
	my $lang = $languages{$name};
	foreach my $ext (@{$lang->extensions})
	{
	    $r += $extension_seen{$ext}
		if defined $extension_seen{$ext};
	}
    }

    return $r
}

# Called to ask whether source files have been seen . If HEADERS is 1,
# headers can be included.
sub saw_sources_p
{
    my ($headers) = @_;

    # count all the sources
    my $count = 0;
    foreach my $val (values %extension_seen)
    {
	$count += $val;
    }

    if (!$headers)
    {
	$count -= count_files_for_language ('header');
    }

    return $count > 0;
}


# register_language (%ATTRIBUTE)
# ------------------------------
# Register a single language.
# Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
sub register_language (%)
{
  my (%option) = @_;

  # Set the defaults.
  $option{'ansi'} = 0
    unless defined $option{'ansi'};
  $option{'autodep'} = 'no'
    unless defined $option{'autodep'};
  $option{'linker'} = ''
    unless defined $option{'linker'};
  $option{'flags'} = []
    unless defined $option{'flags'};
  $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) }
    unless defined $option{'output_extensions'};
  $option{'nodist_specific'} = 0
    unless defined $option{'nodist_specific'};

  my $lang = new Language (%option);

  # Fill indexes.
  $extension_map{$_} = $lang->name foreach @{$lang->extensions};
  $languages{$lang->name} = $lang;
  my $link = $lang->linker;
  if ($link)
    {
      if (exists $link_languages{$link})
	{
	  prog_error ("`$link' has different definitions in "
		      . $lang->name . " and " . $link_languages{$link}->name)
	    if $lang->link ne $link_languages{$link}->link;
	}
      else
	{
	  $link_languages{$link} = $lang;
	}
    }

  # Update the pattern of known extensions.
  accept_extensions (@{$lang->extensions});

  # Upate the $suffix_rule map.
  foreach my $suffix (@{$lang->extensions})
    {
      foreach my $dest (&{$lang->output_extensions} ($suffix))
	{
	  register_suffix_rule (INTERNAL, $suffix, $dest);
	}
    }
}

# derive_suffix ($EXT, $OBJ)
# --------------------------
# This function is used to find a path from a user-specified suffix $EXT
# to $OBJ or to some other suffix we recognize internally, e.g. `cc'.
sub derive_suffix ($$)
{
  my ($source_ext, $obj) = @_;

  while (! $extension_map{$source_ext}
	 && $source_ext ne $obj
	 && exists $suffix_rules->{$source_ext}
	 && exists $suffix_rules->{$source_ext}{$obj})
    {
      $source_ext = $suffix_rules->{$source_ext}{$obj}[0];
    }

  return $source_ext;
}


################################################################

# Pretty-print something and append to output_rules.
sub pretty_print_rule
{
    $output_rules .= &makefile_wrap (@_);
}


################################################################


## -------------------------------- ##
## Handling the conditional stack.  ##
## -------------------------------- ##


# $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;
}


my %_am_macro_for_cond =
  (
  AMDEP => "one of the compiler tests\n"
	   . "    AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,\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__fastdepUPC => 'AM_PROG_UPC'
  );

# $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);
}





## ------------------------ ##
## Handling the variables.  ##
## ------------------------ ##


# &define_pretty_variable ($VAR, $COND, $WHERE, @VALUE)
# -----------------------------------------------------
# Like define_variable, but the value is a list, and the variable may
# be defined conditionally.  The second argument is the condition
# under which the value should be defined; this should be the empty
# string to define the variable unconditionally.  The third argument
# is a list holding the values to use for the variable.  The value is
# pretty printed in the output file.
sub define_pretty_variable ($$$@)
{
    my ($var, $cond, $where, @value) = @_;

    if (! vardef ($var, $cond))
    {
	Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value",
				    '', $where, VAR_PRETTY);
	rvar ($var)->rdef ($cond)->set_seen;
    }
}


# define_variable ($VAR, $VALUE, $WHERE)
# --------------------------------------
# Define a new Automake Makefile variable VAR to VALUE, but only if
# not already defined.
sub define_variable ($$$)
{
    my ($var, $value, $where) = @_;
    define_pretty_variable ($var, TRUE, $where, $value);
}


# define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE)
# -----------------------------------------------------------
# Define the $VAR which content is the list of file names composed of
# a @BASENAME and the $EXTENSION.
sub define_files_variable ($\@$$)
{
  my ($var, $basename, $extension, $where) = @_;
  define_variable ($var,
		   join (' ', map { "$_.$extension" } @$basename),
		   $where);
}


# Like define_variable, but define a variable to be the configure
# substitution by the same name.
sub define_configure_variable ($)
{
  my ($var) = @_;

  my $pretty = VAR_ASIS;
  my $owner = VAR_CONFIGURE;

  # Some variables we do not want to output.  For instance it
  # would be a bad idea to output `U = @U@` when `@U@` can be
  # substituted as `\`.
  $pretty = VAR_SILENT if exists $ignored_configure_vars{$var};

  # ANSI2KNR is a variable that Automake wants to redefine, so
  # it must be owned by Automake.  (It is also used as a proof
  # that AM_C_PROTOTYPES has been run, that's why we do not simply
  # omit the AC_SUBST.)
  $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR';

  Automake::Variable::define ($var, $owner, '', TRUE, subst $var,
			      '', $configure_vars{$var}, $pretty);
}


# define_compiler_variable ($LANG)
# --------------------------------
# Define a compiler variable.  We also handle defining the `LT'
# version of the command when using libtool.
sub define_compiler_variable ($)
{
    my ($lang) = @_;

    my ($var, $value) = ($lang->compiler, $lang->compile);
    my $libtool_tag = '';
    $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
      if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
    &define_variable ($var, $value, INTERNAL);
    if (var ('LIBTOOL'))
      {
	my $verbose = define_verbose_libtool ();
	&define_variable ("LT$var",
			  "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
			  . "\$(LIBTOOLFLAGS) --mode=compile $value",
			  INTERNAL);
      }
    define_verbose_tagvar ($lang->ccer || 'GEN');
}


# define_linker_variable ($LANG)
# ------------------------------
# Define linker variables.
sub define_linker_variable ($)
{
    my ($lang) = @_;

    my $libtool_tag = '';
    $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
      if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
    # CCLD = $(CC).
    &define_variable ($lang->lder, $lang->ld, INTERNAL);
    # CCLINK = $(CCLD) blah blah...
    my $link = '';
    if (var ('LIBTOOL'))
      {
	my $verbose = define_verbose_libtool ();
	$link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
		. "\$(LIBTOOLFLAGS) --mode=link ";
      }
    &define_variable ($lang->linker, $link . $lang->link, INTERNAL);
    &define_variable ($lang->compiler,  $lang);
    &define_verbose_tagvar ($lang->lder || 'GEN');
}

sub define_per_target_linker_variable ($$)
{
  my ($linker, $target) = @_;

  # If the user wrote a custom link command, we don't define ours.
  return "${target}_LINK"
    if set_seen "${target}_LINK";

  my $xlink = $linker ? $linker : 'LINK';

  my $lang = $link_languages{$xlink};
  prog_error "Unknown language for linker variable `$xlink'"
    unless $lang;

  my $link_command = $lang->link;
  if (var 'LIBTOOL')
    {
      my $libtool_tag = '';
      $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
	if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};

      my $verbose = define_verbose_libtool ();
      $link_command =
	"\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) "
	. "--mode=link " . $link_command;
    }

  # Rewrite each occurrence of `AM_$flag' in the link
  # command into `${derived}_$flag' if it exists.
  my $orig_command = $link_command;
  my @flags = (@{$lang->flags}, 'LDFLAGS');
  push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL';
  for my $flag (@flags)
    {
      my $val = "${target}_$flag";
      $link_command =~ s/\(AM_$flag\)/\($val\)/
	if set_seen ($val);
    }

  # If the computed command is the same as the generic command, use
  # the command linker variable.
  return ($lang->linker, $lang->lder)
    if $link_command eq $orig_command;

  &define_variable ("${target}_LINK", $link_command, INTERNAL);
  return ("${target}_LINK", $lang->lder);
}

################################################################

# &check_trailing_slash ($WHERE, $LINE)
# --------------------------------------
# Return 1 iff $LINE ends with a slash.
# Might modify $LINE.
sub check_trailing_slash ($\$)
{
  my ($where, $line) = @_;

  # Ignore `##' lines.
  return 0 if $$line =~ /$IGNORE_PATTERN/o;

  # Catch and fix a common error.
  msg "syntax", $where, "whitespace following trailing backslash"
    if $$line =~ s/\\\s+\n$/\\\n/;

  return $$line =~ /\\$/;
}


# &read_am_file ($AMFILE, $WHERE)
# -------------------------------
# Read Makefile.am and set up %contents.  Simultaneously copy lines
# from Makefile.am into $output_trailer, or define variables as
# appropriate.  NOTE we put rules in the trailer section.  We want
# user rules to come after our generated stuff.
sub read_am_file ($$)
{
    my ($amfile, $where) = @_;

    my $am_file = new Automake::XFile ("< $amfile");
    verb "reading $amfile";

    # Keep track of the youngest output dependency.
    my $mtime = mtime $amfile;
    $output_deps_greatest_timestamp = $mtime
      if $mtime > $output_deps_greatest_timestamp;

    my $spacing = '';
    my $comment = '';
    my $blank = 0;
    my $saw_bk = 0;
    my $var_look = VAR_ASIS;

    use constant IN_VAR_DEF => 0;
    use constant IN_RULE_DEF => 1;
    use constant IN_COMMENT => 2;
    my $prev_state = IN_RULE_DEF;

    while ($_ = $am_file->getline)
    {
	$where->set ("$amfile:$.");
	if (/$IGNORE_PATTERN/o)
	{
	    # Merely delete comments beginning with two hashes.
	}
	elsif (/$WHITE_PATTERN/o)
	{
	    error $where, "blank line following trailing backslash"
	      if $saw_bk;
	    # Stick a single white line before the incoming macro or rule.
	    $spacing = "\n";
	    $blank = 1;
	    # Flush all comments seen so far.
	    if ($comment ne '')
	    {
		$output_vars .= $comment;
		$comment = '';
	    }
	}
	elsif (/$COMMENT_PATTERN/o)
	{
	    # Stick comments before the incoming macro or rule.  Make
	    # sure a blank line precedes the first block of comments.
	    $spacing = "\n" unless $blank;
	    $blank = 1;
	    $comment .= $spacing . $_;
	    $spacing = '';
	    $prev_state = IN_COMMENT;
	}
	else
	{
	    last;
	}
	$saw_bk = check_trailing_slash ($where, $_);
    }

    # We save the conditional stack on entry, and then check to make
    # sure it is the same on exit.  This lets us conditionally include
    # other files.
    my @saved_cond_stack = @cond_stack;
    my $cond = new Automake::Condition (@cond_stack);

    my $last_var_name = '';
    my $last_var_type = '';
    my $last_var_value = '';
    my $last_where;
    # FIXME: shouldn't use $_ in this loop; it is too big.
    while ($_)
    {
	$where->set ("$amfile:$.");

	# Make sure the line is \n-terminated.
	chomp;
	$_ .= "\n";

	# Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
	# used by users.  @MAINT@ is an anachronism now.
	$_ =~ s/\@MAINT\@//g
	    unless $seen_maint_mode;

	my $new_saw_bk = check_trailing_slash ($where, $_);

	if (/$IGNORE_PATTERN/o)
	{
	    # Merely delete comments beginning with two hashes.

	    # Keep any backslash from the previous line.
	    $new_saw_bk = $saw_bk;
	}
	elsif (/$WHITE_PATTERN/o)
	{
	    # Stick a single white line before the incoming macro or rule.
	    $spacing = "\n";
	    error $where, "blank line following trailing backslash"
	      if $saw_bk;
	}
	elsif (/$COMMENT_PATTERN/o)
	{
	    error $where, "comment following trailing backslash"
	      if $saw_bk && $prev_state != IN_COMMENT;

	    # Stick comments before the incoming macro or rule.
	    $comment .= $spacing . $_;
	    $spacing = '';
	    $prev_state = IN_COMMENT;
	}
	elsif ($saw_bk)
	{
	    if ($prev_state == IN_RULE_DEF)
	    {
	      my $cond = new Automake::Condition @cond_stack;
	      $output_trailer .= $cond->subst_string;
	      $output_trailer .= $_;
	    }
	    elsif ($prev_state == IN_COMMENT)
	    {
		# If the line doesn't start with a `#', add it.
		# We do this because a continued comment like
		#   # A = foo \
		#         bar \
		#         baz
		# is not portable.  BSD make doesn't honor
		# escaped newlines in comments.
		s/^#?/#/;
		$comment .= $spacing . $_;
	    }
	    else # $prev_state == IN_VAR_DEF
	    {
	      $last_var_value .= ' '
		unless $last_var_value =~ /\s$/;
	      $last_var_value .= $_;

	      if (!/\\$/)
		{
		  Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
					      $last_var_type, $cond,
					      $last_var_value, $comment,
					      $last_where, VAR_ASIS)
		    if $cond != FALSE;
		  $comment = $spacing = '';
		}
	    }
	}

	elsif (/$IF_PATTERN/o)
	  {
	    $cond = cond_stack_if ($1, $2, $where);
	  }
	elsif (/$ELSE_PATTERN/o)
	  {
	    $cond = cond_stack_else ($1, $2, $where);
	  }
	elsif (/$ENDIF_PATTERN/o)
	  {
	    $cond = cond_stack_endif ($1, $2, $where);
	  }

	elsif (/$RULE_PATTERN/o)
	{
	    # Found a rule.
	    $prev_state = IN_RULE_DEF;

	    # For now we have to output all definitions of user rules
	    # and can't diagnose duplicates (see the comment in
	    # Automake::Rule::define). So we go on and ignore the return value.
	    Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where);

	    check_variable_expansions ($_, $where);

	    $output_trailer .= $comment . $spacing;
	    my $cond = new Automake::Condition @cond_stack;
	    $output_trailer .= $cond->subst_string;
	    $output_trailer .= $_;
	    $comment = $spacing = '';
	}
	elsif (/$ASSIGNMENT_PATTERN/o)
	{
	    # Found a macro definition.
	    $prev_state = IN_VAR_DEF;
	    $last_var_name = $1;
	    $last_var_type = $2;
	    $last_var_value = $3;
	    $last_where = $where->clone;
	    if ($3 ne '' && substr ($3, -1) eq "\\")
	      {
		# We preserve the `\' because otherwise the long lines
		# that are generated will be truncated by broken
		# `sed's.
		$last_var_value = $3 . "\n";
	      }
	    # Normally we try to output variable definitions in the
	    # same format they were input.  However, POSIX compliant
	    # systems are not required to support lines longer than
	    # 2048 bytes (most notably, some sed implementation are
	    # limited to 4000 bytes, and sed is used by config.status
	    # to rewrite Makefile.in into Makefile).  Moreover nobody
	    # would really write such long lines by hand since it is
	    # hardly maintainable.  So if a line is longer that 1000
	    # bytes (an arbitrary limit), assume it has been
	    # automatically generated by some tools, and flatten the
	    # variable definition.  Otherwise, keep the variable as it
	    # as been input.
	    $var_look = VAR_PRETTY if length ($last_var_value) >= 1000;

	    if (!/\\$/)
	      {
		Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
					    $last_var_type, $cond,
					    $last_var_value, $comment,
					    $last_where, $var_look)
		  if $cond != FALSE;
		$comment = $spacing = '';
		$var_look = VAR_ASIS;
	      }
	}
	elsif (/$INCLUDE_PATTERN/o)
	{
	    my $path = $1;

	    if ($path =~ s/^\$\(top_srcdir\)\///)
	      {
		push (@include_stack, "\$\(top_srcdir\)/$path");
		# Distribute any included file.

		# Always use the $(top_srcdir) prefix in DIST_COMMON,
		# otherwise OSF make will implicitly copy the included
		# file in the build tree during `make distdir' to satisfy
		# the dependency.
		# (subdircond2.test and subdircond3.test will fail.)
		push_dist_common ("\$\(top_srcdir\)/$path");
	      }
	    else
	      {
		$path =~ s/\$\(srcdir\)\///;
		push (@include_stack, "\$\(srcdir\)/$path");
		# Always use the $(srcdir) prefix in DIST_COMMON,
		# otherwise OSF make will implicitly copy the included
		# file in the build tree during `make distdir' to satisfy
		# the dependency.
		# (subdircond2.test and subdircond3.test will fail.)
		push_dist_common ("\$\(srcdir\)/$path");
		$path = $relative_dir . "/" . $path if $relative_dir ne '.';
	      }
	    $where->push_context ("`$path' included from here");
	    &read_am_file ($path, $where);
	    $where->pop_context;
	}
	else
	{
	    # This isn't an error; it is probably a continued rule.
	    # In fact, this is what we assume.
	    $prev_state = IN_RULE_DEF;
	    check_variable_expansions ($_, $where);
	    $output_trailer .= $comment . $spacing;
	    my $cond = new Automake::Condition @cond_stack;
	    $output_trailer .= $cond->subst_string;
	    $output_trailer .= $_;
	    $comment = $spacing = '';
	    error $where, "`#' comment at start of rule is unportable"
	      if $_ =~ /^\t\s*\#/;
	}

	$saw_bk = $new_saw_bk;
	$_ = $am_file->getline;
    }

    $output_trailer .= $comment;

    error ($where, "trailing backslash on last line")
      if $saw_bk;

    error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack"
		    : "too many conditionals closed in include file"))
      if "@saved_cond_stack" ne "@cond_stack";
}


# define_standard_variables ()
# ----------------------------
# A helper for read_main_am_file which initializes configure variables
# and variables from header-vars.am.
sub define_standard_variables
{
  my $saved_output_vars = $output_vars;
  my ($comments, undef, $rules) =
    file_contents_internal (1, "$libdir/am/header-vars.am",
			    new Automake::Location);

  foreach my $var (sort keys %configure_vars)
    {
      &define_configure_variable ($var);
    }

  $output_vars .= $comments . $rules;
}

# Read main am file.
sub read_main_am_file
{
    my ($amfile) = @_;

    # This supports the strange variable tricks we are about to play.
    prog_error (macros_dump () . "variable defined before read_main_am_file")
      if (scalar (variables) > 0);

    # Generate copyright header for generated Makefile.in.
    # We do discard the output of predefined variables, handled below.
    $output_vars = ("# $in_file_name generated by automake "
		   . $VERSION . " from $am_file_name.\n");
    $output_vars .= '# ' . subst ('configure_input') . "\n";
    $output_vars .= $gen_copyright;

    # We want to predefine as many variables as possible.  This lets
    # the user set them with `+=' in Makefile.am.
    &define_standard_variables;

    # Read user file, which might override some of our values.
    &read_am_file ($amfile, new Automake::Location);
}



################################################################

# $FLATTENED
# &flatten ($STRING)
# ------------------
# Flatten the $STRING and return the result.
sub flatten
{
  $_ = shift;

  s/\\\n//somg;
  s/\s+/ /g;
  s/^ //;
  s/ $//;

  return $_;
}


# transform_token ($TOKEN, \%PAIRS, $KEY)
# =======================================
# Return the value associated to $KEY in %PAIRS, as used on $TOKEN
# (which should be ?KEY? or any of the special %% requests)..
sub transform_token ($$$)
{
  my ($token, $transform, $key) = @_;
  my $res = $transform->{$key};
  prog_error "Unknown key `$key' in `$token'" unless defined $res;
  return $res;
}


# transform ($TOKEN, \%PAIRS)
# ===========================
# If ($TOKEN, $VAL) is in %PAIRS:
#   - replaces %KEY% with $VAL,
#   - enables/disables ?KEY? and ?!KEY?,
#   - replaces %?KEY% with TRUE or FALSE.
#   - replaces %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE% with
#     IFTRUE / IFFALSE, as appropriate.
sub transform ($$)
{
  my ($token, $transform) = @_;

  # %KEY%.
  # Must be before the following pattern to exclude the case
  # when there is neither IFTRUE nor IFFALSE.
  if ($token =~ /^%([\w\-]+)%$/)
    {
      return transform_token ($token, $transform, $1);
    }
  # %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE%.
  elsif ($token =~ /^%([\w\-]+)(?:\?([^?:%]+))?(?::([^?:%]+))?%$/)
    {
      return transform_token ($token, $transform, $1) ? ($2 || '') : ($3 || '');
    }
  # %?KEY%.
  elsif ($token =~ /^%\?([\w\-]+)%$/)
    {
      return transform_token ($token, $transform, $1) ? 'TRUE' : 'FALSE';
    }
  # ?KEY? and ?!KEY?.
  elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x)
    {
      my $neg = ($1 eq '!') ? 1 : 0;
      my $val = transform_token ($token, $transform, $2);
      return (!!$val == $neg) ? '##%' : '';
    }
  else
    {
      prog_error "Unknown request format: $token";
    }
}


# @PARAGRAPHS
# &make_paragraphs ($MAKEFILE, [%TRANSFORM])
# ------------------------------------------
# Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
# paragraphs.
sub make_paragraphs ($%)
{
  my ($file, %transform) = @_;

  # Complete %transform with global options.
  # Note that %transform goes last, so it overrides global options.
  %transform = ('CYGNUS'      => !! option 'cygnus',
		 'MAINTAINER-MODE'
		 => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',

		 'XZ'          => !! option 'dist-xz',
		 'LZMA'        => !! option 'dist-lzma',
		 'BZIP2'       => !! option 'dist-bzip2',
		 'COMPRESS'    => !! option 'dist-tarZ',
		 'GZIP'        =>  ! option 'no-dist-gzip',
		 'SHAR'        => !! option 'dist-shar',
		 'ZIP'         => !! option 'dist-zip',

		 'INSTALL-INFO' =>  ! option 'no-installinfo',
		 'INSTALL-MAN'  =>  ! option 'no-installman',
		 'HAVE-MANS'    => !! var ('MANS'),
		 'CK-NEWS'      => !! option 'check-news',

		 'SUBDIRS'      => !! var ('SUBDIRS'),
		 'TOPDIR_P'     => $relative_dir eq '.',

		 'BUILD'    => ($seen_canonical >= AC_CANONICAL_BUILD),
		 'HOST'     => ($seen_canonical >= AC_CANONICAL_HOST),
		 'TARGET'   => ($seen_canonical >= AC_CANONICAL_TARGET),

		 'LIBTOOL'      => !! var ('LIBTOOL'),
		 'NONLIBTOOL'   => 1,
		 'FIRST'        => ! $transformed_files{$file},
		%transform);

  $transformed_files{$file} = 1;
  $_ = $am_file_cache{$file};

  if (! defined $_)
    {
      verb "reading $file";
      # Swallow the whole file.
      my $fc_file = new Automake::XFile "< $file";
      my $saved_dollar_slash = $/;
      undef $/;
      $_ = $fc_file->getline;
      $/ = $saved_dollar_slash;
      $fc_file->close;

      # Remove ##-comments.
      # Besides we don't need more than two consecutive new-lines.
      s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom;

      $am_file_cache{$file} = $_;
    }

  # Substitute Automake template tokens.
  s/(?: % \?? [\w\-]+ %
      | % [\w\-]+ (?:\?[^?:%]+)? (?::[^?:%]+)? %
      | \? !? [\w\-]+ \?
    )/transform($&, \%transform)/gex;
  # transform() may have added some ##%-comments to strip.
  # (we use `##%' instead of `##' so we can distinguish ##%##%##% from
  # ####### and do not remove the latter.)
  s/^[ \t]*(?:##%)+.*\n//gm;

  # Split at unescaped new lines.
  my @lines = split (/(?<!\\)\n/, $_);
  my @res;

  while (defined ($_ = shift @lines))
    {
      my $paragraph = $_;
      # If we are a rule, eat as long as we start with a tab.
      if (/$RULE_PATTERN/smo)
	{
	  while (defined ($_ = shift @lines) && $_ =~ /^\t/)
	    {
	      $paragraph .= "\n$_";
	    }
	  unshift (@lines, $_);
	}

      # If we are a comments, eat as much comments as you can.
      elsif (/$COMMENT_PATTERN/smo)
	{
	  while (defined ($_ = shift @lines)
		 && $_ =~ /$COMMENT_PATTERN/smo)
	    {
	      $paragraph .= "\n$_";
	    }
	  unshift (@lines, $_);
	}

      push @res, $paragraph;
    }

  return @res;
}



# ($COMMENT, $VARIABLES, $RULES)
# &file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM])
# -------------------------------------------------------------
# Return contents of a file from $libdir/am, automatically skipping
# macros or rules which are already known. $IS_AM iff the caller is
# reading an Automake file (as opposed to the user's Makefile.am).
sub file_contents_internal ($$$%)
{
    my ($is_am, $file, $where, %transform) = @_;

    $where->set ($file);

    my $result_vars = '';
    my $result_rules = '';
    my $comment = '';
    my $spacing = '';

    # The following flags are used to track rules spanning across
    # multiple paragraphs.
    my $is_rule = 0;		# 1 if we are processing a rule.
    my $discard_rule = 0;	# 1 if the current rule should not be output.

    # We save the conditional stack on entry, and then check to make
    # sure it is the same on exit.  This lets us conditionally include
    # other files.
    my @saved_cond_stack = @cond_stack;
    my $cond = new Automake::Condition (@cond_stack);

    foreach (make_paragraphs ($file, %transform))
    {
	# FIXME: no line number available.
	$where->set ($file);

	# Sanity checks.
	error $where, "blank line following trailing backslash:\n$_"
	  if /\\$/;
	error $where, "comment following trailing backslash:\n$_"
	  if /\\#/;

	if (/^$/)
	{
	    $is_rule = 0;
	    # Stick empty line before the incoming macro or rule.
	    $spacing = "\n";
	}
	elsif (/$COMMENT_PATTERN/mso)
	{
	    $is_rule = 0;
	    # Stick comments before the incoming macro or rule.
	    $comment = "$_\n";
	}

	# Handle inclusion of other files.
	elsif (/$INCLUDE_PATTERN/o)
	{
	    if ($cond != FALSE)
	      {
		my $file = ($is_am ? "$libdir/am/" : '') . $1;
		$where->push_context ("`$file' included from here");
		# N-ary `.=' fails.
		my ($com, $vars, $rules)
		  = file_contents_internal ($is_am, $file, $where, %transform);
		$where->pop_context;
		$comment .= $com;
		$result_vars .= $vars;
		$result_rules .= $rules;
	      }
	}

	# Handling the conditionals.
	elsif (/$IF_PATTERN/o)
	  {
	    $cond = cond_stack_if ($1, $2, $file);
	  }
	elsif (/$ELSE_PATTERN/o)
	  {
	    $cond = cond_stack_else ($1, $2, $file);
	  }
	elsif (/$ENDIF_PATTERN/o)
	  {
	    $cond = cond_stack_endif ($1, $2, $file);
	  }

	# Handling rules.
	elsif (/$RULE_PATTERN/mso)
	{
	  $is_rule = 1;
	  $discard_rule = 0;
	  # Separate relationship from optional actions: the first
	  # `new-line tab" not preceded by backslash (continuation
	  # line).
	  my $paragraph = $_;
	  /^(.*?)(?:(?<!\\)\n(\t.*))?$/s;
	  my ($relationship, $actions) = ($1, $2 || '');

	  # Separate targets from dependencies: the first colon.
	  $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
	  my ($targets, $dependencies) = ($1, $2);
	  # Remove the escaped new lines.
	  # I don't know why, but I have to use a tmp $flat_deps.
	  my $flat_deps = &flatten ($dependencies);
	  my @deps = split (' ', $flat_deps);

	  foreach (split (' ', $targets))
	    {
	      # FIXME: 1. We are not robust to people defining several targets
	      # at once, only some of them being in %dependencies.  The
	      # actions from the targets in %dependencies are usually generated
	      # from the content of %actions, but if some targets in $targets
	      # are not in %dependencies the ELSE branch will output
	      # a rule for all $targets (i.e. the targets which are both
	      # in %dependencies and $targets will have two rules).

	      # FIXME: 2. The logic here is not able to output a
	      # multi-paragraph rule several time (e.g. for each condition
	      # it is defined for) because it only knows the first paragraph.

	      # FIXME: 3. We are not robust to people defining a subset
	      # of a previously defined "multiple-target" rule.  E.g.
	      # `foo:' after `foo bar:'.

	      # Output only if not in FALSE.
	      if (defined $dependencies{$_} && $cond != FALSE)
		{
		  &depend ($_, @deps);
		  register_action ($_, $actions);
		}
	      else
		{
		  # Free-lance dependency.  Output the rule for all the
		  # targets instead of one by one.
		  my @undefined_conds =
		    Automake::Rule::define ($targets, $file,
					    $is_am ? RULE_AUTOMAKE : RULE_USER,
					    $cond, $where);
		  for my $undefined_cond (@undefined_conds)
		    {
		      my $condparagraph = $paragraph;
		      $condparagraph =~ s/^/$undefined_cond->subst_string/gme;
		      $result_rules .= "$spacing$comment$condparagraph\n";
		    }
		  if (scalar @undefined_conds == 0)
		    {
		      # Remember to discard next paragraphs
		      # if they belong to this rule.
		      # (but see also FIXME: #2 above.)
		      $discard_rule = 1;
		    }
		  $comment = $spacing = '';
		  last;
		}
	    }
	}

	elsif (/$ASSIGNMENT_PATTERN/mso)
	{
	    my ($var, $type, $val) = ($1, $2, $3);
	    error $where, "variable `$var' with trailing backslash"
	      if /\\$/;

	    $is_rule = 0;

	    Automake::Variable::define ($var,
					$is_am ? VAR_AUTOMAKE : VAR_MAKEFILE,
					$type, $cond, $val, $comment, $where,
					VAR_ASIS)
	      if $cond != FALSE;

	    $comment = $spacing = '';
	}
	else
	{
	    # This isn't an error; it is probably some tokens which
	    # configure is supposed to replace, such as `@SET-MAKE@',
	    # or some part of a rule cut by an if/endif.
	    if (! $cond->false && ! ($is_rule && $discard_rule))
	      {
		s/^/$cond->subst_string/gme;
		$result_rules .= "$spacing$comment$_\n";
	      }
	    $comment = $spacing = '';
	}
    }

    error ($where, @cond_stack ?
	   "unterminated conditionals: @cond_stack" :
	   "too many conditionals closed in include file")
      if "@saved_cond_stack" ne "@cond_stack";

    return ($comment, $result_vars, $result_rules);
}


# $CONTENTS
# &file_contents ($BASENAME, $WHERE, [%TRANSFORM])
# ------------------------------------------------
# Return contents of a file from $libdir/am, automatically skipping
# macros or rules which are already known.
sub file_contents ($$%)
{
    my ($basename, $where, %transform) = @_;
    my ($comments, $variables, $rules) =
      file_contents_internal (1, "$libdir/am/$basename.am", $where,
			      %transform);
    return "$comments$variables$rules";
}


# @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;
}


# 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.
#
# Usage is: am_install_var (OPTION..., file, HOW, where...)
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;
}


################################################################

# Each key in this hash is the name of a directory holding a
# Makefile.in.  These variables are local to `is_make_dir'.
my %make_dirs = ();
my $make_dirs_set = 0;

sub is_make_dir
{
    my ($dir) = @_;
    if (! $make_dirs_set)
    {
	foreach my $iter (@configure_input_files)
	{
	    $make_dirs{dirname ($iter)} = 1;
	}
	# We also want to notice Makefile.in's.
	foreach my $iter (@other_input_files)
	{
	    if ($iter =~ /Makefile\.in$/)
	    {
		$make_dirs{dirname ($iter)} = 1;
	    }
	}
	$make_dirs_set = 1;
    }
    return defined $make_dirs{$dir};
}

################################################################

# Find the aux dir.  This should match the algorithm used by
# ./configure. (See the Autoconf documentation for for
# AC_CONFIG_AUX_DIR.)
sub locate_aux_dir ()
{
  if (! $config_aux_dir_set_in_configure_ac)
    {
      # The default auxiliary directory is the first
      # of ., .., or ../.. that contains install-sh.
      # Assume . if install-sh doesn't exist yet.
      for my $dir (qw (. .. ../..))
	{
	  if (-f "$dir/install-sh")
	    {
	      $config_aux_dir = $dir;
	      last;
	    }
	}
      $config_aux_dir = '.' unless $config_aux_dir;
    }
  # Avoid unsightly '/.'s.
  $am_config_aux_dir =
    '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
  $am_config_aux_dir =~ s,/*$,,;
}


# &maybe_push_required_file ($DIR, $FILE, $FULLFILE)
# --------------------------------------------------
# See if we want to push this file onto dist_common.  This function
# encodes the rules for deciding when to do so.
sub maybe_push_required_file
{
  my ($dir, $file, $fullfile) = @_;

  if ($dir eq $relative_dir)
    {
      push_dist_common ($file);
      return 1;
    }
  elsif ($relative_dir eq '.' && ! &is_make_dir ($dir))
    {
      # If we are doing the topmost directory, and the file is in a
      # subdir which does not have a Makefile, then we distribute it
      # here.

      # If a required file is above the source tree, it is important
      # to prefix it with `$(srcdir)' so that no VPATH search is
      # performed.  Otherwise problems occur with Make implementations
      # that rewrite and simplify rules whose dependencies are found in a
      # VPATH location.  Here is an example with OSF1/Tru64 Make.
      #
      #   % cat Makefile
      #   VPATH = sub
      #   distdir: ../a
      #	          echo ../a
      #   % ls
      #   Makefile a
      #   % make
      #   echo a
      #   a
      #
      # Dependency `../a' was found in `sub/../a', but this make
      # implementation simplified it as `a'.  (Note that the sub/
      # directory does not even exist.)
      #
      # This kind of VPATH rewriting seems hard to cancel.  The
      # distdir.am hack against VPATH rewriting works only when no
      # simplification is done, i.e., for dependencies which are in
      # subdirectories, not in enclosing directories.  Hence, in
      # the latter case we use a full path to make sure no VPATH
      # search occurs.
      $fullfile = '$(srcdir)/' . $fullfile
	if $dir =~ m,^\.\.(?:$|/),;

      push_dist_common ($fullfile);
      return 1;
    }
  return 0;
}


# If a file name appears as a key in this hash, then it has already
# been checked for.  This allows us not to report the same error more
# than once.
my %required_file_not_found = ();

# &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES)
# --------------------------------------------------------------
# Verify that the file must exist in $DIRECTORY, or install it.
# $MYSTRICT is the strictness level at which this file becomes required.
sub require_file_internal ($$$@)
{
  my ($where, $mystrict, $dir, @files) = @_;

  foreach my $file (@files)
    {
      my $fullfile = "$dir/$file";
      my $found_it = 0;
      my $dangling_sym = 0;

      if (-l $fullfile && ! -f $fullfile)
	{
	  $dangling_sym = 1;
	}
      elsif (dir_has_case_matching_file ($dir, $file))
	{
	  $found_it = 1;
	  maybe_push_required_file ($dir, $file, $fullfile);
	}

      # `--force-missing' only has an effect if `--add-missing' is
      # specified.
      if ($found_it && (! $add_missing || ! $force_missing))
	{
	  next;
	}
      else
	{
	  # If we've already looked for it, we're done.  You might
	  # wonder why we don't do this before searching for the
	  # file.  If we do that, then something like
	  # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
	  # DIST_COMMON.
	  if (! $found_it)
	    {
	      next if defined $required_file_not_found{$fullfile};
	      $required_file_not_found{$fullfile} = 1;
	    }

	  if ($strictness >= $mystrict)
	    {
	      if ($dangling_sym && $add_missing)
		{
		  unlink ($fullfile);
		}

	      my $trailer = '';
	      my $trailer2 = '';
	      my $suppress = 0;

	      # Only install missing files according to our desired
	      # strictness level.
	      my $message = "required file `$fullfile' not found";
	      if ($add_missing)
		{
		  if (-f "$libdir/$file")
		    {
		      $suppress = 1;

		      # Install the missing file.  Symlink if we
		      # can, copy if we must.  Note: delete the file
		      # first, in case it is a dangling symlink.
		      $message = "installing `$fullfile'";

		      # The license file should not be volatile.
		      if ($file eq "COPYING")
		        {
			  $message .= " using GNU General Public License v3 file";
			  $trailer2 = "\n    Consider adding the COPYING file"
				    . " to the version control system"
				    . "\n    for your code, to avoid questions"
				    . " about which license your project uses.";
			}

		      # Windows Perl will hang if we try to delete a
		      # file that doesn't exist.
		      unlink ($fullfile) if -f $fullfile;
		      if ($symlink_exists && ! $copy_missing)
			{
			  if (! symlink ("$libdir/$file", $fullfile)
			      || ! -e $fullfile)
			    {
			      $suppress = 0;
			      $trailer = "; error while making link: $!";
			    }
			}
		      elsif (system ('cp', "$libdir/$file", $fullfile))
			{
			  $suppress = 0;
			  $trailer = "\n    error while copying";
			}
		      set_dir_cache_file ($dir, $file);
		    }

		  if (! maybe_push_required_file (dirname ($fullfile),
						  $file, $fullfile))
		    {
		      if (! $found_it && ! $automake_will_process_aux_dir)
			{
			  # We have added the file but could not push it
			  # into DIST_COMMON, probably because this is
			  # an auxiliary file and we are not processing
			  # the top level Makefile.  Furthermore Automake
			  # hasn't been asked to create the Makefile.in
			  # that distributes the aux dir files.
			  error ($where, 'Please make a full run of automake'
				 . " so $fullfile gets distributed.");
			}
		    }
		}
	      else
		{
		  $trailer = "\n  `automake --add-missing' can install `$file'"
		    if -f "$libdir/$file";
		}

	      # If --force-missing was specified, and we have
	      # actually found the file, then do nothing.
	      next
		if $found_it && $force_missing;

	      # If we couldn't install the file, but it is a target in
	      # the Makefile, don't print anything.  This allows files
	      # like README, AUTHORS, or THANKS to be generated.
	      next
		if !$suppress && rule $file;

	      msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2");
	    }
	}
    }
}

# &require_file ($WHERE, $MYSTRICT, @FILES)
# -----------------------------------------
sub require_file ($$@)
{
    my ($where, $mystrict, @files) = @_;
    require_file_internal ($where, $mystrict, $relative_dir, @files);
}

# &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
# -----------------------------------------------------------
sub require_file_with_macro ($$$@)
{
    my ($cond, $macro, $mystrict, @files) = @_;
    $macro = rvar ($macro) unless ref $macro;
    require_file ($macro->rdef ($cond)->location, $mystrict, @files);
}

# &require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
# ----------------------------------------------------------------
# Require an AC_LIBSOURCEd file.  If AC_CONFIG_LIBOBJ_DIR was called, it
# must be in that directory.  Otherwise expect it in the current directory.
sub require_libsource_with_macro ($$$@)
{
    my ($cond, $macro, $mystrict, @files) = @_;
    $macro = rvar ($macro) unless ref $macro;
    if ($config_libobj_dir)
      {
	require_file_internal ($macro->rdef ($cond)->location, $mystrict,
			       $config_libobj_dir, @files);
      }
    else
      {
	require_file ($macro->rdef ($cond)->location, $mystrict, @files);
      }
}

# Queue to push require_conf_file requirements to.
my $required_conf_file_queue;

# &queue_required_conf_file ($QUEUE, $KEY, $DIR, $WHERE, $MYSTRICT, @FILES)
# -------------------------------------------------------------------------
sub queue_required_conf_file ($$$$@)
{
    my ($queue, $key, $dir, $where, $mystrict, @files) = @_;
    my @serial_loc;
    if (ref $where)
      {
        @serial_loc = (QUEUE_LOCATION, $where->serialize ());
      }
    else
      {
        @serial_loc = (QUEUE_STRING, $where);
      }
    $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files);
}

# &require_queued_conf_file ($QUEUE)
# ----------------------------------
sub require_queued_conf_file ($)
{
    my ($queue) = @_;
    my $where;
    my $dir = $queue->dequeue ();
    my $loc_key = $queue->dequeue ();
    if ($loc_key eq QUEUE_LOCATION)
      {
	$where = Automake::Location::deserialize ($queue);
      }
    elsif ($loc_key eq QUEUE_STRING)
      {
	$where = $queue->dequeue ();
      }
    else
      {
	prog_error "unexpected key $loc_key";
      }
    my $mystrict = $queue->dequeue ();
    my $nfiles = $queue->dequeue ();
    my @files;
    push @files, $queue->dequeue ()
      foreach (1 .. $nfiles);

    # Dequeuing happens outside of per-makefile context, so we have to
    # set the variables used by require_file_internal and the functions
    # it calls.  Gross!
    $relative_dir = $dir;
    require_file_internal ($where, $mystrict, $config_aux_dir, @files);
}

# &require_conf_file ($WHERE, $MYSTRICT, @FILES)
# ----------------------------------------------
# Looks in configuration path, as specified by AC_CONFIG_AUX_DIR;
# worker threads may queue up the action to be serialized by the master.
#
# FIXME: this seriously relies on the semantics of require_file_internal
# and maybe_push_required_file, in that we exploit the fact that only the
# contents of the last handled output file may be impacted (which in turn
# is dealt with by the master thread).
sub require_conf_file ($$@)
{
    my ($where, $mystrict, @files) = @_;
    if (defined $required_conf_file_queue)
      {
	queue_required_conf_file ($required_conf_file_queue, QUEUE_CONF_FILE,
				  $relative_dir, $where, $mystrict, @files);
      }
    else
      {
	require_file_internal ($where, $mystrict, $config_aux_dir, @files);
      }
}


# &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
# ----------------------------------------------------------------
sub require_conf_file_with_macro ($$$@)
{
    my ($cond, $macro, $mystrict, @files) = @_;
    require_conf_file (rvar ($macro)->rdef ($cond)->location,
		       $mystrict, @files);
}

################################################################

# &require_build_directory ($DIRECTORY)
# ------------------------------------
# Emit rules to create $DIRECTORY if needed, and return
# the file that any target requiring this directory should be made
# dependent upon.
# We don't want to emit the rule twice, and want to reuse it
# for directories with equivalent names (e.g., `foo/bar' and `./foo//bar').
sub require_build_directory ($)
{
  my $directory = shift;

  return $directory_map{$directory} if exists $directory_map{$directory};

  my $cdir = File::Spec->canonpath ($directory);

  if (exists $directory_map{$cdir})
    {
      my $stamp = $directory_map{$cdir};
      $directory_map{$directory} = $stamp;
      return $stamp;
    }

  my $dirstamp = "$cdir/\$(am__dirstamp)";

  $directory_map{$directory} = $dirstamp;
  $directory_map{$cdir} = $dirstamp;

  # Set a variable for the dirstamp basename.
  define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
			  '$(am__leading_dot)dirstamp');

  # Directory must be removed by `make distclean'.
  $clean_files{$dirstamp} = DIST_CLEAN;

  $output_rules .= ("$dirstamp:\n"
		    . "\t\@\$(MKDIR_P) $directory\n"
		    . "\t\@: > $dirstamp\n");

  return $dirstamp;
}

# &require_build_directory_maybe ($FILE)
# --------------------------------------
# If $FILE lies in a subdirectory, emit a rule to create this
# directory and return the file that $FILE should be made
# dependent upon.  Otherwise, just return the empty string.
sub require_build_directory_maybe ($)
{
    my $file = shift;
    my $directory = dirname ($file);

    if ($directory ne '.')
    {
	return require_build_directory ($directory);
    }
    else
    {
	return '';
    }
}

################################################################

# Push a list of files onto dist_common.
sub push_dist_common
{
  prog_error "push_dist_common run after handle_dist"
    if $handle_dist_run;
  Automake::Variable::define ('DIST_COMMON', VAR_AUTOMAKE, '+', TRUE, "@_",
			      '', INTERNAL, VAR_PRETTY);
}


################################################################

# generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN)
# ----------------------------------------------
# Generate a Makefile.in given the name of the corresponding Makefile and
# the name of the file output by config.status.
sub generate_makefile ($$)
{
  my ($makefile_am, $makefile_in) = @_;

  # Reset all the Makefile.am related variables.
  initialize_per_input;

  # AUTOMAKE_OPTIONS can contains -W flags to disable or enable
  # warnings for this file.  So hold any warning issued before
  # we have processed AUTOMAKE_OPTIONS.
  buffer_messages ('warning');

  # Name of input file ("Makefile.am") and output file
  # ("Makefile.in").  These have no directory components.
  $am_file_name = basename ($makefile_am);
  $in_file_name = basename ($makefile_in);

  # $OUTPUT is encoded.  If it contains a ":" then the first element
  # is the real output file, and all remaining elements are input
  # files.  We don't scan or otherwise deal with these input files,
  # other than to mark them as dependencies.  See
  # &scan_autoconf_files for details.
  my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in});

  $relative_dir = dirname ($makefile);
  $am_relative_dir = dirname ($makefile_am);
  $topsrcdir = backname ($relative_dir);

  read_main_am_file ($makefile_am);
  if (handle_options)
    {
      # Process buffered warnings.
      flush_messages;
      # Fatal error.  Just return, so we can continue with next file.
      return;
    }
  # Process buffered warnings.
  flush_messages;

  # There are a few install-related variables that you should not define.
  foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
    {
      my $v = var $var;
      if ($v)
	{
	  my $def = $v->def (TRUE);
	  prog_error "$var not defined in condition TRUE"
	    unless $def;
	  reject_var $var, "`$var' should not be defined"
	    if $def->owner != VAR_AUTOMAKE;
	}
    }

  # Catch some obsolete variables.
  msg_var ('obsolete', 'INCLUDES',
	   "`INCLUDES' is the old name for `AM_CPPFLAGS' (or `*_CPPFLAGS')")
    if var ('INCLUDES');

  # Must do this after reading .am file.
  define_variable ('subdir', $relative_dir, INTERNAL);

  # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that
  # recursive rules are enabled.
  define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '')
    if var 'DIST_SUBDIRS' && ! var 'SUBDIRS';

  # Check first, because we might modify some state.
  check_cygnus;
  check_gnu_standards;
  check_gnits_standards;

  handle_configure ($makefile_am, $makefile_in, $makefile, @inputs);
  handle_gettext;
  handle_libraries;
  handle_ltlibraries;
  handle_programs;
  handle_scripts;

  # These must be run after all the sources are scanned.  They
  # use variables defined by &handle_libraries, &handle_ltlibraries,
  # or &handle_programs.
  handle_compile;
  handle_languages;
  handle_libtool;

  # Variables used by distdir.am and tags.am.
  define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources);
  if (! option 'no-dist')
    {
      define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources);
    }

  handle_multilib;
  handle_texinfo;
  handle_emacs_lisp;
  handle_python;
  handle_java;
  handle_man_pages;
  handle_data;
  handle_headers;
  handle_subdirs;
  handle_tags;
  handle_minor_options;
  # Must come after handle_programs so that %known_programs is up-to-date.
  handle_tests;

  # This must come after most other rules.
  handle_dist;

  handle_footer;
  do_check_merge_target;
  handle_all ($makefile);

  # FIXME: Gross!
  if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
    {
      $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
    }
  if (var ('nobase_lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
    {
      $output_rules .= "install-binPROGRAMS: install-nobase_libLTLIBRARIES\n\n";
    }

  handle_install;
  handle_clean ($makefile);
  handle_factored_dependencies;

  # Comes last, because all the above procedures may have
  # defined or overridden variables.
  $output_vars .= output_variables;

  check_typos;

  my ($out_file) = $output_directory . '/' . $makefile_in;

  if ($exit_code != 0)
    {
      verb "not writing $out_file because of earlier errors";
      return;
    }

  if (! -d ($output_directory . '/' . $am_relative_dir))
    {
      mkdir ($output_directory . '/' . $am_relative_dir, 0755);
    }

  # We make sure that `all:' is the first target.
  my $output =
    "$output_vars$output_all$output_header$output_rules$output_trailer";

  # Decide whether we must update the output file or not.
  # We have to update in the following situations.
  #  * $force_generation is set.
  #  * any of the output dependencies is younger than the output
  #  * the contents of the output is different (this can happen
  #    if the project has been populated with a file listed in
  #    @common_files since the last run).
  # Output's dependencies are split in two sets:
  #  * dependencies which are also configure dependencies
  #    These do not change between each Makefile.am
  #  * other dependencies, specific to the Makefile.am being processed
  #    (such as the Makefile.am itself, or any Makefile fragment
  #    it includes).
  my $timestamp = mtime $out_file;
  if (! $force_generation
      && $configure_deps_greatest_timestamp < $timestamp
      && $output_deps_greatest_timestamp < $timestamp
      && $output eq contents ($out_file))
    {
      verb "$out_file unchanged";
      # No need to update.
      return;
    }

  if (-e $out_file)
    {
      unlink ($out_file)
	or fatal "cannot remove $out_file: $!\n";
    }

  my $gm_file = new Automake::XFile "> $out_file";
  verb "creating $out_file";
  print $gm_file $output;
}

################################################################




################################################################

# Print usage information.
sub usage ()
{
    print "Usage: $0 [OPTION] ... [Makefile]...

Generate Makefile.in for configure from Makefile.am.

Operation modes:
      --help               print this help, then exit
      --version            print version number, then exit
  -v, --verbose            verbosely list files processed
      --no-force           only update Makefile.in's that are out of date
  -W, --warnings=CATEGORY  report the warnings falling in CATEGORY

Dependency tracking:
  -i, --ignore-deps      disable dependency tracking code
      --include-deps     enable dependency tracking code

Flavors:
      --cygnus           assume program is part of Cygnus-style tree
      --foreign          set strictness to foreign
      --gnits            set strictness to gnits
      --gnu              set strictness to gnu

Library files:
  -a, --add-missing      add missing standard files to package
      --libdir=DIR       directory storing library files
  -c, --copy             with -a, copy missing files (default is symlink)
  -f, --force-missing    force update of standard files

";
    Automake::ChannelDefs::usage;

    my ($last, @lcomm);
    $last = '';
    foreach my $iter (sort ((@common_files, @common_sometimes)))
    {
	push (@lcomm, $iter) unless $iter eq $last;
	$last = $iter;
    }

    my @four;
    print "\nFiles which are automatically distributed, if found:\n";
    format USAGE_FORMAT =
  @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
  $four[0],           $four[1],           $four[2],           $four[3]
.
    $~ = "USAGE_FORMAT";

    my $cols = 4;
    my $rows = int(@lcomm / $cols);
    my $rest = @lcomm % $cols;

    if ($rest)
    {
	$rows++;
    }
    else
    {
	$rest = $cols;
    }

    for (my $y = 0; $y < $rows; $y++)
    {
	@four = ("", "", "", "");
	for (my $x = 0; $x < $cols; $x++)
	{
	    last if $y + 1 == $rows && $x == $rest;

	    my $idx = (($x > $rest)
		       ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
		       : ($rows * $x));

	    $idx += $y;
	    $four[$x] = $lcomm[$idx];
	}
	write;
    }

    print "\nReport bugs to <bug-automake\@gnu.org>.\n";

    # --help always returns 0 per GNU standards.
    exit 0;
}


# &version ()
# -----------
# Print version information
sub version ()
{
  print <<EOF;
automake (GNU $PACKAGE) $VERSION
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Tom Tromey <tromey\@redhat.com>
       and Alexandre Duret-Lutz <adl\@gnu.org>.
EOF
  # --version always returns 0 per GNU standards.
  exit 0;
}

################################################################

# Parse command line.
sub parse_arguments ()
{
  # Start off as gnu.
  set_strictness ('gnu');

  my $cli_where = new Automake::Location;
  my %cli_options =
    (
     'libdir=s'	=> \$libdir,
     'gnu'		=> sub { set_strictness ('gnu'); },
     'gnits'		=> sub { set_strictness ('gnits'); },
     'cygnus'	        => sub { set_global_option ('cygnus', $cli_where); },
     'foreign'          => sub { set_strictness ('foreign'); },
     'include-deps'	=> sub { unset_global_option ('no-dependencies'); },
     'i|ignore-deps'	=> sub { set_global_option ('no-dependencies',
						    $cli_where); },
     'no-force'	=> sub { $force_generation = 0; },
     'f|force-missing'  => \$force_missing,
     'o|output-dir=s'	=> \$output_directory,
     'a|add-missing'	=> \$add_missing,
     'c|copy'		=> \$copy_missing,
     'v|verbose'	=> sub { setup_channel 'verb', silent => 0; },
     'W|warnings=s'     => \&parse_warnings,
     # These long options (--Werror and --Wno-error) for backward
     # compatibility.  Use -Werror and -Wno-error today.
     'Werror'           => sub { parse_warnings 'W', 'error'; },
     'Wno-error'        => sub { parse_warnings 'W', 'no-error'; },
     );
  use Getopt::Long;
  Getopt::Long::config ("bundling", "pass_through");

  # See if --version or --help is used.  We want to process these before
  # anything else because the GNU Coding Standards require us to
  # `exit 0' after processing these options, and we can't guarantee this
  # if we treat other options first.  (Handling other options first
  # could produce error diagnostics, and in this condition it is
  # confusing if Automake does `exit 0'.)
  my %cli_options_1st_pass =
    (
     'version' => \&version,
     'help'    => \&usage,
     # Recognize all other options (and their arguments) but do nothing.
     map { $_ => sub {} } (keys %cli_options)
     );
  my @ARGV_backup = @ARGV;
  Getopt::Long::GetOptions %cli_options_1st_pass
    or exit 1;
  @ARGV = @ARGV_backup;

  # Now *really* process the options.  This time we know that --help
  # and --version are not present, but we specify them nonetheless so
  # that ambiguous abbreviation are diagnosed.
  Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {}
    or exit 1;

  if (defined $output_directory)
    {
      msg 'obsolete', "`--output-dir' is deprecated\n";
    }
  else
    {
      # In the next release we'll remove this entirely.
      $output_directory = '.';
    }

  return unless @ARGV;

  if ($ARGV[0] =~ /^-./)
    {
      my %argopts;
      for my $k (keys %cli_options)
	{
	  if ($k =~ /(.*)=s$/)
	    {
	      map { $argopts{(length ($_) == 1)
			     ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
	    }
	}
      if ($ARGV[0] eq '--')
	{
	  shift @ARGV;
	}
      elsif (exists $argopts{$ARGV[0]})
	{
	  fatal ("option `$ARGV[0]' requires an argument\n"
		 . "Try `$0 --help' for more information.");
	}
      else
	{
	  fatal ("unrecognized option `$ARGV[0]'.\n"
		 . "Try `$0 --help' for more information.");
	}
    }

  my $errspec = 0;
  foreach my $arg (@ARGV)
    {
      fatal ("empty argument\nTry `$0 --help' for more information.")
	if ($arg eq '');

      # Handle $local:$input syntax.
      my ($local, @rest) = split (/:/, $arg);
      @rest = ("$local.in",) unless @rest;
      my $input = locate_am @rest;
      if ($input)
	{
	  push @input_files, $input;
	  $output_files{$input} = join (':', ($local, @rest));
	}
      else
	{
	  error "no Automake input file found for `$arg'";
	  $errspec = 1;
	}
    }
  fatal "no input file found among supplied arguments"
    if $errspec && ! @input_files;
}


# handle_makefile ($MAKEFILE_IN)
# ------------------------------
# Deal with $MAKEFILE_IN.
sub handle_makefile ($)
{
  my ($file) =  @_;
  ($am_file = $file) =~ s/\.in$//;
  if (! -f ($am_file . '.am'))
    {
      error "`$am_file.am' does not exist";
    }
  else
    {
      # Any warning setting now local to this Makefile.am.
      dup_channel_setup;

      generate_makefile ($am_file . '.am', $file);

      # Back out any warning setting.
      drop_channel_setup;
    }
}

# handle_makefiles_serial ()
# --------------------------
# Deal with all makefiles, without threads.
sub handle_makefiles_serial ()
{
  foreach my $file (@input_files)
    {
      handle_makefile ($file);
    }
}

# get_number_of_threads ()
# ------------------------
# Logic for deciding how many worker threads to use.
sub get_number_of_threads
{
  my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0;

  $nthreads = 0
    unless $nthreads =~ /^[0-9]+$/;

  # It doesn't make sense to use more threads than makefiles,
  my $max_threads = @input_files;

  # but a single worker thread is helpful for exposing bugs.
  if ($automake_will_process_aux_dir && $max_threads > 1)
    {
      $max_threads--;
    }
  if ($nthreads > $max_threads)
    {
      $nthreads = $max_threads;
    }
  return $nthreads;
}

# handle_makefiles_threaded ($NTHREADS)
# -------------------------------------
# Deal with all makefiles, using threads.  The general strategy is to
# spawn NTHREADS worker threads, dispatch makefiles to them, and let the
# worker threads push back everything that needs serialization:
# * warning and (normal) error messages, for stable stderr output
#   order and content (avoiding duplicates, for example),
# * races when installing aux files (and respective messages),
# * races when collecting aux files for distribution.
#
# The latter requires that the makefile that deals with the aux dir
# files be handled last, done by the master thread.
sub handle_makefiles_threaded ($)
{
  my ($nthreads) = @_;

  my @queued_input_files = @input_files;
  my $last_input_file = undef;
  if ($automake_will_process_aux_dir)
    {
      $last_input_file = pop @queued_input_files;
    }

  # The file queue distributes all makefiles, the message queues
  # collect all serializations needed for respective files.
  my $file_queue = Thread::Queue->new;
  my %msg_queues;
  foreach my $file (@queued_input_files)
    {
      $msg_queues{$file} = Thread::Queue->new;
    }

  verb "spawning $nthreads worker threads";
  my @threads = (1 .. $nthreads);
  foreach my $t (@threads)
    {
      $t = threads->new (sub
	{
	  while (my $file = $file_queue->dequeue)
	    {
	      verb "handling $file";
	      my $queue = $msg_queues{$file};
	      setup_channel_queue ($queue, QUEUE_MESSAGE);
	      $required_conf_file_queue = $queue;
	      handle_makefile ($file);
	      $queue->enqueue (undef);
	      setup_channel_queue (undef, undef);
	      $required_conf_file_queue = undef;
	    }
	  return $exit_code;
	});
    }

  # Queue all normal makefiles.
  verb "queuing " . @queued_input_files . " input files";
  $file_queue->enqueue (@queued_input_files, (undef) x @threads);

  # Collect and process serializations.
  foreach my $file (@queued_input_files)
    {
      verb "dequeuing messages for " . $file;
      reset_local_duplicates ();
      my $queue = $msg_queues{$file};
      while (my $key = $queue->dequeue)
	{
	  if ($key eq QUEUE_MESSAGE)
	    {
	      pop_channel_queue ($queue);
	    }
	  elsif ($key eq QUEUE_CONF_FILE)
	    {
	      require_queued_conf_file ($queue);
	    }
	  else
	    {
	      prog_error "unexpected key $key";
	    }
	}
    }

  foreach my $t (@threads)
    {
      my @exit_thread = $t->join;
      $exit_code = $exit_thread[0]
	if ($exit_thread[0] > $exit_code);
    }

  # The master processes the last file.
  if ($automake_will_process_aux_dir)
    {
      verb "processing last input file";
      handle_makefile ($last_input_file);
    }
}

################################################################

# Parse the WARNINGS environment variable.
parse_WARNINGS;

# Parse command line.
parse_arguments;

$configure_ac = require_configure_ac;

# Do configure.ac scan only once.
scan_autoconf_files;

if (! @input_files)
  {
    my $msg = '';
    $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?"
      if -f 'Makefile.am';
    fatal ("no `Makefile.am' found for any configure output$msg");
  }

my $nthreads = get_number_of_threads ();

if ($perl_threads && $nthreads >= 1)
  {
    handle_makefiles_threaded ($nthreads);
  }
else
  {
    handle_makefiles_serial ();
  }

exit $exit_code;


### Setup "GNU" style for perl-mode and cperl-mode.
## Local Variables:
## perl-indent-level: 2
## perl-continued-statement-offset: 2
## perl-continued-brace-offset: 0
## perl-brace-offset: 0
## perl-brace-imaginary-offset: 0
## perl-label-offset: -2
## cperl-indent-level: 2
## cperl-brace-offset: 0
## cperl-continued-brace-offset: 0
## cperl-label-offset: -2
## cperl-extra-newline-before-brace: t
## cperl-merge-trailing-else: nil
## cperl-continued-statement-offset: 2
## End:
