* automake.in: Use &verbose.
[platform/upstream/automake.git] / automake.in
1 #!@PERL@ -w
2 # -*- perl -*-
3 # @configure_input@
4
5 eval 'exec @PERL@ -S $0 ${1+"$@"}'
6     if 0;
7
8 # automake - create Makefile.in from Makefile.am
9 # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
10 # Free Software Foundation, Inc.
11
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2, or (at your option)
15 # any later version.
16
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 # 02111-1307, USA.
26
27 # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
28 # Perl reimplementation by Tom Tromey <tromey@cygnus.com>.
29
30 package Language;
31
32 BEGIN
33 {
34   my $prefix = "@prefix@";
35   my $perllibdir = $ENV{'perllibdir'} || "@datadir@/@PACKAGE@";
36   unshift @INC, "$perllibdir";
37 }
38
39 use Automake::Struct;
40 struct (# Short name of the language (c, f77...).
41         'name' => "\$",
42         # Nice name of the language (C, Fortran 77...).
43         'Name' => "\$",
44
45         # List of configure variables which must be defined.
46         'config_vars' => '@',
47
48         'ansi'    => "\$",
49         # `pure' is `1' or `'.  A `pure' language is one where, if
50         # all the files in a directory are of that language, then we
51         # do not require the C compiler or any code to call it.
52         'pure'   => "\$",
53
54         'autodep' => "\$",
55
56         # Name of the compiling variable (COMPILE).
57         'compiler'  => "\$",
58         # Content of the compiling variable.
59         'compile'  => "\$",
60         # Flag to require compilation without linking (-c).
61         'compile_flag' => "\$",
62         'extensions'      => '@',
63         'flags' => "\$",
64         # Should the flag be defined as a configure variable.
65         # Defaults to true.  FIXME: this should go away once
66         # we move to autoconf tracing.
67         'define_flag' => "\$",
68
69         # The file to use when generating rules for this language.
70         # The default is 'depend2'.
71         'rule_file' => "\$",
72
73         # Name of the linking variable (LINK).
74         'linker' => "\$",
75         # Content of the linking variable.
76         'link' => "\$",
77
78         # Name of the linker variable (LD).
79         'lder' => "\$",
80         # Content of the linker variable ($(CC)).
81         'ld' => "\$",
82
83         # Flag to specify the output file (-o).
84         'output_flag' => "\$",
85         '_finish' => "\$",
86
87         # This is a subroutine which is called whenever we finally
88         # determine the context in which a source file will be
89         # compiled.
90         '_target_hook' => "\$");
91
92
93 sub finish ($)
94 {
95   my ($self) = @_;
96   if (defined $self->_finish)
97     {
98       &{$self->_finish} ();
99     }
100 }
101
102 sub target_hook ($$$$)
103 {
104     my ($self) = @_;
105     if (defined $self->_target_hook)
106     {
107         &{$self->_target_hook} (@_);
108     }
109 }
110
111 package Automake;
112
113 use strict 'vars', 'subs';
114 use Automake::General;
115 use Automake::XFile;
116 use File::Basename;
117 use Carp;
118
119 ## ----------- ##
120 ## Constants.  ##
121 ## ----------- ##
122
123 # Parameters set by configure.  Not to be changed.  NOTE: assign
124 # VERSION as string so that eg version 0.30 will print correctly.
125 my $VERSION = "@VERSION@";
126 my $PACKAGE = "@PACKAGE@";
127 my $prefix = "@prefix@";
128 my $libdir = "@datadir@/@PACKAGE@";
129
130 # String constants.
131 my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
132 my $WHITE_PATTERN = '^\s*$';
133 my $COMMENT_PATTERN = '^#';
134 my $TARGET_PATTERN='[$a-zA-Z_.@][-.a-zA-Z0-9_(){}/$+@]*';
135 # A rule has three parts: a list of targets, a list of dependencies,
136 # and optionally actions.
137 my $RULE_PATTERN =
138   "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";
139
140 my $SUFFIX_RULE_PATTERN = '^\.([a-zA-Z0-9+]+)\.([a-zA-Z0-9+]+)$';
141 # Only recognize leading spaces, not leading tabs.  If we recognize
142 # leading tabs here then we need to make the reader smarter, because
143 # otherwise it will think rules like `foo=bar; \' are errors.
144 my $MACRO_PATTERN = '^[A-Za-z0-9_@]+$';
145 my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)$';
146 # This pattern recognizes a Gnits version id and sets $1 if the
147 # release is an alpha release.  We also allow a suffix which can be
148 # used to extend the version number with a "fork" identifier.
149 my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';
150 my $IF_PATTERN =          '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?$';
151 my $ELSE_PATTERN =   '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?$';
152 my $ENDIF_PATTERN = '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?$';
153 my $PATH_PATTERN='(\w|[/.-])+';
154 # This will pass through anything not of the prescribed form.
155 my $INCLUDE_PATTERN = ('^include\s+'
156                        . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
157                        . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
158                        . '|([^/\$]' . $PATH_PATTERN. '))\s*(#.*)?$');
159
160 # Some regular expressions.  One reason to put them here is that it
161 # makes indentation work better in Emacs.
162 my $AC_CONFIG_AUX_DIR_PATTERN = 'AC_CONFIG_AUX_DIR\(([^)]+)\)';
163 my $AM_INIT_AUTOMAKE_PATTERN = 'AM_INIT_AUTOMAKE\([^,]*,([^,)]+)[,)]';
164 my $AM_PACKAGE_VERSION_PATTERN = '^\s*\[?([^]\s]+)\]?\s*$';
165
166 # This handles substitution references like ${foo:.a=.b}.
167 my $SUBST_REF_PATTERN = "^([^:]*):([^=]*)=(.*)\$";
168
169 # Note that there is no AC_PATH_TOOL.  But we don't really care.
170 my $AC_CHECK_PATTERN = 'AC_(CHECK|PATH)_(PROG|PROGS|TOOL)\(\[?(\w+)';
171 my $AM_MISSING_PATTERN = 'AM_MISSING_PROG\(\[?(\w+)';
172 # Just check for alphanumeric in AC_SUBST.  If you do AC_SUBST(5),
173 # then too bad.
174 my $AC_SUBST_PATTERN = 'AC_SUBST\(\[?(\w+)';
175 my $AM_CONDITIONAL_PATTERN = 'AM_CONDITIONAL\(\[?(\w+)';
176 # Match `-d' as a command-line argument in a string.
177 my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)";
178
179 # Constants to define the "strictness" level.
180 my $FOREIGN = 0;
181 my $GNU = 1;
182 my $GNITS = 2;
183
184 # Values for AC_CANONICAL_*
185 my $AC_CANONICAL_HOST = 1;
186 my $AC_CANONICAL_SYSTEM = 2;
187
188 # Values indicating when something should be cleaned.  Right now we
189 # only need to handle `mostly'- and `dist'-clean; add more as
190 # required.
191 my $MOSTLY_CLEAN = 0;
192 my $DIST_CLEAN = 1;
193
194 # Files installed by libtoolize.
195 my @libtoolize_files = ('ltmain.sh', 'config.guess', 'config.sub');
196 # ltconfig appears here for compatibility with old versions of libtool.
197 my @libtoolize_sometimes = ('ltconfig', 'ltcf-c.sh', 'ltcf-cxx.sh',
198                             'ltcf-gcj.sh');
199
200 # Commonly found files we look for and automatically include in
201 # DISTFILES.
202 my @common_files =
203   (
204    'README', 'THANKS', 'TODO', 'NEWS', 'COPYING', 'COPYING.LIB',
205    'INSTALL', 'ABOUT-NLS', 'ChangeLog', 'configure.ac',
206    'configure.in', 'configure', 'config.guess', 'config.sub',
207    'AUTHORS', 'BACKLOG', 'ABOUT-GNU', 'libversion.in',
208    'mdate-sh', 'mkinstalldirs', 'install-sh', 'texinfo.tex',
209    'ansi2knr.c', 'ansi2knr.1', 'elisp-comp',
210    # ltconfig appears here for compatibility with old versions
211    # of libtool.
212    'ylwrap', 'acinclude.m4', @libtoolize_files, @libtoolize_sometimes,
213    'missing', 'depcomp', 'compile', 'py-compile'
214   );
215
216 # Commonly used files we auto-include, but only sometimes.
217 my @common_sometimes =
218   (
219    'aclocal.m4', 'acconfig.h', 'config.h.top',
220    'config.h.bot', 'stamp-h.in', 'stamp-vti'
221   );
222
223 # Copyright on generated Makefile.ins.
224 my $gen_copyright = "\
225 # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
226 # Free Software Foundation, Inc.
227 # This Makefile.in is free software; the Free Software Foundation
228 # gives unlimited permission to copy and/or distribute it,
229 # with or without modifications, as long as this notice is preserved.
230
231 # This program is distributed in the hope that it will be useful,
232 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
233 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
234 # PARTICULAR PURPOSE.
235 ";
236
237 # These constants are returned by lang_*_rewrite functions.
238 # LANG_SUBDIR means that the resulting object file should be in a
239 # subdir if the source file is.  In this case the file name cannot
240 # have `..' components.
241 my $LANG_IGNORE = 0;
242 my $LANG_PROCESS = 1;
243 my $LANG_SUBDIR = 2;
244
245 # Directories installed during 'install-exec' phase.
246 my %exec_dir_p =
247   (
248    'bin'        => 1,
249    'sbin'       => 1,
250    'libexec'    => 1,
251    'data'       => 0,
252    'sysconf'    => 1,
253    'localstate' => 1,
254    'lib'        => 1,
255    'info'       => 0,
256    'man'        => 0,
257    'include'    => 0,
258    'oldinclude' => 0,
259    'pkgdata'    => 0,
260    'pkglib'     => 1,
261    'pkginclude' => 0
262   );
263
264 # Map from obsolete macros to hints for new macros.
265 # If you change this, change the corresponding list in aclocal.in.
266 # FIXME: should just put this into a single file.
267 my %obsolete_macros =
268     (
269      'AC_FEATURE_CTYPE'         => "use `AC_HEADER_STDC'",
270      'AC_FEATURE_ERRNO'         => "add `strerror' to `AC_REPLACE_FUNCS(...)'",
271      'AC_FEATURE_EXIT'          => '',
272      'AC_SYSTEM_HEADER'         => '',
273
274      # Note that we do not handle this one, because it is still run
275      # from AM_CONFIG_HEADER.  So we deal with it specially in
276      # &scan_autoconf_files.
277      # 'AC_CONFIG_HEADER'       => "use `AM_CONFIG_HEADER'",
278
279      'fp_C_PROTOTYPES'          => "use `AM_C_PROTOTYPES'",
280      'fp_PROG_CC_STDC'          => "use `AM_PROG_CC_STDC'",
281      'fp_PROG_INSTALL'          => "use `AC_PROG_INSTALL'",
282      'fp_WITH_DMALLOC'          => "use `AM_WITH_DMALLOC'",
283      'fp_WITH_REGEX'            => "use `AM_WITH_REGEX'",
284      'gm_PROG_LIBTOOL'          => "use `AM_PROG_LIBTOOL'",
285      'jm_MAINTAINER_MODE'       => "use `AM_MAINTAINER_MODE'",
286      'md_TYPE_PTRDIFF_T'        => "add `ptrdiff_t' to `AC_CHECK_TYPES(...)'",
287      'ud_PATH_LISPDIR'          => "use `AM_PATH_LISPDIR'",
288      'ud_GNU_GETTEXT'           => "use `AM_GNU_GETTEXT'",
289
290      # Now part of autoconf proper, under a different name.
291      'fp_FUNC_FNMATCH'          => "use `AC_FUNC_FNMATCH'",
292      'AM_SANITY_CHECK_CC'       => "automatically done by `AC_PROG_CC'",
293      'AM_PROG_INSTALL'          => "use `AC_PROG_INSTALL'",
294      'AM_EXEEXT'                => "automatically done by `AC_PROG_(CC|CXX|F77)'",
295      'AM_CYGWIN32'              => "use `AC_CYGWIN'",
296      'AM_MINGW32'               => "use `AC_MINGW32'",
297      'AM_FUNC_MKTIME'           => "use `AC_FUNC_MKTIME'",
298      );
299
300 # Regexp to match the above macros.
301 my $obsolete_rx = '\b(' . join ('|', keys %obsolete_macros) . ')\b';
302 \f
303
304
305 ## ---------------------------------- ##
306 ## Variables related to the options.  ##
307 ## ---------------------------------- ##
308
309 # TRUE if we should always generate Makefile.in.
310 my $force_generation = 1;
311
312 # Strictness level as set on command line.
313 my $default_strictness = $GNU;
314
315 # Name of strictness level, as set on command line.
316 my $default_strictness_name = 'gnu';
317
318 # This is TRUE if automatic dependency generation code should be
319 # included in generated Makefile.in.
320 my $cmdline_use_dependencies = 1;
321
322 # TRUE if in verbose mode.
323 my $verbose = 0;
324
325 # This holds our (eventual) exit status.  We don't actually exit until
326 # we have processed all input files.
327 my $exit_status = 0;
328
329 # From the Perl manual.
330 my $symlink_exists = (eval 'symlink ("", "");', $@ eq '');
331
332 # TRUE if missing standard files should be installed.
333 my $add_missing = 0;
334
335 # TRUE if we should copy missing files; otherwise symlink if possible.
336 my $copy_missing = 0;
337
338 # TRUE if we should always update files that we know about.
339 my $force_missing = 0;
340
341
342 ## ---------------------------------------- ##
343 ## Variables filled during files scanning.  ##
344 ## ---------------------------------------- ##
345
346 # Name of the top autoconf input: `configure.ac' or `configure.in'.
347 my $configure_ac = '';
348
349 # Files found by scanning configure.ac for LIBOBJS.
350 my %libsources = ();
351
352 # True if AM_C_PROTOTYPES appears in configure.ac.
353 my $am_c_prototypes = 0;
354
355 # Names used in AC_CONFIG_HEADER call.  @config_fullnames holds the
356 # name which appears in AC_CONFIG_HEADER, colon and all.
357 # @config_names holds the file names.  @config_headers holds the '.in'
358 # files.  Ordinarily these are similar, but they can be different if
359 # the weird "NAME:FILE" syntax is used.
360 my @config_fullnames = ();
361 my @config_names = ();
362 my @config_headers = ();
363 # Where AC_CONFIG_HEADER appears.
364 my $config_header_location;
365
366 # Directory where output files go.  Actually, output files are
367 # relative to this directory.
368 my $output_directory = '.';
369
370 # List of Makefile.am's to process, and their corresponding outputs.
371 my @input_files = ();
372 my %output_files = ();
373
374 # Complete list of Makefile.am's that exist.
375 my @configure_input_files = ();
376
377 # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's,
378 # and their outputs.
379 my @other_input_files = ();
380 # Where the last AC_CONFIG_FILES/AC_OUTPUT appears.
381 my $ac_config_files_location;
382
383 # List of directories to search for configure-required files.  This
384 # can be set by AC_CONFIG_AUX_DIR.
385 my @config_aux_path = ('.', '..', '../..');
386 my $config_aux_dir = '';
387 my $config_aux_dir_set_in_configure_in = 0;
388
389 # Whether AM_GNU_GETTEXT has been seen in configure.ac.
390 my $seen_gettext = 0;
391 # Where AM_GNU_GETTEXT appears.
392 my $ac_gettext_location;
393
394 # TRUE if AC_PROG_LEX or AM_PROG_LEX were seen.
395 my $seen_prog_lex = 0;
396
397 # TRUE if we've seen AC_CANONICAL_(HOST|SYSTEM).  The presence of
398 # AC_CHECK_TOOL also sets this.
399 my $seen_canonical = 0;
400
401 # TRUE if we've seen AC_PROG_LIBTOOL.
402 my $seen_libtool = 0;
403 my $libtool_location;
404
405 # TRUE if we've seen AM_MAINTAINER_MODE.
406 my $seen_maint_mode = 0;
407
408 # Actual version we've seen.
409 my $package_version = '';
410
411 # Where version is defined.
412 my $package_version_location;
413
414 # Where AM_PATH_LISPDIR appears.
415 my $am_lispdir_location;
416
417 # Where AM_PATH_PYTHON appears.
418 my $pythondir_location;
419
420 # TRUE if we've seen AC_ENABLE_MULTILIB.
421 my $seen_multilib = 0;
422
423 # TRUE if we've seen AM_PROG_CC_C_O
424 my $seen_cc_c_o = 0;
425
426 # TRUE if we've seen AM_INIT_AUTOMAKE.
427 my $seen_init_automake = 0;
428
429 # Hash table of discovered configure substitutions.  Keys are names,
430 # values are `FILE:LINE' strings which are used by error message
431 # generation.
432 my %configure_vars = ();
433
434 # This is used to keep track of which variable definitions we are
435 # scanning.  It is only used in certain limited ways, but it has to be
436 # global.  It is declared just for documentation purposes.
437 my %vars_scanned = ();
438
439 # TRUE if --cygnus seen.
440 my $cygnus_mode = 0;
441
442 # Hash table of AM_CONDITIONAL variables seen in configure.
443 my %configure_cond = ();
444
445 # This maps extensions onto language names.
446 my %extension_map = ();
447
448 # List of the DIST_COMMON files we discovered while reading
449 # configure.in
450 my $configure_dist_common = '';
451
452 # This maps languages names onto objects.
453 my %languages = ();
454
455 # List of targets we must always output.
456 # FIXME: Complete, and remove falsely required targets.
457 my %required_targets =
458   (
459    'all'          => 1,
460    'dvi'          => 1,
461    'info'         => 1,
462    'install-info' => 1,
463    'install'      => 1,
464    'install-data' => 1,
465    'install-exec' => 1,
466    'uninstall'    => 1,
467
468    # FIXME: Not required, temporary hacks.
469    # Well, actually they are sort of required: the -recursive
470    # targets will run them anyway...
471    'dvi-am'          => 1,
472    'info-am'         => 1,
473    'install-data-am' => 1,
474    'install-exec-am' => 1,
475    'installcheck-am' => 1,
476    'uninstall-am' => 1,
477
478    'install-man' => 1,
479   );
480
481 \f
482
483 ################################################################
484
485 ## ------------------------------------------ ##
486 ## Variables reset by &initialize_per_input.  ##
487 ## ------------------------------------------ ##
488
489 # Basename and relative dir of the input file.
490 my $am_file_name;
491 my $am_relative_dir;
492
493 # Same but wrt Makefile.in.
494 my $in_file_name;
495 my $relative_dir;
496
497 # These two variables are used when generating each Makefile.in.
498 # They hold the Makefile.in until it is ready to be printed.
499 my $output_rules;
500 my $output_vars;
501 my $output_trailer;
502 my $output_all;
503 my $output_header;
504
505 # Suffixes found during a run.
506 my @suffixes;
507
508 # Handling the variables.
509 #
510 # For a $VAR:
511 # - $var_value{$VAR}{$COND} is its value associated to $COND,
512 # - $var_location{$VAR} is where it was defined,
513 # - $var_comment{$VAR} are the comments associated to it.
514 # - $var_type{$VAR} is how it has been defined (`', `+', or `:'),
515 # - $var_is_am{$VAR} is true if the variable is owned by Automake.
516 my %var_value;
517 my %var_location;
518 my %var_comment;
519 my %var_type;
520 my %var_is_am;
521
522 # This holds a 1 if a particular variable was examined.
523 my %content_seen;
524
525 # This holds the names which are targets.  These also appear in
526 # %contents.
527 my %targets;
528
529 # Same as %VAR_VALUE, but for targets.
530 my %target_conditional;
531
532 # This is the conditional stack.
533 my @cond_stack;
534
535 # This holds the set of included files.
536 my @include_stack;
537
538 # This holds a list of directories which we must create at `dist'
539 # time.  This is used in some strange scenarios involving weird
540 # AC_OUTPUT commands.
541 my %dist_dirs;
542
543 # List of dependencies for the obvious targets.
544 my @all;
545 my @check;
546 my @check_tests;
547
548 # Holds the dependencies of targets which dependencies are factored.
549 # Typically, `.PHONY' will appear in plenty of *.am files, but must
550 # be output once.  Arguably all pure dependencies could be subject
551 # to this factorization, but it is not unpleasant to have paragraphs
552 # in Makefile: keeping related stuff altogether.
553 my %dependencies;
554
555 # Holds the factored actions.  Tied to %DEPENDENCIES, i.e., filled
556 # only when keys exists in %DEPENDENCIES.
557 my %actions;
558
559 # A list of files deleted by `maintainer-clean'.
560 my @maintainer_clean_files;
561
562 # Keys in this hash table are object files or other files in
563 # subdirectories which need to be removed.  This only holds files
564 # which are created by compilations.  The value in the hash indicates
565 # when the file should be removed.
566 my %compile_clean_files;
567
568 # Value of `$(SOURCES)', used by tags.am.
569 my @sources;
570 # Sources which go in the distribution.
571 my @dist_sources;
572
573 # This hash maps object file names onto their corresponding source
574 # file names.  This is used to ensure that each object is created
575 # by a single source file.
576 my %object_map;
577
578 # This keeps track of the directories for which we've already
579 # created `.dirstamp' code.
580 my %directory_map;
581
582 # All .P files.
583 my %dep_files;
584
585 # Strictness levels.
586 my $strictness;
587 my $strictness_name;
588
589 # Options from AUTOMAKE_OPTIONS.
590 my %options;
591
592 # Whether or not dependencies are handled.  Can be further changed
593 # in handle_options.
594 my $use_dependencies;
595
596 # This is a list of all targets to run during "make dist".
597 my @dist_targets;
598
599 # Keys in this hash are the basenames of files which must depend
600 # on ansi2knr.
601 my %de_ansi_files;
602
603 # This maps the source extension of a suffix rule to its
604 # corresponding output extension.
605 my %suffix_rules;
606
607 # This is the name of the redirect `all' target to use.
608 my $all_target;
609
610 # This keeps track of which extensions we've seen (that we care
611 # about).
612 my %extension_seen;
613
614 # This is random scratch space for the language finish functions.
615 # Don't randomly overwrite it; examine other uses of keys first.
616 my %language_scratch;
617
618 # We keep track of which objects need special (per-executable)
619 # handling on a per-language basis.
620 my %lang_specific_files;
621
622 # This is set when `handle_dist' has finished.  Once this happens,
623 # we should no longer push on dist_common.
624 my $handle_dist_run;
625
626 # Used to store a set of linkers needed to generate the sources currently
627 # under consideration.
628 my %linkers_used;
629
630 # True if we need `LINK' defined.  This is a hack.
631 my $need_link;
632
633 # This is the list of such variables to output.
634 # FIXME: Might be useless actually.
635 my @var_list;
636
637 # Was get_object_extension run?
638 # FIXME: This is a hack. a better switch should be found.
639 my $get_object_extension_was_run;
640
641 # Contains a stack of `from' parts of variable substitutions currently in
642 # force.
643 my @substfroms;
644
645 # Contains a stack of `to' parts of variable substitutions currently in
646 # force.
647 my @substtos;
648
649 # Associates a variable name, together with a list of substitutions to be
650 # performed on it, with a number.  Used to provide unique names for generated
651 # variables.
652 my %substnums = ();
653
654 ## --------------------------------- ##
655 ## Forward subroutine declarations.  ##
656 ## --------------------------------- ##
657 sub register_language (%);
658 sub file_contents_internal ($$%);
659 sub define_objects_from_sources ($$$$$$$);
660
661
662 # &initialize_per_input ()
663 # ------------------------
664 # (Re)-Initialize per-Makefile.am variables.
665 sub initialize_per_input ()
666 {
667     $am_file_name = '';
668     $am_relative_dir = '';
669
670     $in_file_name = '';
671     $relative_dir = '';
672
673     $output_rules = '';
674     $output_vars = '';
675     $output_trailer = '';
676     $output_all = '';
677     $output_header = '';
678
679     @suffixes = ();
680
681     %var_value = ();
682     %var_location = ();
683     %var_comment = ();
684     %var_type = ();
685     %var_is_am = ();
686
687     %content_seen = ();
688
689     %targets = ();
690
691     %target_conditional = ();
692
693     @cond_stack = ();
694
695     @include_stack = ();
696
697     $relative_dir = '';
698
699     $am_relative_dir = '';
700
701     %dist_dirs = ();
702
703     @all = ();
704     @check = ();
705     @check_tests = ();
706
707     %dependencies =
708       (
709        # Texinfoing.
710        'dvi'      => [],
711        'dvi-am'   => [],
712        'info'     => [],
713        'info-am'  => [],
714
715        # Installing/uninstalling.
716        'install-data-am'      => [],
717        'install-exec-am'      => [],
718        'uninstall-am'         => [],
719
720        'install-man'          => [],
721        'uninstall-man'        => [],
722
723        'install-info'         => [],
724        'install-info-am'      => [],
725        'uninstall-info'       => [],
726
727        'installcheck-am'      => [],
728
729        # Cleaning.
730        'clean-am'             => [],
731        'mostlyclean-am'       => [],
732        'maintainer-clean-am'  => [],
733        'distclean-am'         => [],
734        'clean'                => [],
735        'mostlyclean'          => [],
736        'maintainer-clean'     => [],
737        'distclean'            => [],
738
739        # Tarballing.
740        'dist-all'             => [],
741
742        # Phoning.
743        '.PHONY'               => []
744       );
745     %actions = ();
746
747     @maintainer_clean_files = ();
748
749     @sources = ();
750     @dist_sources = ();
751
752     %object_map = ();
753
754     %directory_map = ();
755
756     %dep_files = ();
757
758     $strictness = $default_strictness;
759     $strictness_name = $default_strictness_name;
760
761     %options = ();
762
763     $use_dependencies = $cmdline_use_dependencies;
764
765     @dist_targets = ();
766
767     %de_ansi_files = ();
768
769     %suffix_rules = ();
770
771     $all_target = '';
772
773     %extension_seen = ();
774
775     %language_scratch = ();
776
777     %lang_specific_files = ();
778
779     $handle_dist_run = 0;
780
781     $need_link = 0;
782
783     @var_list = ();
784
785     $get_object_extension_was_run = 0;
786
787     %compile_clean_files = ();
788 }
789
790
791 ################################################################
792
793 # Initialize our list of languages that are internally supported.
794
795 # C.
796 register_language ('name' => 'c',
797                    'Name' => 'C',
798                    'config_vars' => ['CC'],
799                    'ansi' => 1,
800                    'autodep' => '',
801                    'flags' => 'CFLAGS',
802                    'compiler' => 'COMPILE',
803                    'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)',
804                    'lder' => 'CCLD',
805                    'ld' => '$(CC)',
806                    'linker' => 'LINK',
807                    'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
808                    'compile_flag' => '-c',
809                    'extensions' => ['c'],
810                    '_finish' => \&lang_c_finish);
811
812 # C++.
813 register_language ('name' => 'cxx',
814                    'Name' => 'C++',
815                    'config_vars' => ['CXX'],
816                    'linker' => 'CXXLINK',
817                    'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
818                    'autodep' => 'CXX',
819                    'flags' => 'CXXFLAGS',
820                    'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)',
821                    'compiler' => 'CXXCOMPILE',
822                    'compile_flag' => '-c',
823                    'output_flag' => '-o',
824                    'lder' => 'CXXLD',
825                    'ld' => '$(CXX)',
826                    'pure' => 1,
827                    'extensions' => ['c++', 'cc', 'cpp', 'cxx', 'C']);
828
829 # Objective C.
830 register_language ('name' => 'objc',
831                    'Name' => 'Objective C',
832                    'config_vars' => ['OBJC'],
833                    'linker' => 'OBJCLINK',,
834                    'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
835                    'autodep' => 'OBJC',
836                    'flags' => 'OBJCFLAGS',
837                    'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)',
838                    'compiler' => 'OBJCCOMPILE',
839                    'compile_flag' => '-c',
840                    'output_flag' => '-o',
841                    'lder' => 'OBJCLD',
842                    'ld' => '$(OBJC)',
843                    'pure' => 1,
844                    'extensions' => ['m']);
845
846 # Headers.
847 register_language ('name' => 'header',
848                    'Name' => 'Header',
849                    'extensions' => ['h', 'H', 'hxx', 'h++', 'hh', 'hpp', 'inc'],
850                    # Nothing to do.
851                    '_finish' => sub { });
852
853 # Yacc (C & C++).
854 register_language ('name' => 'yacc',
855                    'Name' => 'Yacc',
856                    'config_vars' => ['YACC'],
857                    'flags' => 'YFLAGS',
858                    'define_flag' => 0,
859                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
860                    'compiler' => 'YACCCOMPILE',
861                    'extensions' => ['y'],
862                    'rule_file' => 'yacc',
863                    '_finish' => \&lang_yacc_finish,
864                    '_target_hook' => \&lang_yacc_target_hook);
865 register_language ('name' => 'yaccxx',
866                    'Name' => 'Yacc (C++)',
867                    'config_vars' => ['YACC'],
868                    'rule_file' => 'yacc',
869                    'flags' => 'YFLAGS',
870                    'define_flag' => 0,
871                    'compiler' => 'YACCCOMPILE',
872                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
873                    'extensions' => ['y++', 'yy', 'yxx', 'ypp'],
874                    '_finish' => \&lang_yacc_finish,
875                    '_target_hook' => \&lang_yacc_target_hook);
876
877 # Lex (C & C++).
878 register_language ('name' => 'lex',
879                    'Name' => 'Lex',
880                    'config_vars' => ['LEX'],
881                    'rule_file' => 'lex',
882                    'flags' => 'LFLAGS',
883                    'define_flag' => 0,
884                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
885                    'compiler' => 'LEXCOMPILE',
886                    'extensions' => ['l'],
887                    '_finish' => \&lang_lex_finish);
888 register_language ('name' => 'lexxx',
889                    'Name' => 'Lex (C++)',
890                    'config_vars' => ['LEX'],
891                    'rule_file' => 'lex',
892                    'flags' => 'LFLAGS',
893                    'define_flag' => 0,
894                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
895                    'compiler' => 'LEXCOMPILE',
896                    'extensions' => ['l++', 'll', 'lxx', 'lpp'],
897                    '_finish' => \&lang_lex_finish);
898
899 # Assembler.
900 register_language ('name' => 'asm',
901                    'Name' => 'Assembler',
902                    'config_vars' => ['AS', 'ASFLAGS'],
903
904                    'flags' => 'ASFLAGS',
905                    # Users can set AM_ASFLAGS to includes DEFS, INCLUDES,
906                    # or anything else required.  They can also set AS.
907                    'compile' => '$(AS) $(AM_ASFLAGS) $(ASFLAGS)',
908                    'compiler' => 'ASCOMPILE',
909                    'compile_flag' => '-c',
910                    'extensions' => ['s', 'S'],
911
912                    # With assembly we still use the C linker.
913                    '_finish' => \&lang_c_finish);
914
915 # Fortran 77
916 register_language ('name' => 'f77',
917                    'Name' => 'Fortran 77',
918                    'linker' => 'F77LINK',
919                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
920                    'flags' => 'FFLAGS',
921                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)',
922                    'compiler' => 'F77COMPILE',
923                    'compile_flag' => '-c',
924                    'output_flag' => '-o',
925                    'lder' => 'F77LD',
926                    'ld' => '$(F77)',
927                    'pure' => 1,
928                    'extensions' => ['f', 'for', 'f90']);
929
930 # Preprocessed Fortran 77
931 #
932 # The current support for preprocessing Fortran 77 just involves
933 # passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
934 # $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since
935 # this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51
936 # for `make' Version 3.76 Beta' (specifically, from info file
937 # `(make)Catalogue of Rules').
938 #
939 # A better approach would be to write an Autoconf test
940 # (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all
941 # Fortran 77 compilers know how to do preprocessing.  The Autoconf
942 # macro AC_PROG_FPP should test the Fortran 77 compiler first for
943 # preprocessing capabilities, and then fall back on cpp (if cpp were
944 # available).
945 register_language ('name' => 'ppf77',
946                    'Name' => 'Preprocessed Fortran 77',
947                    'config_vars' => ['F77'],
948                    'linker' => 'F77LINK',
949                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
950                    'lder' => 'F77LD',
951                    'ld' => '$(F77)',
952                    'flags' => 'FFLAGS',
953                    'compiler' => 'PPF77COMPILE',
954                    'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)',
955                    'compile_flag' => '-c',
956                    'output_flag' => '-o',
957                    'pure' => 1,
958                    'extensions' => ['F']);
959
960 # Ratfor.
961 register_language ('name' => 'ratfor',
962                    'Name' => 'Ratfor',
963                    'config_vars' => ['F77'],
964                    'linker' => 'F77LINK',
965                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
966                    'lder' => 'F77LD',
967                    'ld' => '$(F77)',
968                    'flags' => 'RFLAGS',
969                    # FIXME also FFLAGS.
970                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)',
971                    'compiler' => 'RCOMPILE',
972                    'compile_flag' => '-c',
973                    'output_flag' => '-o',
974                    'pure' => 1,
975                    'extensions' => ['r']);
976
977 # Java via gcj.
978 register_language ('name' => 'java',
979                    'Name' => 'Java',
980                    'config_vars' => ['GCJ'],
981                    'linker' => 'GCJLINK',
982                    'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
983                    'autodep' => 'GCJ',
984                    'flags' => 'GCJFLAGS',
985                    'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)',
986                    'compiler' => 'GCJCOMPILE',
987                    'compile_flag' => '-c',
988                    'output_flag' => '-o',
989                    'lder' => 'GCJLD',
990                    'ld' => '$(GCJ)',
991                    'pure' => 1,
992                    'extensions' => ['java', 'class', 'zip', 'jar']);
993
994 ################################################################
995
996 # Parse command line.
997 &parse_arguments;
998
999 # Do configure.ac scan only once.
1000 &scan_autoconf_files;
1001
1002 die "$me: no `Makefile.am' found or specified\n"
1003     if ! @input_files;
1004
1005 # Now do all the work on each file.
1006 # This guy must be local otherwise it's private to the loop.
1007 use vars '$am_file';
1008 local $am_file;
1009 foreach $am_file (@input_files)
1010 {
1011     if (! -f ($am_file . '.am'))
1012     {
1013         &am_error ("`" . $am_file . ".am' does not exist");
1014     }
1015     else
1016     {
1017         &generate_makefile ($output_files{$am_file}, $am_file);
1018     }
1019 }
1020
1021 exit $exit_status;
1022
1023 # FIXME: This should be `my'ed next to its subs.
1024 use vars '%require_file_found';
1025
1026 ################################################################
1027
1028 # prog_error (@PRINT-ME)
1029 # ----------------------
1030 # Signal a programming error, display PRINT-ME, and exit 1.
1031 sub prog_error (@)
1032 {
1033     print STDERR "$me: programming error: @_\n";
1034     exit 1;
1035 }
1036
1037
1038 # subst ($TEXT)
1039 # -------------
1040 # Return a configure-style substitution using the indicated text.
1041 # We do this to avoid having the substitutions directly in automake.in;
1042 # when we do that they are sometimes removed and this causes confusion
1043 # and bugs.
1044 sub subst ($)
1045 {
1046     my ($text) = @_;
1047     return '@' . $text . '@';
1048 }
1049
1050 ################################################################
1051
1052
1053 # $BACKPATH
1054 # &backname ($REL-DIR)
1055 # --------------------
1056 # If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'.
1057 # For instance `src/foo' => `../..'.
1058 # Works with non strictly increasing paths, i.e., `src/../lib' => `..'.
1059 sub backname ($)
1060 {
1061     my ($file) = @_;
1062     my @res;
1063     foreach (split (/\//, $file))
1064     {
1065         next if $_ eq '.' || $_ eq '';
1066         if ($_ eq '..')
1067         {
1068             pop @res;
1069         }
1070         else
1071         {
1072             push (@res, '..');
1073         }
1074     }
1075     return join ('/', @res) || '.';
1076 }
1077
1078 ################################################################
1079
1080 # Parse command line.
1081 sub parse_arguments ()
1082 {
1083     # Start off as gnu.
1084     &set_strictness ('gnu');
1085
1086     use Getopt::Long;
1087     Getopt::Long::config ("bundling");
1088     Getopt::Long::GetOptions
1089       (
1090        'version'        => \&version,
1091        'help'           => \&usage,
1092        'libdir:s'       => \$libdir,
1093        'gnu'            => sub { &set_strictness ('gnu'); },
1094        'gnits'          => sub { &set_strictness ('gnits'); },
1095        'cygnus'         => \$cygnus_mode,
1096        'foreign'        => sub { &set_strictness ('foreign'); },
1097        'include-deps'   => sub { $cmdline_use_dependencies = 1; },
1098        'i|ignore-deps'  => sub { $cmdline_use_dependencies = 0; },
1099        'no-force'       => sub { $force_generation = 0; },
1100        'f|force-missing'=> \$force_missing,
1101        'o|output-dir:s' => \$output_directory,
1102        'a|add-missing'  => \$add_missing,
1103        'c|copy'         => \$copy_missing,
1104        'v|verbose'      => \$verbose,
1105        'Werror'         => sub { $SIG{"__WARN__"} = sub { die $_[0] } },
1106        'Wno-error'      => sub { $SIG{"__WARN__"} = 'DEFAULT' }
1107       )
1108         or exit 1;
1109
1110     foreach my $arg (@ARGV)
1111     {
1112       # Handle $local:$input syntax.  Note that we only examine the
1113       # first ":" file to see if it is automake input; the rest are
1114       # just taken verbatim.  We still keep all the files around for
1115       # dependency checking, however.
1116       my ($local, $input, @rest) = split (/:/, $arg);
1117       if (! $input)
1118         {
1119           $input = $local;
1120         }
1121       else
1122         {
1123           # Strip .in; later on .am is tacked on.  That is how the
1124           # automake input file is found.  Maybe not the best way, but
1125           # it is easy to explain.
1126           $input =~ s/\.in$//
1127             or die "$me: invalid input file name `$arg'\n.";
1128         }
1129       push (@input_files, $input);
1130       $output_files{$input} = join (':', ($local, @rest));
1131     }
1132
1133     # Take global strictness from whatever we currently have set.
1134     $default_strictness = $strictness;
1135     $default_strictness_name = $strictness_name;
1136 }
1137
1138 ################################################################
1139
1140 # Generate a Makefile.in given the name of the corresponding Makefile and
1141 # the name of the file output by config.status.
1142 sub generate_makefile
1143 {
1144     my ($output, $makefile) = @_;
1145
1146     # Reset all the Makefile.am related variables.
1147     &initialize_per_input;
1148
1149     # Name of input file ("Makefile.am") and output file
1150     # ("Makefile.in").  These have no directory components.
1151     $am_file_name = basename ($makefile) . '.am';
1152     $in_file_name = basename ($makefile) . '.in';
1153
1154     # $OUTPUT is encoded.  If it contains a ":" then the first element
1155     # is the real output file, and all remaining elements are input
1156     # files.  We don't scan or otherwise deal with these input file,
1157     # other than to mark them as dependencies.  See
1158     # &scan_autoconf_files for details.
1159     my (@secondary_inputs);
1160     ($output, @secondary_inputs) = split (/:/, $output);
1161
1162     $relative_dir = dirname ($output);
1163     $am_relative_dir = dirname ($makefile);
1164
1165     &read_main_am_file ($makefile . '.am');
1166     if (&handle_options)
1167     {
1168         # Fatal error.  Just return, so we can continue with next file.
1169         return;
1170     }
1171
1172     # There are a few install-related variables that you should not define.
1173     foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
1174     {
1175         if (&variable_defined ($var) && !$var_is_am{$var})
1176         {
1177             macro_error ($var, "`$var' should not be defined");
1178         }
1179     }
1180
1181     &handle_libtool;
1182
1183     # At the toplevel directory, we might need config.guess, config.sub
1184     # or libtool scripts (ltconfig and ltmain.sh).
1185     if ($relative_dir eq '.')
1186     {
1187         # AC_CANONICAL_HOST and AC_CANONICAL_SYSTEM need config.guess and
1188         # config.sub.
1189         &require_config_file ($FOREIGN, 'config.guess', 'config.sub')
1190             if $seen_canonical;
1191     }
1192
1193     # We still need Makefile.in here, because sometimes the `dist'
1194     # target doesn't re-run automake.
1195     if ($am_relative_dir eq $relative_dir)
1196     {
1197         # Only distribute the files if they are in the same subdir as
1198         # the generated makefile.
1199         &push_dist_common ($in_file_name, $am_file_name);
1200     }
1201
1202     push (@sources, '$(SOURCES)')
1203         if &variable_defined ('SOURCES');
1204
1205     # Must do this after reading .am file.  See read_main_am_file to
1206     # understand weird tricks we play there with variables.
1207     &define_variable ('subdir', $relative_dir);
1208
1209     # Check first, because we might modify some state.
1210     &check_cygnus;
1211     &check_gnu_standards;
1212     &check_gnits_standards;
1213
1214     &handle_configure ($output, $makefile, @secondary_inputs);
1215     &handle_gettext;
1216     &handle_libraries;
1217     &handle_ltlibraries;
1218     &handle_programs;
1219     &handle_scripts;
1220
1221     # This must run first so that the ANSI2KNR definition is generated
1222     # before it is used by the _.c rules.  We have to do this because
1223     # a variable which is used in a dependency must be defined before
1224     # the target, or else make won't properly see it.
1225     &handle_compile;
1226     # This must be run after all the sources are scanned.
1227     &handle_languages;
1228
1229     # Re-init SOURCES.  FIXME: other code shouldn't depend on this
1230     # (but currently does).
1231     macro_define ('SOURCES', 1, '', 'TRUE',
1232                      join (' ', @sources), 'internal');
1233     define_pretty_variable ('DIST_SOURCES', '', @dist_sources);
1234
1235     &handle_multilib;
1236     &handle_texinfo;
1237     &handle_emacs_lisp;
1238     &handle_python;
1239     &handle_java;
1240     &handle_man_pages;
1241     &handle_data;
1242     &handle_headers;
1243     &handle_subdirs;
1244     &handle_tags;
1245     &handle_minor_options;
1246     &handle_tests;
1247
1248     # This must come after most other rules.
1249     &handle_dist ($makefile);
1250
1251     &handle_footer;
1252     &do_check_merge_target;
1253     &handle_all ($output);
1254
1255     # FIXME: Gross!
1256     if (&variable_defined('lib_LTLIBRARIES') &&
1257         &variable_defined('bin_PROGRAMS'))
1258     {
1259         $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
1260     }
1261
1262     &handle_installdirs;
1263     &handle_clean;
1264     &handle_factored_dependencies;
1265
1266     &check_typos;
1267
1268     if (! -d ($output_directory . '/' . $am_relative_dir))
1269     {
1270         mkdir ($output_directory . '/' . $am_relative_dir, 0755);
1271     }
1272
1273     my ($out_file) = $output_directory . '/' . $makefile . ".in";
1274     if (! $force_generation && -e $out_file)
1275     {
1276         my ($am_time) = (stat ($makefile . '.am'))[9];
1277         my ($in_time) = (stat ($out_file))[9];
1278         # FIXME: should cache these times.
1279         my ($conf_time) = (stat ($configure_ac))[9];
1280         # FIXME: how to do unsigned comparison?
1281         if ($am_time < $in_time || $am_time < $conf_time)
1282         {
1283             # No need to update.
1284             return;
1285         }
1286         if (-f 'aclocal.m4')
1287         {
1288             my ($acl_time) = (stat _)[9];
1289             return if ($am_time < $acl_time);
1290         }
1291     }
1292
1293     my $gm_file = new Automake::XFile "> $out_file";
1294     verbose "creating ", $makefile, ".in";
1295
1296     print $gm_file $output_vars;
1297     # We make sure that `all:' is the first target.
1298     print $gm_file $output_all;
1299     print $gm_file $output_header;
1300     print $gm_file $output_rules;
1301     print $gm_file $output_trailer;
1302 }
1303
1304 ################################################################
1305
1306 # A helper which handles the logic of requiring a version number in
1307 # AUTOMAKE_OPTIONS.  Return 1 on error, 0 on success.
1308 sub version_check ($$$$)
1309 {
1310     my ($rmajor, $rminor, $ralpha, $rfork) = ($1, $2, $3, $4);
1311
1312     &prog_error ("version is incorrect: $VERSION")
1313         if $VERSION !~ /(\d+)\.(\d+)([a-z]?)-?([A-Za-z0-9]+)?/;
1314
1315     my ($tmajor, $tminor, $talpha, $tfork) = ($1, $2, $3, $4);
1316
1317     $rfork ||= '';
1318     $tfork ||= '';
1319
1320     my $rminorminor = 0;
1321     my $tminorminor = 0;
1322
1323     # Some versions were labelled like `1.4-p3a'.  This is the same as
1324     # an alpha release labelled `1.4.3a'.  However, a version like
1325     # `1.4g' is the same as `1.4.99g'.  Yes, this sucks.  Moral:
1326     # always listen to the users.
1327     if ($rfork =~ /p([0-9]+)([a-z]?)/)
1328     {
1329         $rminorminor = $1;
1330         # `1.4a-p3b' never existed.  But we'll accept it anyway.
1331         $ralpha = $ralpha || $2 || '';
1332         $rfork = '';
1333     }
1334     if ($tfork =~ /p([0-9]+)([a-z]?)/)
1335     {
1336         $tminorminor = $1;
1337         # `1.4a-p3b' never existed.  But we'll accept it anyway.
1338         $talpha = $talpha || $2 || '';
1339         $tfork = '';
1340     }
1341
1342     $rminorminor = 99 if $ralpha ne '' && $rminorminor == 0;
1343     $tminorminor = 99 if $talpha ne '' && $tminorminor == 0;
1344
1345     # 2.0 is better than 1.0.
1346     # 1.2 is better than 1.1.
1347     # 1.2a is better than 1.2.
1348     # If we require 3.4n-foo then we require something
1349     # >= 3.4n, with the `foo' fork identifier.
1350     # The $r* variables are what the user specified.
1351     # The $t* variables denote automake itself.
1352     if ($rmajor > $tmajor
1353         || ($rmajor == $tmajor && $rminor > $tminor)
1354         || ($rminor == $tminor && $rminor == $tminor
1355             && $rminorminor > $tminorminor)
1356         || ($rminor == $tminor && $rminor == $tminor
1357             && $rminorminor == $tminorminor
1358             && $ralpha gt $talpha)
1359         || ($rfork ne '' && $rfork ne $tfork))
1360     {
1361         macro_error ('AUTOMAKE_OPTIONS',
1362                      "require version $_, but have $VERSION");
1363         return 1;
1364     }
1365
1366     return 0;
1367 }
1368
1369 # Handle AUTOMAKE_OPTIONS variable.  Return 1 on error, 0 otherwise.
1370 sub handle_options
1371 {
1372     if (&variable_defined ('AUTOMAKE_OPTIONS'))
1373     {
1374         foreach (&variable_value_as_list_recursive ('AUTOMAKE_OPTIONS', ''))
1375         {
1376             $options{$_} = 1;
1377             if ($_ eq 'gnits' || $_ eq 'gnu' || $_ eq 'foreign')
1378             {
1379                 &set_strictness ($_);
1380             }
1381             elsif ($_ eq 'cygnus')
1382             {
1383                 $cygnus_mode = 1;
1384             }
1385             elsif (/^(.*\/)?ansi2knr$/)
1386             {
1387                 # An option like "../lib/ansi2knr" is allowed.  With
1388                 # no path prefix, we assume the required programs are
1389                 # in this directory.  We save the actual option for
1390                 # later.
1391                 $options{'ansi2knr'} = $_;
1392             }
1393             elsif ($_ eq 'no-installman' || $_ eq 'no-installinfo'
1394                    || $_ eq 'dist-shar' || $_ eq 'dist-zip'
1395                    || $_ eq 'dist-tarZ' || $_ eq 'dist-bzip2'
1396                    || $_ eq 'dejagnu' || $_ eq 'no-texinfo.tex'
1397                    || $_ eq 'readme-alpha' || $_ eq 'check-news'
1398                    || $_ eq 'subdir-objects' || $_ eq 'nostdinc'
1399                    || $_ eq 'no-exeext')
1400             {
1401                 # Explicitly recognize these.
1402             }
1403             elsif ($_ eq 'no-dependencies')
1404             {
1405                 $use_dependencies = 0;
1406             }
1407             elsif (/(\d+)\.(\d+)([a-z]?)(-[A-Za-z0-9]+)?/)
1408             {
1409                 # Got a version number.
1410                 if (version_check ($1, $2, $3, $4))
1411                 {
1412                     return 1;
1413                 }
1414             }
1415             else
1416             {
1417                 macro_error ('AUTOMAKE_OPTIONS',
1418                              "option `" . $_ . "\' not recognized");
1419             }
1420         }
1421     }
1422
1423     if ($strictness == $GNITS)
1424     {
1425         $options{'readme-alpha'} = 1;
1426         $options{'check-news'} = 1;
1427     }
1428
1429     return 0;
1430 }
1431
1432
1433 # get_object_extension ($OUT)
1434 # ---------------------------
1435 # Return object extension.  Just once, put some code into the output.
1436 # OUT is the name of the output file
1437 sub get_object_extension
1438 {
1439     my ($out) = @_;
1440
1441     # Maybe require libtool library object files.
1442     my $extension = '.$(OBJEXT)';
1443     $extension = '.lo' if ($out =~ /\.la$/);
1444
1445     # Check for automatic de-ANSI-fication.
1446     $extension = '$U' . $extension
1447       if defined $options{'ansi2knr'};
1448
1449     $get_object_extension_was_run = 1;
1450
1451     return $extension;
1452 }
1453
1454
1455 # Call finish function for each language that was used.
1456 sub handle_languages
1457 {
1458     if ($use_dependencies)
1459     {
1460         # Include auto-dep code.  Don't include it if DEP_FILES would
1461         # be empty.
1462         if (&saw_sources_p (0) && keys %dep_files)
1463         {
1464             # Set location of depcomp.
1465             &define_variable ('depcomp', "\$(SHELL) $config_aux_dir/depcomp");
1466
1467             &require_conf_file ("$am_file.am", $FOREIGN, 'depcomp');
1468
1469             my @deplist = sort keys %dep_files;
1470
1471             # We define this as a conditional variable because BSD
1472             # make can't handle backslashes for continuing comments on
1473             # the following line.
1474             define_pretty_variable ('DEP_FILES', 'AMDEP_TRUE', @deplist);
1475
1476             # Generate each `include' individually.  Irix 6 make will
1477             # not properly include several files resulting from a
1478             # variable expansion; generating many separate includes
1479             # seems safest.
1480             $output_rules .= "\n";
1481             foreach my $iter (@deplist)
1482             {
1483                 $output_rules .= (subst ('AMDEP_TRUE')
1484                                   . subst ('am__include')
1485                                   . ' '
1486                                   . subst ('am__quote')
1487                                   . $iter
1488                                   . subst ('am__quote')
1489                                   . "\n");
1490             }
1491
1492             $output_rules .= &file_contents ('depend');
1493         }
1494     }
1495     else
1496     {
1497         &define_variable ('depcomp', '');
1498     }
1499
1500     my %done;
1501
1502     # Is the c linker needed?
1503     my $needs_c = 0;
1504     foreach my $ext (sort keys %extension_seen)
1505     {
1506         next unless $extension_map{$ext};
1507
1508         my $lang = $languages{$extension_map{$ext}};
1509
1510         my $rule_file = $lang->rule_file || 'depend2';
1511
1512         # Get information on $LANG.
1513         my $pfx = $lang->autodep;
1514         my $fpfx = ($pfx eq '') ? 'CC' : $pfx;
1515
1516         my $AMDEP = (($use_dependencies && $lang->autodep ne 'no')
1517                      ? 'AMDEP' : 'FALSE');
1518
1519         my %transform = ('EXT'     => $ext,
1520                          'PFX'     => $pfx,
1521                          'FPFX'    => $fpfx,
1522                          'LIBTOOL' => $seen_libtool,
1523                          'AMDEP'   => $AMDEP,
1524                          '-c'      => $lang->compile_flag || '',
1525                          'MORE-THAN-ONE'
1526                                    => (count_files_for_language ($lang->name) > 1));
1527
1528         # Generate the appropriate rules for this extension.
1529         if (($use_dependencies && $lang->autodep ne 'no')
1530             || defined $lang->compile)
1531         {
1532             # Some C compilers don't support -c -o.  Use it only if really
1533             # needed.
1534             my $output_flag = $lang->output_flag || '';
1535             $output_flag = '-o'
1536               if (! $output_flag
1537                   && $lang->flags eq 'CFLAGS'
1538                   && defined $options{'subdir-objects'});
1539
1540             # FIXME: this is a temporary hack to compute a possible
1541             # derived extension.  This is not used by depend2.am.
1542             (my $der_ext = $ext) =~ tr/yl/cc/;
1543
1544             # Another yacc/lex hack.
1545             my $destfile = '$*.' . $der_ext;
1546
1547             $output_rules .=
1548               file_contents ($rule_file,
1549                              %transform,
1550                              'GENERIC'   => 1,
1551
1552                              'DERIVED-EXT' => $der_ext,
1553
1554                              'BASE'      => '$*',
1555                              'SOURCE'    => '$<',
1556                              'OBJ'       => '$@',
1557                              'OBJOBJ'    => '$@',
1558                              'LTOBJ'     => '$@',
1559
1560                              'COMPILE'   => '$(' . $lang->compiler . ')',
1561                              'LTCOMPILE' => '$(LT' . $lang->compiler . ')',
1562                              '-o'        => $output_flag);
1563         }
1564
1565         # Now include code for each specially handled object with this
1566         # language.
1567         my %seen_files = ();
1568         foreach my $file (@{$lang_specific_files{$lang->name}})
1569         {
1570             my ($derived, $source, $obj, $myext) = split (' ', $file);
1571
1572             # We might see a given object twice, for instance if it is
1573             # used under different conditions.
1574             next if defined $seen_files{$obj};
1575             $seen_files{$obj} = 1;
1576
1577             my $flags = $lang->flags || '';
1578             my $val = "${derived}_${flags}";
1579
1580             prog_error ("found $lang->name in handle_languages, but compiler not defined")
1581                 unless defined $lang->compile;
1582
1583             (my $obj_compile = $lang->compile) =~ s/\(AM_$flags/\($val/;
1584             my $obj_ltcompile = '$(LIBTOOL) --mode=compile ' . $obj_compile;
1585
1586             # We _need_ `-o' for per object rules.
1587             my $output_flag = $lang->output_flag || '-o';
1588
1589             # Generate a transform which will turn suffix targets in
1590             # depend2.am into real targets for the particular objects we
1591             # are building.
1592             $output_rules .=
1593               file_contents ($rule_file,
1594                              (%transform,
1595                               'GENERIC'   => 0,
1596
1597                               'BASE'      => $obj,
1598                               'SOURCE'    => $source,
1599                               # Use $myext and not `.o' here, in case
1600                               # we are actually building a new source
1601                               # file -- e.g. via yacc.
1602                               'OBJ'       => "$obj$myext",
1603                               'OBJOBJ'    => "$obj.obj",
1604                               'LTOBJ'     => "$obj.lo",
1605
1606                               'COMPILE'   => $obj_compile,
1607                               'LTCOMPILE' => $obj_ltcompile,
1608                               '-o'        => $output_flag));
1609         }
1610
1611         # The rest of the loop is done once per language.
1612         next if defined $done{$lang};
1613         $done{$lang} = 1;
1614
1615         # Load the language dependent Makefile chunks.
1616         my %lang = map { uc ($_) => 0 } keys %languages;
1617         $lang{uc ($lang->name)} = 1;
1618         $output_rules .= file_contents ('lang-compile', %transform, %lang);
1619
1620         # If the source to a program consists entirely of code from a
1621         # `pure' language, for instance C++ for Fortran 77, then we
1622         # don't need the C compiler code.  However if we run into
1623         # something unusual then we do generate the C code.  There are
1624         # probably corner cases here that do not work properly.
1625         # People linking Java code to Fortran code deserve pain.
1626         $needs_c ||= ! $lang->pure;
1627
1628         define_compiler_variable ($lang)
1629           if ($lang->compile);
1630
1631         define_linker_variable ($lang)
1632           if ($lang->link);
1633
1634         foreach my $var (@{$lang->config_vars})
1635           {
1636             am_error ($lang->Name
1637                       . " source seen but `$var' not defined in"
1638                       . " `$configure_ac'")
1639               if !exists $configure_vars{$var};
1640           }
1641
1642         # The compiler's flag must be a configure variable.
1643         define_configure_variable ($lang->flags)
1644             if defined $lang->flags && $lang->define_flag;
1645
1646         # Call the finisher.
1647         $lang->finish;
1648     }
1649
1650     # If the project is entirely C++ or entirely Fortran 77 (i.e., 1
1651     # suffix rule was learned), don't bother with the C stuff.  But if
1652     # anything else creeps in, then use it.
1653     $needs_c = 1
1654       if $need_link || scalar keys %suffix_rules > 1;
1655
1656     if ($needs_c)
1657       {
1658         if (! defined $done{$languages{'c'}})
1659           {
1660             &define_configure_variable ($languages{'c'}->flags);
1661             &define_compiler_variable ($languages{'c'});
1662           }
1663         define_linker_variable ($languages{'c'});
1664       }
1665 }
1666
1667 # Check to make sure a source defined in LIBOBJS is not explicitly
1668 # mentioned.  This is a separate function (as opposed to being inlined
1669 # in handle_source_transform) because it isn't always appropriate to
1670 # do this check.
1671 sub check_libobjs_sources
1672 {
1673     my ($one_file, $unxformed) = @_;
1674
1675     foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
1676                         'dist_EXTRA_', 'nodist_EXTRA_')
1677     {
1678         my @files;
1679         if (&variable_defined ($prefix . $one_file . '_SOURCES'))
1680         {
1681             @files = &variable_value_as_list_recursive (
1682                                 ($prefix . $one_file . '_SOURCES'),
1683                                 'all');
1684         }
1685         elsif ($prefix eq '')
1686         {
1687             @files = ($unxformed . '.c');
1688         }
1689         else
1690         {
1691             next;
1692         }
1693
1694         foreach my $file (@files)
1695         {
1696             if (defined $libsources{$file})
1697             {
1698                 macro_error ($prefix . $one_file . '_SOURCES',
1699                              "automatically discovered file `$file' should not be explicitly mentioned");
1700             }
1701         }
1702     }
1703 }
1704
1705
1706 # @OBJECTS
1707 # handle_single_transform_list ($VAR, $TOPPARENT, $DERIVED, $OBJ, @FILES)
1708 # -----------------------------------------------------------------------
1709 # Does much of the actual work for handle_source_transform.
1710 # Arguments are:
1711 #   $VAR is the name of the variable that the source filenames come from
1712 #   $TOPPARENT is the name of the _SOURCES variable which is being processed
1713 #   $DERIVED is the name of resulting executable or library
1714 #   $OBJ is the object extension (e.g., `$U.lo')
1715 #   @FILES is the list of source files to transform
1716 # Result is a list of the names of objects
1717 # %linkers_used will be updated with any linkers needed
1718 sub handle_single_transform_list ($$$$@)
1719 {
1720     my ($var, $topparent, $derived, $obj, @files) = @_;
1721     my @result = ();
1722     my $nonansi_obj = $obj;
1723     $nonansi_obj =~ s/\$U//g;
1724
1725     # Turn sources into objects.  We use a while loop like this
1726     # because we might add to @files in the loop.
1727     while (scalar @files > 0)
1728     {
1729         $_ = shift @files;
1730
1731         # Configure substitutions in _SOURCES variables are errors.
1732         if (/^\@.*\@$/)
1733         {
1734             macro_error ($var,
1735                          "`$var' includes configure substitution `$_', and is referred to from `$topparent': configure substitutions not allowed in _SOURCES variables");
1736             next;
1737         }
1738
1739         # If the source file is in a subdirectory then the `.o' is put
1740         # into the current directory, unless the subdir-objects option
1741         # is in effect.
1742
1743         # Split file name into base and extension.
1744         next if ! /^(?:(.*)\/)?([^\/]*)\.(.*)$/;
1745         my $full = $_;
1746         my $directory = $1 || '';
1747         my $base = $2;
1748         my $extension = $3;
1749
1750         # We must generate a rule for the object if it requires its own flags.
1751         my $renamed = 0;
1752         my ($linker, $object);
1753
1754         # This records whether we've seen a derived source file (eg,
1755         # yacc output).
1756         my $derived_source = 0;
1757
1758         # This holds the `aggregate context' of the file we are
1759         # currently examining.  If the file is compiled with
1760         # per-object flags, then it will be the name of the object.
1761         # Otherwise it will be `AM'.  This is used by the target hook
1762         # language function.
1763         my $aggregate = 'AM';
1764
1765         $extension = &derive_suffix ($extension);
1766         my $lang;
1767         if ($extension_map{$extension} &&
1768             ($lang = $languages{$extension_map{$extension}}))
1769         {
1770             # Found the language, so see what it says.
1771             &saw_extension ($extension);
1772
1773             # Note: computed subr call.  The language rewrite function
1774             # should return one of the $LANG_* constants.  It could
1775             # also return a list whose first value is such a constant
1776             # and whose second value is a new source extension which
1777             # should be applied.  This means this particular language
1778             # generates another source file which we must then process
1779             # further.
1780             my $subr = 'lang_' . $lang->name . '_rewrite';
1781             my ($r, $source_extension)
1782                 = & $subr ($directory, $base, $extension);
1783             # Skip this entry if we were asked not to process it.
1784             next if $r == $LANG_IGNORE;
1785
1786             # Now extract linker and other info.
1787             $linker = $lang->linker;
1788
1789             my $this_obj_ext;
1790             if (defined $source_extension)
1791             {
1792                 $this_obj_ext = '.' . $source_extension;
1793                 $derived_source = 1;
1794             }
1795             elsif ($lang->ansi)
1796             {
1797                 $this_obj_ext = $obj;
1798             }
1799             else
1800             {
1801                 $this_obj_ext = $nonansi_obj;
1802             }
1803             $object = $base . $this_obj_ext;
1804
1805             if (defined $lang->flags
1806                 && &variable_defined ($derived . '_' . $lang->flags))
1807             {
1808                 # We have a per-executable flag in effect for this
1809                 # object.  In this case we rewrite the object's
1810                 # name to ensure it is unique.  We also require
1811                 # the `compile' program to deal with compilers
1812                 # where `-c -o' does not work.
1813
1814                 # We choose the name `DERIVED_OBJECT' to ensure
1815                 # (1) uniqueness, and (2) continuity between
1816                 # invocations.  However, this will result in a
1817                 # name that is too long for losing systems, in
1818                 # some situations.  So we provide _SHORTNAME to
1819                 # override.
1820
1821                 my $dname = $derived;
1822                 if (&variable_defined ($derived . '_SHORTNAME'))
1823                 {
1824                     # FIXME: should use the same conditional as
1825                     # the _SOURCES variable.  But this is really
1826                     # silly overkill -- nobody should have
1827                     # conditional shortnames.
1828                     $dname = &variable_value ($derived . '_SHORTNAME');
1829                 }
1830                 $object = $dname . '-' . $object;
1831
1832                 &require_conf_file ("$am_file.am", $FOREIGN, 'compile')
1833                     if $lang->name eq 'c';
1834
1835                 &prog_error ("$lang->name flags defined without compiler")
1836                     if ! defined $lang->compile;
1837
1838                 $renamed = 1;
1839             }
1840
1841             # If rewrite said it was ok, put the object into a
1842             # subdir.
1843             if ($r == $LANG_SUBDIR && $directory ne '')
1844             {
1845                 $object = $directory . '/' . $object;
1846             }
1847
1848             # If doing dependency tracking, then we can't print
1849             # the rule.  If we have a subdir object, we need to
1850             # generate an explicit rule.  Actually, in any case
1851             # where the object is not in `.' we need a special
1852             # rule.  The per-object rules in this case are
1853             # generated later, by handle_languages.
1854             if ($renamed || $directory ne '')
1855             {
1856                 my $obj_sans_ext = substr ($object, 0,
1857                                            - length ($this_obj_ext));
1858                 my $val = ("$full $obj_sans_ext "
1859                            # Only use $this_obj_ext in the derived
1860                            # source case because in the other case we
1861                            # *don't* want $(OBJEXT) to appear here.
1862                            . ($derived_source ? $this_obj_ext : '.o'));
1863
1864                 # If we renamed the object then we want to use the
1865                 # per-executable flag name.  But if this is simply a
1866                 # subdir build then we still want to use the AM_ flag
1867                 # name.
1868                 if ($renamed)
1869                 {
1870                     $val = "$derived $val";
1871                     $aggregate = $derived;
1872                 }
1873                 else
1874                 {
1875                     $val = "AM $val";
1876                 }
1877
1878                 # Each item on this list is a string consisting of
1879                 # four space-separated values: the derived flag prefix
1880                 # (eg, for `foo_CFLAGS', it is `foo'), the name of the
1881                 # source file, the base name of the output file, and
1882                 # the extension for the object file.
1883                 push (@{$lang_specific_files{$lang->name}}, $val);
1884             }
1885         }
1886         elsif ($extension eq 'o')
1887         {
1888             # This is probably the result of a direct suffix rule.
1889             # In this case we just accept the rewrite.  FIXME:
1890             # this fails if we want libtool objects.
1891             $object = $base . '.' . $extension;
1892             $linker = '';
1893         }
1894         else
1895         {
1896             # No error message here.  Used to have one, but it was
1897             # very unpopular.
1898             # FIXME: we could potentially do more processing here,
1899             # perhaps treating the new extension as though it were a
1900             # new source extension (as above).  This would require
1901             # more restructuring than is appropriate right now.
1902             next;
1903         }
1904
1905         if (defined $object_map{$object})
1906         {
1907             if ($object_map{$object} ne $full)
1908             {
1909                 am_error ("object `$object' created by `$full' and `$object_map{$object}'");
1910             }
1911         }
1912
1913         # Let the language do some special magic if required.
1914         $lang->target_hook ($aggregate, $object, $full);
1915
1916         if ($derived_source)
1917         {
1918             &prog_error ("$lang->name has automatic dependency tracking")
1919                 if $lang->autodep ne 'no';
1920             # Make sure this new source file is handled next.  That will
1921             # make it appear to be at the right place in the list.
1922             unshift (@files, $object);
1923             # FIXME: nodist.
1924             &push_dist_common ($object);
1925             next;
1926         }
1927
1928         $linkers_used{$linker} = 1;
1929
1930         push (@result, $object);
1931
1932         if (! defined $object_map{$object})
1933         {
1934             my @dep_list = ();
1935             $object_map{$object} = $full;
1936
1937             # If file is in subdirectory, we need explicit
1938             # dependency.
1939             if ($directory ne '' || $renamed)
1940             {
1941                 push (@dep_list, $full);
1942             }
1943
1944             # If resulting object is in subdir, we need to make
1945             # sure the subdir exists at build time.
1946             if ($object =~ /\//)
1947             {
1948                 # FIXME: check that $DIRECTORY is somewhere in the
1949                 # project
1950
1951                 # We don't allow `..' in object file names for
1952                 # *any* source, not just Java.  For Java it just
1953                 # doesn't make sense, but in general it is
1954                 # a problem because we can't pick a good name for
1955                 # the .deps entry.
1956                 if ($object =~ /(\/|^)\.\.\//)
1957                 {
1958                     am_error ("`$full' contains `..' component but should not");
1959                 }
1960
1961                 # Make sure object is removed by `make mostlyclean'.
1962                 $compile_clean_files{$object} = $MOSTLY_CLEAN;
1963
1964                 push (@dep_list, &require_build_directory ($directory));
1965
1966                 # If we're generating dependencies, we also want
1967                 # to make sure that the appropriate subdir of the
1968                 # .deps directory is created.
1969                 push (@dep_list, &require_build_directory ('$(DEPDIR)/' . $directory))
1970                     if ($use_dependencies);
1971             }
1972
1973             &pretty_print_rule ($object . ':', "\t", @dep_list)
1974                 if scalar @dep_list > 0;
1975         }
1976
1977         # Transform .o or $o file into .P file (for automatic
1978         # dependency code).
1979         if ($lang && $lang->autodep ne 'no')
1980         {
1981             my $depfile = $object;
1982             $depfile =~ s/\.([^.]*)$/.P$1/;
1983             $depfile =~ s/\$\(OBJEXT\)$/o/;
1984             $dep_files{'$(DEPDIR)/' . $depfile} = 1;
1985         }
1986     }
1987
1988     return @result;
1989 }
1990
1991 # $BOOL
1992 # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE,
1993 #                              $OBJ, $PARENT, $TOPPARENT)
1994 # ---------------------------------------------------------------------
1995 # Define an _OBJECTS variable for a _SOURCES variable (or subvariable)
1996 #
1997 # Arguments are:
1998 #   $VAR is the name of the _SOURCES variable
1999 #   $OBJVAR is the name of the _OBJECTS
2000 #   $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but
2001 #   work done to determine the linker will be).
2002 #   $ONE_FILE is the canonical (transformed) name of object to build
2003 #   $OBJ is the object extension (ie either `.o' or `$o'.
2004 #   $PARENT is the variable in which $VAR is used, or $VAR if not applicable.
2005 #   $TOPPARENT is the _SOURCES variable being processed.
2006 #
2007 # Result is a boolean, true if a linker is needed to deal with the objects.
2008 #
2009 # %linkers_used, %vars_scanned, @substfroms and @substtos should be cleared
2010 # before use:
2011 #   %linkers_used variable will be set to contain the linkers desired.
2012 #   %vars_scanned will be used to check for recursive definitions.
2013 #   @substfroms and @substtos will be used to keep a stack of variable
2014 #   substitutions to be applied.
2015 #
2016 sub define_objects_from_sources ($$$$$$$)
2017 {
2018     my ($var, $objvar, $nodefine, $one_file, $obj, $parent, $topparent) = @_;
2019
2020     if (defined $vars_scanned{$var})
2021     {
2022         macro_error ($var, "variable `$var' recursively defined");
2023         return "";
2024     }
2025     $vars_scanned{$var} = 1;
2026
2027     my $needlinker = "";
2028     foreach my $cond (variable_conditions ($var))
2029     {
2030         my @result;
2031         foreach my $val (&variable_value_as_list ($var, $cond, $parent))
2032         {
2033             if ($val =~ /^\$\{([^}]*)\}$/ || $val =~ /^\$\(([^)]*)\)$/)
2034             {
2035                 # Handle a sub variable
2036                 my $subvar = $1;
2037
2038                 # If the user uses a losing variable name, just ignore it.
2039                 # This isn't ideal, but people have requested it.
2040                 next if ($subvar =~ /\@.*\@/);
2041
2042                 # See if the variable is actually a substitution reference
2043                 my ($from, $to);
2044                 my @temp_list;
2045                 if ($subvar =~ /$SUBST_REF_PATTERN/o)
2046                 {
2047                     $subvar = $1;
2048                     $to = $3;
2049                     ($from = $2) =~ s/(\W)/\\$1/g;
2050                 }
2051                 push @substfroms, $from;
2052                 push @substtos, $to;
2053
2054                 my $subobjvar = subobjname ($subvar);
2055                 push (@result, '$('. $subobjvar . ')');
2056
2057                 my $temp = define_objects_from_sources ($subvar, $subobjvar,
2058                                                         $nodefine, $one_file,
2059                                                         $obj, $var, $topparent);
2060                 $needlinker ||= $temp;
2061
2062                 pop @substfroms;
2063                 pop @substtos;
2064             }
2065             else
2066             {
2067                 my $substnum=$#substfroms;
2068                 while ($substnum >= 0)
2069                 {
2070                     $val =~ s/$substfroms[$substnum]$/$substtos[$substnum]/
2071                         if defined $substfroms[$substnum];
2072                     $substnum -= 1;
2073                 }
2074
2075                 my (@transformed) =
2076                       &handle_single_transform_list ($var, $topparent, $one_file, $obj, $val);
2077                 push (@result, @transformed);
2078                 $needlinker = "true" if @transformed;
2079             }
2080         }
2081
2082         # Define _OBJECTS conditionally.
2083         define_pretty_variable ($objvar, $cond, (@result))
2084                 unless $nodefine;
2085     }
2086
2087     delete $vars_scanned{$var};
2088     return $needlinker;
2089 }
2090
2091
2092 # $OBJNAME
2093 # subobjname ($VARNAME)
2094 # ---------------------
2095 # Return a name for an object variable.
2096 #
2097 # Arguments are:
2098 #   $VARNAME is the name of the variable the object variable is being
2099 #   generated from.
2100 #
2101 # This function also looks at @substfroms and @substtos to determine any
2102 # substitutions to be performed on the object variable.
2103 #
2104 # The name returned is unique for the combination of $varname and
2105 # substitutions to be performed.
2106 sub subobjname ($)
2107 {
2108     my ($varname) = @_;
2109     my $key = $varname;
2110     my $substnum=$#substfroms;
2111     while ($substnum >= 0)
2112     {
2113         if (defined $substfroms[$substnum] &&
2114             ($substfroms[$substnum] || $substtos[$substnum]))
2115         {
2116             $key .= ":" . $substfroms[$substnum] . "=" . $substtos[$substnum];
2117         }
2118         $substnum -= 1;
2119     }
2120
2121     my $num = $substnums{$key};
2122     if (! $num)
2123     {
2124         $num = keys(%substnums) + 1;
2125         $substnums{$key} = $num;
2126     }
2127
2128     return "am__objects_$num";
2129 }
2130
2131
2132 # Handle SOURCE->OBJECT transform for one program or library.
2133 # Arguments are:
2134 #   canonical (transformed) name of object to build
2135 #   actual name of object to build
2136 #   object extension (ie either `.o' or `$o'.
2137 # Return result is name of linker variable that must be used.
2138 # Empty return means just use `LINK'.
2139 sub handle_source_transform
2140 {
2141     # one_file is canonical name.  unxformed is given name.  obj is
2142     # object extension.
2143     my ($one_file, $unxformed, $obj) = @_;
2144
2145     my ($linker) = '';
2146
2147     if (&variable_defined ($one_file . "_OBJECTS"))
2148     {
2149         macro_error ($one_file . '_OBJECTS',
2150                      $one_file . '_OBJECTS', 'should not be defined');
2151         # No point in continuing.
2152         return;
2153     }
2154
2155     my %used_pfx = ();
2156     my $needlinker;
2157     %linkers_used = ();
2158     foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
2159                         'dist_EXTRA_', 'nodist_EXTRA_')
2160     {
2161         my $var = $prefix . $one_file . "_SOURCES";
2162         next
2163           if !variable_defined ($var);
2164
2165         # We are going to define _OBJECTS variables using the prefix.
2166         # Then we glom them all together.  So we can't use the null
2167         # prefix here as we need it later.
2168         my $xpfx = ($prefix eq '') ? 'am_' : $prefix;
2169
2170         # Keep track of which prefixes we saw.
2171         $used_pfx{$xpfx} = 1
2172           unless $prefix =~ /EXTRA_/;
2173
2174         push (@sources, '$(' . $prefix . $one_file . "_SOURCES)");
2175         push (@dist_sources, '$(' . $prefix . $one_file . "_SOURCES)")
2176           unless $prefix =~ /^nodist_/;
2177
2178         @substfroms = ();
2179         @substtos = ();
2180         %vars_scanned = ();
2181         my $temp = define_objects_from_sources ($var,
2182                                                 $xpfx . $one_file . '_OBJECTS',
2183                                                 $prefix =~ /EXTRA_/,
2184                                                 $one_file, $obj, $var, $var);
2185         $needlinker ||= $temp;
2186     }
2187     if ($needlinker)
2188     {
2189         $linker ||= &resolve_linker (%linkers_used);
2190     }
2191
2192     my @keys = sort keys %used_pfx;
2193     if (scalar @keys == 0)
2194     {
2195         &define_variable ($one_file . "_SOURCES", $unxformed . ".c");
2196         push (@sources, $unxformed . '.c');
2197         push (@dist_sources, $unxformed . '.c');
2198
2199         %linkers_used = ();
2200         my (@result) =
2201           &handle_single_transform_list ($one_file . '_SOURCES',
2202                                          $one_file . '_SOURCES',
2203                                          $one_file, $obj,
2204                                          "$unxformed.c");
2205         $linker ||= &resolve_linker (%linkers_used);
2206         define_pretty_variable ($one_file . "_OBJECTS", '', @result)
2207     }
2208     else
2209     {
2210         grep ($_ = '$(' . $_ . $one_file . '_OBJECTS)', @keys);
2211         define_pretty_variable ($one_file . '_OBJECTS', '', @keys);
2212     }
2213
2214     # If we want to use `LINK' we must make sure it is defined.
2215     if ($linker eq '')
2216     {
2217         $need_link = 1;
2218     }
2219
2220     return $linker;
2221 }
2222
2223
2224 # handle_lib_objects ($XNAME, $VAR)
2225 # ---------------------------------
2226 # Special-case @ALLOCA@ and @LIBOBJS@ in _LDADD or _LIBADD variables.
2227 # Also, generate _DEPENDENCIES variable if appropriate.
2228 # Arguments are:
2229 #   transformed name of object being built, or empty string if no object
2230 #   name of _LDADD/_LIBADD-type variable to examine
2231 # Returns 1 if LIBOBJS seen, 0 otherwise.
2232 sub handle_lib_objects
2233 {
2234     my ($xname, $var) = @_;
2235
2236     &prog_error ("handle_lib_objects: $var undefined")
2237         if ! &variable_defined ($var);
2238
2239     my $ret = 0;
2240     foreach my $cond (variable_conditions_recursive ($var))
2241       {
2242         if (&handle_lib_objects_cond ($xname, $var, $cond))
2243           {
2244             $ret = 1;
2245           }
2246       }
2247     return $ret;
2248 }
2249
2250 # Subroutine of handle_lib_objects: handle a particular condition.
2251 sub handle_lib_objects_cond
2252 {
2253     my ($xname, $var, $cond) = @_;
2254
2255     # We recognize certain things that are commonly put in LIBADD or
2256     # LDADD.
2257     my @dep_list = ();
2258
2259     my $seen_libobjs = 0;
2260     my $flagvar = 0;
2261
2262     foreach my $lsearch (&variable_value_as_list_recursive ($var, $cond))
2263     {
2264         # Skip -lfoo and -Ldir; these are explicitly allowed.
2265         next if $lsearch =~ /^-[lL]/;
2266         if (! $flagvar && $lsearch =~ /^-/)
2267         {
2268             if ($var =~ /^(.*)LDADD$/)
2269             {
2270                 # Skip -dlopen and -dlpreopen; these are explicitly allowed.
2271                 next if $lsearch =~ /^-dl(pre)?open$/;
2272                 macro_error ($var,
2273                              "linker flags such as `$lsearch' belong in `${1}LDFLAGS");
2274             }
2275             else
2276             {
2277                 # Only get this error once.
2278                 $flagvar = 1;
2279                 macro_error ($var,
2280                              "linker flags such as `$lsearch' belong in `${1}LDFLAGS");
2281             }
2282         }
2283
2284         # Assume we have a file of some sort, and push it onto the
2285         # dependency list.  Autoconf substitutions are not pushed;
2286         # rarely is a new dependency substituted into (eg) foo_LDADD
2287         # -- but "bad things (eg -lX11) are routinely substituted.
2288         # Note that LIBOBJS and ALLOCA are exceptions to this rule,
2289         # and handled specially below.
2290         push (@dep_list, $lsearch)
2291             unless $lsearch =~ /^\@.*\@$/;
2292
2293         # Automatically handle @LIBOBJS@ and @ALLOCA@.  Basically this
2294         # means adding entries to dep_files.
2295         if ($lsearch =~ /^\@(LT)?LIBOBJS\@$/)
2296         {
2297             my $lt = $1 ? $1 : '';
2298             my $myobjext = ($1 ? 'l' : '') . 'o';
2299
2300             push (@dep_list, $lsearch);
2301             $seen_libobjs = 1;
2302             if (! keys %libsources
2303                 && ! &variable_defined ($lt . 'LIBOBJS'))
2304             {
2305                 macro_error ($var,
2306                              "\@$lt" . "LIBOBJS\@ seen but never set in `$configure_ac'");
2307             }
2308
2309             foreach my $iter (keys %libsources)
2310             {
2311                 if ($iter =~ /\.([cly])$/)
2312                 {
2313                     &saw_extension ($1);
2314                     &saw_extension ('c');
2315                 }
2316
2317                 if ($iter =~ /\.h$/)
2318                 {
2319                     require_file_with_macro ($var, $FOREIGN, $iter);
2320                 }
2321                 elsif ($iter ne 'alloca.c')
2322                 {
2323                     my $rewrite = $iter;
2324                     $rewrite =~ s/\.c$/.P$myobjext/;
2325                     $dep_files{'$(DEPDIR)/' . $rewrite} = 1;
2326                     ($rewrite = $iter) =~ s/(\W)/\\$1/g;
2327                     $rewrite = "^" . $rewrite . "\$";
2328                     # Only require the file if it is not a built source.
2329                     if (! &variable_defined ('BUILT_SOURCES')
2330                         || ! grep (/$rewrite/,
2331                                    &variable_value_as_list_recursive (
2332                                         'BUILT_SOURCES', 'all')))
2333                     {
2334                         require_file_with_macro ($var, $FOREIGN, $iter);
2335                     }
2336                 }
2337             }
2338         }
2339         elsif ($lsearch =~ /^\@(LT)?ALLOCA\@$/)
2340         {
2341             my $lt = $1 ? $1 : '';
2342             my $myobjext = ($1 ? 'l' : '') . 'o';
2343
2344             push (@dep_list, $lsearch);
2345             macro_error ($var,
2346                          "\@$lt" . "ALLOCA\@ seen but `AC_FUNC_ALLOCA' not in `$configure_ac'")
2347                 if ! defined $libsources{'alloca.c'};
2348             $dep_files{'$(DEPDIR)/alloca.P' . $myobjext} = 1;
2349             require_file_with_macro ($var, $FOREIGN, 'alloca.c');
2350             &saw_extension ('c');
2351         }
2352     }
2353
2354     if ($xname ne '' && ! &variable_defined ($xname . '_DEPENDENCIES', $cond))
2355     {
2356         define_pretty_variable ($xname . '_DEPENDENCIES', $cond, @dep_list);
2357     }
2358
2359     return $seen_libobjs;
2360 }
2361
2362 # Canonicalize the input parameter
2363 sub canonicalize
2364 {
2365     my ($string) = @_;
2366     $string =~ tr/A-Za-z0-9_\@/_/c;
2367     return $string;
2368 }
2369
2370 # Canonicalize a name, and check to make sure the non-canonical name
2371 # is never used.  Returns canonical name.  Arguments are name and a
2372 # list of suffixes to check for.
2373 sub check_canonical_spelling
2374 {
2375     my ($name, @suffixes) = @_;
2376
2377     my $xname = &canonicalize ($name);
2378     if ($xname ne $name)
2379     {
2380         foreach my $xt (@suffixes)
2381         {
2382             macro_error ("$name$xt",
2383                          "invalid variable `$name$xt'; "
2384                          . "should be `$xname$xt'")
2385                 if &variable_defined ("$name$xt");
2386         }
2387     }
2388
2389     return $xname;
2390 }
2391
2392
2393 # handle_compile ()
2394 # -----------------
2395 # Set up the compile suite.
2396 sub handle_compile ()
2397 {
2398     return
2399       unless $get_object_extension_was_run;
2400
2401     # Boilerplate.
2402     my $default_includes = '';
2403     if (! defined $options{'nostdinc'})
2404       {
2405         $default_includes = ' -I. -I$(srcdir)';
2406
2407         if (&variable_defined ('CONFIG_HEADER'))
2408           {
2409             foreach my $hdr (split (' ', &variable_value ('CONFIG_HEADER')))
2410               {
2411                 $default_includes .= ' -I' . dirname ($hdr);
2412               }
2413           }
2414       }
2415
2416     my (@mostly_rms, @dist_rms);
2417     foreach my $item (sort keys %compile_clean_files)
2418     {
2419         if ($compile_clean_files{$item} == $MOSTLY_CLEAN)
2420         {
2421             push (@mostly_rms, "\t-rm -f $item");
2422         }
2423         elsif ($compile_clean_files{$item} == $DIST_CLEAN)
2424         {
2425             push (@dist_rms, "\t-rm -f $item");
2426         }
2427         else
2428         {
2429             &prog_error ("invalid entry in \%compile_clean_files");
2430         }
2431     }
2432
2433     my ($coms, $vars, $rules) =
2434       &file_contents_internal (1, "$libdir/am/compile.am",
2435                                ('DEFAULT_INCLUDES' => $default_includes,
2436                                 'MOSTLYRMS' => join ("\n", @mostly_rms),
2437                                 'DISTRMS' => join ("\n", @dist_rms)));
2438     $output_vars .= $vars;
2439     $output_rules .= "$coms$rules";
2440
2441     # Check for automatic de-ANSI-fication.
2442     if (defined $options{'ansi2knr'})
2443       {
2444         if (! $am_c_prototypes)
2445           {
2446             macro_error ('AUTOMAKE_OPTIONS',
2447                          "option `ansi2knr' in use but `AM_C_PROTOTYPES' not in `$configure_ac'");
2448             &keyed_aclocal_warning ('AM_C_PROTOTYPES');
2449             # Only give this error once.
2450             $am_c_prototypes = 1;
2451           }
2452
2453         # topdir is where ansi2knr should be.
2454         if ($options{'ansi2knr'} eq 'ansi2knr')
2455           {
2456             # Only require ansi2knr files if they should appear in
2457             # this directory.
2458             require_file_with_macro ('AUTOMAKE_OPTIONS', $FOREIGN,
2459                                      'ansi2knr.c', 'ansi2knr.1');
2460
2461             # ansi2knr needs to be built before subdirs, so unshift it.
2462             unshift (@all, '$(ANSI2KNR)');
2463           }
2464
2465         my $ansi2knr_dir = '';
2466         $ansi2knr_dir = dirname ($options{'ansi2knr'})
2467           if $options{'ansi2knr'} ne 'ansi2knr';
2468
2469         $output_rules .= &file_contents ('ansi2knr',
2470                                          ('ANSI2KNR-DIR' => $ansi2knr_dir));
2471
2472     }
2473 }
2474
2475 # handle_libtool ()
2476 # -----------------
2477 # Handle libtool rules.
2478 sub handle_libtool
2479 {
2480     return unless $seen_libtool;
2481
2482     # libtool requires some files, but only at top level.
2483     require_conf_file ($libtool_location, $FOREIGN, @libtoolize_files)
2484         if $relative_dir eq '.';
2485
2486     # Output the libtool compilation rules.
2487     $output_rules .= &file_contents ('libtool');
2488 }
2489
2490 # handle_programs ()
2491 # ------------------
2492 # Handle C programs.
2493 sub handle_programs
2494 {
2495     my @proglist = &am_install_var ('progs', 'PROGRAMS',
2496                                     'bin', 'sbin', 'libexec', 'pkglib',
2497                                     'noinst', 'check');
2498     return if ! @proglist;
2499
2500     my $seen_libobjs = 0;
2501     foreach my $one_file (@proglist)
2502     {
2503         my $obj = &get_object_extension ($one_file);
2504
2505         # Canonicalize names and check for misspellings.
2506         my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
2507                                                '_SOURCES', '_OBJECTS',
2508                                                '_DEPENDENCIES');
2509
2510         my $linker = &handle_source_transform ($xname, $one_file, $obj);
2511
2512         my $xt = '';
2513         if (&variable_defined ($xname . "_LDADD"))
2514         {
2515             if (&handle_lib_objects ($xname, $xname . '_LDADD'))
2516             {
2517                 $seen_libobjs = 1;
2518             }
2519             $xt = '_LDADD';
2520         }
2521         else
2522         {
2523             # User didn't define prog_LDADD override.  So do it.
2524             &define_variable ($xname . '_LDADD', '$(LDADD)');
2525
2526             # This does a bit too much work.  But we need it to
2527             # generate _DEPENDENCIES when appropriate.
2528             if (&variable_defined ('LDADD'))
2529             {
2530                 if (&handle_lib_objects ($xname, 'LDADD'))
2531                 {
2532                     $seen_libobjs = 1;
2533                 }
2534             }
2535             elsif (! &variable_defined ($xname . '_DEPENDENCIES'))
2536             {
2537                 &define_variable ($xname . '_DEPENDENCIES', '');
2538             }
2539             $xt = '_SOURCES'
2540         }
2541
2542         if (&variable_defined ($xname . '_LIBADD'))
2543         {
2544             macro_error ($xname . '_LIBADD',
2545                          "use `" . $xname . "_LDADD', not `"
2546                          . $xname . "_LIBADD'");
2547         }
2548
2549         if (! &variable_defined ($xname . '_LDFLAGS'))
2550         {
2551             # Define the prog_LDFLAGS variable.
2552             &define_variable ($xname . '_LDFLAGS', '');
2553         }
2554
2555         # Determine program to use for link.
2556         my $xlink;
2557         if (&variable_defined ($xname . '_LINK'))
2558         {
2559             $xlink = $xname . '_LINK';
2560         }
2561         else
2562         {
2563             $xlink = $linker ? $linker : 'LINK';
2564         }
2565
2566         # If the resulting program lies into a subdirectory,
2567         # make sure this directory will exist.
2568         my $dirstamp = &require_build_directory_maybe ($one_file);
2569
2570         # Don't add $(EXEEXT) if user already did.
2571         my $extension = ($one_file !~ /\$\(EXEEXT\)$/
2572                          ? "\$(EXEEXT)"
2573                          : '');
2574
2575         $output_rules .= &file_contents ('program',
2576                                          ('PROGRAM'  => $one_file,
2577                                           'XPROGRAM' => $xname,
2578                                           'XLINK'    => $xlink,
2579                                           'DIRSTAMP' => $dirstamp,
2580                                           'EXEEXT'   => $extension));
2581     }
2582
2583     if (&variable_defined ('LDADD') && &handle_lib_objects ('', 'LDADD'))
2584     {
2585         $seen_libobjs = 1;
2586     }
2587
2588     if ($seen_libobjs)
2589     {
2590         foreach my $one_file (@proglist)
2591         {
2592             my $xname = &canonicalize ($one_file);
2593
2594             if (&variable_defined ($xname . '_LDADD'))
2595             {
2596                 &check_libobjs_sources ($xname, $xname . '_LDADD');
2597             }
2598             elsif (&variable_defined ('LDADD'))
2599             {
2600                 &check_libobjs_sources ($xname, 'LDADD');
2601             }
2602         }
2603     }
2604 }
2605
2606
2607 # handle_libraries ()
2608 # -------------------
2609 # Handle libraries.
2610 sub handle_libraries
2611 {
2612     my @liblist = &am_install_var ('libs', 'LIBRARIES',
2613                                    'lib', 'pkglib', 'noinst', 'check');
2614     return if ! @liblist;
2615
2616     my %valid = &am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
2617                                       'noinst', 'check');
2618     if (! defined $configure_vars{'RANLIB'})
2619     {
2620         foreach my $key (keys %valid)
2621         {
2622             if (&variable_defined ($key . '_LIBRARIES'))
2623             {
2624                 macro_error ($key . '_LIBRARIES',
2625                              "library used but `RANLIB' not defined in `$configure_ac'");
2626                 # Only get this error once.  If this is ever printed,
2627                 # we have a bug.
2628                 $configure_vars{'RANLIB'} = 'BUG';
2629                 last;
2630             }
2631         }
2632     }
2633
2634     my $seen_libobjs = 0;
2635     foreach my $onelib (@liblist)
2636     {
2637         # Check that the library fits the standard naming convention.
2638         if (basename ($onelib) !~ /^lib.*\.a/)
2639         {
2640             # FIXME should put line number here.  That means mapping
2641             # from library name back to variable name.
2642             &am_error ("`$onelib' is not a standard library name");
2643         }
2644
2645         my $obj = &get_object_extension ($onelib);
2646
2647         # Canonicalize names and check for misspellings.
2648         my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
2649                                               '_OBJECTS', '_DEPENDENCIES',
2650                                               '_AR');
2651
2652         if (! &variable_defined ($xlib . '_AR'))
2653         {
2654             &define_variable ($xlib . '_AR', '$(AR) cru');
2655         }
2656
2657         if (&variable_defined ($xlib . '_LIBADD'))
2658         {
2659             if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2660             {
2661                 $seen_libobjs = 1;
2662             }
2663         }
2664         else
2665         {
2666             # Generate support for conditional object inclusion in
2667             # libraries.
2668             &define_variable ($xlib . "_LIBADD", '');
2669         }
2670
2671         if (&variable_defined ($xlib . '_LDADD'))
2672         {
2673             macro_error ($xlib . '_LDADD',
2674                          "use `" . $xlib . "_LIBADD', not `"
2675                          . $xlib . "_LDADD'");
2676         }
2677
2678         # Make sure we at look at this.
2679         &examine_variable ($xlib . '_DEPENDENCIES');
2680
2681         &handle_source_transform ($xlib, $onelib, $obj);
2682
2683         # If the resulting library lies into a subdirectory,
2684         # make sure this directory will exist.
2685         my $dirstamp = &require_build_directory_maybe ($onelib);
2686
2687         $output_rules .= &file_contents ('library',
2688                                          ('LIBRARY'  => $onelib,
2689                                           'XLIBRARY' => $xlib,
2690                                           'DIRSTAMP' => $dirstamp));
2691     }
2692
2693     if ($seen_libobjs)
2694     {
2695         foreach my $onelib (@liblist)
2696         {
2697             my $xlib = &canonicalize ($onelib);
2698             if (&variable_defined ($xlib . '_LIBADD'))
2699             {
2700                 &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2701             }
2702         }
2703     }
2704 }
2705
2706
2707 # handle_ltlibraries ()
2708 # ---------------------
2709 # Handle shared libraries.
2710 sub handle_ltlibraries
2711 {
2712     my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES',
2713                                    'noinst', 'lib', 'pkglib', 'check');
2714     return if ! @liblist;
2715
2716     my %instdirs;
2717     my %valid = &am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
2718                                       'noinst', 'check');
2719
2720     foreach my $key (keys %valid)
2721     {
2722         if (&variable_defined ($key . '_LTLIBRARIES'))
2723         {
2724             if (!$seen_libtool)
2725             {
2726                 macro_error ($key . '_LTLIBRARIES',
2727                              "library used but `LIBTOOL' not defined in `$configure_ac'");
2728                 # Only get this error once.  If this is ever printed,
2729                 # we have a bug.
2730                 $configure_vars{'LIBTOOL'} = 'BUG';
2731                 $seen_libtool = 1;
2732             }
2733
2734             # Get the installation directory of each library.
2735             for (&variable_value_as_list_recursive ($key . '_LTLIBRARIES', 'all'))
2736             {
2737                 if ($instdirs{$_})
2738                 {
2739                     &am_error ("`$_' is already going to be installed in `$instdirs{$_}'");
2740                 }
2741                 else
2742                 {
2743                     $instdirs{$_} = $key;
2744                 }
2745             }
2746         }
2747     }
2748
2749     my $seen_libobjs = 0;
2750     foreach my $onelib (@liblist)
2751     {
2752         my $obj = &get_object_extension ($onelib);
2753
2754         # Canonicalize names and check for misspellings.
2755         my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
2756                                               '_SOURCES', '_OBJECTS',
2757                                               '_DEPENDENCIES');
2758
2759         if (! &variable_defined ($xlib . '_LDFLAGS'))
2760         {
2761             # Define the lib_LDFLAGS variable.
2762             &define_variable ($xlib . '_LDFLAGS', '');
2763         }
2764
2765         # Check that the library fits the standard naming convention.
2766         my $libname_rx = "^lib.*\.la";
2767         if ((&variable_defined ($xlib . '_LDFLAGS')
2768              && grep (/-module/, &variable_value_as_list_recursive (
2769                                         $xlib . '_LDFLAGS', 'all')))
2770             || (&variable_defined ('LDFLAGS')
2771                 && grep (/-module/, &variable_value_as_list_recursive (
2772                                         'LDFLAGS', 'all'))))
2773         {
2774                 # Relax name checking for libtool modules.
2775                 $libname_rx = "\.la";
2776         }
2777         if (basename ($onelib) !~ /$libname_rx$/)
2778         {
2779             # FIXME this should only be a warning for foreign packages
2780             # FIXME should put line number here.  That means mapping
2781             # from library name back to variable name.
2782             &am_error ("`$onelib' is not a standard libtool library name");
2783         }
2784
2785         if (&variable_defined ($xlib . '_LIBADD'))
2786         {
2787             if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2788             {
2789                 $seen_libobjs = 1;
2790             }
2791         }
2792         else
2793         {
2794             # Generate support for conditional object inclusion in
2795             # libraries.
2796             &define_variable ($xlib . "_LIBADD", '');
2797         }
2798
2799         if (&variable_defined ($xlib . '_LDADD'))
2800         {
2801             macro_error ($xlib . '_LDADD',
2802                          "use `" . $xlib . "_LIBADD', not `"
2803                          . $xlib . "_LDADD'");
2804         }
2805
2806         # Make sure we at look at this.
2807         &examine_variable ($xlib . '_DEPENDENCIES');
2808
2809         my $linker = &handle_source_transform ($xlib, $onelib, $obj);
2810
2811         # Determine program to use for link.
2812         my $xlink;
2813         if (&variable_defined ($xlib . '_LINK'))
2814         {
2815             $xlink = $xlib . '_LINK';
2816         }
2817         else
2818         {
2819             $xlink = $linker ? $linker : 'LINK';
2820         }
2821
2822         my $rpath;
2823         if ($instdirs{$onelib} eq 'EXTRA'
2824             || $instdirs{$onelib} eq 'noinst'
2825             || $instdirs{$onelib} eq 'check')
2826         {
2827             # It's an EXTRA_ library, so we can't specify -rpath,
2828             # because we don't know where the library will end up.
2829             # The user probably knows, but generally speaking automake
2830             # doesn't -- and in fact configure could decide
2831             # dynamically between two different locations.
2832             $rpath = '';
2833         }
2834         else
2835         {
2836             $rpath = ('-rpath $(' . $instdirs{$onelib} . 'dir)');
2837         }
2838
2839         # If the resulting library lies into a subdirectory,
2840         # make sure this directory will exist.
2841         my $dirstamp = &require_build_directory_maybe ($onelib);
2842
2843         $output_rules .= &file_contents ('ltlibrary',
2844                                          ('LTLIBRARY'  => $onelib,
2845                                           'XLTLIBRARY' => $xlib,
2846                                           'RPATH'      => $rpath,
2847                                           'XLINK'      => $xlink,
2848                                           'DIRSTAMP'   => $dirstamp));
2849     }
2850
2851     if ($seen_libobjs)
2852     {
2853         foreach my $onelib (@liblist)
2854         {
2855             my $xlib = &canonicalize ($onelib);
2856             if (&variable_defined ($xlib . '_LIBADD'))
2857             {
2858                 &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2859             }
2860         }
2861     }
2862 }
2863
2864 # See if any _SOURCES variable were misspelled.  Also, make sure that
2865 # EXTRA_ variables don't contain configure substitutions.
2866 sub check_typos
2867 {
2868     foreach my $varname (keys %var_value)
2869     {
2870         foreach my $primary ('_SOURCES', '_LIBADD', '_LDADD', '_LDFLAGS',
2871                              '_DEPENDENCIES')
2872         {
2873             if ($varname =~ /$primary$/ && ! $content_seen{$varname})
2874             {
2875                 macro_error ($varname,
2876                              "invalid unused variable name: `$varname'");
2877             }
2878         }
2879     }
2880 }
2881
2882 # Handle scripts.
2883 sub handle_scripts
2884 {
2885     # NOTE we no longer automatically clean SCRIPTS, because it is
2886     # useful to sometimes distribute scripts verbatim.  This happens
2887     # eg in Automake itself.
2888     &am_install_var ('-candist', 'scripts', 'SCRIPTS',
2889                      'bin', 'sbin', 'libexec', 'pkgdata',
2890                      'noinst', 'check');
2891 }
2892
2893
2894 # ($OUTFILE, $VFILE, @CLEAN_FILES)
2895 # &scan_texinfo_file ($FILENAME)
2896 # ------------------------------
2897 # $OUTFILE is the name of the info file produced by $FILENAME.
2898 # $VFILE is the name of the version.texi file used (empty if none).
2899 # @CLEAN_FILES is the list of by products (indexes etc.)
2900 sub scan_texinfo_file
2901 {
2902     my ($filename) = @_;
2903
2904     # These are always created, no matter whether indexes are used or not.
2905     my @clean_suffixes = ('aux', 'dvi', 'log', 'ps', 'toc',
2906                           # grep new.*index texinfo.tex
2907                           'cp', 'fn', 'ky', 'vr', 'tp', 'pg');
2908
2909     # There are predefined indexes which don't follow the regular rules.
2910     my %predefined_index =
2911       (
2912        # cindex => *.cps
2913        'c' => 'cps', 'f' => 'fns', 'k' => 'kys',
2914        'v' => 'vrs', 't' => 'tps', 'p' => 'pgs'
2915       );
2916
2917     # There are commands which include a hidden index command.
2918     my %hidden_index =
2919       (
2920        # deffn => *.fns.
2921        'fn' => 'fns',     'un' => 'fns',
2922        'typefn' => 'fns', 'typefun' => 'fns',
2923        'mac' => 'fns', 'spec' => 'fns',
2924        'op' => 'fns',  'typeop' => 'fns',
2925        'method' => 'fns', 'typemethod' => 'fns',
2926
2927        'vr' => 'vrs', 'var' => 'vrs',
2928        'typevr' => 'vrs', 'typevar' => 'vrs',
2929        'opt' => 'vrs',
2930        'cv' => 'vrs',
2931        'ivar' => 'vrs', 'typeivar' => 'vrs',
2932
2933        'tp' => 'tps'
2934       );
2935
2936     # Indexes stored into another one.  In this case, the *.??s file
2937     # is not created.
2938     my @syncodeindexes = ();
2939
2940     my $texi = new Automake::XFile "< $filename";
2941     verbose "reading $filename";
2942
2943     my ($outfile, $vfile);
2944     while ($_ = $texi->getline)
2945     {
2946       if (/^\@setfilename +(\S+)/)
2947       {
2948         $outfile = $1;
2949         if ($outfile =~ /\.(.+)$/ && $1 ne 'info')
2950           {
2951             file_error ("$filename:$.",
2952                         "output `$outfile' has unrecognized extension");
2953             return;
2954           }
2955       }
2956       # A "version.texi" file is actually any file whose name
2957       # matches "vers*.texi".
2958       elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/)
2959       {
2960         $vfile = $1;
2961       }
2962
2963       # Try to find what are the indexes which are used.
2964
2965       # Creating a new category of index.
2966       elsif (/^\@def(code)?index (\w+)/)
2967       {
2968         push @clean_suffixes, $2;
2969       }
2970
2971       # Storing in a predefined index.
2972       elsif (/^\@([cfkvtp])index /)
2973       {
2974         push @clean_suffixes, $predefined_index{$1};
2975       }
2976       elsif (/^\@def(\w+) /)
2977       {
2978         push @clean_suffixes, $hidden_index{$1}
2979           if defined $hidden_index{$1};
2980       }
2981
2982       # Merging an index into an another.
2983       elsif (/^\@syn(code)?index (\w+) (\w+)/)
2984       {
2985         push @syncodeindexes, "$2s";
2986         push @clean_suffixes, "$3s";
2987       }
2988
2989     }
2990
2991     if ($outfile eq '')
2992       {
2993         &am_error ("`$filename' missing \@setfilename");
2994         return;
2995       }
2996
2997     my $infobase = basename ($filename);
2998     $infobase =~ s/\.te?xi(nfo)?$//;
2999     # FIXME: I don't understand why, but I can't use "$infobase.$_" => 1.
3000     my %clean_files = map { "$infobase" . ".$_" => 1 } @clean_suffixes;
3001     grep { delete $clean_files{"$infobase.$_"} } @syncodeindexes;
3002     return ($outfile, $vfile, (sort keys %clean_files));
3003 }
3004
3005
3006 # ($DO-SOMETHING, $TEXICLEANS)
3007 # handle_texinfo_helper ()
3008 # -----------------
3009 # Handle all Texinfo source; helper for handle_texinfo
3010 sub handle_texinfo_helper
3011 {
3012     macro_error ('TEXINFOS',
3013                  "`TEXINFOS' is an anachronism; use `info_TEXINFOS'")
3014         if &variable_defined ('TEXINFOS');
3015     return (0, '') if (! &variable_defined ('info_TEXINFOS')
3016                        && ! &variable_defined ('html_TEXINFOS'));
3017
3018     if (&variable_defined ('html_TEXINFOS'))
3019     {
3020         macro_error ('html_TEXINFOS',
3021                      "HTML generation not yet supported");
3022         return (0, '');
3023     }
3024
3025     my @texis = &variable_value_as_list_recursive ('info_TEXINFOS', 'all');
3026
3027     my (@info_deps_list, @dvis_list, @texi_deps);
3028     my %versions;
3029     my $done = 0;
3030     my @texi_cleans;
3031     my $canonical;
3032
3033     my %texi_suffixes;
3034     foreach my $info_cursor (@texis)
3035     {
3036         my $infobase = $info_cursor;
3037         $infobase =~ s/\.(txi|texinfo|texi)$//;
3038
3039         if ($infobase eq $info_cursor)
3040         {
3041             # FIXME: report line number.
3042             &am_error ("texinfo file `$info_cursor' has unrecognized extension");
3043             next;
3044         }
3045         $texi_suffixes{$1} = 1;
3046
3047         # If 'version.texi' is referenced by input file, then include
3048         # automatic versioning capability.
3049         my ($out_file, $vtexi, @clean_files) =
3050           &scan_texinfo_file ("$relative_dir/$info_cursor")
3051             or next;
3052         push (@texi_cleans, @clean_files);
3053
3054         if ($vtexi)
3055         {
3056             &am_error ("`$vtexi', included in `$info_cursor', also included in `$versions{$vtexi}'")
3057                 if (defined $versions{$vtexi});
3058             $versions{$vtexi} = $info_cursor;
3059
3060             # We number the stamp-vti files.  This is doable since the
3061             # actual names don't matter much.  We only number starting
3062             # with the second one, so that the common case looks nice.
3063             my $vti = ($done ? $done : 'vti');
3064             ++$done;
3065
3066             # This is ugly, but it is our historical practice.
3067             if ($config_aux_dir_set_in_configure_in)
3068             {
3069                 require_conf_file_with_macro ('info_TEXINFOS', $FOREIGN,
3070                                               'mdate-sh');
3071             }
3072             else
3073             {
3074                 require_file_with_macro ('info_TEXINFOS', $FOREIGN,
3075                                          'mdate-sh');
3076             }
3077
3078             my $conf_dir;
3079             if ($config_aux_dir_set_in_configure_in)
3080             {
3081                 $conf_dir = $config_aux_dir;
3082                 $conf_dir .= '/' unless $conf_dir =~ /\/$/;
3083             }
3084             else
3085             {
3086                 $conf_dir = '$(srcdir)/';
3087             }
3088             $output_rules .= &file_contents ('texi-vers',
3089                                              ('TEXI'  => $info_cursor,
3090                                               'VTI'   => $vti,
3091                                               'VTEXI' => $vtexi,
3092                                               'MDDIR' => $conf_dir));
3093         }
3094
3095         # If user specified file_TEXINFOS, then use that as explicit
3096         # dependency list.
3097         @texi_deps = ();
3098         push (@texi_deps, $info_cursor);
3099         # Prefix with $(srcdir) because some version of make won't
3100         # work if the target has it and the dependency doesn't.
3101         push (@texi_deps, '$(srcdir)/' . $vtexi) if $vtexi;
3102
3103         my $canonical = &canonicalize ($infobase);
3104         if (&variable_defined ($canonical . "_TEXINFOS"))
3105         {
3106             push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
3107             &push_dist_common ('$(' . $canonical . '_TEXINFOS)');
3108         }
3109
3110         $output_rules .= ("\n" . $out_file . ": "
3111                           . join (' ', @texi_deps)
3112                           . "\n" . $infobase . ".dvi: "
3113                           . join (' ', @texi_deps)
3114                           . "\n");
3115
3116         push (@info_deps_list, $out_file);
3117         push (@dvis_list, $infobase . '.dvi');
3118     }
3119
3120     # Handle location of texinfo.tex.
3121     my $need_texi_file = 0;
3122     my $texinfodir;
3123     if ($cygnus_mode)
3124     {
3125         $texinfodir = '$(top_srcdir)/../texinfo';
3126         &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex");
3127     }
3128     elsif ($config_aux_dir_set_in_configure_in)
3129     {
3130         $texinfodir = $config_aux_dir;
3131         &define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex");
3132         $need_texi_file = 2; # so that we require_conf_file later
3133     }
3134     elsif (&variable_defined ('TEXINFO_TEX'))
3135     {
3136         # The user defined TEXINFO_TEX so assume he knows what he is
3137         # doing.
3138         $texinfodir = ('$(srcdir)/'
3139                        . dirname (&variable_value ('TEXINFO_TEX')));
3140     }
3141     else
3142     {
3143         $texinfodir = '$(srcdir)';
3144         $need_texi_file = 1;
3145     }
3146
3147     foreach my $txsfx (sort keys %texi_suffixes)
3148     {
3149         $output_rules .= &file_contents ('texibuild',
3150                                          ('TEXINFODIR' => $texinfodir,
3151                                           'SUFFIX'     => $txsfx));
3152     }
3153
3154     # The return value.
3155     my $texiclean = &pretty_print_internal ("", "\t  ", @texi_cleans);
3156
3157     push (@dist_targets, 'dist-info');
3158
3159     if (! defined $options{'no-installinfo'})
3160     {
3161         # Make sure documentation is made and installed first.  Use
3162         # $(INFO_DEPS), not 'info', because otherwise recursive makes
3163         # get run twice during "make all".
3164         unshift (@all, '$(INFO_DEPS)');
3165     }
3166
3167     &define_variable ("INFO_DEPS", join (' ', @info_deps_list));
3168     &define_variable ("DVIS", join (' ', @dvis_list));
3169     # This next isn't strictly needed now -- the places that look here
3170     # could easily be changed to look in info_TEXINFOS.  But this is
3171     # probably better, in case noinst_TEXINFOS is ever supported.
3172     &define_variable ("TEXINFOS", &variable_value ('info_TEXINFOS'));
3173
3174     # Do some error checking.  Note that this file is not required
3175     # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly
3176     # up above.
3177     if ($need_texi_file && ! defined $options{'no-texinfo.tex'})
3178     {
3179         if ($need_texi_file > 1)
3180         {
3181             require_conf_file_with_macro ('info_TEXINFOS', $FOREIGN,
3182                                           'texinfo.tex');
3183         }
3184         else
3185         {
3186             require_file_with_macro ('info_TEXINFOS', $FOREIGN, 'texinfo.tex');
3187         }
3188     }
3189
3190     return (1, $texiclean);
3191 }
3192
3193 # handle_texinfo ()
3194 # -----------------
3195 # Handle all Texinfo source.
3196 sub handle_texinfo
3197 {
3198     my ($do_something, $texiclean) = handle_texinfo_helper ();
3199     $output_rules .=  &file_contents ('texinfos',
3200                                       ('TEXICLEAN' => $texiclean,
3201                                        'LOCAL-TEXIS' => $do_something));
3202 }
3203
3204 # Handle any man pages.
3205 sub handle_man_pages
3206 {
3207     macro_error ('MANS', "`MANS' is an anachronism; use `man_MANS'")
3208         if &variable_defined ('MANS');
3209
3210     # Find all the sections in use.  We do this by first looking for
3211     # "standard" sections, and then looking for any additional
3212     # sections used in man_MANS.
3213     my (%sections, %vlist);
3214     # We handle nodist_ for uniformity.  man pages aren't distributed
3215     # by default so it isn't actually very important.
3216     foreach my $pfx ('', 'dist_', 'nodist_')
3217     {
3218         # Add more sections as needed.
3219         foreach my $section ('0'..'9', 'n', 'l')
3220         {
3221             if (&variable_defined ($pfx . 'man' . $section . '_MANS'))
3222             {
3223                 $sections{$section} = 1;
3224                 $vlist{'$(' . $pfx . 'man' . $section . '_MANS)'} = 1;
3225
3226                 &push_dist_common ('$(' . $pfx . 'man' . $section . '_MANS)')
3227                     if $pfx eq 'dist_';
3228             }
3229         }
3230
3231         if (&variable_defined ($pfx . 'man_MANS'))
3232         {
3233             $vlist{'$(' . $pfx . 'man_MANS)'} = 1;
3234             foreach (&variable_value_as_list_recursive ($pfx . 'man_MANS', 'all'))
3235             {
3236                 # A page like `foo.1c' goes into man1dir.
3237                 if (/\.([0-9a-z])([a-z]*)$/)
3238                 {
3239                     $sections{$1} = 1;
3240                 }
3241             }
3242
3243             &push_dist_common ('$(' . $pfx . 'man_MANS)')
3244                 if $pfx eq 'dist_';
3245         }
3246     }
3247
3248     return unless %sections;
3249
3250     # Now for each section, generate an install and unintall rule.
3251     # Sort sections so output is deterministic.
3252     foreach my $section (sort keys %sections)
3253     {
3254         $output_rules .= &file_contents ('mans', ('SECTION' => $section));
3255     }
3256
3257     $output_vars .= &file_contents ('mans-vars',
3258                                     ('MANS' => join (' ', sort keys %vlist)));
3259
3260     if (! defined $options{'no-installman'})
3261     {
3262         push (@all, '$(MANS)');
3263     }
3264 }
3265
3266 # Handle DATA variables.
3267 sub handle_data
3268 {
3269     &am_install_var ('-noextra', '-candist', 'data', 'DATA',
3270                      'data', 'sysconf', 'sharedstate', 'localstate',
3271                      'pkgdata', 'noinst', 'check');
3272 }
3273
3274 # Handle TAGS.
3275 sub handle_tags
3276 {
3277     my @tag_deps = ();
3278     if (&variable_defined ('SUBDIRS'))
3279     {
3280         $output_rules .= ("tags-recursive:\n"
3281                           . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
3282                           # Never fail here if a subdir fails; it
3283                           # isn't important.
3284                           . "\t  test \"\$\$subdir\" = . || (cd \$\$subdir"
3285                           . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n"
3286                           . "\tdone\n");
3287         push (@tag_deps, 'tags-recursive');
3288         &depend ('.PHONY', 'tags-recursive');
3289     }
3290
3291     if (&saw_sources_p (1)
3292         || &variable_defined ('ETAGS_ARGS')
3293         || @tag_deps)
3294     {
3295         my $config = '';
3296         foreach my $one_hdr (@config_headers)
3297         {
3298             if ($relative_dir eq dirname ($one_hdr))
3299             {
3300                 # The config header is in this directory.  So require it.
3301                 $config .= ' ' if $config;
3302                 $config .= basename ($one_hdr);
3303             }
3304         }
3305         $output_rules .= &file_contents ('tags',
3306                                          ('CONFIG' => $config,
3307                                           'DIRS'   => join (' ', @tag_deps)));
3308         &examine_variable ('TAGS_DEPENDENCIES');
3309     }
3310     elsif (&variable_defined ('TAGS_DEPENDENCIES'))
3311     {
3312         macro_error ('TAGS_DEPENDENCIES',
3313                      "doesn't make sense to define `TAGS_DEPENDENCIES' without sources or `ETAGS_ARGS'");
3314     }
3315     else
3316     {
3317         # Every Makefile must define some sort of TAGS rule.
3318         # Otherwise, it would be possible for a top-level "make TAGS"
3319         # to fail because some subdirectory failed.
3320         $output_rules .= "tags: TAGS\nTAGS:\n\n";
3321     }
3322 }
3323
3324 # Handle multilib support.
3325 sub handle_multilib
3326 {
3327     if ($seen_multilib && $relative_dir eq '.')
3328     {
3329         $output_rules .= &file_contents ('multilib');
3330     }
3331 }
3332
3333
3334 # $BOOLEAN
3335 # &for_dist_common ($A, $B)
3336 # -------------------------
3337 # Subroutine for &handle_dist: sort files to dist.
3338 #
3339 # We put README first because it then becomes easier to make a
3340 # Usenet-compliant shar file (in these, README must be first).
3341 #
3342 # FIXME: do more ordering of files here.
3343 sub for_dist_common
3344 {
3345     return 0
3346         if $a eq $b;
3347     return -1
3348         if $a eq 'README';
3349     return 1
3350         if $b eq 'README';
3351     return $a cmp $b;
3352 }
3353
3354
3355 # handle_dist ($MAKEFILE)
3356 # -----------------------
3357 # Handle 'dist' target.
3358 sub handle_dist
3359 {
3360     my ($makefile) = @_;
3361
3362     # `make dist' isn't used in a Cygnus-style tree.
3363     # Omit the rules so that people don't try to use them.
3364     return if $cygnus_mode;
3365
3366     # Look for common files that should be included in distribution.
3367     # If the aux dir is set, and it does not have a Makefile.am, then
3368     # we check for these files there as well.
3369     my $check_aux = 0;
3370     my $auxdir = '';
3371     if ($relative_dir eq '.'
3372         && $config_aux_dir_set_in_configure_in)
3373     {
3374         ($auxdir = $config_aux_dir) =~ s,^\$\(top_srcdir\)/,,;
3375         if (! &is_make_dir ($auxdir))
3376         {
3377             $check_aux = 1;
3378         }
3379     }
3380     foreach my $cfile (@common_files)
3381     {
3382         if (-f ($relative_dir . "/" . $cfile))
3383         {
3384             &push_dist_common ($cfile);
3385         }
3386
3387         # Don't use `elsif' here because a file might meaningfully
3388         # appear in both directories.
3389         if ($check_aux && -f ($auxdir . '/' . $cfile))
3390         {
3391             &push_dist_common ($auxdir . '/' . $cfile);
3392         }
3393     }
3394
3395     # We might copy elements from $configure_dist_common to
3396     # %dist_common if we think we need to.  If the file appears in our
3397     # directory, we would have discovered it already, so we don't
3398     # check that.  But if the file is in a subdir without a Makefile,
3399     # we want to distribute it here if we are doing `.'.  Ugly!
3400     if ($relative_dir eq '.')
3401     {
3402        foreach my $file (split (' ' , $configure_dist_common))
3403        {
3404            if (! &is_make_dir (dirname ($file)))
3405            {
3406                &push_dist_common ($file);
3407            }
3408        }
3409     }
3410
3411
3412
3413     # Files to distributed.  Don't use &variable_value_as_list_recursive
3414     # as it recursively expands `$(dist_pkgdata_DATA)' etc.
3415     check_variable_defined_unconditionally ('DIST_COMMON');
3416     my @dist_common = split (' ', variable_value ('DIST_COMMON', 'TRUE'));
3417     @dist_common = uniq (sort for_dist_common (@dist_common));
3418     pretty_print ('DIST_COMMON = ', "\t", @dist_common);
3419
3420     # Now that we've processed DIST_COMMON, disallow further attempts
3421     # to set it.
3422     $handle_dist_run = 1;
3423
3424     # Scan EXTRA_DIST to see if we need to distribute anything from a
3425     # subdir.  If so, add it to the list.  I didn't want to do this
3426     # originally, but there were so many requests that I finally
3427     # relented.
3428     if (&variable_defined ('EXTRA_DIST'))
3429     {
3430         # FIXME: This should be fixed to work with conditionals.  That
3431         # will require only making the entries in %dist_dirs under the
3432         # appropriate condition.  This is meaningful if the nature of
3433         # the distribution should depend upon the configure options
3434         # used.
3435         foreach (&variable_value_as_list_recursive ('EXTRA_DIST', ''))
3436         {
3437             next if /^\@.*\@$/;
3438             next unless s,/+[^/]+$,,;
3439             $dist_dirs{$_} = 1
3440                 unless $_ eq '.';
3441         }
3442     }
3443
3444     # We have to check DIST_COMMON for extra directories in case the
3445     # user put a source used in AC_OUTPUT into a subdir.
3446     foreach (&variable_value_as_list_recursive ('DIST_COMMON', 'all'))
3447     {
3448         next if /^\@.*\@$/;
3449         next unless s,/+[^/]+$,,;
3450         $dist_dirs{$_} = 1
3451             unless $_ eq '.';
3452     }
3453
3454     # Rule to check whether a distribution is viable.
3455     my %transform = ('DISTCHECK-HOOK' => &target_defined ('distcheck-hook'),
3456                      'GETTEXT'        => $seen_gettext);
3457
3458     # Prepend $(distdir) to each directory given.
3459     my %rewritten = map { '$(distdir)/' . "$_" => 1 } keys %dist_dirs;
3460     $transform{'DISTDIRS'} = join (' ', sort keys %rewritten);
3461
3462     # If we have SUBDIRS, create all dist subdirectories and do
3463     # recursive build.
3464     if (&variable_defined ('SUBDIRS'))
3465     {
3466         # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS
3467         # to all possible directories, and use it.  If DIST_SUBDIRS is
3468         # defined, just use it.
3469         my $dist_subdir_name;
3470         # Note that we check DIST_SUBDIRS first on purpose.  At least
3471         # one project uses so many conditional subdirectories that
3472         # calling variable_conditionally_defined on SUBDIRS will cause
3473         # automake to grow to 150Mb.  Sigh.
3474         if (&variable_defined ('DIST_SUBDIRS')
3475             || variable_conditionally_defined ('SUBDIRS'))
3476         {
3477             $dist_subdir_name = 'DIST_SUBDIRS';
3478             if (! &variable_defined ('DIST_SUBDIRS'))
3479             {
3480                 define_pretty_variable
3481                   ('DIST_SUBDIRS', '',
3482                    uniq (&variable_value_as_list_recursive ('SUBDIRS', 'all')));
3483             }
3484         }
3485         else
3486         {
3487             $dist_subdir_name = 'SUBDIRS';
3488             # We always define this because that is what `distclean'
3489             # wants.
3490             define_pretty_variable ('DIST_SUBDIRS', '', '$(SUBDIRS)');
3491         }
3492
3493         $transform{'DIST_SUBDIR_NAME'} = $dist_subdir_name;
3494     }
3495
3496     # If the target `dist-hook' exists, make sure it is run.  This
3497     # allows users to do random weird things to the distribution
3498     # before it is packaged up.
3499     push (@dist_targets, 'dist-hook')
3500       if &target_defined ('dist-hook');
3501     $transform{'DIST-TARGETS'} = join(' ', @dist_targets);
3502
3503     # Defining $(DISTDIR).
3504     $transform{'DISTDIR'} = !&variable_defined('distdir');
3505     $transform{'TOP_DISTDIR'} = backname ($relative_dir);
3506
3507     $output_rules .= &file_contents ('distdir', %transform);
3508 }
3509
3510
3511 # Handle subdirectories.
3512 sub handle_subdirs
3513 {
3514     return
3515       unless &variable_defined ('SUBDIRS');
3516
3517     # Make sure each directory mentioned in SUBDIRS actually exists.
3518     foreach my $dir (&variable_value_as_list_recursive ('SUBDIRS', 'all'))
3519     {
3520         # Skip directories substituted by configure.
3521         next if $dir =~ /^\@.*\@$/;
3522
3523         if (! -d $am_relative_dir . '/' . $dir)
3524         {
3525             macro_error ('SUBDIRS',
3526                          "required directory $am_relative_dir/$dir does not exist");
3527             next;
3528         }
3529
3530         macro_error ('SUBDIRS', "directory should not contain `/'")
3531             if $dir =~ /\//;
3532     }
3533
3534     $output_rules .= &file_contents ('subdirs');
3535     variable_pretty_output ('RECURSIVE_TARGETS', 'TRUE');
3536 }
3537
3538
3539 # ($REGEN, @DEPENDENCIES)
3540 # &scan_aclocal_m4
3541 # ----------------
3542 # If aclocal.m4 creation is automated, return the list of its dependencies.
3543 sub scan_aclocal_m4
3544 {
3545     my $regen_aclocal = 0;
3546
3547     return (0, ())
3548       unless $relative_dir eq '.';
3549
3550     &examine_variable ('CONFIG_STATUS_DEPENDENCIES');
3551     &examine_variable ('CONFIGURE_DEPENDENCIES');
3552
3553     if (-f 'aclocal.m4')
3554     {
3555         &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4');
3556         &push_dist_common ('aclocal.m4');
3557
3558         my $aclocal = new Automake::XFile "< aclocal.m4";
3559         my $line = $aclocal->getline;
3560         $regen_aclocal = $line =~ 'generated automatically by aclocal';
3561     }
3562
3563     my @ac_deps = ();
3564
3565     if (-f 'acinclude.m4')
3566     {
3567         $regen_aclocal = 1;
3568         push @ac_deps, 'acinclude.m4';
3569     }
3570
3571     if (&variable_defined ('ACLOCAL_M4_SOURCES'))
3572     {
3573         push (@ac_deps, '$(ACLOCAL_M4_SOURCES)');
3574     }
3575     elsif (&variable_defined ('ACLOCAL_AMFLAGS'))
3576     {
3577         # Scan all -I directories for m4 files.  These are our
3578         # dependencies.
3579         my $examine_next = 0;
3580         foreach my $amdir (&variable_value_as_list_recursive ('ACLOCAL_AMFLAGS', ''))
3581         {
3582             if ($examine_next)
3583             {
3584                 $examine_next = 0;
3585                 if ($amdir !~ /^\// && -d $amdir)
3586                 {
3587                     foreach my $ac_dep (&my_glob ($amdir . '/*.m4'))
3588                     {
3589                         $ac_dep =~ s/^\.\/+//;
3590                         push (@ac_deps, $ac_dep)
3591                           unless $ac_dep eq "aclocal.m4"
3592                             || $ac_dep eq "acinclude.m4";
3593                     }
3594                 }
3595             }
3596             elsif ($amdir eq '-I')
3597             {
3598                 $examine_next = 1;
3599             }
3600         }
3601     }
3602
3603     # Note that it might be possible that aclocal.m4 doesn't exist but
3604     # should be auto-generated.  This case probably isn't very
3605     # important.
3606
3607     return ($regen_aclocal, @ac_deps);
3608 }
3609
3610 # Rewrite a list of input files into a form suitable to put on a
3611 # dependency list.  The idea is that if an input file has a directory
3612 # part the same as the current directory, then the directory part is
3613 # simply removed.  But if the directory part is different, then
3614 # $(top_srcdir) is prepended.  Among other things, this is used to
3615 # generate the dependency list for the output files generated by
3616 # AC_OUTPUT.  Consider what the dependencies should look like in this
3617 # case:
3618 #   AC_OUTPUT(src/out:src/in1:lib/in2)
3619 # The first argument, ADD_SRCDIR, is 1 if $(top_srcdir) should be added.
3620 # If 0 then files that require this addition will simply be ignored.
3621 sub rewrite_inputs_into_dependencies
3622 {
3623     my ($add_srcdir, @inputs) = @_;
3624     my @newinputs;
3625
3626     foreach my $single (@inputs)
3627     {
3628         if (dirname ($single) eq $relative_dir)
3629         {
3630             push (@newinputs, basename ($single));
3631         }
3632         elsif ($add_srcdir)
3633         {
3634             push (@newinputs, '$(top_srcdir)/' . $single);
3635         }
3636     }
3637
3638     return @newinputs;
3639 }
3640
3641 # Handle remaking and configure stuff.
3642 # We need the name of the input file, to do proper remaking rules.
3643 sub handle_configure
3644 {
3645     my ($local, $input, @secondary_inputs) = @_;
3646
3647     my $input_base = basename ($input);
3648     my $local_base = basename ($local);
3649
3650     my $amfile = $input_base . '.am';
3651     # We know we can always add '.in' because it really should be an
3652     # error if the .in was missing originally.
3653     my $infile = '$(srcdir)/' . $input_base . '.in';
3654     my $colon_infile = '';
3655     if ($local ne $input || @secondary_inputs)
3656     {
3657         $colon_infile = ':' . $input . '.in';
3658     }
3659     $colon_infile .= ':' . join (':', @secondary_inputs)
3660         if @secondary_inputs;
3661
3662     my @rewritten = &rewrite_inputs_into_dependencies (1, @secondary_inputs);
3663
3664     my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4 ();
3665
3666     $output_rules .=
3667       &file_contents ('configure',
3668                       ('MAKEFILE'
3669                        => $local_base,
3670                        'MAKEFILE-DEPS'
3671                        => join (' ', @rewritten),
3672                        'CONFIG-MAKEFILE'
3673                        => ((($relative_dir eq '.') ? '$@' : '$(subdir)/$@')
3674                            . $colon_infile),
3675                        'MAKEFILE-IN'
3676                        => $infile,
3677                        'MAKEFILE-IN-DEPS'
3678                        => join (' ', @include_stack),
3679                        'MAKEFILE-AM'
3680                        => $amfile,
3681                        'STRICTNESS'
3682                        => $cygnus_mode ? 'cygnus' : $strictness_name,
3683                        'USE-DEPS'
3684                        => $cmdline_use_dependencies ? '' : ' --ignore-deps',
3685                        'MAKEFILE-AM-SOURCES'
3686                        =>  "$input$colon_infile",
3687                        'REGEN-ACLOCAL-M4'
3688                        => $regen_aclocal_m4,
3689                        'ACLOCAL_M4_DEPS'
3690                        => join (' ', @aclocal_m4_deps)));
3691
3692     if ($relative_dir eq '.')
3693     {
3694         &push_dist_common ('acconfig.h')
3695             if -f 'acconfig.h';
3696     }
3697
3698     # If we have a configure header, require it.
3699     my @local_fullnames = @config_fullnames;
3700     my @local_names = @config_names;
3701     my $hdr_index = 0;
3702     my $distclean_config = '';
3703     foreach my $one_hdr (@config_headers)
3704     {
3705         my $one_fullname = shift (@local_fullnames);
3706         my $one_name = shift (@local_names);
3707         $hdr_index += 1;
3708         my $header_dir = dirname ($one_name);
3709
3710         # If the header is in the current directory we want to build
3711         # the header here.  Otherwise, if we're at the topmost
3712         # directory and the header's directory doesn't have a
3713         # Makefile, then we also want to build the header.
3714         if ($relative_dir eq $header_dir
3715             || ($relative_dir eq '.' && ! &is_make_dir ($header_dir)))
3716         {
3717             my ($cn_sans_dir, $stamp_dir);
3718             if ($relative_dir eq $header_dir)
3719             {
3720                 $cn_sans_dir = basename ($one_name);
3721                 $stamp_dir = '';
3722             }
3723             else
3724             {
3725                 $cn_sans_dir = $one_name;
3726                 if ($header_dir eq '.')
3727                 {
3728                     $stamp_dir = '';
3729                 }
3730                 else
3731                 {
3732                     $stamp_dir = $header_dir . '/';
3733                 }
3734             }
3735
3736             # Compute relative path from directory holding output
3737             # header to directory holding input header.  FIXME:
3738             # doesn't handle case where we have multiple inputs.
3739             my $ch_sans_dir;
3740             if (dirname ($one_hdr) eq $relative_dir)
3741             {
3742                 $ch_sans_dir = basename ($one_hdr);
3743             }
3744             else
3745             {
3746                 $ch_sans_dir = backname ($relative_dir) . '/' . $one_hdr;
3747             }
3748
3749             require_file ($config_header_location, $FOREIGN, $ch_sans_dir);
3750
3751             # Header defined and in this directory.
3752             my @files;
3753             if (-f $one_name . '.top')
3754             {
3755                 push (@files, "${cn_sans_dir}.top");
3756             }
3757             if (-f $one_name . '.bot')
3758             {
3759                 push (@files, "${cn_sans_dir}.bot");
3760             }
3761
3762             &push_dist_common (@files);
3763
3764             # For now, acconfig.h can only appear in the top srcdir.
3765             if (-f 'acconfig.h')
3766             {
3767                 push (@files, '$(top_srcdir)/acconfig.h');
3768             }
3769
3770             my $stamp_name = 'stamp-h';
3771             $stamp_name .= "${hdr_index}";
3772
3773             my $out_dir = dirname ($ch_sans_dir);
3774
3775             $output_rules .=
3776               &file_contents ('remake-hdr',
3777                               ('FILES'              => join (' ', @files),
3778                                'CONFIG_HEADER'      => $cn_sans_dir,
3779                                'CONFIG_HEADER_IN'   => $ch_sans_dir,
3780                                'CONFIG_HEADER_FULL' => $one_fullname,
3781                                'STAMP'            => "$stamp_dir$stamp_name",
3782                                'SRC_STAMP'        => "$out_dir/$stamp_name"));
3783
3784             &create ("${relative_dir}/${out_dir}/${stamp_name}.in");
3785             require_file ($config_header_location, $FOREIGN,
3786                           "${out_dir}/${stamp_name}.in");
3787
3788             $distclean_config .= ' ' if $distclean_config;
3789             $distclean_config .= $cn_sans_dir;
3790         }
3791     }
3792
3793     if ($distclean_config)
3794     {
3795         $output_rules .= &file_contents ('clean-hdr',
3796                                          ('FILES' => $distclean_config));
3797     }
3798
3799     # Set location of mkinstalldirs.
3800     &define_variable ('mkinstalldirs',
3801                       ('$(SHELL) ' . $config_aux_dir . '/mkinstalldirs'));
3802
3803     macro_error ('CONFIG_HEADER',
3804                  "`CONFIG_HEADER' is an anachronism; now determined from `$configure_ac'")
3805         if &variable_defined ('CONFIG_HEADER');
3806
3807     my $config_header = '';
3808     foreach my $one_name (@config_names)
3809     {
3810         # Generate CONFIG_HEADER define.
3811         my $one_hdr;
3812         if ($relative_dir eq dirname ($one_name))
3813         {
3814             $one_hdr = basename ($one_name);
3815         }
3816         else
3817         {
3818             $one_hdr = "\$(top_builddir)/${one_name}";
3819         }
3820
3821         $config_header .= ' ' if $config_header;
3822         $config_header .= $one_hdr;
3823     }
3824     if ($config_header)
3825     {
3826         &define_variable ("CONFIG_HEADER", $config_header);
3827     }
3828
3829     # Now look for other files in this directory which must be remade
3830     # by config.status, and generate rules for them.
3831     my @actual_other_files = ();
3832     foreach my $lfile (@other_input_files)
3833     {
3834         my ($file, $local);
3835         my (@inputs, @rewritten_inputs);
3836         my ($need_rewritten);
3837         if ($lfile =~ /^([^:]*):(.*)$/)
3838         {
3839             # This is the ":" syntax of AC_OUTPUT.
3840             $file = $1;
3841             $local = basename ($file);
3842             @inputs = split (':', $2);
3843             @rewritten_inputs = &rewrite_inputs_into_dependencies (1, @inputs);
3844             $need_rewritten = 1;
3845         }
3846         else
3847         {
3848             # Normal usage.
3849             $file = $lfile;
3850             $local = basename ($file);
3851             @inputs = ($file . '.in');
3852             @rewritten_inputs =
3853                 &rewrite_inputs_into_dependencies (1, @inputs);
3854             $need_rewritten = 0;
3855         }
3856
3857         # Make sure the dist directory for each input file is created.
3858         # We only have to do this at the topmost level though.  This
3859         # is a bit ugly but it easier than spreading out the logic,
3860         # especially in cases like AC_OUTPUT(foo/out:bar/in), where
3861         # there is no Makefile in bar/.
3862         if ($relative_dir eq '.')
3863         {
3864             foreach (@inputs)
3865             {
3866                 $dist_dirs{dirname ($_)} = 1;
3867             }
3868         }
3869
3870         # We skip any automake input files, as they are handled
3871         # elsewhere.  We also skip files that aren't in this
3872         # directory.  However, if the file's directory does not have a
3873         # Makefile, and we are currently doing `.', then we create a
3874         # rule to rebuild the file in the subdir.
3875         next if -f $file . '.am';
3876         my $fd = dirname ($file);
3877         if ($fd ne $relative_dir)
3878         {
3879             if ($relative_dir eq '.' && ! &is_make_dir ($fd))
3880             {
3881                 $local = $file;
3882             }
3883             else
3884             {
3885                 next;
3886             }
3887         }
3888
3889         # Some users have been tempted to put `stamp-h' in the
3890         # AC_OUTPUT line.  This won't do the right thing, so we
3891         # explicitly fail here.
3892         if ($local eq 'stamp-h')
3893         {
3894             # FIXME: allow real filename.
3895             file_error ($ac_config_files_location,
3896                         'stamp-h should not appear in AC_OUTPUT');
3897             next;
3898         }
3899
3900         $output_rules .= ($local . ': '
3901                           . '$(top_builddir)/config.status '
3902                           . join (' ', @rewritten_inputs) . "\n"
3903                           . "\t"
3904                           . 'cd $(top_builddir) && CONFIG_FILES='
3905                           . ($relative_dir eq '.' ? '' : '$(subdir)/')
3906                           . '$@' . ($need_rewritten
3907                                     ? (':' . join (':', @inputs))
3908                                     : '')
3909                           . ' CONFIG_HEADERS= CONFIG_LINKS= $(SHELL) ./config.status'
3910                           . "\n");
3911         push (@actual_other_files, $local);
3912
3913         # Require all input files.
3914         require_file ($ac_config_files_location, $FOREIGN,
3915                       &rewrite_inputs_into_dependencies (0, @inputs));
3916     }
3917
3918     # These files get removed by "make clean".
3919     define_pretty_variable ('CONFIG_CLEAN_FILES', '', @actual_other_files);
3920 }
3921
3922 # Handle C headers.
3923 sub handle_headers
3924 {
3925     my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include',
3926                              'oldinclude', 'pkginclude',
3927                              'noinst', 'check');
3928     foreach (@r)
3929     {
3930         next unless /\.(.*)$/;
3931         &saw_extension ($1);
3932     }
3933 }
3934
3935 sub handle_gettext
3936 {
3937     return if ! $seen_gettext || $relative_dir ne '.';
3938
3939     if (! &variable_defined ('SUBDIRS'))
3940     {
3941         conf_error ("AM_GNU_GETTEXT used but SUBDIRS not defined");
3942         return;
3943     }
3944
3945     my @subdirs = &variable_value_as_list_recursive ('SUBDIRS', 'all');
3946     macro_error ('SUBDIRS',
3947                  "AM_GNU_GETTEXT used but `po' not in SUBDIRS")
3948         if ! grep ('po', @subdirs);
3949     macro_error ('SUBDIRS',
3950                  "AM_GNU_GETTEXT used but `intl' not in SUBDIRS")
3951         if ! grep ('intl', @subdirs);
3952
3953     require_file ($ac_gettext_location, $GNU, 'ABOUT-NLS');
3954 }
3955
3956 # Handle footer elements.
3957 sub handle_footer
3958 {
3959     # NOTE don't use define_pretty_variable here, because
3960     # $contents{...} is already defined.
3961     $output_vars .= 'SOURCES = ' . variable_value ('SOURCES') . "\n\n"
3962       if variable_value ('SOURCES');
3963
3964
3965     target_error ('.SUFFIXES',
3966                   "use variable `SUFFIXES', not target `.SUFFIXES'")
3967       if target_defined ('.SUFFIXES');
3968
3969     # Note: AIX 4.1 /bin/make will fail if any suffix rule appears
3970     # before .SUFFIXES.  So we make sure that .SUFFIXES appears before
3971     # anything else, by sticking it right after the default: target.
3972     $output_header .= ".SUFFIXES:\n";
3973     if (@suffixes || &variable_defined ('SUFFIXES'))
3974     {
3975         # Make sure suffixes has unique elements.  Sort them to ensure
3976         # the output remains consistent.  However, $(SUFFIXES) is
3977         # always at the start of the list, unsorted.  This is done
3978         # because make will choose rules depending on the ordering of
3979         # suffixes, and this lets the user have some control.  Push
3980         # actual suffixes, and not $(SUFFIXES).  Some versions of make
3981         # do not like variable substitutions on the .SUFFIXES line.
3982         my @user_suffixes = (&variable_defined ('SUFFIXES')
3983                              ? &variable_value_as_list_recursive ('SUFFIXES', '')
3984                              : ());
3985
3986         my %suffixes = map { $_ => 1 } @suffixes;
3987         delete @suffixes{@user_suffixes};
3988
3989         $output_header .= (".SUFFIXES: "
3990                            . join (' ', @user_suffixes, sort keys %suffixes)
3991                            . "\n");
3992     }
3993
3994     $output_trailer .= file_contents ('footer');
3995 }
3996
3997 # Deal with installdirs target.
3998 sub handle_installdirs ()
3999 {
4000     $output_rules .=
4001       &file_contents ('install',
4002                       ('_am_installdirs'
4003                        => variable_value ('_am_installdirs') || ''));
4004 }
4005
4006
4007 # Deal with all and all-am.
4008 sub handle_all ($)
4009 {
4010     my ($makefile) = @_;
4011
4012     # Output `all-am'.
4013
4014     # Put this at the beginning for the sake of non-GNU makes.  This
4015     # is still wrong if these makes can run parallel jobs.  But it is
4016     # right enough.
4017     unshift (@all, basename ($makefile));
4018
4019     foreach my $one_name (@config_names)
4020     {
4021         push (@all, basename ($one_name))
4022             if dirname ($one_name) eq $relative_dir;
4023     }
4024
4025     # Install `all' hooks.
4026     if (&target_defined ("all-local"))
4027     {
4028       push (@all, "all-local");
4029       &depend ('.PHONY', "all-local");
4030     }
4031
4032     &pretty_print_rule ("all-am:", "\t\t", @all);
4033     &depend ('.PHONY', 'all-am', 'all');
4034
4035
4036     # Output `all'.
4037
4038     my @local_headers = ();
4039     push @local_headers, '$(BUILT_SOURCES)'
4040       if &variable_defined ('BUILT_SOURCES');
4041     foreach my $one_name (@config_names)
4042       {
4043         push @local_headers, basename ($one_name)
4044           if dirname ($one_name) eq $relative_dir;
4045       }
4046
4047     if (@local_headers)
4048       {
4049         # We need to make sure config.h is built before we recurse.
4050         # We also want to make sure that built sources are built
4051         # before any ordinary `all' targets are run.  We can't do this
4052         # by changing the order of dependencies to the "all" because
4053         # that breaks when using parallel makes.  Instead we handle
4054         # things explicitly.
4055         $output_all .= ("all: " . join (' ', @local_headers)
4056                         . "\n\t"
4057                         . '$(MAKE) $(AM_MAKEFLAGS) '
4058                         . (&variable_defined ('SUBDIRS')
4059                            ? 'all-recursive' : 'all-am')
4060                         . "\n\n");
4061       }
4062     else
4063       {
4064         $output_all .= "all: " . (&variable_defined ('SUBDIRS')
4065                                   ? 'all-recursive' : 'all-am') . "\n\n";
4066       }
4067 }
4068
4069
4070 # Handle check merge target specially.
4071 sub do_check_merge_target
4072 {
4073     if (&target_defined ('check-local'))
4074     {
4075         # User defined local form of target.  So include it.
4076         push (@check_tests, 'check-local');
4077         &depend ('.PHONY', 'check-local');
4078     }
4079
4080     # In --cygnus mode, check doesn't depend on all.
4081     if ($cygnus_mode)
4082     {
4083         # Just run the local check rules.
4084         &pretty_print_rule ('check-am:', "\t\t", @check);
4085     }
4086     else
4087     {
4088         # The check target must depend on the local equivalent of
4089         # `all', to ensure all the primary targets are built.  Then it
4090         # must build the local check rules.
4091         $output_rules .= "check-am: all-am\n";
4092         &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4093                             @check)
4094             if @check;
4095     }
4096     &pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4097                         @check_tests)
4098         if @check_tests;
4099
4100     &depend ('.PHONY', 'check', 'check-am');
4101     $output_rules .= ("check: "
4102                       . (&variable_defined ('SUBDIRS')
4103                          ? 'check-recursive' : 'check-am')
4104                       . "\n");
4105 }
4106
4107 # Handle all 'clean' targets.
4108 sub handle_clean
4109 {
4110     my %transform;
4111
4112     # Don't include `MAINTAINER'; it is handled specially below.
4113     foreach my $name ('MOSTLY', '', 'DIST')
4114     {
4115       $transform{"${name}CLEAN"} = &variable_defined ("${name}CLEANFILES");
4116     }
4117
4118     # Built sources are automatically removed by maintainer-clean.
4119     push (@maintainer_clean_files, '$(BUILT_SOURCES)')
4120         if &variable_defined ('BUILT_SOURCES');
4121     push (@maintainer_clean_files, '$(MAINTAINERCLEANFILES)')
4122         if &variable_defined ('MAINTAINERCLEANFILES');
4123
4124     $output_rules .= &file_contents ('clean',
4125                                      (%transform,
4126                                       'MCFILES'
4127                                       # Join with no space to avoid
4128                                       # spurious `test -z' success at
4129                                       # runtime.
4130                                       => join ('', @maintainer_clean_files),
4131                                       'MFILES'
4132                                       # A space is required in the join here.
4133                                       => join (' ', @maintainer_clean_files)));
4134 }
4135
4136
4137 # &depend ($CATEGORY, @DEPENDENDEES)
4138 # ----------------------------------
4139 # The target $CATEGORY depends on @DEPENDENDEES.
4140 sub depend
4141 {
4142     my ($category, @dependendees) = @_;
4143     {
4144       push (@{$dependencies{$category}}, @dependendees);
4145     }
4146 }
4147
4148
4149 # &target_cmp ($A, $B)
4150 # --------------------
4151 # Subroutine for &handle_factored_dependencies to let `.PHONY' be last.
4152 sub target_cmp
4153 {
4154     return 0
4155         if $a eq $b;
4156     return -1
4157         if $b eq '.PHONY';
4158     return 1
4159         if $a eq '.PHONY';
4160     return $a cmp $b;
4161 }
4162
4163
4164 # &handle_factored_dependencies ()
4165 # --------------------------------
4166 # Handle everything related to gathered targets.
4167 sub handle_factored_dependencies
4168 {
4169     # Reject bad hooks.
4170     foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook',
4171                        'uninstall-exec-local', 'uninstall-exec-hook')
4172     {
4173         if (&target_defined ($utarg))
4174         {
4175             my $x = $utarg;
4176             $x =~ s/(data|exec)-//;
4177             target_error ($utarg, "use `$x', not `$utarg'");
4178         }
4179     }
4180
4181     if (&target_defined ('install-local'))
4182     {
4183         target_error ('install-local',
4184                       "use `install-data-local' or `install-exec-local', "
4185                       . "not `install-local'");
4186     }
4187
4188     if (!defined $options{'no-installinfo'}
4189         && &target_defined ('install-info-local'))
4190     {
4191         target_error ('install-info-local',
4192                       "`install-info-local' target defined but "
4193                       . "`no-installinfo' option not in use");
4194     }
4195
4196     # Install the -local hooks.
4197     foreach (keys %dependencies)
4198     {
4199       # Hooks are installed on the -am targets.
4200       s/-am$// or next;
4201       if (&target_defined ("$_-local"))
4202         {
4203           depend ("$_-am", "$_-local");
4204           &depend ('.PHONY', "$_-local");
4205         }
4206     }
4207
4208     # Install the -hook hooks.
4209     # FIXME: Why not be as liberal as we are with -local hooks?
4210     foreach ('install-exec', 'install-data')
4211     {
4212       if (&target_defined ("$_-hook"))
4213         {
4214           $actions{"$_-am"} .=
4215             ("\t\@\$(NORMAL_INSTALL)\n"
4216              . "\t" . '$(MAKE) $(AM_MAKEFLAGS) ' . "$_-hook\n");
4217         }
4218     }
4219
4220     # All the required targets are phony.
4221     depend ('.PHONY', keys %required_targets);
4222
4223     # Actually output gathered targets.
4224     foreach (sort target_cmp keys %dependencies)
4225     {
4226         # If there is nothing about this guy, skip it.
4227         next
4228           unless (@{$dependencies{$_}}
4229                   || $actions{$_}
4230                   || $required_targets{$_});
4231         &pretty_print_rule ("$_:", "\t",
4232                             uniq (sort @{$dependencies{$_}}));
4233         $output_rules .= $actions{$_}
4234           if defined $actions{$_};
4235         $output_rules .= "\n";
4236     }
4237 }
4238
4239
4240 # &handle_tests_dejagnu ()
4241 # ------------------------
4242 sub handle_tests_dejagnu
4243 {
4244     push (@check_tests, 'check-DEJAGNU');
4245     $output_rules .= file_contents ('dejagnu');
4246 }
4247
4248
4249 # Handle TESTS variable and other checks.
4250 sub handle_tests
4251 {
4252     if (defined $options{'dejagnu'})
4253     {
4254         &handle_tests_dejagnu;
4255     }
4256     else
4257     {
4258         foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
4259         {
4260             macro_error ($c,
4261                          "`$c' defined but `dejagnu' not in `AUTOMAKE_OPTIONS'")
4262               if &variable_defined ($c);
4263         }
4264     }
4265
4266     if (&variable_defined ('TESTS'))
4267     {
4268         push (@check_tests, 'check-TESTS');
4269         $output_rules .= &file_contents ('check');
4270     }
4271 }
4272
4273 # Handle Emacs Lisp.
4274 sub handle_emacs_lisp
4275 {
4276     my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP',
4277                                    'lisp', 'noinst');
4278
4279     return if ! @elfiles;
4280
4281     # Generate .elc files.
4282     my @elcfiles = map { $_ . 'c' } @elfiles;
4283     define_pretty_variable ('ELCFILES', '', @elcfiles);
4284
4285     push (@all, '$(ELCFILES)');
4286
4287     &am_error ("`lisp_LISP' defined but `AM_PATH_LISPDIR' not in `$configure_ac'")
4288       if ! $am_lispdir_location && &variable_defined ('lisp_LISP');
4289
4290     require_conf_file ($am_lispdir_location,  $FOREIGN, 'elisp-comp');
4291     &define_variable ('elisp_comp', $config_aux_dir . '/elisp-comp');
4292 }
4293
4294 # Handle Python
4295 sub handle_python
4296 {
4297     my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON',
4298                                    'python', 'noinst');
4299     return if ! @pyfiles;
4300
4301     # Found some python.
4302     &am_error ("`python_PYTHON' defined but `AM_PATH_PYTHON' not in `$configure_ac'")
4303         if ! $pythondir_location && &variable_defined ('python_PYTHON');
4304
4305     require_conf_file ($pythondir_location, $FOREIGN, 'py-compile');
4306     &define_variable ('py_compile', $config_aux_dir . '/py-compile');
4307 }
4308
4309 # Handle Java.
4310 sub handle_java
4311 {
4312     my @sourcelist = &am_install_var ('-candist',
4313                                       'java', 'JAVA',
4314                                       'java', 'noinst', 'check');
4315     return if ! @sourcelist;
4316
4317     my %valid = &am_primary_prefixes ('JAVA', 1,
4318                                       'java', 'noinst', 'check');
4319
4320     my $dir;
4321     foreach my $curs (keys %valid)
4322     {
4323         if (! &variable_defined ($curs . '_JAVA') || $curs eq 'EXTRA')
4324         {
4325             next;
4326         }
4327
4328         if (defined $dir)
4329         {
4330             macro_error ($curs . '_JAVA',
4331                          "multiple _JAVA primaries in use");
4332         }
4333         $dir = $curs;
4334     }
4335
4336     push (@all, 'class' . $dir . '.stamp');
4337 }
4338
4339
4340 # Handle some of the minor options.
4341 sub handle_minor_options
4342 {
4343     if (defined $options{'readme-alpha'})
4344     {
4345         if ($relative_dir eq '.')
4346         {
4347             if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
4348             {
4349                 # FIXME: allow real filename.
4350                 file_error ($package_version_location,
4351                             "version `$package_version' doesn't follow Gnits standards");
4352             }
4353             elsif (defined $1 && -f 'README-alpha')
4354             {
4355                 # This means we have an alpha release.  See
4356                 # GNITS_VERSION_PATTERN for details.
4357                 require_file_with_macro ('AUTOMAKE_OPTIONS',
4358                                          $FOREIGN, 'README-alpha');
4359             }
4360         }
4361     }
4362 }
4363
4364 ################################################################
4365
4366 my %make_list;
4367
4368 # &scan_autoconf_config_files ($CONFIG-FILES)
4369 # -------------------------------------------
4370 # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
4371 # (or AC_OUTPUT).
4372 sub scan_autoconf_config_files
4373 {
4374     my ($config_files) = @_;
4375     # Look at potential Makefile.am's.
4376     foreach (split ' ', $config_files)
4377     {
4378         # Must skip empty string for Perl 4.
4379         next if $_ eq "\\" || $_ eq '';
4380
4381         # Handle $local:$input syntax.  Note that we ignore
4382         # every input file past the first, though we keep
4383         # those around for later.
4384         my ($local, $input, @rest) = split (/:/);
4385         if (! $input)
4386         {
4387             $input = $local;
4388         }
4389         else
4390         {
4391             # FIXME: should be error if .in is missing.
4392             $input =~ s/\.in$//;
4393         }
4394
4395         if (-f $input . '.am')
4396         {
4397             # We have a file that automake should generate.
4398             $make_list{$input} = join (':', ($local, @rest));
4399         }
4400         else
4401         {
4402             # We have a file that automake should cause to be
4403             # rebuilt, but shouldn't generate itself.
4404             push (@other_input_files, $_);
4405         }
4406     }
4407 }
4408
4409
4410 # &scan_autoconf_traces ($FILENAME)
4411 # ---------------------------------
4412 # FIXME: For the time being, we don't care about the FILENAME.
4413 sub scan_autoconf_traces ($)
4414 {
4415   my ($filename) = @_;
4416
4417   my @traced = (
4418                 'AC_CANONICAL_HOST',
4419                 'AC_CANONICAL_SYSTEM',
4420                 'AC_CONFIG_AUX_DIR',
4421                 'AC_CONFIG_FILES',
4422                 'AC_LIBSOURCE',
4423                 'AC_PROG_LIBTOOL', 'AM_PROG_LIBTOOL',
4424                 'AC_PROG_LEX',
4425                 'AC_SUBST',
4426                 'AM_CONDITIONAL',
4427                 'AM_CONFIG_HEADER',
4428                 'AM_C_PROTOTYPES',
4429                 'AM_GNU_GETTEXT',
4430                 'AM_INIT_AUTOMAKE',
4431                 'AM_MAINTAINER_MODE',
4432                 'AM_PATH_LISPDIR',
4433                 'AM_PATH_PYTHON',
4434                 'AM_PROG_CC_C_O',
4435                );
4436
4437   my $traces = "$ENV{amtraces} ";
4438
4439   # Use a separator unlikely to be used, not `:', the default, which
4440   # has a precise meaning for AC_CONFIG_FILES and so on.
4441   $traces .= join (' ',
4442                    map { "--trace=$_" . ':\$f:\$l::\$n::\${::}%' } @traced);
4443
4444   my $tracefh = new Automake::XFile ("$traces |");
4445   verbose "reading $traces";
4446
4447   while ($_ = $tracefh->getline)
4448     {
4449       chomp;
4450       my ($here, @args) = split /::/;
4451       my $macro = $args[0];
4452
4453       # Alphabetical ordering please.
4454       if ($macro eq 'AC_CANONICAL_HOST')
4455         {
4456           $seen_canonical = $AC_CANONICAL_HOST
4457             if ! $seen_canonical;
4458         }
4459       elsif ($macro eq 'AC_CANONICAL_SYSTEM')
4460         {
4461           $seen_canonical = $AC_CANONICAL_SYSTEM;
4462         }
4463       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
4464         {
4465           @config_aux_path = $args[1];
4466           $config_aux_dir_set_in_configure_in = 1;
4467         }
4468       elsif ($macro eq 'AC_CONFIG_FILES')
4469         {
4470           # Look at potential Makefile.am's.
4471           $ac_config_files_location = $here;
4472           &scan_autoconf_config_files ($args[1]);
4473         }
4474       elsif ($macro eq 'AC_LIBSOURCE')
4475         {
4476           # We should actually also `close' the sources: getopt.c
4477           # wants getopt.h etc.  But actually it should be done in the
4478           # macro itself, i.e., we have to first fix Autoconf to extend
4479           # _AC_LIBOBJ_DECL and use it the in various macros.
4480           $libsources{$args[1]} = $here;
4481         }
4482       elsif ($macro =~ /A(C|M)_PROG_LIBTOOL/)
4483         {
4484           $seen_libtool = $here;
4485           $libtool_location = $here;
4486         }
4487       elsif ($macro =~ /AC_PROG_LEX/)
4488         {
4489           $seen_prog_lex = $here;
4490         }
4491       elsif ($macro eq 'AC_SUBST')
4492         {
4493           # Just check for alphanumeric in AC_SUBST.  If you do
4494           # AC_SUBST(5), then too bad.
4495           $configure_vars{$args[1]} = $here
4496             if $args[1] =~ /^\w+$/;
4497         }
4498       elsif ($macro eq 'AM_CONDITIONAL')
4499         {
4500           $configure_cond{$args[1]} = $here;
4501         }
4502       elsif ($macro eq 'AM_CONFIG_HEADER')
4503         {
4504           $config_header_location = $here;
4505           foreach my $one_hdr (split (' ', $args[1]))
4506             {
4507               push (@config_fullnames, $one_hdr);
4508               if ($one_hdr =~ /^([^:]+):(.+)$/)
4509                 {
4510                   push (@config_names, $1);
4511                   push (@config_headers, $2);
4512                 }
4513               else
4514                 {
4515                   push (@config_names, $one_hdr);
4516                   push (@config_headers, $one_hdr . '.in');
4517                 }
4518             }
4519         }
4520       elsif ($macro eq 'AM_C_PROTOTYPES')
4521         {
4522           $am_c_prototypes = $here;
4523         }
4524       elsif ($macro eq 'AM_GNU_GETTEXT')
4525         {
4526           $seen_gettext = $here;
4527           $ac_gettext_location = $here;
4528         }
4529       elsif ($macro eq 'AM_INIT_AUTOMAKE')
4530         {
4531           $package_version = $args[2];
4532           $package_version_location = $here;
4533           $seen_init_automake = 1;
4534         }
4535       elsif ($macro eq 'AM_MAINTAINER_MODE')
4536         {
4537           $seen_maint_mode = $here;
4538         }
4539       elsif ($macro eq 'AM_PATH_LISPDIR')
4540         {
4541           $am_lispdir_location = $here;
4542         }
4543       elsif ($macro eq 'AM_PATH_PYTHON')
4544         {
4545           $pythondir_location = $here;
4546         }
4547       elsif ($macro eq 'AM_PROG_CC_C_O')
4548         {
4549           $seen_cc_c_o = $here;
4550         }
4551    }
4552 }
4553
4554
4555 # &scan_one_autoconf_file ($FILENAME)
4556 # -----------------------------------
4557 # Scan one file for interesting things.  Subroutine of
4558 # &scan_autoconf_files.
4559 sub scan_one_autoconf_file
4560 {
4561     my ($filename) = @_;
4562
4563     # Some macros already provide the right traces to enable generic
4564     # code and specific arguments, instead of dedicated code.  But
4565     # currently we don't handle traces.  Rewrite these dedicated
4566     # macros handling into the generic macro invocation, and let our
4567     # generic case handle them.
4568
4569     my %generalize =
4570       (
4571        'AC_FUNC_ALLOCA'           => 'AC_LIBSOURCES([alloca.c])',
4572        'AC_FUNC_GETLOADAVG'       => 'AC_LIBSOURCES([getloadavg.c])',
4573        'AC_FUNC_MEMCMP'           => 'AC_LIBSOURCES([memcmp.c])',
4574        'AC_STRUCT_ST_BLOCKS'      => 'AC_LIBSOURCES([fileblocks.c])',
4575        'A[CM]_REPLACE_GNU_GETOPT' => 'AC_LIBSOURCES([getopt.c, getopt1.c])',
4576        'A[CM]_FUNC_STRTOD'        => 'AC_LIBSOURCES([strtod.c])',
4577        'AM_WITH_REGEX'      => 'AC_LIBSOURCES([rx.c, rx.h, regex.c, regex.h])',
4578        'AC_FUNC_MKTIME'           => 'AC_LIBSOURCES([mktime.c])',
4579        'A[CM]_FUNC_ERROR_AT_LINE' => 'AC_LIBSOURCES([error.c, error.h])',
4580        'A[CM]_FUNC_OBSTACK'       => 'AC_LIBSOURCES([obstack.c, obstack.h])',
4581       );
4582
4583     my $configfh = new Automake::XFile ("< $filename");
4584     verbose "reading $filename";
4585
4586     my ($in_ac_output, $in_ac_replace) = (0, 0);
4587     while ($_ = $configfh->getline)
4588     {
4589         # Remove comments from current line.
4590         s/\bdnl\b.*$//;
4591         s/\#.*$//;
4592
4593         # Skip macro definitions.  Otherwise we might be confused into
4594         # thinking that a macro that was only defined was actually
4595         # used.
4596         next if /AC_DEFUN/;
4597
4598         # Follow includes.  This is a weirdness commonly in use at
4599         # Cygnus and hopefully nowhere else.
4600         if (/sinclude\((.*)\)/ && -f $1)
4601         {
4602             # $_ being local, if we don't preserve it, when coming
4603             # back we will have $_ undefined, which is bad for the
4604             # the rest of this routine.
4605             my $underscore = $_;
4606             &scan_one_autoconf_file ($1);
4607             $_ = $underscore;
4608         }
4609
4610         for my $generalize (keys %generalize)
4611           {
4612             s/$generalize/$generalize{$generalize}/g;
4613           }
4614
4615
4616         my $here = "$filename:$.";
4617
4618         # Populate libobjs array.
4619         if (/LIBOBJS="(.*)\s+\$LIBOBJS"/
4620                || /LIBOBJS="\$LIBOBJS\s+(.*)"/)
4621         {
4622             foreach my $libobj_iter (split (' ', $1))
4623             {
4624                 if ($libobj_iter =~ /^(.*)\.o(bj)?$/
4625                     || $libobj_iter =~ /^(.*)\.\$ac_objext$/
4626                     || $libobj_iter =~ /^(.*)\.\$\{ac_objext\}$/)
4627                 {
4628                     $libsources{$1 . '.c'} = $here;
4629                 }
4630             }
4631         }
4632         elsif (/AC_LIBOBJ\(([^)]+)\)/)
4633         {
4634             $libsources{"$1.c"} = $here;
4635         }
4636         elsif (/AC_LIBSOURCE\(([^)]+)\)/)
4637         {
4638             $libsources{&unquote_m4_arg ($1)} = $here;
4639         }
4640         elsif (/AC_LIBSOURCES\(([^)]+)\)/)
4641         {
4642             foreach my $lc_iter (split (/[, ]+/, &unquote_m4_arg ($1)))
4643             {
4644                 $libsources{$lc_iter} = $here;
4645             }
4646         }
4647
4648         if (! $in_ac_replace && s/AC_REPLACE_FUNCS\s*\(\[?//)
4649         {
4650             $in_ac_replace = 1;
4651         }
4652         if ($in_ac_replace)
4653         {
4654             $in_ac_replace = 0 if s/[\]\)].*$//;
4655             # Remove trailing backslash.
4656             s/\\$//;
4657             foreach (split)
4658             {
4659                 # Need to skip empty elements for Perl 4.
4660                 next if $_ eq '';
4661                 $libsources{$_ . '.c'} = $here;
4662             }
4663         }
4664
4665         if (/$obsolete_rx/o)
4666         {
4667             my $hint = '';
4668             if ($obsolete_macros{$1} ne '')
4669             {
4670                 $hint = '; ' . $obsolete_macros{$1};
4671             }
4672             file_error ($here, "`$1' is obsolete$hint");
4673         }
4674
4675         # Process the AC_OUTPUT and AC_CONFIG_FILES macros.
4676         if (! $in_ac_output && s/(AC_(OUTPUT|CONFIG_FILES))\s*\(\[?//)
4677         {
4678             $in_ac_output = $1;
4679             $ac_config_files_location = $here;
4680         }
4681         if ($in_ac_output)
4682         {
4683             my $closing = 0;
4684             if (s/[\]\),].*$//)
4685             {
4686                 $in_ac_output = 0;
4687                 $closing = 1;
4688             }
4689
4690             # Look at potential Makefile.am's.
4691             &scan_autoconf_config_files ($_);
4692
4693             if ($closing
4694                 && scalar keys %make_list == 0
4695                 && @other_input_files == 0)
4696             {
4697                 file_error ($ac_config_files_location,
4698                             "no files mentioned in `$in_ac_output'");
4699                 exit 1;
4700             }
4701         }
4702
4703         if (/$AC_CONFIG_AUX_DIR_PATTERN/o)
4704         {
4705             @config_aux_path = &unquote_m4_arg ($1);
4706             $config_aux_dir_set_in_configure_in = $here;
4707         }
4708
4709         # Check for ansi2knr.
4710         $am_c_prototypes = $here if /AM_C_PROTOTYPES/;
4711
4712         # Check for `-c -o' code.
4713         $seen_cc_c_o = $here if /AM_PROG_CC_C_O/;
4714
4715         # Check for NLS support.
4716         if (/AM_GNU_GETTEXT/)
4717         {
4718             $seen_gettext = $here;
4719             $ac_gettext_location = $here;
4720         }
4721
4722         # Handle configuration headers.  A config header of `[$1]'
4723         # means we are actually scanning AM_CONFIG_HEADER from
4724         # aclocal.m4.
4725         if (/A([CM])_CONFIG_HEADERS?\s*\((.*)\)/
4726             && $2 ne '[$1]')
4727         {
4728             file_error ($here,
4729                "`automake requires `AM_CONFIG_HEADER', not `AC_CONFIG_HEADER'")
4730               if $1 eq 'C';
4731
4732             $config_header_location = $here;
4733             foreach my $one_hdr (split (' ', &unquote_m4_arg ($2)))
4734             {
4735                 push (@config_fullnames, $one_hdr);
4736                 if ($one_hdr =~ /^([^:]+):(.+)$/)
4737                 {
4738                     push (@config_names, $1);
4739                     push (@config_headers, $2);
4740                 }
4741                 else
4742                 {
4743                     push (@config_names, $one_hdr);
4744                     push (@config_headers, $one_hdr . '.in');
4745                 }
4746             }
4747         }
4748
4749         # Handle AC_CANONICAL_*.  Always allow upgrading to
4750         # AC_CANONICAL_SYSTEM, but never downgrading.
4751         $seen_canonical = $AC_CANONICAL_HOST
4752             if ! $seen_canonical
4753                 && (/AC_CANONICAL_HOST/ || /AC_CHECK_TOOL/);
4754         $seen_canonical = $AC_CANONICAL_SYSTEM if /AC_CANONICAL_SYSTEM/;
4755
4756         # If using X, include some extra variable definitions.  NOTE
4757         # we don't want to force these into CFLAGS or anything,
4758         # because not all programs will necessarily use X.
4759         if (/AC_PATH_XTRA/)
4760           {
4761             foreach my $var ('X_CFLAGS', 'X_LIBS', 'X_EXTRA_LIBS',
4762                              'X_PRE_LIBS')
4763               {
4764                 $configure_vars{$var} = $here;
4765               }
4766           }
4767
4768         # This macro handles several different things.
4769         if (/$AM_INIT_AUTOMAKE_PATTERN/o)
4770         {
4771             ($package_version = $1) =~ s/$AM_PACKAGE_VERSION_PATTERN/$1/o;
4772             $package_version_location = $here;
4773             $seen_init_automake = $here;
4774         }
4775
4776         if (/AM_PROG_LEX/)
4777         {
4778             $configure_vars{'LEX'} = $here;
4779             $seen_prog_lex = $here;
4780         }
4781         if (/AC_PROG_LEX/ && $filename =~ /configure\.(ac|in)$/)
4782         {
4783             $configure_vars{'LEX'} = $here;
4784             $seen_prog_lex = $here;
4785             file_warning ($here,
4786                    "automake requires `AM_PROG_LEX', not `AC_PROG_LEX'");
4787         }
4788
4789         if (/AC_PROG_(F77|YACC|RANLIB|CC|CXXCPP|CXX|LEX|AWK|CPP|LN_S)/)
4790         {
4791             $configure_vars{$1} = $here;
4792         }
4793         if (/$AC_CHECK_PATTERN/o)
4794         {
4795             $configure_vars{$3} = $here;
4796         }
4797         if (/$AM_MISSING_PATTERN/o
4798             && $1 ne 'ACLOCAL'
4799             && $1 ne 'AUTOCONF'
4800             && $1 ne 'AUTOMAKE'
4801             && $1 ne 'AUTOHEADER'
4802             # AM_INIT_AUTOMAKE is AM_MISSING_PROG'ing MAKEINFO.  But
4803             # we handle it elsewhere.
4804             && $1 ne 'MAKEINFO')
4805         {
4806             $configure_vars{$1} = $here;
4807         }
4808
4809         # Explicitly avoid ANSI2KNR -- we AC_SUBST that in protos.m4,
4810         # but later define it elsewhere.  This is pretty hacky.  We
4811         # also explicitly avoid INSTALL_SCRIPT and some other
4812         # variables because they are defined in header-vars.am.
4813         # AMDEPBACKSLASH might be subst'd by `\', which certainly would
4814         # not be appreciated by Make.
4815         if (/$AC_SUBST_PATTERN/o
4816             && $1 ne 'ANSI2KNR'
4817             && $1 ne 'INSTALL_SCRIPT'
4818             && $1 ne 'INSTALL_DATA'
4819             && $1 ne 'AMDEPBACKSLASH')
4820         {
4821             $configure_vars{$1} = $here;
4822         }
4823
4824         if (/AM_MAINTAINER_MODE/)
4825         {
4826             $seen_maint_mode = $here;
4827             $configure_cond{'MAINTAINER_MODE'} = $here;
4828         }
4829
4830         $am_lispdir_location = $here if /AM_PATH_LISPDIR/;
4831
4832         if (/AM_PATH_PYTHON/)
4833           {
4834             $pythondir_location = $here;
4835             $configure_vars{'pythondir'} = $here;
4836             $configure_vars{'PYTHON'} = $here;
4837           }
4838
4839         if (/A(C|M)_PROG_LIBTOOL/)
4840         {
4841             # We're not ready for this yet.  People still use a
4842             # libtool with no AC_PROG_LIBTOOL.  Once that is the
4843             # dominant version we can reenable this code -- but next
4844             # time by mentioning the macro in %obsolete_macros, both
4845             # here and in aclocal.in.
4846
4847             # if (/AM_PROG_LIBTOOL/)
4848             # {
4849             #   file_warning ($here, "`AM_PROG_LIBTOOL' is obsolete, use `AC_PROG_LIBTOOL' instead");
4850             # }
4851             $seen_libtool = $here;
4852             $libtool_location = $here;
4853             $configure_vars{'LIBTOOL'} = $here;
4854             $configure_vars{'RANLIB'} = $here;
4855             $configure_vars{'CC'} = $here;
4856             # AC_PROG_LIBTOOL runs AC_CANONICAL_HOST.  Make sure we
4857             # never downgrade (if we've seen AC_CANONICAL_SYSTEM).
4858             $seen_canonical = $AC_CANONICAL_HOST if ! $seen_canonical;
4859         }
4860
4861         $seen_multilib = $here if (/AM_ENABLE_MULTILIB/);
4862
4863         if (/$AM_CONDITIONAL_PATTERN/o)
4864         {
4865             $configure_cond{$1} = $here;
4866         }
4867
4868         # Check for Fortran 77 intrinsic and run-time libraries.
4869         if (/AC_F77_LIBRARY_LDFLAGS/)
4870         {
4871             $configure_vars{'FLIBS'} = $here;
4872         }
4873     }
4874 }
4875
4876
4877 # &scan_autoconf_files ()
4878 # -----------------------
4879 # Check whether we use `configure.ac' or `configure.in'.
4880 # Scan it (and possibly `aclocal.m4') for interesting things.
4881 # We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
4882 sub scan_autoconf_files
4883 {
4884     # Reinitialize libsources here.  This isn't really necessary,
4885     # since we currently assume there is only one configure.ac.  But
4886     # that won't always be the case.
4887     %libsources = ();
4888
4889     $configure_ac = find_configure_ac;
4890     die "$me: `configure.ac' or `configure.in' is required\n"
4891         if !$configure_ac;
4892
4893     if (defined $ENV{'amtraces'})
4894     {
4895         print STDERR "$me: Autoconf traces is an experimental feature\n";
4896         print STDERR "$me: use at your own risks\n";
4897
4898         scan_autoconf_traces ($configure_ac);
4899     }
4900     else
4901       {
4902         scan_one_autoconf_file ($configure_ac);
4903         scan_one_autoconf_file ('aclocal.m4')
4904           if -f 'aclocal.m4';
4905       }
4906
4907     # Set input and output files if not specified by user.
4908     if (! @input_files)
4909     {
4910         @input_files = sort keys %make_list;
4911         %output_files = %make_list;
4912     }
4913
4914     @configure_input_files = sort keys %make_list;
4915
4916     conf_error ("`AM_INIT_AUTOMAKE' must be used")
4917         if ! $seen_init_automake;
4918
4919     # Look for some files we need.  Always check for these.  This
4920     # check must be done for every run, even those where we are only
4921     # looking at a subdir Makefile.  We must set relative_dir so that
4922     # the file-finding machinery works.
4923     # FIXME: Is this broken because it needs dynamic scopes.
4924     # My tests seems to show it's not the case.
4925     $relative_dir = '.';
4926     &require_config_file ($FOREIGN, 'install-sh', 'mkinstalldirs', 'missing');
4927     &am_error ("`install.sh' is an anachronism; use `install-sh' instead")
4928         if -f $config_aux_path[0] . '/install.sh';
4929
4930     &require_config_file ($FOREIGN, 'py-compile')
4931         if $pythondir_location;
4932
4933     # Preserve dist_common for later.
4934     $configure_dist_common = variable_value ('DIST_COMMON', 'TRUE') || '';
4935 }
4936
4937 ################################################################
4938
4939 # Set up for Cygnus mode.
4940 sub check_cygnus
4941 {
4942     return unless $cygnus_mode;
4943
4944     &set_strictness ('foreign');
4945     $options{'no-installinfo'} = 1;
4946     $options{'no-dependencies'} = 1;
4947     $use_dependencies = 0;
4948
4949     conf_error ("`AM_MAINTAINER_MODE' required when --cygnus specified")
4950       if !$seen_maint_mode;
4951 }
4952
4953 # Do any extra checking for GNU standards.
4954 sub check_gnu_standards
4955 {
4956     if ($relative_dir eq '.')
4957     {
4958         # In top level (or only) directory.
4959         require_file ('',
4960                       $GNU, 'INSTALL', 'NEWS', 'README', 'COPYING',
4961                       'AUTHORS', 'ChangeLog');
4962     }
4963
4964     if ($strictness >= $GNU
4965         && defined $options{'no-installman'})
4966     {
4967         macro_error ('AUTOMAKE_OPTIONS',
4968                      "option `no-installman' disallowed by GNU standards");
4969     }
4970
4971     if ($strictness >= $GNU
4972         && defined $options{'no-installinfo'})
4973     {
4974         macro_error ('AUTOMAKE_OPTIONS',
4975                      "option `no-installinfo' disallowed by GNU standards");
4976     }
4977 }
4978
4979 # Do any extra checking for GNITS standards.
4980 sub check_gnits_standards
4981 {
4982     if ($relative_dir eq '.')
4983     {
4984         # In top level (or only) directory.
4985         require_file ('', $GNITS, 'THANKS');
4986     }
4987 }
4988
4989 ################################################################
4990 #
4991 # Functions to handle files of each language.
4992
4993 # Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
4994 # simple formula: Return value is $LANG_SUBDIR if the resulting object
4995 # file should be in a subdir if the source file is, $LANG_PROCESS if
4996 # file is to be dealt with, $LANG_IGNORE otherwise.
4997
4998 # Much of the actual processing is handled in
4999 # handle_single_transform_list.  These functions exist so that
5000 # auxiliary information can be recorded for a later cleanup pass.
5001 # Note that the calls to these functions are computed, so don't bother
5002 # searching for their precise names in the source.
5003
5004 # This is just a convenience function that can be used to determine
5005 # when a subdir object should be used.
5006 sub lang_sub_obj
5007 {
5008     return defined $options{'subdir-objects'} ? $LANG_SUBDIR : $LANG_PROCESS;
5009 }
5010
5011 # Rewrite a single C source file.
5012 sub lang_c_rewrite
5013 {
5014     my ($directory, $base, $ext) = @_;
5015
5016     if (defined $options{'ansi2knr'} && $base =~ /_$/)
5017     {
5018         # FIXME: include line number in error.
5019         am_error ("C source file `$base.c' would be deleted by ansi2knr rules");
5020     }
5021
5022     my $r = $LANG_PROCESS;
5023     if (defined $options{'subdir-objects'})
5024     {
5025         $r = $LANG_SUBDIR;
5026         $base = $directory . '/' . $base;
5027
5028         if (! $seen_cc_c_o)
5029         {
5030             # Only give error once.
5031             $seen_cc_c_o = 1;
5032             # FIXME: line number.
5033             am_error ("C objects in subdir but `AM_PROG_CC_C_O' not in `$configure_ac'");
5034         }
5035
5036         require_conf_file ("$am_file.am", $FOREIGN, 'compile');
5037     }
5038
5039     $de_ansi_files{$base} = 1;
5040     return $r;
5041 }
5042
5043 # Rewrite a single C++ source file.
5044 sub lang_cxx_rewrite
5045 {
5046     return &lang_sub_obj;
5047 }
5048
5049 # Rewrite a single header file.
5050 sub lang_header_rewrite
5051 {
5052     # Header files are simply ignored.
5053     return $LANG_IGNORE;
5054 }
5055
5056 # Rewrite a single yacc file.
5057 sub lang_yacc_rewrite
5058 {
5059     my ($directory, $base, $ext) = @_;
5060
5061     my $r = &lang_sub_obj;
5062     (my $newext = $ext) =~ tr/y/c/;
5063     return ($r, $newext);
5064 }
5065
5066 # Rewrite a single yacc++ file.
5067 sub lang_yaccxx_rewrite
5068 {
5069     my ($directory, $base, $ext) = @_;
5070
5071     my $r = &lang_sub_obj;
5072     (my $newext = $ext) =~ tr/y/c/;
5073     return ($r, $newext);
5074 }
5075
5076 # Rewrite a single lex file.
5077 sub lang_lex_rewrite
5078 {
5079     my ($directory, $base, $ext) = @_;
5080
5081     my $r = &lang_sub_obj;
5082     (my $newext = $ext) =~ tr/l/c/;
5083     return ($r, $newext);
5084 }
5085
5086 # Rewrite a single lex++ file.
5087 sub lang_lexxx_rewrite
5088 {
5089     my ($directory, $base, $ext) = @_;
5090
5091     my $r = &lang_sub_obj;
5092     (my $newext = $ext) =~ tr/l/c/;
5093     return ($r, $newext);
5094 }
5095
5096 # Rewrite a single assembly file.
5097 sub lang_asm_rewrite
5098 {
5099     return &lang_sub_obj;
5100 }
5101
5102 # Rewrite a single Fortran 77 file.
5103 sub lang_f77_rewrite
5104 {
5105     return $LANG_PROCESS;
5106 }
5107
5108 # Rewrite a single preprocessed Fortran 77 file.
5109 sub lang_ppf77_rewrite
5110 {
5111     return $LANG_PROCESS;
5112 }
5113
5114 # Rewrite a single ratfor file.
5115 sub lang_ratfor_rewrite
5116 {
5117     return $LANG_PROCESS;
5118 }
5119
5120 # Rewrite a single Objective C file.
5121 sub lang_objc_rewrite
5122 {
5123     return &lang_sub_obj;
5124 }
5125
5126 # Rewrite a single Java file.
5127 sub lang_java_rewrite
5128 {
5129     return $LANG_SUBDIR;
5130 }
5131
5132 # The lang_X_finish functions are called after all source file
5133 # processing is done.  Each should handle defining rules for the
5134 # language, etc.  A finish function is only called if a source file of
5135 # the appropriate type has been seen.
5136
5137 sub lang_c_finish
5138 {
5139     # Push all libobjs files onto de_ansi_files.  We actually only
5140     # push files which exist in the current directory, and which are
5141     # genuine source files.
5142     foreach my $file (keys %libsources)
5143     {
5144         if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file")
5145         {
5146             $de_ansi_files{$1} = 1;
5147         }
5148     }
5149
5150     if (defined $options{'ansi2knr'} && keys %de_ansi_files)
5151     {
5152         # Make all _.c files depend on their corresponding .c files.
5153         my @objects;
5154         foreach my $base (sort keys %de_ansi_files)
5155         {
5156             # Each _.c file must depend on ansi2knr; otherwise it
5157             # might be used in a parallel build before it is built.
5158             # We need to support files in the srcdir and in the build
5159             # dir (because these files might be auto-generated.  But
5160             # we can't use $< -- some makes only define $< during a
5161             # suffix rule.
5162             $output_rules .= ($base . "_.c: $base.c \$(ANSI2KNR)\n\t"
5163                               . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) '
5164                               . '`if test -f $(srcdir)/' . $base . '.c'
5165                               . '; then echo $(srcdir)/' . $base . '.c'
5166                               . '; else echo ' . $base . '.c; fi` '
5167                               . "| sed 's/^# \\([0-9]\\)/#line \\1/' "
5168                               . '| $(ANSI2KNR) > ' . $base . "_.c"
5169                               # If ansi2knr fails then we shouldn't
5170                               # create the _.c file
5171                               . " || rm -f ${base}_.c\n");
5172             push (@objects, $base . '_.$(OBJEXT)');
5173             push (@objects, $base . '_.lo')
5174               if $seen_libtool;
5175         }
5176
5177         # Make all _.o (and _.lo) files depend on ansi2knr.
5178         # Use a sneaky little hack to make it print nicely.
5179         &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)');
5180     }
5181 }
5182
5183 # This is a yacc helper which is called whenever we have decided to
5184 # compile a yacc file.
5185 sub lang_yacc_target_hook
5186 {
5187     my ($self, $aggregate, $output, $input) = @_;
5188
5189     my $flag = $aggregate . "_YFLAGS";
5190     if ((&variable_defined ($flag)
5191          && &variable_value ($flag) =~ /$DASH_D_PATTERN/o)
5192         || (&variable_defined ('YFLAGS')
5193             && &variable_value ('YFLAGS') =~ /$DASH_D_PATTERN/o))
5194     {
5195         (my $output_base = $output) =~ s/\..*$//;
5196         my $header = $output_base . '.h';
5197
5198         # Found a `-d' that applies to the compilation of this file.
5199         # Add a dependency for the generated header file, and arrange
5200         # for that file to be included in the distribution.
5201         # FIXME: this fails for `nodist_*_SOURCES'.
5202         $output_rules .= "${header}: $output\n";
5203         &push_dist_common ($header);
5204         # If the files are built in the build directory, then we want
5205         # to remove them with `make clean'.  If they are in srcdir
5206         # they shouldn't be touched.  However, we can't determine this
5207         # statically, and the GNU rules say that yacc/lex output files
5208         # should be removed by maintainer-clean.  So that's what we
5209         # do.
5210         push (@maintainer_clean_files, $header);
5211     }
5212 }
5213
5214 # This is a helper for both lex and yacc.
5215 sub yacc_lex_finish_helper
5216 {
5217     return if defined $language_scratch{'lex-yacc-done'};
5218     $language_scratch{'lex-yacc-done'} = 1;
5219
5220     # If there is more than one distinct yacc (resp lex) source file
5221     # in a given directory, then the `ylwrap' program is required to
5222     # allow parallel builds to work correctly.  FIXME: for now, no
5223     # line number.
5224     &require_config_file ($FOREIGN, 'ylwrap');
5225     if ($config_aux_dir_set_in_configure_in)
5226     {
5227         &define_variable ('YLWRAP', $config_aux_dir . "/ylwrap");
5228     }
5229     else
5230     {
5231         &define_variable ('YLWRAP', '$(top_srcdir)/ylwrap');
5232     }
5233 }
5234
5235 sub lang_yacc_finish
5236 {
5237     return if defined $language_scratch{'yacc-done'};
5238     $language_scratch{'yacc-done'} = 1;
5239
5240     if (&variable_defined ('YACCFLAGS'))
5241     {
5242         macro_error ('YACCFLAGS',
5243                      "`YACCFLAGS' obsolete; use `YFLAGS' instead");
5244     }
5245
5246     if (count_files_for_language ('yacc') > 1)
5247     {
5248         &yacc_lex_finish_helper;
5249     }
5250 }
5251
5252
5253 sub lang_lex_finish
5254 {
5255     return if defined $language_scratch{'lex-done'};
5256     $language_scratch{'lex-done'} = 1;
5257
5258     if (! $seen_prog_lex)
5259     {
5260         &am_error ("lex source seen but `AM_PROG_LEX' not in `$configure_ac'");
5261     }
5262
5263     if (count_files_for_language ('lex') > 1)
5264     {
5265         &yacc_lex_finish_helper;
5266     }
5267 }
5268
5269
5270 # Given a hash table of linker names, pick the name that has the most
5271 # precedence.  This is lame, but something has to have global
5272 # knowledge in order to eliminate the conflict.  Add more linkers as
5273 # required.
5274 sub resolve_linker
5275 {
5276     my (%linkers) = @_;
5277
5278     return 'GCJLINK'
5279         if defined $linkers{'GCJLINK'};
5280     return 'CXXLINK'
5281         if defined $linkers{'CXXLINK'};
5282     return 'F77LINK'
5283         if defined $linkers{'F77LINK'};
5284     return 'OBJCLINK'
5285         if defined $linkers{'OBJCLINK'};
5286     return 'LINK';
5287 }
5288
5289 # Called to indicate that an extension was used.
5290 sub saw_extension
5291 {
5292     my ($ext) = @_;
5293     if (! defined $extension_seen{$ext})
5294     {
5295         $extension_seen{$ext} = 1;
5296     }
5297     else
5298     {
5299         ++$extension_seen{$ext};
5300     }
5301 }
5302
5303 # Return the number of files seen for a given language.  Knows about
5304 # special cases we care about.  FIXME: this is hideous.  We need
5305 # something that involves real language objects.  For instance yacc
5306 # and yaccxx could both derive from a common yacc class which would
5307 # know about the strange ylwrap requirement.  (Or better yet we could
5308 # just not support legacy yacc!)
5309 sub count_files_for_language
5310 {
5311     my ($name) = @_;
5312
5313     my @names;
5314     if ($name eq 'yacc' || $name eq 'yaccxx')
5315     {
5316         @names = ('yacc', 'yaccxx');
5317     }
5318     elsif ($name eq 'lex' || $name eq 'lexxx')
5319     {
5320         @names = ('lex', 'lexxx');
5321     }
5322     else
5323     {
5324         @names = ($name);
5325     }
5326
5327     my $r = 0;
5328     foreach $name (@names)
5329     {
5330         my $lang = $languages{$name};
5331         foreach my $ext (@{$lang->extensions})
5332         {
5333             $r += $extension_seen{$ext}
5334                 if defined $extension_seen{$ext};
5335         }
5336     }
5337
5338     return $r
5339 }
5340
5341 # Called to ask whether source files have been seen . If HEADERS is 1,
5342 # headers can be included.
5343 sub saw_sources_p
5344 {
5345     my ($headers) = @_;
5346
5347     # count all the sources
5348     my $count = 0;
5349     foreach my $val (values %extension_seen)
5350     {
5351         $count += $val;
5352     }
5353
5354     if (!$headers)
5355     {
5356         $count -= count_files_for_language ('header');
5357     }
5358
5359     return $count > 0;
5360 }
5361
5362
5363 # register_language (%ATTRIBUTE)
5364 # ------------------------------
5365 # Register a single language.
5366 # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
5367 sub register_language (%)
5368 {
5369     my (%option) = @_;
5370
5371     # Set the defaults.
5372     $option{'ansi'} = 0
5373       unless defined $option{'ansi'};
5374     $option{'autodep'} = 'no'
5375       unless defined $option{'autodep'};
5376     $option{'linker'} = ''
5377       unless defined $option{'linker'};
5378     $option{'define_flag'} = 1
5379       unless defined $option{'define_flag'};
5380
5381     my $lang = new Language (%option);
5382
5383     # Fill indexes.
5384     grep ($extension_map{$_} = $lang->name, @{$lang->extensions});
5385     $languages{$lang->name} = $lang;
5386 }
5387
5388 # This function is used to find a path from a user-specified suffix to
5389 # `o' or to some other suffix we recognize internally, eg `cc'.
5390 sub derive_suffix
5391 {
5392     my ($source_ext) = @_;
5393
5394     # FIXME: hard-coding `o' is a mistake.  Doing something
5395     # intelligent is harder.
5396     while (! $extension_map{$source_ext}
5397            && $source_ext ne 'o'
5398            && defined $suffix_rules{$source_ext})
5399     {
5400         $source_ext = $suffix_rules{$source_ext};
5401     }
5402
5403     return $source_ext;
5404 }
5405
5406
5407 ################################################################
5408
5409 # Pretty-print something.  HEAD is what should be printed at the
5410 # beginning of the first line, FILL is what should be printed at the
5411 # beginning of every subsequent line.
5412 sub pretty_print_internal
5413 {
5414     my ($head, $fill, @values) = @_;
5415
5416     my $column = length ($head);
5417     my $result = $head;
5418
5419     # Fill length is number of characters.  However, each Tab
5420     # character counts for eight.  So we count the number of Tabs and
5421     # multiply by 7.
5422     my $fill_length = length ($fill);
5423     $fill_length += 7 * ($fill =~ tr/\t/\t/d);
5424
5425     foreach (@values)
5426     {
5427         # "71" because we also print a space.
5428         if ($column + length ($_) > 71)
5429         {
5430             $result .= " \\\n" . $fill;
5431             $column = $fill_length;
5432         }
5433         $result .= ' ' if $result =~ /\S\z/;
5434         $result .= $_;
5435         $column += length ($_) + 1;
5436     }
5437
5438     $result .= "\n";
5439     return $result;
5440 }
5441
5442 # Pretty-print something and append to output_vars.
5443 sub pretty_print
5444 {
5445     $output_vars .= &pretty_print_internal (@_);
5446 }
5447
5448 # Pretty-print something and append to output_rules.
5449 sub pretty_print_rule
5450 {
5451     $output_rules .= &pretty_print_internal (@_);
5452 }
5453
5454
5455 ################################################################
5456
5457
5458 # $STRING
5459 # &conditional_string(@COND-STACK)
5460 # --------------------------------
5461 # Build a string which denotes the conditional in @COND-STACK.  Some
5462 # simplifications are done: `TRUE' entries are elided, and any `FALSE'
5463 # entry results in a return of `FALSE'.
5464 sub conditional_string
5465 {
5466   my (@stack) = @_;
5467
5468   if (grep (/^FALSE$/, @stack))
5469     {
5470       return 'FALSE';
5471     }
5472   else
5473     {
5474       return join (' ', uniq sort grep (!/^TRUE$/, @stack));
5475     }
5476 }
5477
5478
5479 # $BOOLEAN
5480 # &conditional_true_when ($COND, $WHEN)
5481 # -------------------------------------
5482 # See if a conditional is true.  Both arguments are conditional
5483 # strings.  This returns true if the first conditional is true when
5484 # the second conditional is true.
5485 # For instance with $COND = `BAR FOO', and $WHEN = `BAR BAZ FOO',
5486 # obviously return 1, and 0 when, for instance, $WHEN = `FOO'.
5487 sub conditional_true_when ($$)
5488 {
5489     my ($cond, $when) = @_;
5490
5491     # Make a hash holding all the values from $WHEN.
5492     my %cond_vals = map { $_ => 1 } split (' ', $when);
5493
5494     # Check each component of $cond, which looks `COND1 COND2'.
5495     foreach my $comp (split (' ', $cond))
5496     {
5497         # TRUE is always true.
5498         next if $comp eq 'TRUE';
5499         return 0 if ! defined $cond_vals{$comp};
5500     }
5501
5502     return 1;
5503 }
5504
5505
5506 # $BOOLEAN
5507 # &conditional_is_redundant ($COND, @WHENS)
5508 # ----------------------------------------
5509 # Determine whether $COND is redundant with respect to @WHENS.
5510 #
5511 # Returns true if $COND is true for any of the conditions in @WHENS.
5512 #
5513 # If there are no @WHENS, then behave as if @WHENS contained a single empty
5514 # condition.
5515 sub conditional_is_redundant ($@)
5516 {
5517     my ($cond, @whens) = @_;
5518
5519     if (@whens == 0)
5520     {
5521         return 1 if conditional_true_when ($cond, "");
5522     }
5523     else
5524     {
5525         foreach my $when (@whens)
5526         {
5527             return 1 if conditional_true_when ($cond, $when);
5528         }
5529     }
5530
5531     return 0;
5532 }
5533
5534
5535 # $NEGATION
5536 # condition_negate ($COND)
5537 # ------------------------
5538 sub condition_negate ($)
5539 {
5540     my ($cond) = @_;
5541
5542     $cond =~ s/TRUE$/TRUEO/;
5543     $cond =~ s/FALSE$/TRUE/;
5544     $cond =~ s/TRUEO$/FALSE/;
5545
5546     return $cond;
5547 }
5548
5549
5550 # Compare condition names.
5551 # Issue them in alphabetical order, foo_TRUE before foo_FALSE.
5552 sub by_condition
5553 {
5554     # Be careful we might be comparing `' or `#'.
5555     $a =~ /^(.*)_(TRUE|FALSE)$/;
5556     my ($aname, $abool) = ($1 || '', $2 || '');
5557     $b =~ /^(.*)_(TRUE|FALSE)$/;
5558     my ($bname, $bbool) = ($1 || '', $2 || '');
5559     return ($aname cmp $bname
5560             # Don't bother with IFs, given that TRUE is after FALSE
5561             # just cmp in the reverse order.
5562             || $bbool cmp $abool
5563             # Just in case...
5564             || $a cmp $b);
5565 }
5566
5567
5568 # &make_condition (@CONDITIONS)
5569 # -----------------------------
5570 # Transform a list of conditions (themselves can be an internal list
5571 # of conditions, e.g., @CONDITIONS = ('cond1 cond2', 'cond3')) into a
5572 # Make conditional (a pattern for AC_SUBST).
5573 # Correctly returns the empty string when there are no conditions.
5574 sub make_condition
5575 {
5576     my $res = conditional_string (@_);
5577
5578     # There are no conditions.
5579     if ($res eq '')
5580       {
5581         # Nothing to do.
5582       }
5583     # It's impossible.
5584     elsif ($res eq 'FALSE')
5585       {
5586         $res = '#';
5587       }
5588     # Build it.
5589     else
5590       {
5591         $res = '@' . $res . '@';
5592         $res =~ s/ /@@/g;
5593       }
5594
5595     return $res;
5596 }
5597
5598
5599
5600 ## ------------------------------ ##
5601 ## Handling the condition stack.  ##
5602 ## ------------------------------ ##
5603
5604
5605 # $COND_STRING
5606 # cond_stack_if ($NEGATE, $COND, $WHERE)
5607 # --------------------------------------
5608 sub cond_stack_if ($$$)
5609 {
5610   my ($negate, $cond, $where) = @_;
5611
5612   file_error ($where, "$cond does not appear in AM_CONDITIONAL")
5613     if ! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/;
5614
5615   $cond = "${cond}_TRUE"
5616     unless $cond =~ /^TRUE|FALSE$/;
5617   $cond = condition_negate ($cond)
5618     if $negate;
5619
5620   push (@cond_stack, $cond);
5621
5622   return conditional_string (@cond_stack);
5623 }
5624
5625
5626 # $COND_STRING
5627 # cond_stack_else ($NEGATE, $COND, $WHERE)
5628 # ----------------------------------------
5629 sub cond_stack_else ($$$)
5630 {
5631   my ($negate, $cond, $where) = @_;
5632
5633   if (! @cond_stack)
5634     {
5635       file_error ($where, "else without if");
5636       return;
5637     }
5638
5639   $cond_stack[$#cond_stack] = condition_negate ($cond_stack[$#cond_stack]);
5640
5641   # If $COND is given, check against it.
5642   if (defined $cond)
5643     {
5644       $cond = "${cond}_TRUE"
5645         unless $cond =~ /^TRUE|FALSE$/;
5646       $cond = condition_negate ($cond)
5647         if $negate;
5648
5649       file_error ($where,
5650                   "else reminder ($negate$cond) incompatible with "
5651                   . "current conditional: $cond_stack[$#cond_stack]")
5652         if $cond_stack[$#cond_stack] ne $cond;
5653     }
5654
5655   return conditional_string (@cond_stack);
5656 }
5657
5658
5659 # $COND_STRING
5660 # cond_stack_endif ($NEGATE, $COND, $WHERE)
5661 # -----------------------------------------
5662 sub cond_stack_endif ($$$)
5663 {
5664   my ($negate, $cond, $where) = @_;
5665   my $old_cond;
5666
5667   if (! @cond_stack)
5668     {
5669       file_error ($where, "endif without if: $negate$cond");
5670       return;
5671     }
5672
5673
5674   # If $COND is given, check against it.
5675   if (defined $cond)
5676     {
5677       $cond = "${cond}_TRUE"
5678         unless $cond =~ /^TRUE|FALSE$/;
5679       $cond = condition_negate ($cond)
5680         if $negate;
5681
5682       file_error ($where,
5683                   "endif reminder ($negate$cond) incompatible with "
5684                   . "current conditional: $cond_stack[$#cond_stack]")
5685         if $cond_stack[$#cond_stack] ne $cond;
5686     }
5687
5688   pop @cond_stack;
5689
5690   return conditional_string (@cond_stack);
5691 }
5692
5693
5694
5695
5696
5697 ## ------------------------ ##
5698 ## Handling the variables.  ##
5699 ## ------------------------ ##
5700
5701
5702 # check_ambiguous_conditional ($VAR, $COND)
5703 # -----------------------------------------
5704 # Check for an ambiguous conditional.  This is called when a variable
5705 # is being defined conditionally.  If we already know about a
5706 # definition that is true under the same conditions, then we have an
5707 # ambiguity.
5708 sub check_ambiguous_conditional ($$)
5709 {
5710     my ($var, $cond) = @_;
5711     foreach my $vcond (keys %{$var_value{$var}})
5712     {
5713        my $message;
5714        if ($vcond eq $cond)
5715        {
5716            $message = "$var multiply defined in condition $cond";
5717        }
5718        elsif (&conditional_true_when ($vcond, $cond))
5719        {
5720          $message = ("$var was already defined in condition $vcond, "
5721                      . "which implies condition $cond");
5722        }
5723        elsif (&conditional_true_when ($cond, $vcond))
5724        {
5725            $message = ("$var was already defined in condition $vcond, "
5726                        . "which is implied by condition $cond");
5727        }
5728        if ($message)
5729        {
5730            macro_error ($var, $message);
5731            macro_dump ($var);
5732        }
5733    }
5734 }
5735
5736
5737 # &macro_define($VAR, $VAR_IS_AM, $TYPE, $COND, $VALUE, $WHERE)
5738 # -------------------------------------------------------------
5739 # The $VAR can go from Automake to user, but not the converse.
5740 sub macro_define ($$$$$$)
5741 {
5742   my ($var, $var_is_am, $type, $cond, $value, $where) = @_;
5743
5744   file_error ($where, "bad macro name `$var'")
5745     if $var !~ /$MACRO_PATTERN/o;
5746
5747   $cond ||= 'TRUE';
5748
5749   # An Automake variable must be consistently defined with the same
5750   # sign by Automake.  A user variable must be set by either `=' or
5751   # `:=', and later promoted to `+='.
5752   if ($var_is_am)
5753     {
5754       if (defined $var_type{$var} && $var_type{$var} ne $type)
5755         {
5756           macro_error ($var,
5757                        ("$var was set with `$var_type{$var}=' "
5758                         . "and is now set with `$type='"));
5759         }
5760     }
5761   else
5762     {
5763       if (!defined $var_type{$var} && $type eq '+')
5764         {
5765           macro_error ($var, "$var must be set with `=' before using `+='");
5766         }
5767     }
5768   $var_type{$var} = $type;
5769
5770   # When adding, since we rewrite, don't try to preserve the
5771   # Automake continuation backslashes.
5772   $value =~ s/\\$//mg
5773     if $type eq '+' && $var_is_am;
5774
5775   # Differentiate the first assignment (including with `+=').
5776   if ($type eq '+' && defined $var_value{$var}{$cond})
5777     {
5778       if (substr ($var_value{$var}{$cond}, -1) eq "\n")
5779         {
5780           # Insert a backslash before a trailing newline.
5781           $var_value{$var}{$cond} =
5782             substr ($var_value{$var}{$cond}, 0, -1) . "\\\n";
5783         }
5784       elsif ($var_value{$var}{$cond})
5785         {
5786           # Insert a separator.
5787           $var_value{$var}{$cond} .= ' ';
5788         }
5789        $var_value{$var}{$cond} .= $value;
5790     }
5791   else
5792     {
5793       # The first assignment to a macro sets its location.  Ideally I
5794       # suppose we would associate line numbers with random bits of text.
5795       # FIXME: We sometimes redefine some variables, but we want to keep
5796       # the original location.  More subs are needed to handle
5797       # properly variables.  Once this done, remove this hack.
5798       $var_location{$var} = $where
5799         unless defined $var_location{$var};
5800
5801       # If Automake tries to override a value specified by the user,
5802       # just don't let it do.
5803       if (defined $var_value{$var}{$cond} && !$var_is_am{$var} && $var_is_am)
5804         {
5805           if ($verbose)
5806             {
5807               print STDERR "$me: refusing to override the user definition of:\n";
5808               macro_dump ($var);
5809               print STDERR "$me: with `$cond' => `$value'\n";
5810             }
5811         }
5812       else
5813         {
5814           # There must be no previous value unless the user is redefining
5815           # an Automake variable or an AC_SUBST variable.
5816           check_ambiguous_conditional ($var, $cond)
5817             unless ($var_is_am{$var} && !$var_is_am
5818                     || exists $configure_vars{$var});
5819
5820           $var_value{$var}{$cond} = $value;
5821         }
5822     }
5823
5824   # An Automake variable can be given to the user, but not the converse.
5825   if (! defined $var_is_am{$var} || !$var_is_am)
5826     {
5827       $var_is_am{$var} = $var_is_am;
5828     }
5829 }
5830
5831
5832 # &variable_delete ($VAR, [@CONDS])
5833 # ---------------------------------
5834 # Forget about $VAR under the conditions @CONDS, or completely if
5835 # @CONDS is empty.
5836 sub variable_delete ($@)
5837 {
5838   my ($var, @conds) = @_;
5839
5840   if (!@conds)
5841     {
5842       delete $var_value{$var};
5843       delete $var_location{$var};
5844       delete $var_is_am{$var};
5845       delete $var_comment{$var};
5846       delete $var_type{$var};
5847     }
5848   else
5849     {
5850       foreach my $cond (@conds)
5851         {
5852           delete $var_value{$var}{$cond};
5853         }
5854     }
5855 }
5856
5857
5858 # &macro_dump ($VAR)
5859 # ------------------
5860 sub macro_dump ($)
5861 {
5862   my ($var) = @_;
5863
5864   if (!exists $var_value{$var})
5865     {
5866       print STDERR "  $var does not exist\n";
5867     }
5868   else
5869     {
5870       my $var_is_am = $var_is_am{$var} ? "Automake" : "User";
5871       my $where = (defined $var_location{$var}
5872                    ? $var_location{$var} : "undefined");
5873       print STDERR "$var_comment{$var}"
5874         if defined $var_comment{$var};
5875       print STDERR "  $var ($var_is_am, where = $where) $var_type{$var}=\n";
5876       print STDERR "  {\n";
5877       foreach my $vcond (sort by_condition keys %{$var_value{$var}})
5878         {
5879           print STDERR "    $vcond => $var_value{$var}{$vcond}\n";
5880         }
5881       print STDERR "  }\n";
5882     }
5883 }
5884
5885
5886 # &macros_dump ()
5887 # ---------------
5888 sub macros_dump ()
5889 {
5890   my ($var) = @_;
5891
5892   print STDERR "%var_value =\n";
5893   print STDERR "{\n";
5894   foreach my $var (sort (keys %var_value))
5895     {
5896       macro_dump ($var);
5897     }
5898   print STDERR "}\n";
5899 }
5900
5901
5902 # $BOOLEAN
5903 # &variable_defined ($VAR, [$COND])
5904 # ---------------------------------
5905 # See if a variable exists.  $VAR is the variable name, and $COND is
5906 # the condition which we should check.  If no condition is given, we
5907 # currently return true if the variable is defined under any
5908 # condition.
5909 sub variable_defined ($$)
5910 {
5911     my ($var, $cond) = @_;
5912
5913     # Unfortunately we can't just check for $var_value{VAR}{COND}
5914     # as this would make perl create $condition{VAR}, which we
5915     # don't want.
5916     if (!exists $var_value{$var})
5917       {
5918         if (defined $targets{$var})
5919           {
5920             macro_error ($var, "`$var' is a target; expected a variable")
5921           }
5922         # The variable is not defined
5923         return 0;
5924       }
5925
5926     if ($cond && !exists $var_value{$var}{$cond})
5927       {
5928         # The variable is not defined for the given condition.
5929         return 0;
5930       }
5931
5932     # Even a var_value examination is good enough for us.  FIXME:
5933     # really should maintain examined status on a per-condition basis.
5934     $content_seen{$var} = 1;
5935     return 1;
5936 }
5937
5938 # Mark a variable as examined.
5939 sub examine_variable
5940 {
5941     my ($var) = @_;
5942     &variable_defined ($var);
5943 }
5944
5945 # Return the set of conditions for which a variable is defined.
5946
5947 # If the variable is not defined conditionally, and is not defined in
5948 # terms of any variables which are defined conditionally, then this
5949 # returns the empty list.
5950
5951 # If the variable is defined conditionally, but is not defined in
5952 # terms of any variables which are defined conditionally, then this
5953 # returns the list of conditions for which the variable is defined.
5954
5955 # If the variable is defined in terms of any variables which are
5956 # defined conditionally, then this returns a full set of permutations
5957 # of the subvariable conditions.  For example, if the variable is
5958 # defined in terms of a variable which is defined for COND_TRUE,
5959 # then this returns both COND_TRUE and COND_FALSE.  This is
5960 # because we will need to define the variable under both conditions.
5961
5962 sub variable_conditions_recursive ($)
5963 {
5964     my ($var) = @_;
5965
5966     %vars_scanned = ();
5967
5968     my @new_conds = variable_conditions_recursive_sub ($var, '');
5969     # Now we want to return all permutations of the subvariable
5970     # conditions.
5971     my %allconds = ();
5972     foreach my $item (@new_conds)
5973     {
5974         foreach (split (' ', $item))
5975         {
5976             s/^(.*)_(TRUE|FALSE)$/$1_TRUE/;
5977             $allconds{$_} = 1;
5978         }
5979     }
5980     @new_conds = variable_conditions_permutations (sort keys %allconds);
5981
5982     my %uniqify;
5983     foreach my $cond (@new_conds)
5984     {
5985         my $reduce = variable_conditions_reduce (split (' ', $cond));
5986         next
5987             if $reduce eq 'FALSE';
5988         $uniqify{$cond} = 1;
5989     }
5990
5991     # Note we cannot just do `return sort keys %uniqify', because this
5992     # function is sometimes used in a scalar context.
5993     my @uniq_list = sort by_condition keys %uniqify;
5994     return @uniq_list;
5995 }
5996
5997 # @CONDS
5998 # variable_conditions ($VAR)
5999 # --------------------------
6000 # Get the list of conditions that a variable is defined with, without
6001 # recursing through the conditions of any subvariables.
6002 # Argument is $VAR: the variable to get the conditions of.
6003 # Returns the list of conditions.
6004 sub variable_conditions ($)
6005 {
6006     my ($var) = @_;
6007     my @conds = keys %{$var_value{$var}};
6008     return sort by_condition @conds;
6009 }
6010
6011
6012 # $BOOLEAN
6013 # &variable_conditionally_defined ($VAR)
6014 # --------------------------------------
6015 sub variable_conditionally_defined ($)
6016 {
6017     my ($var) = @_;
6018     foreach my $cond (variable_conditions_recursive ($var))
6019       {
6020         return 1
6021           unless $cond =~ /^TRUE|FALSE$/;
6022       }
6023     return 0;
6024 }
6025
6026
6027
6028 # &variable_conditions_recursive_sub ($VAR, $PARENT)
6029 # -------------------------------------------------------
6030 # A subroutine of variable_conditions_recursive.  This returns all the
6031 # conditions of $VAR, including those of any sub-variables.
6032 sub variable_conditions_recursive_sub
6033 {
6034     my ($var, $parent) = @_;
6035     my @new_conds = ();
6036
6037     if (defined $vars_scanned{$var})
6038     {
6039         macro_error ($parent, "variable `$var' recursively defined");
6040         return ();
6041     }
6042     $vars_scanned{$var} = 1;
6043
6044     my @this_conds = ();
6045     # Examine every condition under which $VAR is defined.
6046     foreach my $vcond (keys %{$var_value{$var}})
6047     {
6048         push (@this_conds, $vcond);
6049
6050         # If $VAR references some other variable, then compute the
6051         # conditions for that subvariable.
6052         my @subvar_conds = ();
6053         foreach (split (' ', $var_value{$var}{$vcond}))
6054         {
6055             # If a comment seen, just leave.
6056             last if /^#/;
6057
6058             # Handle variable substitutions.
6059             if (/^\$\{(.*)\}$/ || /^\$\((.*)\)$/)
6060             {
6061                 my $varname = $1;
6062                 if ($varname =~ /$SUBST_REF_PATTERN/o)
6063                 {
6064                     $varname = $1;
6065                 }
6066
6067
6068                 # Here we compute all the conditions under which the
6069                 # subvariable is defined.  Then we go through and add
6070                 # $VCOND to each.
6071                 my @svc = variable_conditions_recursive_sub ($varname, $var);
6072                 foreach my $item (@svc)
6073                 {
6074                     my $val = conditional_string ($vcond, split (' ', $item));
6075                     $val ||= 'TRUE';
6076                     push (@subvar_conds, $val);
6077                 }
6078             }
6079         }
6080
6081         # If there are no conditional subvariables, then we want to
6082         # return this condition.  Otherwise, we want to return the
6083         # permutations of the subvariables, taking into account the
6084         # conditions of $VAR.
6085         if (! @subvar_conds)
6086         {
6087             push (@new_conds, $vcond);
6088         }
6089         else
6090         {
6091             push (@new_conds, variable_conditions_reduce (@subvar_conds));
6092         }
6093     }
6094
6095     # Unset our entry in vars_scanned.  We only care about recursive
6096     # definitions.
6097     delete $vars_scanned{$var};
6098
6099     # If we are being called on behalf of another variable, we need to
6100     # return all possible permutations of the conditions.  We have
6101     # already handled everything in @this_conds along with their
6102     # subvariables.  We now need to add any permutations that are not
6103     # in @this_conds.
6104     foreach my $this_cond (@this_conds)
6105     {
6106         my @perms =
6107             variable_conditions_permutations (split (' ', $this_cond));
6108         foreach my $perm (@perms)
6109         {
6110             my $ok = 1;
6111             foreach my $scan (@this_conds)
6112             {
6113                 if (&conditional_true_when ($perm, $scan)
6114                     || &conditional_true_when ($scan, $perm))
6115                 {
6116                     $ok = 0;
6117                     last;
6118                 }
6119             }
6120             next if ! $ok;
6121
6122             # This permutation was not already handled, and is valid
6123             # for the parents.
6124             push (@new_conds, $perm);
6125         }
6126     }
6127
6128     return @new_conds;
6129 }
6130
6131
6132 # Filter a list of conditionals so that only the exclusive ones are
6133 # retained.  For example, if both `COND1_TRUE COND2_TRUE' and
6134 # `COND1_TRUE' are in the list, discard the latter.
6135 # If the list is empty, return TRUE
6136 sub variable_conditions_reduce
6137 {
6138     my (@conds) = @_;
6139     my @ret = ();
6140     my $cond;
6141     while(@conds > 0)
6142     {
6143         $cond = shift(@conds);
6144
6145         # FALSE is absorbent.
6146         if ($cond eq 'FALSE')
6147           {
6148             return ('FALSE');
6149           }
6150         elsif (!conditional_is_redundant ($cond, @ret, @conds))
6151           {
6152             push (@ret, $cond);
6153           }
6154     }
6155
6156     return "TRUE" if @ret == 0;
6157     return @ret;
6158 }
6159
6160 # @CONDS
6161 # invert_conditions (@CONDS)
6162 # --------------------------
6163 # Invert a list of conditionals.  Returns a set of conditionals which
6164 # are never true for any of the input conditionals, and when taken
6165 # together with the input conditionals cover all possible cases.
6166 #
6167 # For example: invert_conditions("A_TRUE B_TRUE", "A_FALSE B_FALSE") will
6168 # return ("A_FALSE B_TRUE", "A_TRUE B_FALSE")
6169 sub invert_conditions
6170 {
6171     my (@conds) = @_;
6172
6173     my @notconds = ();
6174     foreach my $cond (@conds)
6175     {
6176         foreach my $perm (variable_conditions_permutations (split(' ', $cond)))
6177         {
6178             push @notconds, $perm
6179                     if ! conditional_is_redundant ($perm, @conds);
6180         }
6181     }
6182     return variable_conditions_reduce (@notconds);
6183 }
6184
6185 # Return a list of permutations of a conditional string.
6186 sub variable_conditions_permutations
6187 {
6188     my (@comps) = @_;
6189     return ()
6190         if ! @comps;
6191     my $comp = shift (@comps);
6192     return variable_conditions_permutations (@comps)
6193         if $comp eq '';
6194     my $neg = condition_negate ($comp);
6195
6196     my @ret;
6197     foreach my $sub (variable_conditions_permutations (@comps))
6198     {
6199         push (@ret, "$comp $sub");
6200         push (@ret, "$neg $sub");
6201     }
6202     if (! @ret)
6203     {
6204         push (@ret, $comp);
6205         push (@ret, $neg);
6206     }
6207     return @ret;
6208 }
6209
6210
6211 # $BOOL
6212 # &check_variable_defined_unconditionally($VAR, $PARENT)
6213 # ------------------------------------------------------
6214 # Warn if a variable is conditionally defined.  This is called if we
6215 # are using the value of a variable.
6216 sub check_variable_defined_unconditionally ($$)
6217 {
6218     my ($var, $parent) = @_;
6219     foreach my $cond (keys %{$var_value{$var}})
6220     {
6221         next
6222           if $cond =~ /^TRUE|FALSE$/;
6223
6224         if ($parent)
6225         {
6226             macro_error ($parent,
6227                          "warning: automake does not support conditional definition of $var in $parent");
6228         }
6229         else
6230         {
6231             macro_error ($parent,
6232                          "warning: automake does not support $var being defined conditionally");
6233         }
6234     }
6235 }
6236
6237
6238 # Get the TRUE value of a variable, warn if the variable is
6239 # conditionally defined.
6240 sub variable_value
6241 {
6242     my ($var) = @_;
6243     &check_variable_defined_unconditionally ($var);
6244     return $var_value{$var}{'TRUE'};
6245 }
6246
6247
6248 # @VALUES
6249 # &value_to_list ($VAR, $VAL, $COND)
6250 # ----------------------------------
6251 # Convert a variable value to a list, split as whitespace.  This will
6252 # recursively follow $(...) and ${...} inclusions.  It preserves @...@
6253 # substitutions.
6254 #
6255 # If COND is 'all', then all values under all conditions should be
6256 # returned; if COND is a particular condition (all conditions are
6257 # surrounded by @...@) then only the value for that condition should
6258 # be returned; otherwise, warn if VAR is conditionally defined.
6259 # SCANNED is a global hash listing whose keys are all the variables
6260 # already scanned; it is an error to rescan a variable.
6261 sub value_to_list
6262 {
6263     my ($var, $val, $cond) = @_;
6264     my @result;
6265
6266     # Strip backslashes
6267     $val =~ s/\\(\n|$)/ /g;
6268
6269     foreach (split (' ', $val))
6270     {
6271         # If a comment seen, just leave.
6272         last if /^#/;
6273
6274         # Handle variable substitutions.
6275         if (/^\$\{([^}]*)\}$/ || /^\$\(([^)]*)\)$/)
6276         {
6277             my $varname = $1;
6278
6279             # If the user uses a losing variable name, just ignore it.
6280             # This isn't ideal, but people have requested it.
6281             next if ($varname =~ /\@.*\@/);
6282
6283             my ($from, $to);
6284             my @temp_list;
6285             if ($varname =~ /$SUBST_REF_PATTERN/o)
6286             {
6287                 $varname = $1;
6288                 $to = $3;
6289                 ($from = $2) =~ s/(\W)/\\$1/g;
6290             }
6291
6292             # Find the value.
6293             @temp_list = &variable_value_as_list_recursive_worker ($1, $cond, $var);
6294
6295             # Now rewrite the value if appropriate.
6296             if (defined $from)
6297             {
6298                 grep (s/$from$/$to/, @temp_list);
6299             }
6300
6301             push (@result, @temp_list);
6302         }
6303         else
6304         {
6305             push (@result, $_);
6306         }
6307     }
6308
6309     return @result;
6310 }
6311
6312 # @VALUES
6313 # variable_value_as_list ($VAR, $COND, $PARENT)
6314 # ---------------------------------------------
6315 # Get the value of a variable given a specified condition. without
6316 # recursing through any subvariables.
6317 # Arguments are:
6318 #   $VAR    is the variable
6319 #   $COND   is the condition.  If this is not given, the value for the
6320 #           "TRUE" condition will be returned.
6321 #   $PARENT is the variable in which the variable is used: this is used
6322 #           only for error messages.
6323 # Returns the list of conditions.
6324 # For example, if A is defined as "foo $(B) bar", and B is defined as
6325 # "baz", this will return ("foo", "$(B)", "bar")
6326 sub variable_value_as_list
6327 {
6328     my ($var, $cond, $parent) = @_;
6329     my @result;
6330
6331     # Check defined
6332     if (! defined $var_value{$var})
6333     {
6334         if (defined $targets{$var})
6335           {
6336             macro_error ($var, "`$var' is a target; expected a variable");
6337           }
6338         else
6339           {
6340             macro_error ($parent, "variable `$var' not defined");
6341           }
6342     }
6343
6344     # Get value for given condition
6345     $cond ||= 'TRUE';
6346     my $onceflag;
6347     foreach my $vcond (keys %{$var_value{$var}})
6348     {
6349         my $val = $var_value{$var}{$vcond};
6350
6351         if (&conditional_true_when ($vcond, $cond))
6352         {
6353             # Unless variable is not defined conditionally, there should only
6354             # be one value of $vcond true when $cond.
6355             &check_variable_defined_unconditionally ($var, $parent)
6356                     if $onceflag;
6357             $onceflag = 1;
6358
6359             # Strip backslashes
6360             $val =~ s/\\(\n|$)/ /g;
6361
6362             foreach (split (' ', $val))
6363             {
6364                 # If a comment seen, just leave.
6365                 last if /^#/;
6366
6367                 push (@result, $_);
6368             }
6369         }
6370     }
6371
6372     return @result;
6373 }
6374
6375 # Return contents of variable as list, split as whitespace.  This will
6376 # recursively follow $(...) and ${...} inclusions.  It preserves @...@
6377 # substitutions.  If COND is 'all', then all values under all
6378 # conditions should be returned; if COND is a particular condition
6379 # (all conditions are surrounded by @...@) then only the value for
6380 # that condition should be returned; otherwise, warn if VAR is
6381 # conditionally defined.  If PARENT is specified, it is the name of
6382 # the including variable; this is only used for error reports.
6383 sub variable_value_as_list_recursive_worker
6384 {
6385     my ($var, $cond, $parent) = @_;
6386     my @result = ();
6387
6388     if (! defined $var_value{$var})
6389     {
6390         if (defined $targets{$var})
6391           {
6392             macro_error ($var, "`$var' is a target; expected a variable");
6393           }
6394         else
6395           {
6396             macro_error ($parent, "variable `$var' not defined");
6397           }
6398     }
6399     elsif (defined $vars_scanned{$var})
6400     {
6401         # `vars_scanned' is a global we use to keep track of which
6402         # variables we've already examined.
6403         macro_error ($parent, "variable `$var' recursively defined");
6404     }
6405     elsif ($cond eq 'all')
6406     {
6407         $vars_scanned{$var} = 1;
6408         foreach my $vcond (keys %{$var_value{$var}})
6409         {
6410             my $val = $var_value{$var}{$vcond};
6411             push (@result, &value_to_list ($var, $val, $cond));
6412         }
6413     }
6414     else
6415     {
6416         $cond ||= 'TRUE';
6417         $vars_scanned{$var} = 1;
6418         my $onceflag;
6419         foreach my $vcond (keys %{$var_value{$var}})
6420         {
6421             my $val = $var_value{$var}{$vcond};
6422             if (&conditional_true_when ($vcond, $cond))
6423             {
6424                 # Warn if we have an ambiguity.  It's hard to know how
6425                 # to handle this case correctly.
6426                 &check_variable_defined_unconditionally ($var, $parent)
6427                     if $onceflag;
6428                 $onceflag = 1;
6429                 push (@result, &value_to_list ($var, $val, $cond));
6430             }
6431         }
6432     }
6433
6434     # Unset our entry in vars_scanned.  We only care about recursive
6435     # definitions.
6436     delete $vars_scanned{$var};
6437
6438     return @result;
6439 }
6440
6441
6442 # &variable_output ($VAR, [@CONDS])
6443 # ---------------------------------
6444 # Output all the values of $VAR is @COND is not specified, else only
6445 # that corresponding to @COND.
6446 sub variable_output ($@)
6447 {
6448   my ($var, @conds) = @_;
6449
6450   @conds = keys %{$var_value{$var}}
6451     unless @conds;
6452
6453   $output_vars .= $var_comment{$var}
6454     if defined $var_comment{$var};
6455
6456   foreach my $cond (sort by_condition @conds)
6457     {
6458       my $val = $var_value{$var}{$cond};
6459       my $equals = $var_type{$var} eq ':' ? ':=' : '=';
6460       my $output_var = "$var $equals $val";
6461       $output_var =~ s/^/make_condition ($cond)/meg;
6462       $output_vars .= $output_var . "\n";
6463     }
6464 }
6465
6466
6467 # &variable_pretty_output ($VAR, [@CONDS])
6468 # ----------------------------------------
6469 # Likewise, but pretty, i.e., we *split* the values at spaces.   Use only
6470 # with variables holding filenames.
6471 sub variable_pretty_output ($@)
6472 {
6473   my ($var, @conds) = @_;
6474
6475   @conds = keys %{$var_value{$var}}
6476     unless @conds;
6477
6478   $output_vars .= $var_comment{$var}
6479     if defined $var_comment{$var};
6480
6481   foreach my $cond (sort by_condition @conds)
6482     {
6483       my $val = $var_value{$var}{$cond};
6484       my $equals = $var_type{$var} eq ':' ? ':=' : '=';
6485       my $make_condition = make_condition ($cond);
6486       $output_vars .= pretty_print_internal ("$make_condition$var $equals",
6487                                              "$make_condition\t",
6488                                              split (' ' , $val));
6489     }
6490 }
6491
6492
6493 # This is just a wrapper for variable_value_as_list_recursive_worker that
6494 # initializes the global hash `vars_scanned'.  This hash is used to
6495 # avoid infinite recursion.
6496 sub variable_value_as_list_recursive
6497 {
6498     my ($var, $cond, $parent) = @_;
6499     %vars_scanned = ();
6500     return &variable_value_as_list_recursive_worker ($var, $cond, $parent);
6501 }
6502
6503
6504 # Like define_variable, but the value is a list, and the variable may
6505 # be defined conditionally.  The second argument is the conditional
6506 # under which the value should be defined; this should be the empty
6507 # string to define the variable unconditionally.  The third argument
6508 # is a list holding the values to use for the variable.  The value is
6509 # pretty printed in the output file.
6510 sub define_pretty_variable
6511 {
6512     my ($var, $cond, @value) = @_;
6513
6514     # Beware that an empty $cond has a different semantics for
6515     # macro_define and variable_pretty_output.
6516     $cond ||= 'TRUE';
6517
6518     if (! &variable_defined ($var, $cond))
6519     {
6520         macro_define ($var, 1, '', $cond, join (' ', @value), undef);
6521         variable_pretty_output ($var, $cond || 'TRUE');
6522         $content_seen{$var} = 1;
6523     }
6524 }
6525
6526
6527 # define_variable ($VAR, $VALUE)
6528 # ------------------------------
6529 # Define a new user variable VAR to VALUE, but only if not already defined.
6530 sub define_variable
6531 {
6532     my ($var, $value) = @_;
6533
6534     define_pretty_variable ($var, 'TRUE', $value);
6535 }
6536
6537
6538 # Like define_variable, but define a variable to be the configure
6539 # substitution by the same name.
6540 sub define_configure_variable
6541 {
6542     my ($var) = @_;
6543     my $value = '@' . $var . '@';
6544     &define_variable ($var, $value);
6545 }
6546
6547
6548 # define_compiler_variable ($LANG)
6549 # --------------------------------
6550 # Define a compiler variable.  We also handle defining the `LT'
6551 # version of the command when using libtool.
6552 sub define_compiler_variable ($)
6553 {
6554     my ($lang) = @_;
6555
6556     my ($var, $value) = ($lang->compiler, $lang->compile);
6557     &define_variable ($var, $value);
6558     &define_variable ("LT$var", "\$(LIBTOOL) --mode=compile $value")
6559       if $seen_libtool;
6560 }
6561
6562
6563 # define_linker_variable ($LANG)
6564 # ------------------------------
6565 # Define linker variables.
6566 sub define_linker_variable ($)
6567 {
6568     my ($lang) = @_;
6569
6570     my ($var, $value) = ($lang->lder, $lang->ld);
6571     # CCLD = $(CC).
6572     &define_variable ($lang->lder, $lang->ld);
6573     # CCLINK = $(CCLD) blah blah...
6574     &define_variable ($lang->linker,
6575                       (($seen_libtool ? '$(LIBTOOL) --mode=link ' : '')
6576                        . $lang->link));
6577 }
6578
6579 ################################################################
6580
6581 ## ---------------- ##
6582 ## Handling rules.  ##
6583 ## ---------------- ##
6584
6585 # $BOOL
6586 # rule_define ($TARGET, $IS_AM, $COND, $WHERE)
6587 # --------------------------------------------
6588 # Define a new rule.  $TARGET is the rule name.  $IS_AM is a boolean
6589 # which is true if the new rule is defined by the user.  $COND is the
6590 # condition under which the rule is defined.  $WHERE is where the rule
6591 # is defined (file name or line number).  Returns true if it is ok to
6592 # define the rule, false otherwise.
6593 sub rule_define ($$$$)
6594 {
6595   my ($target, $rule_is_am, $cond, $where) = @_;
6596
6597   # For now `foo:' will override `foo$(EXEEXT):'.  This is temporary,
6598   # though, so we emit a warning.
6599   (my $noexe = $target) =~ s,\$\(EXEEXT\)$,,;
6600   if ($noexe ne $target && defined $targets{$noexe})
6601   {
6602       # The no-exeext option enables this feature.
6603       if (! defined $options{'no-exeext'})
6604       {
6605           macro_error ($noexe,
6606                        "deprecated feature: `$noexe' overrides `$noexe\$(EXEEXT)'\nchange your target to read `$noexe\$(EXEEXT)'");
6607       }
6608       # Don't define.
6609       return 0;
6610   }
6611
6612   if (defined $targets{$target}
6613       && ($cond
6614           ? ! defined $target_conditional{$target}
6615           : defined $target_conditional{$target}))
6616   {
6617       target_error ($target,
6618                     "$target defined both conditionally and unconditionally");
6619   }
6620
6621   # Value here doesn't matter; for targets we only note existence.
6622   $targets{$target} = $where;
6623   if ($cond)
6624   {
6625       if ($target_conditional{$target})
6626       {
6627           &check_ambiguous_conditional ($target, $cond);
6628       }
6629       $target_conditional{$target}{$cond} = $where;
6630   }
6631
6632
6633   # Check the rule for being a suffix rule. If so, store in a hash.
6634
6635   if ((my ($source_suffix, $object_suffix)) = ($target =~ $SUFFIX_RULE_PATTERN))
6636   {
6637       $suffix_rules{$source_suffix} = $object_suffix;
6638       verbose "Sources ending in .$source_suffix become .$object_suffix";
6639       # Set SUFFIXES from suffix_rules.
6640       push @suffixes, ".$source_suffix", ".$object_suffix";
6641   }
6642
6643   return 1;
6644 }
6645
6646
6647 # See if a target exists.
6648 sub target_defined
6649 {
6650     my ($target) = @_;
6651     return defined $targets{$target};
6652 }
6653
6654
6655 ################################################################
6656
6657 # &read_am_file ($AMFILE)
6658 # -----------------------
6659 # Read Makefile.am and set up %contents.  Simultaneously copy lines
6660 # from Makefile.am into $output_trailer or $output_vars as
6661 # appropriate.  NOTE we put rules in the trailer section.  We want
6662 # user rules to come after our generated stuff.
6663 sub read_am_file ($)
6664 {
6665     my ($amfile) = @_;
6666
6667     my $am_file = new Automake::XFile ("< $amfile");
6668     verbose "reading $amfile";
6669
6670     my $spacing = '';
6671     my $comment = '';
6672     my $blank = 0;
6673
6674     while ($_ = $am_file->getline)
6675     {
6676         if (/$IGNORE_PATTERN/o)
6677         {
6678             # Merely delete comments beginning with two hashes.
6679         }
6680         elsif (/$WHITE_PATTERN/o)
6681         {
6682             # Stick a single white line before the incoming macro or rule.
6683             $spacing = "\n";
6684             $blank = 1;
6685         }
6686         elsif (/$COMMENT_PATTERN/o)
6687         {
6688             # Stick comments before the incoming macro or rule.  Make
6689             # sure a blank line preceeds first block of comments.
6690             $spacing = "\n" unless $blank;
6691             $blank = 1;
6692             $comment .= $spacing . $_;
6693             $spacing = '';
6694         }
6695         else
6696         {
6697             last;
6698         }
6699     }
6700
6701     $output_vars .= $comment . "\n";
6702     $comment = '';
6703     $spacing = "\n";
6704
6705     # We save the conditional stack on entry, and then check to make
6706     # sure it is the same on exit.  This lets us conditonally include
6707     # other files.
6708     my @saved_cond_stack = @cond_stack;
6709     my $cond = conditional_string (@cond_stack);
6710
6711     my $saw_bk = 0;
6712     my $was_rule = 0;
6713     my $last_var_name = '';
6714     my $last_var_type = '';
6715     my $last_var_value = '';
6716     # FIXME: shouldn't use $_ in this loop; it is too big.
6717     while ($_)
6718     {
6719         my $here = "$amfile:$.";
6720
6721         $_ .= "\n"
6722             unless substr ($_, -1, 1) eq "\n";
6723
6724         # Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
6725         # used by users.  @MAINT@ is an anachronism now.
6726         $_ =~ s/\@MAINT\@//g
6727             unless $seen_maint_mode;
6728
6729         my $new_saw_bk = /\\$/ && ! /$COMMENT_PATTERN/o;
6730
6731         if (/$IGNORE_PATTERN/o)
6732         {
6733             # Merely delete comments beginning with two hashes.
6734         }
6735         elsif (/$WHITE_PATTERN/o)
6736         {
6737             # Stick a single white line before the incoming macro or rule.
6738             $spacing = "\n";
6739             file_error ($here, "blank line following trailing backslash")
6740                 if $saw_bk;
6741         }
6742         elsif (/$COMMENT_PATTERN/o)
6743         {
6744             # Stick comments before the incoming macro or rule.
6745             $comment .= $spacing . $_;
6746             $spacing = '';
6747             file_error ($here, "comment following trailing backslash")
6748                 if $saw_bk;
6749         }
6750         elsif ($saw_bk)
6751         {
6752             if ($was_rule)
6753             {
6754                 $output_trailer .= &make_condition (@cond_stack);
6755                 $output_trailer .= $_;
6756             }
6757             else
6758             {
6759               $last_var_value .= ' '
6760                 unless $last_var_value =~ /\s$/;
6761               $last_var_value .= $_;
6762
6763               if (!/\\$/)
6764                 {
6765                   $var_comment{$last_var_name} .= "$spacing"
6766                     if (!defined $var_comment{$last_var_name}
6767                         || substr ($var_comment{$last_var_name}, -1) ne "\n");
6768                   $var_comment{$last_var_name} .= "$comment";
6769                   $comment = $spacing = '';
6770                   macro_define ($last_var_name, 0,
6771                                 $last_var_type, $cond,
6772                                 $last_var_value, $here)
6773                     if $cond ne 'FALSE';
6774                   push (@var_list, $last_var_name);
6775                 }
6776             }
6777         }
6778
6779         elsif (/$IF_PATTERN/o)
6780           {
6781             $cond = cond_stack_if ($1, $2, $here);
6782           }
6783         elsif (/$ELSE_PATTERN/o)
6784           {
6785             $cond = cond_stack_else ($1, $2, $here);
6786           }
6787         elsif (/$ENDIF_PATTERN/o)
6788           {
6789             $cond = cond_stack_endif ($1, $2, $here);
6790           }
6791
6792         elsif (/$RULE_PATTERN/o)
6793         {
6794             # Found a rule.
6795             $was_rule = 1;
6796
6797             rule_define ($1, 0, $cond, $here);
6798
6799             $output_trailer .= $comment . $spacing;
6800             $output_trailer .= &make_condition (@cond_stack);
6801             $output_trailer .= $_;
6802             $comment = $spacing = '';
6803         }
6804         elsif (/$ASSIGNMENT_PATTERN/o)
6805         {
6806             # Found a macro definition.
6807             $was_rule = 0;
6808             $last_var_name = $1;
6809             $last_var_type = $2;
6810             $last_var_value = $3;
6811             if ($3 ne '' && substr ($3, -1) eq "\\")
6812             {
6813                 # We preserve the `\' because otherwise the long lines
6814                 # that are generated will be truncated by broken
6815                 # `sed's.
6816                 $last_var_value = $3 . "\n";
6817             }
6818
6819             if (!/\\$/)
6820               {
6821                 # FIXME: this doesn't always work correctly; it will
6822                 # group all comments for a given variable, no matter
6823                 # where defined.
6824                 # Accumulating variables must not be output.
6825                 $var_comment{$last_var_name} .= "$spacing"
6826                   if (!defined $var_comment{$last_var_name}
6827                       || substr ($var_comment{$last_var_name}, -1) ne "\n");
6828                 $var_comment{$last_var_name} .= "$comment";
6829                 $comment = $spacing = '';
6830
6831                 macro_define ($last_var_name, 0,
6832                               $last_var_type, $cond,
6833                               $last_var_value, $here)
6834                   if $cond ne 'FALSE';
6835                 push (@var_list, $last_var_name);
6836               }
6837         }
6838         elsif (/$INCLUDE_PATTERN/o)
6839         {
6840             my $path = $1;
6841
6842             if ($path =~ s/^\$\(top_srcdir\)\///)
6843             {
6844                 push (@include_stack, "\$\(top_srcdir\)/$path");
6845             }
6846             else
6847             {
6848                 $path =~ s/\$\(srcdir\)\///;
6849                 push (@include_stack, "\$\(srcdir\)/$path");
6850                 $path = $relative_dir . "/" . $path;
6851             }
6852             &read_am_file ($path);
6853         }
6854         else
6855         {
6856             # This isn't an error; it is probably a continued rule.
6857             # In fact, this is what we assume.
6858             $was_rule = 1;
6859             $output_trailer .= $comment . $spacing;
6860             $output_trailer .= &make_condition  (@cond_stack);
6861             $output_trailer .= $_;
6862             $comment = $spacing = '';
6863             file_error ($here, "`#' comment at start of rule is unportable")
6864                 if $_ =~ /^\t\s*\#/;
6865         }
6866
6867         $saw_bk = $new_saw_bk;
6868         $_ = $am_file->getline;
6869     }
6870
6871     $output_trailer .= $comment;
6872
6873     if (join (' ', @saved_cond_stack) ne join (' ', @cond_stack))
6874     {
6875         if (@cond_stack)
6876         {
6877             &am_error ("unterminated conditionals: @cond_stack");
6878         }
6879         else
6880         {
6881             # FIXME: better error message here.
6882             &am_error ("conditionals not nested in include file");
6883         }
6884     }
6885 }
6886
6887
6888 # define_standard_variables ()
6889 # ----------------------------
6890 # A helper for read_main_am_file which initializes configure variables
6891 # and variables from header-vars.am.  This is a subr so we can call it
6892 # twice.
6893 sub define_standard_variables
6894 {
6895     my $saved_output_vars = $output_vars;
6896     my ($comments, undef, $rules) =
6897       file_contents_internal (1, "$libdir/am/header-vars.am");
6898
6899     # This will output the definitions in $output_vars, which we don't
6900     # want...
6901     foreach my $var (sort keys %configure_vars)
6902     {
6903         &define_configure_variable ($var);
6904         push (@var_list, $var);
6905     }
6906
6907     # ... hence, we restore $output_vars.
6908     $output_vars = $saved_output_vars . $comments . $rules;
6909 }
6910
6911 # Read main am file.
6912 sub read_main_am_file
6913 {
6914     my ($amfile) = @_;
6915
6916     # This supports the strange variable tricks we are about to play.
6917     if (scalar keys %var_value > 0)
6918       {
6919         macros_dump ();
6920         &prog_error ("variable defined before read_main_am_file");
6921       }
6922
6923     # Generate copyright header for generated Makefile.in.
6924     # We do discard the output of predefined variables, handled below.
6925     $output_vars = ("# $in_file_name generated by automake "
6926                    . $VERSION . " from $am_file_name.\n");
6927     $output_vars .= '# ' . subst ('configure_input') . "\n";
6928     $output_vars .= $gen_copyright;
6929
6930     # We want to predefine as many variables as possible.  This lets
6931     # the user set them with `+=' in Makefile.am.  However, we don't
6932     # want these initial definitions to end up in the output quite
6933     # yet.  So we just load them, but output them later.
6934     &define_standard_variables;
6935
6936     # Read user file, which might override some of our values.
6937     &read_am_file ($amfile);
6938
6939     # Ouput all the Automake variables.  If the user changed one, then
6940     # it is now marked as owned by the user.
6941     foreach my $var (uniq @var_list)
6942     {
6943         # Don't process user variables.
6944         variable_output ($var)
6945           unless !$var_is_am{$var};
6946     }
6947
6948     # Now dump the user variables that were defined.  We do it in the same
6949     # order in which they were defined (skipping duplicates).
6950     foreach my $var (uniq @var_list)
6951     {
6952         # Don't process Automake variables.
6953         variable_output ($var)
6954           unless $var_is_am{$var};
6955     }
6956 }
6957
6958 ################################################################
6959
6960 # $FLATTENED
6961 # &flatten ($STRING)
6962 # ------------------
6963 # Flatten the $STRING and return the result.
6964 sub flatten
6965 {
6966   $_ = shift;
6967
6968   s/\\\n//somg;
6969   s/\s+/ /g;
6970   s/^ //;
6971   s/ $//;
6972
6973   return $_;
6974 }
6975
6976
6977 # @PARAGRAPHS
6978 # &make_paragraphs ($MAKEFILE, [%TRANSFORM])
6979 # ------------------------------------------
6980 # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
6981 # paragraphs.
6982 sub make_paragraphs ($%)
6983 {
6984     my ($file, %transform) = @_;
6985
6986     # Complete %transform with global options and make it a Perl
6987     # $command.
6988     my $command =
6989       "s/$IGNORE_PATTERN//gm;"
6990         . transform (%transform,
6991
6992                      'CYGNUS'          => $cygnus_mode,
6993                      'MAINTAINER-MODE'
6994                      => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',
6995
6996                      'SHAR'        => $options{'dist-shar'} || 0,
6997                      'BZIP2'       => $options{'dist-bzip2'} || 0,
6998                      'ZIP'         => $options{'dist-zip'} || 0,
6999                      'COMPRESS'    => $options{'dist-tarZ'} || 0,
7000
7001                      'INSTALL-INFO' => !$options{'no-installinfo'},
7002                      'INSTALL-MAN'  => !$options{'no-installman'},
7003                      'CK-NEWS'      => $options{'check-news'} || 0,
7004
7005                      'SUBDIRS'      => &variable_defined ('SUBDIRS'),
7006                      'TOPDIR'       => backname ($relative_dir),
7007                      'TOPDIR_P'     => $relative_dir eq '.',
7008                      'CONFIGURE-AC' => $configure_ac,
7009
7010                      'BUILD'    => $seen_canonical == $AC_CANONICAL_SYSTEM,
7011                      'HOST'     => $seen_canonical,
7012                      'TARGET'   => $seen_canonical == $AC_CANONICAL_SYSTEM,
7013
7014                      'LIBTOOL'      => defined $configure_vars{'LIBTOOL'})
7015           # We don't need more than two consecutive new-lines.
7016           . 's/\n{3,}/\n\n/g';
7017
7018     # Swallow the file and apply the COMMAND.
7019     my $fc_file = new Automake::XFile "< $file";
7020     # Looks stupid?
7021     verbose "reading $file";
7022     my $saved_dollar_slash = $/;
7023     undef $/;
7024     $_ = $fc_file->getline;
7025     $/ = $saved_dollar_slash;
7026     eval $command;
7027     $fc_file->close;
7028     my $content = $_;
7029
7030     # Split at unescaped new lines.
7031     my @lines = split (/(?<!\\)\n/, $content);
7032     my @res;
7033
7034     while (defined ($_ = shift @lines))
7035       {
7036         my $paragraph = "$_";
7037         # If we are a rule, eat as long as we start with a tab.
7038         if (/$RULE_PATTERN/smo)
7039           {
7040             while (defined ($_ = shift @lines) && $_ =~ /^\t/)
7041               {
7042                 $paragraph .= "\n$_";
7043               }
7044             unshift (@lines, $_);
7045           }
7046
7047         # If we are a comments, eat as much comments as you can.
7048         elsif (/$COMMENT_PATTERN/smo)
7049           {
7050             while (defined ($_ = shift @lines)
7051                    && $_ =~ /$COMMENT_PATTERN/smo)
7052               {
7053                 $paragraph .= "\n$_";
7054               }
7055             unshift (@lines, $_);
7056           }
7057
7058         push @res, $paragraph;
7059         $paragraph = '';
7060       }
7061
7062     return @res;
7063 }
7064
7065
7066
7067 # ($COMMENT, $VARIABLES, $RULES)
7068 # &file_contents_internal ($IS_AM, $FILE, [%TRANSFORM])
7069 # -----------------------------------------------------
7070 # Return contents of a file from $libdir/am, automatically skipping
7071 # macros or rules which are already known. $IS_AM iff the caller is
7072 # reading an Automake file (as opposed to the user's Makefile.am).
7073 sub file_contents_internal ($$%)
7074 {
7075     my ($is_am, $file, %transform) = @_;
7076
7077     my $result_vars = '';
7078     my $result_rules = '';
7079     my $comment = '';
7080     my $spacing = '';
7081
7082     # We save the conditional stack on entry, and then check to make
7083     # sure it is the same on exit.  This lets us conditonally include
7084     # other files.
7085     my @saved_cond_stack = @cond_stack;
7086     my $cond = conditional_string (@cond_stack);
7087
7088     foreach (make_paragraphs ($file, %transform))
7089     {
7090         # Sanity checks.
7091         file_error ($file, "blank line following trailing backslash:\n$_")
7092           if /\\$/;
7093         file_error ($file, "comment following trailing backslash:\n$_")
7094           if /\\#/;
7095
7096         if (/^$/)
7097         {
7098             # Stick empty line before the incoming macro or rule.
7099             $spacing = "\n";
7100         }
7101         elsif (/$COMMENT_PATTERN/mso)
7102         {
7103             # Stick comments before the incoming macro or rule.
7104             $comment = "$_\n";
7105         }
7106
7107         # Handle inclusion of other files.
7108         elsif (/$INCLUDE_PATTERN/o)
7109         {
7110             if ($cond ne 'FALSE')
7111               {
7112                 my $file = ($is_am ? "$libdir/am/" : '') . $1;
7113                 # N-ary `.=' fails.
7114                 my ($com, $vars, $rules)
7115                   = file_contents_internal ($is_am, $file, %transform);
7116                 $comment .= $com;
7117                 $result_vars .= $vars;
7118                 $result_rules .= $rules;
7119               }
7120         }
7121
7122         # Handling the conditionals.
7123         elsif (/$IF_PATTERN/o)
7124           {
7125             $cond = cond_stack_if ($1, $2, $file);
7126           }
7127         elsif (/$ELSE_PATTERN/o)
7128           {
7129             $cond = cond_stack_else ($1, $2, $file);
7130           }
7131         elsif (/$ENDIF_PATTERN/o)
7132           {
7133             $cond = cond_stack_endif ($1, $2, $file);
7134           }
7135
7136         # Handling rules.
7137         elsif (/$RULE_PATTERN/mso)
7138         {
7139           # Separate relationship from optional actions: the first
7140           # `new-line tab" not preceded by backslash (continuation
7141           # line).
7142           # I'm quite shoked!  It seems that (\\\n|[^\n]) is not the
7143           # same as `([^\n]|\\\n)!!!  Don't swap it, it breaks.
7144           my $paragraph = $_;
7145           /^((?:\\\n|[^\n])*)(?:\n(\t.*))?$/som;
7146           my ($relationship, $actions) = ($1, $2 || '');
7147
7148           # Separate targets from dependencies: the first colon.
7149           $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
7150           my ($targets, $dependencies) = ($1, $2);
7151           # Remove the escaped new lines.
7152           # I don't know why, but I have to use a tmp $flat_deps.
7153           my $flat_deps = &flatten ($dependencies);
7154           my @deps = split (' ', $flat_deps);
7155
7156           foreach (split (' ' , $targets))
7157             {
7158               # FIXME: We are not robust to people defining several targets
7159               # at once, only some of them being in %dependencies.
7160
7161               # Output only if not in FALSE.
7162               if (defined $dependencies{$_}
7163                   && $cond ne 'FALSE')
7164                 {
7165                   &depend ($_, @deps);
7166                   $actions{$_} .= $actions;
7167                 }
7168               else
7169                 {
7170                   # Free-lance dependency.  Output the rule for all the
7171                   # targets instead of one by one.
7172
7173                   # Work out all the conditions for which the target hasn't
7174                   # been defined
7175                   my @undefined_conds;
7176                   if (defined $target_conditional{$targets})
7177                     {
7178                       my @defined_conds = keys %{$target_conditional{$targets}};
7179                       @undefined_conds = invert_conditions(@defined_conds);
7180                     }
7181                   else
7182                     {
7183                       if (defined $targets{$targets})
7184                         {
7185                           # No conditions for which target hasn't been defined
7186                           @undefined_conds = ();
7187                         }
7188                       else
7189                         {
7190                           # Target hasn't been defined for any conditions
7191                           @undefined_conds = ("");
7192                         }
7193                     }
7194
7195                   if ($cond ne 'FALSE')
7196                     {
7197                       my $undefined_cond;
7198                       for $undefined_cond (@undefined_conds)
7199                       {
7200                           my $condparagraph = $paragraph;
7201                           $condparagraph =~ s/^/make_condition (@cond_stack, $undefined_cond)/gme;
7202                           $result_rules .= "$spacing$comment$condparagraph\n"
7203                               if rule_define ($targets, $is_am,
7204                                               "$cond $undefined_cond", $file);
7205                       }
7206                     }
7207                   $comment = $spacing = '';
7208                   last;
7209                 }
7210             }
7211         }
7212
7213         elsif (/$ASSIGNMENT_PATTERN/mso)
7214         {
7215             my ($var, $type, $val) = ($1, $2, $3);
7216             file_error ($file, "macro `$var' with trailing backslash")
7217               if /\\$/;
7218
7219             # Accumulating variables must not be output.
7220             $var_comment{$var} .= "$spacing"
7221               if (!defined $var_comment{$var}
7222                   || substr ($var_comment{$var}, -1) ne "\n");
7223             $var_comment{$var} .= "$comment";
7224             macro_define ($var, $is_am, $type, $cond, $val, $file)
7225               if $cond ne 'FALSE';
7226             push (@var_list, $var);
7227
7228             # If the user has set some variables we were in charge
7229             # of (which is detected by the first reading of
7230             # `header-vars.am'), we must not output them.
7231             $result_vars .= "$spacing$comment$_\n"
7232               if $type ne '+' && $var_is_am{$var} && $cond ne 'FALSE';
7233
7234             $comment = $spacing = '';
7235         }
7236         else
7237         {
7238             # This isn't an error; it is probably some tokens which
7239             # configure is supposed to replace, such as `@SET-MAKE@',
7240             # or some part of a rule cut by an if/endif.
7241             if ($cond ne 'FALSE')
7242               {
7243                 s/^/make_condition (@cond_stack)/gme;
7244                 $result_rules .= "$spacing$comment$_\n";
7245               }
7246             $comment = $spacing = '';
7247         }
7248     }
7249
7250     if (join (' ', @saved_cond_stack) ne join (' ', @cond_stack))
7251     {
7252         if (@cond_stack)
7253         {
7254             &am_error ("unterminated conditionals: @cond_stack");
7255         }
7256         else
7257         {
7258             # FIXME: better error message here.
7259             &am_error ("conditionals not nested in include file");
7260         }
7261     }
7262
7263     return ($comment, $result_vars, $result_rules);
7264 }
7265
7266
7267 # $CONTENTS
7268 # &file_contents ($BASENAME, [%TRANSFORM])
7269 # ----------------------------------------
7270 # Return contents of a file from $libdir/am, automatically skipping
7271 # macros or rules which are already known.
7272 sub file_contents ($%)
7273 {
7274     my ($basename, %transform) = @_;
7275     my ($comments, $variables, $rules) =
7276       file_contents_internal (1, "$libdir/am/$basename.am", %transform);
7277     return "$comments$variables$rules";
7278 }
7279
7280
7281 # $REGEXP
7282 # &transform (%PAIRS)
7283 # -------------------
7284 # Foreach ($TOKEN, $VAL) in %PAIRS produce a replacement expression suitable
7285 # for file_contents which:
7286 #   - replaces @$TOKEN@ with $VALUE,
7287 #   - enables/disables ?$TOKEN?.
7288 sub transform (%)
7289 {
7290     my (%pairs) = @_;
7291     my $result = '';
7292
7293     while (my ($token, $val) = each %pairs)
7294     {
7295         $result .= "s/\Q%$token%\E/\Q$val\E/gm;";
7296         if ($val)
7297         {
7298             $result .= "s/\Q?$token?\E//gm;s/^.*\Q?!$token?\E.*\\n//gm;";
7299             $result .= "s/\Q%?$token%\E/TRUE/gm;";
7300         }
7301         else
7302         {
7303             $result .= "s/\Q?!$token?\E//gm;s/^.*\Q?$token?\E.*\\n//gm;";
7304             $result .= "s/\Q%?$token%\E/FALSE/gm;";
7305         }
7306     }
7307
7308     return $result;
7309 }
7310
7311
7312 # Find all variable prefixes that are used for install directories.  A
7313 # prefix `zar' qualifies iff:
7314 # * `zardir' is a variable.
7315 # * `zar_PRIMARY' is a variable.
7316 sub am_primary_prefixes
7317 {
7318     my ($primary, $can_dist, @prefixes) = @_;
7319
7320     my %valid = map { $_ => 0 } @prefixes;
7321     $valid{'EXTRA'} = 0;
7322     foreach my $varname (keys %var_value)
7323     {
7324         # Automake is allowed to define variables that look like they
7325         # are magic variables, such as INSTALL_DATA.
7326         next
7327           if $var_is_am{$varname};
7328
7329         if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_$primary$/)
7330         {
7331             my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
7332             if ($dist ne '' && ! $can_dist)
7333             {
7334                 # Note that a configure variable is always legitimate.
7335                 # It is natural to name such variables after the
7336                 # primary, so we explicitly allow it.
7337                 if (! defined $configure_vars{$varname})
7338                 {
7339                     line_error ($varname,
7340                                 "invalid variable `$varname': `dist' is forbidden");
7341                 }
7342             }
7343             elsif (! defined $valid{$X} && ! &variable_defined ("${X}dir"))
7344             {
7345                 # Note that a configure variable is always legitimate.
7346                 # It is natural to name such variables after the
7347                 # primary, so we explicitly allow it.
7348                 if (! defined $configure_vars{$varname})
7349                 {
7350                     line_error ($varname,
7351                                 "invalid variable `$varname'");
7352                 }
7353             }
7354             else
7355             {
7356                 # Ensure all extended prefixes are actually used.
7357                 $valid{"$base$dist$X"} = 1;
7358             }
7359         }
7360     }
7361
7362     return %valid;
7363 }
7364
7365 # Handle `where_HOW' variable magic.  Does all lookups, generates
7366 # install code, and possibly generates code to define the primary
7367 # variable.  The first argument is the name of the .am file to munge,
7368 # the second argument is the primary variable (eg HEADERS), and all
7369 # subsequent arguments are possible installation locations.  Returns
7370 # list of all values of all _HOW targets.
7371 #
7372 # FIXME: this should be rewritten to be cleaner.  It should be broken
7373 # up into multiple functions.
7374 #
7375 # Usage is: am_install_var (OPTION..., file, HOW, where...)
7376 sub am_install_var
7377 {
7378     my (@args) = @_;
7379
7380     my $do_require = 1;
7381     my $can_dist = 0;
7382     my $default_dist = 0;
7383     while (@args)
7384     {
7385         if ($args[0] eq '-noextra')
7386         {
7387             $do_require = 0;
7388         }
7389         elsif ($args[0] eq '-candist')
7390         {
7391             $can_dist = 1;
7392         }
7393         elsif ($args[0] eq '-defaultdist')
7394         {
7395             $default_dist = 1;
7396             $can_dist = 1;
7397         }
7398         elsif ($args[0] !~ /^-/)
7399         {
7400             last;
7401         }
7402         shift (@args);
7403     }
7404
7405     my ($file, $primary, @prefixes) = @args;
7406
7407     # Now that configure substitutions are allowed in where_HOW
7408     # variables, it is an error to actually define the primary.  We
7409     # allow `JAVA', as it is customarily used to mean the Java
7410     # interpreter.  This is but one of several Java hacks.  Similarly,
7411     # `PYTHON' is customarily used to mean the Python interpreter.
7412     macro_error ($primary, "`$primary' is an anachronism")
7413         if &variable_defined ($primary)
7414             && ($primary ne 'JAVA' && $primary ne 'PYTHON');
7415
7416
7417     # Look for misspellings.  It is an error to have a variable ending
7418     # in a "reserved" suffix whose prefix is unknown, eg
7419     # "bni_PROGRAMS".  However, unusual prefixes are allowed if a
7420     # variable of the same name (with "dir" appended) exists.  For
7421     # instance, if the variable "zardir" is defined, then
7422     # "zar_PROGRAMS" becomes valid.  This is to provide a little extra
7423     # flexibility in those cases which need it.
7424     my %valid = &am_primary_prefixes ($primary, $can_dist, @prefixes);
7425
7426     # If a primary includes a configure substitution, then the EXTRA_
7427     # form is required.  Otherwise we can't properly do our job.
7428     my $require_extra;
7429     my $warned_about_extra = 0;
7430
7431     my @used = ();
7432     my @result = ();
7433
7434     # True if the iteration is the first one.  Used for instance to
7435     # output parts of the associated file only once.
7436     my $first = 1;
7437     foreach my $X (sort keys %valid)
7438     {
7439         my $nodir_name = $X;
7440         my $one_name = $X . '_' . $primary;
7441         next
7442           unless (&variable_defined ($one_name));
7443
7444         my $strip_subdir = 1;
7445         # If subdir prefix should be preserved, do so.
7446         if ($nodir_name =~ /^nobase_/)
7447           {
7448             $strip_subdir = 0;
7449             $nodir_name =~ s/^nobase_//;
7450           }
7451
7452         # If files should be distributed, do so.
7453         my $dist_p = 0;
7454         if ($can_dist)
7455           {
7456             $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
7457                        || (! $default_dist && $nodir_name =~ /^dist_/));
7458             $nodir_name =~ s/^(dist|nodist)_//;
7459           }
7460
7461         # Append actual contents of where_PRIMARY variable to
7462         # result.
7463         foreach my $rcurs (&variable_value_as_list_recursive ($one_name, 'all'))
7464           {
7465             # Skip configure substitutions.  Possibly bogus.
7466             if ($rcurs =~ /^\@.*\@$/)
7467               {
7468                 if ($nodir_name eq 'EXTRA')
7469                   {
7470                     if (! $warned_about_extra)
7471                       {
7472                         $warned_about_extra = 1;
7473                         macro_error ($one_name,
7474                                      "`$one_name' contains configure substitution, but shouldn't");
7475                       }
7476                   }
7477                 # Check here to make sure variables defined in
7478                 # configure.ac do not imply that EXTRA_PRIMARY
7479                 # must be defined.
7480                 elsif (! defined $configure_vars{$one_name})
7481                   {
7482                     $require_extra = $one_name
7483                       if $do_require;
7484                   }
7485
7486                 next;
7487               }
7488
7489             push (@result, $rcurs);
7490           }
7491
7492         # A blatant hack: we rewrite each _PROGRAMS primary to include
7493         # EXEEXT.
7494         if ($primary eq 'PROGRAMS')
7495         {
7496             my @conds = variable_conditions_recursive ($one_name);
7497
7498             my @condvals;
7499             foreach my $cond (@conds)
7500             {
7501                 my @one_binlist = ();
7502                 my @condval = &variable_value_as_list_recursive ($one_name,
7503                                                        $cond);
7504                 foreach my $rcurs (@condval)
7505                 {
7506                     # Skip autoconf substs.  Also skip if the user
7507                     # already applied $(EXEEXT).
7508                     if ($rcurs =~ /^\@.*\@$/ || $rcurs =~ /\$\(EXEEXT\)$/)
7509                     {
7510                         push (@one_binlist, $rcurs);
7511                     }
7512                     else
7513                     {
7514                         push (@one_binlist, $rcurs . '$(EXEEXT)');
7515                     }
7516                 }
7517
7518                 push (@condvals, $cond);
7519                 push (@condvals, join (' ', @one_binlist));
7520             }
7521
7522             variable_delete ($one_name);
7523             while (@condvals)
7524             {
7525                 my $cond = shift (@condvals);
7526                 my @val = split (' ', shift (@condvals));
7527                 define_pretty_variable ($one_name, $cond, @val);
7528             }
7529         }
7530
7531         # "EXTRA" shouldn't be used when generating clean targets,
7532         # all, or install targets.
7533         if ($nodir_name eq 'EXTRA')
7534           {
7535             # We used to warn if EXTRA_FOO was defined uselessly,
7536             # but this was annoying.
7537             next;
7538           }
7539
7540         if ($nodir_name eq 'check')
7541           {
7542             push (@check, '$(' . $one_name . ')');
7543           }
7544         else
7545           {
7546             push (@used, '$(' . $one_name . ')');
7547           }
7548
7549         # Is this to be installed?
7550         my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
7551
7552         # If so, with install-exec? (or install-data?).
7553         my $exec_p = (defined $exec_dir_p {$nodir_name}
7554                       ? $exec_dir_p {$nodir_name}
7555                       : ($nodir_name =~ /exec/));
7556
7557         # Singular form of $PRIMARY.
7558         (my $one_primary = $primary) =~ s/S$//;
7559         $output_rules .= &file_contents ($file,
7560                                          ('FIRST' => $first,
7561
7562                                           'PRIMARY'     => $primary,
7563                                           'ONE_PRIMARY' => $one_primary,
7564                                           'DIR'         => $X,
7565                                           'NDIR'        => $nodir_name,
7566                                           'BASE'        => $strip_subdir,
7567
7568                                           'EXEC'    => $exec_p,
7569                                           'INSTALL' => $install_p,
7570                                           'DIST'    => $dist_p));
7571
7572         $first = 0;
7573     }
7574
7575     # The JAVA variable is used as the name of the Java interpreter.
7576     # The PYTHON variable is used as the name of the Python interpreter.
7577     if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
7578     {
7579         # Define it.
7580         define_pretty_variable ($primary, '', @used);
7581         $output_vars .= "\n";
7582     }
7583
7584     if ($require_extra && ! &variable_defined ('EXTRA_' . $primary))
7585     {
7586         macro_error ($require_extra,
7587                      "`$require_extra' contains configure substitution, but `EXTRA_$primary' not defined");
7588     }
7589
7590     # Push here because PRIMARY might be configure time determined.
7591     push (@all, '$(' . $primary . ')')
7592         if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
7593
7594     # Make the result unique.  This lets the user use conditionals in
7595     # a natural way, but still lets us program lazily -- we don't have
7596     # to worry about handling a particular object more than once.
7597     return uniq (sort @result);
7598 }
7599
7600
7601 ################################################################
7602
7603 # Each key in this hash is the name of a directory holding a
7604 # Makefile.in.  These variables are local to `is_make_dir'.
7605 my %make_dirs = ();
7606 my $make_dirs_set = 0;
7607
7608 sub is_make_dir
7609 {
7610     my ($dir) = @_;
7611     if (! $make_dirs_set)
7612     {
7613         foreach my $iter (@configure_input_files)
7614         {
7615             $make_dirs{dirname ($iter)} = 1;
7616         }
7617         # We also want to notice Makefile.in's.
7618         foreach my $iter (@other_input_files)
7619         {
7620             if ($iter =~ /Makefile\.in$/)
7621             {
7622                 $make_dirs{dirname ($iter)} = 1;
7623             }
7624         }
7625         $make_dirs_set = 1;
7626     }
7627     return defined $make_dirs{$dir};
7628 }
7629
7630 ################################################################
7631
7632 # This variable is local to the "require file" set of functions.
7633 my @require_file_paths = ();
7634
7635 # If a file name appears as a key in this hash, then it has already
7636 # been checked for.  This variable is local to the "require file"
7637 # functions.
7638 %require_file_found = ();
7639
7640 # See if we want to push this file onto dist_common.  This function
7641 # encodes the rules for deciding when to do so.
7642 sub maybe_push_required_file
7643 {
7644     my ($dir, $file, $fullfile) = @_;
7645
7646     if ($dir eq $relative_dir)
7647     {
7648         &push_dist_common ($file);
7649     }
7650     elsif ($relative_dir eq '.' && ! &is_make_dir ($dir))
7651     {
7652         # If we are doing the topmost directory, and the file is in a
7653         # subdir which does not have a Makefile, then we distribute it
7654         # here.
7655         &push_dist_common ($fullfile);
7656     }
7657 }
7658
7659
7660 # &require_file_internal ($WHERE, $MYSTRICT, @FILES)
7661 # --------------------------------------------------
7662 # Verify that the file must exist in the current directory.
7663 # $MYSTRICT is the strictness level at which this file becomes required.
7664 #
7665 # Must set require_file_paths before calling this function.
7666 # require_file_paths is set to hold a single directory (the one in
7667 # which the first file was found) before return.
7668 sub require_file_internal ($$@)
7669 {
7670     my ($where, $mystrict, @files) = @_;
7671
7672     foreach my $file (@files)
7673     {
7674         my $fullfile;
7675         my $errdir;
7676         my $errfile;
7677         my $save_dir;
7678
7679         my $found_it = 0;
7680         my $dangling_sym = 0;
7681         foreach my $dir (@require_file_paths)
7682         {
7683             $fullfile = $dir . "/" . $file;
7684             $errdir = $dir unless $errdir;
7685
7686             # Use different name for "error filename".  Otherwise on
7687             # an error the bad file will be reported as eg
7688             # `../../install-sh' when using the default
7689             # config_aux_path.
7690             $errfile = $errdir . '/' . $file;
7691
7692             if (-l $fullfile && ! -f $fullfile)
7693             {
7694                 $dangling_sym = 1;
7695                 last;
7696             }
7697             elsif (-f $fullfile)
7698             {
7699                 $found_it = 1;
7700                 &maybe_push_required_file ($dir, $file, $fullfile);
7701                 $save_dir = $dir;
7702                 last;
7703             }
7704         }
7705
7706         # `--force-missing' only has an effect if `--add-missing' is
7707         # specified.
7708         if ($found_it && (! $add_missing || ! $force_missing))
7709         {
7710             # Prune the path list.
7711             @require_file_paths = $save_dir;
7712         }
7713         else
7714         {
7715             # If we've already looked for it, we're done.  You might
7716             # wonder why we don't do this before searching for the
7717             # file.  If we do that, then something like
7718             # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
7719             # DIST_COMMON.
7720             if (! $found_it)
7721             {
7722                 next if defined $require_file_found{$file};
7723                 $require_file_found{$file} = 1;
7724             }
7725
7726             if ($strictness >= $mystrict)
7727             {
7728                 if ($dangling_sym && $add_missing)
7729                 {
7730                     unlink ($fullfile);
7731                 }
7732
7733                 my $trailer = '';
7734                 my $suppress = 0;
7735
7736                 # Only install missing files according to our desired
7737                 # strictness level.
7738                 my $message = "required file `$errfile' not found";
7739                 if ($add_missing)
7740                 {
7741                     $suppress = 1;
7742
7743                     # Maybe run libtoolize.
7744                     my @syslist = ('libtoolize', '--automake');
7745                     push @syslist, '--copy'
7746                         if $copy_missing;
7747                     if ($seen_libtool
7748                         && grep ($_ eq $file, @libtoolize_files)
7749                         && system (@syslist))
7750                     {
7751                         $message = "installing `$errfile'";
7752                         $suppress = 0;
7753                         $trailer = "; cannot run `libtoolize': $!";
7754                     }
7755                     elsif (-f ("$libdir/$file"))
7756                     {
7757                         # Install the missing file.  Symlink if we
7758                         # can, copy if we must.  Note: delete the file
7759                         # first, in case it is a dangling symlink.
7760                         $message = "installing `$errfile'";
7761                         # Windows Perl will hang if we try to delete a
7762                         # file that doesn't exist.
7763                         unlink ($errfile) if -f $errfile;
7764                         if ($symlink_exists && ! $copy_missing)
7765                         {
7766                             if (! symlink ("$libdir/$file", $errfile))
7767                             {
7768                                 $suppress = 0;
7769                                 $trailer = "; error while making link: $!";
7770                             }
7771                         }
7772                         elsif (system ('cp', "$libdir/$file", $errfile))
7773                         {
7774                             $suppress = 0;
7775                             $trailer = "\n    error while copying";
7776                         }
7777                     }
7778
7779                     &maybe_push_required_file (dirname ($errfile),
7780                                                $file, $errfile);
7781
7782                     # Prune the path list.
7783                     @require_file_paths = &dirname ($errfile);
7784                 }
7785
7786                 # If --force-missing was specified, and we have
7787                 # actually found the file, then do nothing.
7788                 next
7789                     if $found_it && $force_missing;
7790
7791                 if ($suppress)
7792                 {
7793                   file_warning ($where, "$message$trailer");
7794                 }
7795                 else
7796                 {
7797                   file_error ($where, "$message$trailer");
7798                 }
7799             }
7800         }
7801     }
7802 }
7803
7804 # &require_file ($WHERE, $MYSTRICT, @FILES)
7805 # -----------------------------------------
7806 sub require_file ($$@)
7807 {
7808     my ($where, $mystrict, @files) = @_;
7809     @require_file_paths = $relative_dir;
7810     require_file_internal ($where, $mystrict, @files);
7811 }
7812
7813 # &require_file_with_macro ($MACRO, $MYSTRICT, @FILES)
7814 # ----------------------------------------------------
7815 sub require_file_with_macro ($$@)
7816 {
7817     my ($macro, $mystrict, @files) = @_;
7818     require_file ($var_location{$macro}, $mystrict, @files);
7819 }
7820
7821
7822 # &require_conf_file ($WHERE, $MYSTRICT, @FILES)
7823 # ----------------------------------------------
7824 # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR.
7825 sub require_conf_file ($$@)
7826 {
7827     my ($where, $mystrict, @files) = @_;
7828     @require_file_paths = @config_aux_path;
7829     require_file_internal ($where, $mystrict, @files);
7830     my $dir = $require_file_paths[0];
7831     @config_aux_path = @require_file_paths;
7832      # Avoid unsightly '/.'s.
7833     $config_aux_dir = '$(top_srcdir)' . ($dir eq '.' ? "" : "/$dir");
7834 }
7835
7836
7837 # &require_config_file ($MYSTRICT, @FILES)
7838 # ----------------------------------------
7839 # Require a file that is also required by Autoconf.  Looks in
7840 # configuration path, as specified by AC_CONFIG_AUX_DIR.
7841 sub require_config_file ($@)
7842 {
7843     my ($mystrict, @files) = @_;
7844     require_conf_file ($configure_ac, $mystrict, @files);
7845 }
7846
7847 # &require_conf_file_with_macro ($MACRO, $MYSTRICT, @FILES)
7848 # ---------------------------------------------------------
7849 sub require_conf_file_with_macro ($$@)
7850 {
7851     my ($macro, $mystrict, @files) = @_;
7852     require_conf_file ($var_location{$macro}, $mystrict, @files);
7853 }
7854
7855 ################################################################
7856
7857 # &require_build_directory ($DIRECTORY)
7858 # ------------------------------------
7859 # Emit rules to create $DIRECTORY if needed, and return
7860 # the file that any target requiring this directory should be made
7861 # dependent upon.
7862 sub require_build_directory ($)
7863 {
7864     my $directory = shift;
7865     my $dirstamp = "$directory/.dirstamp";
7866
7867     # Don't emit the rule twice.
7868     if (! defined $directory_map{$directory})
7869     {
7870         $directory_map{$directory} = 1;
7871
7872         # Directory must be removed by `make distclean'.
7873         $compile_clean_files{$dirstamp} = $DIST_CLEAN;
7874
7875         $output_rules .= ("$dirstamp:\n"
7876                           . "\t\@\$(mkinstalldirs) $directory\n"
7877                           . "\t\@: > $dirstamp\n");
7878     }
7879
7880     return $dirstamp;
7881 }
7882
7883 # &require_build_directory_maybe ($FILE)
7884 # --------------------------------------
7885 # If $FILE lies in a subdirectory, emit a rule to create this
7886 # directory and return the file that $FILE should be made
7887 # dependent upon.  Otherwise, just return the empty string.
7888 sub require_build_directory_maybe ($)
7889 {
7890     my $file = shift;
7891     my $directory = dirname ($file);
7892
7893     if ($directory ne '.')
7894     {
7895         return &require_build_directory ($directory);
7896     }
7897     else
7898     {
7899         return '';
7900     }
7901 }
7902
7903 ################################################################
7904
7905 # Push a list of files onto dist_common.
7906 sub push_dist_common
7907 {
7908     &prog_error ("push_dist_common run after handle_dist")
7909         if $handle_dist_run;
7910     macro_define ('DIST_COMMON', 1, '+', '', join (' ', @_), '');
7911 }
7912
7913
7914 # Set strictness.
7915 sub set_strictness
7916 {
7917     $strictness_name = $_[0];
7918     if ($strictness_name eq 'gnu')
7919     {
7920         $strictness = $GNU;
7921     }
7922     elsif ($strictness_name eq 'gnits')
7923     {
7924         $strictness = $GNITS;
7925     }
7926     elsif ($strictness_name eq 'foreign')
7927     {
7928         $strictness = $FOREIGN;
7929     }
7930     else
7931     {
7932         die "$me: level `$strictness_name' not recognized\n";
7933     }
7934 }
7935
7936
7937 ################################################################
7938
7939 # Ensure a file exists.
7940 sub create
7941 {
7942     use IO::File;
7943     my ($file) = @_;
7944
7945     my $touch = new IO::File (">> $file");
7946     $touch->close;
7947 }
7948
7949 # Glob something.  Do this to avoid indentation screwups everywhere we
7950 # want to glob.  Gross!
7951 sub my_glob
7952 {
7953     my ($pat) = @_;
7954     return <${pat}>;
7955 }
7956
7957 # Remove one level of brackets and strip leading spaces,
7958 # as does m4 to function arguments.
7959 sub unquote_m4_arg
7960 {
7961     $_ = shift;
7962     s/^\s*//;
7963
7964     my @letters = split //;
7965     my @result = ();
7966     my $depth = 0;
7967
7968     foreach (@letters)
7969     {
7970         if ($_ eq '[')
7971         {
7972             ++$depth;
7973             next if $depth == 1;
7974         }
7975         elsif ($_ eq ']')
7976         {
7977             --$depth;
7978             next if $depth == 0;
7979             # don't count orphan right brackets
7980             $depth = 0 if $depth < 0;
7981         }
7982         push @result, $_;
7983     }
7984     return join '', @result;
7985 }
7986
7987 ################################################################
7988
7989 # print_error ($LEADER, @ARGS)
7990 # -------------------------------
7991 # Do the work of printing the error message.  Join @ARGS with spaces,
7992 # then split at newlines and add $LEADER to each line.  Uses `warn' to
7993 # print message.  Set exit status.
7994 sub print_error
7995 {
7996     my ($leader, @args) = @_;
7997     my $text = join (' ', @args);
7998     @args = split ("\n", $text);
7999     $text = $leader . join ("\n" . $leader, @args) . "\n";
8000     warn $text;
8001     $exit_status = 1;
8002 }
8003
8004
8005 # Print an error message and set exit status.
8006 sub am_error (@)
8007 {
8008     print_error ("$me: ${am_file}.am: ", @_);
8009 }
8010
8011
8012 # &file_error ($FILE, @ARGS)
8013 # --------------------------
8014 sub file_error ($@)
8015 {
8016     my ($file, @args) = @_;
8017     print_error ("$file: ", @args);
8018 }
8019
8020
8021 # &macro_error ($MACRO, @ARGS)
8022 # ----------------------------
8023 # Report an error, @ARGS, about $MACRO.
8024 sub macro_error ($@)
8025 {
8026     my ($macro, @args) = @_;
8027     file_error ($var_location{$macro}, @args);
8028 }
8029
8030
8031 # &target_error ($TARGET, @ARGS)
8032 # ------------------------------
8033 # Report an error, @ARGS, about the rule $TARGET.
8034 sub target_error ($@)
8035 {
8036     my ($target, @args) = @_;
8037     file_error ($targets{$target}, @args);
8038 }
8039
8040
8041 # &line_error ($SYMBOL or $LINE, @ARGS)
8042 # -------------------------------------
8043 # Report an error about $SYMBOL.  The error message is composed of the
8044 # @ARGS, and try to find the location of the error of $SYMBOL.
8045 sub line_error ($@)
8046 {
8047     my ($symbol, @args) = @_;
8048
8049     if ($symbol && "$symbol" ne '-1')
8050     {
8051         if ($symbol =~ /^\d+$/)
8052         {
8053             # SYMBOL is a line number, then it must be a Makefile.am.
8054             file_error ("${am_file}.am:$symbol", @args);
8055         }
8056         elsif (defined $configure_vars{$symbol})
8057         {
8058             # SYMBOL is a variable defined in configure.ac, so add the
8059             # appropriate line number.
8060             file_error ($configure_vars{$symbol}, @args);
8061         }
8062         elsif (defined $var_location{$symbol})
8063         {
8064             croak "use macro_error for macro: $symbol\n";
8065         }
8066         elsif (defined $targets{$symbol})
8067         {
8068             croak "use target_error for macros: $symbol\n";
8069         }
8070         else
8071         {
8072             # Couldn't find the line number.
8073             file_error ("${am_file}.am", @args);
8074         }
8075     }
8076     else
8077     {
8078         &am_error (@args);
8079     }
8080 }
8081
8082 # Like am_error, but while scanning configure.ac.
8083 sub conf_error
8084 {
8085     # FIXME: can run in subdirs.
8086     print_error ("$me: $configure_ac: ", @_);
8087 }
8088
8089 # &file_warning ($FILE, @ARGS)
8090 # ----------------------------
8091 # Warning message with line number referring to configure.ac.
8092 # Does not affect exit_status
8093 sub file_warning ($@)
8094 {
8095     my ($file, @args) = @_;
8096
8097     my $saved_exit_status = $exit_status;
8098     my $sig = $SIG{'__WARN__'};
8099     $SIG{'__WARN__'} = 'DEFAULT';
8100     file_error ($file, @args);
8101     $exit_status = $saved_exit_status;
8102     $SIG{'__WARN__'} = $sig;
8103 }
8104
8105 # Tell user where our aclocal.m4 is, but only once.
8106 sub keyed_aclocal_warning ($)
8107 {
8108     my ($key) = @_;
8109     warn "$me: macro `$key' can be generated by `aclocal'\n";
8110 }
8111
8112 # Print usage information.
8113 sub usage ()
8114 {
8115     print <<EOF;
8116 Usage: $0 [OPTION] ... [Makefile]...
8117
8118 Generate Makefile.in for configure from Makefile.am.
8119
8120 Operation modes:
8121       --help             print this help, then exit
8122       --version          print version number, then exit
8123   -v, --verbose          verbosely list files processed
8124   -o, --output-dir=DIR   put generated Makefile.in's into DIR
8125       --no-force         only update Makefile.in's that are out of date
8126
8127 Dependency tracking:
8128   -i, --ignore-deps      disable dependency tracking code
8129       --include-deps     enable dependency tracking code
8130
8131 Flavors:
8132       --cygnus           assume program is part of Cygnus-style tree
8133       --foreign          set strictness to foreign
8134       --gnits            set strictness to gnits
8135       --gnu              set strictness to gnu
8136
8137 Library files:
8138   -a, --add-missing      add missing standard files to package
8139       --libdir=DIR       directory storing library files
8140   -c, --copy             with -a, copy missing files (default is symlink)
8141   -f, --force-missing    force update of standard files
8142 EOF
8143
8144     my ($last, @lcomm);
8145     $last = '';
8146     foreach my $iter (sort ((@common_files, @common_sometimes)))
8147     {
8148         push (@lcomm, $iter) unless $iter eq $last;
8149         $last = $iter;
8150     }
8151
8152     my @four;
8153     print "\nFiles which are automatically distributed, if found:\n";
8154     format USAGE_FORMAT =
8155   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
8156   $four[0],           $four[1],           $four[2],           $four[3]
8157 .
8158     $~ = "USAGE_FORMAT";
8159
8160     my $cols = 4;
8161     my $rows = int(@lcomm / $cols);
8162     my $rest = @lcomm % $cols;
8163
8164     if ($rest)
8165     {
8166         $rows++;
8167     }
8168     else
8169     {
8170         $rest = $cols;
8171     }
8172
8173     for (my $y = 0; $y < $rows; $y++)
8174     {
8175         @four = ("", "", "", "");
8176         for (my $x = 0; $x < $cols; $x++)
8177         {
8178             last if $y + 1 == $rows && $x == $rest;
8179
8180             my $idx = (($x > $rest)
8181                        ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
8182                        : ($rows * $x));
8183
8184             $idx += $y;
8185             $four[$x] = $lcomm[$idx];
8186         }
8187         write;
8188     }
8189
8190     print "\nReport bugs to <bug-automake\@gnu.org>.\n";
8191
8192     exit 0;
8193 }
8194
8195 # &version ()
8196 # -----------
8197 # Print version information
8198 sub version ()
8199 {
8200   print <<EOF;
8201 automake (GNU $PACKAGE) $VERSION
8202 Written by Tom Tromey <tromey\@cygnus.com>.
8203
8204 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
8205 Free Software Foundation, Inc.
8206 This is free software; see the source for copying conditions.  There is NO
8207 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
8208 EOF
8209   exit 0;
8210 }