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