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