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