* NEWS: Fix typo in 'make dist-bzip2' description.
[automake.git] / automake.in
blobdb7f3c64ba9f4bafcf15942fea1677d247478a34
1 #!@PERL@ -w
2 # -*- perl -*-
3 # @configure_input@
5 eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
6     if 0;
8 # automake - create Makefile.in from Makefile.am
9 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
10 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
11 # Foundation, Inc.
13 # This program is free software; you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation; either version 2, or (at your option)
16 # any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 # GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License
24 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
26 # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
27 # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and
28 # Alexandre Duret-Lutz <adl@gnu.org>.
30 package Language;
32 BEGIN
34   my $perllibdir = $ENV{'perllibdir'} || '@datadir@/@PACKAGE@-@APIVERSION@';
35   unshift @INC, (split '@PATH_SEPARATOR@', $perllibdir);
37   # Override SHELL.  This is required on DJGPP so that system() uses
38   # bash, not COMMAND.COM which doesn't quote arguments properly.
39   # Other systems aren't expected to use $SHELL when Automake
40   # runs, but it should be safe to drop the `if DJGPP' guard if
41   # it turns up other systems need the same thing.  After all,
42   # if SHELL is used, ./configure's SHELL is always better than
43   # the user's SHELL (which may be something like tcsh).
44   $ENV{'SHELL'} = '@SHELL@' if exists $ENV{'DJDIR'};
47 use Automake::Struct;
48 struct (# Short name of the language (c, f77...).
49         'name' => "\$",
50         # Nice name of the language (C, Fortran 77...).
51         'Name' => "\$",
53         # List of configure variables which must be defined.
54         'config_vars' => '@',
56         'ansi'    => "\$",
57         # `pure' is `1' or `'.  A `pure' language is one where, if
58         # all the files in a directory are of that language, then we
59         # do not require the C compiler or any code to call it.
60         'pure'   => "\$",
62         'autodep' => "\$",
64         # Name of the compiling variable (COMPILE).
65         'compiler'  => "\$",
66         # Content of the compiling variable.
67         'compile'  => "\$",
68         # Flag to require compilation without linking (-c).
69         'compile_flag' => "\$",
70         'extensions' => '@',
71         # A subroutine to compute a list of possible extensions of
72         # the product given the input extensions.
73         # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo'))
74         'output_extensions' => "\$",
75         # A list of flag variables used in 'compile'.
76         # (defaults to [])
77         'flags' => "@",
79         # Any tag to pass to libtool while compiling.
80         'libtool_tag' => "\$",
82         # The file to use when generating rules for this language.
83         # The default is 'depend2'.
84         'rule_file' => "\$",
86         # Name of the linking variable (LINK).
87         'linker' => "\$",
88         # Content of the linking variable.
89         'link' => "\$",
91         # Name of the compiler variable (CC).
92         'ccer' => "\$",
94         # Name of the linker variable (LD).
95         'lder' => "\$",
96         # Content of the linker variable ($(CC)).
97         'ld' => "\$",
99         # Flag to specify the output file (-o).
100         'output_flag' => "\$",
101         '_finish' => "\$",
103         # This is a subroutine which is called whenever we finally
104         # determine the context in which a source file will be
105         # compiled.
106         '_target_hook' => "\$",
108         # If TRUE, nodist_ sources will be compiled using specific rules
109         # (i.e. not inference rules).  The default is FALSE.
110         'nodist_specific' => "\$");
113 sub finish ($)
115   my ($self) = @_;
116   if (defined $self->_finish)
117     {
118       &{$self->_finish} (@_);
119     }
122 sub target_hook ($$$$%)
124     my ($self) = @_;
125     if (defined $self->_target_hook)
126     {
127         &{$self->_target_hook} (@_);
128     }
131 package Automake;
133 use strict;
134 use Automake::Config;
135 BEGIN
137   if ($perl_threads)
138     {
139       require threads;
140       import threads;
141       require Thread::Queue;
142       import Thread::Queue;
143     }
145 use Automake::General;
146 use Automake::XFile;
147 use Automake::Channels;
148 use Automake::ChannelDefs;
149 use Automake::Configure_ac;
150 use Automake::FileUtils;
151 use Automake::Location;
152 use Automake::Condition qw/TRUE FALSE/;
153 use Automake::DisjConditions;
154 use Automake::Options;
155 use Automake::Version;
156 use Automake::Variable;
157 use Automake::VarDef;
158 use Automake::Rule;
159 use Automake::RuleDef;
160 use Automake::Wrap 'makefile_wrap';
161 use File::Basename;
162 use File::Spec;
163 use Carp;
165 ## ----------- ##
166 ## Constants.  ##
167 ## ----------- ##
169 # Some regular expressions.  One reason to put them here is that it
170 # makes indentation work better in Emacs.
172 # Writing singled-quoted-$-terminated regexes is a pain because
173 # perl-mode thinks of $' as the ${'} variable (instead of a $ followed
174 # by a closing quote.  Letting perl-mode think the quote is not closed
175 # leads to all sort of misindentations.  On the other hand, defining
176 # regexes as double-quoted strings is far less readable.  So usually
177 # we will write:
179 #  $REGEX = '^regex_value' . "\$";
181 my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
182 my $WHITE_PATTERN = '^\s*' . "\$";
183 my $COMMENT_PATTERN = '^#';
184 my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*';
185 # A rule has three parts: a list of targets, a list of dependencies,
186 # and optionally actions.
187 my $RULE_PATTERN =
188   "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";
190 # Only recognize leading spaces, not leading tabs.  If we recognize
191 # leading tabs here then we need to make the reader smarter, because
192 # otherwise it will think rules like `foo=bar; \' are errors.
193 my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$";
194 # This pattern recognizes a Gnits version id and sets $1 if the
195 # release is an alpha release.  We also allow a suffix which can be
196 # used to extend the version number with a "fork" identifier.
197 my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';
199 my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$";
200 my $ELSE_PATTERN =
201   '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
202 my $ENDIF_PATTERN =
203   '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
204 my $PATH_PATTERN = '(\w|[+/.-])+';
205 # This will pass through anything not of the prescribed form.
206 my $INCLUDE_PATTERN = ('^include\s+'
207                        . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
208                        . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
209                        . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$");
211 # Match `-d' as a command-line argument in a string.
212 my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)";
213 # Directories installed during 'install-exec' phase.
214 my $EXEC_DIR_PATTERN =
215   '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$";
217 # Values for AC_CANONICAL_*
218 use constant AC_CANONICAL_BUILD  => 1;
219 use constant AC_CANONICAL_HOST   => 2;
220 use constant AC_CANONICAL_TARGET => 3;
222 # Values indicating when something should be cleaned.
223 use constant MOSTLY_CLEAN     => 0;
224 use constant CLEAN            => 1;
225 use constant DIST_CLEAN       => 2;
226 use constant MAINTAINER_CLEAN => 3;
228 # Libtool files.
229 my @libtool_files = qw(ltmain.sh config.guess config.sub);
230 # ltconfig appears here for compatibility with old versions of libtool.
231 my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh);
233 # Commonly found files we look for and automatically include in
234 # DISTFILES.
235 my @common_files =
236     (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB
237         COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO
238         ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub
239         depcomp elisp-comp install-sh libversion.in mdate-sh missing
240         mkinstalldirs py-compile texinfo.tex ylwrap),
241      @libtool_files, @libtool_sometimes);
243 # Commonly used files we auto-include, but only sometimes.  This list
244 # is used for the --help output only.
245 my @common_sometimes =
246   qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure
247      configure.ac configure.in stamp-vti);
249 # Standard directories from the GNU Coding Standards, and additional
250 # pkg* directories from Automake.  Stored in a hash for fast member check.
251 my %standard_prefix =
252     map { $_ => 1 } (qw(bin data dataroot doc dvi exec html include info
253                         lib libexec lisp locale localstate man man1 man2
254                         man3 man4 man5 man6 man7 man8 man9 oldinclude pdf
255                         pkgdata pkginclude pkglib pkglibexec ps sbin
256                         sharedstate sysconf));
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.
267 # This program is distributed in the hope that it will be useful,
268 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
269 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
270 # PARTICULAR PURPOSE.
273 # These constants are returned by the lang_*_rewrite functions.
274 # LANG_SUBDIR means that the resulting object file should be in a
275 # subdir if the source file is.  In this case the file name cannot
276 # have `..' components.
277 use constant LANG_IGNORE  => 0;
278 use constant LANG_PROCESS => 1;
279 use constant LANG_SUBDIR  => 2;
281 # These are used when keeping track of whether an object can be built
282 # by two different paths.
283 use constant COMPILE_LIBTOOL  => 1;
284 use constant COMPILE_ORDINARY => 2;
286 # We can't always associate a location to a variable or a rule,
287 # when it's defined by Automake.  We use INTERNAL in this case.
288 use constant INTERNAL => new Automake::Location;
290 # Serialization keys for message queues.
291 use constant QUEUE_MESSAGE   => "msg";
292 use constant QUEUE_CONF_FILE => "conf file";
293 use constant QUEUE_LOCATION  => "location";
294 use constant QUEUE_STRING    => "string";
297 ## ---------------------------------- ##
298 ## Variables related to the options.  ##
299 ## ---------------------------------- ##
301 # TRUE if we should always generate Makefile.in.
302 my $force_generation = 1;
304 # From the Perl manual.
305 my $symlink_exists = (eval 'symlink ("", "");', $@ eq '');
307 # TRUE if missing standard files should be installed.
308 my $add_missing = 0;
310 # TRUE if we should copy missing files; otherwise symlink if possible.
311 my $copy_missing = 0;
313 # TRUE if we should always update files that we know about.
314 my $force_missing = 0;
317 ## ---------------------------------------- ##
318 ## Variables filled during files scanning.  ##
319 ## ---------------------------------------- ##
321 # Name of the configure.ac file.
322 my $configure_ac;
324 # Files found by scanning configure.ac for LIBOBJS.
325 my %libsources = ();
327 # Names used in AC_CONFIG_HEADER call.
328 my @config_headers = ();
330 # Names used in AC_CONFIG_LINKS call.
331 my @config_links = ();
333 # Directory where output files go.  Actually, output files are
334 # relative to this directory.
335 my $output_directory;
337 # List of Makefile.am's to process, and their corresponding outputs.
338 my @input_files = ();
339 my %output_files = ();
341 # Complete list of Makefile.am's that exist.
342 my @configure_input_files = ();
344 # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's,
345 # and their outputs.
346 my @other_input_files = ();
347 # Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADER appears.
348 # The keys are the files created by these macros.
349 my %ac_config_files_location = ();
350 # The condition under which AC_CONFIG_FOOS appears.
351 my %ac_config_files_condition = ();
353 # Directory to search for configure-required files.  This
354 # will be computed by &locate_aux_dir and can be set using
355 # AC_CONFIG_AUX_DIR in configure.ac.
356 # $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree.
357 my $config_aux_dir = '';
358 my $config_aux_dir_set_in_configure_ac = 0;
359 # $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used
360 # in Makefiles.
361 my $am_config_aux_dir = '';
363 # Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR
364 # in configure.ac.
365 my $config_libobj_dir = '';
367 # Whether AM_GNU_GETTEXT has been seen in configure.ac.
368 my $seen_gettext = 0;
369 # Whether AM_GNU_GETTEXT([external]) is used.
370 my $seen_gettext_external = 0;
371 # Where AM_GNU_GETTEXT appears.
372 my $ac_gettext_location;
373 # Whether AM_GNU_GETTEXT_INTL_SUBDIR has been seen.
374 my $seen_gettext_intl = 0;
376 # Lists of tags supported by Libtool.
377 my %libtool_tags = ();
378 # 1 if Libtool uses LT_SUPPORTED_TAG.  If it does, then it also
379 # uses AC_REQUIRE_AUX_FILE.
380 my $libtool_new_api = 0;
382 # Most important AC_CANONICAL_* macro seen so far.
383 my $seen_canonical = 0;
384 # Location of that macro.
385 my $canonical_location;
387 # Where AM_MAINTAINER_MODE appears.
388 my $seen_maint_mode;
390 # Actual version we've seen.
391 my $package_version = '';
393 # Where version is defined.
394 my $package_version_location;
396 # TRUE if we've seen AM_ENABLE_MULTILIB.
397 my $seen_multilib = 0;
399 # TRUE if we've seen AM_PROG_CC_C_O
400 my $seen_cc_c_o = 0;
402 # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument.
403 my %required_aux_file = ();
405 # Where AM_INIT_AUTOMAKE is called;
406 my $seen_init_automake = 0;
408 # TRUE if we've seen AM_AUTOMAKE_VERSION.
409 my $seen_automake_version = 0;
411 # Hash table of discovered configure substitutions.  Keys are names,
412 # values are `FILE:LINE' strings which are used by error message
413 # generation.
414 my %configure_vars = ();
416 # Ignored configure substitutions (i.e., variables not to be output in
417 # Makefile.in)
418 my %ignored_configure_vars = ();
420 # Files included by $configure_ac.
421 my @configure_deps = ();
423 # Greatest timestamp of configure's dependencies.
424 my $configure_deps_greatest_timestamp = 0;
426 # Hash table of AM_CONDITIONAL variables seen in configure.
427 my %configure_cond = ();
429 # This maps extensions onto language names.
430 my %extension_map = ();
432 # List of the DIST_COMMON files we discovered while reading
433 # configure.in
434 my $configure_dist_common = '';
436 # This maps languages names onto objects.
437 my %languages = ();
438 # Maps each linker variable onto a language object.
439 my %link_languages = ();
441 # maps extensions to needed source flags.
442 my %sourceflags = ();
444 # List of targets we must always output.
445 # FIXME: Complete, and remove falsely required targets.
446 my %required_targets =
447   (
448    'all'          => 1,
449    'dvi'          => 1,
450    'pdf'          => 1,
451    'ps'           => 1,
452    'info'         => 1,
453    'install-info' => 1,
454    'install'      => 1,
455    'install-data' => 1,
456    'install-exec' => 1,
457    'uninstall'    => 1,
459    # FIXME: Not required, temporary hacks.
460    # Well, actually they are sort of required: the -recursive
461    # targets will run them anyway...
462    'html-am'         => 1,
463    'dvi-am'          => 1,
464    'pdf-am'          => 1,
465    'ps-am'           => 1,
466    'info-am'         => 1,
467    'install-data-am' => 1,
468    'install-exec-am' => 1,
469    'install-html-am' => 1,
470    'install-dvi-am'  => 1,
471    'install-pdf-am'  => 1,
472    'install-ps-am'   => 1,
473    'install-info-am' => 1,
474    'installcheck-am' => 1,
475    'uninstall-am' => 1,
477    'install-man' => 1,
478   );
480 # Set to 1 if this run will create the Makefile.in that distributes
481 # the files in config_aux_dir.
482 my $automake_will_process_aux_dir = 0;
484 # The name of the Makefile currently being processed.
485 my $am_file = 'BUG';
488 ################################################################
490 ## ------------------------------------------ ##
491 ## Variables reset by &initialize_per_input.  ##
492 ## ------------------------------------------ ##
494 # Basename and relative dir of the input file.
495 my $am_file_name;
496 my $am_relative_dir;
498 # Same but wrt Makefile.in.
499 my $in_file_name;
500 my $relative_dir;
502 # Relative path to the top directory.
503 my $topsrcdir;
505 # Greatest timestamp of the output's dependencies (excluding
506 # configure's dependencies).
507 my $output_deps_greatest_timestamp;
509 # These variables are used when generating each Makefile.in.
510 # They hold the Makefile.in until it is ready to be printed.
511 my $output_vars;
512 my $output_all;
513 my $output_header;
514 my $output_rules;
515 my $output_trailer;
517 # This is the conditional stack, updated on if/else/endif, and
518 # used to build Condition objects.
519 my @cond_stack;
521 # This holds the set of included files.
522 my @include_stack;
524 # List of dependencies for the obvious targets.
525 my @all;
526 my @check;
527 my @check_tests;
529 # Keys in this hash table are files to delete.  The associated
530 # value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.)
531 my %clean_files;
533 # Keys in this hash table are object files or other files in
534 # subdirectories which need to be removed.  This only holds files
535 # which are created by compilations.  The value in the hash indicates
536 # when the file should be removed.
537 my %compile_clean_files;
539 # Keys in this hash table are directories where we expect to build a
540 # libtool object.  We use this information to decide what directories
541 # to delete.
542 my %libtool_clean_directories;
544 # Value of `$(SOURCES)', used by tags.am.
545 my @sources;
546 # Sources which go in the distribution.
547 my @dist_sources;
549 # This hash maps object file names onto their corresponding source
550 # file names.  This is used to ensure that each object is created
551 # by a single source file.
552 my %object_map;
554 # This hash maps object file names onto an integer value representing
555 # whether this object has been built via ordinary compilation or
556 # libtool compilation (the COMPILE_* constants).
557 my %object_compilation_map;
560 # This keeps track of the directories for which we've already
561 # created dirstamp code.  Keys are directories, values are stamp files.
562 # Several keys can share the same stamp files if they are equivalent
563 # (as are `.//foo' and `foo').
564 my %directory_map;
566 # All .P files.
567 my %dep_files;
569 # This is a list of all targets to run during "make dist".
570 my @dist_targets;
572 # Keep track of all programs declared in this Makefile, without
573 # $(EXEEXT).  @substitutions@ are not listed.
574 my %known_programs;
575 my %known_libraries;
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;
583 # This keeps track of which extensions we've seen (that we care
584 # about).
585 my %extension_seen;
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;
591 # We keep track of which objects need special (per-executable)
592 # handling on a per-language basis.
593 my %lang_specific_files;
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;
599 # Used to store a set of linkers needed to generate the sources currently
600 # under consideration.
601 my %linkers_used;
603 # True if we need `LINK' defined.  This is a hack.
604 my $need_link;
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;
610 # Record each file processed by make_paragraphs.
611 my %transformed_files;
614 ################################################################
616 ## ---------------------------------------------- ##
617 ## Variables not reset by &initialize_per_input.  ##
618 ## ---------------------------------------------- ##
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;
626 ################################################################
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 ($$)
638     my ($type, $value) = @_;
639     accept_extensions (split (' ', $value));
641 Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger);
643 ################################################################
645 ## --------------------------------- ##
646 ## Forward subroutine declarations.  ##
647 ## --------------------------------- ##
648 sub register_language (%);
649 sub file_contents_internal ($$$%);
650 sub define_files_variable ($\@$$);
653 # &initialize_per_input ()
654 # ------------------------
655 # (Re)-Initialize per-Makefile.am variables.
656 sub initialize_per_input ()
658     reset_local_duplicates ();
660     $am_file_name = undef;
661     $am_relative_dir = undef;
663     $in_file_name = undef;
664     $relative_dir = undef;
665     $topsrcdir = undef;
667     $output_deps_greatest_timestamp = 0;
669     $output_vars = '';
670     $output_all = '';
671     $output_header = '';
672     $output_rules = '';
673     $output_trailer = '';
675     Automake::Options::reset;
676     Automake::Variable::reset;
677     Automake::Rule::reset;
679     @cond_stack = ();
681     @include_stack = ();
683     @all = ();
684     @check = ();
685     @check_tests = ();
687     %clean_files = ();
688     %compile_clean_files = ();
690     # We always include `.'.  This isn't strictly correct.
691     %libtool_clean_directories = ('.' => 1);
693     @sources = ();
694     @dist_sources = ();
696     %object_map = ();
697     %object_compilation_map = ();
699     %directory_map = ();
701     %dep_files = ();
703     @dist_targets = ();
705     %known_programs = ();
706     %known_libraries= ();
708     %de_ansi_files = ();
710     %extension_seen = ();
712     %language_scratch = ();
714     %lang_specific_files = ();
716     $handle_dist_run = 0;
718     $need_link = 0;
720     $get_object_extension_was_run = 0;
722     %transformed_files = ();
726 ################################################################
728 # Initialize our list of languages that are internally supported.
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);
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']);
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']);
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']);
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 { });
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);
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);
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);
890 # Assembler.
891 register_language ('name' => 'asm',
892                    'Name' => 'Assembler',
893                    'config_vars' => ['CCAS', 'CCASFLAGS'],
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'],
906                    # With assembly we still use the C linker.
907                    '_finish' => \&lang_c_finish);
909 # Preprocessed Assembler.
910 register_language ('name' => 'cppasm',
911                    'Name' => 'Preprocessed Assembler',
912                    'config_vars' => ['CCAS', 'CCASFLAGS'],
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'],
923                    # With assembly we still use the C linker.
924                    '_finish' => \&lang_c_finish);
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']);
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']);
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']);
980 # Preprocessed Fortran 77
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').
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']);
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']);
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']);
1050 ################################################################
1052 # Error reporting functions.
1054 # err_am ($MESSAGE, [%OPTIONS])
1055 # -----------------------------
1056 # Uncategorized errors about the current Makefile.am.
1057 sub err_am ($;%)
1059   msg_am ('error', @_);
1062 # err_ac ($MESSAGE, [%OPTIONS])
1063 # -----------------------------
1064 # Uncategorized errors about configure.ac.
1065 sub err_ac ($;%)
1067   msg_ac ('error', @_);
1070 # msg_am ($CHANNEL, $MESSAGE, [%OPTIONS])
1071 # ---------------------------------------
1072 # Messages about about the current Makefile.am.
1073 sub msg_am ($$;%)
1075   my ($channel, $msg, %opts) = @_;
1076   msg $channel, "${am_file}.am", $msg, %opts;
1079 # msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS])
1080 # ---------------------------------------
1081 # Messages about about configure.ac.
1082 sub msg_ac ($$;%)
1084   my ($channel, $msg, %opts) = @_;
1085   msg $channel, $configure_ac, $msg, %opts;
1088 ################################################################
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 ($)
1098     my ($text) = @_;
1099     return '@' . $text . '@';
1102 ################################################################
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 ($)
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) || '.';
1131 ################################################################
1133 # `silent-rules' mode handling functions.
1135 # verbose_var (NAME)
1136 # ------------------
1137 # The public variable stem used to implement `silent-rules'.
1138 sub verbose_var ($)
1140     my ($name) = @_;
1141     return 'AM_V_' . $name;
1144 # verbose_private_var (NAME)
1145 # --------------------------
1146 # The naming policy for the private variables for `silent-rules'.
1147 sub verbose_private_var ($)
1149     my ($name) = @_;
1150     return 'am__v_' . $name;
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 ($$)
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       }
1173 # Above should not be needed in the general automake code.
1175 # verbose_flag (NAME)
1176 # -------------------
1177 # Contents of %VERBOSE%: variable to expand before rule command.
1178 sub verbose_flag ($)
1180     my ($name) = @_;
1181     return '$(' . verbose_var ($name) . ')'
1182       if (option 'silent-rules');
1183     return '';
1186 sub verbose_nodep_flag ($)
1188     my ($name) = @_;
1189     return '$(' . verbose_var ($name) . subst ('am__nodep') . ')'
1190       if (option 'silent-rules');
1191     return '';
1194 # silent_flag
1195 # -----------
1196 # Contents of %SILENT%: variable to expand to `@' when silent.
1197 sub silent_flag ()
1199     return verbose_flag ('at');
1202 # define_verbose_tagvar (NAME)
1203 # ----------------------------
1204 # Engage the needed `silent-rules' machinery for tag NAME.
1205 sub define_verbose_tagvar ($)
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       }
1215 # define_verbose_libtool
1216 # ----------------------
1217 # Engage the needed `silent-rules' machinery for `libtool --silent'.
1218 sub define_verbose_libtool ()
1220     define_verbose_var ('lt', '--silent');
1221     return verbose_flag ('lt');
1225 ################################################################
1228 # Handle AUTOMAKE_OPTIONS variable.  Return 1 on error, 0 otherwise.
1229 sub handle_options
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     }
1247   # Override portability-recursive warning.
1248   switch_warning ('no-portability-recursive')
1249     if option 'silent-rules';
1251   if ($strictness == GNITS)
1252     {
1253       set_option ('readme-alpha', INTERNAL);
1254       set_option ('std-options', INTERNAL);
1255       set_option ('check-news', INTERNAL);
1256     }
1258   return 0;
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 ($$)
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)"
1281 # get_object_extension ($EXTENSION)
1282 # ---------------------------------
1283 # Prefix $EXTENSION with $U if ansi2knr is in use.
1284 sub get_object_extension ($)
1286     my ($extension) = @_;
1288     # Check for automatic de-ANSI-fication.
1289     $extension = '$U' . $extension
1290       if option 'ansi2knr';
1292     $get_object_extension_was_run = 1;
1294     return $extension;
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 (@)
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     }
1323 # Call finish function for each language that was used.
1324 sub handle_languages
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);
1338             require_conf_file ("$am_file.am", FOREIGN, 'depcomp');
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             }
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     }
1370     my %done;
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};
1378         my $lang = $languages{$extension_map{$ext}};
1380         my $rule_file = $lang->rule_file || 'depend2';
1382         # Get information on $LANG.
1383         my $pfx = $lang->autodep;
1384         my $fpfx = ($pfx eq '') ? 'CC' : $pfx;
1386         my ($AMDEP, $FASTDEP) =
1387           (option 'no-dependencies' || $lang->autodep eq 'no')
1388           ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx");
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 ();
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                         );
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');
1423             # Compute a possible derived extension.
1424             # This is not used by depend2.am.
1425             my $der_ext = (&{$lang->output_extensions} ($ext))[0];
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,
1454                              'DERIVED-EXT' => $der_ext,
1456                              DEPBASE   => $depbase,
1457                              BASE      => '$*',
1458                              SOURCE    => '$<',
1459                              SOURCEFLAG => $sourceflags{$ext} || '',
1460                              OBJ       => '$@',
1461                              OBJOBJ    => '$@',
1462                              LTOBJ     => '$@',
1464                              COMPILE   => '$(' . $lang->compiler . ')',
1465                              LTCOMPILE => '$(LT' . $lang->compiler . ')',
1466                              -o        => $output_flag,
1467                              SUBDIROBJ => !! option 'subdir-objects');
1468         }
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;
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;
1482             prog_error ("found " . $lang->name .
1483                         " in handle_languages, but compiler not defined")
1484               unless defined $lang->compile;
1486             my $obj_compile = $lang->compile;
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               }
1497             my $libtool_tag = '';
1498             if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag})
1499               {
1500                 $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
1501               }
1503             my $ptltflags = "${derived}_LIBTOOLFLAGS";
1504             $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags;
1506             my $ltverbose = define_verbose_libtool ();
1507             my $obj_ltcompile =
1508               "\$(LIBTOOL) $ltverbose $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) "
1509               . "--mode=compile $obj_compile";
1511             # We _need_ `-o' for per object rules.
1512             my $output_flag = $lang->output_flag || '-o';
1514             my $depbase = dirname ($obj);
1515             $depbase = ''
1516                 if $depbase eq '.';
1517             $depbase .= '/'
1518                 unless $depbase eq '';
1519             $depbase .= '$(DEPDIR)/' . basename ($obj);
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/;
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_);
1588                     $output_rules .=
1589                       file_contents ($rule_file,
1590                                      new Automake::Location,
1591                                      %transform,
1592                                      GENERIC   => 0,
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",
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               }
1612             $output_rules .=
1613               file_contents ($rule_file,
1614                              new Automake::Location,
1615                              %transform,
1616                              GENERIC   => 0,
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",
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         }
1638         # The rest of the loop is done once per language.
1639         next if defined $done{$lang};
1640         $done{$lang} = 1;
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);
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;
1657         define_compiler_variable ($lang)
1658           if ($lang->compile);
1660         define_linker_variable ($lang)
1661           if ($lang->link);
1663         require_variables ("$am_file.am", $lang->Name . " source seen",
1664                            TRUE, @{$lang->config_vars});
1666         # Call the finisher.
1667         $lang->finish;
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;
1675         check_user_variables @dont_override;
1676     }
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;
1684     if ($needs_c)
1685       {
1686         &define_compiler_variable ($languages{'c'})
1687           unless defined $done{$languages{'c'}};
1688         define_linker_variable ($languages{'c'});
1689       }
1691     # Always provide the user with `AM_V_GEN' for `silent-rules' mode.
1692     define_verbose_tagvar ('GEN');
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.
1702 # This is typically used on all filenames of *_PROGRAMS, and filenames
1703 # of TESTS that are programs.
1704 sub append_exeext (&$)
1706   my ($pred, $macro) = @_;
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      });
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
1727   my ($one_file, $unxformed) = @_;
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         }
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     }
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 ($$$$$%)
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;
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;
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         }
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.
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;
1811         # We must generate a rule for the object if it requires its own flags.
1812         my $renamed = 0;
1813         my ($linker, $object);
1815         # This records whether we've seen a derived source file (e.g.
1816         # yacc output).
1817         my $derived_source = 0;
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';
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);
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               }
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;
1861             # Now extract linker and other info.
1862             $linker = $lang->linker;
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;
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.
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.
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;
1905                 prog_error ($lang->name . " flags defined without compiler")
1906                   if ! defined $lang->compile;
1908                 $renamed = 1;
1909             }
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             }
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                   }
1965                 if ($lang->ansi && option 'ansi2knr')
1966                   {
1967                     $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/;
1968                     $obj_sans_ext .= '$U';
1969                   }
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);
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                   }
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         }
2021         err_am "object `$object' created by `$full' and `$object_map{$object}'"
2022           if (defined $object_map{$object}
2023               && $object_map{$object} ne $full);
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;
2039         if (defined $lang)
2040         {
2041             # Let the language do some special magic if required.
2042             $lang->target_hook ($aggregate, $object, $full, %transform);
2043         }
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           }
2059         $linkers_used{$linker} = 1;
2061         push (@result, $object);
2063         if (! defined $object_map{$object})
2064         {
2065             my @dep_list = ();
2066             $object_map{$object} = $full;
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
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                   }
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;
2091                     # Remove any libtool object in this directory.
2092                     $libtool_clean_directories{$directory} = 1;
2093                 }
2095                 push (@dep_list, require_build_directory ($directory));
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             }
2105             &pretty_print_rule ($object . ':', "\t", @dep_list)
2106                 if scalar @dep_list > 0;
2107         }
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     }
2131     return @result;
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)
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
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 ($$$$$$$%)
2158   my ($var, $objvar, $nodefine, $one_file,
2159       $obj, $topparent, $where, %transform) = @_;
2161   my $needlinker = "";
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      });
2175   return $needlinker;
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 ($$$$%)
2192     # one_file is canonical name.  unxformed is given name.  obj is
2193     # object extension.
2194     my ($one_file, $unxformed, $obj, $where, %transform) = @_;
2196     my $linker = '';
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');
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;
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;
2217         # Keep track of which prefixes we saw.
2218         $used_pfx{$xpfx} = 1
2219           unless $prefix =~ /EXTRA_/;
2221         push @sources, "\$($varname)";
2222         push @dist_sources, shadow_unconditionally ($varname, $where)
2223           unless (option ('no-dist') || $prefix =~ /^nodist_/);
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     }
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           }
2274         &define_variable ($one_file . "_SOURCES", $default_source, $where);
2275         push (@sources, $default_source);
2276         push (@dist_sources, $default_source);
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     }
2293     # If we want to use `LINK' we must make sure it is defined.
2294     if ($linker eq '')
2295     {
2296         $need_link = 1;
2297     }
2299     return $linker;
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
2313   my ($xname, $varname) = @_;
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_';
2322   my $seen_libobjs = 0;
2323   my $flagvar = 0;
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) = @_;
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      });
2382   return $seen_libobjs;
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 ($)
2391   my ($var) = @_;
2393   my $dir = '';
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     }
2423   return $dir;
2426 sub handle_LIBOBJS ($$$)
2428   my ($var, $cond, $lt) = @_;
2429   my $myobjext = $lt ? 'lo' : 'o';
2430   $lt ||= '';
2432   $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS')
2433     if ! keys %libsources;
2435   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}LIBOBJS";
2437   foreach my $iter (keys %libsources)
2438     {
2439       if ($iter =~ /\.[cly]$/)
2440         {
2441           &saw_extension ($&);
2442           &saw_extension ('.c');
2443         }
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     }
2465 sub handle_ALLOCA ($$$)
2467   my ($var, $cond, $lt) = @_;
2468   my $myobjext = $lt ? 'lo' : 'o';
2469   $lt ||= '';
2470   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}ALLOCA";
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');
2478 # Canonicalize the input parameter
2479 sub canonicalize
2481     my ($string) = @_;
2482     $string =~ tr/A-Za-z0-9_\@/_/c;
2483     return $string;
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
2491   my ($name, @suffixes) = @_;
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     }
2502   return $xname;
2506 # handle_compile ()
2507 # -----------------
2508 # Set up the compile suite.
2509 sub handle_compile ()
2511     return
2512       unless $get_object_extension_was_run;
2514     # Boilerplate.
2515     my $default_includes = '';
2516     if (! option 'nostdinc')
2517       {
2518         my @incs = ('-I.', subst ('am__isrc'));
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       }
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     }
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";
2562     # Check for automatic de-ANSI-fication.
2563     if (option 'ansi2knr')
2564       {
2565         my ($ansi2knr_filename, $ansi2knr_where) = @{option 'ansi2knr'};
2566         my $ansi2knr_dir = '';
2568         require_variables ($ansi2knr_where, "option `ansi2knr' is used",
2569                            TRUE, "ANSI2KNR", "U");
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');
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           }
2588         $output_rules .= &file_contents ('ansi2knr',
2589                                          new Automake::Location,
2590                                          'ANSI2KNR-DIR' => $ansi2knr_dir);
2592     }
2595 # handle_libtool ()
2596 # -----------------
2597 # Handle libtool rules.
2598 sub handle_libtool
2600   return unless var ('LIBTOOL');
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;
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     }
2616   check_user_variables 'LIBTOOLFLAGS';
2618   # Output the libtool compilation rules.
2619   $output_rules .= &file_contents ('libtool',
2620                                    new Automake::Location,
2621                                    LTRMS => join ("\n", @libtool_rms));
2624 # handle_programs ()
2625 # ------------------
2626 # Handle C programs.
2627 sub handle_programs
2629   my @proglist = &am_install_var ('progs', 'PROGRAMS',
2630                                   'bin', 'sbin', 'libexec', 'pkglibexec',
2631                                   'noinst', 'check');
2632   return if ! @proglist;
2634   my $seen_global_libobjs =
2635     var ('LDADD') && &handle_lib_objects ('', 'LDADD');
2637   foreach my $pair (@proglist)
2638     {
2639       my ($where, $one_file) = @$pair;
2641       my $seen_libobjs = 0;
2642       my $obj = get_object_extension '.$(OBJEXT)';
2644       $known_programs{$one_file} = $where;
2646       # Canonicalize names and check for misspellings.
2647       my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
2648                                              '_SOURCES', '_OBJECTS',
2649                                              '_DEPENDENCIES');
2651       $where->push_context ("while processing program `$one_file'");
2652       $where->set (INTERNAL->get);
2654       my $linker = &handle_source_transform ($xname, $one_file, $obj, $where,
2655                                              NONLIBTOOL => 1, LIBTOOL => 0);
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);
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         }
2674       reject_var ($xname . '_LIBADD',
2675                   "use `${xname}_LDADD', not `${xname}_LIBADD'");
2677       set_seen ($xname . '_DEPENDENCIES');
2678       set_seen ($xname . '_LDFLAGS');
2680       # Determine program to use for link.
2681       my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xname);
2682       $vlink = verbose_flag ($vlink || 'GEN');
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);
2688       $libtool_clean_directories{dirname ($one_file)} = 1;
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)');
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     }
2714 # handle_libraries ()
2715 # -------------------
2716 # Handle libraries.
2717 sub handle_libraries
2719   my @liblist = &am_install_var ('libs', 'LIBRARIES',
2720                                  'lib', 'pkglib', 'noinst', 'check');
2721   return if ! @liblist;
2723   my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
2724                                     'noinst', 'check');
2726   if (@prefix)
2727     {
2728       my $var = rvar ($prefix[0] . '_LIBRARIES');
2729       $var->requires_variables ('library used', 'RANLIB');
2730     }
2732   &define_variable ('AR', 'ar', INTERNAL);
2733   &define_variable ('ARFLAGS', 'cru', INTERNAL);
2734   &define_verbose_tagvar ('AR');
2736   foreach my $pair (@liblist)
2737     {
2738       my ($where, $onelib) = @$pair;
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         }
2753       ($known_libraries{$onelib} = $bn) =~ s/\.a$//;
2755       $where->push_context ("while processing library `$onelib'");
2756       $where->set (INTERNAL->get);
2758       my $obj = get_object_extension '.$(OBJEXT)';
2760       # Canonicalize names and check for misspellings.
2761       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
2762                                             '_OBJECTS', '_DEPENDENCIES',
2763                                             '_AR');
2765       if (! var ($xlib . '_AR'))
2766         {
2767           &define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where);
2768         }
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         }
2784       reject_var ($xlib . '_LDADD',
2785                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2787       # Make sure we at look at this.
2788       set_seen ($xlib . '_DEPENDENCIES');
2790       &handle_source_transform ($xlib, $onelib, $obj, $where,
2791                                 NONLIBTOOL => 1, LIBTOOL => 0);
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 ();
2799       $output_rules .= &file_contents ('library',
2800                                        $where,
2801                                        VERBOSE  => $verbose,
2802                                        SILENT   => $silent,
2803                                        LIBRARY  => $onelib,
2804                                        XLIBRARY => $xlib,
2805                                        DIRSTAMP => $dirstamp);
2807       if ($seen_libobjs)
2808         {
2809           if (var ($xlib . '_LIBADD'))
2810             {
2811               &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2812             }
2813         }
2814     }
2818 # handle_ltlibraries ()
2819 # ---------------------
2820 # Handle shared libraries.
2821 sub handle_ltlibraries
2823   my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES',
2824                                  'noinst', 'lib', 'pkglib', 'check');
2825   return if ! @liblist;
2827   my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
2828                                     'noinst', 'check');
2830   if (@prefix)
2831     {
2832       my $var = rvar ($prefix[0] . '_LTLIBRARIES');
2833       $var->requires_variables ('Libtool library used', 'LIBTOOL');
2834     }
2836   my %instdirs = ();
2837   my %instsubdirs = ();
2838   my %instconds = ();
2839   my %liblocations = ();        # Location (in Makefile.am) of each library.
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');
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);
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";
2881                    error ($where, "`$val' should be $dirtxt$dircond ...",
2882                           partial => 1);
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";
2892                    my $onlyone = ($dir ne $adir) ?
2893                      ("\nLibtool libraries can be built for only one "
2894                       . "destination.") : "";
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     }
2917   foreach my $pair (@liblist)
2918     {
2919       my ($where, $onelib) = @$pair;
2921       my $seen_libobjs = 0;
2922       my $obj = get_object_extension '.lo';
2924       # Canonicalize names and check for misspellings.
2925       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
2926                                             '_SOURCES', '_OBJECTS',
2927                                             '_DEPENDENCIES');
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         }
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         }
2960       ($known_libraries{$onelib} = $bn) =~ s/\.la$//;
2962       $where->push_context ("while processing Libtool library `$onelib'");
2963       $where->set (INTERNAL->get);
2965       # Make sure we look at these.
2966       set_seen ($xlib . '_LDFLAGS');
2967       set_seen ($xlib . '_DEPENDENCIES');
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         }
2983       reject_var ("${xlib}_LDADD",
2984                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2987       my $linker = &handle_source_transform ($xlib, $onelib, $obj, $where,
2988                                              NONLIBTOOL => 0, LIBTOOL => 1);
2990       # Determine program to use for link.
2991       my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xlib);
2992       $vlink = verbose_flag ($vlink || 'GEN');
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         }
3028       # If the resulting library lies into a subdirectory,
3029       # make sure this directory will exist.
3030       my $dirstamp = require_build_directory_maybe ($onelib);
3032       # Remember to cleanup .libs/ in this directory.
3033       my $dirname = dirname $onelib;
3034       $libtool_clean_directories{$dirname} = 1;
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     }
3054 # See if any _SOURCES variable were misspelled.
3055 sub check_typos ()
3057   # It is ok if the user sets this particular variable.
3058   set_seen 'AM_LDFLAGS';
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};
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     }
3081 # Handle scripts.
3082 sub handle_scripts
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');
3095 ## ------------------------ ##
3096 ## Handling Texinfo files.  ##
3097 ## ------------------------ ##
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 ($)
3107   my ($filename) = @_;
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
3128   my $texi = new Automake::XFile "< $filename";
3129   verb "reading $filename";
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;
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         }
3156       # Try to find new or unused indexes.
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         }
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         }
3172     }
3174   if (! $outfile)
3175     {
3176       err_am "`$filename' missing \@setfilename";
3177       return;
3178     }
3180   my $infobase = basename ($filename);
3181   $infobase =~ s/\.te?xi(nfo)?$//;
3182   return ($outfile, $vfile,
3183           map { "$infobase.$_" } (sort keys %clean_suffixes));
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 ($$$@)
3196   my ($source, $dest, $insrc, @deps) = @_;
3198   # Split `a.texi' into `a' and `.texi'.
3199   my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/);
3200   my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/);
3202   $ssfx ||= "";
3203   $dsfx ||= "";
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     }
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;
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;
3251   # If the resulting file lie into a subdirectory,
3252   # make sure this directory will exist.
3253   my $dirstamp = require_build_directory_maybe ($dest);
3255   my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx;
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");
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 ($)
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) = ('', '', '');
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) . ')$';
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)$//;
3306       if ($infobase eq $texi)
3307         {
3308           # FIXME: report line number.
3309           err_am "texinfo file `$texi' has unrecognized extension";
3310           next;
3311         }
3313       push @infobase, $infobase;
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);
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;
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;
3431       my $soutdir = '$(srcdir)/' . $outdir;
3432       $outdir = $soutdir if $insrc;
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;
3439       my $canonical = canonicalize ($infobase);
3440       if (var ($canonical . "_TEXINFOS"))
3441         {
3442           push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
3443           push_dist_common ('$(' . $canonical . '_TEXINFOS)');
3444         }
3446       my ($dirstamp, @cfiles) =
3447         output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps);
3448       push (@texi_cleans, @cfiles);
3450       push (@info_deps_list, $out_file);
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;
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;
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             }
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     }
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);
3526   push (@dist_targets, 'dist-info');
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     }
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);
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);
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     }
3563   return (makefile_wrap ("", "\t  ", @mostly_cleans),
3564           makefile_wrap ("", "\t  ", @texi_cleans),
3565           makefile_wrap ("", "\t  ", @maint_cleans));
3569 # handle_texinfo ()
3570 # -----------------
3571 # Handle all Texinfo source.
3572 sub handle_texinfo ()
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";
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     }
3588   $output_rules .=  file_contents ('texinfos',
3589                                    new Automake::Location,
3590                                    MOSTLYCLEAN   => $mostlyclean,
3591                                    TEXICLEAN     => $clean,
3592                                    MAINTCLEAN    => $maintclean,
3593                                    'LOCAL-TEXIS' => !!$info_texinfos);
3597 # Handle any man pages.
3598 sub handle_man_pages
3600   reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'";
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                     }
3632                   &push_dist_common ($varname)
3633                     if $pfx eq 'dist_';
3634                 }
3635             }
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                 }
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     }
3673   return unless %sections;
3675   my @unsorted_deps;
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;
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     }
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");
3732   push (@all, '$(MANS)')
3733     unless option 'no-installman';
3736 # Handle DATA variables.
3737 sub handle_data
3739     &am_install_var ('-noextra', '-candist', 'data', 'DATA',
3740                      'data', 'dataroot', 'doc', 'dvi', 'html', 'pdf',
3741                      'ps', 'sysconf', 'sharedstate', 'localstate',
3742                      'pkgdata', 'lisp', 'noinst', 'check');
3745 # Handle TAGS.
3746 sub handle_tags
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');
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     }
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");
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     }
3815 # Handle multilib support.
3816 sub handle_multilib
3818   if ($seen_multilib && $relative_dir eq '.')
3819     {
3820       $output_rules .= &file_contents ('multilib', new Automake::Location);
3821       push (@all, 'all-multi');
3822     }
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 ($)
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;
3851 # $BOOLEAN
3852 # &for_dist_common ($A, $B)
3853 # -------------------------
3854 # Subroutine for &handle_dist: sort files to dist.
3856 # We put README first because it then becomes easier to make a
3857 # Usenet-compliant shar file (in these, README must be first).
3859 # FIXME: do more ordering of files here.
3860 sub for_dist_common
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;
3871 # handle_dist
3872 # -----------
3873 # Handle 'dist' target.
3874 sub handle_dist ()
3876   # Substitutions for distdir.am
3877   my %transform;
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.
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     }
3913   # The remaining definitions are only required when a dist target is used.
3914   return if option 'no-dist';
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     }
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         }
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     }
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     }
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);
3978   # Now that we've processed DIST_COMMON, disallow further attempts
3979   # to set it.
3980   $handle_dist_run = 1;
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');
3988   $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook';
3989   $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external;
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);
3998   my $flm = option ('filename-length-max');
3999   my $filename_filter = $flm ? '.' x $flm->[1] : '';
4001   $output_rules .= &file_contents ('distdir',
4002                                    new Automake::Location,
4003                                    %transform,
4004                                    FILENAME_FILTER => $filename_filter);
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 ($$)
4014   my ($dir, $where) = @_;
4016   error $where, "required directory $relative_dir/$dir does not exist"
4017     unless -d "$relative_dir/$dir";
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';
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/);
4046 # check_directories_in_var ($VARIABLE)
4047 # ------------------------------------
4048 # Recursively check all items in variables $VARIABLE as directories
4049 sub check_directories_in_var ($)
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);
4063 # &handle_subdirs ()
4064 # ------------------
4065 # Handle subdirectories.
4066 sub handle_subdirs ()
4068   my $subdirs = var ('SUBDIRS');
4069   return
4070     unless $subdirs;
4072   check_directories_in_var $subdirs;
4074   my $dsubdirs = var ('DIST_SUBDIRS');
4075   check_directories_in_var $dsubdirs
4076     if $dsubdirs;
4078   $output_rules .= &file_contents ('subdirs', new Automake::Location);
4079   rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross!
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 ()
4089   my $regen_aclocal = 0;
4091   set_seen 'CONFIG_STATUS_DEPENDENCIES';
4092   set_seen 'CONFIGURE_DEPENDENCIES';
4094   if (-f 'aclocal.m4')
4095     {
4096       &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL);
4098       my $aclocal = new Automake::XFile "< aclocal.m4";
4099       my $line = $aclocal->getline;
4100       $regen_aclocal = $line =~ 'generated automatically by aclocal';
4101     }
4103   my @ac_deps = ();
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     }
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.
4117   return ($regen_aclocal, @ac_deps);
4121 # Helper function for substitute_ac_subst_variables.
4122 sub substitute_ac_subst_variables_worker($)
4124   my ($token) = @_;
4125   return "\@$token\@" if var $token;
4126   return "\${$token\}";
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 ($)
4135   my ($text) = @_;
4136   $text =~ s/\${([^ \t=:+{}]+)}/&substitute_ac_subst_variables_worker ($1)/ge;
4137   return $text;
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 (@)
4150   my (@inputs) = @_;
4151   my @newinputs;
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;
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 ($@)
4176   my ($file, @inputs) = @_;
4177   my @res = ();
4179   for my $i (@inputs)
4180     {
4181       # We cannot create dependencies on shell variables.
4182       next if (substitute_ac_subst_variables $i) =~ /\$/;
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;
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 ($$$@)
4221   my ($makefile_am, $makefile_in, $makefile, @inputs) = @_;
4223   prog_error 'empty @inputs'
4224     unless @inputs;
4226   my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am,
4227                                                             $makefile_in);
4228   my $rel_makefile = basename $makefile;
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);
4242   my $automake_options = '--' . (global_option 'cygnus' ? 'cygnus' : $strictness_name)
4243                          . (global_option 'no-dependencies' ? ' --ignore-deps' : '');
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'));
4259   if ($relative_dir eq '.')
4260     {
4261       &push_dist_common ('acconfig.h')
4262         if -f 'acconfig.h';
4263     }
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);
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             }
4301           # This will also distribute all inputs.
4302           @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins);
4304           # Cannot define rebuild rules for filenames with shell variables.
4305           next if (substitute_ac_subst_variables $config_h_path) =~ /\$/;
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             }
4318           push_dist_common (@files);
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             }
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");
4337           push @distclean_config, $cn_sans_dir, $stamp;
4338         }
4339     }
4341   $output_rules .= file_contents ('clean-hdr',
4342                                   new Automake::Location,
4343                                   FILES => "@distclean_config")
4344     if @distclean_config;
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     }
4366   reject_var ('CONFIG_HEADER',
4367               "`CONFIG_HEADER' is an anachronism; now determined "
4368               . "automatically\nfrom `$configure_ac'");
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;
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         }
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';
4414       my $local = basename ($file);
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         }
4433       my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs);
4435       # Cannot output rules for shell variables.
4436       next if (substitute_ac_subst_variables $local) =~ /\$/;
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     }
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};
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         }
4497       # Do not process sources that contain shell variables.
4498       if ((substitute_ac_subst_variables $file) !~ /\$/)
4499         {
4500           my $fd = dirname ($file);
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     }
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);
4523 # Handle C headers.
4524 sub handle_headers
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     }
4536 sub handle_gettext
4538   return if ! $seen_gettext || $relative_dir ne '.';
4540   my $subdirs = var 'SUBDIRS';
4542   if (! $subdirs)
4543     {
4544       err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined";
4545       return;
4546     }
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.
4565   if (-d 'po')
4566     {
4567       my @subdirs = $subdirs->value_as_list_recursive;
4569       msg_var ('syntax', $subdirs,
4570                "AM_GNU_GETTEXT used but `po' not in SUBDIRS")
4571         if ! grep ($_ eq 'po', @subdirs);
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));
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     }
4589   require_file ($ac_gettext_location, GNU, 'ABOUT-NLS');
4592 # Handle footer elements.
4593 sub handle_footer
4595     reject_rule ('.SUFFIXES',
4596                  "use variable `SUFFIXES', not target `.SUFFIXES'");
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 : ());
4616         my %suffixes = map { $_ => 1 } @suffixes;
4617         delete @suffixes{@user_suffixes};
4619         $output_header .= (".SUFFIXES: "
4620                            . join (' ', @user_suffixes, sort keys %suffixes)
4621                            . "\n");
4622     }
4624     $output_trailer .= file_contents ('footer', new Automake::Location);
4628 # Generate `make install' rules.
4629 sub handle_install ()
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') || '');
4644 # Deal with all and all-am.
4645 sub handle_all ($)
4647     my ($makefile) = @_;
4649     # Output `all-am'.
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));
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       }
4663     # Install `all' hooks.
4664     push (@all, "all-local")
4665       if user_phony_rule "all-local";
4667     &pretty_print_rule ("all-am:", "\t\t", @all);
4668     &depend ('.PHONY', 'all-am', 'all');
4671     # Output `all'.
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       }
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       }
4706 # &do_check_merge_target ()
4707 # -------------------------
4708 # Handle check merge target specially.
4709 sub do_check_merge_target ()
4711   # Include user-defined local form of target.
4712   push @check_tests, 'check-local'
4713     if user_phony_rule 'check-local';
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     }
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');
4753 # handle_clean ($MAKEFILE)
4754 # ------------------------
4755 # Handle all 'clean' targets.
4756 sub handle_clean ($)
4758   my ($makefile) = @_;
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');
4770   # Built sources are automatically removed by maintainer-clean.
4771   $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN
4772     if var ('BUILT_SOURCES');
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, []);
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};
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*$/);
4791       push @{$rms{$when}}, "\t-$rm\n";
4792     }
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      );
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
4812   return 0 if $a eq $b;
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;
4825 # &handle_factored_dependencies ()
4826 # --------------------------------
4827 # Handle everything related to gathered targets.
4828 sub handle_factored_dependencies
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     }
4844   reject_rule ('install-local',
4845                "use `install-data-local' or `install-exec-local', "
4846                . "not `install-local'");
4848   reject_rule ('install-hook',
4849                "use `install-data-hook' or `install-exec-hook', "
4850                . "not `install-hook'");
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     }
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     }
4874   # All the required targets are phony.
4875   depend ('.PHONY', keys %required_targets);
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{$_});
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     }
4913 # &handle_tests_dejagnu ()
4914 # ------------------------
4915 sub handle_tests_dejagnu
4917     push (@check_tests, 'check-DEJAGNU');
4918     $output_rules .= file_contents ('dejagnu', new Automake::Location);
4921 # is_valid_test_extension ($EXT)
4922 # ------------------------------
4923 # Return true if $EXT can appear in $(TEST_EXTENSIONS), return false
4924 # otherwise.
4925 sub is_valid_test_extension ($)
4927   my $ext = shift;
4928   return 1
4929     if ($ext =~ /^\.[a-zA-Z_][a-zA-Z0-9_]*$/);
4930   return 1
4931     if (exists $configure_vars{'EXEEXT'} && $ext eq subst ('EXEEXT'));
4932   return 0;
4935 # Handle TESTS variable and other checks.
4936 sub handle_tests
4938   if (option 'dejagnu')
4939     {
4940       &handle_tests_dejagnu;
4941     }
4942   else
4943     {
4944       foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
4945         {
4946           reject_var ($c, "`$c' defined but `dejagnu' not in "
4947                       . "`AUTOMAKE_OPTIONS'");
4948         }
4949     }
4951   if (var ('TESTS'))
4952     {
4953       push (@check_tests, 'check-TESTS');
4954       $output_rules .= &file_contents ('check', new Automake::Location,
4955                                        COLOR => !! option 'color-tests',
4956                                        PARALLEL_TESTS => !! option 'parallel-tests');
4958       # Tests that are known programs should have $(EXEEXT) appended.
4959       # For matching purposes, we need to adjust XFAIL_TESTS as well.
4960       append_exeext { exists $known_programs{$_[0]} } 'TESTS';
4961       append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS'
4962         if (var ('XFAIL_TESTS'));
4964       if (option 'parallel-tests')
4965         {
4966           define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL);
4967           define_variable ('TEST_SUITE_HTML', '$(TEST_SUITE_LOG:.log=.html)', INTERNAL);
4968           my $suff = '.test';
4969           my $at_exeext = '';
4970           my $handle_exeext = exists $configure_vars{'EXEEXT'};
4971           if ($handle_exeext)
4972             {
4973               $at_exeext = subst ('EXEEXT');
4974               $suff = $at_exeext  . ' ' . $suff;
4975             }
4976           if (! var 'TEST_EXTENSIONS')
4977             {
4978               define_variable ('TEST_EXTENSIONS', $suff, INTERNAL);
4979             }
4980           my $var = var 'TEST_EXTENSIONS';
4981           # Currently, we are not able to deal with conditional contents
4982           # in TEST_EXTENSIONS.
4983           if ($var->has_conditional_contents)
4984            {
4985              msg_var 'unsupported', $var,
4986                      "`TEST_EXTENSIONS' cannot have conditional contents";
4987            }
4988           my @test_suffixes = $var->value_as_list_recursive;
4989           if ((my @invalid_test_suffixes =
4990                   grep { !is_valid_test_extension $_ } @test_suffixes) > 0)
4991             {
4992               error $var->rdef (TRUE)->location,
4993                     "invalid test extensions: @invalid_test_suffixes";
4994             }
4995           @test_suffixes = grep { is_valid_test_extension $_ } @test_suffixes;
4996           if ($handle_exeext)
4997             {
4998               unshift (@test_suffixes, $at_exeext)
4999                 unless $test_suffixes[0] eq $at_exeext;
5000             }
5001           unshift (@test_suffixes, '');
5003           transform_variable_recursively
5004             ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL,
5005               sub {
5006                 my ($subvar, $val, $cond, $full_cond) = @_;
5007                 my $obj = $val;
5008                 return $obj
5009                   if $val =~ /^\@.*\@$/;
5010                 $obj =~ s/\$\(EXEEXT\)$//o;
5012                 if ($val =~ /(\$\((top_)?srcdir\))\//o)
5013                   {
5014                     msg ('error', $subvar->rdef ($cond)->location,
5015                          "parallel-tests: using `$1' in TESTS is currently broken: `$val'");
5016                   }
5018                 foreach my $test_suffix (@test_suffixes)
5019                   {
5020                     next
5021                       if $test_suffix eq $at_exeext || $test_suffix eq '';
5022                     return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log'
5023                       if substr ($obj, - length ($test_suffix)) eq $test_suffix;
5024                   }
5025                 $obj .= '.log';
5026                 my $compile = 'LOG_COMPILE';
5027                 define_variable ($compile,
5028                                  '$(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)', INTERNAL);
5029                 $output_rules .= file_contents ('check2', new Automake::Location,
5030                                                 GENERIC => 0,
5031                                                 OBJ => $obj,
5032                                                 SOURCE => $val,
5033                                                 COMPILE =>'$(' . $compile . ')',
5034                                                 EXT => '',
5035                                                 am__EXEEXT => 'FALSE');
5036                 return $obj;
5037               });
5039           my $nhelper=1;
5040           my $prev = 'TESTS';
5041           my $post = '';
5042           my $last_suffix = $test_suffixes[$#test_suffixes];
5043           my $cur = '';
5044           foreach my $test_suffix (@test_suffixes)
5045             {
5046               if ($test_suffix eq $last_suffix)
5047                 {
5048                   $cur = 'TEST_LOGS';
5049                 }
5050               else
5051                 {
5052                   $cur = 'am__test_logs' . $nhelper;
5053                 }
5054               define_variable ($cur,
5055                 '$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL);
5056               $post = '.log';
5057               $prev = $cur;
5058               $nhelper++;
5059               if ($test_suffix ne $at_exeext && $test_suffix ne '')
5060                 {
5061                   (my $ext = $test_suffix) =~ s/^\.//;
5062                   $ext = uc $ext;
5063                   my $compile = $ext . '_LOG_COMPILE';
5064                   define_variable ($compile,
5065                                    '$(' . $ext . '_LOG_COMPILER) $(AM_' .  $ext . '_LOG_FLAGS)'
5066                                    . ' $(' . $ext . '_LOG_FLAGS)', INTERNAL);
5067                   my $am_exeext = $handle_exeext ? 'am__EXEEXT' : 'FALSE';
5068                   $output_rules .= file_contents ('check2', new Automake::Location,
5069                                                   GENERIC => 1,
5070                                                   OBJ => '',
5071                                                   SOURCE => '$<',
5072                                                   COMPILE => '$(' . $compile . ')',
5073                                                   EXT => $test_suffix,
5074                                                   am__EXEEXT => $am_exeext);
5075                 }
5076             }
5078           define_variable ('TEST_LOGS_TMP', '$(TEST_LOGS:.log=.log-t)', INTERNAL);
5080           $clean_files{'$(TEST_LOGS_TMP)'} = MOSTLY_CLEAN;
5081           $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN;
5082           $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN;
5083           $clean_files{'$(TEST_SUITE_HTML)'} = MOSTLY_CLEAN;
5084         }
5085     }
5088 # Handle Emacs Lisp.
5089 sub handle_emacs_lisp
5091   my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP',
5092                                  'lisp', 'noinst');
5094   return if ! @elfiles;
5096   define_pretty_variable ('am__ELFILES', TRUE, INTERNAL,
5097                           map { $_->[1] } @elfiles);
5098   define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL,
5099                           '$(am__ELFILES:.el=.elc)');
5100   # This one can be overridden by users.
5101   define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)');
5103   push @all, '$(ELCFILES)';
5105   require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
5106                      'EMACS', 'lispdir');
5107   require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp');
5108   &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL);
5111 # Handle Python
5112 sub handle_python
5114   my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON',
5115                                  'noinst');
5116   return if ! @pyfiles;
5118   require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
5119   require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
5120   &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
5123 # Handle Java.
5124 sub handle_java
5126     my @sourcelist = &am_install_var ('-candist',
5127                                       'java', 'JAVA',
5128                                       'noinst', 'check');
5129     return if ! @sourcelist;
5131     my @prefixes = am_primary_prefixes ('JAVA', 1,
5132                                         'noinst', 'check');
5134     my $dir;
5135     my @java_sources = ();
5136     foreach my $prefix (@prefixes)
5137       {
5138         (my $curs = $prefix) =~ s/^(?:nobase_)?(?:dist_|nodist_)?//;
5140         next
5141           if $curs eq 'EXTRA';
5143         push @java_sources, '$(' . $prefix . '_JAVA' . ')';
5145         if (defined $dir)
5146           {
5147             err_var "${curs}_JAVA", "multiple _JAVA primaries in use"
5148              unless $curs eq $dir;
5149           }
5151         $dir = $curs;
5152       }
5154     define_pretty_variable ('am__java_sources', TRUE, INTERNAL,
5155                             "@java_sources");
5157     if ($dir eq 'check')
5158       {
5159         push (@check, "class$dir.stamp");
5160       }
5161     else
5162       {
5163         push (@all, "class$dir.stamp");
5164       }
5168 # Handle some of the minor options.
5169 sub handle_minor_options
5171   if (option 'readme-alpha')
5172     {
5173       if ($relative_dir eq '.')
5174         {
5175           if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
5176             {
5177               msg ('error-gnits', $package_version_location,
5178                    "version `$package_version' doesn't follow " .
5179                    "Gnits standards");
5180             }
5181           if (defined $1 && -f 'README-alpha')
5182             {
5183               # This means we have an alpha release.  See
5184               # GNITS_VERSION_PATTERN for details.
5185               push_dist_common ('README-alpha');
5186             }
5187         }
5188     }
5191 ################################################################
5193 # ($OUTPUT, @INPUTS)
5194 # &split_config_file_spec ($SPEC)
5195 # -------------------------------
5196 # Decode the Autoconf syntax for config files (files, headers, links
5197 # etc.).
5198 sub split_config_file_spec ($)
5200   my ($spec) = @_;
5201   my ($output, @inputs) = split (/:/, $spec);
5203   push @inputs, "$output.in"
5204     unless @inputs;
5206   return ($output, @inputs);
5209 # $input
5210 # locate_am (@POSSIBLE_SOURCES)
5211 # -----------------------------
5212 # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in
5213 # This functions returns the first *.in file for which a *.am exists.
5214 # It returns undef otherwise.
5215 sub locate_am (@)
5217   my (@rest) = @_;
5218   my $input;
5219   foreach my $file (@rest)
5220     {
5221       if (($file =~ /^(.*)\.in$/) && -f "$1.am")
5222         {
5223           $input = $file;
5224           last;
5225         }
5226     }
5227   return $input;
5230 my %make_list;
5232 # &scan_autoconf_config_files ($WHERE, $CONFIG-FILES)
5233 # ---------------------------------------------------
5234 # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
5235 # (or AC_OUTPUT).
5236 sub scan_autoconf_config_files ($$)
5238   my ($where, $config_files) = @_;
5240   # Look at potential Makefile.am's.
5241   foreach (split ' ', $config_files)
5242     {
5243       # Must skip empty string for Perl 4.
5244       next if $_ eq "\\" || $_ eq '';
5246       # Handle $local:$input syntax.
5247       my ($local, @rest) = split (/:/);
5248       @rest = ("$local.in",) unless @rest;
5249       msg ('portability', $where,
5250           "Omit leading `./' from config file names such as `$local',"
5251           . "\nas not all make implementations treat `file' and `./file' equally.")
5252         if ($local =~ /^\.\//);
5253       my $input = locate_am @rest;
5254       if ($input)
5255         {
5256           # We have a file that automake should generate.
5257           $make_list{$input} = join (':', ($local, @rest));
5258         }
5259       else
5260         {
5261           # We have a file that automake should cause to be
5262           # rebuilt, but shouldn't generate itself.
5263           push (@other_input_files, $_);
5264         }
5265       $ac_config_files_location{$local} = $where;
5266       $ac_config_files_condition{$local} =
5267         new Automake::Condition (@cond_stack)
5268           if (@cond_stack);
5269     }
5273 # &scan_autoconf_traces ($FILENAME)
5274 # ---------------------------------
5275 sub scan_autoconf_traces ($)
5277   my ($filename) = @_;
5279   # Macros to trace, with their minimal number of arguments.
5280   #
5281   # IMPORTANT: If you add a macro here, you should also add this macro
5282   # =========  to Automake-preselection in autoconf/lib/autom4te.in.
5283   my %traced = (
5284                 AC_CANONICAL_BUILD => 0,
5285                 AC_CANONICAL_HOST => 0,
5286                 AC_CANONICAL_TARGET => 0,
5287                 AC_CONFIG_AUX_DIR => 1,
5288                 AC_CONFIG_FILES => 1,
5289                 AC_CONFIG_HEADERS => 1,
5290                 AC_CONFIG_LIBOBJ_DIR => 1,
5291                 AC_CONFIG_LINKS => 1,
5292                 AC_FC_SRCEXT => 1,
5293                 AC_INIT => 0,
5294                 AC_LIBSOURCE => 1,
5295                 AC_REQUIRE_AUX_FILE => 1,
5296                 AC_SUBST_TRACE => 1,
5297                 AM_AUTOMAKE_VERSION => 1,
5298                 AM_CONDITIONAL => 2,
5299                 AM_ENABLE_MULTILIB => 0,
5300                 AM_GNU_GETTEXT => 0,
5301                 AM_GNU_GETTEXT_INTL_SUBDIR => 0,
5302                 AM_INIT_AUTOMAKE => 0,
5303                 AM_MAINTAINER_MODE => 0,
5304                 AM_PROG_CC_C_O => 0,
5305                 AM_SILENT_RULES => 0,
5306                 _AM_SUBST_NOTMAKE => 1,
5307                 _AM_COND_IF => 1,
5308                 _AM_COND_ELSE => 1,
5309                 _AM_COND_ENDIF => 1,
5310                 LT_SUPPORTED_TAG => 1,
5311                 _LT_AC_TAGCONFIG => 0,
5312                 m4_include => 1,
5313                 m4_sinclude => 1,
5314                 sinclude => 1,
5315               );
5317   my $traces = ($ENV{AUTOCONF} || '@am_AUTOCONF@') . " ";
5319   # Use a separator unlikely to be used, not `:', the default, which
5320   # has a precise meaning for AC_CONFIG_FILES and so on.
5321   $traces .= join (' ',
5322                    map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' }
5323                    (keys %traced));
5325   my $tracefh = new Automake::XFile ("$traces $filename |");
5326   verb "reading $traces";
5328   @cond_stack = ();
5329   my $where;
5331   while ($_ = $tracefh->getline)
5332     {
5333       chomp;
5334       my ($here, $depth, @args) = split (/::/);
5335       $where = new Automake::Location $here;
5336       my $macro = $args[0];
5338       prog_error ("unrequested trace `$macro'")
5339         unless exists $traced{$macro};
5341       # Skip and diagnose malformed calls.
5342       if ($#args < $traced{$macro})
5343         {
5344           msg ('syntax', $where, "not enough arguments for $macro");
5345           next;
5346         }
5348       # Alphabetical ordering please.
5349       if ($macro eq 'AC_CANONICAL_BUILD')
5350         {
5351           if ($seen_canonical <= AC_CANONICAL_BUILD)
5352             {
5353               $seen_canonical = AC_CANONICAL_BUILD;
5354               $canonical_location = $where;
5355             }
5356         }
5357       elsif ($macro eq 'AC_CANONICAL_HOST')
5358         {
5359           if ($seen_canonical <= AC_CANONICAL_HOST)
5360             {
5361               $seen_canonical = AC_CANONICAL_HOST;
5362               $canonical_location = $where;
5363             }
5364         }
5365       elsif ($macro eq 'AC_CANONICAL_TARGET')
5366         {
5367           $seen_canonical = AC_CANONICAL_TARGET;
5368           $canonical_location = $where;
5369         }
5370       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
5371         {
5372           if ($seen_init_automake)
5373             {
5374               error ($where, "AC_CONFIG_AUX_DIR must be called before "
5375                      . "AM_INIT_AUTOMAKE...", partial => 1);
5376               error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here");
5377             }
5378           $config_aux_dir = $args[1];
5379           $config_aux_dir_set_in_configure_ac = 1;
5380           $relative_dir = '.';
5381           check_directory ($config_aux_dir, $where);
5382         }
5383       elsif ($macro eq 'AC_CONFIG_FILES')
5384         {
5385           # Look at potential Makefile.am's.
5386           scan_autoconf_config_files ($where, $args[1]);
5387         }
5388       elsif ($macro eq 'AC_CONFIG_HEADERS')
5389         {
5390           foreach my $spec (split (' ', $args[1]))
5391             {
5392               my ($dest, @src) = split (':', $spec);
5393               $ac_config_files_location{$dest} = $where;
5394               push @config_headers, $spec;
5395             }
5396         }
5397       elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR')
5398         {
5399           $config_libobj_dir = $args[1];
5400           $relative_dir = '.';
5401           check_directory ($config_libobj_dir, $where);
5402         }
5403       elsif ($macro eq 'AC_CONFIG_LINKS')
5404         {
5405           foreach my $spec (split (' ', $args[1]))
5406             {
5407               my ($dest, $src) = split (':', $spec);
5408               $ac_config_files_location{$dest} = $where;
5409               push @config_links, $spec;
5410             }
5411         }
5412       elsif ($macro eq 'AC_FC_SRCEXT')
5413         {
5414           my $suffix = $args[1];
5415           # These flags are used as %SOURCEFLAG% in depend2.am,
5416           # where the trailing space is important.
5417           $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') '
5418             if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08');
5419         }
5420       elsif ($macro eq 'AC_INIT')
5421         {
5422           if (defined $args[2])
5423             {
5424               $package_version = $args[2];
5425               $package_version_location = $where;
5426             }
5427         }
5428       elsif ($macro eq 'AC_LIBSOURCE')
5429         {
5430           $libsources{$args[1]} = $here;
5431         }
5432       elsif ($macro eq 'AC_REQUIRE_AUX_FILE')
5433         {
5434           # Only remember the first time a file is required.
5435           $required_aux_file{$args[1]} = $where
5436             unless exists $required_aux_file{$args[1]};
5437         }
5438       elsif ($macro eq 'AC_SUBST_TRACE')
5439         {
5440           # Just check for alphanumeric in AC_SUBST_TRACE.  If you do
5441           # AC_SUBST(5), then too bad.
5442           $configure_vars{$args[1]} = $where
5443             if $args[1] =~ /^\w+$/;
5444         }
5445       elsif ($macro eq 'AM_AUTOMAKE_VERSION')
5446         {
5447           error ($where,
5448                  "version mismatch.  This is Automake $VERSION,\n" .
5449                  "but the definition used by this AM_INIT_AUTOMAKE\n" .
5450                  "comes from Automake $args[1].  You should recreate\n" .
5451                  "aclocal.m4 with aclocal and run automake again.\n",
5452                  # $? = 63 is used to indicate version mismatch to missing.
5453                  exit_code => 63)
5454             if $VERSION ne $args[1];
5456           $seen_automake_version = 1;
5457         }
5458       elsif ($macro eq 'AM_CONDITIONAL')
5459         {
5460           $configure_cond{$args[1]} = $where;
5461         }
5462       elsif ($macro eq 'AM_ENABLE_MULTILIB')
5463         {
5464           $seen_multilib = $where;
5465         }
5466       elsif ($macro eq 'AM_GNU_GETTEXT')
5467         {
5468           $seen_gettext = $where;
5469           $ac_gettext_location = $where;
5470           $seen_gettext_external = grep ($_ eq 'external', @args);
5471         }
5472       elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR')
5473         {
5474           $seen_gettext_intl = $where;
5475         }
5476       elsif ($macro eq 'AM_INIT_AUTOMAKE')
5477         {
5478           $seen_init_automake = $where;
5479           if (defined $args[2])
5480             {
5481               $package_version = $args[2];
5482               $package_version_location = $where;
5483             }
5484           elsif (defined $args[1])
5485             {
5486               exit $exit_code
5487                 if (process_global_option_list ($where,
5488                                                 split (' ', $args[1])));
5489             }
5490         }
5491       elsif ($macro eq 'AM_MAINTAINER_MODE')
5492         {
5493           $seen_maint_mode = $where;
5494         }
5495       elsif ($macro eq 'AM_PROG_CC_C_O')
5496         {
5497           $seen_cc_c_o = $where;
5498         }
5499       elsif ($macro eq 'AM_SILENT_RULES')
5500         {
5501           set_global_option ('silent-rules', $where);
5502         }
5503       elsif ($macro eq '_AM_COND_IF')
5504         {
5505           cond_stack_if ('', $args[1], $where);
5506           error ($where, "missing m4 quoting, macro depth $depth")
5507             if ($depth != 1);
5508         }
5509       elsif ($macro eq '_AM_COND_ELSE')
5510         {
5511           cond_stack_else ('!', $args[1], $where);
5512           error ($where, "missing m4 quoting, macro depth $depth")
5513             if ($depth != 1);
5514         }
5515       elsif ($macro eq '_AM_COND_ENDIF')
5516         {
5517           cond_stack_endif (undef, undef, $where);
5518           error ($where, "missing m4 quoting, macro depth $depth")
5519             if ($depth != 1);
5520         }
5521       elsif ($macro eq '_AM_SUBST_NOTMAKE')
5522         {
5523           $ignored_configure_vars{$args[1]} = $where;
5524         }
5525       elsif ($macro eq 'm4_include'
5526              || $macro eq 'm4_sinclude'
5527              || $macro eq 'sinclude')
5528         {
5529           # Skip missing `sinclude'd files.
5530           next if $macro ne 'm4_include' && ! -f $args[1];
5532           # Some modified versions of Autoconf don't use
5533           # frozen files.  Consequently it's possible that we see all
5534           # m4_include's performed during Autoconf's startup.
5535           # Obviously we don't want to distribute Autoconf's files
5536           # so we skip absolute filenames here.
5537           push @configure_deps, '$(top_srcdir)/' . $args[1]
5538             unless $here =~ m,^(?:\w:)?[\\/],;
5539           # Keep track of the greatest timestamp.
5540           if (-e $args[1])
5541             {
5542               my $mtime = mtime $args[1];
5543               $configure_deps_greatest_timestamp = $mtime
5544                 if $mtime > $configure_deps_greatest_timestamp;
5545             }
5546         }
5547       elsif ($macro eq 'LT_SUPPORTED_TAG')
5548         {
5549           $libtool_tags{$args[1]} = 1;
5550           $libtool_new_api = 1;
5551         }
5552       elsif ($macro eq '_LT_AC_TAGCONFIG')
5553         {
5554           # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5.
5555           # We use it to detect whether tags are supported.  Our
5556           # preferred interface is LT_SUPPORTED_TAG, but it was
5557           # introduced in Libtool 1.6.
5558           if (0 == keys %libtool_tags)
5559             {
5560               # Hardcode the tags supported by Libtool 1.5.
5561               %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1);
5562             }
5563         }
5564     }
5566   error ($where, "condition stack not properly closed")
5567     if (@cond_stack);
5569   $tracefh->close;
5573 # &scan_autoconf_files ()
5574 # -----------------------
5575 # Check whether we use `configure.ac' or `configure.in'.
5576 # Scan it (and possibly `aclocal.m4') for interesting things.
5577 # We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
5578 sub scan_autoconf_files ()
5580   # Reinitialize libsources here.  This isn't really necessary,
5581   # since we currently assume there is only one configure.ac.  But
5582   # that won't always be the case.
5583   %libsources = ();
5585   # Keep track of the youngest configure dependency.
5586   $configure_deps_greatest_timestamp = mtime $configure_ac;
5587   if (-e 'aclocal.m4')
5588     {
5589       my $mtime = mtime 'aclocal.m4';
5590       $configure_deps_greatest_timestamp = $mtime
5591         if $mtime > $configure_deps_greatest_timestamp;
5592     }
5594   scan_autoconf_traces ($configure_ac);
5596   @configure_input_files = sort keys %make_list;
5597   # Set input and output files if not specified by user.
5598   if (! @input_files)
5599     {
5600       @input_files = @configure_input_files;
5601       %output_files = %make_list;
5602     }
5605   if (! $seen_init_automake)
5606     {
5607       err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou "
5608               . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE,"
5609               . "\nthat aclocal.m4 is present in the top-level directory,\n"
5610               . "and that aclocal.m4 was recently regenerated "
5611               . "(using aclocal).");
5612     }
5613   else
5614     {
5615       if (! $seen_automake_version)
5616         {
5617           if (-f 'aclocal.m4')
5618             {
5619               error ($seen_init_automake,
5620                      "your implementation of AM_INIT_AUTOMAKE comes from " .
5621                      "an\nold Automake version.  You should recreate " .
5622                      "aclocal.m4\nwith aclocal and run automake again.\n",
5623                      # $? = 63 is used to indicate version mismatch to missing.
5624                      exit_code => 63);
5625             }
5626           else
5627             {
5628               error ($seen_init_automake,
5629                      "no proper implementation of AM_INIT_AUTOMAKE was " .
5630                      "found,\nprobably because aclocal.m4 is missing...\n" .
5631                      "You should run aclocal to create this file, then\n" .
5632                      "run automake again.\n");
5633             }
5634         }
5635     }
5637   locate_aux_dir ();
5639   # Reorder @input_files so that the Makefile that distributes aux
5640   # files is processed last.  This is important because each directory
5641   # can require auxiliary scripts and we should wait until they have
5642   # been installed before distributing them.
5644   # The Makefile.in that distribute the aux files is the one in
5645   # $config_aux_dir or the top-level Makefile.
5646   my $auxdirdist = is_make_dir ($config_aux_dir) ? $config_aux_dir : '.';
5647   my @new_input_files = ();
5648   while (@input_files)
5649     {
5650       my $in = pop @input_files;
5651       my @ins = split (/:/, $output_files{$in});
5652       if (dirname ($ins[0]) eq $auxdirdist)
5653         {
5654           push @new_input_files, $in;
5655           $automake_will_process_aux_dir = 1;
5656         }
5657       else
5658         {
5659           unshift @new_input_files, $in;
5660         }
5661     }
5662   @input_files = @new_input_files;
5664   # If neither the auxdir/Makefile nor the ./Makefile are generated
5665   # by Automake, we won't distribute the aux files anyway.  Assume
5666   # the user know what (s)he does, and pretend we will distribute
5667   # them to disable the error in require_file_internal.
5668   $automake_will_process_aux_dir = 1 if ! is_make_dir ($auxdirdist);
5670   # Look for some files we need.  Always check for these.  This
5671   # check must be done for every run, even those where we are only
5672   # looking at a subdir Makefile.  We must set relative_dir for
5673   # maybe_push_required_file to work.
5674   # Sort the files for stable verbose output.
5675   $relative_dir = '.';
5676   foreach my $file (sort keys %required_aux_file)
5677     {
5678       require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file)
5679     }
5680   err_am "`install.sh' is an anachronism; use `install-sh' instead"
5681     if -f $config_aux_dir . '/install.sh';
5683   # Preserve dist_common for later.
5684   $configure_dist_common = variable_value ('DIST_COMMON') || '';
5688 ################################################################
5690 # Set up for Cygnus mode.
5691 sub check_cygnus
5693   my $cygnus = option 'cygnus';
5694   return unless $cygnus;
5696   set_strictness ('foreign');
5697   set_option ('no-installinfo', $cygnus);
5698   set_option ('no-dependencies', $cygnus);
5699   set_option ('no-dist', $cygnus);
5701   err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified"
5702     if !$seen_maint_mode;
5705 # Do any extra checking for GNU standards.
5706 sub check_gnu_standards
5708   if ($relative_dir eq '.')
5709     {
5710       # In top level (or only) directory.
5711       require_file ("$am_file.am", GNU,
5712                     qw/INSTALL NEWS README AUTHORS ChangeLog/);
5714       # Accept one of these three licenses; default to COPYING.
5715       # Make sure we do not overwrite an existing license.
5716       my $license;
5717       foreach (qw /COPYING COPYING.LIB COPYING.LESSER/)
5718         {
5719           if (-f $_)
5720             {
5721               $license = $_;
5722               last;
5723             }
5724         }
5725       require_file ("$am_file.am", GNU, 'COPYING')
5726         unless $license;
5727     }
5729   for my $opt ('no-installman', 'no-installinfo')
5730     {
5731       msg ('error-gnu', option $opt,
5732            "option `$opt' disallowed by GNU standards")
5733         if option $opt;
5734     }
5737 # Do any extra checking for GNITS standards.
5738 sub check_gnits_standards
5740   if ($relative_dir eq '.')
5741     {
5742       # In top level (or only) directory.
5743       require_file ("$am_file.am", GNITS, 'THANKS');
5744     }
5747 ################################################################
5749 # Functions to handle files of each language.
5751 # Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
5752 # simple formula: Return value is LANG_SUBDIR if the resulting object
5753 # file should be in a subdir if the source file is, LANG_PROCESS if
5754 # file is to be dealt with, LANG_IGNORE otherwise.
5756 # Much of the actual processing is handled in
5757 # handle_single_transform.  These functions exist so that
5758 # auxiliary information can be recorded for a later cleanup pass.
5759 # Note that the calls to these functions are computed, so don't bother
5760 # searching for their precise names in the source.
5762 # This is just a convenience function that can be used to determine
5763 # when a subdir object should be used.
5764 sub lang_sub_obj
5766     return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS;
5769 # Rewrite a single C source file.
5770 sub lang_c_rewrite
5772   my ($directory, $base, $ext, $nonansi_obj, $have_per_exec_flags, $var) = @_;
5774   if (option 'ansi2knr' && $base =~ /_$/)
5775     {
5776       # FIXME: include line number in error.
5777       err_am "C source file `$base.c' would be deleted by ansi2knr rules";
5778     }
5780   my $r = LANG_PROCESS;
5781   if (option 'subdir-objects')
5782     {
5783       $r = LANG_SUBDIR;
5784       if ($directory && $directory ne '.')
5785         {
5786           $base = $directory . '/' . $base;
5788           # libtool is always able to put the object at the proper place,
5789           # so we do not have to require AM_PROG_CC_C_O when building .lo files.
5790           msg_var ('portability', $var,
5791                    "compiling `$base.c' in subdir requires "
5792                    . "`AM_PROG_CC_C_O' in `$configure_ac'",
5793                    uniq_scope => US_GLOBAL,
5794                    uniq_part => 'AM_PROG_CC_C_O subdir')
5795             unless $seen_cc_c_o || $nonansi_obj eq '.lo';
5796         }
5798       # In this case we already have the directory information, so
5799       # don't add it again.
5800       $de_ansi_files{$base} = '';
5801     }
5802   else
5803     {
5804       $de_ansi_files{$base} = (($directory eq '.' || $directory eq '')
5805                                ? ''
5806                                : "$directory/");
5807     }
5809   if (! $seen_cc_c_o
5810       && $have_per_exec_flags
5811       && ! option 'subdir-objects'
5812       && $nonansi_obj ne '.lo')
5813     {
5814       msg_var ('portability',
5815                $var, "compiling `$base.c' with per-target flags requires "
5816                . "`AM_PROG_CC_C_O' in `$configure_ac'",
5817                uniq_scope => US_GLOBAL,
5818                uniq_part => 'AM_PROG_CC_C_O per-target')
5819     }
5821     return $r;
5824 # Rewrite a single C++ source file.
5825 sub lang_cxx_rewrite
5827     return &lang_sub_obj;
5830 # Rewrite a single header file.
5831 sub lang_header_rewrite
5833     # Header files are simply ignored.
5834     return LANG_IGNORE;
5837 # Rewrite a single Vala source file.
5838 sub lang_vala_rewrite
5840     my ($directory, $base, $ext) = @_;
5842     (my $newext = $ext) =~ s/vala$/c/;
5843     return (LANG_SUBDIR, $newext);
5846 # Rewrite a single yacc file.
5847 sub lang_yacc_rewrite
5849     my ($directory, $base, $ext) = @_;
5851     my $r = &lang_sub_obj;
5852     (my $newext = $ext) =~ tr/y/c/;
5853     return ($r, $newext);
5856 # Rewrite a single yacc++ file.
5857 sub lang_yaccxx_rewrite
5859     my ($directory, $base, $ext) = @_;
5861     my $r = &lang_sub_obj;
5862     (my $newext = $ext) =~ tr/y/c/;
5863     return ($r, $newext);
5866 # Rewrite a single lex file.
5867 sub lang_lex_rewrite
5869     my ($directory, $base, $ext) = @_;
5871     my $r = &lang_sub_obj;
5872     (my $newext = $ext) =~ tr/l/c/;
5873     return ($r, $newext);
5876 # Rewrite a single lex++ file.
5877 sub lang_lexxx_rewrite
5879     my ($directory, $base, $ext) = @_;
5881     my $r = &lang_sub_obj;
5882     (my $newext = $ext) =~ tr/l/c/;
5883     return ($r, $newext);
5886 # Rewrite a single assembly file.
5887 sub lang_asm_rewrite
5889     return &lang_sub_obj;
5892 # Rewrite a single preprocessed assembly file.
5893 sub lang_cppasm_rewrite
5895     return &lang_sub_obj;
5898 # Rewrite a single Fortran 77 file.
5899 sub lang_f77_rewrite
5901     return &lang_sub_obj;
5904 # Rewrite a single Fortran file.
5905 sub lang_fc_rewrite
5907     return &lang_sub_obj;
5910 # Rewrite a single preprocessed Fortran file.
5911 sub lang_ppfc_rewrite
5913     return &lang_sub_obj;
5916 # Rewrite a single preprocessed Fortran 77 file.
5917 sub lang_ppf77_rewrite
5919     return &lang_sub_obj;
5922 # Rewrite a single ratfor file.
5923 sub lang_ratfor_rewrite
5925     return &lang_sub_obj;
5928 # Rewrite a single Objective C file.
5929 sub lang_objc_rewrite
5931     return &lang_sub_obj;
5934 # Rewrite a single Unified Parallel C file.
5935 sub lang_upc_rewrite
5937     return &lang_sub_obj;
5940 # Rewrite a single Java file.
5941 sub lang_java_rewrite
5943     return LANG_SUBDIR;
5946 # The lang_X_finish functions are called after all source file
5947 # processing is done.  Each should handle defining rules for the
5948 # language, etc.  A finish function is only called if a source file of
5949 # the appropriate type has been seen.
5951 sub lang_c_finish
5953     # Push all libobjs files onto de_ansi_files.  We actually only
5954     # push files which exist in the current directory, and which are
5955     # genuine source files.
5956     foreach my $file (keys %libsources)
5957     {
5958         if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file")
5959         {
5960             $de_ansi_files{$1} = ''
5961         }
5962     }
5964     if (option 'ansi2knr' && keys %de_ansi_files)
5965     {
5966         # Make all _.c files depend on their corresponding .c files.
5967         my @objects;
5968         foreach my $base (sort keys %de_ansi_files)
5969         {
5970             # Each _.c file must depend on ansi2knr; otherwise it
5971             # might be used in a parallel build before it is built.
5972             # We need to support files in the srcdir and in the build
5973             # dir (because these files might be auto-generated.  But
5974             # we can't use $< -- some makes only define $< during a
5975             # suffix rule.
5976             my $ansfile = $de_ansi_files{$base} . $base . '.c';
5977             $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t"
5978                               . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) '
5979                               . '`if test -f $(srcdir)/' . $ansfile
5980                               . '; then echo $(srcdir)/' . $ansfile
5981                               . '; else echo ' . $ansfile . '; fi` '
5982                               . "| sed 's/^# \\([0-9]\\)/#line \\1/' "
5983                               . '| $(ANSI2KNR) > $@'
5984                               # If ansi2knr fails then we shouldn't
5985                               # create the _.c file
5986                               . " || rm -f \$\@\n");
5987             push (@objects, $base . '_.$(OBJEXT)');
5988             push (@objects, $base . '_.lo')
5989               if var ('LIBTOOL');
5991             # Explicitly clean the _.c files if they are in a
5992             # subdirectory. (In the current directory they get erased
5993             # by a `rm -f *_.c' rule.)
5994             $clean_files{$base . '_.c'} = MOSTLY_CLEAN
5995               if dirname ($base) ne '.';
5996         }
5998         # Make all _.o (and _.lo) files depend on ansi2knr.
5999         # Use a sneaky little hack to make it print nicely.
6000         &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)');
6001     }
6004 sub lang_vala_finish_target ($$)
6006   my ($self, $name) = @_;
6008   my $derived = canonicalize ($name);
6009   my $varname = $derived . '_SOURCES';
6010   my $var = var ($varname);
6012   if ($var)
6013     {
6014       foreach my $file ($var->value_as_list_recursive)
6015         {
6016           $output_rules .= "\$(srcdir)/$file: \$(srcdir)/${derived}_vala.stamp\n"
6017             . "\t\@if test -f \$@; then :; else rm -f \$(srcdir)/${derived}_vala.stamp; fi\n"
6018             . "\t\@if test -f \$@; then :; else \\\n"
6019             . "\t  \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n"
6020             . "\tfi\n"
6021             if $file =~ s/(.*)\.vala$/$1.c/;
6022         }
6023     }
6025   # Add rebuild rules for generated header and vapi files
6026   my $flags = var ($derived . '_VALAFLAGS');
6027   if ($flags)
6028     {
6029       my $lastflag = '';
6030       foreach my $flag ($flags->value_as_list_recursive)
6031         {
6032           if (grep (/$lastflag/, ('-H', '-h', '--header', '--internal-header',
6033                                   '--vapi', '--internal-vapi', '--gir')))
6034             {
6035               my $headerfile = $flag;
6036               $output_rules .= "\$(srcdir)/$headerfile: \$(srcdir)/${derived}_vala.stamp\n"
6037                 . "\t\@if test -f \$@; then :; else rm -f \$(srcdir)/${derived}_vala.stamp; fi\n"
6038                 . "\t\@if test -f \$@; then :; else \\\n"
6039                 . "\t  \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n"
6040                 . "\tfi\n";
6042               # valac is not used when building from dist tarballs
6043               # distribute the generated files
6044               push_dist_common ($headerfile);
6045               $clean_files{$headerfile} = MAINTAINER_CLEAN;
6046             }
6047           $lastflag = $flag;
6048         }
6049     }
6051   my $compile = $self->compile;
6053   # Rewrite each occurrence of `AM_VALAFLAGS' in the compile
6054   # rule into `${derived}_VALAFLAGS' if it exists.
6055   my $val = "${derived}_VALAFLAGS";
6056   $compile =~ s/\(AM_VALAFLAGS\)/\($val\)/
6057     if set_seen ($val);
6059   # VALAFLAGS is a user variable (per GNU Standards),
6060   # it should not be overridden in the Makefile...
6061   check_user_variables ['VALAFLAGS'];
6063   my $dirname = dirname ($name);
6065   # Only generate C code, do not run C compiler
6066   $compile .= " -C";
6068   my $verbose = verbose_flag ('VALAC');
6069   my $silent = silent_flag ();
6071   $output_rules .=
6072     "${derived}_vala.stamp: \$(${derived}_SOURCES)\n".
6073     "\t${verbose}${compile} \$(${derived}_SOURCES)\n".
6074     "\t${silent}touch \$@\n";
6076   push_dist_common ("${derived}_vala.stamp");
6078   $clean_files{"${derived}_vala.stamp"} = MAINTAINER_CLEAN;
6081 # Add output rules to invoke valac and create stamp file as a witness
6082 # to handle multiple outputs. This function is called after all source
6083 # file processing is done.
6084 sub lang_vala_finish
6086   my ($self) = @_;
6088   foreach my $prog (keys %known_programs)
6089     {
6090       lang_vala_finish_target ($self, $prog);
6091     }
6093   while (my ($name) = each %known_libraries)
6094     {
6095       lang_vala_finish_target ($self, $name);
6096     }
6099 # The built .c files should be cleaned only on maintainer-clean
6100 # as the .c files are distributed. This function is called for each
6101 # .vala source file.
6102 sub lang_vala_target_hook
6104   my ($self, $aggregate, $output, $input, %transform) = @_;
6106   $clean_files{$output} = MAINTAINER_CLEAN;
6109 # This is a yacc helper which is called whenever we have decided to
6110 # compile a yacc file.
6111 sub lang_yacc_target_hook
6113     my ($self, $aggregate, $output, $input, %transform) = @_;
6115     my $flag = $aggregate . "_YFLAGS";
6116     my $flagvar = var $flag;
6117     my $YFLAGSvar = var 'YFLAGS';
6118     if (($flagvar && $flagvar->variable_value =~ /$DASH_D_PATTERN/o)
6119         || ($YFLAGSvar && $YFLAGSvar->variable_value =~ /$DASH_D_PATTERN/o))
6120     {
6121         (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//;
6122         my $header = $output_base . '.h';
6124         # Found a `-d' that applies to the compilation of this file.
6125         # Add a dependency for the generated header file, and arrange
6126         # for that file to be included in the distribution.
6127         foreach my $cond (Automake::Rule::define (${header}, 'internal',
6128                                                   RULE_AUTOMAKE, TRUE,
6129                                                   INTERNAL))
6130           {
6131             my $condstr = $cond->subst_string;
6132             $output_rules .=
6133               "$condstr${header}: $output\n"
6134               # Recover from removal of $header
6135               . "$condstr\t\@if test ! -f \$@; then rm -f $output; else :; fi\n"
6136               . "$condstr\t\@if test ! -f \$@; then \$(MAKE) \$(AM_MAKEFLAGS) $output; else :; fi\n";
6137           }
6138         # Distribute the generated file, unless its .y source was
6139         # listed in a nodist_ variable.  (&handle_source_transform
6140         # will set DIST_SOURCE.)
6141         &push_dist_common ($header)
6142           if $transform{'DIST_SOURCE'};
6144         # If the files are built in the build directory, then we want
6145         # to remove them with `make clean'.  If they are in srcdir
6146         # they shouldn't be touched.  However, we can't determine this
6147         # statically, and the GNU rules say that yacc/lex output files
6148         # should be removed by maintainer-clean.  So that's what we
6149         # do.
6150         $clean_files{$header} = MAINTAINER_CLEAN;
6151     }
6152     # Erase $OUTPUT on `make maintainer-clean' (by GNU standards).
6153     # See the comment above for $HEADER.
6154     $clean_files{$output} = MAINTAINER_CLEAN;
6157 # This is a lex helper which is called whenever we have decided to
6158 # compile a lex file.
6159 sub lang_lex_target_hook
6161     my ($self, $aggregate, $output, $input) = @_;
6162     # If the files are built in the build directory, then we want to
6163     # remove them with `make clean'.  If they are in srcdir they
6164     # shouldn't be touched.  However, we can't determine this
6165     # statically, and the GNU rules say that yacc/lex output files
6166     # should be removed by maintainer-clean.  So that's what we do.
6167     $clean_files{$output} = MAINTAINER_CLEAN;
6170 # This is a helper for both lex and yacc.
6171 sub yacc_lex_finish_helper
6173   return if defined $language_scratch{'lex-yacc-done'};
6174   $language_scratch{'lex-yacc-done'} = 1;
6176   # FIXME: for now, no line number.
6177   require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
6178   &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
6181 sub lang_yacc_finish
6183   return if defined $language_scratch{'yacc-done'};
6184   $language_scratch{'yacc-done'} = 1;
6186   reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead";
6188   yacc_lex_finish_helper;
6192 sub lang_lex_finish
6194   return if defined $language_scratch{'lex-done'};
6195   $language_scratch{'lex-done'} = 1;
6197   yacc_lex_finish_helper;
6201 # Given a hash table of linker names, pick the name that has the most
6202 # precedence.  This is lame, but something has to have global
6203 # knowledge in order to eliminate the conflict.  Add more linkers as
6204 # required.
6205 sub resolve_linker
6207     my (%linkers) = @_;
6209     foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK))
6210     {
6211         return $l if defined $linkers{$l};
6212     }
6213     return 'LINK';
6216 # Called to indicate that an extension was used.
6217 sub saw_extension
6219     my ($ext) = @_;
6220     if (! defined $extension_seen{$ext})
6221     {
6222         $extension_seen{$ext} = 1;
6223     }
6224     else
6225     {
6226         ++$extension_seen{$ext};
6227     }
6230 # Return the number of files seen for a given language.  Knows about
6231 # special cases we care about.  FIXME: this is hideous.  We need
6232 # something that involves real language objects.  For instance yacc
6233 # and yaccxx could both derive from a common yacc class which would
6234 # know about the strange ylwrap requirement.  (Or better yet we could
6235 # just not support legacy yacc!)
6236 sub count_files_for_language
6238     my ($name) = @_;
6240     my @names;
6241     if ($name eq 'yacc' || $name eq 'yaccxx')
6242     {
6243         @names = ('yacc', 'yaccxx');
6244     }
6245     elsif ($name eq 'lex' || $name eq 'lexxx')
6246     {
6247         @names = ('lex', 'lexxx');
6248     }
6249     else
6250     {
6251         @names = ($name);
6252     }
6254     my $r = 0;
6255     foreach $name (@names)
6256     {
6257         my $lang = $languages{$name};
6258         foreach my $ext (@{$lang->extensions})
6259         {
6260             $r += $extension_seen{$ext}
6261                 if defined $extension_seen{$ext};
6262         }
6263     }
6265     return $r
6268 # Called to ask whether source files have been seen . If HEADERS is 1,
6269 # headers can be included.
6270 sub saw_sources_p
6272     my ($headers) = @_;
6274     # count all the sources
6275     my $count = 0;
6276     foreach my $val (values %extension_seen)
6277     {
6278         $count += $val;
6279     }
6281     if (!$headers)
6282     {
6283         $count -= count_files_for_language ('header');
6284     }
6286     return $count > 0;
6290 # register_language (%ATTRIBUTE)
6291 # ------------------------------
6292 # Register a single language.
6293 # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
6294 sub register_language (%)
6296   my (%option) = @_;
6298   # Set the defaults.
6299   $option{'ansi'} = 0
6300     unless defined $option{'ansi'};
6301   $option{'autodep'} = 'no'
6302     unless defined $option{'autodep'};
6303   $option{'linker'} = ''
6304     unless defined $option{'linker'};
6305   $option{'flags'} = []
6306     unless defined $option{'flags'};
6307   $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) }
6308     unless defined $option{'output_extensions'};
6309   $option{'nodist_specific'} = 0
6310     unless defined $option{'nodist_specific'};
6312   my $lang = new Language (%option);
6314   # Fill indexes.
6315   $extension_map{$_} = $lang->name foreach @{$lang->extensions};
6316   $languages{$lang->name} = $lang;
6317   my $link = $lang->linker;
6318   if ($link)
6319     {
6320       if (exists $link_languages{$link})
6321         {
6322           prog_error ("`$link' has different definitions in "
6323                       . $lang->name . " and " . $link_languages{$link}->name)
6324             if $lang->link ne $link_languages{$link}->link;
6325         }
6326       else
6327         {
6328           $link_languages{$link} = $lang;
6329         }
6330     }
6332   # Update the pattern of known extensions.
6333   accept_extensions (@{$lang->extensions});
6335   # Upate the $suffix_rule map.
6336   foreach my $suffix (@{$lang->extensions})
6337     {
6338       foreach my $dest (&{$lang->output_extensions} ($suffix))
6339         {
6340           register_suffix_rule (INTERNAL, $suffix, $dest);
6341         }
6342     }
6345 # derive_suffix ($EXT, $OBJ)
6346 # --------------------------
6347 # This function is used to find a path from a user-specified suffix $EXT
6348 # to $OBJ or to some other suffix we recognize internally, e.g. `cc'.
6349 sub derive_suffix ($$)
6351   my ($source_ext, $obj) = @_;
6353   while (! $extension_map{$source_ext}
6354          && $source_ext ne $obj
6355          && exists $suffix_rules->{$source_ext}
6356          && exists $suffix_rules->{$source_ext}{$obj})
6357     {
6358       $source_ext = $suffix_rules->{$source_ext}{$obj}[0];
6359     }
6361   return $source_ext;
6365 ################################################################
6367 # Pretty-print something and append to output_rules.
6368 sub pretty_print_rule
6370     $output_rules .= &makefile_wrap (@_);
6374 ################################################################
6377 ## -------------------------------- ##
6378 ## Handling the conditional stack.  ##
6379 ## -------------------------------- ##
6382 # $STRING
6383 # make_conditional_string ($NEGATE, $COND)
6384 # ----------------------------------------
6385 sub make_conditional_string ($$)
6387   my ($negate, $cond) = @_;
6388   $cond = "${cond}_TRUE"
6389     unless $cond =~ /^TRUE|FALSE$/;
6390   $cond = Automake::Condition::conditional_negate ($cond)
6391     if $negate;
6392   return $cond;
6396 my %_am_macro_for_cond =
6397   (
6398   AMDEP => "one of the compiler tests\n"
6399            . "    AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,\n"
6400            . "    AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC",
6401   am__fastdepCC => 'AC_PROG_CC',
6402   am__fastdepCCAS => 'AM_PROG_AS',
6403   am__fastdepCXX => 'AC_PROG_CXX',
6404   am__fastdepGCJ => 'AM_PROG_GCJ',
6405   am__fastdepOBJC => 'AC_PROG_OBJC',
6406   am__fastdepUPC => 'AM_PROG_UPC'
6407   );
6409 # $COND
6410 # cond_stack_if ($NEGATE, $COND, $WHERE)
6411 # --------------------------------------
6412 sub cond_stack_if ($$$)
6414   my ($negate, $cond, $where) = @_;
6416   if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/)
6417     {
6418       my $text = "$cond does not appear in AM_CONDITIONAL";
6419       my $scope = US_LOCAL;
6420       if (exists $_am_macro_for_cond{$cond})
6421         {
6422           my $mac = $_am_macro_for_cond{$cond};
6423           $text .= "\n  The usual way to define `$cond' is to add ";
6424           $text .= ($mac =~ / /) ? $mac : "`$mac'";
6425           $text .= "\n  to `$configure_ac' and run `aclocal' and `autoconf' again.";
6426           # These warnings appear in Automake files (depend2.am),
6427           # so there is no need to display them more than once:
6428           $scope = US_GLOBAL;
6429         }
6430       error $where, $text, uniq_scope => $scope;
6431     }
6433   push (@cond_stack, make_conditional_string ($negate, $cond));
6435   return new Automake::Condition (@cond_stack);
6439 # $COND
6440 # cond_stack_else ($NEGATE, $COND, $WHERE)
6441 # ----------------------------------------
6442 sub cond_stack_else ($$$)
6444   my ($negate, $cond, $where) = @_;
6446   if (! @cond_stack)
6447     {
6448       error $where, "else without if";
6449       return FALSE;
6450     }
6452   $cond_stack[$#cond_stack] =
6453     Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]);
6455   # If $COND is given, check against it.
6456   if (defined $cond)
6457     {
6458       $cond = make_conditional_string ($negate, $cond);
6460       error ($where, "else reminder ($negate$cond) incompatible with "
6461              . "current conditional: $cond_stack[$#cond_stack]")
6462         if $cond_stack[$#cond_stack] ne $cond;
6463     }
6465   return new Automake::Condition (@cond_stack);
6469 # $COND
6470 # cond_stack_endif ($NEGATE, $COND, $WHERE)
6471 # -----------------------------------------
6472 sub cond_stack_endif ($$$)
6474   my ($negate, $cond, $where) = @_;
6475   my $old_cond;
6477   if (! @cond_stack)
6478     {
6479       error $where, "endif without if";
6480       return TRUE;
6481     }
6483   # If $COND is given, check against it.
6484   if (defined $cond)
6485     {
6486       $cond = make_conditional_string ($negate, $cond);
6488       error ($where, "endif reminder ($negate$cond) incompatible with "
6489              . "current conditional: $cond_stack[$#cond_stack]")
6490         if $cond_stack[$#cond_stack] ne $cond;
6491     }
6493   pop @cond_stack;
6495   return new Automake::Condition (@cond_stack);
6502 ## ------------------------ ##
6503 ## Handling the variables.  ##
6504 ## ------------------------ ##
6507 # &define_pretty_variable ($VAR, $COND, $WHERE, @VALUE)
6508 # -----------------------------------------------------
6509 # Like define_variable, but the value is a list, and the variable may
6510 # be defined conditionally.  The second argument is the condition
6511 # under which the value should be defined; this should be the empty
6512 # string to define the variable unconditionally.  The third argument
6513 # is a list holding the values to use for the variable.  The value is
6514 # pretty printed in the output file.
6515 sub define_pretty_variable ($$$@)
6517     my ($var, $cond, $where, @value) = @_;
6519     if (! vardef ($var, $cond))
6520     {
6521         Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value",
6522                                     '', $where, VAR_PRETTY);
6523         rvar ($var)->rdef ($cond)->set_seen;
6524     }
6528 # define_variable ($VAR, $VALUE, $WHERE)
6529 # --------------------------------------
6530 # Define a new Automake Makefile variable VAR to VALUE, but only if
6531 # not already defined.
6532 sub define_variable ($$$)
6534     my ($var, $value, $where) = @_;
6535     define_pretty_variable ($var, TRUE, $where, $value);
6539 # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE)
6540 # ------------------------------------------------------------
6541 # Define the $VAR which content is the list of file names composed of
6542 # a @BASENAME and the $EXTENSION.
6543 sub define_files_variable ($\@$$)
6545   my ($var, $basename, $extension, $where) = @_;
6546   define_variable ($var,
6547                    join (' ', map { "$_.$extension" } @$basename),
6548                    $where);
6552 # Like define_variable, but define a variable to be the configure
6553 # substitution by the same name.
6554 sub define_configure_variable ($)
6556   my ($var) = @_;
6558   my $pretty = VAR_ASIS;
6559   my $owner = VAR_CONFIGURE;
6561   # Some variables we do not want to output.  For instance it
6562   # would be a bad idea to output `U = @U@` when `@U@` can be
6563   # substituted as `\`.
6564   $pretty = VAR_SILENT if exists $ignored_configure_vars{$var};
6566   # ANSI2KNR is a variable that Automake wants to redefine, so
6567   # it must be owned by Automake.  (It is also used as a proof
6568   # that AM_C_PROTOTYPES has been run, that's why we do not simply
6569   # omit the AC_SUBST.)
6570   $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR';
6572   Automake::Variable::define ($var, $owner, '', TRUE, subst $var,
6573                               '', $configure_vars{$var}, $pretty);
6577 # define_compiler_variable ($LANG)
6578 # --------------------------------
6579 # Define a compiler variable.  We also handle defining the `LT'
6580 # version of the command when using libtool.
6581 sub define_compiler_variable ($)
6583     my ($lang) = @_;
6585     my ($var, $value) = ($lang->compiler, $lang->compile);
6586     my $libtool_tag = '';
6587     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6588       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6589     &define_variable ($var, $value, INTERNAL);
6590     if (var ('LIBTOOL'))
6591       {
6592         my $verbose = define_verbose_libtool ();
6593         &define_variable ("LT$var",
6594                           "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
6595                           . "\$(LIBTOOLFLAGS) --mode=compile $value",
6596                           INTERNAL);
6597       }
6598     define_verbose_tagvar ($lang->ccer || 'GEN');
6602 # define_linker_variable ($LANG)
6603 # ------------------------------
6604 # Define linker variables.
6605 sub define_linker_variable ($)
6607     my ($lang) = @_;
6609     my $libtool_tag = '';
6610     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6611       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6612     # CCLD = $(CC).
6613     &define_variable ($lang->lder, $lang->ld, INTERNAL);
6614     # CCLINK = $(CCLD) blah blah...
6615     my $link = '';
6616     if (var ('LIBTOOL'))
6617       {
6618         my $verbose = define_verbose_libtool ();
6619         $link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
6620                 . "\$(LIBTOOLFLAGS) --mode=link ";
6621       }
6622     &define_variable ($lang->linker, $link . $lang->link, INTERNAL);
6623     &define_variable ($lang->compiler,  $lang);
6624     &define_verbose_tagvar ($lang->lder || 'GEN');
6627 sub define_per_target_linker_variable ($$)
6629   my ($linker, $target) = @_;
6631   # If the user wrote a custom link command, we don't define ours.
6632   return "${target}_LINK"
6633     if set_seen "${target}_LINK";
6635   my $xlink = $linker ? $linker : 'LINK';
6637   my $lang = $link_languages{$xlink};
6638   prog_error "Unknown language for linker variable `$xlink'"
6639     unless $lang;
6641   my $link_command = $lang->link;
6642   if (var 'LIBTOOL')
6643     {
6644       my $libtool_tag = '';
6645       $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6646         if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6648       my $verbose = define_verbose_libtool ();
6649       $link_command =
6650         "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) "
6651         . "--mode=link " . $link_command;
6652     }
6654   # Rewrite each occurrence of `AM_$flag' in the link
6655   # command into `${derived}_$flag' if it exists.
6656   my $orig_command = $link_command;
6657   my @flags = (@{$lang->flags}, 'LDFLAGS');
6658   push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL';
6659   for my $flag (@flags)
6660     {
6661       my $val = "${target}_$flag";
6662       $link_command =~ s/\(AM_$flag\)/\($val\)/
6663         if set_seen ($val);
6664     }
6666   # If the computed command is the same as the generic command, use
6667   # the command linker variable.
6668   return ($lang->linker, $lang->lder)
6669     if $link_command eq $orig_command;
6671   &define_variable ("${target}_LINK", $link_command, INTERNAL);
6672   return ("${target}_LINK", $lang->lder);
6675 ################################################################
6677 # &check_trailing_slash ($WHERE, $LINE)
6678 # -------------------------------------
6679 # Return 1 iff $LINE ends with a slash.
6680 # Might modify $LINE.
6681 sub check_trailing_slash ($\$)
6683   my ($where, $line) = @_;
6685   # Ignore `##' lines.
6686   return 0 if $$line =~ /$IGNORE_PATTERN/o;
6688   # Catch and fix a common error.
6689   msg "syntax", $where, "whitespace following trailing backslash"
6690     if $$line =~ s/\\\s+\n$/\\\n/;
6692   return $$line =~ /\\$/;
6696 # &read_am_file ($AMFILE, $WHERE)
6697 # -------------------------------
6698 # Read Makefile.am and set up %contents.  Simultaneously copy lines
6699 # from Makefile.am into $output_trailer, or define variables as
6700 # appropriate.  NOTE we put rules in the trailer section.  We want
6701 # user rules to come after our generated stuff.
6702 sub read_am_file ($$)
6704     my ($amfile, $where) = @_;
6706     my $am_file = new Automake::XFile ("< $amfile");
6707     verb "reading $amfile";
6709     # Keep track of the youngest output dependency.
6710     my $mtime = mtime $amfile;
6711     $output_deps_greatest_timestamp = $mtime
6712       if $mtime > $output_deps_greatest_timestamp;
6714     my $spacing = '';
6715     my $comment = '';
6716     my $blank = 0;
6717     my $saw_bk = 0;
6718     my $var_look = VAR_ASIS;
6720     use constant IN_VAR_DEF => 0;
6721     use constant IN_RULE_DEF => 1;
6722     use constant IN_COMMENT => 2;
6723     my $prev_state = IN_RULE_DEF;
6725     while ($_ = $am_file->getline)
6726     {
6727         $where->set ("$amfile:$.");
6728         if (/$IGNORE_PATTERN/o)
6729         {
6730             # Merely delete comments beginning with two hashes.
6731         }
6732         elsif (/$WHITE_PATTERN/o)
6733         {
6734             error $where, "blank line following trailing backslash"
6735               if $saw_bk;
6736             # Stick a single white line before the incoming macro or rule.
6737             $spacing = "\n";
6738             $blank = 1;
6739             # Flush all comments seen so far.
6740             if ($comment ne '')
6741             {
6742                 $output_vars .= $comment;
6743                 $comment = '';
6744             }
6745         }
6746         elsif (/$COMMENT_PATTERN/o)
6747         {
6748             # Stick comments before the incoming macro or rule.  Make
6749             # sure a blank line precedes the first block of comments.
6750             $spacing = "\n" unless $blank;
6751             $blank = 1;
6752             $comment .= $spacing . $_;
6753             $spacing = '';
6754             $prev_state = IN_COMMENT;
6755         }
6756         else
6757         {
6758             last;
6759         }
6760         $saw_bk = check_trailing_slash ($where, $_);
6761     }
6763     # We save the conditional stack on entry, and then check to make
6764     # sure it is the same on exit.  This lets us conditionally include
6765     # other files.
6766     my @saved_cond_stack = @cond_stack;
6767     my $cond = new Automake::Condition (@cond_stack);
6769     my $last_var_name = '';
6770     my $last_var_type = '';
6771     my $last_var_value = '';
6772     my $last_where;
6773     # FIXME: shouldn't use $_ in this loop; it is too big.
6774     while ($_)
6775     {
6776         $where->set ("$amfile:$.");
6778         # Make sure the line is \n-terminated.
6779         chomp;
6780         $_ .= "\n";
6782         # Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
6783         # used by users.  @MAINT@ is an anachronism now.
6784         $_ =~ s/\@MAINT\@//g
6785             unless $seen_maint_mode;
6787         my $new_saw_bk = check_trailing_slash ($where, $_);
6789         if (/$IGNORE_PATTERN/o)
6790         {
6791             # Merely delete comments beginning with two hashes.
6793             # Keep any backslash from the previous line.
6794             $new_saw_bk = $saw_bk;
6795         }
6796         elsif (/$WHITE_PATTERN/o)
6797         {
6798             # Stick a single white line before the incoming macro or rule.
6799             $spacing = "\n";
6800             error $where, "blank line following trailing backslash"
6801               if $saw_bk;
6802         }
6803         elsif (/$COMMENT_PATTERN/o)
6804         {
6805             error $where, "comment following trailing backslash"
6806               if $saw_bk && $prev_state != IN_COMMENT;
6808             # Stick comments before the incoming macro or rule.
6809             $comment .= $spacing . $_;
6810             $spacing = '';
6811             $prev_state = IN_COMMENT;
6812         }
6813         elsif ($saw_bk)
6814         {
6815             if ($prev_state == IN_RULE_DEF)
6816             {
6817               my $cond = new Automake::Condition @cond_stack;
6818               $output_trailer .= $cond->subst_string;
6819               $output_trailer .= $_;
6820             }
6821             elsif ($prev_state == IN_COMMENT)
6822             {
6823                 # If the line doesn't start with a `#', add it.
6824                 # We do this because a continued comment like
6825                 #   # A = foo \
6826                 #         bar \
6827                 #         baz
6828                 # is not portable.  BSD make doesn't honor
6829                 # escaped newlines in comments.
6830                 s/^#?/#/;
6831                 $comment .= $spacing . $_;
6832             }
6833             else # $prev_state == IN_VAR_DEF
6834             {
6835               $last_var_value .= ' '
6836                 unless $last_var_value =~ /\s$/;
6837               $last_var_value .= $_;
6839               if (!/\\$/)
6840                 {
6841                   Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6842                                               $last_var_type, $cond,
6843                                               $last_var_value, $comment,
6844                                               $last_where, VAR_ASIS)
6845                     if $cond != FALSE;
6846                   $comment = $spacing = '';
6847                 }
6848             }
6849         }
6851         elsif (/$IF_PATTERN/o)
6852           {
6853             $cond = cond_stack_if ($1, $2, $where);
6854           }
6855         elsif (/$ELSE_PATTERN/o)
6856           {
6857             $cond = cond_stack_else ($1, $2, $where);
6858           }
6859         elsif (/$ENDIF_PATTERN/o)
6860           {
6861             $cond = cond_stack_endif ($1, $2, $where);
6862           }
6864         elsif (/$RULE_PATTERN/o)
6865         {
6866             # Found a rule.
6867             $prev_state = IN_RULE_DEF;
6869             # For now we have to output all definitions of user rules
6870             # and can't diagnose duplicates (see the comment in
6871             # Automake::Rule::define). So we go on and ignore the return value.
6872             Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where);
6874             check_variable_expansions ($_, $where);
6876             $output_trailer .= $comment . $spacing;
6877             my $cond = new Automake::Condition @cond_stack;
6878             $output_trailer .= $cond->subst_string;
6879             $output_trailer .= $_;
6880             $comment = $spacing = '';
6881         }
6882         elsif (/$ASSIGNMENT_PATTERN/o)
6883         {
6884             # Found a macro definition.
6885             $prev_state = IN_VAR_DEF;
6886             $last_var_name = $1;
6887             $last_var_type = $2;
6888             $last_var_value = $3;
6889             $last_where = $where->clone;
6890             if ($3 ne '' && substr ($3, -1) eq "\\")
6891               {
6892                 # We preserve the `\' because otherwise the long lines
6893                 # that are generated will be truncated by broken
6894                 # `sed's.
6895                 $last_var_value = $3 . "\n";
6896               }
6897             # Normally we try to output variable definitions in the
6898             # same format they were input.  However, POSIX compliant
6899             # systems are not required to support lines longer than
6900             # 2048 bytes (most notably, some sed implementation are
6901             # limited to 4000 bytes, and sed is used by config.status
6902             # to rewrite Makefile.in into Makefile).  Moreover nobody
6903             # would really write such long lines by hand since it is
6904             # hardly maintainable.  So if a line is longer that 1000
6905             # bytes (an arbitrary limit), assume it has been
6906             # automatically generated by some tools, and flatten the
6907             # variable definition.  Otherwise, keep the variable as it
6908             # as been input.
6909             $var_look = VAR_PRETTY if length ($last_var_value) >= 1000;
6911             if (!/\\$/)
6912               {
6913                 Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6914                                             $last_var_type, $cond,
6915                                             $last_var_value, $comment,
6916                                             $last_where, $var_look)
6917                   if $cond != FALSE;
6918                 $comment = $spacing = '';
6919                 $var_look = VAR_ASIS;
6920               }
6921         }
6922         elsif (/$INCLUDE_PATTERN/o)
6923         {
6924             my $path = $1;
6926             if ($path =~ s/^\$\(top_srcdir\)\///)
6927               {
6928                 push (@include_stack, "\$\(top_srcdir\)/$path");
6929                 # Distribute any included file.
6931                 # Always use the $(top_srcdir) prefix in DIST_COMMON,
6932                 # otherwise OSF make will implicitly copy the included
6933                 # file in the build tree during `make distdir' to satisfy
6934                 # the dependency.
6935                 # (subdircond2.test and subdircond3.test will fail.)
6936                 push_dist_common ("\$\(top_srcdir\)/$path");
6937               }
6938             else
6939               {
6940                 $path =~ s/\$\(srcdir\)\///;
6941                 push (@include_stack, "\$\(srcdir\)/$path");
6942                 # Always use the $(srcdir) prefix in DIST_COMMON,
6943                 # otherwise OSF make will implicitly copy the included
6944                 # file in the build tree during `make distdir' to satisfy
6945                 # the dependency.
6946                 # (subdircond2.test and subdircond3.test will fail.)
6947                 push_dist_common ("\$\(srcdir\)/$path");
6948                 $path = $relative_dir . "/" . $path if $relative_dir ne '.';
6949               }
6950             $where->push_context ("`$path' included from here");
6951             &read_am_file ($path, $where);
6952             $where->pop_context;
6953         }
6954         else
6955         {
6956             # This isn't an error; it is probably a continued rule.
6957             # In fact, this is what we assume.
6958             $prev_state = IN_RULE_DEF;
6959             check_variable_expansions ($_, $where);
6960             $output_trailer .= $comment . $spacing;
6961             my $cond = new Automake::Condition @cond_stack;
6962             $output_trailer .= $cond->subst_string;
6963             $output_trailer .= $_;
6964             $comment = $spacing = '';
6965             error $where, "`#' comment at start of rule is unportable"
6966               if $_ =~ /^\t\s*\#/;
6967         }
6969         $saw_bk = $new_saw_bk;
6970         $_ = $am_file->getline;
6971     }
6973     $output_trailer .= $comment;
6975     error ($where, "trailing backslash on last line")
6976       if $saw_bk;
6978     error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack"
6979                     : "too many conditionals closed in include file"))
6980       if "@saved_cond_stack" ne "@cond_stack";
6984 # define_standard_variables ()
6985 # ----------------------------
6986 # A helper for read_main_am_file which initializes configure variables
6987 # and variables from header-vars.am.
6988 sub define_standard_variables
6990   my $saved_output_vars = $output_vars;
6991   my ($comments, undef, $rules) =
6992     file_contents_internal (1, "$libdir/am/header-vars.am",
6993                             new Automake::Location);
6995   foreach my $var (sort keys %configure_vars)
6996     {
6997       &define_configure_variable ($var);
6998     }
7000   $output_vars .= $comments . $rules;
7003 # Read main am file.
7004 sub read_main_am_file
7006     my ($amfile) = @_;
7008     # This supports the strange variable tricks we are about to play.
7009     prog_error ("variable defined before read_main_am_file\n" . variables_dump ())
7010       if (scalar (variables) > 0);
7012     # Generate copyright header for generated Makefile.in.
7013     # We do discard the output of predefined variables, handled below.
7014     $output_vars = ("# $in_file_name generated by automake "
7015                    . $VERSION . " from $am_file_name.\n");
7016     $output_vars .= '# ' . subst ('configure_input') . "\n";
7017     $output_vars .= $gen_copyright;
7019     # We want to predefine as many variables as possible.  This lets
7020     # the user set them with `+=' in Makefile.am.
7021     &define_standard_variables;
7023     # Read user file, which might override some of our values.
7024     &read_am_file ($amfile, new Automake::Location);
7029 ################################################################
7031 # $FLATTENED
7032 # &flatten ($STRING)
7033 # ------------------
7034 # Flatten the $STRING and return the result.
7035 sub flatten
7037   $_ = shift;
7039   s/\\\n//somg;
7040   s/\s+/ /g;
7041   s/^ //;
7042   s/ $//;
7044   return $_;
7048 # transform_token ($TOKEN, \%PAIRS, $KEY)
7049 # =======================================
7050 # Return the value associated to $KEY in %PAIRS, as used on $TOKEN
7051 # (which should be ?KEY? or any of the special %% requests)..
7052 sub transform_token ($$$)
7054   my ($token, $transform, $key) = @_;
7055   my $res = $transform->{$key};
7056   prog_error "Unknown key `$key' in `$token'" unless defined $res;
7057   return $res;
7061 # transform ($TOKEN, \%PAIRS)
7062 # ===========================
7063 # If ($TOKEN, $VAL) is in %PAIRS:
7064 #   - replaces %KEY% with $VAL,
7065 #   - enables/disables ?KEY? and ?!KEY?,
7066 #   - replaces %?KEY% with TRUE or FALSE.
7067 #   - replaces %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE% with
7068 #     IFTRUE / IFFALSE, as appropriate.
7069 sub transform ($$)
7071   my ($token, $transform) = @_;
7073   # %KEY%.
7074   # Must be before the following pattern to exclude the case
7075   # when there is neither IFTRUE nor IFFALSE.
7076   if ($token =~ /^%([\w\-]+)%$/)
7077     {
7078       return transform_token ($token, $transform, $1);
7079     }
7080   # %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE%.
7081   elsif ($token =~ /^%([\w\-]+)(?:\?([^?:%]+))?(?::([^?:%]+))?%$/)
7082     {
7083       return transform_token ($token, $transform, $1) ? ($2 || '') : ($3 || '');
7084     }
7085   # %?KEY%.
7086   elsif ($token =~ /^%\?([\w\-]+)%$/)
7087     {
7088       return transform_token ($token, $transform, $1) ? 'TRUE' : 'FALSE';
7089     }
7090   # ?KEY? and ?!KEY?.
7091   elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x)
7092     {
7093       my $neg = ($1 eq '!') ? 1 : 0;
7094       my $val = transform_token ($token, $transform, $2);
7095       return (!!$val == $neg) ? '##%' : '';
7096     }
7097   else
7098     {
7099       prog_error "Unknown request format: $token";
7100     }
7104 # @PARAGRAPHS
7105 # &make_paragraphs ($MAKEFILE, [%TRANSFORM])
7106 # ------------------------------------------
7107 # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
7108 # paragraphs.
7109 sub make_paragraphs ($%)
7111   my ($file, %transform) = @_;
7113   # Complete %transform with global options.
7114   # Note that %transform goes last, so it overrides global options.
7115   %transform = ('CYGNUS'      => !! option 'cygnus',
7116                  'MAINTAINER-MODE'
7117                  => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',
7119                  'XZ'          => !! option 'dist-xz',
7120                  'LZMA'        => !! option 'dist-lzma',
7121                  'BZIP2'       => !! option 'dist-bzip2',
7122                  'COMPRESS'    => !! option 'dist-tarZ',
7123                  'GZIP'        =>  ! option 'no-dist-gzip',
7124                  'SHAR'        => !! option 'dist-shar',
7125                  'ZIP'         => !! option 'dist-zip',
7127                  'INSTALL-INFO' =>  ! option 'no-installinfo',
7128                  'INSTALL-MAN'  =>  ! option 'no-installman',
7129                  'HAVE-MANS'    => !! var ('MANS'),
7130                  'CK-NEWS'      => !! option 'check-news',
7132                  'SUBDIRS'      => !! var ('SUBDIRS'),
7133                  'TOPDIR_P'     => $relative_dir eq '.',
7135                  'BUILD'    => ($seen_canonical >= AC_CANONICAL_BUILD),
7136                  'HOST'     => ($seen_canonical >= AC_CANONICAL_HOST),
7137                  'TARGET'   => ($seen_canonical >= AC_CANONICAL_TARGET),
7139                  'LIBTOOL'      => !! var ('LIBTOOL'),
7140                  'NONLIBTOOL'   => 1,
7141                  'FIRST'        => ! $transformed_files{$file},
7142                 %transform);
7144   $transformed_files{$file} = 1;
7145   $_ = $am_file_cache{$file};
7147   if (! defined $_)
7148     {
7149       verb "reading $file";
7150       # Swallow the whole file.
7151       my $fc_file = new Automake::XFile "< $file";
7152       my $saved_dollar_slash = $/;
7153       undef $/;
7154       $_ = $fc_file->getline;
7155       $/ = $saved_dollar_slash;
7156       $fc_file->close;
7158       # Remove ##-comments.
7159       # Besides we don't need more than two consecutive new-lines.
7160       s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom;
7162       $am_file_cache{$file} = $_;
7163     }
7165   # Substitute Automake template tokens.
7166   s/(?: % \?? [\w\-]+ %
7167       | % [\w\-]+ (?:\?[^?:%]+)? (?::[^?:%]+)? %
7168       | \? !? [\w\-]+ \?
7169     )/transform($&, \%transform)/gex;
7170   # transform() may have added some ##%-comments to strip.
7171   # (we use `##%' instead of `##' so we can distinguish ##%##%##% from
7172   # ####### and do not remove the latter.)
7173   s/^[ \t]*(?:##%)+.*\n//gm;
7175   # Split at unescaped new lines.
7176   my @lines = split (/(?<!\\)\n/, $_);
7177   my @res;
7179   while (defined ($_ = shift @lines))
7180     {
7181       my $paragraph = $_;
7182       # If we are a rule, eat as long as we start with a tab.
7183       if (/$RULE_PATTERN/smo)
7184         {
7185           while (defined ($_ = shift @lines) && $_ =~ /^\t/)
7186             {
7187               $paragraph .= "\n$_";
7188             }
7189           unshift (@lines, $_);
7190         }
7192       # If we are a comments, eat as much comments as you can.
7193       elsif (/$COMMENT_PATTERN/smo)
7194         {
7195           while (defined ($_ = shift @lines)
7196                  && $_ =~ /$COMMENT_PATTERN/smo)
7197             {
7198               $paragraph .= "\n$_";
7199             }
7200           unshift (@lines, $_);
7201         }
7203       push @res, $paragraph;
7204     }
7206   return @res;
7211 # ($COMMENT, $VARIABLES, $RULES)
7212 # &file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM])
7213 # -------------------------------------------------------------
7214 # Return contents of a file from $libdir/am, automatically skipping
7215 # macros or rules which are already known. $IS_AM iff the caller is
7216 # reading an Automake file (as opposed to the user's Makefile.am).
7217 sub file_contents_internal ($$$%)
7219     my ($is_am, $file, $where, %transform) = @_;
7221     $where->set ($file);
7223     my $result_vars = '';
7224     my $result_rules = '';
7225     my $comment = '';
7226     my $spacing = '';
7228     # The following flags are used to track rules spanning across
7229     # multiple paragraphs.
7230     my $is_rule = 0;            # 1 if we are processing a rule.
7231     my $discard_rule = 0;       # 1 if the current rule should not be output.
7233     # We save the conditional stack on entry, and then check to make
7234     # sure it is the same on exit.  This lets us conditionally include
7235     # other files.
7236     my @saved_cond_stack = @cond_stack;
7237     my $cond = new Automake::Condition (@cond_stack);
7239     foreach (make_paragraphs ($file, %transform))
7240     {
7241         # FIXME: no line number available.
7242         $where->set ($file);
7244         # Sanity checks.
7245         error $where, "blank line following trailing backslash:\n$_"
7246           if /\\$/;
7247         error $where, "comment following trailing backslash:\n$_"
7248           if /\\#/;
7250         if (/^$/)
7251         {
7252             $is_rule = 0;
7253             # Stick empty line before the incoming macro or rule.
7254             $spacing = "\n";
7255         }
7256         elsif (/$COMMENT_PATTERN/mso)
7257         {
7258             $is_rule = 0;
7259             # Stick comments before the incoming macro or rule.
7260             $comment = "$_\n";
7261         }
7263         # Handle inclusion of other files.
7264         elsif (/$INCLUDE_PATTERN/o)
7265         {
7266             if ($cond != FALSE)
7267               {
7268                 my $file = ($is_am ? "$libdir/am/" : '') . $1;
7269                 $where->push_context ("`$file' included from here");
7270                 # N-ary `.=' fails.
7271                 my ($com, $vars, $rules)
7272                   = file_contents_internal ($is_am, $file, $where, %transform);
7273                 $where->pop_context;
7274                 $comment .= $com;
7275                 $result_vars .= $vars;
7276                 $result_rules .= $rules;
7277               }
7278         }
7280         # Handling the conditionals.
7281         elsif (/$IF_PATTERN/o)
7282           {
7283             $cond = cond_stack_if ($1, $2, $file);
7284           }
7285         elsif (/$ELSE_PATTERN/o)
7286           {
7287             $cond = cond_stack_else ($1, $2, $file);
7288           }
7289         elsif (/$ENDIF_PATTERN/o)
7290           {
7291             $cond = cond_stack_endif ($1, $2, $file);
7292           }
7294         # Handling rules.
7295         elsif (/$RULE_PATTERN/mso)
7296         {
7297           $is_rule = 1;
7298           $discard_rule = 0;
7299           # Separate relationship from optional actions: the first
7300           # `new-line tab" not preceded by backslash (continuation
7301           # line).
7302           my $paragraph = $_;
7303           /^(.*?)(?:(?<!\\)\n(\t.*))?$/s;
7304           my ($relationship, $actions) = ($1, $2 || '');
7306           # Separate targets from dependencies: the first colon.
7307           $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
7308           my ($targets, $dependencies) = ($1, $2);
7309           # Remove the escaped new lines.
7310           # I don't know why, but I have to use a tmp $flat_deps.
7311           my $flat_deps = &flatten ($dependencies);
7312           my @deps = split (' ', $flat_deps);
7314           foreach (split (' ', $targets))
7315             {
7316               # FIXME: 1. We are not robust to people defining several targets
7317               # at once, only some of them being in %dependencies.  The
7318               # actions from the targets in %dependencies are usually generated
7319               # from the content of %actions, but if some targets in $targets
7320               # are not in %dependencies the ELSE branch will output
7321               # a rule for all $targets (i.e. the targets which are both
7322               # in %dependencies and $targets will have two rules).
7324               # FIXME: 2. The logic here is not able to output a
7325               # multi-paragraph rule several time (e.g. for each condition
7326               # it is defined for) because it only knows the first paragraph.
7328               # FIXME: 3. We are not robust to people defining a subset
7329               # of a previously defined "multiple-target" rule.  E.g.
7330               # `foo:' after `foo bar:'.
7332               # Output only if not in FALSE.
7333               if (defined $dependencies{$_} && $cond != FALSE)
7334                 {
7335                   &depend ($_, @deps);
7336                   register_action ($_, $actions);
7337                 }
7338               else
7339                 {
7340                   # Free-lance dependency.  Output the rule for all the
7341                   # targets instead of one by one.
7342                   my @undefined_conds =
7343                     Automake::Rule::define ($targets, $file,
7344                                             $is_am ? RULE_AUTOMAKE : RULE_USER,
7345                                             $cond, $where);
7346                   for my $undefined_cond (@undefined_conds)
7347                     {
7348                       my $condparagraph = $paragraph;
7349                       $condparagraph =~ s/^/$undefined_cond->subst_string/gme;
7350                       $result_rules .= "$spacing$comment$condparagraph\n";
7351                     }
7352                   if (scalar @undefined_conds == 0)
7353                     {
7354                       # Remember to discard next paragraphs
7355                       # if they belong to this rule.
7356                       # (but see also FIXME: #2 above.)
7357                       $discard_rule = 1;
7358                     }
7359                   $comment = $spacing = '';
7360                   last;
7361                 }
7362             }
7363         }
7365         elsif (/$ASSIGNMENT_PATTERN/mso)
7366         {
7367             my ($var, $type, $val) = ($1, $2, $3);
7368             error $where, "variable `$var' with trailing backslash"
7369               if /\\$/;
7371             $is_rule = 0;
7373             Automake::Variable::define ($var,
7374                                         $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE,
7375                                         $type, $cond, $val, $comment, $where,
7376                                         VAR_ASIS)
7377               if $cond != FALSE;
7379             $comment = $spacing = '';
7380         }
7381         else
7382         {
7383             # This isn't an error; it is probably some tokens which
7384             # configure is supposed to replace, such as `@SET-MAKE@',
7385             # or some part of a rule cut by an if/endif.
7386             if (! $cond->false && ! ($is_rule && $discard_rule))
7387               {
7388                 s/^/$cond->subst_string/gme;
7389                 $result_rules .= "$spacing$comment$_\n";
7390               }
7391             $comment = $spacing = '';
7392         }
7393     }
7395     error ($where, @cond_stack ?
7396            "unterminated conditionals: @cond_stack" :
7397            "too many conditionals closed in include file")
7398       if "@saved_cond_stack" ne "@cond_stack";
7400     return ($comment, $result_vars, $result_rules);
7404 # $CONTENTS
7405 # &file_contents ($BASENAME, $WHERE, [%TRANSFORM])
7406 # ------------------------------------------------
7407 # Return contents of a file from $libdir/am, automatically skipping
7408 # macros or rules which are already known.
7409 sub file_contents ($$%)
7411     my ($basename, $where, %transform) = @_;
7412     my ($comments, $variables, $rules) =
7413       file_contents_internal (1, "$libdir/am/$basename.am", $where,
7414                               %transform);
7415     return "$comments$variables$rules";
7419 # @PREFIX
7420 # &am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)
7421 # -----------------------------------------------------
7422 # Find all variable prefixes that are used for install directories.  A
7423 # prefix `zar' qualifies iff:
7425 # * `zardir' is a variable.
7426 # * `zar_PRIMARY' is a variable.
7428 # As a side effect, it looks for misspellings.  It is an error to have
7429 # a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
7430 # "bni_PROGRAMS".  However, unusual prefixes are allowed if a variable
7431 # of the same name (with "dir" appended) exists.  For instance, if the
7432 # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
7433 # This is to provide a little extra flexibility in those cases which
7434 # need it.
7435 sub am_primary_prefixes ($$@)
7437   my ($primary, $can_dist, @prefixes) = @_;
7439   local $_;
7440   my %valid = map { $_ => 0 } @prefixes;
7441   $valid{'EXTRA'} = 0;
7442   foreach my $var (variables $primary)
7443     {
7444       # Automake is allowed to define variables that look like primaries
7445       # but which aren't.  E.g. INSTALL_sh_DATA.
7446       # Autoconf can also define variables like INSTALL_DATA, so
7447       # ignore all configure variables (at least those which are not
7448       # redefined in Makefile.am).
7449       # FIXME: We should make sure that these variables are not
7450       # conditionally defined (or else adjust the condition below).
7451       my $def = $var->def (TRUE);
7452       next if $def && $def->owner != VAR_MAKEFILE;
7454       my $varname = $var->name;
7456       if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
7457         {
7458           my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
7459           if ($dist ne '' && ! $can_dist)
7460             {
7461               err_var ($var,
7462                        "invalid variable `$varname': `dist' is forbidden");
7463             }
7464           # Standard directories must be explicitly allowed.
7465           elsif (! defined $valid{$X} && exists $standard_prefix{$X})
7466             {
7467               err_var ($var,
7468                        "`${X}dir' is not a legitimate directory " .
7469                        "for `$primary'");
7470             }
7471           # A not explicitly valid directory is allowed if Xdir is defined.
7472           elsif (! defined $valid{$X} &&
7473                  $var->requires_variables ("`$varname' is used", "${X}dir"))
7474             {
7475               # Nothing to do.  Any error message has been output
7476               # by $var->requires_variables.
7477             }
7478           else
7479             {
7480               # Ensure all extended prefixes are actually used.
7481               $valid{"$base$dist$X"} = 1;
7482             }
7483         }
7484       else
7485         {
7486           prog_error "unexpected variable name: $varname";
7487         }
7488     }
7490   # Return only those which are actually defined.
7491   return sort grep { var ($_ . '_' . $primary) } keys %valid;
7495 # Handle `where_HOW' variable magic.  Does all lookups, generates
7496 # install code, and possibly generates code to define the primary
7497 # variable.  The first argument is the name of the .am file to munge,
7498 # the second argument is the primary variable (e.g. HEADERS), and all
7499 # subsequent arguments are possible installation locations.
7501 # Returns list of [$location, $value] pairs, where
7502 # $value's are the values in all where_HOW variable, and $location
7503 # there associated location (the place here their parent variables were
7504 # defined).
7506 # FIXME: this should be rewritten to be cleaner.  It should be broken
7507 # up into multiple functions.
7509 # Usage is: am_install_var (OPTION..., file, HOW, where...)
7510 sub am_install_var
7512   my (@args) = @_;
7514   my $do_require = 1;
7515   my $can_dist = 0;
7516   my $default_dist = 0;
7517   while (@args)
7518     {
7519       if ($args[0] eq '-noextra')
7520         {
7521           $do_require = 0;
7522         }
7523       elsif ($args[0] eq '-candist')
7524         {
7525           $can_dist = 1;
7526         }
7527       elsif ($args[0] eq '-defaultdist')
7528         {
7529           $default_dist = 1;
7530           $can_dist = 1;
7531         }
7532       elsif ($args[0] !~ /^-/)
7533         {
7534           last;
7535         }
7536       shift (@args);
7537     }
7539   my ($file, $primary, @prefix) = @args;
7541   # Now that configure substitutions are allowed in where_HOW
7542   # variables, it is an error to actually define the primary.  We
7543   # allow `JAVA', as it is customarily used to mean the Java
7544   # interpreter.  This is but one of several Java hacks.  Similarly,
7545   # `PYTHON' is customarily used to mean the Python interpreter.
7546   reject_var $primary, "`$primary' is an anachronism"
7547     unless $primary eq 'JAVA' || $primary eq 'PYTHON';
7549   # Get the prefixes which are valid and actually used.
7550   @prefix = am_primary_prefixes ($primary, $can_dist, @prefix);
7552   # If a primary includes a configure substitution, then the EXTRA_
7553   # form is required.  Otherwise we can't properly do our job.
7554   my $require_extra;
7556   my @used = ();
7557   my @result = ();
7559   foreach my $X (@prefix)
7560     {
7561       my $nodir_name = $X;
7562       my $one_name = $X . '_' . $primary;
7563       my $one_var = var $one_name;
7565       my $strip_subdir = 1;
7566       # If subdir prefix should be preserved, do so.
7567       if ($nodir_name =~ /^nobase_/)
7568         {
7569           $strip_subdir = 0;
7570           $nodir_name =~ s/^nobase_//;
7571         }
7573       # If files should be distributed, do so.
7574       my $dist_p = 0;
7575       if ($can_dist)
7576         {
7577           $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
7578                      || (! $default_dist && $nodir_name =~ /^dist_/));
7579           $nodir_name =~ s/^(dist|nodist)_//;
7580         }
7583       # Use the location of the currently processed variable.
7584       # We are not processing a particular condition, so pick the first
7585       # available.
7586       my $tmpcond = $one_var->conditions->one_cond;
7587       my $where = $one_var->rdef ($tmpcond)->location->clone;
7589       # Append actual contents of where_PRIMARY variable to
7590       # @result, skipping @substitutions@.
7591       foreach my $locvals ($one_var->value_as_list_recursive (location => 1))
7592         {
7593           my ($loc, $value) = @$locvals;
7594           # Skip configure substitutions.
7595           if ($value =~ /^\@.*\@$/)
7596             {
7597               if ($nodir_name eq 'EXTRA')
7598                 {
7599                   error ($where,
7600                          "`$one_name' contains configure substitution, "
7601                          . "but shouldn't");
7602                 }
7603               # Check here to make sure variables defined in
7604               # configure.ac do not imply that EXTRA_PRIMARY
7605               # must be defined.
7606               elsif (! defined $configure_vars{$one_name})
7607                 {
7608                   $require_extra = $one_name
7609                     if $do_require;
7610                 }
7611             }
7612           else
7613             {
7614               # Strip any $(EXEEXT) suffix the user might have added, or this
7615               # will confuse &handle_source_transform and &check_canonical_spelling.
7616               # We'll add $(EXEEXT) back later anyway.
7617               # Do it here rather than in handle_programs so the uniquifying at the
7618               # end of this function works.
7619               ${$locvals}[1] =~ s/\$\(EXEEXT\)$//
7620                 if $primary eq 'PROGRAMS';
7622               push (@result, $locvals);
7623             }
7624         }
7625       # A blatant hack: we rewrite each _PROGRAMS primary to include
7626       # EXEEXT.
7627       append_exeext { 1 } $one_name
7628         if $primary eq 'PROGRAMS';
7629       # "EXTRA" shouldn't be used when generating clean targets,
7630       # all, or install targets.  We used to warn if EXTRA_FOO was
7631       # defined uselessly, but this was annoying.
7632       next
7633         if $nodir_name eq 'EXTRA';
7635       if ($nodir_name eq 'check')
7636         {
7637           push (@check, '$(' . $one_name . ')');
7638         }
7639       else
7640         {
7641           push (@used, '$(' . $one_name . ')');
7642         }
7644       # Is this to be installed?
7645       my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
7647       # If so, with install-exec? (or install-data?).
7648       my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o);
7650       my $check_options_p = $install_p && !! option 'std-options';
7652       # Use the location of the currently processed variable as context.
7653       $where->push_context ("while processing `$one_name'");
7655       # The variable containing all files to distribute.
7656       my $distvar = "\$($one_name)";
7657       $distvar = shadow_unconditionally ($one_name, $where)
7658         if ($dist_p && $one_var->has_conditional_contents);
7660       # Singular form of $PRIMARY.
7661       (my $one_primary = $primary) =~ s/S$//;
7662       $output_rules .= &file_contents ($file, $where,
7663                                        PRIMARY     => $primary,
7664                                        ONE_PRIMARY => $one_primary,
7665                                        DIR         => $X,
7666                                        NDIR        => $nodir_name,
7667                                        BASE        => $strip_subdir,
7669                                        EXEC      => $exec_p,
7670                                        INSTALL   => $install_p,
7671                                        DIST      => $dist_p,
7672                                        DISTVAR   => $distvar,
7673                                        'CK-OPTS' => $check_options_p);
7674     }
7676   # The JAVA variable is used as the name of the Java interpreter.
7677   # The PYTHON variable is used as the name of the Python interpreter.
7678   if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
7679     {
7680       # Define it.
7681       define_pretty_variable ($primary, TRUE, INTERNAL, @used);
7682       $output_vars .= "\n";
7683     }
7685   err_var ($require_extra,
7686            "`$require_extra' contains configure substitution,\n"
7687            . "but `EXTRA_$primary' not defined")
7688     if ($require_extra && ! var ('EXTRA_' . $primary));
7690   # Push here because PRIMARY might be configure time determined.
7691   push (@all, '$(' . $primary . ')')
7692     if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
7694   # Make the result unique.  This lets the user use conditionals in
7695   # a natural way, but still lets us program lazily -- we don't have
7696   # to worry about handling a particular object more than once.
7697   # We will keep only one location per object.
7698   my %result = ();
7699   for my $pair (@result)
7700     {
7701       my ($loc, $val) = @$pair;
7702       $result{$val} = $loc;
7703     }
7704   my @l = sort keys %result;
7705   return map { [$result{$_}->clone, $_] } @l;
7709 ################################################################
7711 # Each key in this hash is the name of a directory holding a
7712 # Makefile.in.  These variables are local to `is_make_dir'.
7713 my %make_dirs = ();
7714 my $make_dirs_set = 0;
7716 sub is_make_dir
7718     my ($dir) = @_;
7719     if (! $make_dirs_set)
7720     {
7721         foreach my $iter (@configure_input_files)
7722         {
7723             $make_dirs{dirname ($iter)} = 1;
7724         }
7725         # We also want to notice Makefile.in's.
7726         foreach my $iter (@other_input_files)
7727         {
7728             if ($iter =~ /Makefile\.in$/)
7729             {
7730                 $make_dirs{dirname ($iter)} = 1;
7731             }
7732         }
7733         $make_dirs_set = 1;
7734     }
7735     return defined $make_dirs{$dir};
7738 ################################################################
7740 # Find the aux dir.  This should match the algorithm used by
7741 # ./configure. (See the Autoconf documentation for for
7742 # AC_CONFIG_AUX_DIR.)
7743 sub locate_aux_dir ()
7745   if (! $config_aux_dir_set_in_configure_ac)
7746     {
7747       # The default auxiliary directory is the first
7748       # of ., .., or ../.. that contains install-sh.
7749       # Assume . if install-sh doesn't exist yet.
7750       for my $dir (qw (. .. ../..))
7751         {
7752           if (-f "$dir/install-sh")
7753             {
7754               $config_aux_dir = $dir;
7755               last;
7756             }
7757         }
7758       $config_aux_dir = '.' unless $config_aux_dir;
7759     }
7760   # Avoid unsightly '/.'s.
7761   $am_config_aux_dir =
7762     '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
7763   $am_config_aux_dir =~ s,/*$,,;
7767 # &maybe_push_required_file ($DIR, $FILE, $FULLFILE)
7768 # --------------------------------------------------
7769 # See if we want to push this file onto dist_common.  This function
7770 # encodes the rules for deciding when to do so.
7771 sub maybe_push_required_file
7773   my ($dir, $file, $fullfile) = @_;
7775   if ($dir eq $relative_dir)
7776     {
7777       push_dist_common ($file);
7778       return 1;
7779     }
7780   elsif ($relative_dir eq '.' && ! &is_make_dir ($dir))
7781     {
7782       # If we are doing the topmost directory, and the file is in a
7783       # subdir which does not have a Makefile, then we distribute it
7784       # here.
7786       # If a required file is above the source tree, it is important
7787       # to prefix it with `$(srcdir)' so that no VPATH search is
7788       # performed.  Otherwise problems occur with Make implementations
7789       # that rewrite and simplify rules whose dependencies are found in a
7790       # VPATH location.  Here is an example with OSF1/Tru64 Make.
7791       #
7792       #   % cat Makefile
7793       #   VPATH = sub
7794       #   distdir: ../a
7795       #           echo ../a
7796       #   % ls
7797       #   Makefile a
7798       #   % make
7799       #   echo a
7800       #   a
7801       #
7802       # Dependency `../a' was found in `sub/../a', but this make
7803       # implementation simplified it as `a'.  (Note that the sub/
7804       # directory does not even exist.)
7805       #
7806       # This kind of VPATH rewriting seems hard to cancel.  The
7807       # distdir.am hack against VPATH rewriting works only when no
7808       # simplification is done, i.e., for dependencies which are in
7809       # subdirectories, not in enclosing directories.  Hence, in
7810       # the latter case we use a full path to make sure no VPATH
7811       # search occurs.
7812       $fullfile = '$(srcdir)/' . $fullfile
7813         if $dir =~ m,^\.\.(?:$|/),;
7815       push_dist_common ($fullfile);
7816       return 1;
7817     }
7818   return 0;
7822 # If a file name appears as a key in this hash, then it has already
7823 # been checked for.  This allows us not to report the same error more
7824 # than once.
7825 my %required_file_not_found = ();
7827 # &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES)
7828 # --------------------------------------------------------------
7829 # Verify that the file must exist in $DIRECTORY, or install it.
7830 # $MYSTRICT is the strictness level at which this file becomes required.
7831 sub require_file_internal ($$$@)
7833   my ($where, $mystrict, $dir, @files) = @_;
7835   foreach my $file (@files)
7836     {
7837       my $fullfile = "$dir/$file";
7838       my $found_it = 0;
7839       my $dangling_sym = 0;
7841       if (-l $fullfile && ! -f $fullfile)
7842         {
7843           $dangling_sym = 1;
7844         }
7845       elsif (dir_has_case_matching_file ($dir, $file))
7846         {
7847           $found_it = 1;
7848           maybe_push_required_file ($dir, $file, $fullfile);
7849         }
7851       # `--force-missing' only has an effect if `--add-missing' is
7852       # specified.
7853       if ($found_it && (! $add_missing || ! $force_missing))
7854         {
7855           next;
7856         }
7857       else
7858         {
7859           # If we've already looked for it, we're done.  You might
7860           # wonder why we don't do this before searching for the
7861           # file.  If we do that, then something like
7862           # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
7863           # DIST_COMMON.
7864           if (! $found_it)
7865             {
7866               next if defined $required_file_not_found{$fullfile};
7867               $required_file_not_found{$fullfile} = 1;
7868             }
7870           if ($strictness >= $mystrict)
7871             {
7872               if ($dangling_sym && $add_missing)
7873                 {
7874                   unlink ($fullfile);
7875                 }
7877               my $trailer = '';
7878               my $trailer2 = '';
7879               my $suppress = 0;
7881               # Only install missing files according to our desired
7882               # strictness level.
7883               my $message = "required file `$fullfile' not found";
7884               if ($add_missing)
7885                 {
7886                   if (-f "$libdir/$file")
7887                     {
7888                       $suppress = 1;
7890                       # Install the missing file.  Symlink if we
7891                       # can, copy if we must.  Note: delete the file
7892                       # first, in case it is a dangling symlink.
7893                       $message = "installing `$fullfile'";
7895                       # The license file should not be volatile.
7896                       if ($file eq "COPYING")
7897                         {
7898                           $message .= " using GNU General Public License v3 file";
7899                           $trailer2 = "\n    Consider adding the COPYING file"
7900                                     . " to the version control system"
7901                                     . "\n    for your code, to avoid questions"
7902                                     . " about which license your project uses.";
7903                         }
7905                       # Windows Perl will hang if we try to delete a
7906                       # file that doesn't exist.
7907                       unlink ($fullfile) if -f $fullfile;
7908                       if ($symlink_exists && ! $copy_missing)
7909                         {
7910                           if (! symlink ("$libdir/$file", $fullfile)
7911                               || ! -e $fullfile)
7912                             {
7913                               $suppress = 0;
7914                               $trailer = "; error while making link: $!";
7915                             }
7916                         }
7917                       elsif (system ('cp', "$libdir/$file", $fullfile))
7918                         {
7919                           $suppress = 0;
7920                           $trailer = "\n    error while copying";
7921                         }
7922                       set_dir_cache_file ($dir, $file);
7923                     }
7925                   if (! maybe_push_required_file (dirname ($fullfile),
7926                                                   $file, $fullfile))
7927                     {
7928                       if (! $found_it && ! $automake_will_process_aux_dir)
7929                         {
7930                           # We have added the file but could not push it
7931                           # into DIST_COMMON, probably because this is
7932                           # an auxiliary file and we are not processing
7933                           # the top level Makefile.  Furthermore Automake
7934                           # hasn't been asked to create the Makefile.in
7935                           # that distributes the aux dir files.
7936                           error ($where, 'Please make a full run of automake'
7937                                  . " so $fullfile gets distributed.");
7938                         }
7939                     }
7940                 }
7941               else
7942                 {
7943                   $trailer = "\n  `automake --add-missing' can install `$file'"
7944                     if -f "$libdir/$file";
7945                 }
7947               # If --force-missing was specified, and we have
7948               # actually found the file, then do nothing.
7949               next
7950                 if $found_it && $force_missing;
7952               # If we couldn't install the file, but it is a target in
7953               # the Makefile, don't print anything.  This allows files
7954               # like README, AUTHORS, or THANKS to be generated.
7955               next
7956                 if !$suppress && rule $file;
7958               msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2");
7959             }
7960         }
7961     }
7964 # &require_file ($WHERE, $MYSTRICT, @FILES)
7965 # -----------------------------------------
7966 sub require_file ($$@)
7968     my ($where, $mystrict, @files) = @_;
7969     require_file_internal ($where, $mystrict, $relative_dir, @files);
7972 # &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7973 # -----------------------------------------------------------
7974 sub require_file_with_macro ($$$@)
7976     my ($cond, $macro, $mystrict, @files) = @_;
7977     $macro = rvar ($macro) unless ref $macro;
7978     require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7981 # &require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7982 # ----------------------------------------------------------------
7983 # Require an AC_LIBSOURCEd file.  If AC_CONFIG_LIBOBJ_DIR was called, it
7984 # must be in that directory.  Otherwise expect it in the current directory.
7985 sub require_libsource_with_macro ($$$@)
7987     my ($cond, $macro, $mystrict, @files) = @_;
7988     $macro = rvar ($macro) unless ref $macro;
7989     if ($config_libobj_dir)
7990       {
7991         require_file_internal ($macro->rdef ($cond)->location, $mystrict,
7992                                $config_libobj_dir, @files);
7993       }
7994     else
7995       {
7996         require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7997       }
8000 # Queue to push require_conf_file requirements to.
8001 my $required_conf_file_queue;
8003 # &queue_required_conf_file ($QUEUE, $KEY, $DIR, $WHERE, $MYSTRICT, @FILES)
8004 # -------------------------------------------------------------------------
8005 sub queue_required_conf_file ($$$$@)
8007     my ($queue, $key, $dir, $where, $mystrict, @files) = @_;
8008     my @serial_loc;
8009     if (ref $where)
8010       {
8011         @serial_loc = (QUEUE_LOCATION, $where->serialize ());
8012       }
8013     else
8014       {
8015         @serial_loc = (QUEUE_STRING, $where);
8016       }
8017     $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files);
8020 # &require_queued_conf_file ($QUEUE)
8021 # ----------------------------------
8022 sub require_queued_conf_file ($)
8024     my ($queue) = @_;
8025     my $where;
8026     my $dir = $queue->dequeue ();
8027     my $loc_key = $queue->dequeue ();
8028     if ($loc_key eq QUEUE_LOCATION)
8029       {
8030         $where = Automake::Location::deserialize ($queue);
8031       }
8032     elsif ($loc_key eq QUEUE_STRING)
8033       {
8034         $where = $queue->dequeue ();
8035       }
8036     else
8037       {
8038         prog_error "unexpected key $loc_key";
8039       }
8040     my $mystrict = $queue->dequeue ();
8041     my $nfiles = $queue->dequeue ();
8042     my @files;
8043     push @files, $queue->dequeue ()
8044       foreach (1 .. $nfiles);
8046     # Dequeuing happens outside of per-makefile context, so we have to
8047     # set the variables used by require_file_internal and the functions
8048     # it calls.  Gross!
8049     $relative_dir = $dir;
8050     require_file_internal ($where, $mystrict, $config_aux_dir, @files);
8053 # &require_conf_file ($WHERE, $MYSTRICT, @FILES)
8054 # ----------------------------------------------
8055 # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR;
8056 # worker threads may queue up the action to be serialized by the master.
8058 # FIXME: this seriously relies on the semantics of require_file_internal
8059 # and maybe_push_required_file, in that we exploit the fact that only the
8060 # contents of the last handled output file may be impacted (which in turn
8061 # is dealt with by the master thread).
8062 sub require_conf_file ($$@)
8064     my ($where, $mystrict, @files) = @_;
8065     if (defined $required_conf_file_queue)
8066       {
8067         queue_required_conf_file ($required_conf_file_queue, QUEUE_CONF_FILE,
8068                                   $relative_dir, $where, $mystrict, @files);
8069       }
8070     else
8071       {
8072         require_file_internal ($where, $mystrict, $config_aux_dir, @files);
8073       }
8077 # &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
8078 # ----------------------------------------------------------------
8079 sub require_conf_file_with_macro ($$$@)
8081     my ($cond, $macro, $mystrict, @files) = @_;
8082     require_conf_file (rvar ($macro)->rdef ($cond)->location,
8083                        $mystrict, @files);
8086 ################################################################
8088 # &require_build_directory ($DIRECTORY)
8089 # -------------------------------------
8090 # Emit rules to create $DIRECTORY if needed, and return
8091 # the file that any target requiring this directory should be made
8092 # dependent upon.
8093 # We don't want to emit the rule twice, and want to reuse it
8094 # for directories with equivalent names (e.g., `foo/bar' and `./foo//bar').
8095 sub require_build_directory ($)
8097   my $directory = shift;
8099   return $directory_map{$directory} if exists $directory_map{$directory};
8101   my $cdir = File::Spec->canonpath ($directory);
8103   if (exists $directory_map{$cdir})
8104     {
8105       my $stamp = $directory_map{$cdir};
8106       $directory_map{$directory} = $stamp;
8107       return $stamp;
8108     }
8110   my $dirstamp = "$cdir/\$(am__dirstamp)";
8112   $directory_map{$directory} = $dirstamp;
8113   $directory_map{$cdir} = $dirstamp;
8115   # Set a variable for the dirstamp basename.
8116   define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
8117                           '$(am__leading_dot)dirstamp');
8119   # Directory must be removed by `make distclean'.
8120   $clean_files{$dirstamp} = DIST_CLEAN;
8122   $output_rules .= ("$dirstamp:\n"
8123                     . "\t\@\$(MKDIR_P) $directory\n"
8124                     . "\t\@: > $dirstamp\n");
8126   return $dirstamp;
8129 # &require_build_directory_maybe ($FILE)
8130 # --------------------------------------
8131 # If $FILE lies in a subdirectory, emit a rule to create this
8132 # directory and return the file that $FILE should be made
8133 # dependent upon.  Otherwise, just return the empty string.
8134 sub require_build_directory_maybe ($)
8136     my $file = shift;
8137     my $directory = dirname ($file);
8139     if ($directory ne '.')
8140     {
8141         return require_build_directory ($directory);
8142     }
8143     else
8144     {
8145         return '';
8146     }
8149 ################################################################
8151 # Push a list of files onto dist_common.
8152 sub push_dist_common
8154   prog_error "push_dist_common run after handle_dist"
8155     if $handle_dist_run;
8156   Automake::Variable::define ('DIST_COMMON', VAR_AUTOMAKE, '+', TRUE, "@_",
8157                               '', INTERNAL, VAR_PRETTY);
8161 ################################################################
8163 # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN)
8164 # ----------------------------------------------
8165 # Generate a Makefile.in given the name of the corresponding Makefile and
8166 # the name of the file output by config.status.
8167 sub generate_makefile ($$)
8169   my ($makefile_am, $makefile_in) = @_;
8171   # Reset all the Makefile.am related variables.
8172   initialize_per_input;
8174   # AUTOMAKE_OPTIONS can contains -W flags to disable or enable
8175   # warnings for this file.  So hold any warning issued before
8176   # we have processed AUTOMAKE_OPTIONS.
8177   buffer_messages ('warning');
8179   # Name of input file ("Makefile.am") and output file
8180   # ("Makefile.in").  These have no directory components.
8181   $am_file_name = basename ($makefile_am);
8182   $in_file_name = basename ($makefile_in);
8184   # $OUTPUT is encoded.  If it contains a ":" then the first element
8185   # is the real output file, and all remaining elements are input
8186   # files.  We don't scan or otherwise deal with these input files,
8187   # other than to mark them as dependencies.  See
8188   # &scan_autoconf_files for details.
8189   my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in});
8191   $relative_dir = dirname ($makefile);
8192   $am_relative_dir = dirname ($makefile_am);
8193   $topsrcdir = backname ($relative_dir);
8195   read_main_am_file ($makefile_am);
8196   if (handle_options)
8197     {
8198       # Process buffered warnings.
8199       flush_messages;
8200       # Fatal error.  Just return, so we can continue with next file.
8201       return;
8202     }
8203   # Process buffered warnings.
8204   flush_messages;
8206   # There are a few install-related variables that you should not define.
8207   foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
8208     {
8209       my $v = var $var;
8210       if ($v)
8211         {
8212           my $def = $v->def (TRUE);
8213           prog_error "$var not defined in condition TRUE"
8214             unless $def;
8215           reject_var $var, "`$var' should not be defined"
8216             if $def->owner != VAR_AUTOMAKE;
8217         }
8218     }
8220   # Catch some obsolete variables.
8221   msg_var ('obsolete', 'INCLUDES',
8222            "`INCLUDES' is the old name for `AM_CPPFLAGS' (or `*_CPPFLAGS')")
8223     if var ('INCLUDES');
8225   # Must do this after reading .am file.
8226   define_variable ('subdir', $relative_dir, INTERNAL);
8228   # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that
8229   # recursive rules are enabled.
8230   define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '')
8231     if var 'DIST_SUBDIRS' && ! var 'SUBDIRS';
8233   # Check first, because we might modify some state.
8234   check_cygnus;
8235   check_gnu_standards;
8236   check_gnits_standards;
8238   handle_configure ($makefile_am, $makefile_in, $makefile, @inputs);
8239   handle_gettext;
8240   handle_libraries;
8241   handle_ltlibraries;
8242   handle_programs;
8243   handle_scripts;
8245   # These must be run after all the sources are scanned.  They
8246   # use variables defined by &handle_libraries, &handle_ltlibraries,
8247   # or &handle_programs.
8248   handle_compile;
8249   handle_languages;
8250   handle_libtool;
8252   # Variables used by distdir.am and tags.am.
8253   define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources);
8254   if (! option 'no-dist')
8255     {
8256       define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources);
8257     }
8259   handle_multilib;
8260   handle_texinfo;
8261   handle_emacs_lisp;
8262   handle_python;
8263   handle_java;
8264   handle_man_pages;
8265   handle_data;
8266   handle_headers;
8267   handle_subdirs;
8268   handle_tags;
8269   handle_minor_options;
8270   # Must come after handle_programs so that %known_programs is up-to-date.
8271   handle_tests;
8273   # This must come after most other rules.
8274   handle_dist;
8276   handle_footer;
8277   do_check_merge_target;
8278   handle_all ($makefile);
8280   # FIXME: Gross!
8281   if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8282     {
8283       $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
8284     }
8285   if (var ('nobase_lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8286     {
8287       $output_rules .= "install-binPROGRAMS: install-nobase_libLTLIBRARIES\n\n";
8288     }
8290   handle_install;
8291   handle_clean ($makefile);
8292   handle_factored_dependencies;
8294   # Comes last, because all the above procedures may have
8295   # defined or overridden variables.
8296   $output_vars .= output_variables;
8298   check_typos;
8300   my ($out_file) = $output_directory . '/' . $makefile_in;
8302   if ($exit_code != 0)
8303     {
8304       verb "not writing $out_file because of earlier errors";
8305       return;
8306     }
8308   if (! -d ($output_directory . '/' . $am_relative_dir))
8309     {
8310       mkdir ($output_directory . '/' . $am_relative_dir, 0755);
8311     }
8313   # We make sure that `all:' is the first target.
8314   my $output =
8315     "$output_vars$output_all$output_header$output_rules$output_trailer";
8317   # Decide whether we must update the output file or not.
8318   # We have to update in the following situations.
8319   #  * $force_generation is set.
8320   #  * any of the output dependencies is younger than the output
8321   #  * the contents of the output is different (this can happen
8322   #    if the project has been populated with a file listed in
8323   #    @common_files since the last run).
8324   # Output's dependencies are split in two sets:
8325   #  * dependencies which are also configure dependencies
8326   #    These do not change between each Makefile.am
8327   #  * other dependencies, specific to the Makefile.am being processed
8328   #    (such as the Makefile.am itself, or any Makefile fragment
8329   #    it includes).
8330   my $timestamp = mtime $out_file;
8331   if (! $force_generation
8332       && $configure_deps_greatest_timestamp < $timestamp
8333       && $output_deps_greatest_timestamp < $timestamp
8334       && $output eq contents ($out_file))
8335     {
8336       verb "$out_file unchanged";
8337       # No need to update.
8338       return;
8339     }
8341   if (-e $out_file)
8342     {
8343       unlink ($out_file)
8344         or fatal "cannot remove $out_file: $!\n";
8345     }
8347   my $gm_file = new Automake::XFile "> $out_file";
8348   verb "creating $out_file";
8349   print $gm_file $output;
8352 ################################################################
8357 ################################################################
8359 # Helper function for usage().
8360 sub print_autodist_files (@)
8362   my @lcomm = sort (&uniq (@_));
8364   my @four;
8365   format USAGE_FORMAT =
8366   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
8367   $four[0],           $four[1],           $four[2],           $four[3]
8369   local $~ = "USAGE_FORMAT";
8371   my $cols = 4;
8372   my $rows = int(@lcomm / $cols);
8373   my $rest = @lcomm % $cols;
8375   if ($rest)
8376     {
8377       $rows++;
8378     }
8379   else
8380     {
8381       $rest = $cols;
8382     }
8384   for (my $y = 0; $y < $rows; $y++)
8385     {
8386       @four = ("", "", "", "");
8387       for (my $x = 0; $x < $cols; $x++)
8388         {
8389           last if $y + 1 == $rows && $x == $rest;
8391           my $idx = (($x > $rest)
8392                ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
8393                : ($rows * $x));
8395           $idx += $y;
8396           $four[$x] = $lcomm[$idx];
8397         }
8398       write;
8399     }
8403 # Print usage information.
8404 sub usage ()
8406     print "Usage: $0 [OPTION] ... [Makefile]...
8408 Generate Makefile.in for configure from Makefile.am.
8410 Operation modes:
8411       --help               print this help, then exit
8412       --version            print version number, then exit
8413   -v, --verbose            verbosely list files processed
8414       --no-force           only update Makefile.in's that are out of date
8415   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY
8417 Dependency tracking:
8418   -i, --ignore-deps      disable dependency tracking code
8419       --include-deps     enable dependency tracking code
8421 Flavors:
8422       --cygnus           assume program is part of Cygnus-style tree
8423       --foreign          set strictness to foreign
8424       --gnits            set strictness to gnits
8425       --gnu              set strictness to gnu
8427 Library files:
8428   -a, --add-missing      add missing standard files to package
8429       --libdir=DIR       directory storing library files
8430   -c, --copy             with -a, copy missing files (default is symlink)
8431   -f, --force-missing    force update of standard files
8434     Automake::ChannelDefs::usage;
8436     print "\nFiles automatically distributed if found " .
8437           "(always):\n";
8438     print_autodist_files @common_files;
8439     print "\nFiles automatically distributed if found " .
8440           "(under certain conditions):\n";
8441     print_autodist_files @common_sometimes;
8443     print '
8444 Report bugs to <@PACKAGE_BUGREPORT@>.
8445 GNU Automake home page: <@PACKAGE_URL@>.
8446 General help using GNU software: <http://www.gnu.org/gethelp/>.
8449     # --help always returns 0 per GNU standards.
8450     exit 0;
8454 # &version ()
8455 # -----------
8456 # Print version information
8457 sub version ()
8459   print <<EOF;
8460 automake (GNU $PACKAGE) $VERSION
8461 Copyright (C) 2011 Free Software Foundation, Inc.
8462 License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>
8463 This is free software: you are free to change and redistribute it.
8464 There is NO WARRANTY, to the extent permitted by law.
8466 Written by Tom Tromey <tromey\@redhat.com>
8467        and Alexandre Duret-Lutz <adl\@gnu.org>.
8469   # --version always returns 0 per GNU standards.
8470   exit 0;
8473 ################################################################
8475 # Parse command line.
8476 sub parse_arguments ()
8478   # Start off as gnu.
8479   set_strictness ('gnu');
8481   my $cli_where = new Automake::Location;
8482   my %cli_options =
8483     (
8484      'libdir=s' => \$libdir,
8485      'gnu'              => sub { set_strictness ('gnu'); },
8486      'gnits'            => sub { set_strictness ('gnits'); },
8487      'cygnus'           => sub { set_global_option ('cygnus', $cli_where); },
8488      'foreign'          => sub { set_strictness ('foreign'); },
8489      'include-deps'     => sub { unset_global_option ('no-dependencies'); },
8490      'i|ignore-deps'    => sub { set_global_option ('no-dependencies',
8491                                                     $cli_where); },
8492      'no-force' => sub { $force_generation = 0; },
8493      'f|force-missing'  => \$force_missing,
8494      'o|output-dir=s'   => \$output_directory,
8495      'a|add-missing'    => \$add_missing,
8496      'c|copy'           => \$copy_missing,
8497      'v|verbose'        => sub { setup_channel 'verb', silent => 0; },
8498      'W|warnings=s'     => \&parse_warnings,
8499      # These long options (--Werror and --Wno-error) for backward
8500      # compatibility.  Use -Werror and -Wno-error today.
8501      'Werror'           => sub { parse_warnings 'W', 'error'; },
8502      'Wno-error'        => sub { parse_warnings 'W', 'no-error'; },
8503      );
8504   use Getopt::Long;
8505   Getopt::Long::config ("bundling", "pass_through");
8507   # See if --version or --help is used.  We want to process these before
8508   # anything else because the GNU Coding Standards require us to
8509   # `exit 0' after processing these options, and we can't guarantee this
8510   # if we treat other options first.  (Handling other options first
8511   # could produce error diagnostics, and in this condition it is
8512   # confusing if Automake does `exit 0'.)
8513   my %cli_options_1st_pass =
8514     (
8515      'version' => \&version,
8516      'help'    => \&usage,
8517      # Recognize all other options (and their arguments) but do nothing.
8518      map { $_ => sub {} } (keys %cli_options)
8519      );
8520   my @ARGV_backup = @ARGV;
8521   Getopt::Long::GetOptions %cli_options_1st_pass
8522     or exit 1;
8523   @ARGV = @ARGV_backup;
8525   # Now *really* process the options.  This time we know that --help
8526   # and --version are not present, but we specify them nonetheless so
8527   # that ambiguous abbreviation are diagnosed.
8528   Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {}
8529     or exit 1;
8531   if (defined $output_directory)
8532     {
8533       msg 'obsolete', "`--output-dir' is deprecated\n";
8534     }
8535   else
8536     {
8537       # In the next release we'll remove this entirely.
8538       $output_directory = '.';
8539     }
8541   return unless @ARGV;
8543   if ($ARGV[0] =~ /^-./)
8544     {
8545       my %argopts;
8546       for my $k (keys %cli_options)
8547         {
8548           if ($k =~ /(.*)=s$/)
8549             {
8550               map { $argopts{(length ($_) == 1)
8551                              ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
8552             }
8553         }
8554       if ($ARGV[0] eq '--')
8555         {
8556           shift @ARGV;
8557         }
8558       elsif (exists $argopts{$ARGV[0]})
8559         {
8560           fatal ("option `$ARGV[0]' requires an argument\n"
8561                  . "Try `$0 --help' for more information.");
8562         }
8563       else
8564         {
8565           fatal ("unrecognized option `$ARGV[0]'.\n"
8566                  . "Try `$0 --help' for more information.");
8567         }
8568     }
8570   my $errspec = 0;
8571   foreach my $arg (@ARGV)
8572     {
8573       fatal ("empty argument\nTry `$0 --help' for more information.")
8574         if ($arg eq '');
8576       # Handle $local:$input syntax.
8577       my ($local, @rest) = split (/:/, $arg);
8578       @rest = ("$local.in",) unless @rest;
8579       my $input = locate_am @rest;
8580       if ($input)
8581         {
8582           push @input_files, $input;
8583           $output_files{$input} = join (':', ($local, @rest));
8584         }
8585       else
8586         {
8587           error "no Automake input file found for `$arg'";
8588           $errspec = 1;
8589         }
8590     }
8591   fatal "no input file found among supplied arguments"
8592     if $errspec && ! @input_files;
8596 # handle_makefile ($MAKEFILE_IN)
8597 # ------------------------------
8598 # Deal with $MAKEFILE_IN.
8599 sub handle_makefile ($)
8601   my ($file) =  @_;
8602   ($am_file = $file) =~ s/\.in$//;
8603   if (! -f ($am_file . '.am'))
8604     {
8605       error "`$am_file.am' does not exist";
8606     }
8607   else
8608     {
8609       # Any warning setting now local to this Makefile.am.
8610       dup_channel_setup;
8612       generate_makefile ($am_file . '.am', $file);
8614       # Back out any warning setting.
8615       drop_channel_setup;
8616     }
8619 # handle_makefiles_serial ()
8620 # --------------------------
8621 # Deal with all makefiles, without threads.
8622 sub handle_makefiles_serial ()
8624   foreach my $file (@input_files)
8625     {
8626       handle_makefile ($file);
8627     }
8630 # get_number_of_threads ()
8631 # ------------------------
8632 # Logic for deciding how many worker threads to use.
8633 sub get_number_of_threads
8635   my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0;
8637   $nthreads = 0
8638     unless $nthreads =~ /^[0-9]+$/;
8640   # It doesn't make sense to use more threads than makefiles,
8641   my $max_threads = @input_files;
8643   # but a single worker thread is helpful for exposing bugs.
8644   if ($automake_will_process_aux_dir && $max_threads > 1)
8645     {
8646       $max_threads--;
8647     }
8648   if ($nthreads > $max_threads)
8649     {
8650       $nthreads = $max_threads;
8651     }
8652   return $nthreads;
8655 # handle_makefiles_threaded ($NTHREADS)
8656 # -------------------------------------
8657 # Deal with all makefiles, using threads.  The general strategy is to
8658 # spawn NTHREADS worker threads, dispatch makefiles to them, and let the
8659 # worker threads push back everything that needs serialization:
8660 # * warning and (normal) error messages, for stable stderr output
8661 #   order and content (avoiding duplicates, for example),
8662 # * races when installing aux files (and respective messages),
8663 # * races when collecting aux files for distribution.
8665 # The latter requires that the makefile that deals with the aux dir
8666 # files be handled last, done by the master thread.
8667 sub handle_makefiles_threaded ($)
8669   my ($nthreads) = @_;
8671   my @queued_input_files = @input_files;
8672   my $last_input_file = undef;
8673   if ($automake_will_process_aux_dir)
8674     {
8675       $last_input_file = pop @queued_input_files;
8676     }
8678   # The file queue distributes all makefiles, the message queues
8679   # collect all serializations needed for respective files.
8680   my $file_queue = Thread::Queue->new;
8681   my %msg_queues;
8682   foreach my $file (@queued_input_files)
8683     {
8684       $msg_queues{$file} = Thread::Queue->new;
8685     }
8687   verb "spawning $nthreads worker threads";
8688   my @threads = (1 .. $nthreads);
8689   foreach my $t (@threads)
8690     {
8691       $t = threads->new (sub
8692         {
8693           while (my $file = $file_queue->dequeue)
8694             {
8695               verb "handling $file";
8696               my $queue = $msg_queues{$file};
8697               setup_channel_queue ($queue, QUEUE_MESSAGE);
8698               $required_conf_file_queue = $queue;
8699               handle_makefile ($file);
8700               $queue->enqueue (undef);
8701               setup_channel_queue (undef, undef);
8702               $required_conf_file_queue = undef;
8703             }
8704           return $exit_code;
8705         });
8706     }
8708   # Queue all normal makefiles.
8709   verb "queuing " . @queued_input_files . " input files";
8710   $file_queue->enqueue (@queued_input_files, (undef) x @threads);
8712   # Collect and process serializations.
8713   foreach my $file (@queued_input_files)
8714     {
8715       verb "dequeuing messages for " . $file;
8716       reset_local_duplicates ();
8717       my $queue = $msg_queues{$file};
8718       while (my $key = $queue->dequeue)
8719         {
8720           if ($key eq QUEUE_MESSAGE)
8721             {
8722               pop_channel_queue ($queue);
8723             }
8724           elsif ($key eq QUEUE_CONF_FILE)
8725             {
8726               require_queued_conf_file ($queue);
8727             }
8728           else
8729             {
8730               prog_error "unexpected key $key";
8731             }
8732         }
8733     }
8735   foreach my $t (@threads)
8736     {
8737       my @exit_thread = $t->join;
8738       $exit_code = $exit_thread[0]
8739         if ($exit_thread[0] > $exit_code);
8740     }
8742   # The master processes the last file.
8743   if ($automake_will_process_aux_dir)
8744     {
8745       verb "processing last input file";
8746       handle_makefile ($last_input_file);
8747     }
8750 ################################################################
8752 # Parse the WARNINGS environment variable.
8753 parse_WARNINGS;
8755 # Parse command line.
8756 parse_arguments;
8758 $configure_ac = require_configure_ac;
8760 # Do configure.ac scan only once.
8761 scan_autoconf_files;
8763 if (! @input_files)
8764   {
8765     my $msg = '';
8766     $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?"
8767       if -f 'Makefile.am';
8768     fatal ("no `Makefile.am' found for any configure output$msg");
8769   }
8771 my $nthreads = get_number_of_threads ();
8773 if ($perl_threads && $nthreads >= 1)
8774   {
8775     handle_makefiles_threaded ($nthreads);
8776   }
8777 else
8778   {
8779     handle_makefiles_serial ();
8780   }
8782 exit $exit_code;
8785 ### Setup "GNU" style for perl-mode and cperl-mode.
8786 ## Local Variables:
8787 ## perl-indent-level: 2
8788 ## perl-continued-statement-offset: 2
8789 ## perl-continued-brace-offset: 0
8790 ## perl-brace-offset: 0
8791 ## perl-brace-imaginary-offset: 0
8792 ## perl-label-offset: -2
8793 ## cperl-indent-level: 2
8794 ## cperl-brace-offset: 0
8795 ## cperl-continued-brace-offset: 0
8796 ## cperl-label-offset: -2
8797 ## cperl-extra-newline-before-brace: t
8798 ## cperl-merge-trailing-else: nil
8799 ## cperl-continued-statement-offset: 2
8800 ## End: