manual: Add note about parallelism and tests ordering.
[automake.git] / automake.in
blob10927a1fe4dae86d6684cc72138eb60ade13acdd
1 #!@PERL@ -w
2 # -*- perl -*-
3 # @configure_input@
5 eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
6     if 0;
8 # automake - create Makefile.in from Makefile.am
9 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
10 # 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
11 # Inc.
13 # This program is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation; either version 3, or (at your option)
16 # any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 # GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License
24 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
26 # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
27 # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and
28 # Alexandre Duret-Lutz <adl@gnu.org>.
30 package Language;
32 BEGIN
34   my $perllibdir = $ENV{'perllibdir'} || '@datadir@/@PACKAGE@-@APIVERSION@';
35   unshift @INC, (split '@PATH_SEPARATOR@', $perllibdir);
37   # Override SHELL.  This is required on DJGPP so that system() uses
38   # bash, not COMMAND.COM which doesn't quote arguments properly.
39   # Other systems aren't expected to use $SHELL when Automake
40   # runs, but it should be safe to drop the `if DJGPP' guard if
41   # it turns up other systems need the same thing.  After all,
42   # if SHELL is used, ./configure's SHELL is always better than
43   # the user's SHELL (which may be something like tcsh).
44   $ENV{'SHELL'} = '@SHELL@' if exists $ENV{'DJGPP'};
47 use Automake::Struct;
48 struct (# Short name of the language (c, f77...).
49         'name' => "\$",
50         # Nice name of the language (C, Fortran 77...).
51         'Name' => "\$",
53         # List of configure variables which must be defined.
54         'config_vars' => '@',
56         'ansi'    => "\$",
57         # `pure' is `1' or `'.  A `pure' language is one where, if
58         # all the files in a directory are of that language, then we
59         # do not require the C compiler or any code to call it.
60         'pure'   => "\$",
62         'autodep' => "\$",
64         # Name of the compiling variable (COMPILE).
65         'compiler'  => "\$",
66         # Content of the compiling variable.
67         'compile'  => "\$",
68         # Flag to require compilation without linking (-c).
69         'compile_flag' => "\$",
70         'extensions' => '@',
71         # A subroutine to compute a list of possible extensions of
72         # the product given the input extensions.
73         # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo'))
74         'output_extensions' => "\$",
75         # A list of flag variables used in 'compile'.
76         # (defaults to [])
77         'flags' => "@",
79         # Any tag to pass to libtool while compiling.
80         'libtool_tag' => "\$",
82         # The file to use when generating rules for this language.
83         # The default is 'depend2'.
84         'rule_file' => "\$",
86         # Name of the linking variable (LINK).
87         'linker' => "\$",
88         # Content of the linking variable.
89         'link' => "\$",
91         # Name of the compiler variable (CC).
92         'ccer' => "\$",
94         # Name of the linker variable (LD).
95         'lder' => "\$",
96         # Content of the linker variable ($(CC)).
97         'ld' => "\$",
99         # Flag to specify the output file (-o).
100         'output_flag' => "\$",
101         '_finish' => "\$",
103         # This is a subroutine which is called whenever we finally
104         # determine the context in which a source file will be
105         # compiled.
106         '_target_hook' => "\$",
108         # If TRUE, nodist_ sources will be compiled using specific rules
109         # (i.e. not inference rules).  The default is FALSE.
110         'nodist_specific' => "\$");
113 sub finish ($)
115   my ($self) = @_;
116   if (defined $self->_finish)
117     {
118       &{$self->_finish} ();
119     }
122 sub target_hook ($$$$%)
124     my ($self) = @_;
125     if (defined $self->_target_hook)
126     {
127         &{$self->_target_hook} (@_);
128     }
131 package Automake;
133 use strict;
134 use Automake::Config;
135 BEGIN
137   if ($perl_threads)
138     {
139       require threads;
140       import threads;
141       require Thread::Queue;
142       import Thread::Queue;
143     }
145 use Automake::General;
146 use Automake::XFile;
147 use Automake::Channels;
148 use Automake::ChannelDefs;
149 use Automake::Configure_ac;
150 use Automake::FileUtils;
151 use Automake::Location;
152 use Automake::Condition qw/TRUE FALSE/;
153 use Automake::DisjConditions;
154 use Automake::Options;
155 use Automake::Version;
156 use Automake::Variable;
157 use Automake::VarDef;
158 use Automake::Rule;
159 use Automake::RuleDef;
160 use Automake::Wrap 'makefile_wrap';
161 use File::Basename;
162 use File::Spec;
163 use Carp;
165 ## ----------- ##
166 ## Constants.  ##
167 ## ----------- ##
169 # Some regular expressions.  One reason to put them here is that it
170 # makes indentation work better in Emacs.
172 # Writing singled-quoted-$-terminated regexes is a pain because
173 # perl-mode thinks of $' as the ${'} variable (instead of a $ followed
174 # by a closing quote.  Letting perl-mode think the quote is not closed
175 # leads to all sort of misindentations.  On the other hand, defining
176 # regexes as double-quoted strings is far less readable.  So usually
177 # we will write:
179 #  $REGEX = '^regex_value' . "\$";
181 my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
182 my $WHITE_PATTERN = '^\s*' . "\$";
183 my $COMMENT_PATTERN = '^#';
184 my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*';
185 # A rule has three parts: a list of targets, a list of dependencies,
186 # and optionally actions.
187 my $RULE_PATTERN =
188   "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";
190 # Only recognize leading spaces, not leading tabs.  If we recognize
191 # leading tabs here then we need to make the reader smarter, because
192 # otherwise it will think rules like `foo=bar; \' are errors.
193 my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$";
194 # This pattern recognizes a Gnits version id and sets $1 if the
195 # release is an alpha release.  We also allow a suffix which can be
196 # used to extend the version number with a "fork" identifier.
197 my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';
199 my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$";
200 my $ELSE_PATTERN =
201   '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
202 my $ENDIF_PATTERN =
203   '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
204 my $PATH_PATTERN = '(\w|[+/.-])+';
205 # This will pass through anything not of the prescribed form.
206 my $INCLUDE_PATTERN = ('^include\s+'
207                        . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
208                        . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
209                        . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$");
211 # Match `-d' as a command-line argument in a string.
212 my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)";
213 # Directories installed during 'install-exec' phase.
214 my $EXEC_DIR_PATTERN =
215   '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$";
217 # Values for AC_CANONICAL_*
218 use constant AC_CANONICAL_BUILD  => 1;
219 use constant AC_CANONICAL_HOST   => 2;
220 use constant AC_CANONICAL_TARGET => 3;
222 # Values indicating when something should be cleaned.
223 use constant MOSTLY_CLEAN     => 0;
224 use constant CLEAN            => 1;
225 use constant DIST_CLEAN       => 2;
226 use constant MAINTAINER_CLEAN => 3;
228 # Libtool files.
229 my @libtool_files = qw(ltmain.sh config.guess config.sub);
230 # ltconfig appears here for compatibility with old versions of libtool.
231 my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh);
233 # Commonly found files we look for and automatically include in
234 # DISTFILES.
235 my @common_files =
236     (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB
237         COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO
238         ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub
239         depcomp elisp-comp install-sh libversion.in mdate-sh missing
240         mkinstalldirs py-compile texinfo.tex ylwrap),
241      @libtool_files, @libtool_sometimes);
243 # Commonly used files we auto-include, but only sometimes.  This list
244 # is used for the --help output only.
245 my @common_sometimes =
246   qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure
247      configure.ac configure.in stamp-vti);
249 # Standard directories from the GNU Coding Standards, and additional
250 # pkg* directories from Automake.  Stored in a hash for fast member check.
251 my %standard_prefix =
252     map { $_ => 1 } (qw(bin data dataroot dvi exec html include info
253                         lib libexec lisp localstate man man1 man2 man3
254                         man4 man5 man6 man7 man8 man9 oldinclude pdf
255                         pkgdatadir pkgincludedir pkglibdir pkglibexecdir
256                         ps sbin sharedstate sysconf));
258 # Copyright on generated Makefile.ins.
259 my $gen_copyright = "\
260 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
261 # 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
262 # Inc.
263 # This Makefile.in is free software; the Free Software Foundation
264 # gives unlimited permission to copy and/or distribute it,
265 # with or without modifications, as long as this notice is preserved.
267 # This program is distributed in the hope that it will be useful,
268 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
269 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
270 # PARTICULAR PURPOSE.
273 # These constants are returned by the lang_*_rewrite functions.
274 # LANG_SUBDIR means that the resulting object file should be in a
275 # subdir if the source file is.  In this case the file name cannot
276 # have `..' components.
277 use constant LANG_IGNORE  => 0;
278 use constant LANG_PROCESS => 1;
279 use constant LANG_SUBDIR  => 2;
281 # These are used when keeping track of whether an object can be built
282 # by two different paths.
283 use constant COMPILE_LIBTOOL  => 1;
284 use constant COMPILE_ORDINARY => 2;
286 # We can't always associate a location to a variable or a rule,
287 # when it's defined by Automake.  We use INTERNAL in this case.
288 use constant INTERNAL => new Automake::Location;
290 # Serialization keys for message queues.
291 use constant QUEUE_MESSAGE   => "msg";
292 use constant QUEUE_CONF_FILE => "conf file";
293 use constant QUEUE_LOCATION  => "location";
294 use constant QUEUE_STRING    => "string";
297 ## ---------------------------------- ##
298 ## Variables related to the options.  ##
299 ## ---------------------------------- ##
301 # TRUE if we should always generate Makefile.in.
302 my $force_generation = 1;
304 # From the Perl manual.
305 my $symlink_exists = (eval 'symlink ("", "");', $@ eq '');
307 # TRUE if missing standard files should be installed.
308 my $add_missing = 0;
310 # TRUE if we should copy missing files; otherwise symlink if possible.
311 my $copy_missing = 0;
313 # TRUE if we should always update files that we know about.
314 my $force_missing = 0;
317 ## ---------------------------------------- ##
318 ## Variables filled during files scanning.  ##
319 ## ---------------------------------------- ##
321 # Name of the configure.ac file.
322 my $configure_ac;
324 # Files found by scanning configure.ac for LIBOBJS.
325 my %libsources = ();
327 # Names used in AC_CONFIG_HEADER call.
328 my @config_headers = ();
330 # Names used in AC_CONFIG_LINKS call.
331 my @config_links = ();
333 # Directory where output files go.  Actually, output files are
334 # relative to this directory.
335 my $output_directory;
337 # List of Makefile.am's to process, and their corresponding outputs.
338 my @input_files = ();
339 my %output_files = ();
341 # Complete list of Makefile.am's that exist.
342 my @configure_input_files = ();
344 # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's,
345 # and their outputs.
346 my @other_input_files = ();
347 # Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADER appears.
348 # The keys are the files created by these macros.
349 my %ac_config_files_location = ();
350 # The condition under which AC_CONFIG_FOOS appears.
351 my %ac_config_files_condition = ();
353 # Directory to search for configure-required files.  This
354 # will be computed by &locate_aux_dir and can be set using
355 # AC_CONFIG_AUX_DIR in configure.ac.
356 # $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree.
357 my $config_aux_dir = '';
358 my $config_aux_dir_set_in_configure_ac = 0;
359 # $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used
360 # in Makefiles.
361 my $am_config_aux_dir = '';
363 # Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR
364 # in configure.ac.
365 my $config_libobj_dir = '';
367 # Whether AM_GNU_GETTEXT has been seen in configure.ac.
368 my $seen_gettext = 0;
369 # Whether AM_GNU_GETTEXT([external]) is used.
370 my $seen_gettext_external = 0;
371 # Where AM_GNU_GETTEXT appears.
372 my $ac_gettext_location;
373 # Whether AM_GNU_GETTEXT_INTL_SUBDIR has been seen.
374 my $seen_gettext_intl = 0;
376 # Lists of tags supported by Libtool.
377 my %libtool_tags = ();
378 # 1 if Libtool uses LT_SUPPORTED_TAG.  If it does, then it also
379 # uses AC_REQUIRE_AUX_FILE.
380 my $libtool_new_api = 0;
382 # Most important AC_CANONICAL_* macro seen so far.
383 my $seen_canonical = 0;
384 # Location of that macro.
385 my $canonical_location;
387 # Where AM_MAINTAINER_MODE appears.
388 my $seen_maint_mode;
390 # Actual version we've seen.
391 my $package_version = '';
393 # Where version is defined.
394 my $package_version_location;
396 # TRUE if we've seen AM_ENABLE_MULTILIB.
397 my $seen_multilib = 0;
399 # TRUE if we've seen AM_PROG_CC_C_O
400 my $seen_cc_c_o = 0;
402 # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument.
403 my %required_aux_file = ();
405 # Where AM_INIT_AUTOMAKE is called;
406 my $seen_init_automake = 0;
408 # TRUE if we've seen AM_AUTOMAKE_VERSION.
409 my $seen_automake_version = 0;
411 # Hash table of discovered configure substitutions.  Keys are names,
412 # values are `FILE:LINE' strings which are used by error message
413 # generation.
414 my %configure_vars = ();
416 # Ignored configure substitutions (i.e., variables not to be output in
417 # Makefile.in)
418 my %ignored_configure_vars = ();
420 # Files included by $configure_ac.
421 my @configure_deps = ();
423 # Greatest timestamp of configure's dependencies.
424 my $configure_deps_greatest_timestamp = 0;
426 # Hash table of AM_CONDITIONAL variables seen in configure.
427 my %configure_cond = ();
429 # This maps extensions onto language names.
430 my %extension_map = ();
432 # List of the DIST_COMMON files we discovered while reading
433 # configure.in
434 my $configure_dist_common = '';
436 # This maps languages names onto objects.
437 my %languages = ();
438 # Maps each linker variable onto a language object.
439 my %link_languages = ();
441 # maps extensions to needed source flags.
442 my %sourceflags = ();
444 # List of targets we must always output.
445 # FIXME: Complete, and remove falsely required targets.
446 my %required_targets =
447   (
448    'all'          => 1,
449    'dvi'          => 1,
450    'pdf'          => 1,
451    'ps'           => 1,
452    'info'         => 1,
453    'install-info' => 1,
454    'install'      => 1,
455    'install-data' => 1,
456    'install-exec' => 1,
457    'uninstall'    => 1,
459    # FIXME: Not required, temporary hacks.
460    # Well, actually they are sort of required: the -recursive
461    # targets will run them anyway...
462    'html-am'         => 1,
463    'dvi-am'          => 1,
464    'pdf-am'          => 1,
465    'ps-am'           => 1,
466    'info-am'         => 1,
467    'install-data-am' => 1,
468    'install-exec-am' => 1,
469    'install-html-am' => 1,
470    'install-dvi-am'  => 1,
471    'install-pdf-am'  => 1,
472    'install-ps-am'   => 1,
473    'install-info-am' => 1,
474    'installcheck-am' => 1,
475    'uninstall-am' => 1,
477    'install-man' => 1,
478   );
480 # Set to 1 if this run will create the Makefile.in that distributes
481 # the files in config_aux_dir.
482 my $automake_will_process_aux_dir = 0;
484 # The name of the Makefile currently being processed.
485 my $am_file = 'BUG';
488 ################################################################
490 ## ------------------------------------------ ##
491 ## Variables reset by &initialize_per_input.  ##
492 ## ------------------------------------------ ##
494 # Basename and relative dir of the input file.
495 my $am_file_name;
496 my $am_relative_dir;
498 # Same but wrt Makefile.in.
499 my $in_file_name;
500 my $relative_dir;
502 # Relative path to the top directory.
503 my $topsrcdir;
505 # Greatest timestamp of the output's dependencies (excluding
506 # configure's dependencies).
507 my $output_deps_greatest_timestamp;
509 # These variables are used when generating each Makefile.in.
510 # They hold the Makefile.in until it is ready to be printed.
511 my $output_vars;
512 my $output_all;
513 my $output_header;
514 my $output_rules;
515 my $output_trailer;
517 # This is the conditional stack, updated on if/else/endif, and
518 # used to build Condition objects.
519 my @cond_stack;
521 # This holds the set of included files.
522 my @include_stack;
524 # List of dependencies for the obvious targets.
525 my @all;
526 my @check;
527 my @check_tests;
529 # Keys in this hash table are files to delete.  The associated
530 # value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.)
531 my %clean_files;
533 # Keys in this hash table are object files or other files in
534 # subdirectories which need to be removed.  This only holds files
535 # which are created by compilations.  The value in the hash indicates
536 # when the file should be removed.
537 my %compile_clean_files;
539 # Keys in this hash table are directories where we expect to build a
540 # libtool object.  We use this information to decide what directories
541 # to delete.
542 my %libtool_clean_directories;
544 # Value of `$(SOURCES)', used by tags.am.
545 my @sources;
546 # Sources which go in the distribution.
547 my @dist_sources;
549 # This hash maps object file names onto their corresponding source
550 # file names.  This is used to ensure that each object is created
551 # by a single source file.
552 my %object_map;
554 # This hash maps object file names onto an integer value representing
555 # whether this object has been built via ordinary compilation or
556 # libtool compilation (the COMPILE_* constants).
557 my %object_compilation_map;
560 # This keeps track of the directories for which we've already
561 # created dirstamp code.  Keys are directories, values are stamp files.
562 # Several keys can share the same stamp files if they are equivalent
563 # (as are `.//foo' and `foo').
564 my %directory_map;
566 # All .P files.
567 my %dep_files;
569 # This is a list of all targets to run during "make dist".
570 my @dist_targets;
572 # Keep track of all programs declared in this Makefile, without
573 # $(EXEEXT).  @substitutions@ are not listed.
574 my %known_programs;
576 # Keys in this hash are the basenames of files which must depend on
577 # ansi2knr.  Values are either the empty string, or the directory in
578 # which the ANSI source file appears; the directory must have a
579 # trailing `/'.
580 my %de_ansi_files;
582 # This keeps track of which extensions we've seen (that we care
583 # about).
584 my %extension_seen;
586 # This is random scratch space for the language finish functions.
587 # Don't randomly overwrite it; examine other uses of keys first.
588 my %language_scratch;
590 # We keep track of which objects need special (per-executable)
591 # handling on a per-language basis.
592 my %lang_specific_files;
594 # This is set when `handle_dist' has finished.  Once this happens,
595 # we should no longer push on dist_common.
596 my $handle_dist_run;
598 # Used to store a set of linkers needed to generate the sources currently
599 # under consideration.
600 my %linkers_used;
602 # True if we need `LINK' defined.  This is a hack.
603 my $need_link;
605 # Was get_object_extension run?
606 # FIXME: This is a hack. a better switch should be found.
607 my $get_object_extension_was_run;
609 # Record each file processed by make_paragraphs.
610 my %transformed_files;
613 ################################################################
615 ## ---------------------------------------------- ##
616 ## Variables not reset by &initialize_per_input.  ##
617 ## ---------------------------------------------- ##
619 # Cache each file processed by make_paragraphs.
620 # (This is different from %transformed_files because
621 # %transformed_files is reset for each file while %am_file_cache
622 # it global to the run.)
623 my %am_file_cache;
625 ################################################################
627 # var_SUFFIXES_trigger ($TYPE, $VALUE)
628 # ------------------------------------
629 # This is called by Automake::Variable::define() when SUFFIXES
630 # is defined ($TYPE eq '') or appended ($TYPE eq '+').
631 # The work here needs to be performed as a side-effect of the
632 # macro_define() call because SUFFIXES definitions impact
633 # on $KNOWN_EXTENSIONS_PATTERN which is used used when parsing
634 # the input am file.
635 sub var_SUFFIXES_trigger ($$)
637     my ($type, $value) = @_;
638     accept_extensions (split (' ', $value));
640 Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger);
642 ################################################################
644 ## --------------------------------- ##
645 ## Forward subroutine declarations.  ##
646 ## --------------------------------- ##
647 sub register_language (%);
648 sub file_contents_internal ($$$%);
649 sub define_files_variable ($\@$$);
652 # &initialize_per_input ()
653 # ------------------------
654 # (Re)-Initialize per-Makefile.am variables.
655 sub initialize_per_input ()
657     reset_local_duplicates ();
659     $am_file_name = undef;
660     $am_relative_dir = undef;
662     $in_file_name = undef;
663     $relative_dir = undef;
664     $topsrcdir = undef;
666     $output_deps_greatest_timestamp = 0;
668     $output_vars = '';
669     $output_all = '';
670     $output_header = '';
671     $output_rules = '';
672     $output_trailer = '';
674     Automake::Options::reset;
675     Automake::Variable::reset;
676     Automake::Rule::reset;
678     @cond_stack = ();
680     @include_stack = ();
682     @all = ();
683     @check = ();
684     @check_tests = ();
686     %clean_files = ();
687     %compile_clean_files = ();
689     # We always include `.'.  This isn't strictly correct.
690     %libtool_clean_directories = ('.' => 1);
692     @sources = ();
693     @dist_sources = ();
695     %object_map = ();
696     %object_compilation_map = ();
698     %directory_map = ();
700     %dep_files = ();
702     @dist_targets = ();
704     %known_programs = ();
706     %de_ansi_files = ();
708     %extension_seen = ();
710     %language_scratch = ();
712     %lang_specific_files = ();
714     $handle_dist_run = 0;
716     $need_link = 0;
718     $get_object_extension_was_run = 0;
720     %transformed_files = ();
724 ################################################################
726 # Initialize our list of languages that are internally supported.
728 # C.
729 register_language ('name' => 'c',
730                    'Name' => 'C',
731                    'config_vars' => ['CC'],
732                    'ansi' => 1,
733                    'autodep' => '',
734                    'flags' => ['CFLAGS', 'CPPFLAGS'],
735                    'ccer' => 'CC',
736                    'compiler' => 'COMPILE',
737                    'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)',
738                    'lder' => 'CCLD',
739                    'ld' => '$(CC)',
740                    'linker' => 'LINK',
741                    'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
742                    'compile_flag' => '-c',
743                    'libtool_tag' => 'CC',
744                    'extensions' => ['.c'],
745                    '_finish' => \&lang_c_finish);
747 # C++.
748 register_language ('name' => 'cxx',
749                    'Name' => 'C++',
750                    'config_vars' => ['CXX'],
751                    'linker' => 'CXXLINK',
752                    'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
753                    'autodep' => 'CXX',
754                    'flags' => ['CXXFLAGS', 'CPPFLAGS'],
755                    'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)',
756                    'ccer' => 'CXX',
757                    'compiler' => 'CXXCOMPILE',
758                    'compile_flag' => '-c',
759                    'output_flag' => '-o',
760                    'libtool_tag' => 'CXX',
761                    'lder' => 'CXXLD',
762                    'ld' => '$(CXX)',
763                    'pure' => 1,
764                    'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']);
766 # Objective C.
767 register_language ('name' => 'objc',
768                    'Name' => 'Objective C',
769                    'config_vars' => ['OBJC'],
770                    'linker' => 'OBJCLINK',
771                    'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
772                    'autodep' => 'OBJC',
773                    'flags' => ['OBJCFLAGS', 'CPPFLAGS'],
774                    'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)',
775                    'ccer' => 'OBJC',
776                    'compiler' => 'OBJCCOMPILE',
777                    'compile_flag' => '-c',
778                    'output_flag' => '-o',
779                    'lder' => 'OBJCLD',
780                    'ld' => '$(OBJC)',
781                    'pure' => 1,
782                    'extensions' => ['.m']);
784 # Unified Parallel C.
785 register_language ('name' => 'upc',
786                    'Name' => 'Unified Parallel C',
787                    'config_vars' => ['UPC'],
788                    'linker' => 'UPCLINK',
789                    'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
790                    'autodep' => 'UPC',
791                    'flags' => ['UPCFLAGS', 'CPPFLAGS'],
792                    'compile' => '$(UPC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_UPCFLAGS) $(UPCFLAGS)',
793                    'ccer' => 'UPC',
794                    'compiler' => 'UPCCOMPILE',
795                    'compile_flag' => '-c',
796                    'output_flag' => '-o',
797                    'lder' => 'UPCLD',
798                    'ld' => '$(UPC)',
799                    'pure' => 1,
800                    'extensions' => ['.upc']);
802 # Headers.
803 register_language ('name' => 'header',
804                    'Name' => 'Header',
805                    'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh',
806                                     '.hpp', '.inc'],
807                    # No output.
808                    'output_extensions' => sub { return () },
809                    # Nothing to do.
810                    '_finish' => sub { });
812 # Yacc (C & C++).
813 register_language ('name' => 'yacc',
814                    'Name' => 'Yacc',
815                    'config_vars' => ['YACC'],
816                    'flags' => ['YFLAGS'],
817                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
818                    'ccer' => 'YACC',
819                    'compiler' => 'YACCCOMPILE',
820                    'extensions' => ['.y'],
821                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
822                                                 return ($ext,) },
823                    'rule_file' => 'yacc',
824                    '_finish' => \&lang_yacc_finish,
825                    '_target_hook' => \&lang_yacc_target_hook,
826                    'nodist_specific' => 1);
827 register_language ('name' => 'yaccxx',
828                    'Name' => 'Yacc (C++)',
829                    'config_vars' => ['YACC'],
830                    'rule_file' => 'yacc',
831                    'flags' => ['YFLAGS'],
832                    'ccer' => 'YACC',
833                    'compiler' => 'YACCCOMPILE',
834                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
835                    'extensions' => ['.y++', '.yy', '.yxx', '.ypp'],
836                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
837                                                 return ($ext,) },
838                    '_finish' => \&lang_yacc_finish,
839                    '_target_hook' => \&lang_yacc_target_hook,
840                    'nodist_specific' => 1);
842 # Lex (C & C++).
843 register_language ('name' => 'lex',
844                    'Name' => 'Lex',
845                    'config_vars' => ['LEX'],
846                    'rule_file' => 'lex',
847                    'flags' => ['LFLAGS'],
848                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
849                    'ccer' => 'LEX',
850                    'compiler' => 'LEXCOMPILE',
851                    'extensions' => ['.l'],
852                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
853                                                 return ($ext,) },
854                    '_finish' => \&lang_lex_finish,
855                    '_target_hook' => \&lang_lex_target_hook,
856                    'nodist_specific' => 1);
857 register_language ('name' => 'lexxx',
858                    'Name' => 'Lex (C++)',
859                    'config_vars' => ['LEX'],
860                    'rule_file' => 'lex',
861                    'flags' => ['LFLAGS'],
862                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
863                    'ccer' => 'LEX',
864                    'compiler' => 'LEXCOMPILE',
865                    'extensions' => ['.l++', '.ll', '.lxx', '.lpp'],
866                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
867                                                 return ($ext,) },
868                    '_finish' => \&lang_lex_finish,
869                    '_target_hook' => \&lang_lex_target_hook,
870                    'nodist_specific' => 1);
872 # Assembler.
873 register_language ('name' => 'asm',
874                    'Name' => 'Assembler',
875                    'config_vars' => ['CCAS', 'CCASFLAGS'],
877                    'flags' => ['CCASFLAGS'],
878                    # Users can set AM_CCASFLAGS to include DEFS, INCLUDES,
879                    # or anything else required.  They can also set CCAS.
880                    # Or simply use Preprocessed Assembler.
881                    'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)',
882                    'ccer' => 'CCAS',
883                    'compiler' => 'CCASCOMPILE',
884                    'compile_flag' => '-c',
885                    'output_flag' => '-o',
886                    'extensions' => ['.s'],
888                    # With assembly we still use the C linker.
889                    '_finish' => \&lang_c_finish);
891 # Preprocessed Assembler.
892 register_language ('name' => 'cppasm',
893                    'Name' => 'Preprocessed Assembler',
894                    'config_vars' => ['CCAS', 'CCASFLAGS'],
896                    'autodep' => 'CCAS',
897                    'flags' => ['CCASFLAGS', 'CPPFLAGS'],
898                    'compile' => '$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)',
899                    'ccer' => 'CPPAS',
900                    'compiler' => 'CPPASCOMPILE',
901                    'compile_flag' => '-c',
902                    'output_flag' => '-o',
903                    'extensions' => ['.S', '.sx'],
905                    # With assembly we still use the C linker.
906                    '_finish' => \&lang_c_finish);
908 # Fortran 77
909 register_language ('name' => 'f77',
910                    'Name' => 'Fortran 77',
911                    'config_vars' => ['F77'],
912                    'linker' => 'F77LINK',
913                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
914                    'flags' => ['FFLAGS'],
915                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)',
916                    'ccer' => 'F77',
917                    'compiler' => 'F77COMPILE',
918                    'compile_flag' => '-c',
919                    'output_flag' => '-o',
920                    'libtool_tag' => 'F77',
921                    'lder' => 'F77LD',
922                    'ld' => '$(F77)',
923                    'pure' => 1,
924                    'extensions' => ['.f', '.for']);
926 # Fortran
927 register_language ('name' => 'fc',
928                    'Name' => 'Fortran',
929                    'config_vars' => ['FC'],
930                    'linker' => 'FCLINK',
931                    'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
932                    'flags' => ['FCFLAGS'],
933                    'compile' => '$(FC) $(AM_FCFLAGS) $(FCFLAGS)',
934                    'ccer' => 'FC',
935                    'compiler' => 'FCCOMPILE',
936                    'compile_flag' => '-c',
937                    'output_flag' => '-o',
938                    'libtool_tag' => 'FC',
939                    'lder' => 'FCLD',
940                    'ld' => '$(FC)',
941                    'pure' => 1,
942                    'extensions' => ['.f90', '.f95', '.f03', '.f08']);
944 # Preprocessed Fortran
945 register_language ('name' => 'ppfc',
946                    'Name' => 'Preprocessed Fortran',
947                    'config_vars' => ['FC'],
948                    'linker' => 'FCLINK',
949                    'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
950                    'lder' => 'FCLD',
951                    'ld' => '$(FC)',
952                    'flags' => ['FCFLAGS', 'CPPFLAGS'],
953                    'ccer' => 'PPFC',
954                    'compiler' => 'PPFCCOMPILE',
955                    'compile' => '$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)',
956                    'compile_flag' => '-c',
957                    'output_flag' => '-o',
958                    'libtool_tag' => 'FC',
959                    'pure' => 1,
960                    'extensions' => ['.F90','.F95', '.F03', '.F08']);
962 # Preprocessed Fortran 77
964 # The current support for preprocessing Fortran 77 just involves
965 # passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
966 # $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since
967 # this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51
968 # for `make' Version 3.76 Beta' (specifically, from info file
969 # `(make)Catalogue of Rules').
971 # A better approach would be to write an Autoconf test
972 # (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all
973 # Fortran 77 compilers know how to do preprocessing.  The Autoconf
974 # macro AC_PROG_FPP should test the Fortran 77 compiler first for
975 # preprocessing capabilities, and then fall back on cpp (if cpp were
976 # available).
977 register_language ('name' => 'ppf77',
978                    'Name' => 'Preprocessed Fortran 77',
979                    'config_vars' => ['F77'],
980                    'linker' => 'F77LINK',
981                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
982                    'lder' => 'F77LD',
983                    'ld' => '$(F77)',
984                    'flags' => ['FFLAGS', 'CPPFLAGS'],
985                    'ccer' => 'PPF77',
986                    'compiler' => 'PPF77COMPILE',
987                    'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)',
988                    'compile_flag' => '-c',
989                    'output_flag' => '-o',
990                    'libtool_tag' => 'F77',
991                    'pure' => 1,
992                    'extensions' => ['.F']);
994 # Ratfor.
995 register_language ('name' => 'ratfor',
996                    'Name' => 'Ratfor',
997                    'config_vars' => ['F77'],
998                    'linker' => 'F77LINK',
999                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
1000                    'lder' => 'F77LD',
1001                    'ld' => '$(F77)',
1002                    'flags' => ['RFLAGS', 'FFLAGS'],
1003                    # FIXME also FFLAGS.
1004                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)',
1005                    'ccer' => 'F77',
1006                    'compiler' => 'RCOMPILE',
1007                    'compile_flag' => '-c',
1008                    'output_flag' => '-o',
1009                    'libtool_tag' => 'F77',
1010                    'pure' => 1,
1011                    'extensions' => ['.r']);
1013 # Java via gcj.
1014 register_language ('name' => 'java',
1015                    'Name' => 'Java',
1016                    'config_vars' => ['GCJ'],
1017                    'linker' => 'GCJLINK',
1018                    'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
1019                    'autodep' => 'GCJ',
1020                    'flags' => ['GCJFLAGS'],
1021                    'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)',
1022                    'ccer' => 'GCJ',
1023                    'compiler' => 'GCJCOMPILE',
1024                    'compile_flag' => '-c',
1025                    'output_flag' => '-o',
1026                    'libtool_tag' => 'GCJ',
1027                    'lder' => 'GCJLD',
1028                    'ld' => '$(GCJ)',
1029                    'pure' => 1,
1030                    'extensions' => ['.java', '.class', '.zip', '.jar']);
1032 ################################################################
1034 # Error reporting functions.
1036 # err_am ($MESSAGE, [%OPTIONS])
1037 # -----------------------------
1038 # Uncategorized errors about the current Makefile.am.
1039 sub err_am ($;%)
1041   msg_am ('error', @_);
1044 # err_ac ($MESSAGE, [%OPTIONS])
1045 # -----------------------------
1046 # Uncategorized errors about configure.ac.
1047 sub err_ac ($;%)
1049   msg_ac ('error', @_);
1052 # msg_am ($CHANNEL, $MESSAGE, [%OPTIONS])
1053 # ---------------------------------------
1054 # Messages about about the current Makefile.am.
1055 sub msg_am ($$;%)
1057   my ($channel, $msg, %opts) = @_;
1058   msg $channel, "${am_file}.am", $msg, %opts;
1061 # msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS])
1062 # ---------------------------------------
1063 # Messages about about configure.ac.
1064 sub msg_ac ($$;%)
1066   my ($channel, $msg, %opts) = @_;
1067   msg $channel, $configure_ac, $msg, %opts;
1070 ################################################################
1072 # subst ($TEXT)
1073 # -------------
1074 # Return a configure-style substitution using the indicated text.
1075 # We do this to avoid having the substitutions directly in automake.in;
1076 # when we do that they are sometimes removed and this causes confusion
1077 # and bugs.
1078 sub subst ($)
1080     my ($text) = @_;
1081     return '@' . $text . '@';
1084 ################################################################
1087 # $BACKPATH
1088 # &backname ($REL-DIR)
1089 # --------------------
1090 # If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'.
1091 # For instance `src/foo' => `../..'.
1092 # Works with non strictly increasing paths, i.e., `src/../lib' => `..'.
1093 sub backname ($)
1095     my ($file) = @_;
1096     my @res;
1097     foreach (split (/\//, $file))
1098     {
1099         next if $_ eq '.' || $_ eq '';
1100         if ($_ eq '..')
1101         {
1102             pop @res
1103               or prog_error ("trying to reverse path `$file' pointing outside tree");
1104         }
1105         else
1106         {
1107             push (@res, '..');
1108         }
1109     }
1110     return join ('/', @res) || '.';
1113 ################################################################
1115 # `silent-rules' mode handling functions.
1117 # verbose_var (NAME)
1118 # ------------------
1119 # The public variable stem used to implement `silent-rules'.
1120 sub verbose_var ($)
1122     my ($name) = @_;
1123     return 'AM_V_' . $name;
1126 # verbose_private_var (NAME)
1127 # --------------------------
1128 # The naming policy for the private variables for `silent-rules'.
1129 sub verbose_private_var ($)
1131     my ($name) = @_;
1132     return 'am__v_' . $name;
1135 # define_verbose_var (NAME, VAL)
1136 # ------------------------------
1137 # For `silent-rules' mode, setup VAR and dispatcher, to expand to VAL if silent.
1138 sub define_verbose_var ($$)
1140     my ($name, $val) = @_;
1141     my $var = verbose_var ($name);
1142     my $pvar = verbose_private_var ($name);
1143     if (option 'silent-rules')
1144       {
1145         # Using `$V' instead of `$(V)' breaks IRIX make.
1146         define_variable ($var, '$(' . $pvar . '_$(V))', INTERNAL);
1147         define_variable ($pvar . '_', $val, INTERNAL);
1148         define_variable ($pvar . '_0', $val, INTERNAL);
1149       }
1152 # Above should not be needed in the general automake code.
1154 # verbose_flag (NAME)
1155 # -------------------
1156 # Contents of %VERBOSE%: variable to expand before rule command.
1157 sub verbose_flag ($)
1159     my ($name) = @_;
1160     return '$(' . verbose_var ($name) . ')'
1161       if (option 'silent-rules');
1162     return '';
1165 # silent_flag
1166 # -----------
1167 # Contents of %SILENT%: variable to expand to `@' when silent.
1168 sub silent_flag ()
1170     return verbose_flag ('at');
1173 # define_verbose_tagvar (NAME)
1174 # ----------------------------
1175 # Engage the needed `silent-rules' machinery for tag NAME.
1176 sub define_verbose_tagvar ($)
1178     my ($name) = @_;
1179     if (option 'silent-rules')
1180       {
1181         define_verbose_var ($name, '@echo "  '. $name . ' ' x (6 - length ($name)) . '" $@;');
1182         define_verbose_var ('at', '@');
1183       }
1186 # define_verbose_libtool
1187 # ----------------------
1188 # Engage the needed `silent-rules' machinery for `libtool --silent'.
1189 sub define_verbose_libtool ()
1191     define_verbose_var ('lt', '--silent');
1192     return verbose_flag ('lt');
1196 ################################################################
1199 # Handle AUTOMAKE_OPTIONS variable.  Return 1 on error, 0 otherwise.
1200 sub handle_options
1202   my $var = var ('AUTOMAKE_OPTIONS');
1203   if ($var)
1204     {
1205       if ($var->has_conditional_contents)
1206         {
1207           msg_var ('unsupported', $var,
1208                    "`AUTOMAKE_OPTIONS' cannot have conditional contents");
1209         }
1210       foreach my $locvals ($var->value_as_list_recursive (cond_filter => TRUE,
1211                                                           location => 1))
1212         {
1213           my ($loc, $value) = @$locvals;
1214           return 1 if (process_option_list ($loc, $value))
1215         }
1216     }
1218   # Override portability-recursive warning.
1219   switch_warning ('no-portability-recursive')
1220     if option 'silent-rules';
1222   if ($strictness == GNITS)
1223     {
1224       set_option ('readme-alpha', INTERNAL);
1225       set_option ('std-options', INTERNAL);
1226       set_option ('check-news', INTERNAL);
1227     }
1229   return 0;
1232 # shadow_unconditionally ($varname, $where)
1233 # -----------------------------------------
1234 # Return a $(variable) that contains all possible values
1235 # $varname can take.
1236 # If the VAR wasn't defined conditionally, return $(VAR).
1237 # Otherwise we create a am__VAR_DIST variable which contains
1238 # all possible values, and return $(am__VAR_DIST).
1239 sub shadow_unconditionally ($$)
1241   my ($varname, $where) = @_;
1242   my $var = var $varname;
1243   if ($var->has_conditional_contents)
1244     {
1245       $varname = "am__${varname}_DIST";
1246       my @files = uniq ($var->value_as_list_recursive);
1247       define_pretty_variable ($varname, TRUE, $where, @files);
1248     }
1249   return "\$($varname)"
1252 # get_object_extension ($EXTENSION)
1253 # ---------------------------------
1254 # Prefix $EXTENSION with $U if ansi2knr is in use.
1255 sub get_object_extension ($)
1257     my ($extension) = @_;
1259     # Check for automatic de-ANSI-fication.
1260     $extension = '$U' . $extension
1261       if option 'ansi2knr';
1263     $get_object_extension_was_run = 1;
1265     return $extension;
1268 # check_user_variables (@LIST)
1269 # ----------------------------
1270 # Make sure each variable VAR in @LIST does not exist, suggest using AM_VAR
1271 # otherwise.
1272 sub check_user_variables (@)
1274   my @dont_override = @_;
1275   foreach my $flag (@dont_override)
1276     {
1277       my $var = var $flag;
1278       if ($var)
1279         {
1280           for my $cond ($var->conditions->conds)
1281             {
1282               if ($var->rdef ($cond)->owner == VAR_MAKEFILE)
1283                 {
1284                   msg_cond_var ('gnu', $cond, $flag,
1285                                 "`$flag' is a user variable, "
1286                                 . "you should not override it;\n"
1287                                 . "use `AM_$flag' instead.");
1288                 }
1289             }
1290         }
1291     }
1294 # Call finish function for each language that was used.
1295 sub handle_languages
1297     if (! option 'no-dependencies')
1298     {
1299         # Include auto-dep code.  Don't include it if DEP_FILES would
1300         # be empty.
1301         if (&saw_sources_p (0) && keys %dep_files)
1302         {
1303             # Set location of depcomp.
1304             &define_variable ('depcomp',
1305                               "\$(SHELL) $am_config_aux_dir/depcomp",
1306                               INTERNAL);
1307             &define_variable ('am__depfiles_maybe', 'depfiles', INTERNAL);
1309             require_conf_file ("$am_file.am", FOREIGN, 'depcomp');
1311             my @deplist = sort keys %dep_files;
1312             # Generate each `include' individually.  Irix 6 make will
1313             # not properly include several files resulting from a
1314             # variable expansion; generating many separate includes
1315             # seems safest.
1316             $output_rules .= "\n";
1317             foreach my $iter (@deplist)
1318             {
1319                 $output_rules .= (subst ('AMDEP_TRUE')
1320                                   . subst ('am__include')
1321                                   . ' '
1322                                   . subst ('am__quote')
1323                                   . $iter
1324                                   . subst ('am__quote')
1325                                   . "\n");
1326             }
1328             # Compute the set of directories to remove in distclean-depend.
1329             my @depdirs = uniq (map { dirname ($_) } @deplist);
1330             $output_rules .= &file_contents ('depend',
1331                                              new Automake::Location,
1332                                              DEPDIRS => "@depdirs");
1333         }
1334     }
1335     else
1336     {
1337         &define_variable ('depcomp', '', INTERNAL);
1338         &define_variable ('am__depfiles_maybe', '', INTERNAL);
1339     }
1341     my %done;
1343     # Is the c linker needed?
1344     my $needs_c = 0;
1345     foreach my $ext (sort keys %extension_seen)
1346     {
1347         next unless $extension_map{$ext};
1349         my $lang = $languages{$extension_map{$ext}};
1351         my $rule_file = $lang->rule_file || 'depend2';
1353         # Get information on $LANG.
1354         my $pfx = $lang->autodep;
1355         my $fpfx = ($pfx eq '') ? 'CC' : $pfx;
1357         my ($AMDEP, $FASTDEP) =
1358           (option 'no-dependencies' || $lang->autodep eq 'no')
1359           ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx");
1361         my $verbose = verbose_flag ($lang->ccer || 'GEN');
1362         my $silent = silent_flag ();
1364         my %transform = ('EXT'     => $ext,
1365                          'PFX'     => $pfx,
1366                          'FPFX'    => $fpfx,
1367                          'AMDEP'   => $AMDEP,
1368                          'FASTDEP' => $FASTDEP,
1369                          '-c'      => $lang->compile_flag || '',
1370                          # These are not used, but they need to be defined
1371                          # so &transform do not complain.
1372                          SUBDIROBJ     => 0,
1373                          'DERIVED-EXT' => 'BUG',
1374                          DIST_SOURCE   => 1,
1375                          VERBOSE   => $verbose,
1376                          SILENT    => $silent,
1377                         );
1379         # Generate the appropriate rules for this extension.
1380         if (((! option 'no-dependencies') && $lang->autodep ne 'no')
1381             || defined $lang->compile)
1382         {
1383             # Some C compilers don't support -c -o.  Use it only if really
1384             # needed.
1385             my $output_flag = $lang->output_flag || '';
1386             $output_flag = '-o'
1387               if (! $output_flag
1388                   && $lang->name eq 'c'
1389                   && option 'subdir-objects');
1391             # Compute a possible derived extension.
1392             # This is not used by depend2.am.
1393             my $der_ext = (&{$lang->output_extensions} ($ext))[0];
1395             # When we output an inference rule like `.c.o:' we
1396             # have two cases to consider: either subdir-objects
1397             # is used, or it is not.
1398             #
1399             # In the latter case the rule is used to build objects
1400             # in the current directory, and dependencies always
1401             # go into `./$(DEPDIR)/'.  We can hard-code this value.
1402             #
1403             # In the former case the rule can be used to build
1404             # objects in sub-directories too.  Dependencies should
1405             # go into the appropriate sub-directories, e.g.,
1406             # `sub/$(DEPDIR)/'.  The value of this directory
1407             # needs to be computed on-the-fly.
1408             #
1409             # DEPBASE holds the name of this directory, plus the
1410             # basename part of the object file (extensions Po, TPo,
1411             # Plo, TPlo will be added later as appropriate).  It is
1412             # either hardcoded, or a shell variable (`$depbase') that
1413             # will be computed by the rule.
1414             my $depbase =
1415               option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*';
1416             $output_rules .=
1417               file_contents ($rule_file,
1418                              new Automake::Location,
1419                              %transform,
1420                              GENERIC   => 1,
1422                              'DERIVED-EXT' => $der_ext,
1424                              DEPBASE   => $depbase,
1425                              BASE      => '$*',
1426                              SOURCE    => '$<',
1427                              SOURCEFLAG => $sourceflags{$ext} || '',
1428                              OBJ       => '$@',
1429                              OBJOBJ    => '$@',
1430                              LTOBJ     => '$@',
1432                              COMPILE   => '$(' . $lang->compiler . ')',
1433                              LTCOMPILE => '$(LT' . $lang->compiler . ')',
1434                              -o        => $output_flag,
1435                              SUBDIROBJ => !! option 'subdir-objects');
1436         }
1438         # Now include code for each specially handled object with this
1439         # language.
1440         my %seen_files = ();
1441         foreach my $file (@{$lang_specific_files{$lang->name}})
1442         {
1443             my ($derived, $source, $obj, $myext, $srcext, %file_transform) = @$file;
1445             # We might see a given object twice, for instance if it is
1446             # used under different conditions.
1447             next if defined $seen_files{$obj};
1448             $seen_files{$obj} = 1;
1450             prog_error ("found " . $lang->name .
1451                         " in handle_languages, but compiler not defined")
1452               unless defined $lang->compile;
1454             my $obj_compile = $lang->compile;
1456             # Rewrite each occurrence of `AM_$flag' in the compile
1457             # rule into `${derived}_$flag' if it exists.
1458             for my $flag (@{$lang->flags})
1459               {
1460                 my $val = "${derived}_$flag";
1461                 $obj_compile =~ s/\(AM_$flag\)/\($val\)/
1462                   if set_seen ($val);
1463               }
1465             my $libtool_tag = '';
1466             if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag})
1467               {
1468                 $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
1469               }
1471             my $ptltflags = "${derived}_LIBTOOLFLAGS";
1472             $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags;
1474             my $ltverbose = define_verbose_libtool ();
1475             my $obj_ltcompile =
1476               "\$(LIBTOOL) $ltverbose $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) "
1477               . "--mode=compile $obj_compile";
1479             # We _need_ `-o' for per object rules.
1480             my $output_flag = $lang->output_flag || '-o';
1482             my $depbase = dirname ($obj);
1483             $depbase = ''
1484                 if $depbase eq '.';
1485             $depbase .= '/'
1486                 unless $depbase eq '';
1487             $depbase .= '$(DEPDIR)/' . basename ($obj);
1489             # Support for deansified files in subdirectories is ugly
1490             # enough to deserve an explanation.
1491             #
1492             # A Note about normal ansi2knr processing first.  On
1493             #
1494             #   AUTOMAKE_OPTIONS = ansi2knr
1495             #   bin_PROGRAMS = foo
1496             #   foo_SOURCES = foo.c
1497             #
1498             # we generate rules similar to:
1499             #
1500             #   foo: foo$U.o; link ...
1501             #   foo$U.o: foo$U.c; compile ...
1502             #   foo_.c: foo.c; ansi2knr ...
1503             #
1504             # this is fairly compact, and will call ansi2knr depending
1505             # on the value of $U (`' or `_').
1506             #
1507             # It's harder with subdir sources. On
1508             #
1509             #   AUTOMAKE_OPTIONS = ansi2knr
1510             #   bin_PROGRAMS = foo
1511             #   foo_SOURCES = sub/foo.c
1512             #
1513             # we have to create foo_.c in the current directory.
1514             # (Unless the user asks 'subdir-objects'.)  This is important
1515             # in case the same file (`foo.c') is compiled from other
1516             # directories with different cpp options: foo_.c would
1517             # be preprocessed for only one set of options if it were
1518             # put in the subdirectory.
1519             #
1520             # Because foo$U.o must be built from either foo_.c or
1521             # sub/foo.c we can't be as concise as in the first example.
1522             # Instead we output
1523             #
1524             #   foo: foo$U.o; link ...
1525             #   foo_.o: foo_.c; compile ...
1526             #   foo.o: sub/foo.c; compile ...
1527             #   foo_.c: foo.c; ansi2knr ...
1528             #
1529             # This is why we'll now transform $rule_file twice
1530             # if we detect this case.
1531             # A first time we output the compile rule with `$U'
1532             # replaced by `_' and the source directory removed,
1533             # and another time we simply remove `$U'.
1534             #
1535             # Note that at this point $source (as computed by
1536             # &handle_single_transform) is `sub/foo$U.c'.
1537             # This can be confusing: it can be used as-is when
1538             # subdir-objects is set, otherwise you have to know
1539             # it really means `foo_.c' or `sub/foo.c'.
1540             my $objdir = dirname ($obj);
1541             my $srcdir = dirname ($source);
1542             if ($lang->ansi && $obj =~ /\$U/)
1543               {
1544                 prog_error "`$obj' contains \$U, but `$source' doesn't."
1545                   if $source !~ /\$U/;
1547                 (my $source_ = $source) =~ s/\$U/_/g;
1548                 # Output an additional rule if _.c and .c are not in
1549                 # the same directory.  (_.c is always in $objdir.)
1550                 if ($objdir ne $srcdir)
1551                   {
1552                     (my $obj_ = $obj) =~ s/\$U/_/g;
1553                     (my $depbase_ = $depbase) =~ s/\$U/_/g;
1554                     $source_ = basename ($source_);
1556                     $output_rules .=
1557                       file_contents ($rule_file,
1558                                      new Automake::Location,
1559                                      %transform,
1560                                      GENERIC   => 0,
1562                                      DEPBASE   => $depbase_,
1563                                      BASE      => $obj_,
1564                                      SOURCE    => $source_,
1565                                      SOURCEFLAG => $sourceflags{$srcext} || '',
1566                                      OBJ       => "$obj_$myext",
1567                                      OBJOBJ    => "$obj_.obj",
1568                                      LTOBJ     => "$obj_.lo",
1570                                      COMPILE   => $obj_compile,
1571                                      LTCOMPILE => $obj_ltcompile,
1572                                      -o        => $output_flag,
1573                                      %file_transform);
1574                     $obj =~ s/\$U//g;
1575                     $depbase =~ s/\$U//g;
1576                     $source =~ s/\$U//g;
1577                   }
1578               }
1580             $output_rules .=
1581               file_contents ($rule_file,
1582                              new Automake::Location,
1583                              %transform,
1584                              GENERIC   => 0,
1586                              DEPBASE   => $depbase,
1587                              BASE      => $obj,
1588                              SOURCE    => $source,
1589                              SOURCEFLAG => $sourceflags{$srcext} || '',
1590                              # Use $myext and not `.o' here, in case
1591                              # we are actually building a new source
1592                              # file -- e.g. via yacc.
1593                              OBJ       => "$obj$myext",
1594                              OBJOBJ    => "$obj.obj",
1595                              LTOBJ     => "$obj.lo",
1597                              VERBOSE   => $verbose,
1598                              SILENT    => $silent,
1599                              COMPILE   => $obj_compile,
1600                              LTCOMPILE => $obj_ltcompile,
1601                              -o        => $output_flag,
1602                              %file_transform);
1603         }
1605         # The rest of the loop is done once per language.
1606         next if defined $done{$lang};
1607         $done{$lang} = 1;
1609         # Load the language dependent Makefile chunks.
1610         my %lang = map { uc ($_) => 0 } keys %languages;
1611         $lang{uc ($lang->name)} = 1;
1612         $output_rules .= file_contents ('lang-compile',
1613                                         new Automake::Location,
1614                                         %transform, %lang);
1616         # If the source to a program consists entirely of code from a
1617         # `pure' language, for instance C++ or Fortran 77, then we
1618         # don't need the C compiler code.  However if we run into
1619         # something unusual then we do generate the C code.  There are
1620         # probably corner cases here that do not work properly.
1621         # People linking Java code to Fortran code deserve pain.
1622         $needs_c ||= ! $lang->pure;
1624         define_compiler_variable ($lang)
1625           if ($lang->compile);
1627         define_linker_variable ($lang)
1628           if ($lang->link);
1630         require_variables ("$am_file.am", $lang->Name . " source seen",
1631                            TRUE, @{$lang->config_vars});
1633         # Call the finisher.
1634         $lang->finish;
1636         # Flags listed in `->flags' are user variables (per GNU Standards),
1637         # they should not be overridden in the Makefile...
1638         my @dont_override = @{$lang->flags};
1639         # ... and so is LDFLAGS.
1640         push @dont_override, 'LDFLAGS' if $lang->link;
1642         check_user_variables @dont_override;
1643     }
1645     # If the project is entirely C++ or entirely Fortran 77 (i.e., 1
1646     # suffix rule was learned), don't bother with the C stuff.  But if
1647     # anything else creeps in, then use it.
1648     $needs_c = 1
1649       if $need_link || suffix_rules_count > 1;
1651     if ($needs_c)
1652       {
1653         &define_compiler_variable ($languages{'c'})
1654           unless defined $done{$languages{'c'}};
1655         define_linker_variable ($languages{'c'});
1656       }
1658     # Always provide the user with `AM_V_GEN' for `silent-rules' mode.
1659     define_verbose_tagvar ('GEN');
1663 # append_exeext { PREDICATE } $MACRO
1664 # ----------------------------------
1665 # Append $(EXEEXT) to each filename in $F appearing in the Makefile
1666 # variable $MACRO if &PREDICATE($F) is true.  @substitutions@ are
1667 # ignored.
1669 # This is typically used on all filenames of *_PROGRAMS, and filenames
1670 # of TESTS that are programs.
1671 sub append_exeext (&$)
1673   my ($pred, $macro) = @_;
1675   transform_variable_recursively
1676     ($macro, $macro, 'am__EXEEXT', 0, INTERNAL,
1677      sub {
1678        my ($subvar, $val, $cond, $full_cond) = @_;
1679        # Append $(EXEEXT) unless the user did it already, or it's a
1680        # @substitution@.
1681        $val .= '$(EXEEXT)'
1682          if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val);
1683        return $val;
1684      });
1688 # Check to make sure a source defined in LIBOBJS is not explicitly
1689 # mentioned.  This is a separate function (as opposed to being inlined
1690 # in handle_source_transform) because it isn't always appropriate to
1691 # do this check.
1692 sub check_libobjs_sources
1694   my ($one_file, $unxformed) = @_;
1696   foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
1697                       'dist_EXTRA_', 'nodist_EXTRA_')
1698     {
1699       my @files;
1700       my $varname = $prefix . $one_file . '_SOURCES';
1701       my $var = var ($varname);
1702       if ($var)
1703         {
1704           @files = $var->value_as_list_recursive;
1705         }
1706       elsif ($prefix eq '')
1707         {
1708           @files = ($unxformed . '.c');
1709         }
1710       else
1711         {
1712           next;
1713         }
1715       foreach my $file (@files)
1716         {
1717           err_var ($prefix . $one_file . '_SOURCES',
1718                    "automatically discovered file `$file' should not" .
1719                    " be explicitly mentioned")
1720             if defined $libsources{$file};
1721         }
1722     }
1726 # @OBJECTS
1727 # handle_single_transform ($VAR, $TOPPARENT, $DERIVED, $OBJ, $FILE, %TRANSFORM)
1728 # -----------------------------------------------------------------------------
1729 # Does much of the actual work for handle_source_transform.
1730 # Arguments are:
1731 #   $VAR is the name of the variable that the source filenames come from
1732 #   $TOPPARENT is the name of the _SOURCES variable which is being processed
1733 #   $DERIVED is the name of resulting executable or library
1734 #   $OBJ is the object extension (e.g., `$U.lo')
1735 #   $FILE the source file to transform
1736 #   %TRANSFORM contains extras arguments to pass to file_contents
1737 #     when producing explicit rules
1738 # Result is a list of the names of objects
1739 # %linkers_used will be updated with any linkers needed
1740 sub handle_single_transform ($$$$$%)
1742     my ($var, $topparent, $derived, $obj, $_file, %transform) = @_;
1743     my @files = ($_file);
1744     my @result = ();
1745     my $nonansi_obj = $obj;
1746     $nonansi_obj =~ s/\$U//g;
1748     # Turn sources into objects.  We use a while loop like this
1749     # because we might add to @files in the loop.
1750     while (scalar @files > 0)
1751     {
1752         $_ = shift @files;
1754         # Configure substitutions in _SOURCES variables are errors.
1755         if (/^\@.*\@$/)
1756         {
1757           my $parent_msg = '';
1758           $parent_msg = "\nand is referred to from `$topparent'"
1759             if $topparent ne $var->name;
1760           err_var ($var,
1761                    "`" . $var->name . "' includes configure substitution `$_'"
1762                    . $parent_msg . ";\nconfigure " .
1763                    "substitutions are not allowed in _SOURCES variables");
1764           next;
1765         }
1767         # If the source file is in a subdirectory then the `.o' is put
1768         # into the current directory, unless the subdir-objects option
1769         # is in effect.
1771         # Split file name into base and extension.
1772         next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/;
1773         my $full = $_;
1774         my $directory = $1 || '';
1775         my $base = $2;
1776         my $extension = $3;
1778         # We must generate a rule for the object if it requires its own flags.
1779         my $renamed = 0;
1780         my ($linker, $object);
1782         # This records whether we've seen a derived source file (e.g.
1783         # yacc output).
1784         my $derived_source = 0;
1786         # This holds the `aggregate context' of the file we are
1787         # currently examining.  If the file is compiled with
1788         # per-object flags, then it will be the name of the object.
1789         # Otherwise it will be `AM'.  This is used by the target hook
1790         # language function.
1791         my $aggregate = 'AM';
1793         $extension = &derive_suffix ($extension, $nonansi_obj);
1794         my $lang;
1795         if ($extension_map{$extension} &&
1796             ($lang = $languages{$extension_map{$extension}}))
1797         {
1798             # Found the language, so see what it says.
1799             &saw_extension ($extension);
1801             # Do we have per-executable flags for this executable?
1802             my $have_per_exec_flags = 0;
1803             my @peflags = @{$lang->flags};
1804             push @peflags, 'LIBTOOLFLAGS' if $nonansi_obj eq '.lo';
1805             foreach my $flag (@peflags)
1806               {
1807                 if (set_seen ("${derived}_$flag"))
1808                   {
1809                     $have_per_exec_flags = 1;
1810                     last;
1811                   }
1812               }
1814             # Note: computed subr call.  The language rewrite function
1815             # should return one of the LANG_* constants.  It could
1816             # also return a list whose first value is such a constant
1817             # and whose second value is a new source extension which
1818             # should be applied.  This means this particular language
1819             # generates another source file which we must then process
1820             # further.
1821             my $subr = \&{'lang_' . $lang->name . '_rewrite'};
1822             my ($r, $source_extension)
1823                 = &$subr ($directory, $base, $extension,
1824                           $nonansi_obj, $have_per_exec_flags, $var);
1825             # Skip this entry if we were asked not to process it.
1826             next if $r == LANG_IGNORE;
1828             # Now extract linker and other info.
1829             $linker = $lang->linker;
1831             my $this_obj_ext;
1832             if (defined $source_extension)
1833             {
1834                 $this_obj_ext = $source_extension;
1835                 $derived_source = 1;
1836             }
1837             elsif ($lang->ansi)
1838             {
1839                 $this_obj_ext = $obj;
1840             }
1841             else
1842             {
1843                 $this_obj_ext = $nonansi_obj;
1844             }
1845             $object = $base . $this_obj_ext;
1847             if ($have_per_exec_flags)
1848             {
1849                 # We have a per-executable flag in effect for this
1850                 # object.  In this case we rewrite the object's
1851                 # name to ensure it is unique.
1853                 # We choose the name `DERIVED_OBJECT' to ensure
1854                 # (1) uniqueness, and (2) continuity between
1855                 # invocations.  However, this will result in a
1856                 # name that is too long for losing systems, in
1857                 # some situations.  So we provide _SHORTNAME to
1858                 # override.
1860                 my $dname = $derived;
1861                 my $var = var ($derived . '_SHORTNAME');
1862                 if ($var)
1863                 {
1864                     # FIXME: should use the same Condition as
1865                     # the _SOURCES variable.  But this is really
1866                     # silly overkill -- nobody should have
1867                     # conditional shortnames.
1868                     $dname = $var->variable_value;
1869                 }
1870                 $object = $dname . '-' . $object;
1872                 prog_error ($lang->name . " flags defined without compiler")
1873                   if ! defined $lang->compile;
1875                 $renamed = 1;
1876             }
1878             # If rewrite said it was ok, put the object into a
1879             # subdir.
1880             if ($r == LANG_SUBDIR && $directory ne '')
1881             {
1882                 $object = $directory . '/' . $object;
1883             }
1885             # If the object file has been renamed (because per-target
1886             # flags are used) we cannot compile the file with an
1887             # inference rule: we need an explicit rule.
1888             #
1889             # If the source is in a subdirectory and the object is in
1890             # the current directory, we also need an explicit rule.
1891             #
1892             # If both source and object files are in a subdirectory
1893             # (this happens when the subdir-objects option is used),
1894             # then the inference will work.
1895             #
1896             # The latter case deserves a historical note.  When the
1897             # subdir-objects option was added on 1999-04-11 it was
1898             # thought that inferences rules would work for
1899             # subdirectory objects too.  Later, on 1999-11-22,
1900             # automake was changed to output explicit rules even for
1901             # subdir-objects.  Nobody remembers why, but this occurred
1902             # soon after the merge of the user-dep-gen-branch so it
1903             # might be related.  In late 2003 people complained about
1904             # the size of the generated Makefile.ins (libgcj, with
1905             # 2200+ subdir objects was reported to have a 9MB
1906             # Makefile), so we now rely on inference rules again.
1907             # Maybe we'll run across the same issue as in the past,
1908             # but at least this time we can document it.  However since
1909             # dependency tracking has evolved it is possible that
1910             # our old problem no longer exists.
1911             # Using inference rules for subdir-objects has been tested
1912             # with GNU make, Solaris make, Ultrix make, BSD make,
1913             # HP-UX make, and OSF1 make successfully.
1914             if ($renamed
1915                 || ($directory ne '' && ! option 'subdir-objects')
1916                 # We must also use specific rules for a nodist_ source
1917                 # if its language requests it.
1918                 || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'}))
1919             {
1920                 my $obj_sans_ext = substr ($object, 0,
1921                                            - length ($this_obj_ext));
1922                 my $full_ansi;
1923                 if ($directory ne '')
1924                   {
1925                         $full_ansi = $directory . '/' . $base . $extension;
1926                   }
1927                 else
1928                   {
1929                         $full_ansi = $base . $extension;
1930                   }
1932                 if ($lang->ansi && option 'ansi2knr')
1933                   {
1934                     $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/;
1935                     $obj_sans_ext .= '$U';
1936                   }
1938                 my @specifics = ($full_ansi, $obj_sans_ext,
1939                                  # Only use $this_obj_ext in the derived
1940                                  # source case because in the other case we
1941                                  # *don't* want $(OBJEXT) to appear here.
1942                                  ($derived_source ? $this_obj_ext : '.o'),
1943                                  $extension);
1945                 # If we renamed the object then we want to use the
1946                 # per-executable flag name.  But if this is simply a
1947                 # subdir build then we still want to use the AM_ flag
1948                 # name.
1949                 if ($renamed)
1950                   {
1951                     unshift @specifics, $derived;
1952                     $aggregate = $derived;
1953                   }
1954                 else
1955                   {
1956                     unshift @specifics, 'AM';
1957                   }
1959                 # Each item on this list is a reference to a list consisting
1960                 # of four values followed by additional transform flags for
1961                 # file_contents.   The four values are the derived flag prefix
1962                 # (e.g. for `foo_CFLAGS', it is `foo'), the name of the
1963                 # source file, the base name of the output file, and
1964                 # the extension for the object file.
1965                 push (@{$lang_specific_files{$lang->name}},
1966                       [@specifics, %transform]);
1967             }
1968         }
1969         elsif ($extension eq $nonansi_obj)
1970         {
1971             # This is probably the result of a direct suffix rule.
1972             # In this case we just accept the rewrite.
1973             $object = "$base$extension";
1974             $object = "$directory/$object" if $directory ne '';
1975             $linker = '';
1976         }
1977         else
1978         {
1979             # No error message here.  Used to have one, but it was
1980             # very unpopular.
1981             # FIXME: we could potentially do more processing here,
1982             # perhaps treating the new extension as though it were a
1983             # new source extension (as above).  This would require
1984             # more restructuring than is appropriate right now.
1985             next;
1986         }
1988         err_am "object `$object' created by `$full' and `$object_map{$object}'"
1989           if (defined $object_map{$object}
1990               && $object_map{$object} ne $full);
1992         my $comp_val = (($object =~ /\.lo$/)
1993                         ? COMPILE_LIBTOOL : COMPILE_ORDINARY);
1994         (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/;
1995         if (defined $object_compilation_map{$comp_obj}
1996             && $object_compilation_map{$comp_obj} != 0
1997             # Only see the error once.
1998             && ($object_compilation_map{$comp_obj}
1999                 != (COMPILE_LIBTOOL | COMPILE_ORDINARY))
2000             && $object_compilation_map{$comp_obj} != $comp_val)
2001           {
2002             err_am "object `$comp_obj' created both with libtool and without";
2003           }
2004         $object_compilation_map{$comp_obj} |= $comp_val;
2006         if (defined $lang)
2007         {
2008             # Let the language do some special magic if required.
2009             $lang->target_hook ($aggregate, $object, $full, %transform);
2010         }
2012         if ($derived_source)
2013           {
2014             prog_error ($lang->name . " has automatic dependency tracking")
2015               if $lang->autodep ne 'no';
2016             # Make sure this new source file is handled next.  That will
2017             # make it appear to be at the right place in the list.
2018             unshift (@files, $object);
2019             # Distribute derived sources unless the source they are
2020             # derived from is not.
2021             &push_dist_common ($object)
2022               unless ($topparent =~ /^(?:nobase_)?nodist_/);
2023             next;
2024           }
2026         $linkers_used{$linker} = 1;
2028         push (@result, $object);
2030         if (! defined $object_map{$object})
2031         {
2032             my @dep_list = ();
2033             $object_map{$object} = $full;
2035             # If resulting object is in subdir, we need to make
2036             # sure the subdir exists at build time.
2037             if ($object =~ /\//)
2038             {
2039                 # FIXME: check that $DIRECTORY is somewhere in the
2040                 # project
2042                 # For Java, the way we're handling it right now, a
2043                 # `..' component doesn't make sense.
2044                 if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//)
2045                   {
2046                     err_am "`$full' should not contain a `..' component";
2047                   }
2049                 # Make sure object is removed by `make mostlyclean'.
2050                 $compile_clean_files{$object} = MOSTLY_CLEAN;
2051                 # If we have a libtool object then we also must remove
2052                 # the ordinary .o.
2053                 if ($object =~ /\.lo$/)
2054                 {
2055                     (my $xobj = $object) =~ s,lo$,\$(OBJEXT),;
2056                     $compile_clean_files{$xobj} = MOSTLY_CLEAN;
2058                     # Remove any libtool object in this directory.
2059                     $libtool_clean_directories{$directory} = 1;
2060                 }
2062                 push (@dep_list, require_build_directory ($directory));
2064                 # If we're generating dependencies, we also want
2065                 # to make sure that the appropriate subdir of the
2066                 # .deps directory is created.
2067                 push (@dep_list,
2068                       require_build_directory ($directory . '/$(DEPDIR)'))
2069                   unless option 'no-dependencies';
2070             }
2072             &pretty_print_rule ($object . ':', "\t", @dep_list)
2073                 if scalar @dep_list > 0;
2074         }
2076         # Transform .o or $o file into .P file (for automatic
2077         # dependency code).
2078         if ($lang && $lang->autodep ne 'no')
2079         {
2080             my $depfile = $object;
2081             $depfile =~ s/\.([^.]*)$/.P$1/;
2082             $depfile =~ s/\$\(OBJEXT\)$/o/;
2083             $dep_files{dirname ($depfile) . '/$(DEPDIR)/'
2084                          . basename ($depfile)} = 1;
2085         }
2086     }
2088     return @result;
2092 # $LINKER
2093 # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE,
2094 #                              $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM)
2095 # ---------------------------------------------------------------------------
2096 # Define an _OBJECTS variable for a _SOURCES variable (or subvariable)
2098 # Arguments are:
2099 #   $VAR is the name of the _SOURCES variable
2100 #   $OBJVAR is the name of the _OBJECTS variable if known (otherwise
2101 #     it will be generated and returned).
2102 #   $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but
2103 #     work done to determine the linker will be).
2104 #   $ONE_FILE is the canonical (transformed) name of object to build
2105 #   $OBJ is the object extension (i.e. either `.o' or `.lo').
2106 #   $TOPPARENT is the _SOURCES variable being processed.
2107 #   $WHERE context into which this definition is done
2108 #   %TRANSFORM extra arguments to pass to file_contents when producing
2109 #     rules
2111 # Result is a pair ($LINKER, $OBJVAR):
2112 #    $LINKER is a boolean, true if a linker is needed to deal with the objects
2113 sub define_objects_from_sources ($$$$$$$%)
2115   my ($var, $objvar, $nodefine, $one_file,
2116       $obj, $topparent, $where, %transform) = @_;
2118   my $needlinker = "";
2120   transform_variable_recursively
2121     ($var, $objvar, 'am__objects', $nodefine, $where,
2122      # The transform code to run on each filename.
2123      sub {
2124        my ($subvar, $val, $cond, $full_cond) = @_;
2125        my @trans = handle_single_transform ($subvar, $topparent,
2126                                             $one_file, $obj, $val,
2127                                             %transform);
2128        $needlinker = "true" if @trans;
2129        return @trans;
2130      });
2132   return $needlinker;
2136 # handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM)
2137 # -----------------------------------------------------------------------------
2138 # Handle SOURCE->OBJECT transform for one program or library.
2139 # Arguments are:
2140 #   canonical (transformed) name of target to build
2141 #   actual target of object to build
2142 #   object extension (i.e., either `.o' or `$o')
2143 #   location of the source variable
2144 #   extra arguments to pass to file_contents when producing rules
2145 # Return the name of the linker variable that must be used.
2146 # Empty return means just use `LINK'.
2147 sub handle_source_transform ($$$$%)
2149     # one_file is canonical name.  unxformed is given name.  obj is
2150     # object extension.
2151     my ($one_file, $unxformed, $obj, $where, %transform) = @_;
2153     my $linker = '';
2155     # No point in continuing if _OBJECTS is defined.
2156     return if reject_var ($one_file . '_OBJECTS',
2157                           $one_file . '_OBJECTS should not be defined');
2159     my %used_pfx = ();
2160     my $needlinker;
2161     %linkers_used = ();
2162     foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
2163                         'dist_EXTRA_', 'nodist_EXTRA_')
2164     {
2165         my $varname = $prefix . $one_file . "_SOURCES";
2166         my $var = var $varname;
2167         next unless $var;
2169         # We are going to define _OBJECTS variables using the prefix.
2170         # Then we glom them all together.  So we can't use the null
2171         # prefix here as we need it later.
2172         my $xpfx = ($prefix eq '') ? 'am_' : $prefix;
2174         # Keep track of which prefixes we saw.
2175         $used_pfx{$xpfx} = 1
2176           unless $prefix =~ /EXTRA_/;
2178         push @sources, "\$($varname)";
2179         push @dist_sources, shadow_unconditionally ($varname, $where)
2180           unless (option ('no-dist') || $prefix =~ /^nodist_/);
2182         $needlinker |=
2183             define_objects_from_sources ($varname,
2184                                          $xpfx . $one_file . '_OBJECTS',
2185                                          $prefix =~ /EXTRA_/,
2186                                          $one_file, $obj, $varname, $where,
2187                                          DIST_SOURCE => ($prefix !~ /^nodist_/),
2188                                          %transform);
2189     }
2190     if ($needlinker)
2191     {
2192         $linker ||= &resolve_linker (%linkers_used);
2193     }
2195     my @keys = sort keys %used_pfx;
2196     if (scalar @keys == 0)
2197     {
2198         # The default source for libfoo.la is libfoo.c, but for
2199         # backward compatibility we first look at libfoo_la.c,
2200         # if no default source suffix is given.
2201         my $old_default_source = "$one_file.c";
2202         my $ext_var = var ('AM_DEFAULT_SOURCE_EXT');
2203         my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c';
2204         msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most one value")
2205           if $default_source_ext =~ /[\t ]/;
2206         (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,$default_source_ext,;
2207         if ($old_default_source ne $default_source
2208             && !$ext_var
2209             && (rule $old_default_source
2210                 || rule '$(srcdir)/' . $old_default_source
2211                 || rule '${srcdir}/' . $old_default_source
2212                 || -f $old_default_source))
2213           {
2214             my $loc = $where->clone;
2215             $loc->pop_context;
2216             msg ('obsolete', $loc,
2217                  "the default source for `$unxformed' has been changed "
2218                  . "to `$default_source'.\n(Using `$old_default_source' for "
2219                  . "backward compatibility.)");
2220             $default_source = $old_default_source;
2221           }
2222         # If a rule exists to build this source with a $(srcdir)
2223         # prefix, use that prefix in our variables too.  This is for
2224         # the sake of BSD Make.
2225         if (rule '$(srcdir)/' . $default_source
2226             || rule '${srcdir}/' . $default_source)
2227           {
2228             $default_source = '$(srcdir)/' . $default_source;
2229           }
2231         &define_variable ($one_file . "_SOURCES", $default_source, $where);
2232         push (@sources, $default_source);
2233         push (@dist_sources, $default_source);
2235         %linkers_used = ();
2236         my (@result) =
2237           handle_single_transform ($one_file . '_SOURCES',
2238                                    $one_file . '_SOURCES',
2239                                    $one_file, $obj,
2240                                    $default_source, %transform);
2241         $linker ||= &resolve_linker (%linkers_used);
2242         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result);
2243     }
2244     else
2245     {
2246         @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys;
2247         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys);
2248     }
2250     # If we want to use `LINK' we must make sure it is defined.
2251     if ($linker eq '')
2252     {
2253         $need_link = 1;
2254     }
2256     return $linker;
2260 # handle_lib_objects ($XNAME, $VAR)
2261 # ---------------------------------
2262 # Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables.
2263 # Also, generate _DEPENDENCIES variable if appropriate.
2264 # Arguments are:
2265 #   transformed name of object being built, or empty string if no object
2266 #   name of _LDADD/_LIBADD-type variable to examine
2267 # Returns 1 if LIBOBJS seen, 0 otherwise.
2268 sub handle_lib_objects
2270   my ($xname, $varname) = @_;
2272   my $var = var ($varname);
2273   prog_error "handle_lib_objects: `$varname' undefined"
2274     unless $var;
2275   prog_error "handle_lib_objects: unexpected variable name `$varname'"
2276     unless $varname =~ /^(.*)(?:LIB|LD)ADD$/;
2277   my $prefix = $1 || 'AM_';
2279   my $seen_libobjs = 0;
2280   my $flagvar = 0;
2282   transform_variable_recursively
2283     ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES',
2284      ! $xname, INTERNAL,
2285      # Transformation function, run on each filename.
2286      sub {
2287        my ($subvar, $val, $cond, $full_cond) = @_;
2289        if ($val =~ /^-/)
2290          {
2291            # Skip -lfoo and -Ldir silently; these are explicitly allowed.
2292            if ($val !~ /^-[lL]/ &&
2293                # Skip -dlopen and -dlpreopen; these are explicitly allowed
2294                # for Libtool libraries or programs.  (Actually we are a bit
2295                # laxe here since this code also applies to non-libtool
2296                # libraries or programs, for which -dlopen and -dlopreopen
2297                # are pure nonsense.  Diagnosing this doesn't seem very
2298                # important: the developer will quickly get complaints from
2299                # the linker.)
2300                $val !~ /^-dl(?:pre)?open$/ &&
2301                # Only get this error once.
2302                ! $flagvar)
2303              {
2304                $flagvar = 1;
2305                # FIXME: should display a stack of nested variables
2306                # as context when $var != $subvar.
2307                err_var ($var, "linker flags such as `$val' belong in "
2308                         . "`${prefix}LDFLAGS");
2309              }
2310            return ();
2311          }
2312        elsif ($val !~ /^\@.*\@$/)
2313          {
2314            # Assume we have a file of some sort, and output it into the
2315            # dependency variable.  Autoconf substitutions are not output;
2316            # rarely is a new dependency substituted into e.g. foo_LDADD
2317            # -- but bad things (e.g. -lX11) are routinely substituted.
2318            # Note that LIBOBJS and ALLOCA are exceptions to this rule,
2319            # and handled specially below.
2320            return $val;
2321          }
2322        elsif ($val =~ /^\@(LT)?LIBOBJS\@$/)
2323          {
2324            handle_LIBOBJS ($subvar, $cond, $1);
2325            $seen_libobjs = 1;
2326            return $val;
2327          }
2328        elsif ($val =~ /^\@(LT)?ALLOCA\@$/)
2329          {
2330            handle_ALLOCA ($subvar, $cond, $1);
2331            return $val;
2332          }
2333        else
2334          {
2335            return ();
2336          }
2337      });
2339   return $seen_libobjs;
2342 # handle_LIBOBJS_or_ALLOCA ($VAR)
2343 # -------------------------------
2344 # Definitions common to LIBOBJS and ALLOCA.
2345 # VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA.
2346 sub handle_LIBOBJS_or_ALLOCA ($)
2348   my ($var) = @_;
2350   my $dir = '';
2352   # If LIBOBJS files must be built in another directory we have
2353   # to define LIBOBJDIR and ensure the files get cleaned.
2354   # Otherwise LIBOBJDIR can be left undefined, and the cleaning
2355   # is achieved by `rm -f *.$(OBJEXT)' in compile.am.
2356   if ($config_libobj_dir
2357       && $relative_dir ne $config_libobj_dir)
2358     {
2359       if (option 'subdir-objects')
2360         {
2361           # In the top-level Makefile we do not use $(top_builddir), because
2362           # we are already there, and since the targets are built without
2363           # a $(top_builddir), it helps BSD Make to match them with
2364           # dependencies.
2365           $dir = "$config_libobj_dir/" if $config_libobj_dir ne '.';
2366           $dir = "$topsrcdir/$dir" if $relative_dir ne '.';
2367           define_variable ('LIBOBJDIR', "$dir", INTERNAL);
2368           $clean_files{"\$($var)"} = MOSTLY_CLEAN;
2369           # If LTLIBOBJS is used, we must also clear LIBOBJS (which might
2370           # be created by libtool as a side-effect of creating LTLIBOBJS).
2371           $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//;
2372         }
2373       else
2374         {
2375           error ("`\$($var)' cannot be used outside `$config_libobj_dir' if"
2376                  . " `subdir-objects' is not set");
2377         }
2378     }
2380   return $dir;
2383 sub handle_LIBOBJS ($$$)
2385   my ($var, $cond, $lt) = @_;
2386   my $myobjext = $lt ? 'lo' : 'o';
2387   $lt ||= '';
2389   $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS')
2390     if ! keys %libsources;
2392   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}LIBOBJS";
2394   foreach my $iter (keys %libsources)
2395     {
2396       if ($iter =~ /\.[cly]$/)
2397         {
2398           &saw_extension ($&);
2399           &saw_extension ('.c');
2400         }
2402       if ($iter =~ /\.h$/)
2403         {
2404           require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2405         }
2406       elsif ($iter ne 'alloca.c')
2407         {
2408           my $rewrite = $iter;
2409           $rewrite =~ s/\.c$/.P$myobjext/;
2410           $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1;
2411           $rewrite = "^" . quotemeta ($iter) . "\$";
2412           # Only require the file if it is not a built source.
2413           my $bs = var ('BUILT_SOURCES');
2414           if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive))
2415             {
2416               require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2417             }
2418         }
2419     }
2422 sub handle_ALLOCA ($$$)
2424   my ($var, $cond, $lt) = @_;
2425   my $myobjext = $lt ? 'lo' : 'o';
2426   $lt ||= '';
2427   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}ALLOCA";
2429   $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA');
2430   $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1;
2431   require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c');
2432   &saw_extension ('.c');
2435 # Canonicalize the input parameter
2436 sub canonicalize
2438     my ($string) = @_;
2439     $string =~ tr/A-Za-z0-9_\@/_/c;
2440     return $string;
2443 # Canonicalize a name, and check to make sure the non-canonical name
2444 # is never used.  Returns canonical name.  Arguments are name and a
2445 # list of suffixes to check for.
2446 sub check_canonical_spelling
2448   my ($name, @suffixes) = @_;
2450   my $xname = &canonicalize ($name);
2451   if ($xname ne $name)
2452     {
2453       foreach my $xt (@suffixes)
2454         {
2455           reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'");
2456         }
2457     }
2459   return $xname;
2463 # handle_compile ()
2464 # -----------------
2465 # Set up the compile suite.
2466 sub handle_compile ()
2468     return
2469       unless $get_object_extension_was_run;
2471     # Boilerplate.
2472     my $default_includes = '';
2473     if (! option 'nostdinc')
2474       {
2475         my @incs = ('-I.', subst ('am__isrc'));
2477         my $var = var 'CONFIG_HEADER';
2478         if ($var)
2479           {
2480             foreach my $hdr (split (' ', $var->variable_value))
2481               {
2482                 push @incs, '-I' . dirname ($hdr);
2483               }
2484           }
2485         # We want `-I. -I$(srcdir)', but the latter -I is redundant
2486         # and unaesthetic in non-VPATH builds.  We use `-I.@am__isrc@`
2487         # instead.  It will be replaced by '-I.' or '-I. -I$(srcdir)'.
2488         # Items in CONFIG_HEADER are never in $(srcdir) so it is safe
2489         # to just put @am__isrc@ right after `-I.', without a space.
2490         ($default_includes = ' ' . uniq (@incs)) =~ s/ @/@/;
2491       }
2493     my (@mostly_rms, @dist_rms);
2494     foreach my $item (sort keys %compile_clean_files)
2495     {
2496         if ($compile_clean_files{$item} == MOSTLY_CLEAN)
2497         {
2498             push (@mostly_rms, "\t-rm -f $item");
2499         }
2500         elsif ($compile_clean_files{$item} == DIST_CLEAN)
2501         {
2502             push (@dist_rms, "\t-rm -f $item");
2503         }
2504         else
2505         {
2506           prog_error 'invalid entry in %compile_clean_files';
2507         }
2508     }
2510     my ($coms, $vars, $rules) =
2511       &file_contents_internal (1, "$libdir/am/compile.am",
2512                                new Automake::Location,
2513                                ('DEFAULT_INCLUDES' => $default_includes,
2514                                 'MOSTLYRMS' => join ("\n", @mostly_rms),
2515                                 'DISTRMS' => join ("\n", @dist_rms)));
2516     $output_vars .= $vars;
2517     $output_rules .= "$coms$rules";
2519     # Check for automatic de-ANSI-fication.
2520     if (option 'ansi2knr')
2521       {
2522         my ($ansi2knr_filename, $ansi2knr_where) = @{option 'ansi2knr'};
2523         my $ansi2knr_dir = '';
2525         require_variables ($ansi2knr_where, "option `ansi2knr' is used",
2526                            TRUE, "ANSI2KNR", "U");
2528         # topdir is where ansi2knr should be.
2529         if ($ansi2knr_filename eq 'ansi2knr')
2530           {
2531             # Only require ansi2knr files if they should appear in
2532             # this directory.
2533             require_file ($ansi2knr_where, FOREIGN,
2534                           'ansi2knr.c', 'ansi2knr.1');
2536             # ansi2knr needs to be built before subdirs, so unshift it.
2537             unshift (@all, '$(ANSI2KNR)');
2538           }
2539         else
2540           {
2541             $ansi2knr_dir = dirname ($ansi2knr_filename);
2542           }
2544         $output_rules .= &file_contents ('ansi2knr',
2545                                          new Automake::Location,
2546                                          'ANSI2KNR-DIR' => $ansi2knr_dir);
2548     }
2551 # handle_libtool ()
2552 # -----------------
2553 # Handle libtool rules.
2554 sub handle_libtool
2556   return unless var ('LIBTOOL');
2558   # Libtool requires some files, but only at top level.
2559   # (Starting with Libtool 2.0 we do not have to bother.  These
2560   # requirements are done with AC_REQUIRE_AUX_FILE.)
2561   require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files)
2562     if $relative_dir eq '.' && ! $libtool_new_api;
2564   my @libtool_rms;
2565   foreach my $item (sort keys %libtool_clean_directories)
2566     {
2567       my $dir = ($item eq '.') ? '' : "$item/";
2568       # .libs is for Unix, _libs for DOS.
2569       push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs");
2570     }
2572   check_user_variables 'LIBTOOLFLAGS';
2574   # Output the libtool compilation rules.
2575   $output_rules .= &file_contents ('libtool',
2576                                    new Automake::Location,
2577                                    LTRMS => join ("\n", @libtool_rms));
2580 # handle_programs ()
2581 # ------------------
2582 # Handle C programs.
2583 sub handle_programs
2585   my @proglist = &am_install_var ('progs', 'PROGRAMS',
2586                                   'bin', 'sbin', 'libexec', 'pkglib',
2587                                   'noinst', 'check');
2588   return if ! @proglist;
2590   my $seen_global_libobjs =
2591     var ('LDADD') && &handle_lib_objects ('', 'LDADD');
2593   foreach my $pair (@proglist)
2594     {
2595       my ($where, $one_file) = @$pair;
2597       my $seen_libobjs = 0;
2598       my $obj = get_object_extension '.$(OBJEXT)';
2600       # Strip any $(EXEEXT) suffix the user might have added, or this
2601       # will confuse &handle_source_transform and &check_canonical_spelling.
2602       # We'll add $(EXEEXT) back later anyway.
2603       $one_file =~ s/\$\(EXEEXT\)$//;
2605       $known_programs{$one_file} = $where;
2607       # Canonicalize names and check for misspellings.
2608       my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
2609                                              '_SOURCES', '_OBJECTS',
2610                                              '_DEPENDENCIES');
2612       $where->push_context ("while processing program `$one_file'");
2613       $where->set (INTERNAL->get);
2615       my $linker = &handle_source_transform ($xname, $one_file, $obj, $where,
2616                                              NONLIBTOOL => 1, LIBTOOL => 0);
2618       if (var ($xname . "_LDADD"))
2619         {
2620           $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD');
2621         }
2622       else
2623         {
2624           # User didn't define prog_LDADD override.  So do it.
2625           &define_variable ($xname . '_LDADD', '$(LDADD)', $where);
2627           # This does a bit too much work.  But we need it to
2628           # generate _DEPENDENCIES when appropriate.
2629           if (var ('LDADD'))
2630             {
2631               $seen_libobjs = &handle_lib_objects ($xname, 'LDADD');
2632             }
2633         }
2635       reject_var ($xname . '_LIBADD',
2636                   "use `${xname}_LDADD', not `${xname}_LIBADD'");
2638       set_seen ($xname . '_DEPENDENCIES');
2639       set_seen ($xname . '_LDFLAGS');
2641       # Determine program to use for link.
2642       my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xname);
2643       $vlink = verbose_flag ($vlink || 'GEN');
2645       # If the resulting program lies into a subdirectory,
2646       # make sure this directory will exist.
2647       my $dirstamp = require_build_directory_maybe ($one_file);
2649       $libtool_clean_directories{dirname ($one_file)} = 1;
2651       $output_rules .= &file_contents ('program',
2652                                        $where,
2653                                        PROGRAM  => $one_file,
2654                                        XPROGRAM => $xname,
2655                                        XLINK    => $xlink,
2656                                        VERBOSE  => $vlink,
2657                                        DIRSTAMP => $dirstamp,
2658                                        EXEEXT   => '$(EXEEXT)');
2660       if ($seen_libobjs || $seen_global_libobjs)
2661         {
2662           if (var ($xname . '_LDADD'))
2663             {
2664               &check_libobjs_sources ($xname, $xname . '_LDADD');
2665             }
2666           elsif (var ('LDADD'))
2667             {
2668               &check_libobjs_sources ($xname, 'LDADD');
2669             }
2670         }
2671     }
2675 # handle_libraries ()
2676 # -------------------
2677 # Handle libraries.
2678 sub handle_libraries
2680   my @liblist = &am_install_var ('libs', 'LIBRARIES',
2681                                  'lib', 'pkglib', 'noinst', 'check');
2682   return if ! @liblist;
2684   my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
2685                                     'noinst', 'check');
2687   if (@prefix)
2688     {
2689       my $var = rvar ($prefix[0] . '_LIBRARIES');
2690       $var->requires_variables ('library used', 'RANLIB');
2691     }
2693   &define_variable ('AR', 'ar', INTERNAL);
2694   &define_variable ('ARFLAGS', 'cru', INTERNAL);
2695   &define_verbose_tagvar ('AR');
2697   foreach my $pair (@liblist)
2698     {
2699       my ($where, $onelib) = @$pair;
2701       my $seen_libobjs = 0;
2702       # Check that the library fits the standard naming convention.
2703       my $bn = basename ($onelib);
2704       if ($bn !~ /^lib.*\.a$/)
2705         {
2706           $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/;
2707           my $suggestion = dirname ($onelib) . "/$bn";
2708           $suggestion =~ s|^\./||g;
2709           msg ('error-gnu/warn', $where,
2710                "`$onelib' is not a standard library name\n"
2711                . "did you mean `$suggestion'?")
2712         }
2714       $where->push_context ("while processing library `$onelib'");
2715       $where->set (INTERNAL->get);
2717       my $obj = get_object_extension '.$(OBJEXT)';
2719       # Canonicalize names and check for misspellings.
2720       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
2721                                             '_OBJECTS', '_DEPENDENCIES',
2722                                             '_AR');
2724       if (! var ($xlib . '_AR'))
2725         {
2726           &define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where);
2727         }
2729       # Generate support for conditional object inclusion in
2730       # libraries.
2731       if (var ($xlib . '_LIBADD'))
2732         {
2733           if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2734             {
2735               $seen_libobjs = 1;
2736             }
2737         }
2738       else
2739         {
2740           &define_variable ($xlib . "_LIBADD", '', $where);
2741         }
2743       reject_var ($xlib . '_LDADD',
2744                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2746       # Make sure we at look at this.
2747       set_seen ($xlib . '_DEPENDENCIES');
2749       &handle_source_transform ($xlib, $onelib, $obj, $where,
2750                                 NONLIBTOOL => 1, LIBTOOL => 0);
2752       # If the resulting library lies into a subdirectory,
2753       # make sure this directory will exist.
2754       my $dirstamp = require_build_directory_maybe ($onelib);
2755       my $verbose = verbose_flag ('AR');
2756       my $silent = silent_flag ();
2758       $output_rules .= &file_contents ('library',
2759                                        $where,
2760                                        VERBOSE  => $verbose,
2761                                        SILENT   => $silent,
2762                                        LIBRARY  => $onelib,
2763                                        XLIBRARY => $xlib,
2764                                        DIRSTAMP => $dirstamp);
2766       if ($seen_libobjs)
2767         {
2768           if (var ($xlib . '_LIBADD'))
2769             {
2770               &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2771             }
2772         }
2773     }
2777 # handle_ltlibraries ()
2778 # ---------------------
2779 # Handle shared libraries.
2780 sub handle_ltlibraries
2782   my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES',
2783                                  'noinst', 'lib', 'pkglib', 'check');
2784   return if ! @liblist;
2786   my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
2787                                     'noinst', 'check');
2789   if (@prefix)
2790     {
2791       my $var = rvar ($prefix[0] . '_LTLIBRARIES');
2792       $var->requires_variables ('Libtool library used', 'LIBTOOL');
2793     }
2795   my %instdirs = ();
2796   my %instsubdirs = ();
2797   my %instconds = ();
2798   my %liblocations = ();        # Location (in Makefile.am) of each library.
2800   foreach my $key (@prefix)
2801     {
2802       # Get the installation directory of each library.
2803       my $dir = $key;
2804       my $strip_subdir = 1;
2805       if ($dir =~ /^nobase_/)
2806         {
2807           $dir =~ s/^nobase_//;
2808           $strip_subdir = 0;
2809         }
2810       my $var = rvar ($key . '_LTLIBRARIES');
2812       # We reject libraries which are installed in several places
2813       # in the same condition, because we can only specify one
2814       # `-rpath' option.
2815       $var->traverse_recursively
2816         (sub
2817          {
2818            my ($var, $val, $cond, $full_cond) = @_;
2819            my $hcond = $full_cond->human;
2820            my $where = $var->rdef ($cond)->location;
2821            my $ldir = '';
2822            $ldir = '/' . dirname ($val)
2823              if (!$strip_subdir);
2824            # A library cannot be installed in different directory
2825            # in overlapping conditions.
2826            if (exists $instconds{$val})
2827              {
2828                my ($msg, $acond) =
2829                  $instconds{$val}->ambiguous_p ($val, $full_cond);
2831                if ($msg)
2832                  {
2833                    error ($where, $msg, partial => 1);
2834                    my $dirtxt = "installed " . ($strip_subdir ? "in" : "below") . " `$dir'";
2835                    $dirtxt = "built for `$dir'"
2836                      if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check';
2837                    my $dircond =
2838                      $full_cond->true ? "" : " in condition $hcond";
2840                    error ($where, "`$val' should be $dirtxt$dircond ...",
2841                           partial => 1);
2843                    my $hacond = $acond->human;
2844                    my $adir = $instdirs{$val}{$acond};
2845                    my $adirtxt = "installed in `$adir'";
2846                    $adirtxt = "built for `$adir'"
2847                      if ($adir eq 'EXTRA' || $adir eq 'noinst'
2848                          || $adir eq 'check');
2849                    my $adircond = $acond->true ? "" : " in condition $hacond";
2851                    my $onlyone = ($dir ne $adir) ?
2852                      ("\nLibtool libraries can be built for only one "
2853                       . "destination.") : "";
2855                    error ($liblocations{$val}{$acond},
2856                           "... and should also be $adirtxt$adircond.$onlyone");
2857                    return;
2858                  }
2859              }
2860            else
2861              {
2862                $instconds{$val} = new Automake::DisjConditions;
2863              }
2864            $instdirs{$val}{$full_cond} = $dir;
2865            $instsubdirs{$val}{$full_cond} = $ldir;
2866            $liblocations{$val}{$full_cond} = $where;
2867            $instconds{$val} = $instconds{$val}->merge ($full_cond);
2868          },
2869          sub
2870          {
2871            return ();
2872          },
2873          skip_ac_subst => 1);
2874     }
2876   foreach my $pair (@liblist)
2877     {
2878       my ($where, $onelib) = @$pair;
2880       my $seen_libobjs = 0;
2881       my $obj = get_object_extension '.lo';
2883       # Canonicalize names and check for misspellings.
2884       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
2885                                             '_SOURCES', '_OBJECTS',
2886                                             '_DEPENDENCIES');
2888       # Check that the library fits the standard naming convention.
2889       my $libname_rx = '^lib.*\.la';
2890       my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS');
2891       my $ldvar2 = var ('LDFLAGS');
2892       if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive))
2893           || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive)))
2894         {
2895           # Relax name checking for libtool modules.
2896           $libname_rx = '\.la';
2897         }
2899       my $bn = basename ($onelib);
2900       if ($bn !~ /$libname_rx$/)
2901         {
2902           my $type = 'library';
2903           if ($libname_rx eq '\.la')
2904             {
2905               $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/;
2906               $type = 'module';
2907             }
2908           else
2909             {
2910               $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/;
2911             }
2912           my $suggestion = dirname ($onelib) . "/$bn";
2913           $suggestion =~ s|^\./||g;
2914           msg ('error-gnu/warn', $where,
2915                "`$onelib' is not a standard libtool $type name\n"
2916                . "did you mean `$suggestion'?")
2917         }
2919       $where->push_context ("while processing Libtool library `$onelib'");
2920       $where->set (INTERNAL->get);
2922       # Make sure we look at these.
2923       set_seen ($xlib . '_LDFLAGS');
2924       set_seen ($xlib . '_DEPENDENCIES');
2926       # Generate support for conditional object inclusion in
2927       # libraries.
2928       if (var ($xlib . '_LIBADD'))
2929         {
2930           if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2931             {
2932               $seen_libobjs = 1;
2933             }
2934         }
2935       else
2936         {
2937           &define_variable ($xlib . "_LIBADD", '', $where);
2938         }
2940       reject_var ("${xlib}_LDADD",
2941                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2944       my $linker = &handle_source_transform ($xlib, $onelib, $obj, $where,
2945                                              NONLIBTOOL => 0, LIBTOOL => 1);
2947       # Determine program to use for link.
2948       my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xlib);
2949       $vlink = verbose_flag ($vlink || 'GEN');
2951       my $rpathvar = "am_${xlib}_rpath";
2952       my $rpath = "\$($rpathvar)";
2953       foreach my $rcond ($instconds{$onelib}->conds)
2954         {
2955           my $val;
2956           if ($instdirs{$onelib}{$rcond} eq 'EXTRA'
2957               || $instdirs{$onelib}{$rcond} eq 'noinst'
2958               || $instdirs{$onelib}{$rcond} eq 'check')
2959             {
2960               # It's an EXTRA_ library, so we can't specify -rpath,
2961               # because we don't know where the library will end up.
2962               # The user probably knows, but generally speaking automake
2963               # doesn't -- and in fact configure could decide
2964               # dynamically between two different locations.
2965               $val = '';
2966             }
2967           else
2968             {
2969               $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)');
2970               $val .= $instsubdirs{$onelib}{$rcond}
2971                 if defined $instsubdirs{$onelib}{$rcond};
2972             }
2973           if ($rcond->true)
2974             {
2975               # If $rcond is true there is only one condition and
2976               # there is no point defining an helper variable.
2977               $rpath = $val;
2978             }
2979           else
2980             {
2981               define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val);
2982             }
2983         }
2985       # If the resulting library lies into a subdirectory,
2986       # make sure this directory will exist.
2987       my $dirstamp = require_build_directory_maybe ($onelib);
2989       # Remember to cleanup .libs/ in this directory.
2990       my $dirname = dirname $onelib;
2991       $libtool_clean_directories{$dirname} = 1;
2993       $output_rules .= &file_contents ('ltlibrary',
2994                                        $where,
2995                                        LTLIBRARY  => $onelib,
2996                                        XLTLIBRARY => $xlib,
2997                                        RPATH      => $rpath,
2998                                        XLINK      => $xlink,
2999                                        VERBOSE    => $vlink,
3000                                        DIRSTAMP   => $dirstamp);
3001       if ($seen_libobjs)
3002         {
3003           if (var ($xlib . '_LIBADD'))
3004             {
3005               &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
3006             }
3007         }
3008     }
3011 # See if any _SOURCES variable were misspelled.
3012 sub check_typos ()
3014   # It is ok if the user sets this particular variable.
3015   set_seen 'AM_LDFLAGS';
3017   foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES')
3018     {
3019       foreach my $var (variables $primary)
3020         {
3021           my $varname = $var->name;
3022           # A configure variable is always legitimate.
3023           next if exists $configure_vars{$varname};
3025           for my $cond ($var->conditions->conds)
3026             {
3027               $varname =~ /^(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/;
3028               msg_var ('syntax', $var, "variable `$varname' is defined but no"
3029                        . " program or\nlibrary has `$1' as canonical name"
3030                        . " (possible typo)")
3031                 unless $var->rdef ($cond)->seen;
3032             }
3033         }
3034     }
3038 # Handle scripts.
3039 sub handle_scripts
3041     # NOTE we no longer automatically clean SCRIPTS, because it is
3042     # useful to sometimes distribute scripts verbatim.  This happens
3043     # e.g. in Automake itself.
3044     &am_install_var ('-candist', 'scripts', 'SCRIPTS',
3045                      'bin', 'sbin', 'libexec', 'pkgdata',
3046                      'noinst', 'check');
3052 ## ------------------------ ##
3053 ## Handling Texinfo files.  ##
3054 ## ------------------------ ##
3056 # ($OUTFILE, $VFILE, @CLEAN_FILES)
3057 # &scan_texinfo_file ($FILENAME)
3058 # ------------------------------
3059 # $OUTFILE     - name of the info file produced by $FILENAME.
3060 # $VFILE       - name of the version.texi file used (undef if none).
3061 # @CLEAN_FILES - list of byproducts (indexes etc.)
3062 sub scan_texinfo_file ($)
3064   my ($filename) = @_;
3066   # Some of the following extensions are always created, no matter
3067   # whether indexes are used or not.  Other (like cps, fns, ... pgs)
3068   # are only created when they are used.  We used to scan $FILENAME
3069   # for their use, but that is not enough: they could be used in
3070   # included files.  We can't scan included files because we don't
3071   # know the include path.  Therefore we always erase these files, no
3072   # matter whether they are used or not.
3073   #
3074   # (tmp is only created if an @macro is used and a certain e-TeX
3075   # feature is not available.)
3076   my %clean_suffixes =
3077     map { $_ => 1 } (qw(aux log toc tmp
3078                         cp cps
3079                         fn fns
3080                         ky kys
3081                         vr vrs
3082                         tp tps
3083                         pg pgs)); # grep 'new.*index' texinfo.tex
3085   my $texi = new Automake::XFile "< $filename";
3086   verb "reading $filename";
3088   my ($outfile, $vfile);
3089   while ($_ = $texi->getline)
3090     {
3091       if (/^\@setfilename +(\S+)/)
3092         {
3093           # Honor only the first @setfilename.  (It's possible to have
3094           # more occurrences later if the manual shows examples of how
3095           # to use @setfilename...)
3096           next if $outfile;
3098           $outfile = $1;
3099           if ($outfile =~ /\.([^.]+)$/ && $1 ne 'info')
3100             {
3101               error ("$filename:$.",
3102                      "output `$outfile' has unrecognized extension");
3103               return;
3104             }
3105         }
3106       # A "version.texi" file is actually any file whose name matches
3107       # "vers*.texi".
3108       elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/)
3109         {
3110           $vfile = $1;
3111         }
3113       # Try to find new or unused indexes.
3115       # Creating a new category of index.
3116       elsif (/^\@def(code)?index (\w+)/)
3117         {
3118           $clean_suffixes{$2} = 1;
3119           $clean_suffixes{"$2s"} = 1;
3120         }
3122       # Merging an index into an another.
3123       elsif (/^\@syn(code)?index (\w+) (\w+)/)
3124         {
3125           delete $clean_suffixes{"$2s"};
3126           $clean_suffixes{"$3s"} = 1;
3127         }
3129     }
3131   if (! $outfile)
3132     {
3133       err_am "`$filename' missing \@setfilename";
3134       return;
3135     }
3137   my $infobase = basename ($filename);
3138   $infobase =~ s/\.te?xi(nfo)?$//;
3139   return ($outfile, $vfile,
3140           map { "$infobase.$_" } (sort keys %clean_suffixes));
3144 # ($DIRSTAMP, @CLEAN_FILES)
3145 # output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES)
3146 # ------------------------------------------------------------------
3147 # SOURCE - the source Texinfo file
3148 # DEST - the destination Info file
3149 # INSRC - wether DEST should be built in the source tree
3150 # DEPENDENCIES - known dependencies
3151 sub output_texinfo_build_rules ($$$@)
3153   my ($source, $dest, $insrc, @deps) = @_;
3155   # Split `a.texi' into `a' and `.texi'.
3156   my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/);
3157   my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/);
3159   $ssfx ||= "";
3160   $dsfx ||= "";
3162   # We can output two kinds of rules: the "generic" rules use Make
3163   # suffix rules and are appropriate when $source and $dest do not lie
3164   # in a sub-directory; the "specific" rules are needed in the other
3165   # case.
3166   #
3167   # The former are output only once (this is not really apparent here,
3168   # but just remember that some logic deeper in Automake will not
3169   # output the same rule twice); while the later need to be output for
3170   # each Texinfo source.
3171   my $generic;
3172   my $makeinfoflags;
3173   my $sdir = dirname $source;
3174   if ($sdir eq '.' && dirname ($dest) eq '.')
3175     {
3176       $generic = 1;
3177       $makeinfoflags = '-I $(srcdir)';
3178     }
3179   else
3180     {
3181       $generic = 0;
3182       $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir";
3183     }
3185   # A directory can contain two kinds of info files: some built in the
3186   # source tree, and some built in the build tree.  The rules are
3187   # different in each case.  However we cannot output two different
3188   # set of generic rules.  Because in-source builds are more usual, we
3189   # use generic rules in this case and fall back to "specific" rules
3190   # for build-dir builds.  (It should not be a problem to invert this
3191   # if needed.)
3192   $generic = 0 unless $insrc;
3194   # We cannot use a suffix rule to build info files with an empty
3195   # extension.  Otherwise we would output a single suffix inference
3196   # rule, with separate dependencies, as in
3197   #
3198   #    .texi:
3199   #             $(MAKEINFO) ...
3200   #    foo.info: foo.texi
3201   #
3202   # which confuse Solaris make.  (See the Autoconf manual for
3203   # details.)  Therefore we use a specific rule in this case.  This
3204   # applies to info files only (dvi and pdf files always have an
3205   # extension).
3206   my $generic_info = ($generic && $dsfx) ? 1 : 0;
3208   # If the resulting file lie into a subdirectory,
3209   # make sure this directory will exist.
3210   my $dirstamp = require_build_directory_maybe ($dest);
3212   my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx;
3214   $output_rules .= file_contents ('texibuild',
3215                                   new Automake::Location,
3216                                   DEPS             => "@deps",
3217                                   DEST_PREFIX      => $dpfx,
3218                                   DEST_INFO_PREFIX => $dipfx,
3219                                   DEST_SUFFIX      => $dsfx,
3220                                   DIRSTAMP         => $dirstamp,
3221                                   GENERIC          => $generic,
3222                                   GENERIC_INFO     => $generic_info,
3223                                   INSRC            => $insrc,
3224                                   MAKEINFOFLAGS    => $makeinfoflags,
3225                                   SOURCE           => ($generic
3226                                                        ? '$<' : $source),
3227                                   SOURCE_INFO      => ($generic_info
3228                                                        ? '$<' : $source),
3229                                   SOURCE_REAL      => $source,
3230                                   SOURCE_SUFFIX    => $ssfx,
3231                                   );
3232   return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html");
3236 # ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN)
3237 # handle_texinfo_helper ($info_texinfos)
3238 # --------------------------------------
3239 # Handle all Texinfo source; helper for handle_texinfo.
3240 sub handle_texinfo_helper ($)
3242   my ($info_texinfos) = @_;
3243   my (@infobase, @info_deps_list, @texi_deps);
3244   my %versions;
3245   my $done = 0;
3246   my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', '');
3248   # Build a regex matching user-cleaned files.
3249   my $d = var 'DISTCLEANFILES';
3250   my $c = var 'CLEANFILES';
3251   my @f = ();
3252   push @f, $d->value_as_list_recursive (inner_expand => 1) if $d;
3253   push @f, $c->value_as_list_recursive (inner_expand => 1) if $c;
3254   @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f;
3255   my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$';
3257   foreach my $texi
3258       ($info_texinfos->value_as_list_recursive (inner_expand => 1))
3259     {
3260       my $infobase = $texi;
3261       $infobase =~ s/\.(txi|texinfo|texi)$//;
3263       if ($infobase eq $texi)
3264         {
3265           # FIXME: report line number.
3266           err_am "texinfo file `$texi' has unrecognized extension";
3267           next;
3268         }
3270       push @infobase, $infobase;
3272       # If 'version.texi' is referenced by input file, then include
3273       # automatic versioning capability.
3274       my ($out_file, $vtexi, @clean_files) =
3275         scan_texinfo_file ("$relative_dir/$texi")
3276         or next;
3277       push (@mostly_cleans, @clean_files);
3279       # If the Texinfo source is in a subdirectory, create the
3280       # resulting info in this subdirectory.  If it is in the current
3281       # directory, try hard to not prefix "./" because it breaks the
3282       # generic rules.
3283       my $outdir = dirname ($texi) . '/';
3284       $outdir = "" if $outdir eq './';
3285       $out_file =  $outdir . $out_file;
3287       # Until Automake 1.6.3, .info files were built in the
3288       # source tree.  This was an obstacle to the support of
3289       # non-distributed .info files, and non-distributed .texi
3290       # files.
3291       #
3292       # * Non-distributed .texi files is important in some packages
3293       #   where .texi files are built at make time, probably using
3294       #   other binaries built in the package itself, maybe using
3295       #   tools or information found on the build host.  Because
3296       #   these files are not distributed they are always rebuilt
3297       #   at make time; they should therefore not lie in the source
3298       #   directory.  One plan was to support this using
3299       #   nodist_info_TEXINFOS or something similar.  (Doing this
3300       #   requires some sanity checks.  For instance Automake should
3301       #   not allow:
3302       #      dist_info_TEXINFOS = foo.texi
3303       #      nodist_foo_TEXINFOS = included.texi
3304       #   because a distributed file should never depend on a
3305       #   non-distributed file.)
3306       #
3307       # * If .texi files are not distributed, then .info files should
3308       #   not be distributed either.  There are also cases where one
3309       #   wants to distribute .texi files, but does not want to
3310       #   distribute the .info files.  For instance the Texinfo package
3311       #   distributes the tool used to build these files; it would
3312       #   be a waste of space to distribute them.  It's not clear
3313       #   which syntax we should use to indicate that .info files should
3314       #   not be distributed.  Akim Demaille suggested that eventually
3315       #   we switch to a new syntax:
3316       #   |  Maybe we should take some inspiration from what's already
3317       #   |  done in the rest of Automake.  Maybe there is too much
3318       #   |  syntactic sugar here, and you want
3319       #   |     nodist_INFO = bar.info
3320       #   |     dist_bar_info_SOURCES = bar.texi
3321       #   |     bar_texi_DEPENDENCIES = foo.texi
3322       #   |  with a bit of magic to have bar.info represent the whole
3323       #   |  bar*info set.  That's a lot more verbose that the current
3324       #   |  situation, but it is # not new, hence the user has less
3325       #   |  to learn.
3326       #   |
3327       #   |  But there is still too much room for meaningless specs:
3328       #   |     nodist_INFO = bar.info
3329       #   |     dist_bar_info_SOURCES = bar.texi
3330       #   |     dist_PS = bar.ps something-written-by-hand.ps
3331       #   |     nodist_bar_ps_SOURCES = bar.texi
3332       #   |     bar_texi_DEPENDENCIES = foo.texi
3333       #   |  here bar.texi is dist_ in line 2, and nodist_ in 4.
3334       #
3335       # Back to the point, it should be clear that in order to support
3336       # non-distributed .info files, we need to build them in the
3337       # build tree, not in the source tree (non-distributed .texi
3338       # files are less of a problem, because we do not output build
3339       # rules for them).  In Automake 1.7 .info build rules have been
3340       # largely cleaned up so that .info files get always build in the
3341       # build tree, even when distributed.  The idea was that
3342       #   (1) if during a VPATH build the .info file was found to be
3343       #       absent or out-of-date (in the source tree or in the
3344       #       build tree), Make would rebuild it in the build tree.
3345       #       If an up-to-date source-tree of the .info file existed,
3346       #       make would not rebuild it in the build tree.
3347       #   (2) having two copies of .info files, one in the source tree
3348       #       and one (newer) in the build tree is not a problem
3349       #       because `make dist' always pick files in the build tree
3350       #       first.
3351       # However it turned out the be a bad idea for several reasons:
3352       #   * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave
3353       #     like GNU Make on point (1) above.  These implementations
3354       #     of Make would always rebuild .info files in the build
3355       #     tree, even if such files were up to date in the source
3356       #     tree.  Consequently, it was impossible to perform a VPATH
3357       #     build of a package containing Texinfo files using these
3358       #     Make implementations.
3359       #     (Refer to the Autoconf Manual, section "Limitation of
3360       #     Make", paragraph "VPATH", item "target lookup", for
3361       #     an account of the differences between these
3362       #     implementations.)
3363       #   * The GNU Coding Standards require these files to be built
3364       #     in the source-tree (when they are distributed, that is).
3365       #   * Keeping a fresher copy of distributed files in the
3366       #     build tree can be annoying during development because
3367       #     - if the files is kept under CVS, you really want it
3368       #       to be updated in the source tree
3369       #     - it is confusing that `make distclean' does not erase
3370       #       all files in the build tree.
3371       #
3372       # Consequently, starting with Automake 1.8, .info files are
3373       # built in the source tree again.  Because we still plan to
3374       # support non-distributed .info files at some point, we
3375       # have a single variable ($INSRC) that controls whether
3376       # the current .info file must be built in the source tree
3377       # or in the build tree.  Actually this variable is switched
3378       # off for .info files that appear to be cleaned; this is
3379       # for backward compatibility with package such as Texinfo,
3380       # which do things like
3381       #   info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
3382       #   DISTCLEANFILES = texinfo texinfo-* info*.info*
3383       #   # Do not create info files for distribution.
3384       #   dist-info:
3385       # in order not to distribute .info files.
3386       my $insrc = ($out_file =~ $user_cleaned_files) ? 0 : 1;
3388       my $soutdir = '$(srcdir)/' . $outdir;
3389       $outdir = $soutdir if $insrc;
3391       # If user specified file_TEXINFOS, then use that as explicit
3392       # dependency list.
3393       @texi_deps = ();
3394       push (@texi_deps, "$soutdir$vtexi") if $vtexi;
3396       my $canonical = canonicalize ($infobase);
3397       if (var ($canonical . "_TEXINFOS"))
3398         {
3399           push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
3400           push_dist_common ('$(' . $canonical . '_TEXINFOS)');
3401         }
3403       my ($dirstamp, @cfiles) =
3404         output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps);
3405       push (@texi_cleans, @cfiles);
3407       push (@info_deps_list, $out_file);
3409       # If a vers*.texi file is needed, emit the rule.
3410       if ($vtexi)
3411         {
3412           err_am ("`$vtexi', included in `$texi', "
3413                   . "also included in `$versions{$vtexi}'")
3414             if defined $versions{$vtexi};
3415           $versions{$vtexi} = $texi;
3417           # We number the stamp-vti files.  This is doable since the
3418           # actual names don't matter much.  We only number starting
3419           # with the second one, so that the common case looks nice.
3420           my $vti = ($done ? $done : 'vti');
3421           ++$done;
3423           # This is ugly, but it is our historical practice.
3424           if ($config_aux_dir_set_in_configure_ac)
3425             {
3426               require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3427                                             'mdate-sh');
3428             }
3429           else
3430             {
3431               require_file_with_macro (TRUE, 'info_TEXINFOS',
3432                                        FOREIGN, 'mdate-sh');
3433             }
3435           my $conf_dir;
3436           if ($config_aux_dir_set_in_configure_ac)
3437             {
3438               $conf_dir = "$am_config_aux_dir/";
3439             }
3440           else
3441             {
3442               $conf_dir = '$(srcdir)/';
3443             }
3444           $output_rules .= file_contents ('texi-vers',
3445                                           new Automake::Location,
3446                                           TEXI     => $texi,
3447                                           VTI      => $vti,
3448                                           STAMPVTI => "${soutdir}stamp-$vti",
3449                                           VTEXI    => "$soutdir$vtexi",
3450                                           MDDIR    => $conf_dir,
3451                                           DIRSTAMP => $dirstamp);
3452         }
3453     }
3455   # Handle location of texinfo.tex.
3456   my $need_texi_file = 0;
3457   my $texinfodir;
3458   if (var ('TEXINFO_TEX'))
3459     {
3460       # The user defined TEXINFO_TEX so assume he knows what he is
3461       # doing.
3462       $texinfodir = ('$(srcdir)/'
3463                      . dirname (variable_value ('TEXINFO_TEX')));
3464     }
3465   elsif (option 'cygnus')
3466     {
3467       $texinfodir = '$(top_srcdir)/../texinfo';
3468       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
3469     }
3470   elsif ($config_aux_dir_set_in_configure_ac)
3471     {
3472       $texinfodir = $am_config_aux_dir;
3473       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
3474       $need_texi_file = 2; # so that we require_conf_file later
3475     }
3476   else
3477     {
3478       $texinfodir = '$(srcdir)';
3479       $need_texi_file = 1;
3480     }
3481   define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL);
3483   push (@dist_targets, 'dist-info');
3485   if (! option 'no-installinfo')
3486     {
3487       # Make sure documentation is made and installed first.  Use
3488       # $(INFO_DEPS), not 'info', because otherwise recursive makes
3489       # get run twice during "make all".
3490       unshift (@all, '$(INFO_DEPS)');
3491     }
3493   define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL);
3494   define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL);
3495   define_files_variable ("PSS", @infobase, 'ps', INTERNAL);
3496   define_files_variable ("HTMLS", @infobase, 'html', INTERNAL);
3498   # This next isn't strictly needed now -- the places that look here
3499   # could easily be changed to look in info_TEXINFOS.  But this is
3500   # probably better, in case noinst_TEXINFOS is ever supported.
3501   define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL);
3503   # Do some error checking.  Note that this file is not required
3504   # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly
3505   # up above.
3506   if ($need_texi_file && ! option 'no-texinfo.tex')
3507     {
3508       if ($need_texi_file > 1)
3509         {
3510           require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3511                                         'texinfo.tex');
3512         }
3513       else
3514         {
3515           require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3516                                    'texinfo.tex');
3517         }
3518     }
3520   return (makefile_wrap ("", "\t  ", @mostly_cleans),
3521           makefile_wrap ("", "\t  ", @texi_cleans),
3522           makefile_wrap ("", "\t  ", @maint_cleans));
3526 # handle_texinfo ()
3527 # -----------------
3528 # Handle all Texinfo source.
3529 sub handle_texinfo ()
3531   reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'";
3532   # FIXME: I think this is an obsolete future feature name.
3533   reject_var 'html_TEXINFOS', "HTML generation not yet supported";
3535   my $info_texinfos = var ('info_TEXINFOS');
3536   my ($mostlyclean, $clean, $maintclean) = ('', '', '');
3537   if ($info_texinfos)
3538     {
3539       ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos);
3540       chomp $mostlyclean;
3541       chomp $clean;
3542       chomp $maintclean;
3543     }
3545   $output_rules .=  file_contents ('texinfos',
3546                                    new Automake::Location,
3547                                    MOSTLYCLEAN   => $mostlyclean,
3548                                    TEXICLEAN     => $clean,
3549                                    MAINTCLEAN    => $maintclean,
3550                                    'LOCAL-TEXIS' => !!$info_texinfos);
3554 # Handle any man pages.
3555 sub handle_man_pages
3557   reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'";
3559   # Find all the sections in use.  We do this by first looking for
3560   # "standard" sections, and then looking for any additional
3561   # sections used in man_MANS.
3562   my (%sections, %notrans_sections, %trans_sections,
3563       %notrans_vars, %trans_vars, %notrans_sect_vars, %trans_sect_vars);
3564   # We handle nodist_ for uniformity.  man pages aren't distributed
3565   # by default so it isn't actually very important.
3566   foreach my $npfx ('', 'notrans_')
3567     {
3568       foreach my $pfx ('', 'dist_', 'nodist_')
3569         {
3570           # Add more sections as needed.
3571           foreach my $section ('0'..'9', 'n', 'l')
3572             {
3573               my $varname = $npfx . $pfx . 'man' . $section . '_MANS';
3574               if (var ($varname))
3575                 {
3576                   $sections{$section} = 1;
3577                   $varname = '$(' . $varname . ')';
3578                   if ($npfx eq 'notrans_')
3579                     {
3580                       $notrans_sections{$section} = 1;
3581                       $notrans_sect_vars{$varname} = 1;
3582                     }
3583                   else
3584                     {
3585                       $trans_sections{$section} = 1;
3586                       $trans_sect_vars{$varname} = 1;
3587                     }
3589                   &push_dist_common ($varname)
3590                     if $pfx eq 'dist_';
3591                 }
3592             }
3594           my $varname = $npfx . $pfx . 'man_MANS';
3595           my $var = var ($varname);
3596           if ($var)
3597             {
3598               foreach ($var->value_as_list_recursive)
3599                 {
3600                   # A page like `foo.1c' goes into man1dir.
3601                   if (/\.([0-9a-z])([a-z]*)$/)
3602                     {
3603                       $sections{$1} = 1;
3604                       if ($npfx eq 'notrans_')
3605                         {
3606                           $notrans_sections{$1} = 1;
3607                         }
3608                       else
3609                         {
3610                           $trans_sections{$1} = 1;
3611                         }
3612                     }
3613                 }
3615               $varname = '$(' . $varname . ')';
3616               if ($npfx eq 'notrans_')
3617                 {
3618                   $notrans_vars{$varname} = 1;
3619                 }
3620               else
3621                 {
3622                   $trans_vars{$varname} = 1;
3623                 }
3624               &push_dist_common ($varname)
3625                 if $pfx eq 'dist_';
3626             }
3627         }
3628     }
3630   return unless %sections;
3632   my @unsorted_deps;
3634   # Build section independent variables.
3635   my $have_notrans = %notrans_vars;
3636   my @notrans_list = sort keys %notrans_vars;
3637   my $have_trans = %trans_vars;
3638   my @trans_list = sort keys %trans_vars;
3640   # Now for each section, generate an install and uninstall rule.
3641   # Sort sections so output is deterministic.
3642   foreach my $section (sort keys %sections)
3643     {
3644       # Build section dependent variables.
3645       my $notrans_mans = $have_notrans || exists $notrans_sections{$section};
3646       my $trans_mans = $have_trans || exists $trans_sections{$section};
3647       my (%notrans_this_sect, %trans_this_sect);
3648       my $expr = 'man' . $section . '_MANS';
3649       foreach my $varname (keys %notrans_sect_vars)
3650         {
3651           if ($varname =~ /$expr/)
3652             {
3653               $notrans_this_sect{$varname} = 1;
3654             }
3655         }
3656       foreach my $varname (keys %trans_sect_vars)
3657         {
3658           if ($varname =~ /$expr/)
3659             {
3660               $trans_this_sect{$varname} = 1;
3661             }
3662         }
3663       my @notrans_sect_list = sort keys %notrans_this_sect;
3664       my @trans_sect_list = sort keys %trans_this_sect;
3665       @unsorted_deps = (keys %notrans_vars, keys %trans_vars,
3666                         keys %notrans_this_sect, keys %trans_this_sect);
3667       my @deps = sort @unsorted_deps;
3668       $output_rules .= &file_contents ('mans',
3669                                        new Automake::Location,
3670                                        SECTION           => $section,
3671                                        DEPS              => "@deps",
3672                                        NOTRANS_MANS      => $notrans_mans,
3673                                        NOTRANS_SECT_LIST => "@notrans_sect_list",
3674                                        HAVE_NOTRANS      => $have_notrans,
3675                                        NOTRANS_LIST      => "@notrans_list",
3676                                        TRANS_MANS        => $trans_mans,
3677                                        TRANS_SECT_LIST   => "@trans_sect_list",
3678                                        HAVE_TRANS        => $have_trans,
3679                                        TRANS_LIST        => "@trans_list");
3680     }
3682   @unsorted_deps  = (keys %notrans_vars, keys %trans_vars,
3683                      keys %notrans_sect_vars, keys %trans_sect_vars);
3684   my @mans = sort @unsorted_deps;
3685   $output_vars .= file_contents ('mans-vars',
3686                                  new Automake::Location,
3687                                  MANS => "@mans");
3689   push (@all, '$(MANS)')
3690     unless option 'no-installman';
3693 # Handle DATA variables.
3694 sub handle_data
3696     &am_install_var ('-noextra', '-candist', 'data', 'DATA',
3697                      'data', 'dataroot', 'dvi', 'html', 'pdf', 'ps',
3698                      'sysconf', 'sharedstate', 'localstate',
3699                      'pkgdata', 'lisp', 'noinst', 'check');
3702 # Handle TAGS.
3703 sub handle_tags
3705     my @tag_deps = ();
3706     my @ctag_deps = ();
3707     if (var ('SUBDIRS'))
3708     {
3709         $output_rules .= ("tags-recursive:\n"
3710                           . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
3711                           # Never fail here if a subdir fails; it
3712                           # isn't important.
3713                           . "\t  test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir"
3714                           . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n"
3715                           . "\tdone\n");
3716         push (@tag_deps, 'tags-recursive');
3717         &depend ('.PHONY', 'tags-recursive');
3718         &depend ('.MAKE', 'tags-recursive');
3720         $output_rules .= ("ctags-recursive:\n"
3721                           . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
3722                           # Never fail here if a subdir fails; it
3723                           # isn't important.
3724                           . "\t  test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir"
3725                           . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n"
3726                           . "\tdone\n");
3727         push (@ctag_deps, 'ctags-recursive');
3728         &depend ('.PHONY', 'ctags-recursive');
3729         &depend ('.MAKE', 'ctags-recursive');
3730     }
3732     if (&saw_sources_p (1)
3733         || var ('ETAGS_ARGS')
3734         || @tag_deps)
3735     {
3736         my @config;
3737         foreach my $spec (@config_headers)
3738         {
3739             my ($out, @ins) = split_config_file_spec ($spec);
3740             foreach my $in (@ins)
3741               {
3742                 # If the config header source is in this directory,
3743                 # require it.
3744                 push @config, basename ($in)
3745                   if $relative_dir eq dirname ($in);
3746               }
3747         }
3748         $output_rules .= &file_contents ('tags',
3749                                          new Automake::Location,
3750                                          CONFIG    => "@config",
3751                                          TAGSDIRS  => "@tag_deps",
3752                                          CTAGSDIRS => "@ctag_deps");
3754         set_seen 'TAGS_DEPENDENCIES';
3755     }
3756     elsif (reject_var ('TAGS_DEPENDENCIES',
3757                        "doesn't make sense to define `TAGS_DEPENDENCIES'"
3758                        . "without\nsources or `ETAGS_ARGS'"))
3759     {
3760     }
3761     else
3762     {
3763         # Every Makefile must define some sort of TAGS rule.
3764         # Otherwise, it would be possible for a top-level "make TAGS"
3765         # to fail because some subdirectory failed.
3766         $output_rules .= "tags: TAGS\nTAGS:\n\n";
3767         # Ditto ctags.
3768         $output_rules .= "ctags: CTAGS\nCTAGS:\n\n";
3769     }
3772 # Handle multilib support.
3773 sub handle_multilib
3775   if ($seen_multilib && $relative_dir eq '.')
3776     {
3777       $output_rules .= &file_contents ('multilib', new Automake::Location);
3778       push (@all, 'all-multi');
3779     }
3783 # user_phony_rule ($NAME)
3784 # -----------------------
3785 # Return false if rule $NAME does not exist.  Otherwise,
3786 # declare it as phony, complete its definition (in case it is
3787 # conditional), and return its Automake::Rule instance.
3788 sub user_phony_rule ($)
3790   my ($name) = @_;
3791   my $rule = rule $name;
3792   if ($rule)
3793     {
3794       depend ('.PHONY', $name);
3795       # Define $NAME in all condition where it is not already defined,
3796       # so that it is always OK to depend on $NAME.
3797       for my $c ($rule->not_always_defined_in_cond (TRUE)->conds)
3798         {
3799           Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE,
3800                                   $c, INTERNAL);
3801           $output_rules .= $c->subst_string . "$name:\n";
3802         }
3803     }
3804   return $rule;
3808 # $BOOLEAN
3809 # &for_dist_common ($A, $B)
3810 # -------------------------
3811 # Subroutine for &handle_dist: sort files to dist.
3813 # We put README first because it then becomes easier to make a
3814 # Usenet-compliant shar file (in these, README must be first).
3816 # FIXME: do more ordering of files here.
3817 sub for_dist_common
3819     return 0
3820         if $a eq $b;
3821     return -1
3822         if $a eq 'README';
3823     return 1
3824         if $b eq 'README';
3825     return $a cmp $b;
3828 # handle_dist
3829 # -----------
3830 # Handle 'dist' target.
3831 sub handle_dist ()
3833   # Substitutions for distdir.am
3834   my %transform;
3836   # Define DIST_SUBDIRS.  This must always be done, regardless of the
3837   # no-dist setting: target like `distclean' or `maintainer-clean' use it.
3838   my $subdirs = var ('SUBDIRS');
3839   if ($subdirs)
3840     {
3841       # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS
3842       # to all possible directories, and use it.  If DIST_SUBDIRS is
3843       # defined, just use it.
3845       # Note that we check DIST_SUBDIRS first on purpose, so that
3846       # we don't call has_conditional_contents for now reason.
3847       # (In the past one project used so many conditional subdirectories
3848       # that calling has_conditional_contents on SUBDIRS caused
3849       # automake to grow to 150Mb -- this should not happen with
3850       # the current implementation of has_conditional_contents,
3851       # but it's more efficient to avoid the call anyway.)
3852       if (var ('DIST_SUBDIRS'))
3853         {
3854         }
3855       elsif ($subdirs->has_conditional_contents)
3856         {
3857           define_pretty_variable
3858             ('DIST_SUBDIRS', TRUE, INTERNAL,
3859              uniq ($subdirs->value_as_list_recursive));
3860         }
3861       else
3862         {
3863           # We always define this because that is what `distclean'
3864           # wants.
3865           define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL,
3866                                   '$(SUBDIRS)');
3867         }
3868     }
3870   # The remaining definitions are only required when a dist target is used.
3871   return if option 'no-dist';
3873   # At least one of the archive formats must be enabled.
3874   if ($relative_dir eq '.')
3875     {
3876       my $archive_defined = option 'no-dist-gzip' ? 0 : 1;
3877       $archive_defined ||=
3878         grep { option "dist-$_" } qw(shar zip tarZ bzip2 lzma xz);
3879       error (option 'no-dist-gzip',
3880              "no-dist-gzip specified but no dist-* specified, "
3881              . "at least one archive format must be enabled")
3882         unless $archive_defined;
3883     }
3885   # Look for common files that should be included in distribution.
3886   # If the aux dir is set, and it does not have a Makefile.am, then
3887   # we check for these files there as well.
3888   my $check_aux = 0;
3889   if ($relative_dir eq '.'
3890       && $config_aux_dir_set_in_configure_ac)
3891     {
3892       if (! &is_make_dir ($config_aux_dir))
3893         {
3894           $check_aux = 1;
3895         }
3896     }
3897   foreach my $cfile (@common_files)
3898     {
3899       if (dir_has_case_matching_file ($relative_dir, $cfile)
3900           # The file might be absent, but if it can be built it's ok.
3901           || rule $cfile)
3902         {
3903           &push_dist_common ($cfile);
3904         }
3906       # Don't use `elsif' here because a file might meaningfully
3907       # appear in both directories.
3908       if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile))
3909         {
3910           &push_dist_common ("$config_aux_dir/$cfile")
3911         }
3912     }
3914   # We might copy elements from $configure_dist_common to
3915   # %dist_common if we think we need to.  If the file appears in our
3916   # directory, we would have discovered it already, so we don't
3917   # check that.  But if the file is in a subdir without a Makefile,
3918   # we want to distribute it here if we are doing `.'.  Ugly!
3919   if ($relative_dir eq '.')
3920     {
3921       foreach my $file (split (' ' , $configure_dist_common))
3922         {
3923           push_dist_common ($file)
3924             unless is_make_dir (dirname ($file));
3925         }
3926     }
3928   # Files to distributed.  Don't use ->value_as_list_recursive
3929   # as it recursively expands `$(dist_pkgdata_DATA)' etc.
3930   my @dist_common = split (' ', rvar ('DIST_COMMON')->variable_value);
3931   @dist_common = uniq (sort for_dist_common (@dist_common));
3932   variable_delete 'DIST_COMMON';
3933   define_pretty_variable ('DIST_COMMON', TRUE, INTERNAL, @dist_common);
3935   # Now that we've processed DIST_COMMON, disallow further attempts
3936   # to set it.
3937   $handle_dist_run = 1;
3939   # Scan EXTRA_DIST to see if we need to distribute anything from a
3940   # subdir.  If so, add it to the list.  I didn't want to do this
3941   # originally, but there were so many requests that I finally
3942   # relented.
3943   my $extra_dist = var ('EXTRA_DIST');
3945   $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook';
3946   $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external;
3948   # If the target `dist-hook' exists, make sure it is run.  This
3949   # allows users to do random weird things to the distribution
3950   # before it is packaged up.
3951   push (@dist_targets, 'dist-hook')
3952     if user_phony_rule 'dist-hook';
3953   $transform{'DIST-TARGETS'} = join (' ', @dist_targets);
3955   my $flm = option ('filename-length-max');
3956   my $filename_filter = $flm ? '.' x $flm->[1] : '';
3958   $output_rules .= &file_contents ('distdir',
3959                                    new Automake::Location,
3960                                    %transform,
3961                                    FILENAME_FILTER => $filename_filter);
3965 # check_directory ($NAME, $WHERE)
3966 # -------------------------------
3967 # Ensure $NAME is a directory, and that it uses a sane name.
3968 # Use $WHERE as a location in the diagnostic, if any.
3969 sub check_directory ($$)
3971   my ($dir, $where) = @_;
3973   error $where, "required directory $relative_dir/$dir does not exist"
3974     unless -d "$relative_dir/$dir";
3976   # If an `obj/' directory exists, BSD make will enter it before
3977   # reading `Makefile'.  Hence the `Makefile' in the current directory
3978   # will not be read.
3979   #
3980   #  % cat Makefile
3981   #  all:
3982   #          echo Hello
3983   #  % cat obj/Makefile
3984   #  all:
3985   #          echo World
3986   #  % make      # GNU make
3987   #  echo Hello
3988   #  Hello
3989   #  % pmake     # BSD make
3990   #  echo World
3991   #  World
3992   msg ('portability', $where,
3993        "naming a subdirectory `obj' causes troubles with BSD make")
3994     if $dir eq 'obj';
3996   # `aux' is probably the most important of the following forbidden name,
3997   # since it's tempting to use it as an AC_CONFIG_AUX_DIR.
3998   msg ('portability', $where,
3999        "name `$dir' is reserved on W32 and DOS platforms")
4000     if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/);
4003 # check_directories_in_var ($VARIABLE)
4004 # ------------------------------------
4005 # Recursively check all items in variables $VARIABLE as directories
4006 sub check_directories_in_var ($)
4008   my ($var) = @_;
4009   $var->traverse_recursively
4010     (sub
4011      {
4012        my ($var, $val, $cond, $full_cond) = @_;
4013        check_directory ($val, $var->rdef ($cond)->location);
4014        return ();
4015      },
4016      undef,
4017      skip_ac_subst => 1);
4020 # &handle_subdirs ()
4021 # ------------------
4022 # Handle subdirectories.
4023 sub handle_subdirs ()
4025   my $subdirs = var ('SUBDIRS');
4026   return
4027     unless $subdirs;
4029   check_directories_in_var $subdirs;
4031   my $dsubdirs = var ('DIST_SUBDIRS');
4032   check_directories_in_var $dsubdirs
4033     if $dsubdirs;
4035   $output_rules .= &file_contents ('subdirs', new Automake::Location);
4036   rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross!
4040 # ($REGEN, @DEPENDENCIES)
4041 # &scan_aclocal_m4
4042 # ----------------
4043 # If aclocal.m4 creation is automated, return the list of its dependencies.
4044 sub scan_aclocal_m4 ()
4046   my $regen_aclocal = 0;
4048   set_seen 'CONFIG_STATUS_DEPENDENCIES';
4049   set_seen 'CONFIGURE_DEPENDENCIES';
4051   if (-f 'aclocal.m4')
4052     {
4053       &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL);
4055       my $aclocal = new Automake::XFile "< aclocal.m4";
4056       my $line = $aclocal->getline;
4057       $regen_aclocal = $line =~ 'generated automatically by aclocal';
4058     }
4060   my @ac_deps = ();
4062   if (set_seen ('ACLOCAL_M4_SOURCES'))
4063     {
4064       push (@ac_deps, '$(ACLOCAL_M4_SOURCES)');
4065       msg_var ('obsolete', 'ACLOCAL_M4_SOURCES',
4066                "`ACLOCAL_M4_SOURCES' is obsolete.\n"
4067                . "It should be safe to simply remove it.");
4068     }
4070   # Note that it might be possible that aclocal.m4 doesn't exist but
4071   # should be auto-generated.  This case probably isn't very
4072   # important.
4074   return ($regen_aclocal, @ac_deps);
4078 # Helper function for substitute_ac_subst_variables.
4079 sub substitute_ac_subst_variables_worker($)
4081   my ($token) = @_;
4082   return "\@$token\@" if var $token;
4083   return "\${$token\}";
4086 # substitute_ac_subst_variables ($TEXT)
4087 # -------------------------------------
4088 # Replace any occurrence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST
4089 # variable.
4090 sub substitute_ac_subst_variables ($)
4092   my ($text) = @_;
4093   $text =~ s/\${([^ \t=:+{}]+)}/&substitute_ac_subst_variables_worker ($1)/ge;
4094   return $text;
4097 # @DEPENDENCIES
4098 # &prepend_srcdir (@INPUTS)
4099 # -------------------------
4100 # Prepend $(srcdir) or $(top_srcdir) to all @INPUTS.  The idea is that
4101 # if an input file has a directory part the same as the current
4102 # directory, then the directory part is simply replaced by $(srcdir).
4103 # But if the directory part is different, then $(top_srcdir) is
4104 # prepended.
4105 sub prepend_srcdir (@)
4107   my (@inputs) = @_;
4108   my @newinputs;
4110   foreach my $single (@inputs)
4111     {
4112       if (dirname ($single) eq $relative_dir)
4113         {
4114           push (@newinputs, '$(srcdir)/' . basename ($single));
4115         }
4116       else
4117         {
4118           push (@newinputs, '$(top_srcdir)/' . $single);
4119         }
4120     }
4121   return @newinputs;
4124 # @DEPENDENCIES
4125 # rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS)
4126 # ---------------------------------------------------
4127 # Compute a list of dependencies appropriate for the rebuild
4128 # rule of
4129 #   AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...)
4130 # Also distribute $INPUTs which are not built by another AC_CONFIG_FOOS.
4131 sub rewrite_inputs_into_dependencies ($@)
4133   my ($file, @inputs) = @_;
4134   my @res = ();
4136   for my $i (@inputs)
4137     {
4138       # We cannot create dependencies on shell variables.
4139       next if (substitute_ac_subst_variables $i) =~ /\$/;
4141       if (exists $ac_config_files_location{$i} && $i ne $file)
4142         {
4143           my $di = dirname $i;
4144           if ($di eq $relative_dir)
4145             {
4146               $i = basename $i;
4147             }
4148           # In the top-level Makefile we do not use $(top_builddir), because
4149           # we are already there, and since the targets are built without
4150           # a $(top_builddir), it helps BSD Make to match them with
4151           # dependencies.
4152           elsif ($relative_dir ne '.')
4153             {
4154               $i = '$(top_builddir)/' . $i;
4155             }
4156         }
4157       else
4158         {
4159           msg ('error', $ac_config_files_location{$file},
4160                "required file `$i' not found")
4161             unless $i =~ /\$/ || exists $output_files{$i} || -f $i;
4162           ($i) = prepend_srcdir ($i);
4163           push_dist_common ($i);
4164         }
4165       push @res, $i;
4166     }
4167   return @res;
4172 # &handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS)
4173 # ------------------------------------------------------------------
4174 # Handle remaking and configure stuff.
4175 # We need the name of the input file, to do proper remaking rules.
4176 sub handle_configure ($$$@)
4178   my ($makefile_am, $makefile_in, $makefile, @inputs) = @_;
4180   prog_error 'empty @inputs'
4181     unless @inputs;
4183   my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am,
4184                                                             $makefile_in);
4185   my $rel_makefile = basename $makefile;
4187   my $colon_infile = ':' . join (':', @inputs);
4188   $colon_infile = '' if $colon_infile eq ":$makefile.in";
4189   my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs);
4190   my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4;
4191   define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL,
4192                           @configure_deps, @aclocal_m4_deps,
4193                           '$(top_srcdir)/' . $configure_ac);
4194   my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)');
4195   push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4';
4196   define_pretty_variable ('am__configure_deps', TRUE, INTERNAL,
4197                           @configuredeps);
4199   my $automake_options = '--' . (global_option 'cygnus' ? 'cygnus' : $strictness_name)
4200                          . (global_option 'no-dependencies' ? ' --ignore-deps' : '')
4201                          . (global_option 'silent-rules' ? ' --silent-rules' : '');
4203   $output_rules .= file_contents
4204     ('configure',
4205      new Automake::Location,
4206      MAKEFILE              => $rel_makefile,
4207      'MAKEFILE-DEPS'       => "@rewritten",
4208      'CONFIG-MAKEFILE'     => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@',
4209      'MAKEFILE-IN'         => $rel_makefile_in,
4210      'MAKEFILE-IN-DEPS'    => "@include_stack",
4211      'MAKEFILE-AM'         => $rel_makefile_am,
4212      'AUTOMAKE-OPTIONS'    => $automake_options,
4213      'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile",
4214      'REGEN-ACLOCAL-M4'    => $regen_aclocal_m4,
4215      VERBOSE               => verbose_flag ('GEN'));
4217   if ($relative_dir eq '.')
4218     {
4219       &push_dist_common ('acconfig.h')
4220         if -f 'acconfig.h';
4221     }
4223   # If we have a configure header, require it.
4224   my $hdr_index = 0;
4225   my @distclean_config;
4226   foreach my $spec (@config_headers)
4227     {
4228       $hdr_index += 1;
4229       # $CONFIG_H_PATH: config.h from top level.
4230       my ($config_h_path, @ins) = split_config_file_spec ($spec);
4231       my $config_h_dir = dirname ($config_h_path);
4233       # If the header is in the current directory we want to build
4234       # the header here.  Otherwise, if we're at the topmost
4235       # directory and the header's directory doesn't have a
4236       # Makefile, then we also want to build the header.
4237       if ($relative_dir eq $config_h_dir
4238           || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir)))
4239         {
4240           my ($cn_sans_dir, $stamp_dir);
4241           if ($relative_dir eq $config_h_dir)
4242             {
4243               $cn_sans_dir = basename ($config_h_path);
4244               $stamp_dir = '';
4245             }
4246           else
4247             {
4248               $cn_sans_dir = $config_h_path;
4249               if ($config_h_dir eq '.')
4250                 {
4251                   $stamp_dir = '';
4252                 }
4253               else
4254                 {
4255                   $stamp_dir = $config_h_dir . '/';
4256                 }
4257             }
4259           # This will also distribute all inputs.
4260           @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins);
4262           # Cannot define rebuild rules for filenames with shell variables.
4263           next if (substitute_ac_subst_variables $config_h_path) =~ /\$/;
4265           # Header defined in this directory.
4266           my @files;
4267           if (-f $config_h_path . '.top')
4268             {
4269               push (@files, "$cn_sans_dir.top");
4270             }
4271           if (-f $config_h_path . '.bot')
4272             {
4273               push (@files, "$cn_sans_dir.bot");
4274             }
4276           push_dist_common (@files);
4278           # For now, acconfig.h can only appear in the top srcdir.
4279           if (-f 'acconfig.h')
4280             {
4281               push (@files, '$(top_srcdir)/acconfig.h');
4282             }
4284           my $stamp = "${stamp_dir}stamp-h${hdr_index}";
4285           $output_rules .=
4286             file_contents ('remake-hdr',
4287                            new Automake::Location,
4288                            FILES            => "@files",
4289                            CONFIG_H         => $cn_sans_dir,
4290                            CONFIG_HIN       => $ins[0],
4291                            CONFIG_H_DEPS    => "@ins",
4292                            CONFIG_H_PATH    => $config_h_path,
4293                            STAMP            => "$stamp");
4295           push @distclean_config, $cn_sans_dir, $stamp;
4296         }
4297     }
4299   $output_rules .= file_contents ('clean-hdr',
4300                                   new Automake::Location,
4301                                   FILES => "@distclean_config")
4302     if @distclean_config;
4304   # Distribute and define mkinstalldirs only if it is already present
4305   # in the package, for backward compatibility (some people may still
4306   # use $(mkinstalldirs)).
4307   my $mkidpath = "$config_aux_dir/mkinstalldirs";
4308   if (-f $mkidpath)
4309     {
4310       # Use require_file so that any existing script gets updated
4311       # by --force-missing.
4312       require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs');
4313       define_variable ('mkinstalldirs',
4314                        "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL);
4315     }
4316   else
4317     {
4318       # Use $(install_sh), not $(MKDIR_P) because the latter requires
4319       # at least one argument, and $(mkinstalldirs) used to work
4320       # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)).
4321       define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL);
4322     }
4324   reject_var ('CONFIG_HEADER',
4325               "`CONFIG_HEADER' is an anachronism; now determined "
4326               . "automatically\nfrom `$configure_ac'");
4328   my @config_h;
4329   foreach my $spec (@config_headers)
4330     {
4331       my ($out, @ins) = split_config_file_spec ($spec);
4332       # Generate CONFIG_HEADER define.
4333       if ($relative_dir eq dirname ($out))
4334         {
4335           push @config_h, basename ($out);
4336         }
4337       else
4338         {
4339           push @config_h, "\$(top_builddir)/$out";
4340         }
4341     }
4342   define_variable ("CONFIG_HEADER", "@config_h", INTERNAL)
4343     if @config_h;
4345   # Now look for other files in this directory which must be remade
4346   # by config.status, and generate rules for them.
4347   my @actual_other_files = ();
4348   # These get cleaned only in a VPATH build.
4349   my @actual_other_vpath_files = ();
4350   foreach my $lfile (@other_input_files)
4351     {
4352       my $file;
4353       my @inputs;
4354       if ($lfile =~ /^([^:]*):(.*)$/)
4355         {
4356           # This is the ":" syntax of AC_OUTPUT.
4357           $file = $1;
4358           @inputs = split (':', $2);
4359         }
4360       else
4361         {
4362           # Normal usage.
4363           $file = $lfile;
4364           @inputs = $file . '.in';
4365         }
4367       # Automake files should not be stored in here, but in %MAKE_LIST.
4368       prog_error ("$lfile in \@other_input_files\n"
4369                   . "\@other_input_files = (@other_input_files)")
4370         if -f $file . '.am';
4372       my $local = basename ($file);
4374       # We skip files that aren't in this directory.  However, if
4375       # the file's directory does not have a Makefile, and we are
4376       # currently doing `.', then we create a rule to rebuild the
4377       # file in the subdir.
4378       my $fd = dirname ($file);
4379       if ($fd ne $relative_dir)
4380         {
4381           if ($relative_dir eq '.' && ! &is_make_dir ($fd))
4382             {
4383               $local = $file;
4384             }
4385           else
4386             {
4387               next;
4388             }
4389         }
4391       my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs);
4393       # Cannot output rules for shell variables.
4394       next if (substitute_ac_subst_variables $local) =~ /\$/;
4396       my $condstr = '';
4397       my $cond = $ac_config_files_condition{$lfile};
4398       if (defined $cond)
4399         {
4400           $condstr = $cond->subst_string;
4401           Automake::Rule::define ($local, $configure_ac, RULE_AUTOMAKE, $cond,
4402                                   $ac_config_files_location{$file});
4403         }
4404       $output_rules .= ($condstr . $local . ': '
4405                         . '$(top_builddir)/config.status '
4406                         . "@rewritten_inputs\n"
4407                         . $condstr . "\t"
4408                         . 'cd $(top_builddir) && '
4409                         . '$(SHELL) ./config.status '
4410                         . ($relative_dir eq '.' ? '' : '$(subdir)/')
4411                         . '$@'
4412                         . "\n");
4413       push (@actual_other_files, $local);
4414     }
4416   # For links we should clean destinations and distribute sources.
4417   foreach my $spec (@config_links)
4418     {
4419       my ($link, $file) = split /:/, $spec;
4420       # Some people do AC_CONFIG_LINKS($computed).  We only handle
4421       # the DEST:SRC form.
4422       next unless $file;
4423       my $where = $ac_config_files_location{$link};
4425       # Skip destinations that contain shell variables.
4426       if ((substitute_ac_subst_variables $link) !~ /\$/)
4427         {
4428           # We skip links that aren't in this directory.  However, if
4429           # the link's directory does not have a Makefile, and we are
4430           # currently doing `.', then we add the link to CONFIG_CLEAN_FILES
4431           # in `.'s Makefile.in.
4432           my $local = basename ($link);
4433           my $fd = dirname ($link);
4434           if ($fd ne $relative_dir)
4435             {
4436               if ($relative_dir eq '.' && ! &is_make_dir ($fd))
4437                 {
4438                   $local = $link;
4439                 }
4440               else
4441                 {
4442                   $local = undef;
4443                 }
4444             }
4445           if ($file ne $link)
4446             {
4447               push @actual_other_files, $local if $local;
4448             }
4449           else
4450             {
4451               push @actual_other_vpath_files, $local if $local;
4452             }
4453         }
4455       # Do not process sources that contain shell variables.
4456       if ((substitute_ac_subst_variables $file) !~ /\$/)
4457         {
4458           my $fd = dirname ($file);
4460           # We distribute files that are in this directory.
4461           # At the top-level (`.') we also distribute files whose
4462           # directory does not have a Makefile.
4463           if (($fd eq $relative_dir)
4464               || ($relative_dir eq '.' && ! &is_make_dir ($fd)))
4465             {
4466               # The following will distribute $file as a side-effect when
4467               # it is appropriate (i.e., when $file is not already an output).
4468               # We do not need the result, just the side-effect.
4469               rewrite_inputs_into_dependencies ($link, $file);
4470             }
4471         }
4472     }
4474   # These files get removed by "make distclean".
4475   define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL,
4476                           @actual_other_files);
4477   define_pretty_variable ('CONFIG_CLEAN_VPATH_FILES', TRUE, INTERNAL,
4478                           @actual_other_vpath_files);
4481 # Handle C headers.
4482 sub handle_headers
4484     my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include',
4485                              'oldinclude', 'pkginclude',
4486                              'noinst', 'check');
4487     foreach (@r)
4488     {
4489       next unless $_->[1] =~ /\..*$/;
4490       &saw_extension ($&);
4491     }
4494 sub handle_gettext
4496   return if ! $seen_gettext || $relative_dir ne '.';
4498   my $subdirs = var 'SUBDIRS';
4500   if (! $subdirs)
4501     {
4502       err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined";
4503       return;
4504     }
4506   # Perform some sanity checks to help users get the right setup.
4507   # We disable these tests when po/ doesn't exist in order not to disallow
4508   # unusual gettext setups.
4509   #
4510   # Bruno Haible:
4511   # | The idea is:
4512   # |
4513   # |  1) If a package doesn't have a directory po/ at top level, it
4514   # |     will likely have multiple po/ directories in subpackages.
4515   # |
4516   # |  2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT
4517   # |     is used without 'external'. It is also useful to warn for the
4518   # |     presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both
4519   # |     warnings apply only to the usual layout of packages, therefore
4520   # |     they should both be disabled if no po/ directory is found at
4521   # |     top level.
4523   if (-d 'po')
4524     {
4525       my @subdirs = $subdirs->value_as_list_recursive;
4527       msg_var ('syntax', $subdirs,
4528                "AM_GNU_GETTEXT used but `po' not in SUBDIRS")
4529         if ! grep ($_ eq 'po', @subdirs);
4531       # intl/ is not required when AM_GNU_GETTEXT is called with the
4532       # `external' option and AM_GNU_GETTEXT_INTL_SUBDIR is not called.
4533       msg_var ('syntax', $subdirs,
4534                "AM_GNU_GETTEXT used but `intl' not in SUBDIRS")
4535         if (! ($seen_gettext_external && ! $seen_gettext_intl)
4536             && ! grep ($_ eq 'intl', @subdirs));
4538       # intl/ should not be used with AM_GNU_GETTEXT([external]), except
4539       # if AM_GNU_GETTEXT_INTL_SUBDIR is called.
4540       msg_var ('syntax', $subdirs,
4541                "`intl' should not be in SUBDIRS when "
4542                . "AM_GNU_GETTEXT([external]) is used")
4543         if ($seen_gettext_external && ! $seen_gettext_intl
4544             && grep ($_ eq 'intl', @subdirs));
4545     }
4547   require_file ($ac_gettext_location, GNU, 'ABOUT-NLS');
4550 # Handle footer elements.
4551 sub handle_footer
4553     reject_rule ('.SUFFIXES',
4554                  "use variable `SUFFIXES', not target `.SUFFIXES'");
4556     # Note: AIX 4.1 /bin/make will fail if any suffix rule appears
4557     # before .SUFFIXES.  So we make sure that .SUFFIXES appears before
4558     # anything else, by sticking it right after the default: target.
4559     $output_header .= ".SUFFIXES:\n";
4560     my $suffixes = var 'SUFFIXES';
4561     my @suffixes = Automake::Rule::suffixes;
4562     if (@suffixes || $suffixes)
4563     {
4564         # Make sure SUFFIXES has unique elements.  Sort them to ensure
4565         # the output remains consistent.  However, $(SUFFIXES) is
4566         # always at the start of the list, unsorted.  This is done
4567         # because make will choose rules depending on the ordering of
4568         # suffixes, and this lets the user have some control.  Push
4569         # actual suffixes, and not $(SUFFIXES).  Some versions of make
4570         # do not like variable substitutions on the .SUFFIXES line.
4571         my @user_suffixes = ($suffixes
4572                              ? $suffixes->value_as_list_recursive : ());
4574         my %suffixes = map { $_ => 1 } @suffixes;
4575         delete @suffixes{@user_suffixes};
4577         $output_header .= (".SUFFIXES: "
4578                            . join (' ', @user_suffixes, sort keys %suffixes)
4579                            . "\n");
4580     }
4582     $output_trailer .= file_contents ('footer', new Automake::Location);
4586 # Generate `make install' rules.
4587 sub handle_install ()
4589   $output_rules .= &file_contents
4590     ('install',
4591      new Automake::Location,
4592      maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES')
4593                              ? (" \$(BUILT_SOURCES)\n"
4594                                 . "\t\$(MAKE) \$(AM_MAKEFLAGS)")
4595                              : ''),
4596      'installdirs-local' => (user_phony_rule 'installdirs-local'
4597                              ? ' installdirs-local' : ''),
4598      am__installdirs => variable_value ('am__installdirs') || '');
4602 # Deal with all and all-am.
4603 sub handle_all ($)
4605     my ($makefile) = @_;
4607     # Output `all-am'.
4609     # Put this at the beginning for the sake of non-GNU makes.  This
4610     # is still wrong if these makes can run parallel jobs.  But it is
4611     # right enough.
4612     unshift (@all, basename ($makefile));
4614     foreach my $spec (@config_headers)
4615       {
4616         my ($out, @ins) = split_config_file_spec ($spec);
4617         push (@all, basename ($out))
4618           if dirname ($out) eq $relative_dir;
4619       }
4621     # Install `all' hooks.
4622     push (@all, "all-local")
4623       if user_phony_rule "all-local";
4625     &pretty_print_rule ("all-am:", "\t\t", @all);
4626     &depend ('.PHONY', 'all-am', 'all');
4629     # Output `all'.
4631     my @local_headers = ();
4632     push @local_headers, '$(BUILT_SOURCES)'
4633       if var ('BUILT_SOURCES');
4634     foreach my $spec (@config_headers)
4635       {
4636         my ($out, @ins) = split_config_file_spec ($spec);
4637         push @local_headers, basename ($out)
4638           if dirname ($out) eq $relative_dir;
4639       }
4641     if (@local_headers)
4642       {
4643         # We need to make sure config.h is built before we recurse.
4644         # We also want to make sure that built sources are built
4645         # before any ordinary `all' targets are run.  We can't do this
4646         # by changing the order of dependencies to the "all" because
4647         # that breaks when using parallel makes.  Instead we handle
4648         # things explicitly.
4649         $output_all .= ("all: @local_headers"
4650                         . "\n\t"
4651                         . '$(MAKE) $(AM_MAKEFLAGS) '
4652                         . (var ('SUBDIRS') ? 'all-recursive' : 'all-am')
4653                         . "\n\n");
4654         depend ('.MAKE', 'all');
4655       }
4656     else
4657       {
4658         $output_all .= "all: " . (var ('SUBDIRS')
4659                                   ? 'all-recursive' : 'all-am') . "\n\n";
4660       }
4664 # &do_check_merge_target ()
4665 # -------------------------
4666 # Handle check merge target specially.
4667 sub do_check_merge_target ()
4669   # Include user-defined local form of target.
4670   push @check_tests, 'check-local'
4671     if user_phony_rule 'check-local';
4673   # In --cygnus mode, check doesn't depend on all.
4674   if (option 'cygnus')
4675     {
4676       # Just run the local check rules.
4677       pretty_print_rule ('check-am:', "\t\t", @check);
4678     }
4679   else
4680     {
4681       # The check target must depend on the local equivalent of
4682       # `all', to ensure all the primary targets are built.  Then it
4683       # must build the local check rules.
4684       $output_rules .= "check-am: all-am\n";
4685       if (@check)
4686         {
4687           pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4688                              @check);
4689           depend ('.MAKE', 'check-am');
4690         }
4691     }
4692   if (@check_tests)
4693     {
4694       pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4695                          @check_tests);
4696       depend ('.MAKE', 'check-am');
4697     }
4699   depend '.PHONY', 'check', 'check-am';
4700   # Handle recursion.  We have to honor BUILT_SOURCES like for `all:'.
4701   $output_rules .= ("check: "
4702                     . (var ('BUILT_SOURCES')
4703                        ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) "
4704                        : '')
4705                     . (var ('SUBDIRS') ? 'check-recursive' : 'check-am')
4706                     . "\n");
4707   depend ('.MAKE', 'check')
4708     if var ('BUILT_SOURCES');
4711 # handle_clean ($MAKEFILE)
4712 # ------------------------
4713 # Handle all 'clean' targets.
4714 sub handle_clean ($)
4716   my ($makefile) = @_;
4718   # Clean the files listed in user variables if they exist.
4719   $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN
4720     if var ('MOSTLYCLEANFILES');
4721   $clean_files{'$(CLEANFILES)'} = CLEAN
4722     if var ('CLEANFILES');
4723   $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN
4724     if var ('DISTCLEANFILES');
4725   $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN
4726     if var ('MAINTAINERCLEANFILES');
4728   # Built sources are automatically removed by maintainer-clean.
4729   $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN
4730     if var ('BUILT_SOURCES');
4732   # Compute a list of "rm"s to run for each target.
4733   my %rms = (MOSTLY_CLEAN, [],
4734              CLEAN, [],
4735              DIST_CLEAN, [],
4736              MAINTAINER_CLEAN, []);
4738   foreach my $file (keys %clean_files)
4739     {
4740       my $when = $clean_files{$file};
4741       prog_error 'invalid entry in %clean_files'
4742         unless exists $rms{$when};
4744       my $rm = "rm -f $file";
4745       # If file is a variable, make sure when don't call `rm -f' without args.
4746       $rm ="test -z \"$file\" || $rm"
4747         if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/);
4749       push @{$rms{$when}}, "\t-$rm\n";
4750     }
4752   $output_rules .= &file_contents
4753     ('clean',
4754      new Automake::Location,
4755      MOSTLYCLEAN_RMS      => join ('', sort @{$rms{&MOSTLY_CLEAN}}),
4756      CLEAN_RMS            => join ('', sort @{$rms{&CLEAN}}),
4757      DISTCLEAN_RMS        => join ('', sort @{$rms{&DIST_CLEAN}}),
4758      MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}),
4759      MAKEFILE             => basename $makefile,
4760      );
4764 # &target_cmp ($A, $B)
4765 # --------------------
4766 # Subroutine for &handle_factored_dependencies to let `.PHONY' and
4767 # other `.TARGETS' be last.
4768 sub target_cmp
4770   return 0 if $a eq $b;
4772   my $a1 = substr ($a, 0, 1);
4773   my $b1 = substr ($b, 0, 1);
4774   if ($a1 ne $b1)
4775     {
4776       return -1 if $b1 eq '.';
4777       return 1 if $a1 eq '.';
4778     }
4779   return $a cmp $b;
4783 # &handle_factored_dependencies ()
4784 # --------------------------------
4785 # Handle everything related to gathered targets.
4786 sub handle_factored_dependencies
4788   # Reject bad hooks.
4789   foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook',
4790                      'uninstall-exec-local', 'uninstall-exec-hook',
4791                      'uninstall-dvi-local',
4792                      'uninstall-html-local',
4793                      'uninstall-info-local',
4794                      'uninstall-pdf-local',
4795                      'uninstall-ps-local')
4796     {
4797       my $x = $utarg;
4798       $x =~ s/-.*-/-/;
4799       reject_rule ($utarg, "use `$x', not `$utarg'");
4800     }
4802   reject_rule ('install-local',
4803                "use `install-data-local' or `install-exec-local', "
4804                . "not `install-local'");
4806   reject_rule ('install-hook',
4807                "use `install-data-hook' or `install-exec-hook', "
4808                . "not `install-hook'");
4810   # Install the -local hooks.
4811   foreach (keys %dependencies)
4812     {
4813       # Hooks are installed on the -am targets.
4814       s/-am$// or next;
4815       depend ("$_-am", "$_-local")
4816         if user_phony_rule "$_-local";
4817     }
4819   # Install the -hook hooks.
4820   # FIXME: Why not be as liberal as we are with -local hooks?
4821   foreach ('install-exec', 'install-data', 'uninstall')
4822     {
4823       if (user_phony_rule "$_-hook")
4824         {
4825           depend ('.MAKE', "$_-am");
4826           register_action("$_-am",
4827                           ("\t\@\$(NORMAL_INSTALL)\n"
4828                            . "\t\$(MAKE) \$(AM_MAKEFLAGS) $_-hook"));
4829         }
4830     }
4832   # All the required targets are phony.
4833   depend ('.PHONY', keys %required_targets);
4835   # Actually output gathered targets.
4836   foreach (sort target_cmp keys %dependencies)
4837     {
4838       # If there is nothing about this guy, skip it.
4839       next
4840         unless (@{$dependencies{$_}}
4841                 || $actions{$_}
4842                 || $required_targets{$_});
4844       # Define gathered targets in undefined conditions.
4845       # FIXME: Right now we must handle .PHONY as an exception,
4846       # because people write things like
4847       #    .PHONY: myphonytarget
4848       # to append dependencies.  This would not work if Automake
4849       # refrained from defining its own .PHONY target as it does
4850       # with other overridden targets.
4851       # Likewise for `.MAKE'.
4852       my @undefined_conds = (TRUE,);
4853       if ($_ ne '.PHONY' && $_ ne '.MAKE')
4854         {
4855           @undefined_conds =
4856             Automake::Rule::define ($_, 'internal',
4857                                     RULE_AUTOMAKE, TRUE, INTERNAL);
4858         }
4859       my @uniq_deps = uniq (sort @{$dependencies{$_}});
4860       foreach my $cond (@undefined_conds)
4861         {
4862           my $condstr = $cond->subst_string;
4863           &pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps);
4864           $output_rules .= $actions{$_} if defined $actions{$_};
4865           $output_rules .= "\n";
4866         }
4867     }
4871 # &handle_tests_dejagnu ()
4872 # ------------------------
4873 sub handle_tests_dejagnu
4875     push (@check_tests, 'check-DEJAGNU');
4876     $output_rules .= file_contents ('dejagnu', new Automake::Location);
4880 # Handle TESTS variable and other checks.
4881 sub handle_tests
4883   if (option 'dejagnu')
4884     {
4885       &handle_tests_dejagnu;
4886     }
4887   else
4888     {
4889       foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
4890         {
4891           reject_var ($c, "`$c' defined but `dejagnu' not in "
4892                       . "`AUTOMAKE_OPTIONS'");
4893         }
4894     }
4896   if (var ('TESTS'))
4897     {
4898       push (@check_tests, 'check-TESTS');
4899       $output_rules .= &file_contents ('check', new Automake::Location,
4900                                        COLOR => !! option 'color-tests',
4901                                        PARALLEL_TESTS => !! option 'parallel-tests');
4903       # Tests that are known programs should have $(EXEEXT) appended.
4904       # For matching purposes, we need to adjust XFAIL_TESTS as well.
4905       append_exeext { exists $known_programs{$_[0]} } 'TESTS';
4906       append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS'
4907         if (var ('XFAIL_TESTS'));
4909       if (option 'parallel-tests')
4910         {
4911           define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL);
4912           define_variable ('TEST_SUITE_HTML', '$(TEST_SUITE_LOG:.log=.html)', INTERNAL);
4913           my $suff = '.test';
4914           my $at_exeext = '';
4915           my $handle_exeext = exists $configure_vars{'EXEEXT'};
4916           if ($handle_exeext)
4917             {
4918               $at_exeext = subst ('EXEEXT');
4919               $suff = $at_exeext  . ' ' . $suff;
4920             }
4921           define_variable ('TEST_EXTENSIONS', $suff, INTERNAL);
4922           # FIXME: this mishandles conditions.
4923           my @test_suffixes = (var 'TEST_EXTENSIONS')->value_as_list_recursive;
4924           if ($handle_exeext)
4925             {
4926               unshift (@test_suffixes, $at_exeext)
4927                 unless $test_suffixes[0] eq $at_exeext;
4928             }
4929           unshift (@test_suffixes, '');
4931           transform_variable_recursively
4932             ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL,
4933               sub {
4934                 my ($subvar, $val, $cond, $full_cond) = @_;
4935                 my $obj = $val;
4936                 return $obj
4937                   if $val =~ /^\@.*\@$/;
4938                 $obj =~ s/\$\(EXEEXT\)$//o;
4940                 if ($val =~ /(\$\((top_)?srcdir\))\//o)
4941                   {
4942                     msg ('error', $subvar->rdef ($cond)->location,
4943                          "parallel-tests: using `$1' in TESTS is currently broken: `$val'");
4944                   }
4946                 foreach my $test_suffix (@test_suffixes)
4947                   {
4948                     next
4949                       if $test_suffix eq $at_exeext || $test_suffix eq '';
4950                     return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log'
4951                       if substr ($obj, - length ($test_suffix)) eq $test_suffix;
4952                   }
4953                 $obj .= '.log';
4954                 my $compile = 'LOG_COMPILE';
4955                 define_variable ($compile,
4956                                  '$(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)', INTERNAL);
4957                 $output_rules .= file_contents ('check2', new Automake::Location,
4958                                                 GENERIC => 0,
4959                                                 OBJ => $obj,
4960                                                 SOURCE => $val,
4961                                                 COMPILE =>'$(' . $compile . ')',
4962                                                 EXT => '',
4963                                                 am__EXEEXT => 'FALSE');
4964                 return $obj;
4965               });
4967           my $nhelper=1;
4968           my $prev = 'TESTS';
4969           my $post = '';
4970           my $last_suffix = $test_suffixes[$#test_suffixes];
4971           my $cur = '';
4972           foreach my $test_suffix (@test_suffixes)
4973             {
4974               if ($test_suffix eq $last_suffix)
4975                 {
4976                   $cur = 'TEST_LOGS';
4977                 }
4978               else
4979                 {
4980                   $cur = 'am__test_logs' . $nhelper;
4981                 }
4982               define_variable ($cur,
4983                 '$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL);
4984               $post = '.log';
4985               $prev = $cur;
4986               $nhelper++;
4987               if ($test_suffix ne $at_exeext && $test_suffix ne '')
4988                 {
4989                   (my $ext = $test_suffix) =~ s/^\.//;
4990                   $ext = uc $ext;
4991                   my $compile = $ext . '_LOG_COMPILE';
4992                   define_variable ($compile,
4993                                    '$(' . $ext . '_LOG_COMPILER) $(AM_' .  $ext . '_LOG_FLAGS)'
4994                                    . ' $(' . $ext . '_LOG_FLAGS)', INTERNAL);
4995                   my $am_exeext = $handle_exeext ? 'am__EXEEXT' : 'FALSE';
4996                   $output_rules .= file_contents ('check2', new Automake::Location,
4997                                                   GENERIC => 1,
4998                                                   OBJ => '',
4999                                                   SOURCE => '$<',
5000                                                   COMPILE => '$(' . $compile . ')',
5001                                                   EXT => $test_suffix,
5002                                                   am__EXEEXT => $am_exeext);
5003                 }
5004             }
5006           define_variable ('TEST_LOGS_TMP', '$(TEST_LOGS:.log=.log-t)', INTERNAL);
5008           $clean_files{'$(TEST_LOGS_TMP)'} = MOSTLY_CLEAN;
5009           $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN;
5010           $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN;
5011           $clean_files{'$(TEST_SUITE_HTML)'} = MOSTLY_CLEAN;
5012         }
5013     }
5016 # Handle Emacs Lisp.
5017 sub handle_emacs_lisp
5019   my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP',
5020                                  'lisp', 'noinst');
5022   return if ! @elfiles;
5024   define_pretty_variable ('am__ELFILES', TRUE, INTERNAL,
5025                           map { $_->[1] } @elfiles);
5026   define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL,
5027                           '$(am__ELFILES:.el=.elc)');
5028   # This one can be overridden by users.
5029   define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)');
5031   push @all, '$(ELCFILES)';
5033   require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
5034                      'EMACS', 'lispdir');
5035   require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp');
5036   &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL);
5039 # Handle Python
5040 sub handle_python
5042   my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON',
5043                                  'noinst');
5044   return if ! @pyfiles;
5046   require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
5047   require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
5048   &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
5051 # Handle Java.
5052 sub handle_java
5054     my @sourcelist = &am_install_var ('-candist',
5055                                       'java', 'JAVA',
5056                                       'java', 'noinst', 'check');
5057     return if ! @sourcelist;
5059     my @prefix = am_primary_prefixes ('JAVA', 1,
5060                                       'java', 'noinst', 'check');
5062     my $dir;
5063     foreach my $curs (@prefix)
5064       {
5065         next
5066           if $curs eq 'EXTRA';
5068         err_var "${curs}_JAVA", "multiple _JAVA primaries in use"
5069           if defined $dir;
5070         $dir = $curs;
5071       }
5074     push (@all, 'class' . $dir . '.stamp');
5078 # Handle some of the minor options.
5079 sub handle_minor_options
5081   if (option 'readme-alpha')
5082     {
5083       if ($relative_dir eq '.')
5084         {
5085           if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
5086             {
5087               msg ('error-gnits', $package_version_location,
5088                    "version `$package_version' doesn't follow " .
5089                    "Gnits standards");
5090             }
5091           if (defined $1 && -f 'README-alpha')
5092             {
5093               # This means we have an alpha release.  See
5094               # GNITS_VERSION_PATTERN for details.
5095               push_dist_common ('README-alpha');
5096             }
5097         }
5098     }
5101 ################################################################
5103 # ($OUTPUT, @INPUTS)
5104 # &split_config_file_spec ($SPEC)
5105 # -------------------------------
5106 # Decode the Autoconf syntax for config files (files, headers, links
5107 # etc.).
5108 sub split_config_file_spec ($)
5110   my ($spec) = @_;
5111   my ($output, @inputs) = split (/:/, $spec);
5113   push @inputs, "$output.in"
5114     unless @inputs;
5116   return ($output, @inputs);
5119 # $input
5120 # locate_am (@POSSIBLE_SOURCES)
5121 # -----------------------------
5122 # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in
5123 # This functions returns the first *.in file for which a *.am exists.
5124 # It returns undef otherwise.
5125 sub locate_am (@)
5127   my (@rest) = @_;
5128   my $input;
5129   foreach my $file (@rest)
5130     {
5131       if (($file =~ /^(.*)\.in$/) && -f "$1.am")
5132         {
5133           $input = $file;
5134           last;
5135         }
5136     }
5137   return $input;
5140 my %make_list;
5142 # &scan_autoconf_config_files ($WHERE, $CONFIG-FILES)
5143 # ---------------------------------------------------
5144 # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
5145 # (or AC_OUTPUT).
5146 sub scan_autoconf_config_files ($$)
5148   my ($where, $config_files) = @_;
5150   # Look at potential Makefile.am's.
5151   foreach (split ' ', $config_files)
5152     {
5153       # Must skip empty string for Perl 4.
5154       next if $_ eq "\\" || $_ eq '';
5156       # Handle $local:$input syntax.
5157       my ($local, @rest) = split (/:/);
5158       @rest = ("$local.in",) unless @rest;
5159       msg ('portability', $where,
5160           "Omit leading `./' from config file names such as `$local',"
5161           . "\nas not all make implementations treat `file' and `./file' equally.")
5162         if ($local =~ /^\.\//);
5163       my $input = locate_am @rest;
5164       if ($input)
5165         {
5166           # We have a file that automake should generate.
5167           $make_list{$input} = join (':', ($local, @rest));
5168         }
5169       else
5170         {
5171           # We have a file that automake should cause to be
5172           # rebuilt, but shouldn't generate itself.
5173           push (@other_input_files, $_);
5174         }
5175       $ac_config_files_location{$local} = $where;
5176       $ac_config_files_condition{$local} =
5177         new Automake::Condition (@cond_stack)
5178           if (@cond_stack);
5179     }
5183 # &scan_autoconf_traces ($FILENAME)
5184 # ---------------------------------
5185 sub scan_autoconf_traces ($)
5187   my ($filename) = @_;
5189   # Macros to trace, with their minimal number of arguments.
5190   #
5191   # IMPORTANT: If you add a macro here, you should also add this macro
5192   # =========  to Automake-preselection in autoconf/lib/autom4te.in.
5193   my %traced = (
5194                 AC_CANONICAL_BUILD => 0,
5195                 AC_CANONICAL_HOST => 0,
5196                 AC_CANONICAL_TARGET => 0,
5197                 AC_CONFIG_AUX_DIR => 1,
5198                 AC_CONFIG_FILES => 1,
5199                 AC_CONFIG_HEADERS => 1,
5200                 AC_CONFIG_LIBOBJ_DIR => 1,
5201                 AC_CONFIG_LINKS => 1,
5202                 AC_FC_SRCEXT => 1,
5203                 AC_INIT => 0,
5204                 AC_LIBSOURCE => 1,
5205                 AC_REQUIRE_AUX_FILE => 1,
5206                 AC_SUBST_TRACE => 1,
5207                 AM_AUTOMAKE_VERSION => 1,
5208                 AM_CONDITIONAL => 2,
5209                 AM_ENABLE_MULTILIB => 0,
5210                 AM_GNU_GETTEXT => 0,
5211                 AM_GNU_GETTEXT_INTL_SUBDIR => 0,
5212                 AM_INIT_AUTOMAKE => 0,
5213                 AM_MAINTAINER_MODE => 0,
5214                 AM_PROG_CC_C_O => 0,
5215                 _AM_SUBST_NOTMAKE => 1,
5216                 _AM_COND_IF => 1,
5217                 _AM_COND_ELSE => 1,
5218                 _AM_COND_ENDIF => 1,
5219                 LT_SUPPORTED_TAG => 1,
5220                 _LT_AC_TAGCONFIG => 0,
5221                 m4_include => 1,
5222                 m4_sinclude => 1,
5223                 sinclude => 1,
5224               );
5226   my $traces = ($ENV{AUTOCONF} || 'autoconf') . " ";
5228   # Use a separator unlikely to be used, not `:', the default, which
5229   # has a precise meaning for AC_CONFIG_FILES and so on.
5230   $traces .= join (' ',
5231                    map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' }
5232                    (keys %traced));
5234   my $tracefh = new Automake::XFile ("$traces $filename |");
5235   verb "reading $traces";
5237   @cond_stack = ();
5238   my $where;
5240   while ($_ = $tracefh->getline)
5241     {
5242       chomp;
5243       my ($here, $depth, @args) = split (/::/);
5244       $where = new Automake::Location $here;
5245       my $macro = $args[0];
5247       prog_error ("unrequested trace `$macro'")
5248         unless exists $traced{$macro};
5250       # Skip and diagnose malformed calls.
5251       if ($#args < $traced{$macro})
5252         {
5253           msg ('syntax', $where, "not enough arguments for $macro");
5254           next;
5255         }
5257       # Alphabetical ordering please.
5258       if ($macro eq 'AC_CANONICAL_BUILD')
5259         {
5260           if ($seen_canonical <= AC_CANONICAL_BUILD)
5261             {
5262               $seen_canonical = AC_CANONICAL_BUILD;
5263               $canonical_location = $where;
5264             }
5265         }
5266       elsif ($macro eq 'AC_CANONICAL_HOST')
5267         {
5268           if ($seen_canonical <= AC_CANONICAL_HOST)
5269             {
5270               $seen_canonical = AC_CANONICAL_HOST;
5271               $canonical_location = $where;
5272             }
5273         }
5274       elsif ($macro eq 'AC_CANONICAL_TARGET')
5275         {
5276           $seen_canonical = AC_CANONICAL_TARGET;
5277           $canonical_location = $where;
5278         }
5279       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
5280         {
5281           if ($seen_init_automake)
5282             {
5283               error ($where, "AC_CONFIG_AUX_DIR must be called before "
5284                      . "AM_INIT_AUTOMAKE...", partial => 1);
5285               error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here");
5286             }
5287           $config_aux_dir = $args[1];
5288           $config_aux_dir_set_in_configure_ac = 1;
5289           $relative_dir = '.';
5290           check_directory ($config_aux_dir, $where);
5291         }
5292       elsif ($macro eq 'AC_CONFIG_FILES')
5293         {
5294           # Look at potential Makefile.am's.
5295           scan_autoconf_config_files ($where, $args[1]);
5296         }
5297       elsif ($macro eq 'AC_CONFIG_HEADERS')
5298         {
5299           foreach my $spec (split (' ', $args[1]))
5300             {
5301               my ($dest, @src) = split (':', $spec);
5302               $ac_config_files_location{$dest} = $where;
5303               push @config_headers, $spec;
5304             }
5305         }
5306       elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR')
5307         {
5308           $config_libobj_dir = $args[1];
5309           $relative_dir = '.';
5310           check_directory ($config_libobj_dir, $where);
5311         }
5312       elsif ($macro eq 'AC_CONFIG_LINKS')
5313         {
5314           foreach my $spec (split (' ', $args[1]))
5315             {
5316               my ($dest, $src) = split (':', $spec);
5317               $ac_config_files_location{$dest} = $where;
5318               push @config_links, $spec;
5319             }
5320         }
5321       elsif ($macro eq 'AC_FC_SRCEXT')
5322         {
5323           my $suffix = $args[1];
5324           # These flags are used as %SOURCEFLAG% in depend2.am,
5325           # where the trailing space is important.
5326           $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') '
5327             if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08');
5328         }
5329       elsif ($macro eq 'AC_INIT')
5330         {
5331           if (defined $args[2])
5332             {
5333               $package_version = $args[2];
5334               $package_version_location = $where;
5335             }
5336         }
5337       elsif ($macro eq 'AC_LIBSOURCE')
5338         {
5339           $libsources{$args[1]} = $here;
5340         }
5341       elsif ($macro eq 'AC_REQUIRE_AUX_FILE')
5342         {
5343           # Only remember the first time a file is required.
5344           $required_aux_file{$args[1]} = $where
5345             unless exists $required_aux_file{$args[1]};
5346         }
5347       elsif ($macro eq 'AC_SUBST_TRACE')
5348         {
5349           # Just check for alphanumeric in AC_SUBST_TRACE.  If you do
5350           # AC_SUBST(5), then too bad.
5351           $configure_vars{$args[1]} = $where
5352             if $args[1] =~ /^\w+$/;
5353         }
5354       elsif ($macro eq 'AM_AUTOMAKE_VERSION')
5355         {
5356           error ($where,
5357                  "version mismatch.  This is Automake $VERSION,\n" .
5358                  "but the definition used by this AM_INIT_AUTOMAKE\n" .
5359                  "comes from Automake $args[1].  You should recreate\n" .
5360                  "aclocal.m4 with aclocal and run automake again.\n",
5361                  # $? = 63 is used to indicate version mismatch to missing.
5362                  exit_code => 63)
5363             if $VERSION ne $args[1];
5365           $seen_automake_version = 1;
5366         }
5367       elsif ($macro eq 'AM_CONDITIONAL')
5368         {
5369           $configure_cond{$args[1]} = $where;
5370         }
5371       elsif ($macro eq 'AM_ENABLE_MULTILIB')
5372         {
5373           $seen_multilib = $where;
5374         }
5375       elsif ($macro eq 'AM_GNU_GETTEXT')
5376         {
5377           $seen_gettext = $where;
5378           $ac_gettext_location = $where;
5379           $seen_gettext_external = grep ($_ eq 'external', @args);
5380         }
5381       elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR')
5382         {
5383           $seen_gettext_intl = $where;
5384         }
5385       elsif ($macro eq 'AM_INIT_AUTOMAKE')
5386         {
5387           $seen_init_automake = $where;
5388           if (defined $args[2])
5389             {
5390               $package_version = $args[2];
5391               $package_version_location = $where;
5392             }
5393           elsif (defined $args[1])
5394             {
5395               exit $exit_code
5396                 if (process_global_option_list ($where,
5397                                                 split (' ', $args[1])));
5398             }
5399         }
5400       elsif ($macro eq 'AM_MAINTAINER_MODE')
5401         {
5402           $seen_maint_mode = $where;
5403         }
5404       elsif ($macro eq 'AM_PROG_CC_C_O')
5405         {
5406           $seen_cc_c_o = $where;
5407         }
5408       elsif ($macro eq '_AM_COND_IF')
5409         {
5410           cond_stack_if ('', $args[1], $where);
5411           error ($where, "missing m4 quoting, macro depth $depth")
5412             if ($depth != 1);
5413         }
5414       elsif ($macro eq '_AM_COND_ELSE')
5415         {
5416           cond_stack_else ('!', $args[1], $where);
5417           error ($where, "missing m4 quoting, macro depth $depth")
5418             if ($depth != 1);
5419         }
5420       elsif ($macro eq '_AM_COND_ENDIF')
5421         {
5422           cond_stack_endif (undef, undef, $where);
5423           error ($where, "missing m4 quoting, macro depth $depth")
5424             if ($depth != 1);
5425         }
5426       elsif ($macro eq '_AM_SUBST_NOTMAKE')
5427         {
5428           $ignored_configure_vars{$args[1]} = $where;
5429         }
5430       elsif ($macro eq 'm4_include'
5431              || $macro eq 'm4_sinclude'
5432              || $macro eq 'sinclude')
5433         {
5434           # Skip missing `sinclude'd files.
5435           next if $macro ne 'm4_include' && ! -f $args[1];
5437           # Some modified versions of Autoconf don't use
5438           # frozen files.  Consequently it's possible that we see all
5439           # m4_include's performed during Autoconf's startup.
5440           # Obviously we don't want to distribute Autoconf's files
5441           # so we skip absolute filenames here.
5442           push @configure_deps, '$(top_srcdir)/' . $args[1]
5443             unless $here =~ m,^(?:\w:)?[\\/],;
5444           # Keep track of the greatest timestamp.
5445           if (-e $args[1])
5446             {
5447               my $mtime = mtime $args[1];
5448               $configure_deps_greatest_timestamp = $mtime
5449                 if $mtime > $configure_deps_greatest_timestamp;
5450             }
5451         }
5452       elsif ($macro eq 'LT_SUPPORTED_TAG')
5453         {
5454           $libtool_tags{$args[1]} = 1;
5455           $libtool_new_api = 1;
5456         }
5457       elsif ($macro eq '_LT_AC_TAGCONFIG')
5458         {
5459           # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5.
5460           # We use it to detect whether tags are supported.  Our
5461           # preferred interface is LT_SUPPORTED_TAG, but it was
5462           # introduced in Libtool 1.6.
5463           if (0 == keys %libtool_tags)
5464             {
5465               # Hardcode the tags supported by Libtool 1.5.
5466               %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1);
5467             }
5468         }
5469     }
5471   error ($where, "condition stack not properly closed")
5472     if (@cond_stack);
5474   $tracefh->close;
5478 # &scan_autoconf_files ()
5479 # -----------------------
5480 # Check whether we use `configure.ac' or `configure.in'.
5481 # Scan it (and possibly `aclocal.m4') for interesting things.
5482 # We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
5483 sub scan_autoconf_files ()
5485   # Reinitialize libsources here.  This isn't really necessary,
5486   # since we currently assume there is only one configure.ac.  But
5487   # that won't always be the case.
5488   %libsources = ();
5490   # Keep track of the youngest configure dependency.
5491   $configure_deps_greatest_timestamp = mtime $configure_ac;
5492   if (-e 'aclocal.m4')
5493     {
5494       my $mtime = mtime 'aclocal.m4';
5495       $configure_deps_greatest_timestamp = $mtime
5496         if $mtime > $configure_deps_greatest_timestamp;
5497     }
5499   scan_autoconf_traces ($configure_ac);
5501   @configure_input_files = sort keys %make_list;
5502   # Set input and output files if not specified by user.
5503   if (! @input_files)
5504     {
5505       @input_files = @configure_input_files;
5506       %output_files = %make_list;
5507     }
5510   if (! $seen_init_automake)
5511     {
5512       err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou "
5513               . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE,"
5514               . "\nthat aclocal.m4 is present in the top-level directory,\n"
5515               . "and that aclocal.m4 was recently regenerated "
5516               . "(using aclocal).");
5517     }
5518   else
5519     {
5520       if (! $seen_automake_version)
5521         {
5522           if (-f 'aclocal.m4')
5523             {
5524               error ($seen_init_automake,
5525                      "your implementation of AM_INIT_AUTOMAKE comes from " .
5526                      "an\nold Automake version.  You should recreate " .
5527                      "aclocal.m4\nwith aclocal and run automake again.\n",
5528                      # $? = 63 is used to indicate version mismatch to missing.
5529                      exit_code => 63);
5530             }
5531           else
5532             {
5533               error ($seen_init_automake,
5534                      "no proper implementation of AM_INIT_AUTOMAKE was " .
5535                      "found,\nprobably because aclocal.m4 is missing...\n" .
5536                      "You should run aclocal to create this file, then\n" .
5537                      "run automake again.\n");
5538             }
5539         }
5540     }
5542   locate_aux_dir ();
5544   # Reorder @input_files so that the Makefile that distributes aux
5545   # files is processed last.  This is important because each directory
5546   # can require auxiliary scripts and we should wait until they have
5547   # been installed before distributing them.
5549   # The Makefile.in that distribute the aux files is the one in
5550   # $config_aux_dir or the top-level Makefile.
5551   my $auxdirdist = is_make_dir ($config_aux_dir) ? $config_aux_dir : '.';
5552   my @new_input_files = ();
5553   while (@input_files)
5554     {
5555       my $in = pop @input_files;
5556       my @ins = split (/:/, $output_files{$in});
5557       if (dirname ($ins[0]) eq $auxdirdist)
5558         {
5559           push @new_input_files, $in;
5560           $automake_will_process_aux_dir = 1;
5561         }
5562       else
5563         {
5564           unshift @new_input_files, $in;
5565         }
5566     }
5567   @input_files = @new_input_files;
5569   # If neither the auxdir/Makefile nor the ./Makefile are generated
5570   # by Automake, we won't distribute the aux files anyway.  Assume
5571   # the user know what (s)he does, and pretend we will distribute
5572   # them to disable the error in require_file_internal.
5573   $automake_will_process_aux_dir = 1 if ! is_make_dir ($auxdirdist);
5575   # Look for some files we need.  Always check for these.  This
5576   # check must be done for every run, even those where we are only
5577   # looking at a subdir Makefile.  We must set relative_dir for
5578   # maybe_push_required_file to work.
5579   # Sort the files for stable verbose output.
5580   $relative_dir = '.';
5581   foreach my $file (sort keys %required_aux_file)
5582     {
5583       require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file)
5584     }
5585   err_am "`install.sh' is an anachronism; use `install-sh' instead"
5586     if -f $config_aux_dir . '/install.sh';
5588   # Preserve dist_common for later.
5589   $configure_dist_common = variable_value ('DIST_COMMON') || '';
5593 ################################################################
5595 # Set up for Cygnus mode.
5596 sub check_cygnus
5598   my $cygnus = option 'cygnus';
5599   return unless $cygnus;
5601   set_strictness ('foreign');
5602   set_option ('no-installinfo', $cygnus);
5603   set_option ('no-dependencies', $cygnus);
5604   set_option ('no-dist', $cygnus);
5606   err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified"
5607     if !$seen_maint_mode;
5610 # Do any extra checking for GNU standards.
5611 sub check_gnu_standards
5613   if ($relative_dir eq '.')
5614     {
5615       # In top level (or only) directory.
5616       require_file ("$am_file.am", GNU,
5617                     qw/INSTALL NEWS README AUTHORS ChangeLog/);
5619       # Accept one of these three licenses; default to COPYING.
5620       # Make sure we do not overwrite an existing license.
5621       my $license;
5622       foreach (qw /COPYING COPYING.LIB COPYING.LESSER/)
5623         {
5624           if (-f $_)
5625             {
5626               $license = $_;
5627               last;
5628             }
5629         }
5630       require_file ("$am_file.am", GNU, 'COPYING')
5631         unless $license;
5632     }
5634   for my $opt ('no-installman', 'no-installinfo')
5635     {
5636       msg ('error-gnu', option $opt,
5637            "option `$opt' disallowed by GNU standards")
5638         if option $opt;
5639     }
5642 # Do any extra checking for GNITS standards.
5643 sub check_gnits_standards
5645   if ($relative_dir eq '.')
5646     {
5647       # In top level (or only) directory.
5648       require_file ("$am_file.am", GNITS, 'THANKS');
5649     }
5652 ################################################################
5654 # Functions to handle files of each language.
5656 # Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
5657 # simple formula: Return value is LANG_SUBDIR if the resulting object
5658 # file should be in a subdir if the source file is, LANG_PROCESS if
5659 # file is to be dealt with, LANG_IGNORE otherwise.
5661 # Much of the actual processing is handled in
5662 # handle_single_transform.  These functions exist so that
5663 # auxiliary information can be recorded for a later cleanup pass.
5664 # Note that the calls to these functions are computed, so don't bother
5665 # searching for their precise names in the source.
5667 # This is just a convenience function that can be used to determine
5668 # when a subdir object should be used.
5669 sub lang_sub_obj
5671     return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS;
5674 # Rewrite a single C source file.
5675 sub lang_c_rewrite
5677   my ($directory, $base, $ext, $nonansi_obj, $have_per_exec_flags, $var) = @_;
5679   if (option 'ansi2knr' && $base =~ /_$/)
5680     {
5681       # FIXME: include line number in error.
5682       err_am "C source file `$base.c' would be deleted by ansi2knr rules";
5683     }
5685   my $r = LANG_PROCESS;
5686   if (option 'subdir-objects')
5687     {
5688       $r = LANG_SUBDIR;
5689       if ($directory && $directory ne '.')
5690         {
5691           $base = $directory . '/' . $base;
5693           # libtool is always able to put the object at the proper place,
5694           # so we do not have to require AM_PROG_CC_C_O when building .lo files.
5695           msg_var ('portability', $var,
5696                    "compiling `$base.c' in subdir requires "
5697                    . "`AM_PROG_CC_C_O' in `$configure_ac'",
5698                    uniq_scope => US_GLOBAL,
5699                    uniq_part => 'AM_PROG_CC_C_O subdir')
5700             unless $seen_cc_c_o || $nonansi_obj eq '.lo';
5701         }
5703       # In this case we already have the directory information, so
5704       # don't add it again.
5705       $de_ansi_files{$base} = '';
5706     }
5707   else
5708     {
5709       $de_ansi_files{$base} = (($directory eq '.' || $directory eq '')
5710                                ? ''
5711                                : "$directory/");
5712     }
5714   if (! $seen_cc_c_o
5715       && $have_per_exec_flags
5716       && ! option 'subdir-objects'
5717       && $nonansi_obj ne '.lo')
5718     {
5719       msg_var ('portability',
5720                $var, "compiling `$base.c' with per-target flags requires "
5721                . "`AM_PROG_CC_C_O' in `$configure_ac'",
5722                uniq_scope => US_GLOBAL,
5723                uniq_part => 'AM_PROG_CC_C_O per-target')
5724     }
5726     return $r;
5729 # Rewrite a single C++ source file.
5730 sub lang_cxx_rewrite
5732     return &lang_sub_obj;
5735 # Rewrite a single header file.
5736 sub lang_header_rewrite
5738     # Header files are simply ignored.
5739     return LANG_IGNORE;
5742 # Rewrite a single yacc file.
5743 sub lang_yacc_rewrite
5745     my ($directory, $base, $ext) = @_;
5747     my $r = &lang_sub_obj;
5748     (my $newext = $ext) =~ tr/y/c/;
5749     return ($r, $newext);
5752 # Rewrite a single yacc++ file.
5753 sub lang_yaccxx_rewrite
5755     my ($directory, $base, $ext) = @_;
5757     my $r = &lang_sub_obj;
5758     (my $newext = $ext) =~ tr/y/c/;
5759     return ($r, $newext);
5762 # Rewrite a single lex file.
5763 sub lang_lex_rewrite
5765     my ($directory, $base, $ext) = @_;
5767     my $r = &lang_sub_obj;
5768     (my $newext = $ext) =~ tr/l/c/;
5769     return ($r, $newext);
5772 # Rewrite a single lex++ file.
5773 sub lang_lexxx_rewrite
5775     my ($directory, $base, $ext) = @_;
5777     my $r = &lang_sub_obj;
5778     (my $newext = $ext) =~ tr/l/c/;
5779     return ($r, $newext);
5782 # Rewrite a single assembly file.
5783 sub lang_asm_rewrite
5785     return &lang_sub_obj;
5788 # Rewrite a single preprocessed assembly file.
5789 sub lang_cppasm_rewrite
5791     return &lang_sub_obj;
5794 # Rewrite a single Fortran 77 file.
5795 sub lang_f77_rewrite
5797     return &lang_sub_obj;
5800 # Rewrite a single Fortran file.
5801 sub lang_fc_rewrite
5803     return &lang_sub_obj;
5806 # Rewrite a single preprocessed Fortran file.
5807 sub lang_ppfc_rewrite
5809     return &lang_sub_obj;
5812 # Rewrite a single preprocessed Fortran 77 file.
5813 sub lang_ppf77_rewrite
5815     return &lang_sub_obj;
5818 # Rewrite a single ratfor file.
5819 sub lang_ratfor_rewrite
5821     return &lang_sub_obj;
5824 # Rewrite a single Objective C file.
5825 sub lang_objc_rewrite
5827     return &lang_sub_obj;
5830 # Rewrite a single Unified Parallel C file.
5831 sub lang_upc_rewrite
5833     return &lang_sub_obj;
5836 # Rewrite a single Java file.
5837 sub lang_java_rewrite
5839     return LANG_SUBDIR;
5842 # The lang_X_finish functions are called after all source file
5843 # processing is done.  Each should handle defining rules for the
5844 # language, etc.  A finish function is only called if a source file of
5845 # the appropriate type has been seen.
5847 sub lang_c_finish
5849     # Push all libobjs files onto de_ansi_files.  We actually only
5850     # push files which exist in the current directory, and which are
5851     # genuine source files.
5852     foreach my $file (keys %libsources)
5853     {
5854         if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file")
5855         {
5856             $de_ansi_files{$1} = ''
5857         }
5858     }
5860     if (option 'ansi2knr' && keys %de_ansi_files)
5861     {
5862         # Make all _.c files depend on their corresponding .c files.
5863         my @objects;
5864         foreach my $base (sort keys %de_ansi_files)
5865         {
5866             # Each _.c file must depend on ansi2knr; otherwise it
5867             # might be used in a parallel build before it is built.
5868             # We need to support files in the srcdir and in the build
5869             # dir (because these files might be auto-generated.  But
5870             # we can't use $< -- some makes only define $< during a
5871             # suffix rule.
5872             my $ansfile = $de_ansi_files{$base} . $base . '.c';
5873             $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t"
5874                               . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) '
5875                               . '`if test -f $(srcdir)/' . $ansfile
5876                               . '; then echo $(srcdir)/' . $ansfile
5877                               . '; else echo ' . $ansfile . '; fi` '
5878                               . "| sed 's/^# \\([0-9]\\)/#line \\1/' "
5879                               . '| $(ANSI2KNR) > $@'
5880                               # If ansi2knr fails then we shouldn't
5881                               # create the _.c file
5882                               . " || rm -f \$\@\n");
5883             push (@objects, $base . '_.$(OBJEXT)');
5884             push (@objects, $base . '_.lo')
5885               if var ('LIBTOOL');
5887             # Explicitly clean the _.c files if they are in a
5888             # subdirectory. (In the current directory they get erased
5889             # by a `rm -f *_.c' rule.)
5890             $clean_files{$base . '_.c'} = MOSTLY_CLEAN
5891               if dirname ($base) ne '.';
5892         }
5894         # Make all _.o (and _.lo) files depend on ansi2knr.
5895         # Use a sneaky little hack to make it print nicely.
5896         &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)');
5897     }
5900 # This is a yacc helper which is called whenever we have decided to
5901 # compile a yacc file.
5902 sub lang_yacc_target_hook
5904     my ($self, $aggregate, $output, $input, %transform) = @_;
5906     my $flag = $aggregate . "_YFLAGS";
5907     my $flagvar = var $flag;
5908     my $YFLAGSvar = var 'YFLAGS';
5909     if (($flagvar && $flagvar->variable_value =~ /$DASH_D_PATTERN/o)
5910         || ($YFLAGSvar && $YFLAGSvar->variable_value =~ /$DASH_D_PATTERN/o))
5911     {
5912         (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//;
5913         my $header = $output_base . '.h';
5915         # Found a `-d' that applies to the compilation of this file.
5916         # Add a dependency for the generated header file, and arrange
5917         # for that file to be included in the distribution.
5918         foreach my $cond (Automake::Rule::define (${header}, 'internal',
5919                                                   RULE_AUTOMAKE, TRUE,
5920                                                   INTERNAL))
5921           {
5922             my $condstr = $cond->subst_string;
5923             $output_rules .=
5924               "$condstr${header}: $output\n"
5925               # Recover from removal of $header
5926               . "$condstr\t\@if test ! -f \$@; then \\\n"
5927               . "$condstr\t  rm -f $output; \\\n"
5928               . "$condstr\t  \$(MAKE) \$(AM_MAKEFLAGS) $output; \\\n"
5929               . "$condstr\telse :; fi\n";
5930           }
5931         # Distribute the generated file, unless its .y source was
5932         # listed in a nodist_ variable.  (&handle_source_transform
5933         # will set DIST_SOURCE.)
5934         &push_dist_common ($header)
5935           if $transform{'DIST_SOURCE'};
5937         # If the files are built in the build directory, then we want
5938         # to remove them with `make clean'.  If they are in srcdir
5939         # they shouldn't be touched.  However, we can't determine this
5940         # statically, and the GNU rules say that yacc/lex output files
5941         # should be removed by maintainer-clean.  So that's what we
5942         # do.
5943         $clean_files{$header} = MAINTAINER_CLEAN;
5944     }
5945     # Erase $OUTPUT on `make maintainer-clean' (by GNU standards).
5946     # See the comment above for $HEADER.
5947     $clean_files{$output} = MAINTAINER_CLEAN;
5950 # This is a lex helper which is called whenever we have decided to
5951 # compile a lex file.
5952 sub lang_lex_target_hook
5954     my ($self, $aggregate, $output, $input) = @_;
5955     # If the files are built in the build directory, then we want to
5956     # remove them with `make clean'.  If they are in srcdir they
5957     # shouldn't be touched.  However, we can't determine this
5958     # statically, and the GNU rules say that yacc/lex output files
5959     # should be removed by maintainer-clean.  So that's what we do.
5960     $clean_files{$output} = MAINTAINER_CLEAN;
5963 # This is a helper for both lex and yacc.
5964 sub yacc_lex_finish_helper
5966   return if defined $language_scratch{'lex-yacc-done'};
5967   $language_scratch{'lex-yacc-done'} = 1;
5969   # FIXME: for now, no line number.
5970   require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
5971   &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
5974 sub lang_yacc_finish
5976   return if defined $language_scratch{'yacc-done'};
5977   $language_scratch{'yacc-done'} = 1;
5979   reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead";
5981   yacc_lex_finish_helper;
5985 sub lang_lex_finish
5987   return if defined $language_scratch{'lex-done'};
5988   $language_scratch{'lex-done'} = 1;
5990   yacc_lex_finish_helper;
5994 # Given a hash table of linker names, pick the name that has the most
5995 # precedence.  This is lame, but something has to have global
5996 # knowledge in order to eliminate the conflict.  Add more linkers as
5997 # required.
5998 sub resolve_linker
6000     my (%linkers) = @_;
6002     foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK))
6003     {
6004         return $l if defined $linkers{$l};
6005     }
6006     return 'LINK';
6009 # Called to indicate that an extension was used.
6010 sub saw_extension
6012     my ($ext) = @_;
6013     if (! defined $extension_seen{$ext})
6014     {
6015         $extension_seen{$ext} = 1;
6016     }
6017     else
6018     {
6019         ++$extension_seen{$ext};
6020     }
6023 # Return the number of files seen for a given language.  Knows about
6024 # special cases we care about.  FIXME: this is hideous.  We need
6025 # something that involves real language objects.  For instance yacc
6026 # and yaccxx could both derive from a common yacc class which would
6027 # know about the strange ylwrap requirement.  (Or better yet we could
6028 # just not support legacy yacc!)
6029 sub count_files_for_language
6031     my ($name) = @_;
6033     my @names;
6034     if ($name eq 'yacc' || $name eq 'yaccxx')
6035     {
6036         @names = ('yacc', 'yaccxx');
6037     }
6038     elsif ($name eq 'lex' || $name eq 'lexxx')
6039     {
6040         @names = ('lex', 'lexxx');
6041     }
6042     else
6043     {
6044         @names = ($name);
6045     }
6047     my $r = 0;
6048     foreach $name (@names)
6049     {
6050         my $lang = $languages{$name};
6051         foreach my $ext (@{$lang->extensions})
6052         {
6053             $r += $extension_seen{$ext}
6054                 if defined $extension_seen{$ext};
6055         }
6056     }
6058     return $r
6061 # Called to ask whether source files have been seen . If HEADERS is 1,
6062 # headers can be included.
6063 sub saw_sources_p
6065     my ($headers) = @_;
6067     # count all the sources
6068     my $count = 0;
6069     foreach my $val (values %extension_seen)
6070     {
6071         $count += $val;
6072     }
6074     if (!$headers)
6075     {
6076         $count -= count_files_for_language ('header');
6077     }
6079     return $count > 0;
6083 # register_language (%ATTRIBUTE)
6084 # ------------------------------
6085 # Register a single language.
6086 # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
6087 sub register_language (%)
6089   my (%option) = @_;
6091   # Set the defaults.
6092   $option{'ansi'} = 0
6093     unless defined $option{'ansi'};
6094   $option{'autodep'} = 'no'
6095     unless defined $option{'autodep'};
6096   $option{'linker'} = ''
6097     unless defined $option{'linker'};
6098   $option{'flags'} = []
6099     unless defined $option{'flags'};
6100   $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) }
6101     unless defined $option{'output_extensions'};
6102   $option{'nodist_specific'} = 0
6103     unless defined $option{'nodist_specific'};
6105   my $lang = new Language (%option);
6107   # Fill indexes.
6108   $extension_map{$_} = $lang->name foreach @{$lang->extensions};
6109   $languages{$lang->name} = $lang;
6110   my $link = $lang->linker;
6111   if ($link)
6112     {
6113       if (exists $link_languages{$link})
6114         {
6115           prog_error ("`$link' has different definitions in "
6116                       . $lang->name . " and " . $link_languages{$link}->name)
6117             if $lang->link ne $link_languages{$link}->link;
6118         }
6119       else
6120         {
6121           $link_languages{$link} = $lang;
6122         }
6123     }
6125   # Update the pattern of known extensions.
6126   accept_extensions (@{$lang->extensions});
6128   # Upate the $suffix_rule map.
6129   foreach my $suffix (@{$lang->extensions})
6130     {
6131       foreach my $dest (&{$lang->output_extensions} ($suffix))
6132         {
6133           register_suffix_rule (INTERNAL, $suffix, $dest);
6134         }
6135     }
6138 # derive_suffix ($EXT, $OBJ)
6139 # --------------------------
6140 # This function is used to find a path from a user-specified suffix $EXT
6141 # to $OBJ or to some other suffix we recognize internally, e.g. `cc'.
6142 sub derive_suffix ($$)
6144   my ($source_ext, $obj) = @_;
6146   while (! $extension_map{$source_ext}
6147          && $source_ext ne $obj
6148          && exists $suffix_rules->{$source_ext}
6149          && exists $suffix_rules->{$source_ext}{$obj})
6150     {
6151       $source_ext = $suffix_rules->{$source_ext}{$obj}[0];
6152     }
6154   return $source_ext;
6158 ################################################################
6160 # Pretty-print something and append to output_rules.
6161 sub pretty_print_rule
6163     $output_rules .= &makefile_wrap (@_);
6167 ################################################################
6170 ## -------------------------------- ##
6171 ## Handling the conditional stack.  ##
6172 ## -------------------------------- ##
6175 # $STRING
6176 # make_conditional_string ($NEGATE, $COND)
6177 # ----------------------------------------
6178 sub make_conditional_string ($$)
6180   my ($negate, $cond) = @_;
6181   $cond = "${cond}_TRUE"
6182     unless $cond =~ /^TRUE|FALSE$/;
6183   $cond = Automake::Condition::conditional_negate ($cond)
6184     if $negate;
6185   return $cond;
6189 my %_am_macro_for_cond =
6190   (
6191   AMDEP => "one of the compiler tests\n"
6192            . "    AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,\n"
6193            . "    AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC",
6194   am__fastdepCC => 'AC_PROG_CC',
6195   am__fastdepCCAS => 'AM_PROG_AS',
6196   am__fastdepCXX => 'AC_PROG_CXX',
6197   am__fastdepGCJ => 'AM_PROG_GCJ',
6198   am__fastdepOBJC => 'AC_PROG_OBJC',
6199   am__fastdepUPC => 'AM_PROG_UPC'
6200   );
6202 # $COND
6203 # cond_stack_if ($NEGATE, $COND, $WHERE)
6204 # --------------------------------------
6205 sub cond_stack_if ($$$)
6207   my ($negate, $cond, $where) = @_;
6209   if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/)
6210     {
6211       my $text = "$cond does not appear in AM_CONDITIONAL";
6212       my $scope = US_LOCAL;
6213       if (exists $_am_macro_for_cond{$cond})
6214         {
6215           my $mac = $_am_macro_for_cond{$cond};
6216           $text .= "\n  The usual way to define `$cond' is to add ";
6217           $text .= ($mac =~ / /) ? $mac : "`$mac'";
6218           $text .= "\n  to `$configure_ac' and run `aclocal' and `autoconf' again.";
6219           # These warnings appear in Automake files (depend2.am),
6220           # so there is no need to display them more than once:
6221           $scope = US_GLOBAL;
6222         }
6223       error $where, $text, uniq_scope => $scope;
6224     }
6226   push (@cond_stack, make_conditional_string ($negate, $cond));
6228   return new Automake::Condition (@cond_stack);
6232 # $COND
6233 # cond_stack_else ($NEGATE, $COND, $WHERE)
6234 # ----------------------------------------
6235 sub cond_stack_else ($$$)
6237   my ($negate, $cond, $where) = @_;
6239   if (! @cond_stack)
6240     {
6241       error $where, "else without if";
6242       return FALSE;
6243     }
6245   $cond_stack[$#cond_stack] =
6246     Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]);
6248   # If $COND is given, check against it.
6249   if (defined $cond)
6250     {
6251       $cond = make_conditional_string ($negate, $cond);
6253       error ($where, "else reminder ($negate$cond) incompatible with "
6254              . "current conditional: $cond_stack[$#cond_stack]")
6255         if $cond_stack[$#cond_stack] ne $cond;
6256     }
6258   return new Automake::Condition (@cond_stack);
6262 # $COND
6263 # cond_stack_endif ($NEGATE, $COND, $WHERE)
6264 # -----------------------------------------
6265 sub cond_stack_endif ($$$)
6267   my ($negate, $cond, $where) = @_;
6268   my $old_cond;
6270   if (! @cond_stack)
6271     {
6272       error $where, "endif without if";
6273       return TRUE;
6274     }
6276   # If $COND is given, check against it.
6277   if (defined $cond)
6278     {
6279       $cond = make_conditional_string ($negate, $cond);
6281       error ($where, "endif reminder ($negate$cond) incompatible with "
6282              . "current conditional: $cond_stack[$#cond_stack]")
6283         if $cond_stack[$#cond_stack] ne $cond;
6284     }
6286   pop @cond_stack;
6288   return new Automake::Condition (@cond_stack);
6295 ## ------------------------ ##
6296 ## Handling the variables.  ##
6297 ## ------------------------ ##
6300 # &define_pretty_variable ($VAR, $COND, $WHERE, @VALUE)
6301 # -----------------------------------------------------
6302 # Like define_variable, but the value is a list, and the variable may
6303 # be defined conditionally.  The second argument is the condition
6304 # under which the value should be defined; this should be the empty
6305 # string to define the variable unconditionally.  The third argument
6306 # is a list holding the values to use for the variable.  The value is
6307 # pretty printed in the output file.
6308 sub define_pretty_variable ($$$@)
6310     my ($var, $cond, $where, @value) = @_;
6312     if (! vardef ($var, $cond))
6313     {
6314         Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value",
6315                                     '', $where, VAR_PRETTY);
6316         rvar ($var)->rdef ($cond)->set_seen;
6317     }
6321 # define_variable ($VAR, $VALUE, $WHERE)
6322 # --------------------------------------
6323 # Define a new Automake Makefile variable VAR to VALUE, but only if
6324 # not already defined.
6325 sub define_variable ($$$)
6327     my ($var, $value, $where) = @_;
6328     define_pretty_variable ($var, TRUE, $where, $value);
6332 # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE)
6333 # -----------------------------------------------------------
6334 # Define the $VAR which content is the list of file names composed of
6335 # a @BASENAME and the $EXTENSION.
6336 sub define_files_variable ($\@$$)
6338   my ($var, $basename, $extension, $where) = @_;
6339   define_variable ($var,
6340                    join (' ', map { "$_.$extension" } @$basename),
6341                    $where);
6345 # Like define_variable, but define a variable to be the configure
6346 # substitution by the same name.
6347 sub define_configure_variable ($)
6349   my ($var) = @_;
6351   my $pretty = VAR_ASIS;
6352   my $owner = VAR_CONFIGURE;
6354   # Some variables we do not want to output.  For instance it
6355   # would be a bad idea to output `U = @U@` when `@U@` can be
6356   # substituted as `\`.
6357   $pretty = VAR_SILENT if exists $ignored_configure_vars{$var};
6359   # ANSI2KNR is a variable that Automake wants to redefine, so
6360   # it must be owned by Automake.  (It is also used as a proof
6361   # that AM_C_PROTOTYPES has been run, that's why we do not simply
6362   # omit the AC_SUBST.)
6363   $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR';
6365   Automake::Variable::define ($var, $owner, '', TRUE, subst $var,
6366                               '', $configure_vars{$var}, $pretty);
6370 # define_compiler_variable ($LANG)
6371 # --------------------------------
6372 # Define a compiler variable.  We also handle defining the `LT'
6373 # version of the command when using libtool.
6374 sub define_compiler_variable ($)
6376     my ($lang) = @_;
6378     my ($var, $value) = ($lang->compiler, $lang->compile);
6379     my $libtool_tag = '';
6380     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6381       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6382     &define_variable ($var, $value, INTERNAL);
6383     if (var ('LIBTOOL'))
6384       {
6385         my $verbose = define_verbose_libtool ();
6386         &define_variable ("LT$var",
6387                           "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
6388                           . "\$(LIBTOOLFLAGS) --mode=compile $value",
6389                           INTERNAL);
6390       }
6391     define_verbose_tagvar ($lang->ccer || 'GEN');
6395 # define_linker_variable ($LANG)
6396 # ------------------------------
6397 # Define linker variables.
6398 sub define_linker_variable ($)
6400     my ($lang) = @_;
6402     my $libtool_tag = '';
6403     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6404       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6405     # CCLD = $(CC).
6406     &define_variable ($lang->lder, $lang->ld, INTERNAL);
6407     # CCLINK = $(CCLD) blah blah...
6408     my $link = '';
6409     if (var ('LIBTOOL'))
6410       {
6411         my $verbose = define_verbose_libtool ();
6412         $link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
6413                 . "\$(LIBTOOLFLAGS) --mode=link ";
6414       }
6415     &define_variable ($lang->linker, $link . $lang->link, INTERNAL);
6416     &define_variable ($lang->compiler,  $lang);
6417     &define_verbose_tagvar ($lang->lder || 'GEN');
6420 sub define_per_target_linker_variable ($$)
6422   my ($linker, $target) = @_;
6424   # If the user wrote a custom link command, we don't define ours.
6425   return "${target}_LINK"
6426     if set_seen "${target}_LINK";
6428   my $xlink = $linker ? $linker : 'LINK';
6430   my $lang = $link_languages{$xlink};
6431   prog_error "Unknown language for linker variable `$xlink'"
6432     unless $lang;
6434   my $link_command = $lang->link;
6435   if (var 'LIBTOOL')
6436     {
6437       my $libtool_tag = '';
6438       $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6439         if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6441       my $verbose = define_verbose_libtool ();
6442       $link_command =
6443         "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) "
6444         . "--mode=link " . $link_command;
6445     }
6447   # Rewrite each occurrence of `AM_$flag' in the link
6448   # command into `${derived}_$flag' if it exists.
6449   my $orig_command = $link_command;
6450   my @flags = (@{$lang->flags}, 'LDFLAGS');
6451   push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL';
6452   for my $flag (@flags)
6453     {
6454       my $val = "${target}_$flag";
6455       $link_command =~ s/\(AM_$flag\)/\($val\)/
6456         if set_seen ($val);
6457     }
6459   # If the computed command is the same as the generic command, use
6460   # the command linker variable.
6461   return ($lang->linker, $lang->lder)
6462     if $link_command eq $orig_command;
6464   &define_variable ("${target}_LINK", $link_command, INTERNAL);
6465   return ("${target}_LINK", $lang->lder);
6468 ################################################################
6470 # &check_trailing_slash ($WHERE, $LINE)
6471 # --------------------------------------
6472 # Return 1 iff $LINE ends with a slash.
6473 # Might modify $LINE.
6474 sub check_trailing_slash ($\$)
6476   my ($where, $line) = @_;
6478   # Ignore `##' lines.
6479   return 0 if $$line =~ /$IGNORE_PATTERN/o;
6481   # Catch and fix a common error.
6482   msg "syntax", $where, "whitespace following trailing backslash"
6483     if $$line =~ s/\\\s+\n$/\\\n/;
6485   return $$line =~ /\\$/;
6489 # &read_am_file ($AMFILE, $WHERE)
6490 # -------------------------------
6491 # Read Makefile.am and set up %contents.  Simultaneously copy lines
6492 # from Makefile.am into $output_trailer, or define variables as
6493 # appropriate.  NOTE we put rules in the trailer section.  We want
6494 # user rules to come after our generated stuff.
6495 sub read_am_file ($$)
6497     my ($amfile, $where) = @_;
6499     my $am_file = new Automake::XFile ("< $amfile");
6500     verb "reading $amfile";
6502     # Keep track of the youngest output dependency.
6503     my $mtime = mtime $amfile;
6504     $output_deps_greatest_timestamp = $mtime
6505       if $mtime > $output_deps_greatest_timestamp;
6507     my $spacing = '';
6508     my $comment = '';
6509     my $blank = 0;
6510     my $saw_bk = 0;
6511     my $var_look = VAR_ASIS;
6513     use constant IN_VAR_DEF => 0;
6514     use constant IN_RULE_DEF => 1;
6515     use constant IN_COMMENT => 2;
6516     my $prev_state = IN_RULE_DEF;
6518     while ($_ = $am_file->getline)
6519     {
6520         $where->set ("$amfile:$.");
6521         if (/$IGNORE_PATTERN/o)
6522         {
6523             # Merely delete comments beginning with two hashes.
6524         }
6525         elsif (/$WHITE_PATTERN/o)
6526         {
6527             error $where, "blank line following trailing backslash"
6528               if $saw_bk;
6529             # Stick a single white line before the incoming macro or rule.
6530             $spacing = "\n";
6531             $blank = 1;
6532             # Flush all comments seen so far.
6533             if ($comment ne '')
6534             {
6535                 $output_vars .= $comment;
6536                 $comment = '';
6537             }
6538         }
6539         elsif (/$COMMENT_PATTERN/o)
6540         {
6541             # Stick comments before the incoming macro or rule.  Make
6542             # sure a blank line precedes the first block of comments.
6543             $spacing = "\n" unless $blank;
6544             $blank = 1;
6545             $comment .= $spacing . $_;
6546             $spacing = '';
6547             $prev_state = IN_COMMENT;
6548         }
6549         else
6550         {
6551             last;
6552         }
6553         $saw_bk = check_trailing_slash ($where, $_);
6554     }
6556     # We save the conditional stack on entry, and then check to make
6557     # sure it is the same on exit.  This lets us conditionally include
6558     # other files.
6559     my @saved_cond_stack = @cond_stack;
6560     my $cond = new Automake::Condition (@cond_stack);
6562     my $last_var_name = '';
6563     my $last_var_type = '';
6564     my $last_var_value = '';
6565     my $last_where;
6566     # FIXME: shouldn't use $_ in this loop; it is too big.
6567     while ($_)
6568     {
6569         $where->set ("$amfile:$.");
6571         # Make sure the line is \n-terminated.
6572         chomp;
6573         $_ .= "\n";
6575         # Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
6576         # used by users.  @MAINT@ is an anachronism now.
6577         $_ =~ s/\@MAINT\@//g
6578             unless $seen_maint_mode;
6580         my $new_saw_bk = check_trailing_slash ($where, $_);
6582         if (/$IGNORE_PATTERN/o)
6583         {
6584             # Merely delete comments beginning with two hashes.
6586             # Keep any backslash from the previous line.
6587             $new_saw_bk = $saw_bk;
6588         }
6589         elsif (/$WHITE_PATTERN/o)
6590         {
6591             # Stick a single white line before the incoming macro or rule.
6592             $spacing = "\n";
6593             error $where, "blank line following trailing backslash"
6594               if $saw_bk;
6595         }
6596         elsif (/$COMMENT_PATTERN/o)
6597         {
6598             error $where, "comment following trailing backslash"
6599               if $saw_bk && $comment eq '';
6601             # Stick comments before the incoming macro or rule.
6602             $comment .= $spacing . $_;
6603             $spacing = '';
6604             $prev_state = IN_COMMENT;
6605         }
6606         elsif ($saw_bk)
6607         {
6608             if ($prev_state == IN_RULE_DEF)
6609             {
6610               my $cond = new Automake::Condition @cond_stack;
6611               $output_trailer .= $cond->subst_string;
6612               $output_trailer .= $_;
6613             }
6614             elsif ($prev_state == IN_COMMENT)
6615             {
6616                 # If the line doesn't start with a `#', add it.
6617                 # We do this because a continued comment like
6618                 #   # A = foo \
6619                 #         bar \
6620                 #         baz
6621                 # is not portable.  BSD make doesn't honor
6622                 # escaped newlines in comments.
6623                 s/^#?/#/;
6624                 $comment .= $spacing . $_;
6625             }
6626             else # $prev_state == IN_VAR_DEF
6627             {
6628               $last_var_value .= ' '
6629                 unless $last_var_value =~ /\s$/;
6630               $last_var_value .= $_;
6632               if (!/\\$/)
6633                 {
6634                   Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6635                                               $last_var_type, $cond,
6636                                               $last_var_value, $comment,
6637                                               $last_where, VAR_ASIS)
6638                     if $cond != FALSE;
6639                   $comment = $spacing = '';
6640                 }
6641             }
6642         }
6644         elsif (/$IF_PATTERN/o)
6645           {
6646             $cond = cond_stack_if ($1, $2, $where);
6647           }
6648         elsif (/$ELSE_PATTERN/o)
6649           {
6650             $cond = cond_stack_else ($1, $2, $where);
6651           }
6652         elsif (/$ENDIF_PATTERN/o)
6653           {
6654             $cond = cond_stack_endif ($1, $2, $where);
6655           }
6657         elsif (/$RULE_PATTERN/o)
6658         {
6659             # Found a rule.
6660             $prev_state = IN_RULE_DEF;
6662             # For now we have to output all definitions of user rules
6663             # and can't diagnose duplicates (see the comment in
6664             # Automake::Rule::define). So we go on and ignore the return value.
6665             Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where);
6667             check_variable_expansions ($_, $where);
6669             $output_trailer .= $comment . $spacing;
6670             my $cond = new Automake::Condition @cond_stack;
6671             $output_trailer .= $cond->subst_string;
6672             $output_trailer .= $_;
6673             $comment = $spacing = '';
6674         }
6675         elsif (/$ASSIGNMENT_PATTERN/o)
6676         {
6677             # Found a macro definition.
6678             $prev_state = IN_VAR_DEF;
6679             $last_var_name = $1;
6680             $last_var_type = $2;
6681             $last_var_value = $3;
6682             $last_where = $where->clone;
6683             if ($3 ne '' && substr ($3, -1) eq "\\")
6684               {
6685                 # We preserve the `\' because otherwise the long lines
6686                 # that are generated will be truncated by broken
6687                 # `sed's.
6688                 $last_var_value = $3 . "\n";
6689               }
6690             # Normally we try to output variable definitions in the
6691             # same format they were input.  However, POSIX compliant
6692             # systems are not required to support lines longer than
6693             # 2048 bytes (most notably, some sed implementation are
6694             # limited to 4000 bytes, and sed is used by config.status
6695             # to rewrite Makefile.in into Makefile).  Moreover nobody
6696             # would really write such long lines by hand since it is
6697             # hardly maintainable.  So if a line is longer that 1000
6698             # bytes (an arbitrary limit), assume it has been
6699             # automatically generated by some tools, and flatten the
6700             # variable definition.  Otherwise, keep the variable as it
6701             # as been input.
6702             $var_look = VAR_PRETTY if length ($last_var_value) >= 1000;
6704             if (!/\\$/)
6705               {
6706                 Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6707                                             $last_var_type, $cond,
6708                                             $last_var_value, $comment,
6709                                             $last_where, $var_look)
6710                   if $cond != FALSE;
6711                 $comment = $spacing = '';
6712                 $var_look = VAR_ASIS;
6713               }
6714         }
6715         elsif (/$INCLUDE_PATTERN/o)
6716         {
6717             my $path = $1;
6719             if ($path =~ s/^\$\(top_srcdir\)\///)
6720               {
6721                 push (@include_stack, "\$\(top_srcdir\)/$path");
6722                 # Distribute any included file.
6724                 # Always use the $(top_srcdir) prefix in DIST_COMMON,
6725                 # otherwise OSF make will implicitly copy the included
6726                 # file in the build tree during `make distdir' to satisfy
6727                 # the dependency.
6728                 # (subdircond2.test and subdircond3.test will fail.)
6729                 push_dist_common ("\$\(top_srcdir\)/$path");
6730               }
6731             else
6732               {
6733                 $path =~ s/\$\(srcdir\)\///;
6734                 push (@include_stack, "\$\(srcdir\)/$path");
6735                 # Always use the $(srcdir) prefix in DIST_COMMON,
6736                 # otherwise OSF make will implicitly copy the included
6737                 # file in the build tree during `make distdir' to satisfy
6738                 # the dependency.
6739                 # (subdircond2.test and subdircond3.test will fail.)
6740                 push_dist_common ("\$\(srcdir\)/$path");
6741                 $path = $relative_dir . "/" . $path if $relative_dir ne '.';
6742               }
6743             $where->push_context ("`$path' included from here");
6744             &read_am_file ($path, $where);
6745             $where->pop_context;
6746         }
6747         else
6748         {
6749             # This isn't an error; it is probably a continued rule.
6750             # In fact, this is what we assume.
6751             $prev_state = IN_RULE_DEF;
6752             check_variable_expansions ($_, $where);
6753             $output_trailer .= $comment . $spacing;
6754             my $cond = new Automake::Condition @cond_stack;
6755             $output_trailer .= $cond->subst_string;
6756             $output_trailer .= $_;
6757             $comment = $spacing = '';
6758             error $where, "`#' comment at start of rule is unportable"
6759               if $_ =~ /^\t\s*\#/;
6760         }
6762         $saw_bk = $new_saw_bk;
6763         $_ = $am_file->getline;
6764     }
6766     $output_trailer .= $comment;
6768     error ($where, "trailing backslash on last line")
6769       if $saw_bk;
6771     error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack"
6772                     : "too many conditionals closed in include file"))
6773       if "@saved_cond_stack" ne "@cond_stack";
6777 # define_standard_variables ()
6778 # ----------------------------
6779 # A helper for read_main_am_file which initializes configure variables
6780 # and variables from header-vars.am.
6781 sub define_standard_variables
6783   my $saved_output_vars = $output_vars;
6784   my ($comments, undef, $rules) =
6785     file_contents_internal (1, "$libdir/am/header-vars.am",
6786                             new Automake::Location);
6788   foreach my $var (sort keys %configure_vars)
6789     {
6790       &define_configure_variable ($var);
6791     }
6793   $output_vars .= $comments . $rules;
6796 # Read main am file.
6797 sub read_main_am_file
6799     my ($amfile) = @_;
6801     # This supports the strange variable tricks we are about to play.
6802     prog_error (macros_dump () . "variable defined before read_main_am_file")
6803       if (scalar (variables) > 0);
6805     # Generate copyright header for generated Makefile.in.
6806     # We do discard the output of predefined variables, handled below.
6807     $output_vars = ("# $in_file_name generated by automake "
6808                    . $VERSION . " from $am_file_name.\n");
6809     $output_vars .= '# ' . subst ('configure_input') . "\n";
6810     $output_vars .= $gen_copyright;
6812     # We want to predefine as many variables as possible.  This lets
6813     # the user set them with `+=' in Makefile.am.
6814     &define_standard_variables;
6816     # Read user file, which might override some of our values.
6817     &read_am_file ($amfile, new Automake::Location);
6822 ################################################################
6824 # $FLATTENED
6825 # &flatten ($STRING)
6826 # ------------------
6827 # Flatten the $STRING and return the result.
6828 sub flatten
6830   $_ = shift;
6832   s/\\\n//somg;
6833   s/\s+/ /g;
6834   s/^ //;
6835   s/ $//;
6837   return $_;
6841 # transform_token ($TOKEN, \%PAIRS, $KEY)
6842 # =======================================
6843 # Return the value associated to $KEY in %PAIRS, as used on $TOKEN
6844 # (which should be ?KEY? or any of the special %% requests)..
6845 sub transform_token ($$$)
6847   my ($token, $transform, $key) = @_;
6848   my $res = $transform->{$key};
6849   prog_error "Unknown key `$key' in `$token'" unless defined $res;
6850   return $res;
6854 # transform ($TOKEN, \%PAIRS)
6855 # ===========================
6856 # If ($TOKEN, $VAL) is in %PAIRS:
6857 #   - replaces %KEY% with $VAL,
6858 #   - enables/disables ?KEY? and ?!KEY?,
6859 #   - replaces %?KEY% with TRUE or FALSE.
6860 #   - replaces %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE% with
6861 #     IFTRUE / IFFALSE, as appropriate.
6862 sub transform ($$)
6864   my ($token, $transform) = @_;
6866   # %KEY%.
6867   # Must be before the following pattern to exclude the case
6868   # when there is neither IFTRUE nor IFFALSE.
6869   if ($token =~ /^%([\w\-]+)%$/)
6870     {
6871       return transform_token ($token, $transform, $1);
6872     }
6873   # %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE%.
6874   elsif ($token =~ /^%([\w\-]+)(?:\?([^?:%]+))?(?::([^?:%]+))?%$/)
6875     {
6876       return transform_token ($token, $transform, $1) ? ($2 || '') : ($3 || '');
6877     }
6878   # %?KEY%.
6879   elsif ($token =~ /^%\?([\w\-]+)%$/)
6880     {
6881       return transform_token ($token, $transform, $1) ? 'TRUE' : 'FALSE';
6882     }
6883   # ?KEY? and ?!KEY?.
6884   elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x)
6885     {
6886       my $neg = ($1 eq '!') ? 1 : 0;
6887       my $val = transform_token ($token, $transform, $2);
6888       return (!!$val == $neg) ? '##%' : '';
6889     }
6890   else
6891     {
6892       prog_error "Unknown request format: $token";
6893     }
6897 # @PARAGRAPHS
6898 # &make_paragraphs ($MAKEFILE, [%TRANSFORM])
6899 # ------------------------------------------
6900 # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
6901 # paragraphs.
6902 sub make_paragraphs ($%)
6904   my ($file, %transform) = @_;
6906   # Complete %transform with global options.
6907   # Note that %transform goes last, so it overrides global options.
6908   %transform = ('CYGNUS'      => !! option 'cygnus',
6909                  'MAINTAINER-MODE'
6910                  => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',
6912                  'XZ'          => !! option 'dist-xz',
6913                  'LZMA'        => !! option 'dist-lzma',
6914                  'BZIP2'       => !! option 'dist-bzip2',
6915                  'COMPRESS'    => !! option 'dist-tarZ',
6916                  'GZIP'        =>  ! option 'no-dist-gzip',
6917                  'SHAR'        => !! option 'dist-shar',
6918                  'ZIP'         => !! option 'dist-zip',
6920                  'INSTALL-INFO' =>  ! option 'no-installinfo',
6921                  'INSTALL-MAN'  =>  ! option 'no-installman',
6922                  'HAVE-MANS'    => !! var ('MANS'),
6923                  'CK-NEWS'      => !! option 'check-news',
6925                  'SUBDIRS'      => !! var ('SUBDIRS'),
6926                  'TOPDIR_P'     => $relative_dir eq '.',
6928                  'BUILD'    => ($seen_canonical >= AC_CANONICAL_BUILD),
6929                  'HOST'     => ($seen_canonical >= AC_CANONICAL_HOST),
6930                  'TARGET'   => ($seen_canonical >= AC_CANONICAL_TARGET),
6932                  'LIBTOOL'      => !! var ('LIBTOOL'),
6933                  'NONLIBTOOL'   => 1,
6934                  'FIRST'        => ! $transformed_files{$file},
6935                 %transform);
6937   $transformed_files{$file} = 1;
6938   $_ = $am_file_cache{$file};
6940   if (! defined $_)
6941     {
6942       verb "reading $file";
6943       # Swallow the whole file.
6944       my $fc_file = new Automake::XFile "< $file";
6945       my $saved_dollar_slash = $/;
6946       undef $/;
6947       $_ = $fc_file->getline;
6948       $/ = $saved_dollar_slash;
6949       $fc_file->close;
6951       # Remove ##-comments.
6952       # Besides we don't need more than two consecutive new-lines.
6953       s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom;
6955       $am_file_cache{$file} = $_;
6956     }
6958   # Substitute Automake template tokens.
6959   s/(?: % \?? [\w\-]+ %
6960       | % [\w\-]+ (?:\?[^?:%]+)? (?::[^?:%]+)? %
6961       | \? !? [\w\-]+ \?
6962     )/transform($&, \%transform)/gex;
6963   # transform() may have added some ##%-comments to strip.
6964   # (we use `##%' instead of `##' so we can distinguish ##%##%##% from
6965   # ####### and do not remove the latter.)
6966   s/^[ \t]*(?:##%)+.*\n//gm;
6968   # Split at unescaped new lines.
6969   my @lines = split (/(?<!\\)\n/, $_);
6970   my @res;
6972   while (defined ($_ = shift @lines))
6973     {
6974       my $paragraph = $_;
6975       # If we are a rule, eat as long as we start with a tab.
6976       if (/$RULE_PATTERN/smo)
6977         {
6978           while (defined ($_ = shift @lines) && $_ =~ /^\t/)
6979             {
6980               $paragraph .= "\n$_";
6981             }
6982           unshift (@lines, $_);
6983         }
6985       # If we are a comments, eat as much comments as you can.
6986       elsif (/$COMMENT_PATTERN/smo)
6987         {
6988           while (defined ($_ = shift @lines)
6989                  && $_ =~ /$COMMENT_PATTERN/smo)
6990             {
6991               $paragraph .= "\n$_";
6992             }
6993           unshift (@lines, $_);
6994         }
6996       push @res, $paragraph;
6997     }
6999   return @res;
7004 # ($COMMENT, $VARIABLES, $RULES)
7005 # &file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM])
7006 # -------------------------------------------------------------
7007 # Return contents of a file from $libdir/am, automatically skipping
7008 # macros or rules which are already known. $IS_AM iff the caller is
7009 # reading an Automake file (as opposed to the user's Makefile.am).
7010 sub file_contents_internal ($$$%)
7012     my ($is_am, $file, $where, %transform) = @_;
7014     $where->set ($file);
7016     my $result_vars = '';
7017     my $result_rules = '';
7018     my $comment = '';
7019     my $spacing = '';
7021     # The following flags are used to track rules spanning across
7022     # multiple paragraphs.
7023     my $is_rule = 0;            # 1 if we are processing a rule.
7024     my $discard_rule = 0;       # 1 if the current rule should not be output.
7026     # We save the conditional stack on entry, and then check to make
7027     # sure it is the same on exit.  This lets us conditionally include
7028     # other files.
7029     my @saved_cond_stack = @cond_stack;
7030     my $cond = new Automake::Condition (@cond_stack);
7032     foreach (make_paragraphs ($file, %transform))
7033     {
7034         # FIXME: no line number available.
7035         $where->set ($file);
7037         # Sanity checks.
7038         error $where, "blank line following trailing backslash:\n$_"
7039           if /\\$/;
7040         error $where, "comment following trailing backslash:\n$_"
7041           if /\\#/;
7043         if (/^$/)
7044         {
7045             $is_rule = 0;
7046             # Stick empty line before the incoming macro or rule.
7047             $spacing = "\n";
7048         }
7049         elsif (/$COMMENT_PATTERN/mso)
7050         {
7051             $is_rule = 0;
7052             # Stick comments before the incoming macro or rule.
7053             $comment = "$_\n";
7054         }
7056         # Handle inclusion of other files.
7057         elsif (/$INCLUDE_PATTERN/o)
7058         {
7059             if ($cond != FALSE)
7060               {
7061                 my $file = ($is_am ? "$libdir/am/" : '') . $1;
7062                 $where->push_context ("`$file' included from here");
7063                 # N-ary `.=' fails.
7064                 my ($com, $vars, $rules)
7065                   = file_contents_internal ($is_am, $file, $where, %transform);
7066                 $where->pop_context;
7067                 $comment .= $com;
7068                 $result_vars .= $vars;
7069                 $result_rules .= $rules;
7070               }
7071         }
7073         # Handling the conditionals.
7074         elsif (/$IF_PATTERN/o)
7075           {
7076             $cond = cond_stack_if ($1, $2, $file);
7077           }
7078         elsif (/$ELSE_PATTERN/o)
7079           {
7080             $cond = cond_stack_else ($1, $2, $file);
7081           }
7082         elsif (/$ENDIF_PATTERN/o)
7083           {
7084             $cond = cond_stack_endif ($1, $2, $file);
7085           }
7087         # Handling rules.
7088         elsif (/$RULE_PATTERN/mso)
7089         {
7090           $is_rule = 1;
7091           $discard_rule = 0;
7092           # Separate relationship from optional actions: the first
7093           # `new-line tab" not preceded by backslash (continuation
7094           # line).
7095           my $paragraph = $_;
7096           /^(.*?)(?:(?<!\\)\n(\t.*))?$/s;
7097           my ($relationship, $actions) = ($1, $2 || '');
7099           # Separate targets from dependencies: the first colon.
7100           $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
7101           my ($targets, $dependencies) = ($1, $2);
7102           # Remove the escaped new lines.
7103           # I don't know why, but I have to use a tmp $flat_deps.
7104           my $flat_deps = &flatten ($dependencies);
7105           my @deps = split (' ', $flat_deps);
7107           foreach (split (' ', $targets))
7108             {
7109               # FIXME: 1. We are not robust to people defining several targets
7110               # at once, only some of them being in %dependencies.  The
7111               # actions from the targets in %dependencies are usually generated
7112               # from the content of %actions, but if some targets in $targets
7113               # are not in %dependencies the ELSE branch will output
7114               # a rule for all $targets (i.e. the targets which are both
7115               # in %dependencies and $targets will have two rules).
7117               # FIXME: 2. The logic here is not able to output a
7118               # multi-paragraph rule several time (e.g. for each condition
7119               # it is defined for) because it only knows the first paragraph.
7121               # FIXME: 3. We are not robust to people defining a subset
7122               # of a previously defined "multiple-target" rule.  E.g.
7123               # `foo:' after `foo bar:'.
7125               # Output only if not in FALSE.
7126               if (defined $dependencies{$_} && $cond != FALSE)
7127                 {
7128                   &depend ($_, @deps);
7129                   register_action ($_, $actions);
7130                 }
7131               else
7132                 {
7133                   # Free-lance dependency.  Output the rule for all the
7134                   # targets instead of one by one.
7135                   my @undefined_conds =
7136                     Automake::Rule::define ($targets, $file,
7137                                             $is_am ? RULE_AUTOMAKE : RULE_USER,
7138                                             $cond, $where);
7139                   for my $undefined_cond (@undefined_conds)
7140                     {
7141                       my $condparagraph = $paragraph;
7142                       $condparagraph =~ s/^/$undefined_cond->subst_string/gme;
7143                       $result_rules .= "$spacing$comment$condparagraph\n";
7144                     }
7145                   if (scalar @undefined_conds == 0)
7146                     {
7147                       # Remember to discard next paragraphs
7148                       # if they belong to this rule.
7149                       # (but see also FIXME: #2 above.)
7150                       $discard_rule = 1;
7151                     }
7152                   $comment = $spacing = '';
7153                   last;
7154                 }
7155             }
7156         }
7158         elsif (/$ASSIGNMENT_PATTERN/mso)
7159         {
7160             my ($var, $type, $val) = ($1, $2, $3);
7161             error $where, "variable `$var' with trailing backslash"
7162               if /\\$/;
7164             $is_rule = 0;
7166             Automake::Variable::define ($var,
7167                                         $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE,
7168                                         $type, $cond, $val, $comment, $where,
7169                                         VAR_ASIS)
7170               if $cond != FALSE;
7172             $comment = $spacing = '';
7173         }
7174         else
7175         {
7176             # This isn't an error; it is probably some tokens which
7177             # configure is supposed to replace, such as `@SET-MAKE@',
7178             # or some part of a rule cut by an if/endif.
7179             if (! $cond->false && ! ($is_rule && $discard_rule))
7180               {
7181                 s/^/$cond->subst_string/gme;
7182                 $result_rules .= "$spacing$comment$_\n";
7183               }
7184             $comment = $spacing = '';
7185         }
7186     }
7188     error ($where, @cond_stack ?
7189            "unterminated conditionals: @cond_stack" :
7190            "too many conditionals closed in include file")
7191       if "@saved_cond_stack" ne "@cond_stack";
7193     return ($comment, $result_vars, $result_rules);
7197 # $CONTENTS
7198 # &file_contents ($BASENAME, $WHERE, [%TRANSFORM])
7199 # ------------------------------------------------
7200 # Return contents of a file from $libdir/am, automatically skipping
7201 # macros or rules which are already known.
7202 sub file_contents ($$%)
7204     my ($basename, $where, %transform) = @_;
7205     my ($comments, $variables, $rules) =
7206       file_contents_internal (1, "$libdir/am/$basename.am", $where,
7207                               %transform);
7208     return "$comments$variables$rules";
7212 # @PREFIX
7213 # &am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)
7214 # -----------------------------------------------------
7215 # Find all variable prefixes that are used for install directories.  A
7216 # prefix `zar' qualifies iff:
7218 # * `zardir' is a variable.
7219 # * `zar_PRIMARY' is a variable.
7221 # As a side effect, it looks for misspellings.  It is an error to have
7222 # a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
7223 # "bni_PROGRAMS".  However, unusual prefixes are allowed if a variable
7224 # of the same name (with "dir" appended) exists.  For instance, if the
7225 # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
7226 # This is to provide a little extra flexibility in those cases which
7227 # need it.
7228 sub am_primary_prefixes ($$@)
7230   my ($primary, $can_dist, @prefixes) = @_;
7232   local $_;
7233   my %valid = map { $_ => 0 } @prefixes;
7234   $valid{'EXTRA'} = 0;
7235   foreach my $var (variables $primary)
7236     {
7237       # Automake is allowed to define variables that look like primaries
7238       # but which aren't.  E.g. INSTALL_sh_DATA.
7239       # Autoconf can also define variables like INSTALL_DATA, so
7240       # ignore all configure variables (at least those which are not
7241       # redefined in Makefile.am).
7242       # FIXME: We should make sure that these variables are not
7243       # conditionally defined (or else adjust the condition below).
7244       my $def = $var->def (TRUE);
7245       next if $def && $def->owner != VAR_MAKEFILE;
7247       my $varname = $var->name;
7249       if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
7250         {
7251           my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
7252           if ($dist ne '' && ! $can_dist)
7253             {
7254               err_var ($var,
7255                        "invalid variable `$varname': `dist' is forbidden");
7256             }
7257           # Standard directories must be explicitly allowed.
7258           elsif (! defined $valid{$X} && exists $standard_prefix{$X})
7259             {
7260               err_var ($var,
7261                        "`${X}dir' is not a legitimate directory " .
7262                        "for `$primary'");
7263             }
7264           # A not explicitly valid directory is allowed if Xdir is defined.
7265           elsif (! defined $valid{$X} &&
7266                  $var->requires_variables ("`$varname' is used", "${X}dir"))
7267             {
7268               # Nothing to do.  Any error message has been output
7269               # by $var->requires_variables.
7270             }
7271           else
7272             {
7273               # Ensure all extended prefixes are actually used.
7274               $valid{"$base$dist$X"} = 1;
7275             }
7276         }
7277       else
7278         {
7279           prog_error "unexpected variable name: $varname";
7280         }
7281     }
7283   # Return only those which are actually defined.
7284   return sort grep { var ($_ . '_' . $primary) } keys %valid;
7288 # Handle `where_HOW' variable magic.  Does all lookups, generates
7289 # install code, and possibly generates code to define the primary
7290 # variable.  The first argument is the name of the .am file to munge,
7291 # the second argument is the primary variable (e.g. HEADERS), and all
7292 # subsequent arguments are possible installation locations.
7294 # Returns list of [$location, $value] pairs, where
7295 # $value's are the values in all where_HOW variable, and $location
7296 # there associated location (the place here their parent variables were
7297 # defined).
7299 # FIXME: this should be rewritten to be cleaner.  It should be broken
7300 # up into multiple functions.
7302 # Usage is: am_install_var (OPTION..., file, HOW, where...)
7303 sub am_install_var
7305   my (@args) = @_;
7307   my $do_require = 1;
7308   my $can_dist = 0;
7309   my $default_dist = 0;
7310   while (@args)
7311     {
7312       if ($args[0] eq '-noextra')
7313         {
7314           $do_require = 0;
7315         }
7316       elsif ($args[0] eq '-candist')
7317         {
7318           $can_dist = 1;
7319         }
7320       elsif ($args[0] eq '-defaultdist')
7321         {
7322           $default_dist = 1;
7323           $can_dist = 1;
7324         }
7325       elsif ($args[0] !~ /^-/)
7326         {
7327           last;
7328         }
7329       shift (@args);
7330     }
7332   my ($file, $primary, @prefix) = @args;
7334   # Now that configure substitutions are allowed in where_HOW
7335   # variables, it is an error to actually define the primary.  We
7336   # allow `JAVA', as it is customarily used to mean the Java
7337   # interpreter.  This is but one of several Java hacks.  Similarly,
7338   # `PYTHON' is customarily used to mean the Python interpreter.
7339   reject_var $primary, "`$primary' is an anachronism"
7340     unless $primary eq 'JAVA' || $primary eq 'PYTHON';
7342   # Get the prefixes which are valid and actually used.
7343   @prefix = am_primary_prefixes ($primary, $can_dist, @prefix);
7345   # If a primary includes a configure substitution, then the EXTRA_
7346   # form is required.  Otherwise we can't properly do our job.
7347   my $require_extra;
7349   my @used = ();
7350   my @result = ();
7352   foreach my $X (@prefix)
7353     {
7354       my $nodir_name = $X;
7355       my $one_name = $X . '_' . $primary;
7356       my $one_var = var $one_name;
7358       my $strip_subdir = 1;
7359       # If subdir prefix should be preserved, do so.
7360       if ($nodir_name =~ /^nobase_/)
7361         {
7362           $strip_subdir = 0;
7363           $nodir_name =~ s/^nobase_//;
7364         }
7366       # If files should be distributed, do so.
7367       my $dist_p = 0;
7368       if ($can_dist)
7369         {
7370           $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
7371                      || (! $default_dist && $nodir_name =~ /^dist_/));
7372           $nodir_name =~ s/^(dist|nodist)_//;
7373         }
7376       # Use the location of the currently processed variable.
7377       # We are not processing a particular condition, so pick the first
7378       # available.
7379       my $tmpcond = $one_var->conditions->one_cond;
7380       my $where = $one_var->rdef ($tmpcond)->location->clone;
7382       # Append actual contents of where_PRIMARY variable to
7383       # @result, skipping @substitutions@.
7384       foreach my $locvals ($one_var->value_as_list_recursive (location => 1))
7385         {
7386           my ($loc, $value) = @$locvals;
7387           # Skip configure substitutions.
7388           if ($value =~ /^\@.*\@$/)
7389             {
7390               if ($nodir_name eq 'EXTRA')
7391                 {
7392                   error ($where,
7393                          "`$one_name' contains configure substitution, "
7394                          . "but shouldn't");
7395                 }
7396               # Check here to make sure variables defined in
7397               # configure.ac do not imply that EXTRA_PRIMARY
7398               # must be defined.
7399               elsif (! defined $configure_vars{$one_name})
7400                 {
7401                   $require_extra = $one_name
7402                     if $do_require;
7403                 }
7404             }
7405           else
7406             {
7407               push (@result, $locvals);
7408             }
7409         }
7410       # A blatant hack: we rewrite each _PROGRAMS primary to include
7411       # EXEEXT.
7412       append_exeext { 1 } $one_name
7413         if $primary eq 'PROGRAMS';
7414       # "EXTRA" shouldn't be used when generating clean targets,
7415       # all, or install targets.  We used to warn if EXTRA_FOO was
7416       # defined uselessly, but this was annoying.
7417       next
7418         if $nodir_name eq 'EXTRA';
7420       if ($nodir_name eq 'check')
7421         {
7422           push (@check, '$(' . $one_name . ')');
7423         }
7424       else
7425         {
7426           push (@used, '$(' . $one_name . ')');
7427         }
7429       # Is this to be installed?
7430       my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
7432       # If so, with install-exec? (or install-data?).
7433       my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o);
7435       my $check_options_p = $install_p && !! option 'std-options';
7437       # Use the location of the currently processed variable as context.
7438       $where->push_context ("while processing `$one_name'");
7440       # The variable containing all files to distribute.
7441       my $distvar = "\$($one_name)";
7442       $distvar = shadow_unconditionally ($one_name, $where)
7443         if ($dist_p && $one_var->has_conditional_contents);
7445       # Singular form of $PRIMARY.
7446       (my $one_primary = $primary) =~ s/S$//;
7447       $output_rules .= &file_contents ($file, $where,
7448                                        PRIMARY     => $primary,
7449                                        ONE_PRIMARY => $one_primary,
7450                                        DIR         => $X,
7451                                        NDIR        => $nodir_name,
7452                                        BASE        => $strip_subdir,
7454                                        EXEC      => $exec_p,
7455                                        INSTALL   => $install_p,
7456                                        DIST      => $dist_p,
7457                                        DISTVAR   => $distvar,
7458                                        'CK-OPTS' => $check_options_p);
7459     }
7461   # The JAVA variable is used as the name of the Java interpreter.
7462   # The PYTHON variable is used as the name of the Python interpreter.
7463   if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
7464     {
7465       # Define it.
7466       define_pretty_variable ($primary, TRUE, INTERNAL, @used);
7467       $output_vars .= "\n";
7468     }
7470   err_var ($require_extra,
7471            "`$require_extra' contains configure substitution,\n"
7472            . "but `EXTRA_$primary' not defined")
7473     if ($require_extra && ! var ('EXTRA_' . $primary));
7475   # Push here because PRIMARY might be configure time determined.
7476   push (@all, '$(' . $primary . ')')
7477     if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
7479   # Make the result unique.  This lets the user use conditionals in
7480   # a natural way, but still lets us program lazily -- we don't have
7481   # to worry about handling a particular object more than once.
7482   # We will keep only one location per object.
7483   my %result = ();
7484   for my $pair (@result)
7485     {
7486       my ($loc, $val) = @$pair;
7487       $result{$val} = $loc;
7488     }
7489   my @l = sort keys %result;
7490   return map { [$result{$_}->clone, $_] } @l;
7494 ################################################################
7496 # Each key in this hash is the name of a directory holding a
7497 # Makefile.in.  These variables are local to `is_make_dir'.
7498 my %make_dirs = ();
7499 my $make_dirs_set = 0;
7501 sub is_make_dir
7503     my ($dir) = @_;
7504     if (! $make_dirs_set)
7505     {
7506         foreach my $iter (@configure_input_files)
7507         {
7508             $make_dirs{dirname ($iter)} = 1;
7509         }
7510         # We also want to notice Makefile.in's.
7511         foreach my $iter (@other_input_files)
7512         {
7513             if ($iter =~ /Makefile\.in$/)
7514             {
7515                 $make_dirs{dirname ($iter)} = 1;
7516             }
7517         }
7518         $make_dirs_set = 1;
7519     }
7520     return defined $make_dirs{$dir};
7523 ################################################################
7525 # Find the aux dir.  This should match the algorithm used by
7526 # ./configure. (See the Autoconf documentation for for
7527 # AC_CONFIG_AUX_DIR.)
7528 sub locate_aux_dir ()
7530   if (! $config_aux_dir_set_in_configure_ac)
7531     {
7532       # The default auxiliary directory is the first
7533       # of ., .., or ../.. that contains install-sh.
7534       # Assume . if install-sh doesn't exist yet.
7535       for my $dir (qw (. .. ../..))
7536         {
7537           if (-f "$dir/install-sh")
7538             {
7539               $config_aux_dir = $dir;
7540               last;
7541             }
7542         }
7543       $config_aux_dir = '.' unless $config_aux_dir;
7544     }
7545   # Avoid unsightly '/.'s.
7546   $am_config_aux_dir =
7547     '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
7548   $am_config_aux_dir =~ s,/*$,,;
7552 # &maybe_push_required_file ($DIR, $FILE, $FULLFILE)
7553 # --------------------------------------------------
7554 # See if we want to push this file onto dist_common.  This function
7555 # encodes the rules for deciding when to do so.
7556 sub maybe_push_required_file
7558   my ($dir, $file, $fullfile) = @_;
7560   if ($dir eq $relative_dir)
7561     {
7562       push_dist_common ($file);
7563       return 1;
7564     }
7565   elsif ($relative_dir eq '.' && ! &is_make_dir ($dir))
7566     {
7567       # If we are doing the topmost directory, and the file is in a
7568       # subdir which does not have a Makefile, then we distribute it
7569       # here.
7571       # If a required file is above the source tree, it is important
7572       # to prefix it with `$(srcdir)' so that no VPATH search is
7573       # performed.  Otherwise problems occur with Make implementations
7574       # that rewrite and simplify rules whose dependencies are found in a
7575       # VPATH location.  Here is an example with OSF1/Tru64 Make.
7576       #
7577       #   % cat Makefile
7578       #   VPATH = sub
7579       #   distdir: ../a
7580       #           echo ../a
7581       #   % ls
7582       #   Makefile a
7583       #   % make
7584       #   echo a
7585       #   a
7586       #
7587       # Dependency `../a' was found in `sub/../a', but this make
7588       # implementation simplified it as `a'.  (Note that the sub/
7589       # directory does not even exist.)
7590       #
7591       # This kind of VPATH rewriting seems hard to cancel.  The
7592       # distdir.am hack against VPATH rewriting works only when no
7593       # simplification is done, i.e., for dependencies which are in
7594       # subdirectories, not in enclosing directories.  Hence, in
7595       # the latter case we use a full path to make sure no VPATH
7596       # search occurs.
7597       $fullfile = '$(srcdir)/' . $fullfile
7598         if $dir =~ m,^\.\.(?:$|/),;
7600       push_dist_common ($fullfile);
7601       return 1;
7602     }
7603   return 0;
7607 # If a file name appears as a key in this hash, then it has already
7608 # been checked for.  This allows us not to report the same error more
7609 # than once.
7610 my %required_file_not_found = ();
7612 # &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES)
7613 # --------------------------------------------------------------
7614 # Verify that the file must exist in $DIRECTORY, or install it.
7615 # $MYSTRICT is the strictness level at which this file becomes required.
7616 sub require_file_internal ($$$@)
7618   my ($where, $mystrict, $dir, @files) = @_;
7620   foreach my $file (@files)
7621     {
7622       my $fullfile = "$dir/$file";
7623       my $found_it = 0;
7624       my $dangling_sym = 0;
7626       if (-l $fullfile && ! -f $fullfile)
7627         {
7628           $dangling_sym = 1;
7629         }
7630       elsif (dir_has_case_matching_file ($dir, $file))
7631         {
7632           $found_it = 1;
7633           maybe_push_required_file ($dir, $file, $fullfile);
7634         }
7636       # `--force-missing' only has an effect if `--add-missing' is
7637       # specified.
7638       if ($found_it && (! $add_missing || ! $force_missing))
7639         {
7640           next;
7641         }
7642       else
7643         {
7644           # If we've already looked for it, we're done.  You might
7645           # wonder why we don't do this before searching for the
7646           # file.  If we do that, then something like
7647           # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
7648           # DIST_COMMON.
7649           if (! $found_it)
7650             {
7651               next if defined $required_file_not_found{$fullfile};
7652               $required_file_not_found{$fullfile} = 1;
7653             }
7655           if ($strictness >= $mystrict)
7656             {
7657               if ($dangling_sym && $add_missing)
7658                 {
7659                   unlink ($fullfile);
7660                 }
7662               my $trailer = '';
7663               my $trailer2 = '';
7664               my $suppress = 0;
7666               # Only install missing files according to our desired
7667               # strictness level.
7668               my $message = "required file `$fullfile' not found";
7669               if ($add_missing)
7670                 {
7671                   if (-f "$libdir/$file")
7672                     {
7673                       $suppress = 1;
7675                       # Install the missing file.  Symlink if we
7676                       # can, copy if we must.  Note: delete the file
7677                       # first, in case it is a dangling symlink.
7678                       $message = "installing `$fullfile'";
7680                       # The license file should not be volatile.
7681                       if ($file eq "COPYING")
7682                         {
7683                           $message .= " using GNU General Public License v3 file";
7684                           $trailer2 = "\n    Consider adding the COPYING file"
7685                                     . " to the version control system"
7686                                     . "\n    for your code, to avoid questions"
7687                                     . " about which license your project uses.";
7688                         }
7690                       # Windows Perl will hang if we try to delete a
7691                       # file that doesn't exist.
7692                       unlink ($fullfile) if -f $fullfile;
7693                       if ($symlink_exists && ! $copy_missing)
7694                         {
7695                           if (! symlink ("$libdir/$file", $fullfile))
7696                             {
7697                               $suppress = 0;
7698                               $trailer = "; error while making link: $!";
7699                             }
7700                         }
7701                       elsif (system ('cp', "$libdir/$file", $fullfile))
7702                         {
7703                           $suppress = 0;
7704                           $trailer = "\n    error while copying";
7705                         }
7706                       set_dir_cache_file ($dir, $file);
7707                     }
7709                   if (! maybe_push_required_file (dirname ($fullfile),
7710                                                   $file, $fullfile))
7711                     {
7712                       if (! $found_it && ! $automake_will_process_aux_dir)
7713                         {
7714                           # We have added the file but could not push it
7715                           # into DIST_COMMON, probably because this is
7716                           # an auxiliary file and we are not processing
7717                           # the top level Makefile.  Furthermore Automake
7718                           # hasn't been asked to create the Makefile.in
7719                           # that distributes the aux dir files.
7720                           error ($where, 'Please make a full run of automake'
7721                                  . " so $fullfile gets distributed.");
7722                         }
7723                     }
7724                 }
7725               else
7726                 {
7727                   $trailer = "\n  `automake --add-missing' can install `$file'"
7728                     if -f "$libdir/$file";
7729                 }
7731               # If --force-missing was specified, and we have
7732               # actually found the file, then do nothing.
7733               next
7734                 if $found_it && $force_missing;
7736               # If we couldn't install the file, but it is a target in
7737               # the Makefile, don't print anything.  This allows files
7738               # like README, AUTHORS, or THANKS to be generated.
7739               next
7740                 if !$suppress && rule $file;
7742               msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2");
7743             }
7744         }
7745     }
7748 # &require_file ($WHERE, $MYSTRICT, @FILES)
7749 # -----------------------------------------
7750 sub require_file ($$@)
7752     my ($where, $mystrict, @files) = @_;
7753     require_file_internal ($where, $mystrict, $relative_dir, @files);
7756 # &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7757 # -----------------------------------------------------------
7758 sub require_file_with_macro ($$$@)
7760     my ($cond, $macro, $mystrict, @files) = @_;
7761     $macro = rvar ($macro) unless ref $macro;
7762     require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7765 # &require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7766 # ----------------------------------------------------------------
7767 # Require an AC_LIBSOURCEd file.  If AC_CONFIG_LIBOBJ_DIR was called, it
7768 # must be in that directory.  Otherwise expect it in the current directory.
7769 sub require_libsource_with_macro ($$$@)
7771     my ($cond, $macro, $mystrict, @files) = @_;
7772     $macro = rvar ($macro) unless ref $macro;
7773     if ($config_libobj_dir)
7774       {
7775         require_file_internal ($macro->rdef ($cond)->location, $mystrict,
7776                                $config_libobj_dir, @files);
7777       }
7778     else
7779       {
7780         require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7781       }
7784 # Queue to push require_conf_file requirements to.
7785 my $required_conf_file_queue;
7787 # &queue_required_conf_file ($QUEUE, $KEY, $DIR, $WHERE, $MYSTRICT, @FILES)
7788 # -------------------------------------------------------------------------
7789 sub queue_required_conf_file ($$$$@)
7791     my ($queue, $key, $dir, $where, $mystrict, @files) = @_;
7792     my @serial_loc;
7793     if (ref $where)
7794       {
7795         @serial_loc = (QUEUE_LOCATION, $where->serialize ());
7796       }
7797     else
7798       {
7799         @serial_loc = (QUEUE_STRING, $where);
7800       }
7801     $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files);
7804 # &require_queued_conf_file ($QUEUE)
7805 # ----------------------------------
7806 sub require_queued_conf_file ($)
7808     my ($queue) = @_;
7809     my $where;
7810     my $dir = $queue->dequeue ();
7811     my $loc_key = $queue->dequeue ();
7812     if ($loc_key eq QUEUE_LOCATION)
7813       {
7814         $where = Automake::Location::deserialize ($queue);
7815       }
7816     elsif ($loc_key eq QUEUE_STRING)
7817       {
7818         $where = $queue->dequeue ();
7819       }
7820     else
7821       {
7822         prog_error "unexpected key $loc_key";
7823       }
7824     my $mystrict = $queue->dequeue ();
7825     my $nfiles = $queue->dequeue ();
7826     my @files;
7827     push @files, $queue->dequeue ()
7828       foreach (1 .. $nfiles);
7830     # Dequeuing happens outside of per-makefile context, so we have to
7831     # set the variables used by require_file_internal and the functions
7832     # it calls.  Gross!
7833     $relative_dir = $dir;
7834     require_file_internal ($where, $mystrict, $config_aux_dir, @files);
7837 # &require_conf_file ($WHERE, $MYSTRICT, @FILES)
7838 # ----------------------------------------------
7839 # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR;
7840 # worker threads may queue up the action to be serialized by the master.
7842 # FIXME: this seriously relies on the semantics of require_file_internal
7843 # and maybe_push_required_file, in that we exploit the fact that only the
7844 # contents of the last handled output file may be impacted (which in turn
7845 # is dealt with by the master thread).
7846 sub require_conf_file ($$@)
7848     my ($where, $mystrict, @files) = @_;
7849     if (defined $required_conf_file_queue)
7850       {
7851         queue_required_conf_file ($required_conf_file_queue, QUEUE_CONF_FILE,
7852                                   $relative_dir, $where, $mystrict, @files);
7853       }
7854     else
7855       {
7856         require_file_internal ($where, $mystrict, $config_aux_dir, @files);
7857       }
7861 # &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7862 # ----------------------------------------------------------------
7863 sub require_conf_file_with_macro ($$$@)
7865     my ($cond, $macro, $mystrict, @files) = @_;
7866     require_conf_file (rvar ($macro)->rdef ($cond)->location,
7867                        $mystrict, @files);
7870 ################################################################
7872 # &require_build_directory ($DIRECTORY)
7873 # ------------------------------------
7874 # Emit rules to create $DIRECTORY if needed, and return
7875 # the file that any target requiring this directory should be made
7876 # dependent upon.
7877 # We don't want to emit the rule twice, and want to reuse it
7878 # for directories with equivalent names (e.g., `foo/bar' and `./foo//bar').
7879 sub require_build_directory ($)
7881   my $directory = shift;
7883   return $directory_map{$directory} if exists $directory_map{$directory};
7885   my $cdir = File::Spec->canonpath ($directory);
7887   if (exists $directory_map{$cdir})
7888     {
7889       my $stamp = $directory_map{$cdir};
7890       $directory_map{$directory} = $stamp;
7891       return $stamp;
7892     }
7894   my $dirstamp = "$cdir/\$(am__dirstamp)";
7896   $directory_map{$directory} = $dirstamp;
7897   $directory_map{$cdir} = $dirstamp;
7899   # Set a variable for the dirstamp basename.
7900   define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
7901                           '$(am__leading_dot)dirstamp');
7903   # Directory must be removed by `make distclean'.
7904   $clean_files{$dirstamp} = DIST_CLEAN;
7906   $output_rules .= ("$dirstamp:\n"
7907                     . "\t\@\$(MKDIR_P) $directory\n"
7908                     . "\t\@: > $dirstamp\n");
7910   return $dirstamp;
7913 # &require_build_directory_maybe ($FILE)
7914 # --------------------------------------
7915 # If $FILE lies in a subdirectory, emit a rule to create this
7916 # directory and return the file that $FILE should be made
7917 # dependent upon.  Otherwise, just return the empty string.
7918 sub require_build_directory_maybe ($)
7920     my $file = shift;
7921     my $directory = dirname ($file);
7923     if ($directory ne '.')
7924     {
7925         return require_build_directory ($directory);
7926     }
7927     else
7928     {
7929         return '';
7930     }
7933 ################################################################
7935 # Push a list of files onto dist_common.
7936 sub push_dist_common
7938   prog_error "push_dist_common run after handle_dist"
7939     if $handle_dist_run;
7940   Automake::Variable::define ('DIST_COMMON', VAR_AUTOMAKE, '+', TRUE, "@_",
7941                               '', INTERNAL, VAR_PRETTY);
7945 ################################################################
7947 # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN)
7948 # ----------------------------------------------
7949 # Generate a Makefile.in given the name of the corresponding Makefile and
7950 # the name of the file output by config.status.
7951 sub generate_makefile ($$)
7953   my ($makefile_am, $makefile_in) = @_;
7955   # Reset all the Makefile.am related variables.
7956   initialize_per_input;
7958   # AUTOMAKE_OPTIONS can contains -W flags to disable or enable
7959   # warnings for this file.  So hold any warning issued before
7960   # we have processed AUTOMAKE_OPTIONS.
7961   buffer_messages ('warning');
7963   # Name of input file ("Makefile.am") and output file
7964   # ("Makefile.in").  These have no directory components.
7965   $am_file_name = basename ($makefile_am);
7966   $in_file_name = basename ($makefile_in);
7968   # $OUTPUT is encoded.  If it contains a ":" then the first element
7969   # is the real output file, and all remaining elements are input
7970   # files.  We don't scan or otherwise deal with these input files,
7971   # other than to mark them as dependencies.  See
7972   # &scan_autoconf_files for details.
7973   my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in});
7975   $relative_dir = dirname ($makefile);
7976   $am_relative_dir = dirname ($makefile_am);
7977   $topsrcdir = backname ($relative_dir);
7979   read_main_am_file ($makefile_am);
7980   if (handle_options)
7981     {
7982       # Process buffered warnings.
7983       flush_messages;
7984       # Fatal error.  Just return, so we can continue with next file.
7985       return;
7986     }
7987   # Process buffered warnings.
7988   flush_messages;
7990   # There are a few install-related variables that you should not define.
7991   foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
7992     {
7993       my $v = var $var;
7994       if ($v)
7995         {
7996           my $def = $v->def (TRUE);
7997           prog_error "$var not defined in condition TRUE"
7998             unless $def;
7999           reject_var $var, "`$var' should not be defined"
8000             if $def->owner != VAR_AUTOMAKE;
8001         }
8002     }
8004   # Catch some obsolete variables.
8005   msg_var ('obsolete', 'INCLUDES',
8006            "`INCLUDES' is the old name for `AM_CPPFLAGS' (or `*_CPPFLAGS')")
8007     if var ('INCLUDES');
8009   # Must do this after reading .am file.
8010   define_variable ('subdir', $relative_dir, INTERNAL);
8012   # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that
8013   # recursive rules are enabled.
8014   define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '')
8015     if var 'DIST_SUBDIRS' && ! var 'SUBDIRS';
8017   # Check first, because we might modify some state.
8018   check_cygnus;
8019   check_gnu_standards;
8020   check_gnits_standards;
8022   handle_configure ($makefile_am, $makefile_in, $makefile, @inputs);
8023   handle_gettext;
8024   handle_libraries;
8025   handle_ltlibraries;
8026   handle_programs;
8027   handle_scripts;
8029   # These must be run after all the sources are scanned.  They
8030   # use variables defined by &handle_libraries, &handle_ltlibraries,
8031   # or &handle_programs.
8032   handle_compile;
8033   handle_languages;
8034   handle_libtool;
8036   # Variables used by distdir.am and tags.am.
8037   define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources);
8038   if (! option 'no-dist')
8039     {
8040       define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources);
8041     }
8043   handle_multilib;
8044   handle_texinfo;
8045   handle_emacs_lisp;
8046   handle_python;
8047   handle_java;
8048   handle_man_pages;
8049   handle_data;
8050   handle_headers;
8051   handle_subdirs;
8052   handle_tags;
8053   handle_minor_options;
8054   # Must come after handle_programs so that %known_programs is up-to-date.
8055   handle_tests;
8057   # This must come after most other rules.
8058   handle_dist;
8060   handle_footer;
8061   do_check_merge_target;
8062   handle_all ($makefile);
8064   # FIXME: Gross!
8065   if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8066     {
8067       $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
8068     }
8069   if (var ('nobase_lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8070     {
8071       $output_rules .= "install-binPROGRAMS: install-nobase_libLTLIBRARIES\n\n";
8072     }
8074   handle_install;
8075   handle_clean ($makefile);
8076   handle_factored_dependencies;
8078   # Comes last, because all the above procedures may have
8079   # defined or overridden variables.
8080   $output_vars .= output_variables;
8082   check_typos;
8084   my ($out_file) = $output_directory . '/' . $makefile_in;
8086   if ($exit_code != 0)
8087     {
8088       verb "not writing $out_file because of earlier errors";
8089       return;
8090     }
8092   if (! -d ($output_directory . '/' . $am_relative_dir))
8093     {
8094       mkdir ($output_directory . '/' . $am_relative_dir, 0755);
8095     }
8097   # We make sure that `all:' is the first target.
8098   my $output =
8099     "$output_vars$output_all$output_header$output_rules$output_trailer";
8101   # Decide whether we must update the output file or not.
8102   # We have to update in the following situations.
8103   #  * $force_generation is set.
8104   #  * any of the output dependencies is younger than the output
8105   #  * the contents of the output is different (this can happen
8106   #    if the project has been populated with a file listed in
8107   #    @common_files since the last run).
8108   # Output's dependencies are split in two sets:
8109   #  * dependencies which are also configure dependencies
8110   #    These do not change between each Makefile.am
8111   #  * other dependencies, specific to the Makefile.am being processed
8112   #    (such as the Makefile.am itself, or any Makefile fragment
8113   #    it includes).
8114   my $timestamp = mtime $out_file;
8115   if (! $force_generation
8116       && $configure_deps_greatest_timestamp < $timestamp
8117       && $output_deps_greatest_timestamp < $timestamp
8118       && $output eq contents ($out_file))
8119     {
8120       verb "$out_file unchanged";
8121       # No need to update.
8122       return;
8123     }
8125   if (-e $out_file)
8126     {
8127       unlink ($out_file)
8128         or fatal "cannot remove $out_file: $!\n";
8129     }
8131   my $gm_file = new Automake::XFile "> $out_file";
8132   verb "creating $out_file";
8133   print $gm_file $output;
8136 ################################################################
8141 ################################################################
8143 # Print usage information.
8144 sub usage ()
8146     print "Usage: $0 [OPTION] ... [Makefile]...
8148 Generate Makefile.in for configure from Makefile.am.
8150 Operation modes:
8151       --help               print this help, then exit
8152       --version            print version number, then exit
8153   -v, --verbose            verbosely list files processed
8154       --no-force           only update Makefile.in's that are out of date
8155   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY
8157 Dependency tracking:
8158   -i, --ignore-deps      disable dependency tracking code
8159       --include-deps     enable dependency tracking code
8161 Verbosity of generated rules:
8162       --silent-rules     enable silent build rules
8164 Flavors:
8165       --cygnus           assume program is part of Cygnus-style tree
8166       --foreign          set strictness to foreign
8167       --gnits            set strictness to gnits
8168       --gnu              set strictness to gnu
8170 Library files:
8171   -a, --add-missing      add missing standard files to package
8172       --libdir=DIR       directory storing library files
8173   -c, --copy             with -a, copy missing files (default is symlink)
8174   -f, --force-missing    force update of standard files
8177     Automake::ChannelDefs::usage;
8179     my ($last, @lcomm);
8180     $last = '';
8181     foreach my $iter (sort ((@common_files, @common_sometimes)))
8182     {
8183         push (@lcomm, $iter) unless $iter eq $last;
8184         $last = $iter;
8185     }
8187     my @four;
8188     print "\nFiles which are automatically distributed, if found:\n";
8189     format USAGE_FORMAT =
8190   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
8191   $four[0],           $four[1],           $four[2],           $four[3]
8193     $~ = "USAGE_FORMAT";
8195     my $cols = 4;
8196     my $rows = int(@lcomm / $cols);
8197     my $rest = @lcomm % $cols;
8199     if ($rest)
8200     {
8201         $rows++;
8202     }
8203     else
8204     {
8205         $rest = $cols;
8206     }
8208     for (my $y = 0; $y < $rows; $y++)
8209     {
8210         @four = ("", "", "", "");
8211         for (my $x = 0; $x < $cols; $x++)
8212         {
8213             last if $y + 1 == $rows && $x == $rest;
8215             my $idx = (($x > $rest)
8216                        ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
8217                        : ($rows * $x));
8219             $idx += $y;
8220             $four[$x] = $lcomm[$idx];
8221         }
8222         write;
8223     }
8225     print "\nReport bugs to <bug-automake\@gnu.org>.\n";
8227     # --help always returns 0 per GNU standards.
8228     exit 0;
8232 # &version ()
8233 # -----------
8234 # Print version information
8235 sub version ()
8237   print <<EOF;
8238 automake (GNU $PACKAGE) $VERSION
8239 Copyright (C) 2009 Free Software Foundation, Inc.
8240 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
8241 This is free software: you are free to change and redistribute it.
8242 There is NO WARRANTY, to the extent permitted by law.
8244 Written by Tom Tromey <tromey\@redhat.com>
8245        and Alexandre Duret-Lutz <adl\@gnu.org>.
8247   # --version always returns 0 per GNU standards.
8248   exit 0;
8251 ################################################################
8253 # Parse command line.
8254 sub parse_arguments ()
8256   # Start off as gnu.
8257   set_strictness ('gnu');
8259   my $cli_where = new Automake::Location;
8260   my %cli_options =
8261     (
8262      'libdir=s' => \$libdir,
8263      'gnu'              => sub { set_strictness ('gnu'); },
8264      'gnits'            => sub { set_strictness ('gnits'); },
8265      'cygnus'           => sub { set_global_option ('cygnus', $cli_where); },
8266      'foreign'          => sub { set_strictness ('foreign'); },
8267      'include-deps'     => sub { unset_global_option ('no-dependencies'); },
8268      'i|ignore-deps'    => sub { set_global_option ('no-dependencies',
8269                                                     $cli_where); },
8270      'no-force' => sub { $force_generation = 0; },
8271      'f|force-missing'  => \$force_missing,
8272      'o|output-dir=s'   => \$output_directory,
8273      'a|add-missing'    => \$add_missing,
8274      'c|copy'           => \$copy_missing,
8275      'silent-rules'     => sub { set_global_option ('silent-rules',
8276                                                     $cli_where); },
8277      'v|verbose'        => sub { setup_channel 'verb', silent => 0; },
8278      'W|warnings=s'     => \&parse_warnings,
8279      # These long options (--Werror and --Wno-error) for backward
8280      # compatibility.  Use -Werror and -Wno-error today.
8281      'Werror'           => sub { parse_warnings 'W', 'error'; },
8282      'Wno-error'        => sub { parse_warnings 'W', 'no-error'; },
8283      );
8284   use Getopt::Long;
8285   Getopt::Long::config ("bundling", "pass_through");
8287   # See if --version or --help is used.  We want to process these before
8288   # anything else because the GNU Coding Standards require us to
8289   # `exit 0' after processing these options, and we can't guarantee this
8290   # if we treat other options first.  (Handling other options first
8291   # could produce error diagnostics, and in this condition it is
8292   # confusing if Automake does `exit 0'.)
8293   my %cli_options_1st_pass =
8294     (
8295      'version' => \&version,
8296      'help'    => \&usage,
8297      # Recognize all other options (and their arguments) but do nothing.
8298      map { $_ => sub {} } (keys %cli_options)
8299      );
8300   my @ARGV_backup = @ARGV;
8301   Getopt::Long::GetOptions %cli_options_1st_pass
8302     or exit 1;
8303   @ARGV = @ARGV_backup;
8305   # Now *really* process the options.  This time we know that --help
8306   # and --version are not present, but we specify them nonetheless so
8307   # that ambiguous abbreviation are diagnosed.
8308   Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {}
8309     or exit 1;
8311   if (defined $output_directory)
8312     {
8313       msg 'obsolete', "`--output-dir' is deprecated\n";
8314     }
8315   else
8316     {
8317       # In the next release we'll remove this entirely.
8318       $output_directory = '.';
8319     }
8321   return unless @ARGV;
8323   if ($ARGV[0] =~ /^-./)
8324     {
8325       my %argopts;
8326       for my $k (keys %cli_options)
8327         {
8328           if ($k =~ /(.*)=s$/)
8329             {
8330               map { $argopts{(length ($_) == 1)
8331                              ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
8332             }
8333         }
8334       if ($ARGV[0] eq '--')
8335         {
8336           shift @ARGV;
8337         }
8338       elsif (exists $argopts{$ARGV[0]})
8339         {
8340           fatal ("option `$ARGV[0]' requires an argument\n"
8341                  . "Try `$0 --help' for more information.");
8342         }
8343       else
8344         {
8345           fatal ("unrecognized option `$ARGV[0]'.\n"
8346                  . "Try `$0 --help' for more information.");
8347         }
8348     }
8350   my $errspec = 0;
8351   foreach my $arg (@ARGV)
8352     {
8353       fatal ("empty argument\nTry `$0 --help' for more information.")
8354         if ($arg eq '');
8356       # Handle $local:$input syntax.
8357       my ($local, @rest) = split (/:/, $arg);
8358       @rest = ("$local.in",) unless @rest;
8359       my $input = locate_am @rest;
8360       if ($input)
8361         {
8362           push @input_files, $input;
8363           $output_files{$input} = join (':', ($local, @rest));
8364         }
8365       else
8366         {
8367           error "no Automake input file found for `$arg'";
8368           $errspec = 1;
8369         }
8370     }
8371   fatal "no input file found among supplied arguments"
8372     if $errspec && ! @input_files;
8376 # handle_makefile ($MAKEFILE_IN)
8377 # ------------------------------
8378 # Deal with $MAKEFILE_IN.
8379 sub handle_makefile ($)
8381   my ($file) =  @_;
8382   ($am_file = $file) =~ s/\.in$//;
8383   if (! -f ($am_file . '.am'))
8384     {
8385       error "`$am_file.am' does not exist";
8386     }
8387   else
8388     {
8389       # Any warning setting now local to this Makefile.am.
8390       dup_channel_setup;
8392       generate_makefile ($am_file . '.am', $file);
8394       # Back out any warning setting.
8395       drop_channel_setup;
8396     }
8399 # handle_makefiles_serial ()
8400 # --------------------------
8401 # Deal with all makefiles, without threads.
8402 sub handle_makefiles_serial ()
8404   foreach my $file (@input_files)
8405     {
8406       handle_makefile ($file);
8407     }
8410 # get_number_of_threads ()
8411 # ------------------------
8412 # Logic for deciding how many worker threads to use.
8413 sub get_number_of_threads
8415   my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0;
8417   $nthreads = 0
8418     unless $nthreads =~ /^[0-9]+$/;
8420   # It doesn't make sense to use more threads than makefiles,
8421   my $max_threads = @input_files;
8423   # but a single worker thread is helpful for exposing bugs.
8424   if ($automake_will_process_aux_dir && $max_threads > 1)
8425     {
8426       $max_threads--;
8427     }
8428   if ($nthreads > $max_threads)
8429     {
8430       $nthreads = $max_threads;
8431     }
8432   return $nthreads;
8435 # handle_makefiles_threaded ($NTHREADS)
8436 # -------------------------------------
8437 # Deal with all makefiles, using threads.  The general strategy is to
8438 # spawn NTHREADS worker threads, dispatch makefiles to them, and let the
8439 # worker threads push back everything that needs serialization:
8440 # * warning and (normal) error messages, for stable stderr output
8441 #   order and content (avoiding duplicates, for example),
8442 # * races when installing aux files (and respective messages),
8443 # * races when collecting aux files for distribution.
8445 # The latter requires that the makefile that deals with the aux dir
8446 # files be handled last, done by the master thread.
8447 sub handle_makefiles_threaded ($)
8449   my ($nthreads) = @_;
8451   my @queued_input_files = @input_files;
8452   my $last_input_file = undef;
8453   if ($automake_will_process_aux_dir)
8454     {
8455       $last_input_file = pop @queued_input_files;
8456     }
8458   # The file queue distributes all makefiles, the message queues
8459   # collect all serializations needed for respective files.
8460   my $file_queue = Thread::Queue->new;
8461   my %msg_queues;
8462   foreach my $file (@queued_input_files)
8463     {
8464       $msg_queues{$file} = Thread::Queue->new;
8465     }
8467   verb "spawning $nthreads worker threads";
8468   my @threads = (1 .. $nthreads);
8469   foreach my $t (@threads)
8470     {
8471       $t = threads->new (sub
8472         {
8473           while (my $file = $file_queue->dequeue)
8474             {
8475               verb "handling $file";
8476               my $queue = $msg_queues{$file};
8477               setup_channel_queue ($queue, QUEUE_MESSAGE);
8478               $required_conf_file_queue = $queue;
8479               handle_makefile ($file);
8480               $queue->enqueue (undef);
8481               setup_channel_queue (undef, undef);
8482               $required_conf_file_queue = undef;
8483             }
8484           return $exit_code;
8485         });
8486     }
8488   # Queue all normal makefiles.
8489   verb "queuing " . @queued_input_files . " input files";
8490   $file_queue->enqueue (@queued_input_files, (undef) x @threads);
8492   # Collect and process serializations.
8493   foreach my $file (@queued_input_files)
8494     {
8495       verb "dequeuing messages for " . $file;
8496       reset_local_duplicates ();
8497       my $queue = $msg_queues{$file};
8498       while (my $key = $queue->dequeue)
8499         {
8500           if ($key eq QUEUE_MESSAGE)
8501             {
8502               pop_channel_queue ($queue);
8503             }
8504           elsif ($key eq QUEUE_CONF_FILE)
8505             {
8506               require_queued_conf_file ($queue);
8507             }
8508           else
8509             {
8510               prog_error "unexpected key $key";
8511             }
8512         }
8513     }
8515   foreach my $t (@threads)
8516     {
8517       my @exit_thread = $t->join;
8518       $exit_code = $exit_thread[0]
8519         if ($exit_thread[0] > $exit_code);
8520     }
8522   # The master processes the last file.
8523   if ($automake_will_process_aux_dir)
8524     {
8525       verb "processing last input file";
8526       handle_makefile ($last_input_file);
8527     }
8530 ################################################################
8532 # Parse the WARNINGS environment variable.
8533 parse_WARNINGS;
8535 # Parse command line.
8536 parse_arguments;
8538 $configure_ac = require_configure_ac;
8540 # Do configure.ac scan only once.
8541 scan_autoconf_files;
8543 if (! @input_files)
8544   {
8545     my $msg = '';
8546     $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?"
8547       if -f 'Makefile.am';
8548     fatal ("no `Makefile.am' found for any configure output$msg");
8549   }
8551 my $nthreads = get_number_of_threads ();
8553 if ($perl_threads && $nthreads >= 1)
8554   {
8555     handle_makefiles_threaded ($nthreads);
8556   }
8557 else
8558   {
8559     handle_makefiles_serial ();
8560   }
8562 exit $exit_code;
8565 ### Setup "GNU" style for perl-mode and cperl-mode.
8566 ## Local Variables:
8567 ## perl-indent-level: 2
8568 ## perl-continued-statement-offset: 2
8569 ## perl-continued-brace-offset: 0
8570 ## perl-brace-offset: 0
8571 ## perl-brace-imaginary-offset: 0
8572 ## perl-label-offset: -2
8573 ## cperl-indent-level: 2
8574 ## cperl-brace-offset: 0
8575 ## cperl-continued-brace-offset: 0
8576 ## cperl-label-offset: -2
8577 ## cperl-extra-newline-before-brace: t
8578 ## cperl-merge-trailing-else: nil
8579 ## cperl-continued-statement-offset: 2
8580 ## End: