maint: adjust version for snapshot
[automake.git] / bin / automake.in
blobf04f5d5f55543dd02560ee9564c20e3cb6b940bf
1 #!@PERL@
2 # automake - create Makefile.in from Makefile.am            -*- perl -*-
3 # @configure_input@
4 # Copyright (C) 1994-2021 Free Software Foundation, Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2, or (at your option)
9 # any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
19 # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
20 # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and
21 # Alexandre Duret-Lutz <adl@gnu.org>.
23 package Automake;
25 use 5.006;
26 use strict;
27 use warnings FATAL => 'all';
29 BEGIN
31   unshift (@INC, '@datadir@/@PACKAGE@-@APIVERSION@')
32     unless $ENV{AUTOMAKE_UNINSTALLED};
34   # Override SHELL.  This is required on DJGPP so that system() uses
35   # bash, not COMMAND.COM which doesn't quote arguments properly.
36   # Other systems aren't expected to use $SHELL when Automake
37   # runs, but it should be safe to drop the "if DJGPP" guard if
38   # it turns up other systems need the same thing.  After all,
39   # if SHELL is used, ./configure's SHELL is always better than
40   # the user's SHELL (which may be something like tcsh).
41   $ENV{'SHELL'} = '@SHELL@' if exists $ENV{'DJDIR'};
44 use Carp;
45 use File::Basename;
46 use File::Spec;
48 use Automake::Config;
49 BEGIN
51   if ($perl_threads)
52     {
53       require threads;
54       import threads;
55       require Thread::Queue;
56       import Thread::Queue;
57     }
59 use Automake::General;
60 use Automake::XFile;
61 use Automake::Channels;
62 use Automake::ChannelDefs;
63 use Automake::Configure_ac;
64 use Automake::FileUtils;
65 use Automake::Location;
66 use Automake::Condition qw/TRUE FALSE/;
67 use Automake::DisjConditions;
68 use Automake::Options;
69 use Automake::Variable;
70 use Automake::VarDef;
71 use Automake::Rule;
72 use Automake::RuleDef;
73 use Automake::Wrap 'makefile_wrap';
74 use Automake::Language;
76 ## ----------------------- ##
77 ## Subroutine prototypes.  ##
78 ## ----------------------- ##
80 sub append_exeext (&$);
81 sub check_gnits_standards ();
82 sub check_gnu_standards ();
83 sub check_trailing_slash ($\$);
84 sub check_typos ();
85 sub define_files_variable ($\@$$);
86 sub define_standard_variables ();
87 sub define_verbose_libtool ();
88 sub define_verbose_texinfo ();
89 sub do_check_merge_target ();
90 sub get_number_of_threads ();
91 sub handle_compile ();
92 sub handle_data ();
93 sub handle_dist ();
94 sub handle_emacs_lisp ();
95 sub handle_factored_dependencies ();
96 sub handle_footer ();
97 sub handle_gettext ();
98 sub handle_headers ();
99 sub handle_install ();
100 sub handle_java ();
101 sub handle_languages ();
102 sub handle_libraries ();
103 sub handle_libtool ();
104 sub handle_ltlibraries ();
105 sub handle_makefiles_serial ();
106 sub handle_man_pages ();
107 sub handle_minor_options ();
108 sub handle_options ();
109 sub handle_programs ();
110 sub handle_python ();
111 sub handle_scripts ();
112 sub handle_silent ();
113 sub handle_subdirs ();
114 sub handle_tags ();
115 sub handle_targets ();
116 sub handle_tests ();
117 sub handle_tests_dejagnu ();
118 sub handle_texinfo ();
119 sub handle_user_recursion ();
120 sub initialize_per_input ();
121 sub lang_lex_finish ();
122 sub lang_sub_obj ();
123 sub lang_vala_finish ();
124 sub lang_yacc_finish ();
125 sub locate_aux_dir ();
126 sub parse_arguments ();
127 sub scan_aclocal_m4 ();
128 sub scan_autoconf_files ();
129 sub silent_flag ();
130 sub transform ($\%);
131 sub transform_token ($\%$);
132 sub usage ();
133 sub version ();
134 sub yacc_lex_finish_helper ();
136 ## ----------- ##
137 ## Constants.  ##
138 ## ----------- ##
140 # Some regular expressions.  One reason to put them here is that it
141 # makes indentation work better in Emacs.
143 # Writing singled-quoted-$-terminated regexes is a pain because
144 # perl-mode thinks of $' as the ${'} variable (instead of a $ followed
145 # by a closing quote.  Letting perl-mode think the quote is not closed
146 # leads to all sort of misindentations.  On the other hand, defining
147 # regexes as double-quoted strings is far less readable.  So usually
148 # we will write:
150 #  $REGEX = '^regex_value' . "\$";
152 my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
153 my $WHITE_PATTERN = '^\s*' . "\$";
154 my $COMMENT_PATTERN = '^#';
155 my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*';
156 # A rule has three parts: a list of targets, a list of dependencies,
157 # and optionally actions.
158 my $RULE_PATTERN =
159   "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";
161 # Only recognize leading spaces, not leading tabs.  If we recognize
162 # leading tabs here then we need to make the reader smarter, because
163 # otherwise it will think rules like 'foo=bar; \' are errors.
164 my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$";
165 # This pattern recognizes a Gnits version id and sets $1 if the
166 # release is an alpha release.  We also allow a suffix which can be
167 # used to extend the version number with a "fork" identifier.
168 my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';
170 my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$";
171 my $ELSE_PATTERN =
172   '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
173 my $ENDIF_PATTERN =
174   '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
175 my $PATH_PATTERN = '(\w|[+/.-])+';
176 # This will pass through anything not of the prescribed form.
177 my $INCLUDE_PATTERN = ('^include\s+'
178                        . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
179                        . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
180                        . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$");
182 # Directories installed during 'install-exec' phase.
183 my $EXEC_DIR_PATTERN =
184   '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$";
186 # Values for AC_CANONICAL_*
187 use constant AC_CANONICAL_BUILD  => 1;
188 use constant AC_CANONICAL_HOST   => 2;
189 use constant AC_CANONICAL_TARGET => 3;
191 # Values indicating when something should be cleaned.
192 use constant MOSTLY_CLEAN     => 0;
193 use constant CLEAN            => 1;
194 use constant DIST_CLEAN       => 2;
195 use constant MAINTAINER_CLEAN => 3;
197 # Libtool files.
198 my @libtool_files = qw(ltmain.sh config.guess config.sub);
199 # ltconfig appears here for compatibility with old versions of libtool.
200 my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh);
202 # Top-level files that can be foo.md instead of foo.  We assume that all
203 # but THANKS are required at strictness level gnu.
204 my @toplevelmd_ok = qw(AUTHORS ChangeLog INSTALL NEWS README THANKS);
206 # Commonly found files we look for and automatically include in DISTFILES.
207 my @common_files =
208     (qw(ABOUT-GNU ABOUT-NLS BACKLOG COPYING
209         COPYING.DOC COPYING.LIB COPYING.LESSER 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 =~ /$_[0]$/ } @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-objects' 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                   #
1851                   # There are problems with making this change; see
1852                   # https://bugs.gnu.org/20699 before making
1853                   # subdir-objects, let alone unconditional.
1854                   # (Making it non-overridable seems especially wrong.)
1855                   #
1856                   msg_var 'unsupported', $var,
1857                           "source file '$full' is in a subdirectory,"
1858                           . "\nbut option 'subdir-objects' is disabled";
1859                   msg 'unsupported', INTERNAL, <<'EOF', uniq_scope => US_GLOBAL;
1860 possible forward-incompatibility.
1861 At least one source file is in a subdirectory, but the 'subdir-objects'
1862 automake option hasn't been enabled.  For now, the corresponding output
1863 object file(s) will be placed in the top-level directory.  However, this
1864 behavior may change in a future Automake major version, with object
1865 files being placed in the same subdirectory as the corresponding sources.
1866 You are advised to start using 'subdir-objects' option throughout your
1867 project, to avoid future incompatibilities.
1869                 }
1870             }
1872             # If the object file has been renamed (because per-target
1873             # flags are used) we cannot compile the file with an
1874             # inference rule: we need an explicit rule.
1875             #
1876             # If the source is in a subdirectory and the object is in
1877             # the current directory, we also need an explicit rule.
1878             #
1879             # If both source and object files are in a subdirectory
1880             # (this happens when the subdir-objects option is used),
1881             # then the inference will work.
1882             #
1883             # The latter case deserves a historical note.  When the
1884             # subdir-objects option was added on 1999-04-11 it was
1885             # thought that inferences rules would work for
1886             # subdirectory objects too.  Later, on 1999-11-22,
1887             # automake was changed to output explicit rules even for
1888             # subdir-objects.  Nobody remembers why, but this occurred
1889             # soon after the merge of the user-dep-gen-branch so it
1890             # might be related.  In late 2003 people complained about
1891             # the size of the generated Makefile.ins (libgcj, with
1892             # 2200+ subdir objects was reported to have a 9MB
1893             # Makefile), so we now rely on inference rules again.
1894             # Maybe we'll run across the same issue as in the past,
1895             # but at least this time we can document it.  However since
1896             # dependency tracking has evolved it is possible that
1897             # our old problem no longer exists.
1898             # Using inference rules for subdir-objects has been tested
1899             # with GNU make, Solaris make, Ultrix make, BSD make,
1900             # HP-UX make, and OSF1 make successfully.
1901             if ($renamed
1902                 || ($directory ne '' && ! option 'subdir-objects')
1903                 # We must also use specific rules for a nodist_ source
1904                 # if its language requests it.
1905                 || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'}))
1906             {
1907                 my $obj_sans_ext = substr ($object, 0,
1908                                            - length ($this_obj_ext));
1909                 my $full_ansi;
1910                 if ($directory ne '')
1911                   {
1912                         $full_ansi = $directory . '/' . $base . $extension;
1913                   }
1914                 else
1915                   {
1916                         $full_ansi = $base . $extension;
1917                   }
1919                 my @specifics = ($full_ansi, $obj_sans_ext,
1920                                  # Only use $this_obj_ext in the derived
1921                                  # source case because in the other case we
1922                                  # *don't* want $(OBJEXT) to appear here.
1923                                  ($derived_source ? $this_obj_ext : '.o'),
1924                                  $extension);
1926                 # If we renamed the object then we want to use the
1927                 # per-executable flag name.  But if this is simply a
1928                 # subdir build then we still want to use the AM_ flag
1929                 # name.
1930                 if ($renamed)
1931                   {
1932                     unshift @specifics, $derived;
1933                     $aggregate = $derived;
1934                   }
1935                 else
1936                   {
1937                     unshift @specifics, 'AM';
1938                   }
1940                 # Each item on this list is a reference to a list consisting
1941                 # of four values followed by additional transform flags for
1942                 # file_contents.  The four values are the derived flag prefix
1943                 # (e.g. for 'foo_CFLAGS', it is 'foo'), the name of the
1944                 # source file, the base name of the output file, and
1945                 # the extension for the object file.
1946                 push (@{$lang_specific_files{$lang->name}},
1947                       [@specifics, %transform]);
1948             }
1949         }
1950         elsif ($extension eq $obj)
1951         {
1952             # This is probably the result of a direct suffix rule.
1953             # In this case we just accept the rewrite.
1954             $object = "$base$extension";
1955             $object = "$directory/$object" if $directory ne '';
1956             $linker = '';
1957         }
1958         else
1959         {
1960             # No error message here.  Used to have one, but it was
1961             # very unpopular.
1962             # FIXME: we could potentially do more processing here,
1963             # perhaps treating the new extension as though it were a
1964             # new source extension (as above).  This would require
1965             # more restructuring than is appropriate right now.
1966             next;
1967         }
1969         err_am "object '$object' created by '$full' and '$object_map{$object}'"
1970           if (defined $object_map{$object}
1971               && $object_map{$object} ne $full);
1973         my $comp_val = (($object =~ /\.lo$/)
1974                         ? COMPILE_LIBTOOL : COMPILE_ORDINARY);
1975         (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/;
1976         if (defined $object_compilation_map{$comp_obj}
1977             && $object_compilation_map{$comp_obj} != 0
1978             # Only see the error once.
1979             && ($object_compilation_map{$comp_obj}
1980                 != (COMPILE_LIBTOOL | COMPILE_ORDINARY))
1981             && $object_compilation_map{$comp_obj} != $comp_val)
1982           {
1983             err_am "object '$comp_obj' created both with libtool and without";
1984           }
1985         $object_compilation_map{$comp_obj} |= $comp_val;
1987         if (defined $lang)
1988         {
1989             # Let the language do some special magic if required.
1990             $lang->target_hook ($aggregate, $object, $full, %transform);
1991         }
1993         if ($derived_source)
1994           {
1995             prog_error ($lang->name . " has automatic dependency tracking")
1996               if $lang->autodep ne 'no';
1997             # Make sure this new source file is handled next.  That will
1998             # make it appear to be at the right place in the list.
1999             unshift (@files, $object);
2000             # Distribute derived sources unless the source they are
2001             # derived from is not.
2002             push_dist_common ($object)
2003               unless ($topparent =~ /^(?:nobase_)?nodist_/);
2004             next;
2005           }
2007         $linkers_used{$linker} = 1;
2009         push (@result, $object);
2011         if (! defined $object_map{$object})
2012         {
2013             my @dep_list = ();
2014             $object_map{$object} = $full;
2016             # If resulting object is in subdir, we need to make
2017             # sure the subdir exists at build time.
2018             if ($object =~ /\//)
2019             {
2020                 # FIXME: check that $DIRECTORY is somewhere in the
2021                 # project
2023                 # For Java, the way we're handling it right now, a
2024                 # '..' component doesn't make sense.
2025                 if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//)
2026                   {
2027                     err_am "'$full' should not contain a '..' component";
2028                   }
2030                 # Make sure *all* objects files in the subdirectory are
2031                 # removed by "make mostlyclean".  Not only this is more
2032                 # efficient than listing the object files to be removed
2033                 # individually (which would cause an 'rm' invocation for
2034                 # each of them -- very inefficient, see bug#10697), it
2035                 # would also leave stale object files in the subdirectory
2036                 # whenever a source file there is removed or renamed.
2037                 $compile_clean_files{"$directory/*.\$(OBJEXT)"} = MOSTLY_CLEAN;
2038                 if ($object =~ /\.lo$/)
2039                   {
2040                     # If we have a libtool object, then we also must remove
2041                     # any '.lo' objects in its same subdirectory.
2042                     $compile_clean_files{"$directory/*.lo"} = MOSTLY_CLEAN;
2043                     # Remember to cleanup .libs/ in this directory.
2044                     $libtool_clean_directories{$directory} = 1;
2045                   }
2047                 push (@dep_list, require_build_directory ($directory));
2049                 # If we're generating dependencies, we also want
2050                 # to make sure that the appropriate subdir of the
2051                 # .deps directory is created.
2052                 push (@dep_list,
2053                       require_build_directory ($directory . '/$(DEPDIR)'))
2054                   unless option 'no-dependencies';
2055             }
2057             pretty_print_rule ($object . ':', "\t", @dep_list)
2058                 if scalar @dep_list > 0;
2059         }
2061         # Transform .o or $o file into .P file (for automatic
2062         # dependency code).
2063         # Properly flatten multiple adjacent slashes, as Solaris 10 make
2064         # might fail over them in an include statement.
2065         # Leading double slashes may be special, as per Posix, so deal
2066         # with them carefully.
2067         if ($lang && $lang->autodep ne 'no')
2068         {
2069             my $depfile = $object;
2070             $depfile =~ s/\.([^.]*)$/.P$1/;
2071             $depfile =~ s/\$\(OBJEXT\)$/o/;
2072             my $maybe_extra_leading_slash = '';
2073             $maybe_extra_leading_slash = '/' if $depfile =~ m,^//[^/],;
2074             $depfile =~ s,/+,/,g;
2075             my $basename = basename ($depfile);
2076             # This might make $dirname empty, but we account for that below.
2077             (my $dirname = dirname ($depfile)) =~ s/\/*$//;
2078             $dirname = $maybe_extra_leading_slash . $dirname;
2079             $dep_files{$dirname . '/$(DEPDIR)/' . $basename} = 1;
2080         }
2081     }
2083     return @result;
2087 # $LINKER
2088 # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE,
2089 #                              $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM)
2090 # ---------------------------------------------------------------------------
2091 # Define an _OBJECTS variable for a _SOURCES variable (or subvariable)
2093 # Arguments are:
2094 #   $VAR is the name of the _SOURCES variable
2095 #   $OBJVAR is the name of the _OBJECTS variable if known (otherwise
2096 #     it will be generated and returned).
2097 #   $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but
2098 #     work done to determine the linker will be).
2099 #   $ONE_FILE is the canonical (transformed) name of object to build
2100 #   $OBJ is the object extension (i.e. either '.o' or '.lo').
2101 #   $TOPPARENT is the _SOURCES variable being processed.
2102 #   $WHERE context into which this definition is done
2103 #   %TRANSFORM extra arguments to pass to file_contents when producing
2104 #     rules
2106 # Result is a pair ($LINKER, $OBJVAR):
2107 #    $LINKER is a boolean, true if a linker is needed to deal with the objects
2108 sub define_objects_from_sources
2110   my ($var, $objvar, $nodefine, $one_file,
2111       $obj, $topparent, $where, %transform) = @_;
2113   my $needlinker = "";
2115   transform_variable_recursively
2116     ($var, $objvar, 'am__objects', $nodefine, $where,
2117      # The transform code to run on each filename.
2118      sub {
2119        my ($subvar, $val, $cond, $full_cond) = @_;
2120        my @trans = handle_single_transform ($subvar, $topparent,
2121                                             $one_file, $obj, $val,
2122                                             %transform);
2123        $needlinker = "true" if @trans;
2124        return @trans;
2125      });
2127   return $needlinker;
2131 # handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM)
2132 # -----------------------------------------------------------------------------
2133 # Handle SOURCE->OBJECT transform for one program or library.
2134 # Arguments are:
2135 #   canonical (transformed) name of target to build
2136 #   actual target of object to build
2137 #   object extension (i.e., either '.o' or '$o')
2138 #   location of the source variable
2139 #   extra arguments to pass to file_contents when producing rules
2140 # Return the name of the linker variable that must be used.
2141 # Empty return means just use 'LINK'.
2142 sub handle_source_transform
2144     # one_file is canonical name.  unxformed is given name.  obj is
2145     # object extension.
2146     my ($one_file, $unxformed, $obj, $where, %transform) = @_;
2148     my $linker = '';
2150     # No point in continuing if _OBJECTS is defined.
2151     return if reject_var ($one_file . '_OBJECTS',
2152                           $one_file . '_OBJECTS should not be defined');
2154     my %used_pfx = ();
2155     my $needlinker;
2156     %linkers_used = ();
2157     foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
2158                         'dist_EXTRA_', 'nodist_EXTRA_')
2159     {
2160         my $varname = $prefix . $one_file . "_SOURCES";
2161         my $var = var $varname;
2162         next unless $var;
2164         # We are going to define _OBJECTS variables using the prefix.
2165         # Then we glom them all together.  So we can't use the null
2166         # prefix here as we need it later.
2167         my $xpfx = ($prefix eq '') ? 'am_' : $prefix;
2169         # Keep track of which prefixes we saw.
2170         $used_pfx{$xpfx} = 1
2171           unless $prefix =~ /EXTRA_/;
2173         push @sources, "\$($varname)";
2174         push @dist_sources, shadow_unconditionally ($varname, $where)
2175           unless (option ('no-dist') || $prefix =~ /^nodist_/);
2177         $needlinker |=
2178             define_objects_from_sources ($varname,
2179                                          $xpfx . $one_file . '_OBJECTS',
2180                                          !!($prefix =~ /EXTRA_/),
2181                                          $one_file, $obj, $varname, $where,
2182                                          DIST_SOURCE => ($prefix !~ /^nodist_/),
2183                                          %transform);
2184     }
2185     if ($needlinker)
2186     {
2187         $linker ||= resolve_linker (%linkers_used);
2188     }
2190     my @keys = sort keys %used_pfx;
2191     if (scalar @keys == 0)
2192     {
2193         # The default source for libfoo.la is libfoo.c, but for
2194         # backward compatibility we first look at libfoo_la.c,
2195         # if no default source suffix is given.
2196         my $old_default_source = "$one_file.c";
2197         my $ext_var = var ('AM_DEFAULT_SOURCE_EXT');
2198         my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c';
2199         msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most one value")
2200           if $default_source_ext =~ /[\t ]/;
2201         (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,$default_source_ext,;
2202         # TODO: Remove this backward-compatibility hack in Automake 2.0.
2203         if ($old_default_source ne $default_source
2204             && !$ext_var
2205             && (rule $old_default_source
2206                 || rule '$(srcdir)/' . $old_default_source
2207                 || rule '${srcdir}/' . $old_default_source
2208                 || -f $old_default_source))
2209           {
2210             my $loc = $where->clone;
2211             $loc->pop_context;
2212             msg ('obsolete', $loc,
2213                  "the default source for '$unxformed' has been changed "
2214                  . "to '$default_source'.\n(Using '$old_default_source' for "
2215                  . "backward compatibility.)");
2216             $default_source = $old_default_source;
2217           }
2218         # If a rule exists to build this source with a $(srcdir)
2219         # prefix, use that prefix in our variables too.  This is for
2220         # the sake of BSD Make.
2221         if (rule '$(srcdir)/' . $default_source
2222             || rule '${srcdir}/' . $default_source)
2223           {
2224             $default_source = '$(srcdir)/' . $default_source;
2225           }
2227         define_variable ($one_file . "_SOURCES", $default_source, $where);
2228         push (@sources, $default_source);
2229         push (@dist_sources, $default_source);
2231         %linkers_used = ();
2232         my (@result) =
2233           handle_single_transform ($one_file . '_SOURCES',
2234                                    $one_file . '_SOURCES',
2235                                    $one_file, $obj,
2236                                    $default_source, %transform);
2237         $linker ||= resolve_linker (%linkers_used);
2238         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result);
2239     }
2240     else
2241     {
2242         @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys;
2243         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys);
2244     }
2246     # If we want to use 'LINK' we must make sure it is defined.
2247     if ($linker eq '')
2248     {
2249         $need_link = 1;
2250     }
2252     return $linker;
2256 # handle_lib_objects ($XNAME, $VAR)
2257 # ---------------------------------
2258 # Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables.
2259 # Also, generate _DEPENDENCIES variable if appropriate.
2260 # Arguments are:
2261 #   transformed name of object being built, or empty string if no object
2262 #   name of _LDADD/_LIBADD-type variable to examine
2263 # Returns 1 if LIBOBJS seen, 0 otherwise.
2264 sub handle_lib_objects
2266   my ($xname, $varname) = @_;
2268   my $var = var ($varname);
2269   prog_error "'$varname' undefined"
2270     unless $var;
2271   prog_error "unexpected variable name '$varname'"
2272     unless $varname =~ /^(.*)(?:LIB|LD)ADD$/;
2273   my $prefix = $1 || 'AM_';
2275   my $seen_libobjs = 0;
2276   my $flagvar = 0;
2278   transform_variable_recursively
2279     ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES',
2280      ! $xname, INTERNAL,
2281      # Transformation function, run on each filename.
2282      sub {
2283        my ($subvar, $val, $cond, $full_cond) = @_;
2285        if ($val =~ /^-/)
2286          {
2287            # Skip -lfoo and -Ldir silently; these are explicitly allowed.
2288            if ($val !~ /^-[lL]/ &&
2289                # Skip -dlopen and -dlpreopen; these are explicitly allowed
2290                # for Libtool libraries or programs.  (Actually we are a bit
2291                # lax here since this code also applies to non-libtool
2292                # libraries or programs, for which -dlopen and -dlopreopen
2293                # are pure nonsense.  Diagnosing this doesn't seem very
2294                # important: the developer will quickly get complaints from
2295                # the linker.)
2296                $val !~ /^-dl(?:pre)?open$/ &&
2297                # Only get this error once.
2298                ! $flagvar)
2299              {
2300                $flagvar = 1;
2301                # FIXME: should display a stack of nested variables
2302                # as context when $var != $subvar.
2303                err_var ($var, "linker flags such as '$val' belong in "
2304                         . "'${prefix}LDFLAGS'");
2305              }
2306            return ();
2307          }
2308        elsif ($val !~ /^\@.*\@$/)
2309          {
2310            # Assume we have a file of some sort, and output it into the
2311            # dependency variable.  Autoconf substitutions are not output;
2312            # rarely is a new dependency substituted into e.g. foo_LDADD
2313            # -- but bad things (e.g. -lX11) are routinely substituted.
2314            # Note that LIBOBJS and ALLOCA are exceptions to this rule,
2315            # and handled specially below.
2316            return $val;
2317          }
2318        elsif ($val =~ /^\@(LT)?LIBOBJS\@$/)
2319          {
2320            handle_LIBOBJS ($subvar, $cond, $1);
2321            $seen_libobjs = 1;
2322            return $val;
2323          }
2324        elsif ($val =~ /^\@(LT)?ALLOCA\@$/)
2325          {
2326            handle_ALLOCA ($subvar, $cond, $1);
2327            return $val;
2328          }
2329        else
2330          {
2331            return ();
2332          }
2333      });
2335   return $seen_libobjs;
2338 # handle_LIBOBJS_or_ALLOCA ($VAR, $BASE)
2339 # --------------------------------------
2340 # Definitions common to LIBOBJS and ALLOCA.
2341 # VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA.
2342 # BASE should be one base file name from AC_LIBSOURCE, or alloca.
2343 sub handle_LIBOBJS_or_ALLOCA
2345   my ($var, $base) = @_;
2347   my $dir = '';
2349   # If LIBOBJS files must be built in another directory we have
2350   # to define LIBOBJDIR and ensure the files get cleaned.
2351   # Otherwise LIBOBJDIR can be left undefined, and the cleaning
2352   # is achieved by 'rm -f *.$(OBJEXT)' in compile.am.
2353   if ($config_libobj_dir
2354       && $relative_dir ne $config_libobj_dir)
2355     {
2356       if (option 'subdir-objects')
2357         {
2358           # In the top-level Makefile we do not use $(top_builddir), because
2359           # we are already there, and since the targets are built without
2360           # a $(top_builddir), it helps BSD Make to match them with
2361           # dependencies.
2362           $dir = "$config_libobj_dir/"
2363             if $config_libobj_dir ne '.';
2364           $dir = backname ($relative_dir) . "/$dir"
2365             if $relative_dir ne '.';
2366           define_variable ('LIBOBJDIR', "$dir", INTERNAL);
2367           if ($dir && !defined $clean_files{"$dir$base.\$(OBJEXT)"})
2368             {
2369               my $dirstamp = require_build_directory ($dir);
2370               $output_rules .= "$dir$base.\$(OBJEXT): $dirstamp\n";
2371               $output_rules .= "$dir$base.lo: $dirstamp\n"
2372                 if ($var =~ /^LT/);
2373             }
2374           # libtool might create .$(OBJEXT) as a side-effect of using
2375           # LTLIBOBJS or LTALLOCA.
2376           $clean_files{"$dir$base.\$(OBJEXT)"} = MOSTLY_CLEAN;
2377           $clean_files{"$dir$base.lo"} = MOSTLY_CLEAN
2378             if ($var =~ /^LT/);
2379         }
2380       else
2381         {
2382           error ("'\$($var)' cannot be used outside '$config_libobj_dir' if"
2383                  . " 'subdir-objects' is not set");
2384         }
2385     }
2387   return $dir;
2390 sub handle_LIBOBJS
2392   my ($var, $cond, $lt) = @_;
2393   my $myobjext = $lt ? 'lo' : 'o';
2394   $lt ||= '';
2396   $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS')
2397     if ! keys %libsources;
2399   foreach my $iter (sort keys %libsources)
2400     {
2401       my $dir = '';
2402       if ($iter =~ /^(.*)(\.[cly])$/)
2403         {
2404           saw_extension ($2);
2405           saw_extension ('.c');
2406           $dir = handle_LIBOBJS_or_ALLOCA ("${lt}LIBOBJS", $1);
2407         }
2409       if ($iter =~ /\.h$/)
2410         {
2411           require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2412         }
2413       elsif ($iter ne 'alloca.c')
2414         {
2415           my $rewrite = $iter;
2416           $rewrite =~ s/\.c$/.P$myobjext/;
2417           $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1;
2418           $rewrite = "^" . quotemeta ($iter) . "\$";
2419           # Only require the file if it is not a built source.
2420           my $bs = var ('BUILT_SOURCES');
2421           if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive))
2422             {
2423               require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2424             }
2425         }
2426     }
2429 sub handle_ALLOCA
2431   my ($var, $cond, $lt) = @_;
2432   my $myobjext = $lt ? 'lo' : 'o';
2433   $lt ||= '';
2434   my $dir = handle_LIBOBJS_or_ALLOCA ("${lt}ALLOCA", "alloca");
2436   $dir eq '' and $dir = './';
2437   $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA');
2438   $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1;
2439   require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c');
2440   saw_extension ('.c');
2443 # Canonicalize the input parameter.
2444 sub canonicalize
2446     my ($string) = @_;
2447     $string =~ tr/A-Za-z0-9_\@/_/c;
2448     return $string;
2451 # Canonicalize a name, and check to make sure the non-canonical name
2452 # is never used.  Returns canonical name.  Arguments are name and a
2453 # list of suffixes to check for.
2454 sub check_canonical_spelling
2456   my ($name, @suffixes) = @_;
2458   my $xname = canonicalize ($name);
2459   if ($xname ne $name)
2460     {
2461       foreach my $xt (@suffixes)
2462         {
2463           reject_var ("$name$xt", "use '$xname$xt', not '$name$xt'");
2464         }
2465     }
2467   return $xname;
2470 # Set up the compile suite.
2471 sub handle_compile ()
2473    return if ! $must_handle_compiled_objects;
2475     # Boilerplate.
2476     my $default_includes = '';
2477     if (! option 'nostdinc')
2478       {
2479         my @incs = ('-I.', subst ('am__isrc'));
2481         my $var = var 'CONFIG_HEADER';
2482         if ($var)
2483           {
2484             foreach my $hdr (split (' ', $var->variable_value))
2485               {
2486                 push @incs, '-I' . dirname ($hdr);
2487               }
2488           }
2489         # We want '-I. -I$(srcdir)', but the latter -I is redundant
2490         # and unaesthetic in non-VPATH builds.  We use `-I.@am__isrc@`
2491         # instead.  It will be replaced by '-I.' or '-I. -I$(srcdir)'.
2492         # Items in CONFIG_HEADER are never in $(srcdir) so it is safe
2493         # to just put @am__isrc@ right after '-I.', without a space.
2494         ($default_includes = ' ' . uniq (@incs)) =~ s/ @/@/;
2495       }
2497     my (@mostly_rms, @dist_rms);
2498     foreach my $item (sort keys %compile_clean_files)
2499     {
2500         if ($compile_clean_files{$item} == MOSTLY_CLEAN)
2501         {
2502             push (@mostly_rms, "\t-rm -f $item");
2503         }
2504         elsif ($compile_clean_files{$item} == DIST_CLEAN)
2505         {
2506             push (@dist_rms, "\t-rm -f $item");
2507         }
2508         else
2509         {
2510           prog_error 'invalid entry in %compile_clean_files';
2511         }
2512     }
2514     my ($coms, $vars, $rules) =
2515       file_contents_internal (1, "$libdir/am/compile.am",
2516                               new Automake::Location,
2517                               'DEFAULT_INCLUDES' => $default_includes,
2518                               'MOSTLYRMS' => join ("\n", @mostly_rms),
2519                               'DISTRMS' => join ("\n", @dist_rms));
2520     $output_vars .= $vars;
2521     $output_rules .= "$coms$rules";
2524 # Handle libtool rules.
2525 sub handle_libtool ()
2527   return unless var ('LIBTOOL');
2529   # Libtool requires some files, but only at top level.
2530   # (Starting with Libtool 2.0 we do not have to bother.  These
2531   # requirements are done with AC_REQUIRE_AUX_FILE.)
2532   require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files)
2533     if $relative_dir eq '.' && ! $libtool_new_api;
2535   my @libtool_rms;
2536   foreach my $item (sort keys %libtool_clean_directories)
2537     {
2538       my $dir = ($item eq '.') ? '' : "$item/";
2539       # .libs is for Unix, _libs for DOS.
2540       push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs");
2541     }
2543   check_user_variables 'LIBTOOLFLAGS';
2545   # Output the libtool compilation rules.
2546   $output_rules .= file_contents ('libtool',
2547                                   new Automake::Location,
2548                                    LTRMS => join ("\n", @libtool_rms));
2551 # Check for duplicate targets
2552 sub handle_targets ()
2554   my %seen = ();
2555   my @dups = ();
2556   @proglist = am_install_var ('progs', 'PROGRAMS',
2557                               'bin', 'sbin', 'libexec', 'pkglibexec',
2558                               'noinst', 'check');
2559   @liblist = am_install_var ('libs', 'LIBRARIES',
2560                              'lib', 'pkglib', 'noinst', 'check');
2561   @ltliblist = am_install_var ('ltlib', 'LTLIBRARIES',
2562                                'noinst', 'lib', 'pkglib', 'check');
2564   # Record duplications that may arise after canonicalization of the
2565   # base names, in order to prevent object file clashes in the presence
2566   # of target-specific *FLAGS
2567   my @targetlist = (@proglist, @liblist, @ltliblist);
2568   foreach my $pair (@targetlist)
2569     {
2570       my $base = canonicalize (basename (@$pair[1]));
2571       push (@dup_shortnames, $base) if ($seen{$base});
2572       $seen{$base} = $base;
2573     }
2576 sub handle_programs ()
2578   return if ! @proglist;
2579   $must_handle_compiled_objects = 1;
2581   my $seen_global_libobjs =
2582     var ('LDADD') && handle_lib_objects ('', 'LDADD');
2584   foreach my $pair (@proglist)
2585     {
2586       my ($where, $one_file) = @$pair;
2588       my $seen_libobjs = 0;
2589       my $obj = '.$(OBJEXT)';
2591       $known_programs{$one_file} = $where;
2593       # Canonicalize names and check for misspellings.
2594       my $xname = check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
2595                                             '_SOURCES', '_OBJECTS',
2596                                             '_DEPENDENCIES');
2598       $where->push_context ("while processing program '$one_file'");
2599       $where->set (INTERNAL->get);
2601       my $linker = handle_source_transform ($xname, $one_file, $obj, $where,
2602                                             NONLIBTOOL => 1, LIBTOOL => 0);
2604       if (var ($xname . "_LDADD"))
2605         {
2606           $seen_libobjs = handle_lib_objects ($xname, $xname . '_LDADD');
2607         }
2608       else
2609         {
2610           # User didn't define prog_LDADD override.  So do it.
2611           define_variable ($xname . '_LDADD', '$(LDADD)', $where);
2613           # This does a bit too much work.  But we need it to
2614           # generate _DEPENDENCIES when appropriate.
2615           if (var ('LDADD'))
2616             {
2617               $seen_libobjs = handle_lib_objects ($xname, 'LDADD');
2618             }
2619         }
2621       reject_var ($xname . '_LIBADD',
2622                   "use '${xname}_LDADD', not '${xname}_LIBADD'");
2624       set_seen ($xname . '_DEPENDENCIES');
2625       set_seen ('EXTRA_' . $xname . '_DEPENDENCIES');
2626       set_seen ($xname . '_LDFLAGS');
2628       # Determine program to use for link.
2629       my($xlink, $vlink) = define_per_target_linker_variable ($linker, $xname);
2630       $vlink = verbose_flag ($vlink || 'GEN');
2632       # If the resulting program lies in a subdirectory,
2633       # ensure that the directory exists before we need it.
2634       my $dirstamp = require_build_directory_maybe ($one_file);
2636       $libtool_clean_directories{dirname ($one_file)} = 1;
2638       $output_rules .= file_contents ('program',
2639                                       $where,
2640                                       PROGRAM  => $one_file,
2641                                       XPROGRAM => $xname,
2642                                       XLINK    => $xlink,
2643                                       VERBOSE  => $vlink,
2644                                       DIRSTAMP => $dirstamp,
2645                                       EXEEXT   => '$(EXEEXT)');
2647       if ($seen_libobjs || $seen_global_libobjs)
2648         {
2649           if (var ($xname . '_LDADD'))
2650             {
2651               check_libobjs_sources ($xname, $xname . '_LDADD');
2652             }
2653           elsif (var ('LDADD'))
2654             {
2655               check_libobjs_sources ($xname, 'LDADD');
2656             }
2657         }
2658     }
2662 sub handle_libraries ()
2664   return if ! @liblist;
2665   $must_handle_compiled_objects = 1;
2667   my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
2668                                     'noinst', 'check');
2670   if (@prefix)
2671     {
2672       my $var = rvar ($prefix[0] . '_LIBRARIES');
2673       $var->requires_variables ('library used', 'RANLIB');
2674     }
2676   define_variable ('AR', 'ar', INTERNAL);
2677   define_variable ('ARFLAGS', 'cru', INTERNAL);
2678   define_verbose_tagvar ('AR');
2680   foreach my $pair (@liblist)
2681     {
2682       my ($where, $onelib) = @$pair;
2684       my $seen_libobjs = 0;
2685       # Check that the library fits the standard naming convention.
2686       my $bn = basename ($onelib);
2687       if ($bn !~ /^lib.*\.a$/)
2688         {
2689           $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/;
2690           my $suggestion = dirname ($onelib) . "/$bn";
2691           $suggestion =~ s|^\./||g;
2692           msg ('error-gnu/warn', $where,
2693                "'$onelib' is not a standard library name\n"
2694                . "did you mean '$suggestion'?")
2695         }
2697       ($known_libraries{$onelib} = $bn) =~ s/\.a$//;
2699       $where->push_context ("while processing library '$onelib'");
2700       $where->set (INTERNAL->get);
2702       my $obj = '.$(OBJEXT)';
2704       # Canonicalize names and check for misspellings.
2705       my $xlib = check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
2706                                            '_OBJECTS', '_DEPENDENCIES',
2707                                            '_AR');
2709       if (! var ($xlib . '_AR'))
2710         {
2711           define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where);
2712         }
2714       # Generate support for conditional object inclusion in
2715       # libraries.
2716       if (var ($xlib . '_LIBADD'))
2717         {
2718           if (handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2719             {
2720               $seen_libobjs = 1;
2721             }
2722         }
2723       else
2724         {
2725           define_variable ($xlib . "_LIBADD", '', $where);
2726         }
2728       reject_var ($xlib . '_LDADD',
2729                   "use '${xlib}_LIBADD', not '${xlib}_LDADD'");
2731       # Make sure we at look at this.
2732       set_seen ($xlib . '_DEPENDENCIES');
2733       set_seen ('EXTRA_' . $xlib . '_DEPENDENCIES');
2735       handle_source_transform ($xlib, $onelib, $obj, $where,
2736                                NONLIBTOOL => 1, LIBTOOL => 0);
2738       # If the resulting library lies in a subdirectory,
2739       # make sure this directory will exist.
2740       my $dirstamp = require_build_directory_maybe ($onelib);
2741       my $verbose = verbose_flag ('AR');
2742       my $silent = silent_flag ();
2744       $output_rules .= file_contents ('library',
2745                                        $where,
2746                                        VERBOSE  => $verbose,
2747                                        SILENT   => $silent,
2748                                        LIBRARY  => $onelib,
2749                                        XLIBRARY => $xlib,
2750                                        DIRSTAMP => $dirstamp);
2752       if ($seen_libobjs)
2753         {
2754           if (var ($xlib . '_LIBADD'))
2755             {
2756               check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2757             }
2758         }
2760       if (! $seen_ar)
2761         {
2762           msg ('extra-portability', $where,
2763                "'$onelib': linking libraries using a non-POSIX\n"
2764                . "archiver requires 'AM_PROG_AR' in '$configure_ac'")
2765         }
2766     }
2770 sub handle_ltlibraries ()
2772   return if ! @ltliblist;
2773   $must_handle_compiled_objects = 1;
2775   my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
2776                                     'noinst', 'check');
2778   if (@prefix)
2779     {
2780       my $var = rvar ($prefix[0] . '_LTLIBRARIES');
2781       $var->requires_variables ('Libtool library used', 'LIBTOOL');
2782     }
2784   my %instdirs = ();
2785   my %instsubdirs = ();
2786   my %instconds = ();
2787   my %liblocations = ();        # Location (in Makefile.am) of each library.
2789   foreach my $key (@prefix)
2790     {
2791       # Get the installation directory of each library.
2792       my $dir = $key;
2793       my $strip_subdir = 1;
2794       if ($dir =~ /^nobase_/)
2795         {
2796           $dir =~ s/^nobase_//;
2797           $strip_subdir = 0;
2798         }
2799       my $var = rvar ($key . '_LTLIBRARIES');
2801       # We reject libraries which are installed in several places
2802       # in the same condition, because we can only specify one
2803       # '-rpath' option.
2804       $var->traverse_recursively
2805         (sub
2806          {
2807            my ($var, $val, $cond, $full_cond) = @_;
2808            my $hcond = $full_cond->human;
2809            my $where = $var->rdef ($cond)->location;
2810            my $ldir = '';
2811            $ldir = '/' . dirname ($val)
2812              if (!$strip_subdir);
2813            # A library cannot be installed in different directories
2814            # in overlapping conditions.
2815            if (exists $instconds{$val})
2816              {
2817                my ($msg, $acond) =
2818                  $instconds{$val}->ambiguous_p ($val, $full_cond);
2820                if ($msg)
2821                  {
2822                    error ($where, $msg, partial => 1);
2823                    my $dirtxt = "installed " . ($strip_subdir ? "in" : "below") . " '$dir'";
2824                    $dirtxt = "built for '$dir'"
2825                      if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check';
2826                    my $dircond =
2827                      $full_cond->true ? "" : " in condition $hcond";
2829                    error ($where, "'$val' should be $dirtxt$dircond ...",
2830                           partial => 1);
2832                    my $hacond = $acond->human;
2833                    my $adir = $instdirs{$val}{$acond};
2834                    my $adirtxt = "installed in '$adir'";
2835                    $adirtxt = "built for '$adir'"
2836                      if ($adir eq 'EXTRA' || $adir eq 'noinst'
2837                          || $adir eq 'check');
2838                    my $adircond = $acond->true ? "" : " in condition $hacond";
2840                    my $onlyone = ($dir ne $adir) ?
2841                      ("\nLibtool libraries can be built for only one "
2842                       . "destination") : "";
2844                    error ($liblocations{$val}{$acond},
2845                           "... and should also be $adirtxt$adircond.$onlyone");
2846                    return;
2847                  }
2848              }
2849            else
2850              {
2851                $instconds{$val} = new Automake::DisjConditions;
2852              }
2853            $instdirs{$val}{$full_cond} = $dir;
2854            $instsubdirs{$val}{$full_cond} = $ldir;
2855            $liblocations{$val}{$full_cond} = $where;
2856            $instconds{$val} = $instconds{$val}->merge ($full_cond);
2857          },
2858          sub
2859          {
2860            return ();
2861          },
2862          skip_ac_subst => 1);
2863     }
2865   foreach my $pair (@ltliblist)
2866     {
2867       my ($where, $onelib) = @$pair;
2869       my $seen_libobjs = 0;
2870       my $obj = '.lo';
2872       # Canonicalize names and check for misspellings.
2873       my $xlib = check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
2874                                            '_SOURCES', '_OBJECTS',
2875                                            '_DEPENDENCIES');
2877       # Check that the library fits the standard naming convention.
2878       my $libname_rx = '^lib.*\.la';
2879       my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS');
2880       my $ldvar2 = var ('LDFLAGS');
2881       if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive))
2882           || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive)))
2883         {
2884           # Relax name checking for libtool modules.
2885           $libname_rx = '\.la';
2886         }
2888       my $bn = basename ($onelib);
2889       if ($bn !~ /$libname_rx$/)
2890         {
2891           my $type = 'library';
2892           if ($libname_rx eq '\.la')
2893             {
2894               $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/;
2895               $type = 'module';
2896             }
2897           else
2898             {
2899               $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/;
2900             }
2901           my $suggestion = dirname ($onelib) . "/$bn";
2902           $suggestion =~ s|^\./||g;
2903           msg ('error-gnu/warn', $where,
2904                "'$onelib' is not a standard libtool $type name\n"
2905                . "did you mean '$suggestion'?")
2906         }
2908       ($known_libraries{$onelib} = $bn) =~ s/\.la$//;
2910       $where->push_context ("while processing Libtool library '$onelib'");
2911       $where->set (INTERNAL->get);
2913       # Make sure we look at these.
2914       set_seen ($xlib . '_LDFLAGS');
2915       set_seen ($xlib . '_DEPENDENCIES');
2916       set_seen ('EXTRA_' . $xlib . '_DEPENDENCIES');
2918       # Generate support for conditional object inclusion in
2919       # libraries.
2920       if (var ($xlib . '_LIBADD'))
2921         {
2922           if (handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2923             {
2924               $seen_libobjs = 1;
2925             }
2926         }
2927       else
2928         {
2929           define_variable ($xlib . "_LIBADD", '', $where);
2930         }
2932       reject_var ("${xlib}_LDADD",
2933                   "use '${xlib}_LIBADD', not '${xlib}_LDADD'");
2936       my $linker = handle_source_transform ($xlib, $onelib, $obj, $where,
2937                                             NONLIBTOOL => 0, LIBTOOL => 1);
2939       # Determine program to use for link.
2940       my($xlink, $vlink) = define_per_target_linker_variable ($linker, $xlib);
2941       $vlink = verbose_flag ($vlink || 'GEN');
2943       my $rpathvar = "am_${xlib}_rpath";
2944       my $rpath = "\$($rpathvar)";
2945       foreach my $rcond ($instconds{$onelib}->conds)
2946         {
2947           my $val;
2948           if ($instdirs{$onelib}{$rcond} eq 'EXTRA'
2949               || $instdirs{$onelib}{$rcond} eq 'noinst'
2950               || $instdirs{$onelib}{$rcond} eq 'check')
2951             {
2952               # It's an EXTRA_ library, so we can't specify -rpath,
2953               # because we don't know where the library will end up.
2954               # The user probably knows, but generally speaking automake
2955               # doesn't -- and in fact configure could decide
2956               # dynamically between two different locations.
2957               $val = '';
2958             }
2959           else
2960             {
2961               $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)');
2962               $val .= $instsubdirs{$onelib}{$rcond}
2963                 if defined $instsubdirs{$onelib}{$rcond};
2964             }
2965           if ($rcond->true)
2966             {
2967               # If $rcond is true there is only one condition and
2968               # there is no point defining an helper variable.
2969               $rpath = $val;
2970             }
2971           else
2972             {
2973               define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val);
2974             }
2975         }
2977       # If the resulting library lies in a subdirectory,
2978       # make sure this directory will exist.
2979       my $dirstamp = require_build_directory_maybe ($onelib);
2981       # Remember to cleanup .libs/ in this directory.
2982       my $dirname = dirname $onelib;
2983       $libtool_clean_directories{$dirname} = 1;
2985       $output_rules .= file_contents ('ltlibrary',
2986                                       $where,
2987                                       LTLIBRARY  => $onelib,
2988                                       XLTLIBRARY => $xlib,
2989                                       RPATH      => $rpath,
2990                                       XLINK      => $xlink,
2991                                       VERBOSE    => $vlink,
2992                                       DIRSTAMP   => $dirstamp);
2993       if ($seen_libobjs)
2994         {
2995           if (var ($xlib . '_LIBADD'))
2996             {
2997               check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2998             }
2999         }
3001       if (! $seen_ar)
3002         {
3003           msg ('extra-portability', $where,
3004                "'$onelib': linking libtool libraries using a non-POSIX\n"
3005                . "archiver requires 'AM_PROG_AR' in '$configure_ac'")
3006         }
3007     }
3010 # See if any _SOURCES variable were misspelled.
3011 sub check_typos ()
3013   # It is ok if the user sets this particular variable.
3014   set_seen 'AM_LDFLAGS';
3016   foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES')
3017     {
3018       foreach my $var (variables $primary)
3019         {
3020           my $varname = $var->name;
3021           # A configure variable is always legitimate.
3022           next if exists $configure_vars{$varname};
3024           for my $cond ($var->conditions->conds)
3025             {
3026               $varname =~ /^(?:EXTRA_)?(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/;
3027               msg_var ('syntax', $var, "variable '$varname' is defined but no"
3028                        . " program or\nlibrary has '$1' as canonical name"
3029                        . " (possible typo)")
3030                 unless $var->rdef ($cond)->seen;
3031             }
3032         }
3033     }
3037 sub handle_scripts ()
3039     # NOTE we no longer automatically clean SCRIPTS, because it is
3040     # useful to sometimes distribute scripts verbatim.  This happens
3041     # e.g. in Automake itself.
3042     am_install_var ('-candist', 'scripts', 'SCRIPTS',
3043                     'bin', 'sbin', 'libexec', 'pkglibexec', 'pkgdata',
3044                     'noinst', 'check');
3048 ## ------------------------ ##
3049 ## Handling Texinfo files.  ##
3050 ## ------------------------ ##
3052 # ($OUTFILE, $VFILE)
3053 # scan_texinfo_file ($FILENAME)
3054 # -----------------------------
3055 # $OUTFILE     - name of the info file produced by $FILENAME.
3056 # $VFILE       - name of the version.texi file used (undef if none).
3057 sub scan_texinfo_file
3059   my ($filename) = @_;
3061   my $texi = new Automake::XFile "< $filename";
3062   verb "reading $filename";
3064   my ($outfile, $vfile);
3065   while ($_ = $texi->getline)
3066     {
3067       if (/^\@setfilename +(\S+)/)
3068         {
3069           # Honor only the first @setfilename.  (It's possible to have
3070           # more occurrences later if the manual shows examples of how
3071           # to use @setfilename...)
3072           next if $outfile;
3074           $outfile = $1;
3075           if (index ($outfile, '.') < 0)
3076             {
3077               msg 'obsolete', "$filename:$.",
3078                   "use of suffix-less info files is discouraged"
3079             }
3080           elsif ($outfile !~ /\.info$/)
3081             {
3082               error ("$filename:$.",
3083                      "output '$outfile' has unrecognized extension");
3084               return;
3085             }
3086         }
3087       # A "version.texi" file is actually any file whose name matches
3088       # "vers*.texi".
3089       elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/)
3090         {
3091           $vfile = $1;
3092         }
3093     }
3095   if (! $outfile)
3096     {
3097       # Replace a .texi extension with .info
3098       $outfile = basename($filename);
3099       $outfile =~ s/\.[^.]+$//;
3100       $outfile .= '.info';
3101     }
3103   return ($outfile, $vfile);
3107 # ($DIRSTAMP, @CLEAN_FILES)
3108 # output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES)
3109 # ------------------------------------------------------------------
3110 # SOURCE - the source Texinfo file
3111 # DEST - the destination Info file
3112 # INSRC - whether DEST should be built in the source tree
3113 # DEPENDENCIES - known dependencies
3114 sub output_texinfo_build_rules
3116   my ($source, $dest, $insrc, @deps) = @_;
3118   # Split 'a.texi' into 'a' and '.texi'.
3119   my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/);
3120   my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/);
3122   $ssfx ||= "";
3123   $dsfx ||= "";
3125   # We can output two kinds of rules: the "generic" rules use Make
3126   # suffix rules and are appropriate when $source and $dest do not lie
3127   # in a sub-directory; the "specific" rules are needed in the other
3128   # case.
3129   #
3130   # The former are output only once (this is not really apparent here,
3131   # but just remember that some logic deeper in Automake will not
3132   # output the same rule twice); while the later need to be output for
3133   # each Texinfo source.
3134   my $generic;
3135   my $makeinfoflags;
3136   my $sdir = dirname $source;
3137   if ($sdir eq '.' && dirname ($dest) eq '.')
3138     {
3139       $generic = 1;
3140       $makeinfoflags = '-I $(srcdir)';
3141     }
3142   else
3143     {
3144       $generic = 0;
3145       $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir";
3146     }
3148   # A directory can contain two kinds of info files: some built in the
3149   # source tree, and some built in the build tree.  The rules are
3150   # different in each case.  However we cannot output two different
3151   # set of generic rules.  Because in-source builds are more usual, we
3152   # use generic rules in this case and fall back to "specific" rules
3153   # for build-dir builds.  (It should not be a problem to invert this
3154   # if needed.)
3155   $generic = 0 unless $insrc;
3157   # We cannot use a suffix rule to build info files with an empty
3158   # extension.  Otherwise we would output a single suffix inference
3159   # rule, with separate dependencies, as in
3160   #
3161   #    .texi:
3162   #             $(MAKEINFO) ...
3163   #    foo.info: foo.texi
3164   #
3165   # which confuse Solaris make.  (See the Autoconf manual for
3166   # details.)  Therefore we use a specific rule in this case.  This
3167   # applies to info files only (dvi and pdf files always have an
3168   # extension).
3169   my $generic_info = ($generic && $dsfx) ? 1 : 0;
3171   # If the resulting file lies in a subdirectory,
3172   # make sure this directory will exist.
3173   my $dirstamp = require_build_directory_maybe ($dest);
3175   my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx;
3177   $output_rules .= file_contents ('texibuild',
3178                                   new Automake::Location,
3179                                   AM_V_MAKEINFO    => verbose_flag('MAKEINFO'),
3180                                   AM_V_TEXI2DVI    => verbose_flag('TEXI2DVI'),
3181                                   AM_V_TEXI2PDF    => verbose_flag('TEXI2PDF'),
3182                                   DEPS             => "@deps",
3183                                   DEST_PREFIX      => $dpfx,
3184                                   DEST_INFO_PREFIX => $dipfx,
3185                                   DEST_SUFFIX      => $dsfx,
3186                                   DIRSTAMP         => $dirstamp,
3187                                   GENERIC          => $generic,
3188                                   GENERIC_INFO     => $generic_info,
3189                                   INSRC            => $insrc,
3190                                   MAKEINFOFLAGS    => $makeinfoflags,
3191                                   SILENT           => silent_flag(),
3192                                   SOURCE           => ($generic
3193                                                        ? '$<' : $source),
3194                                   SOURCE_INFO      => ($generic_info
3195                                                        ? '$<' : $source),
3196                                   SOURCE_REAL      => $source,
3197                                   SOURCE_SUFFIX    => $ssfx,
3198                                   TEXIQUIET        => verbose_flag('texinfo'),
3199                                   TEXIDEVNULL      => verbose_flag('texidevnull'),
3200                                   );
3201   return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html");
3205 # ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN)
3206 # handle_texinfo_helper ($info_texinfos)
3207 # --------------------------------------
3208 # Handle all Texinfo source; helper for 'handle_texinfo'.
3209 sub handle_texinfo_helper
3211   my ($info_texinfos) = @_;
3212   my (@infobase, @info_deps_list, @texi_deps);
3213   my %versions;
3214   my $done = 0;
3215   my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', '');
3217   # Build a regex matching user-cleaned files.
3218   my $d = var 'DISTCLEANFILES';
3219   my $c = var 'CLEANFILES';
3220   my @f = ();
3221   push @f, $d->value_as_list_recursive (inner_expand => 1) if $d;
3222   push @f, $c->value_as_list_recursive (inner_expand => 1) if $c;
3223   @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f;
3224   my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$';
3226   foreach my $texi
3227       ($info_texinfos->value_as_list_recursive (inner_expand => 1))
3228     {
3229       my $infobase = $texi;
3230       if ($infobase =~ s/\.texi$//)
3231         {
3232           1; # Nothing more to do.
3233         }
3234       elsif ($infobase =~ s/\.(txi|texinfo)$//)
3235         {
3236           msg_var 'obsolete', $info_texinfos,
3237                   "suffix '.$1' for Texinfo files is discouraged;" .
3238                   " use '.texi' instead";
3239         }
3240       else
3241         {
3242           # FIXME: report line number.
3243           err_am "texinfo file '$texi' has unrecognized extension";
3244           next;
3245         }
3247       push @infobase, $infobase;
3249       # If 'version.texi' is referenced by input file, then include
3250       # automatic versioning capability.
3251       my ($out_file, $vtexi) =
3252         scan_texinfo_file ("$relative_dir/$texi")
3253         or next;
3254       # Directory of auxiliary files and build by-products used by texi2dvi
3255       # and texi2pdf.
3256       push @mostly_cleans, "$infobase.t2d";
3257       push @mostly_cleans, "$infobase.t2p";
3259       # If the Texinfo source is in a subdirectory, create the
3260       # resulting info in this subdirectory.  If it is in the current
3261       # directory, try hard to not prefix "./" because it breaks the
3262       # generic rules.
3263       my $outdir = dirname ($texi) . '/';
3264       $outdir = "" if $outdir eq './';
3265       $out_file =  $outdir . $out_file;
3267       # Until Automake 1.6.3, .info files were built in the
3268       # source tree.  This was an obstacle to the support of
3269       # non-distributed .info files, and non-distributed .texi
3270       # files.
3271       #
3272       # * Non-distributed .texi files is important in some packages
3273       #   where .texi files are built at make time, probably using
3274       #   other binaries built in the package itself, maybe using
3275       #   tools or information found on the build host.  Because
3276       #   these files are not distributed they are always rebuilt
3277       #   at make time; they should therefore not lie in the source
3278       #   directory.  One plan was to support this using
3279       #   nodist_info_TEXINFOS or something similar.  (Doing this
3280       #   requires some sanity checks.  For instance Automake should
3281       #   not allow:
3282       #      dist_info_TEXINFOS = foo.texi
3283       #      nodist_foo_TEXINFOS = included.texi
3284       #   because a distributed file should never depend on a
3285       #   non-distributed file.)
3286       #
3287       # * If .texi files are not distributed, then .info files should
3288       #   not be distributed either.  There are also cases where one
3289       #   wants to distribute .texi files, but does not want to
3290       #   distribute the .info files.  For instance the Texinfo package
3291       #   distributes the tool used to build these files; it would
3292       #   be a waste of space to distribute them.  It's not clear
3293       #   which syntax we should use to indicate that .info files should
3294       #   not be distributed.  Akim Demaille suggested that eventually
3295       #   we switch to a new syntax:
3296       #   |  Maybe we should take some inspiration from what's already
3297       #   |  done in the rest of Automake.  Maybe there is too much
3298       #   |  syntactic sugar here, and you want
3299       #   |     nodist_INFO = bar.info
3300       #   |     dist_bar_info_SOURCES = bar.texi
3301       #   |     bar_texi_DEPENDENCIES = foo.texi
3302       #   |  with a bit of magic to have bar.info represent the whole
3303       #   |  bar*info set.  That's a lot more verbose that the current
3304       #   |  situation, but it is # not new, hence the user has less
3305       #   |  to learn.
3306       #   |
3307       #   |  But there is still too much room for meaningless specs:
3308       #   |     nodist_INFO = bar.info
3309       #   |     dist_bar_info_SOURCES = bar.texi
3310       #   |     dist_PS = bar.ps something-written-by-hand.ps
3311       #   |     nodist_bar_ps_SOURCES = bar.texi
3312       #   |     bar_texi_DEPENDENCIES = foo.texi
3313       #   |  here bar.texi is dist_ in line 2, and nodist_ in 4.
3314       #
3315       # Back to the point, it should be clear that in order to support
3316       # non-distributed .info files, we need to build them in the
3317       # build tree, not in the source tree (non-distributed .texi
3318       # files are less of a problem, because we do not output build
3319       # rules for them).  In Automake 1.7 .info build rules have been
3320       # largely cleaned up so that .info files get always build in the
3321       # build tree, even when distributed.  The idea was that
3322       #   (1) if during a VPATH build the .info file was found to be
3323       #       absent or out-of-date (in the source tree or in the
3324       #       build tree), Make would rebuild it in the build tree.
3325       #       If an up-to-date source-tree of the .info file existed,
3326       #       make would not rebuild it in the build tree.
3327       #   (2) having two copies of .info files, one in the source tree
3328       #       and one (newer) in the build tree is not a problem
3329       #       because 'make dist' always pick files in the build tree
3330       #       first.
3331       # However it turned out the be a bad idea for several reasons:
3332       #   * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave
3333       #     like GNU Make on point (1) above.  These implementations
3334       #     of Make would always rebuild .info files in the build
3335       #     tree, even if such files were up to date in the source
3336       #     tree.  Consequently, it was impossible to perform a VPATH
3337       #     build of a package containing Texinfo files using these
3338       #     Make implementations.
3339       #     (Refer to the Autoconf Manual, section "Limitation of
3340       #     Make", paragraph "VPATH", item "target lookup", for
3341       #     an account of the differences between these
3342       #     implementations.)
3343       #   * The GNU Coding Standards require these files to be built
3344       #     in the source-tree (when they are distributed, that is).
3345       #   * Keeping a fresher copy of distributed files in the
3346       #     build tree can be annoying during development because
3347       #     - if the files is kept under CVS, you really want it
3348       #       to be updated in the source tree
3349       #     - it is confusing that 'make distclean' does not erase
3350       #       all files in the build tree.
3351       #
3352       # Consequently, starting with Automake 1.8, .info files are
3353       # built in the source tree again.  Because we still plan to
3354       # support non-distributed .info files at some point, we
3355       # have a single variable ($INSRC) that controls whether
3356       # the current .info file must be built in the source tree
3357       # or in the build tree.  Actually this variable is switched
3358       # off in two cases:
3359       #  (1) For '.info' files that appear to be cleaned; this is for
3360       #      backward compatibility with package such as Texinfo,
3361       #      which do things like
3362       #        info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
3363       #        DISTCLEANFILES = texinfo texinfo-* info*.info*
3364       #        # Do not create info files for distribution.
3365       #        dist-info:
3366       #      in order not to distribute .info files.
3367       #  (2) When the undocumented option 'info-in-builddir' is given.
3368       #      This is done to allow the developers of GCC, GDB, GNU
3369       #      binutils and the GNU bfd library to force the '.info' files
3370       #      to be generated in the builddir rather than the srcdir, as
3371       #      was once done when the (now removed) 'cygnus' option was
3372       #      given.  See automake bug#11034 for more discussion.
3373       my $insrc = 1;
3374       my $soutdir = '$(srcdir)/' . $outdir;
3376       if (option 'info-in-builddir')
3377         {
3378           $insrc = 0;
3379         }
3380       elsif ($out_file =~ $user_cleaned_files)
3381         {
3382           $insrc = 0;
3383           msg 'obsolete', "$am_file.am", <<EOF;
3384 Oops!
3385     It appears this file (or files included by it) are triggering
3386     an undocumented, soon-to-be-removed automake hack.
3387     Future automake versions will no longer place in the builddir
3388     (rather than in the srcdir) the generated '.info' files that
3389     appear to be cleaned, by e.g. being listed in CLEANFILES or
3390     DISTCLEANFILES.
3391     If you want your '.info' files to be placed in the builddir
3392     rather than in the srcdir, you have to use the shiny new
3393     'info-in-builddir' automake option.
3395         }
3397       $outdir = $soutdir if $insrc;
3399       # If user specified file_TEXINFOS, then use that as explicit
3400       # dependency list.
3401       @texi_deps = ();
3402       push (@texi_deps, "${soutdir}${vtexi}") if $vtexi;
3404       my $canonical = canonicalize ($infobase);
3405       if (var ($canonical . "_TEXINFOS"))
3406         {
3407           push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
3408           push_dist_common ('$(' . $canonical . '_TEXINFOS)');
3409         }
3411       my ($dirstamp, @cfiles) =
3412         output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps);
3413       push (@texi_cleans, @cfiles);
3415       push (@info_deps_list, $out_file);
3417       # If a vers*.texi file is needed, emit the rule.
3418       if ($vtexi)
3419         {
3420           err_am ("'$vtexi', included in '$texi', "
3421                   . "also included in '$versions{$vtexi}'")
3422             if defined $versions{$vtexi};
3423           $versions{$vtexi} = $texi;
3425           # We number the stamp-vti files.  This is doable since the
3426           # actual names don't matter much.  We only number starting
3427           # with the second one, so that the common case looks nice.
3428           my $vti = ($done ? $done : 'vti');
3429           ++$done;
3431           # This is ugly, but it is our historical practice.
3432           if ($config_aux_dir_set_in_configure_ac)
3433             {
3434               require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3435                                             'mdate-sh');
3436             }
3437           else
3438             {
3439               require_file_with_macro (TRUE, 'info_TEXINFOS',
3440                                        FOREIGN, 'mdate-sh');
3441             }
3443           my $conf_dir;
3444           if ($config_aux_dir_set_in_configure_ac)
3445             {
3446               $conf_dir = "$am_config_aux_dir/";
3447             }
3448           else
3449             {
3450               $conf_dir = '$(srcdir)/';
3451             }
3452           $output_rules .= file_contents ('texi-vers',
3453                                           new Automake::Location,
3454                                           TEXI     => $texi,
3455                                           VTI      => $vti,
3456                                           STAMPVTI => "${soutdir}stamp-$vti",
3457                                           VTEXI    => "$soutdir$vtexi",
3458                                           MDDIR    => $conf_dir,
3459                                           DIRSTAMP => $dirstamp);
3460         }
3461     }
3463   # Handle location of texinfo.tex.
3464   my $need_texi_file = 0;
3465   my $texinfodir;
3466   if (var ('TEXINFO_TEX'))
3467     {
3468       # The user defined TEXINFO_TEX so assume he knows what he is
3469       # doing.
3470       $texinfodir = ('$(srcdir)/'
3471                      . dirname (variable_value ('TEXINFO_TEX')));
3472     }
3473   elsif ($config_aux_dir_set_in_configure_ac)
3474     {
3475       $texinfodir = $am_config_aux_dir;
3476       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
3477       $need_texi_file = 2; # so that we require_conf_file later
3478     }
3479   else
3480     {
3481       $texinfodir = '$(srcdir)';
3482       $need_texi_file = 1;
3483     }
3484   define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL);
3486   push (@dist_targets, 'dist-info');
3488   if (! option 'no-installinfo')
3489     {
3490       # Make sure documentation is made and installed first.  Use
3491       # $(INFO_DEPS), not 'info', because otherwise recursive makes
3492       # get run twice during "make all".
3493       unshift (@all, '$(INFO_DEPS)');
3494     }
3496   define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL);
3497   define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL);
3498   define_files_variable ("PSS", @infobase, 'ps', INTERNAL);
3499   define_files_variable ("HTMLS", @infobase, 'html', INTERNAL);
3501   # This next isn't strictly needed now -- the places that look here
3502   # could easily be changed to look in info_TEXINFOS.  But this is
3503   # probably better, in case noinst_TEXINFOS is ever supported.
3504   define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL);
3506   # Do some error checking.  Note that this file is not required
3507   # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly
3508   # up above.
3509   if ($need_texi_file && ! option 'no-texinfo.tex')
3510     {
3511       if ($need_texi_file > 1)
3512         {
3513           require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3514                                         'texinfo.tex');
3515         }
3516       else
3517         {
3518           require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3519                                    'texinfo.tex');
3520         }
3521     }
3523   return (makefile_wrap ("", "\t  ", @mostly_cleans),
3524           makefile_wrap ("", "\t  ", @texi_cleans),
3525           makefile_wrap ("", "\t  ", @maint_cleans));
3529 sub handle_texinfo ()
3531   reject_var 'TEXINFOS', "'TEXINFOS' is an anachronism; use 'info_TEXINFOS'";
3532   # FIXME: I think this is an obsolete future feature name.
3533   reject_var 'html_TEXINFOS', "HTML generation not yet supported";
3535   my $info_texinfos = var ('info_TEXINFOS');
3536   my ($mostlyclean, $clean, $maintclean) = ('', '', '');
3537   if ($info_texinfos)
3538     {
3539       define_verbose_texinfo;
3540       ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos);
3541       chomp $mostlyclean;
3542       chomp $clean;
3543       chomp $maintclean;
3544     }
3546   $output_rules .=  file_contents ('texinfos',
3547                                    new Automake::Location,
3548                                    AM_V_DVIPS    => verbose_flag('DVIPS'),
3549                                    MOSTLYCLEAN   => $mostlyclean,
3550                                    TEXICLEAN     => $clean,
3551                                    MAINTCLEAN    => $maintclean,
3552                                    'LOCAL-TEXIS' => !!$info_texinfos,
3553                                    TEXIQUIET     => verbose_flag('texinfo'));
3557 sub handle_man_pages ()
3559   reject_var 'MANS', "'MANS' is an anachronism; use 'man_MANS'";
3561   # Find all the sections in use.  We do this by first looking for
3562   # "standard" sections, and then looking for any additional
3563   # sections used in man_MANS.
3564   my (%sections, %notrans_sections, %trans_sections,
3565       %notrans_vars, %trans_vars, %notrans_sect_vars, %trans_sect_vars);
3566   # We handle nodist_ for uniformity.  man pages aren't distributed
3567   # by default so it isn't actually very important.
3568   foreach my $npfx ('', 'notrans_')
3569     {
3570       foreach my $pfx ('', 'dist_', 'nodist_')
3571         {
3572           # Add more sections as needed.
3573           foreach my $section ('0'..'9', 'n', 'l')
3574             {
3575               my $varname = $npfx . $pfx . 'man' . $section . '_MANS';
3576               if (var ($varname))
3577                 {
3578                   $sections{$section} = 1;
3579                   $varname = '$(' . $varname . ')';
3580                   if ($npfx eq 'notrans_')
3581                     {
3582                       $notrans_sections{$section} = 1;
3583                       $notrans_sect_vars{$varname} = 1;
3584                     }
3585                   else
3586                     {
3587                       $trans_sections{$section} = 1;
3588                       $trans_sect_vars{$varname} = 1;
3589                     }
3591                   push_dist_common ($varname)
3592                     if $pfx eq 'dist_';
3593                 }
3594             }
3596           my $varname = $npfx . $pfx . 'man_MANS';
3597           my $var = var ($varname);
3598           if ($var)
3599             {
3600               foreach ($var->value_as_list_recursive)
3601                 {
3602                   # A page like 'foo.1c' goes into man1dir.
3603                   if (/\.([0-9a-z])([a-z]*)$/)
3604                     {
3605                       $sections{$1} = 1;
3606                       if ($npfx eq 'notrans_')
3607                         {
3608                           $notrans_sections{$1} = 1;
3609                         }
3610                       else
3611                         {
3612                           $trans_sections{$1} = 1;
3613                         }
3614                     }
3615                 }
3617               $varname = '$(' . $varname . ')';
3618               if ($npfx eq 'notrans_')
3619                 {
3620                   $notrans_vars{$varname} = 1;
3621                 }
3622               else
3623                 {
3624                   $trans_vars{$varname} = 1;
3625                 }
3626               push_dist_common ($varname)
3627                 if $pfx eq 'dist_';
3628             }
3629         }
3630     }
3632   return unless %sections;
3634   my @unsorted_deps;
3636   # Build section independent variables.
3637   my $have_notrans = %notrans_vars;
3638   my @notrans_list = sort keys %notrans_vars;
3639   my $have_trans = %trans_vars;
3640   my @trans_list = sort keys %trans_vars;
3642   # Now for each section, generate an install and uninstall rule.
3643   # Sort sections so output is deterministic.
3644   foreach my $section (sort keys %sections)
3645     {
3646       # Build section dependent variables.
3647       my $notrans_mans = $have_notrans || exists $notrans_sections{$section};
3648       my $trans_mans = $have_trans || exists $trans_sections{$section};
3649       my (%notrans_this_sect, %trans_this_sect);
3650       my $expr = 'man' . $section . '_MANS';
3651       foreach my $varname (keys %notrans_sect_vars)
3652         {
3653           if ($varname =~ /$expr/)
3654             {
3655               $notrans_this_sect{$varname} = 1;
3656             }
3657         }
3658       foreach my $varname (keys %trans_sect_vars)
3659         {
3660           if ($varname =~ /$expr/)
3661             {
3662               $trans_this_sect{$varname} = 1;
3663             }
3664         }
3665       my @notrans_sect_list = sort keys %notrans_this_sect;
3666       my @trans_sect_list = sort keys %trans_this_sect;
3667       @unsorted_deps = (keys %notrans_vars, keys %trans_vars,
3668                         keys %notrans_this_sect, keys %trans_this_sect);
3669       my @deps = sort @unsorted_deps;
3670       $output_rules .= file_contents ('mans',
3671                                       new Automake::Location,
3672                                       SECTION           => $section,
3673                                       DEPS              => "@deps",
3674                                       NOTRANS_MANS      => $notrans_mans,
3675                                       NOTRANS_SECT_LIST => "@notrans_sect_list",
3676                                       HAVE_NOTRANS      => $have_notrans,
3677                                       NOTRANS_LIST      => "@notrans_list",
3678                                       TRANS_MANS        => $trans_mans,
3679                                       TRANS_SECT_LIST   => "@trans_sect_list",
3680                                       HAVE_TRANS        => $have_trans,
3681                                       TRANS_LIST        => "@trans_list");
3682     }
3684   @unsorted_deps  = (keys %notrans_vars, keys %trans_vars,
3685                      keys %notrans_sect_vars, keys %trans_sect_vars);
3686   my @mans = sort @unsorted_deps;
3687   $output_vars .= file_contents ('mans-vars',
3688                                  new Automake::Location,
3689                                  MANS => "@mans");
3691   push (@all, '$(MANS)')
3692     unless option 'no-installman';
3696 sub handle_data ()
3698     am_install_var ('-noextra', '-candist', 'data', 'DATA',
3699                     'data', 'dataroot', 'doc', 'dvi', 'html', 'pdf',
3700                     'ps', 'sysconf', 'sharedstate', 'localstate',
3701                     'pkgdata', 'lisp', 'noinst', 'check');
3705 sub handle_tags ()
3707     my @config;
3708     foreach my $spec (@config_headers)
3709       {
3710         my ($out, @ins) = split_config_file_spec ($spec);
3711         foreach my $in (@ins)
3712           {
3713             # If the config header source is in this directory,
3714             # require it.
3715             push @config, basename ($in)
3716               if $relative_dir eq dirname ($in);
3717            }
3718       }
3720     define_variable ('am__tagged_files',
3721                      '$(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)'
3722                      . " @config", INTERNAL);
3724     if (rvar('am__tagged_files')->value_as_list_recursive
3725           || var ('ETAGS_ARGS') || var ('SUBDIRS'))
3726       {
3727         $output_rules .= file_contents ('tags', new Automake::Location);
3728         set_seen 'TAGS_DEPENDENCIES';
3729       }
3730     else
3731       {
3732         reject_var ('TAGS_DEPENDENCIES',
3733                     "it doesn't make sense to define 'TAGS_DEPENDENCIES'"
3734                     . " without\nsources or 'ETAGS_ARGS'");
3735         # Every Makefile must define some sort of TAGS rule.
3736         # Otherwise, it would be possible for a top-level "make TAGS"
3737         # to fail because some subdirectory failed.  Ditto ctags and
3738         # cscope.
3739         $output_rules .=
3740           "tags TAGS:\n\n" .
3741           "ctags CTAGS:\n\n" .
3742           "cscope cscopelist:\n\n";
3743       }
3747 # user_phony_rule ($NAME)
3748 # -----------------------
3749 # Return false if rule $NAME does not exist.  Otherwise,
3750 # declare it as phony, complete its definition (in case it is
3751 # conditional), and return its Automake::Rule instance.
3752 sub user_phony_rule
3754   my ($name) = @_;
3755   my $rule = rule $name;
3756   if ($rule)
3757     {
3758       depend ('.PHONY', $name);
3759       # Define $NAME in all condition where it is not already defined,
3760       # so that it is always OK to depend on $NAME.
3761       for my $c ($rule->not_always_defined_in_cond (TRUE)->conds)
3762         {
3763           Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE,
3764                                   $c, INTERNAL);
3765           $output_rules .= $c->subst_string . "$name:\n";
3766         }
3767     }
3768   return $rule;
3772 # Handle 'dist' target.
3773 sub handle_dist ()
3775   # Substitutions for distdir.am
3776   my %transform;
3778   # Define DIST_SUBDIRS.  This must always be done, regardless of the
3779   # no-dist setting: target like 'distclean' or 'maintainer-clean' use it.
3780   my $subdirs = var ('SUBDIRS');
3781   if ($subdirs)
3782     {
3783       # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS
3784       # to all possible directories, and use it.  If DIST_SUBDIRS is
3785       # defined, just use it.
3787       # Note that we check DIST_SUBDIRS first on purpose, so that
3788       # we don't call has_conditional_contents for now reason.
3789       # (In the past one project used so many conditional subdirectories
3790       # that calling has_conditional_contents on SUBDIRS caused
3791       # automake to grow to 150Mb -- this should not happen with
3792       # the current implementation of has_conditional_contents,
3793       # but it's more efficient to avoid the call anyway.)
3794       if (var ('DIST_SUBDIRS'))
3795         {
3796         }
3797       elsif ($subdirs->has_conditional_contents)
3798         {
3799           define_pretty_variable
3800             ('DIST_SUBDIRS', TRUE, INTERNAL,
3801              uniq ($subdirs->value_as_list_recursive));
3802         }
3803       else
3804         {
3805           # We always define this because that is what 'distclean'
3806           # wants.
3807           define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL,
3808                                   '$(SUBDIRS)');
3809         }
3810     }
3812   # The remaining definitions are only required when a dist target is used.
3813   return if option 'no-dist';
3815   # At least one of the archive formats must be enabled.
3816   if ($relative_dir eq '.')
3817     {
3818       my $archive_defined = option 'no-dist-gzip' ? 0 : 1;
3819       $archive_defined ||=
3820         grep { option "dist-$_" } qw(shar zip tarZ bzip2 lzip xz zstd);
3821       error (option 'no-dist-gzip',
3822              "no-dist-gzip specified but no dist-* specified,\n"
3823              . "at least one archive format must be enabled")
3824         unless $archive_defined;
3825     }
3827   # Look for common files that should be included in distribution.
3828   # If the aux dir is set, and it does not have a Makefile.am, then
3829   # we check for these files there as well.
3830   my $check_aux = 0;
3831   if ($relative_dir eq '.'
3832       && $config_aux_dir_set_in_configure_ac)
3833     {
3834       if (! is_make_dir ($config_aux_dir))
3835         {
3836           $check_aux = 1;
3837         }
3838     }
3839   foreach my $cfile (@toplevelmd_ok, @common_files)
3840     {
3841       if (dir_has_case_matching_file ($relative_dir, $cfile)
3842           # The file might be absent, but if it can be built it's ok.
3843           || rule $cfile)
3844         {
3845           push_dist_common ($cfile);
3846         }
3847       elsif (grep { $_ eq $cfile } @toplevelmd_ok)
3848         { # Irritatingly, have to repeat the checks, now for .md files;
3849           # we want to prefer non-.md, so do this second, and only "elsif".
3850           if (dir_has_case_matching_file ($relative_dir, "$cfile.md")
3851               || rule "$cfile.md")
3852             {
3853               push_dist_common ("$cfile.md");
3854             }
3855         }
3857       # Don't use 'elsif' here because a file might meaningfully
3858       # appear in both $relative_dir and $config_aux_dir.
3859       if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile))
3860         {
3861           push_dist_common ("$config_aux_dir/$cfile")
3862         }
3863       elsif ($check_aux && grep { $_ eq $cfile } @toplevelmd_ok)
3864         {
3865           if (dir_has_case_matching_file ($config_aux_dir, "$cfile.md")
3866               || rule "$cfile.md")
3867             {
3868               push_dist_common ("$cfile.md");
3869             }
3870         }
3871     }
3873   # We might copy elements from @configure_dist_common to
3874   # @dist_common if we think we need to.  If the file appears in our
3875   # directory, we would have discovered it already, so we don't
3876   # check that.  But if the file is in a subdir without a Makefile,
3877   # we want to distribute it here if we are doing '.'.  Ugly!
3878   # Also, in some corner cases, it's possible that the following code
3879   # will cause the same file to appear in the $(DIST_COMMON) variables
3880   # of two distinct Makefiles; but this is not a problem, since the
3881   # 'distdir' target in 'lib/am/distdir.am' can deal with the same
3882   # file being distributed multiple times.
3883   # See also automake bug#9651.
3884   if ($relative_dir eq '.')
3885     {
3886       foreach my $file (@configure_dist_common)
3887         {
3888           my $dir = dirname ($file);
3889           push_dist_common ($file)
3890             if ($dir eq '.' || ! is_make_dir ($dir));
3891         }
3892       @configure_dist_common = ();
3893     }
3895   # $(am__DIST_COMMON): files to be distributed automatically.  Will be
3896   # appended to $(DIST_COMMON) in the generated Makefile.
3897   # Use 'sort' so that the expansion of $(DIST_COMMON) in the generated
3898   # Makefile is deterministic, in face of m4 and/or perl randomizations
3899   # (see automake bug#17908).
3900   define_pretty_variable ('am__DIST_COMMON', TRUE, INTERNAL,
3901                           uniq (sort @dist_common));
3903   # Now that we've processed @dist_common, disallow further attempts
3904   # to modify it.
3905   $handle_dist_run = 1;
3907   $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook';
3908   $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external;
3910   # If the target 'dist-hook' exists, make sure it is run.  This
3911   # allows users to do random weird things to the distribution
3912   # before it is packaged up.
3913   push (@dist_targets, 'dist-hook')
3914     if user_phony_rule 'dist-hook';
3915   $transform{'DIST-TARGETS'} = join (' ', @dist_targets);
3917   my $flm = option ('filename-length-max');
3918   my $filename_filter = $flm ? '.' x $flm->[1] : '';
3920   $output_rules .= file_contents ('distdir',
3921                                   new Automake::Location,
3922                                   %transform,
3923                                   FILENAME_FILTER => $filename_filter);
3927 # check_directory ($NAME, $WHERE [, $RELATIVE_DIR = "."])
3928 # -------------------------------------------------------
3929 # Ensure $NAME is a directory (in $RELATIVE_DIR), and that it uses a sane
3930 # name.  Use $WHERE as a location in the diagnostic, if any.
3931 sub check_directory
3933   my ($dir, $where, $reldir) = @_;
3934   $reldir = '.' unless defined $reldir;
3936   error $where, "required directory $reldir/$dir does not exist"
3937     unless -d "$reldir/$dir";
3939   # If an 'obj/' directory exists, BSD make will enter it before
3940   # reading 'Makefile'.  Hence the 'Makefile' in the current directory
3941   # will not be read.
3942   #
3943   #  % cat Makefile
3944   #  all:
3945   #          echo Hello
3946   #  % cat obj/Makefile
3947   #  all:
3948   #          echo World
3949   #  % make      # GNU make
3950   #  echo Hello
3951   #  Hello
3952   #  % pmake     # BSD make
3953   #  echo World
3954   #  World
3955   msg ('portability', $where,
3956        "naming a subdirectory 'obj' causes troubles with BSD make")
3957     if $dir eq 'obj';
3959   # 'aux' is probably the most important of the following forbidden name,
3960   # since it's tempting to use it as an AC_CONFIG_AUX_DIR.
3961   msg ('portability', $where,
3962        "name '$dir' is reserved on W32 and DOS platforms")
3963     if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/);
3966 # check_directories_in_var ($VARIABLE)
3967 # ------------------------------------
3968 # Recursively check all items in variables $VARIABLE as directories
3969 sub check_directories_in_var
3971   my ($var) = @_;
3972   $var->traverse_recursively
3973     (sub
3974      {
3975        my ($var, $val, $cond, $full_cond) = @_;
3976        check_directory ($val, $var->rdef ($cond)->location, $relative_dir);
3977        return ();
3978      },
3979      undef,
3980      skip_ac_subst => 1);
3984 sub handle_subdirs ()
3986   my $subdirs = var ('SUBDIRS');
3987   return
3988     unless $subdirs;
3990   check_directories_in_var $subdirs;
3992   my $dsubdirs = var ('DIST_SUBDIRS');
3993   check_directories_in_var $dsubdirs
3994     if $dsubdirs;
3996   $output_rules .= file_contents ('subdirs', new Automake::Location);
3997   rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross!
4001 # ($REGEN, @DEPENDENCIES)
4002 # scan_aclocal_m4
4003 # ---------------
4004 # If aclocal.m4 creation is automated, return the list of its dependencies.
4005 sub scan_aclocal_m4 ()
4007   my $regen_aclocal = 0;
4009   set_seen 'CONFIG_STATUS_DEPENDENCIES';
4010   set_seen 'CONFIGURE_DEPENDENCIES';
4012   if (-f 'aclocal.m4')
4013     {
4014       define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL);
4016       my $aclocal = new Automake::XFile "< aclocal.m4";
4017       my $line = $aclocal->getline;
4018       $regen_aclocal = $line =~ 'generated automatically by aclocal';
4019     }
4021   my @ac_deps = ();
4023   if (set_seen ('ACLOCAL_M4_SOURCES'))
4024     {
4025       push (@ac_deps, '$(ACLOCAL_M4_SOURCES)');
4026       msg_var ('obsolete', 'ACLOCAL_M4_SOURCES',
4027                "'ACLOCAL_M4_SOURCES' is obsolete.\n"
4028                . "It should be safe to simply remove it");
4029     }
4031   # Note that it might be possible that aclocal.m4 doesn't exist but
4032   # should be auto-generated.  This case probably isn't very
4033   # important.
4035   return ($regen_aclocal, @ac_deps);
4039 # Helper function for 'substitute_ac_subst_variables'.
4040 sub substitute_ac_subst_variables_worker
4042   my ($token) = @_;
4043   return "\@$token\@" if var $token;
4044   return "\${$token\}";
4047 # substitute_ac_subst_variables ($TEXT)
4048 # -------------------------------------
4049 # Replace any occurrence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST
4050 # variable.
4051 sub substitute_ac_subst_variables
4053   my ($text) = @_;
4054   $text =~ s/\$[{]([^ \t=:+{}]+)}/substitute_ac_subst_variables_worker ($1)/ge;
4055   return $text;
4058 # @DEPENDENCIES
4059 # prepend_srcdir (@INPUTS)
4060 # ------------------------
4061 # Prepend $(srcdir) or $(top_srcdir) to all @INPUTS.  The idea is that
4062 # if an input file has a directory part the same as the current
4063 # directory, then the directory part is simply replaced by $(srcdir).
4064 # But if the directory part is different, then $(top_srcdir) is
4065 # prepended.
4066 sub prepend_srcdir
4068   my (@inputs) = @_;
4069   my @newinputs;
4071   foreach my $single (@inputs)
4072     {
4073       if (dirname ($single) eq $relative_dir)
4074         {
4075           push (@newinputs, '$(srcdir)/' . basename ($single));
4076         }
4077       else
4078         {
4079           push (@newinputs, '$(top_srcdir)/' . $single);
4080         }
4081     }
4082   return @newinputs;
4085 # @DEPENDENCIES
4086 # rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS)
4087 # ---------------------------------------------------
4088 # Compute a list of dependencies appropriate for the rebuild
4089 # rule of
4090 #   AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...)
4091 # Also distribute $INPUTs which are not built by another AC_CONFIG_FOOs.
4092 sub rewrite_inputs_into_dependencies
4094   my ($file, @inputs) = @_;
4095   my @res = ();
4097   for my $i (@inputs)
4098     {
4099       # We cannot create dependencies on shell variables.
4100       next if (substitute_ac_subst_variables $i) =~ /\$/;
4102       if (exists $ac_config_files_location{$i} && $i ne $file)
4103         {
4104           my $di = dirname $i;
4105           if ($di eq $relative_dir)
4106             {
4107               $i = basename $i;
4108             }
4109           # In the top-level Makefile we do not use $(top_builddir), because
4110           # we are already there, and since the targets are built without
4111           # a $(top_builddir), it helps BSD Make to match them with
4112           # dependencies.
4113           elsif ($relative_dir ne '.')
4114             {
4115               $i = '$(top_builddir)/' . $i;
4116             }
4117         }
4118       else
4119         {
4120           msg ('error', $ac_config_files_location{$file},
4121                "required file '$i' not found")
4122             unless $i =~ /\$/ || exists $output_files{$i} || -f $i;
4123           ($i) = prepend_srcdir ($i);
4124           push_dist_common ($i);
4125         }
4126       push @res, $i;
4127     }
4128   return @res;
4133 # handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS)
4134 # -----------------------------------------------------------------
4135 # Handle remaking and configure stuff.
4136 # We need the name of the input file, to do proper remaking rules.
4137 sub handle_configure
4139   my ($makefile_am, $makefile_in, $makefile, @inputs) = @_;
4141   prog_error 'empty @inputs'
4142     unless @inputs;
4144   my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am,
4145                                                             $makefile_in);
4146   my $rel_makefile = basename $makefile;
4148   my $colon_infile = ':' . join (':', @inputs);
4149   $colon_infile = '' if $colon_infile eq ":$makefile.in";
4150   my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs);
4151   my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4;
4152   define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL,
4153                           @configure_deps, @aclocal_m4_deps,
4154                           '$(top_srcdir)/' . $configure_ac);
4155   my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)');
4156   push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4';
4157   define_pretty_variable ('am__configure_deps', TRUE, INTERNAL,
4158                           @configuredeps);
4160   my $automake_options = '--' . $strictness_name .
4161                          (global_option 'no-dependencies' ? ' --ignore-deps' : '');
4163   $output_rules .= file_contents
4164     ('configure',
4165      new Automake::Location,
4166      MAKEFILE              => $rel_makefile,
4167      'MAKEFILE-DEPS'       => "@rewritten",
4168      'CONFIG-MAKEFILE'     => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@',
4169      'MAKEFILE-IN'         => $rel_makefile_in,
4170      'HAVE-MAKEFILE-IN-DEPS' => (@include_stack > 0),
4171      'MAKEFILE-IN-DEPS'    => "@include_stack",
4172      'MAKEFILE-AM'         => $rel_makefile_am,
4173      'AUTOMAKE-OPTIONS'    => $automake_options,
4174      'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile",
4175      'REGEN-ACLOCAL-M4'    => $regen_aclocal_m4,
4176      VERBOSE               => verbose_flag ('GEN'));
4178   if ($relative_dir eq '.')
4179     {
4180       push_dist_common ('acconfig.h')
4181         if -f 'acconfig.h';
4182     }
4184   # If we have a configure header, require it.
4185   my $hdr_index = 0;
4186   my @distclean_config;
4187   foreach my $spec (@config_headers)
4188     {
4189       $hdr_index += 1;
4190       # $CONFIG_H_PATH: config.h from top level.
4191       my ($config_h_path, @ins) = split_config_file_spec ($spec);
4192       my $config_h_dir = dirname ($config_h_path);
4194       # If the header is in the current directory we want to build
4195       # the header here.  Otherwise, if we're at the topmost
4196       # directory and the header's directory doesn't have a
4197       # Makefile, then we also want to build the header.
4198       if ($relative_dir eq $config_h_dir
4199           || ($relative_dir eq '.' && ! is_make_dir ($config_h_dir)))
4200         {
4201           my ($cn_sans_dir, $stamp_dir);
4202           if ($relative_dir eq $config_h_dir)
4203             {
4204               $cn_sans_dir = basename ($config_h_path);
4205               $stamp_dir = '';
4206             }
4207           else
4208             {
4209               $cn_sans_dir = $config_h_path;
4210               if ($config_h_dir eq '.')
4211                 {
4212                   $stamp_dir = '';
4213                 }
4214               else
4215                 {
4216                   $stamp_dir = $config_h_dir . '/';
4217                 }
4218             }
4220           # This will also distribute all inputs.
4221           @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins);
4223           # Cannot define rebuild rules for filenames with shell variables.
4224           next if (substitute_ac_subst_variables $config_h_path) =~ /\$/;
4226           # Header defined in this directory.
4227           my @files;
4228           if (-f $config_h_path . '.top')
4229             {
4230               push (@files, "$cn_sans_dir.top");
4231             }
4232           if (-f $config_h_path . '.bot')
4233             {
4234               push (@files, "$cn_sans_dir.bot");
4235             }
4237           push_dist_common (@files);
4239           # For now, acconfig.h can only appear in the top srcdir.
4240           if (-f 'acconfig.h')
4241             {
4242               push (@files, '$(top_srcdir)/acconfig.h');
4243             }
4245           my $stamp = "${stamp_dir}stamp-h${hdr_index}";
4246           $output_rules .=
4247             file_contents ('remake-hdr',
4248                            new Automake::Location,
4249                            FILES            => "@files",
4250                            'FIRST-HDR'      => ($hdr_index == 1),
4251                            CONFIG_H         => $cn_sans_dir,
4252                            CONFIG_HIN       => $ins[0],
4253                            CONFIG_H_DEPS    => "@ins",
4254                            CONFIG_H_PATH    => $config_h_path,
4255                            STAMP            => "$stamp");
4257           push @distclean_config, $cn_sans_dir, $stamp;
4258         }
4259     }
4261   $output_rules .= file_contents ('clean-hdr',
4262                                   new Automake::Location,
4263                                   FILES => "@distclean_config")
4264     if @distclean_config;
4266   # Distribute and define mkinstalldirs only if it is already present
4267   # in the package, for backward compatibility (some people may still
4268   # use $(mkinstalldirs)).
4269   # TODO: start warning about this in Automake 1.14, and have
4270   # TODO: Automake 2.0 drop it (and the mkinstalldirs script
4271   # TODO: as well).
4272   my $mkidpath = "$config_aux_dir/mkinstalldirs";
4273   if (-f $mkidpath)
4274     {
4275       # Use require_file so that any existing script gets updated
4276       # by --force-missing.
4277       require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs');
4278       define_variable ('mkinstalldirs',
4279                        "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL);
4280     }
4281   else
4282     {
4283       # Use $(install_sh), not $(MKDIR_P) because the latter requires
4284       # at least one argument, and $(mkinstalldirs) used to work
4285       # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)).
4286       # Also, $(MKDIR_P) uses the umask for any intermediate directories
4287       # created, whereas we want them to be created with umask 022
4288       # so that they are mode 755.
4289       define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL);
4290     }
4292   reject_var ('CONFIG_HEADER',
4293               "'CONFIG_HEADER' is an anachronism; now determined "
4294               . "automatically\nfrom '$configure_ac'");
4296   my @config_h;
4297   foreach my $spec (@config_headers)
4298     {
4299       my ($out, @ins) = split_config_file_spec ($spec);
4300       # Generate CONFIG_HEADER define.
4301       if ($relative_dir eq dirname ($out))
4302         {
4303           push @config_h, basename ($out);
4304         }
4305       else
4306         {
4307           push @config_h, "\$(top_builddir)/$out";
4308         }
4309     }
4310   define_variable ("CONFIG_HEADER", "@config_h", INTERNAL)
4311     if @config_h;
4313   # Now look for other files in this directory which must be remade
4314   # by config.status, and generate rules for them.
4315   my @actual_other_files = ();
4316   # These get cleaned only in a VPATH build.
4317   my @actual_other_vpath_files = ();
4318   foreach my $lfile (@other_input_files)
4319     {
4320       my $file;
4321       my @inputs;
4322       if ($lfile =~ /^([^:]*):(.*)$/)
4323         {
4324           # This is the ":" syntax of AC_OUTPUT.
4325           $file = $1;
4326           @inputs = split (':', $2);
4327         }
4328       else
4329         {
4330           # Normal usage.
4331           $file = $lfile;
4332           @inputs = $file . '.in';
4333         }
4335       # Automake files should not be stored in here, but in %MAKE_LIST.
4336       prog_error ("$lfile in \@other_input_files\n"
4337                   . "\@other_input_files = (@other_input_files)")
4338         if -f $file . '.am';
4340       my $local = basename ($file);
4342       # We skip files that aren't in this directory.  However, if
4343       # the file's directory does not have a Makefile, and we are
4344       # currently doing '.', then we create a rule to rebuild the
4345       # file in the subdir.
4346       my $fd = dirname ($file);
4347       if ($fd ne $relative_dir)
4348         {
4349           if ($relative_dir eq '.' && ! is_make_dir ($fd))
4350             {
4351               $local = $file;
4352             }
4353           else
4354             {
4355               next;
4356             }
4357         }
4359       my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs);
4361       # Cannot output rules for shell variables.
4362       next if (substitute_ac_subst_variables $local) =~ /\$/;
4364       my $condstr = '';
4365       my $cond = $ac_config_files_condition{$lfile};
4366       if (defined $cond)
4367         {
4368           $condstr = $cond->subst_string;
4369           Automake::Rule::define ($local, $configure_ac, RULE_AUTOMAKE, $cond,
4370                                   $ac_config_files_location{$file});
4371         }
4372       $output_rules .= ($condstr . $local . ': '
4373                         . '$(top_builddir)/config.status '
4374                         . "@rewritten_inputs\n"
4375                         . $condstr . "\t"
4376                         . 'cd $(top_builddir) && '
4377                         . '$(SHELL) ./config.status '
4378                         . ($relative_dir eq '.' ? '' : '$(subdir)/')
4379                         . '$@'
4380                         . "\n");
4381       push (@actual_other_files, $local);
4382     }
4384   # For links we should clean destinations and distribute sources.
4385   foreach my $spec (@config_links)
4386     {
4387       my ($link, $file) = split /:/, $spec;
4388       # Some people do AC_CONFIG_LINKS($computed).  We only handle
4389       # the DEST:SRC form.
4390       next unless $file;
4391       my $where = $ac_config_files_location{$link};
4393       # Skip destinations that contain shell variables.
4394       if ((substitute_ac_subst_variables $link) !~ /\$/)
4395         {
4396           # We skip links that aren't in this directory.  However, if
4397           # the link's directory does not have a Makefile, and we are
4398           # currently doing '.', then we add the link to CONFIG_CLEAN_FILES
4399           # in '.'s Makefile.in.
4400           my $local = basename ($link);
4401           my $fd = dirname ($link);
4402           if ($fd ne $relative_dir)
4403             {
4404               if ($relative_dir eq '.' && ! is_make_dir ($fd))
4405                 {
4406                   $local = $link;
4407                 }
4408               else
4409                 {
4410                   $local = undef;
4411                 }
4412             }
4413           if ($file ne $link)
4414             {
4415               push @actual_other_files, $local if $local;
4416             }
4417           else
4418             {
4419               push @actual_other_vpath_files, $local if $local;
4420             }
4421         }
4423       # Do not process sources that contain shell variables.
4424       if ((substitute_ac_subst_variables $file) !~ /\$/)
4425         {
4426           my $fd = dirname ($file);
4428           # We distribute files that are in this directory.
4429           # At the top-level ('.') we also distribute files whose
4430           # directory does not have a Makefile.
4431           if (($fd eq $relative_dir)
4432               || ($relative_dir eq '.' && ! is_make_dir ($fd)))
4433             {
4434               # The following will distribute $file as a side-effect when
4435               # it is appropriate (i.e., when $file is not already an output).
4436               # We do not need the result, just the side-effect.
4437               rewrite_inputs_into_dependencies ($link, $file);
4438             }
4439         }
4440     }
4442   # These files get removed by "make distclean".
4443   define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL,
4444                           @actual_other_files);
4445   define_pretty_variable ('CONFIG_CLEAN_VPATH_FILES', TRUE, INTERNAL,
4446                           @actual_other_vpath_files);
4449 sub handle_headers ()
4451     my @r = am_install_var ('-defaultdist', 'header', 'HEADERS', 'include',
4452                             'oldinclude', 'pkginclude',
4453                             'noinst', 'check');
4454     foreach (@r)
4455     {
4456       next unless $_->[1] =~ /\..*$/;
4457       saw_extension ($&);
4458     }
4461 sub handle_gettext ()
4463   return if ! $seen_gettext || $relative_dir ne '.';
4465   my $subdirs = var 'SUBDIRS';
4467   if (! $subdirs)
4468     {
4469       err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined";
4470       return;
4471     }
4473   # Perform some sanity checks to help users get the right setup.
4474   # We disable these tests when po/ doesn't exist in order not to disallow
4475   # unusual gettext setups.
4476   #
4477   # Bruno Haible:
4478   # | The idea is:
4479   # |
4480   # |  1) If a package doesn't have a directory po/ at top level, it
4481   # |     will likely have multiple po/ directories in subpackages.
4482   # |
4483   # |  2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT
4484   # |     is used without 'external'. It is also useful to warn for the
4485   # |     presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both
4486   # |     warnings apply only to the usual layout of packages, therefore
4487   # |     they should both be disabled if no po/ directory is found at
4488   # |     top level.
4490   if (-d 'po')
4491     {
4492       my @subdirs = $subdirs->value_as_list_recursive;
4494       msg_var ('syntax', $subdirs,
4495                "AM_GNU_GETTEXT used but 'po' not in SUBDIRS")
4496         if ! grep ($_ eq 'po', @subdirs);
4498       # intl/ is not required when AM_GNU_GETTEXT is called with the
4499       # 'external' option and AM_GNU_GETTEXT_INTL_SUBDIR is not called.
4500       msg_var ('syntax', $subdirs,
4501                "AM_GNU_GETTEXT used but 'intl' not in SUBDIRS")
4502         if (! ($seen_gettext_external && ! $seen_gettext_intl)
4503             && ! grep ($_ eq 'intl', @subdirs));
4505       # intl/ should not be used with AM_GNU_GETTEXT([external]), except
4506       # if AM_GNU_GETTEXT_INTL_SUBDIR is called.
4507       msg_var ('syntax', $subdirs,
4508                "'intl' should not be in SUBDIRS when "
4509                . "AM_GNU_GETTEXT([external]) is used")
4510         if ($seen_gettext_external && ! $seen_gettext_intl
4511             && grep ($_ eq 'intl', @subdirs));
4512     }
4514   require_file ($ac_gettext_location, GNU, 'ABOUT-NLS');
4517 # Emit makefile footer.
4518 sub handle_footer ()
4520     reject_rule ('.SUFFIXES',
4521                  "use variable 'SUFFIXES', not target '.SUFFIXES'");
4523     # Note: AIX 4.1 /bin/make will fail if any suffix rule appears
4524     # before .SUFFIXES.  So we make sure that .SUFFIXES appears before
4525     # anything else, by sticking it right after the default: target.
4526     $output_header .= ".SUFFIXES:\n";
4527     my $suffixes = var 'SUFFIXES';
4528     my @suffixes = Automake::Rule::suffixes;
4529     if (@suffixes || $suffixes)
4530     {
4531         # Make sure SUFFIXES has unique elements.  Sort them to ensure
4532         # the output remains consistent.  However, $(SUFFIXES) is
4533         # always at the start of the list, unsorted.  This is done
4534         # because make will choose rules depending on the ordering of
4535         # suffixes, and this lets the user have some control.  Push
4536         # actual suffixes, and not $(SUFFIXES).  Some versions of make
4537         # do not like variable substitutions on the .SUFFIXES line.
4538         my @user_suffixes = ($suffixes
4539                              ? $suffixes->value_as_list_recursive : ());
4541         my %suffixes = map { $_ => 1 } @suffixes;
4542         delete @suffixes{@user_suffixes};
4544         $output_header .= (".SUFFIXES: "
4545                            . join (' ', @user_suffixes, sort keys %suffixes)
4546                            . "\n");
4547     }
4549     $output_trailer .= file_contents ('footer', new Automake::Location);
4553 # Generate 'make install' rules.
4554 sub handle_install ()
4556   $output_rules .= file_contents
4557     ('install',
4558      new Automake::Location,
4559      maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES')
4560                              ? (" \$(BUILT_SOURCES)\n"
4561                                 . "\t\$(MAKE) \$(AM_MAKEFLAGS)")
4562                              : ''),
4563      'installdirs-local' => (user_phony_rule ('installdirs-local')
4564                              ? ' installdirs-local' : ''),
4565      am__installdirs => variable_value ('am__installdirs') || '');
4569 # handle_all ($MAKEFILE)
4570 #-----------------------
4571 # Deal with 'all' and 'all-am'.
4572 sub handle_all
4574     my ($makefile) = @_;
4576     # Output 'all-am'.
4578     # Put this at the beginning for the sake of non-GNU makes.  This
4579     # is still wrong if these makes can run parallel jobs.  But it is
4580     # right enough.
4581     unshift (@all, basename ($makefile));
4583     foreach my $spec (@config_headers)
4584       {
4585         my ($out, @ins) = split_config_file_spec ($spec);
4586         push (@all, basename ($out))
4587           if dirname ($out) eq $relative_dir;
4588       }
4590     # Install 'all' hooks.
4591     push (@all, "all-local")
4592       if user_phony_rule "all-local";
4594     pretty_print_rule ("all-am:", "\t\t", @all);
4595     depend ('.PHONY', 'all-am', 'all');
4598     # Output 'all'.
4600     my @local_headers = ();
4601     push @local_headers, '$(BUILT_SOURCES)'
4602       if var ('BUILT_SOURCES');
4603     foreach my $spec (@config_headers)
4604       {
4605         my ($out, @ins) = split_config_file_spec ($spec);
4606         push @local_headers, basename ($out)
4607           if dirname ($out) eq $relative_dir;
4608       }
4610     if (@local_headers)
4611       {
4612         # We need to make sure config.h is built before we recurse.
4613         # We also want to make sure that built sources are built
4614         # before any ordinary 'all' targets are run.  We can't do this
4615         # by changing the order of dependencies to the "all" because
4616         # that breaks when using parallel makes.  Instead we handle
4617         # things explicitly.
4618         $output_all .= ("all: @local_headers"
4619                         . "\n\t"
4620                         . '$(MAKE) $(AM_MAKEFLAGS) '
4621                         . (var ('SUBDIRS') ? 'all-recursive' : 'all-am')
4622                         . "\n\n");
4623         depend ('.MAKE', 'all');
4624       }
4625     else
4626       {
4627         $output_all .= "all: " . (var ('SUBDIRS')
4628                                   ? 'all-recursive' : 'all-am') . "\n\n";
4629       }
4632 # Generate helper targets for user-defined recursive targets, where needed.
4633 sub handle_user_recursion ()
4635   return unless @extra_recursive_targets;
4637   define_pretty_variable ('am__extra_recursive_targets', TRUE, INTERNAL,
4638                           map { "$_-recursive" } @extra_recursive_targets);
4639   my $aux = var ('SUBDIRS') ? 'recursive' : 'am';
4640   foreach my $target (@extra_recursive_targets)
4641     {
4642       # This allows the default target's rules to be overridden in
4643       # Makefile.am.
4644       user_phony_rule ($target);
4645       depend ("$target", "$target-$aux");
4646       depend ("$target-am", "$target-local");
4647       # Every user-defined recursive target 'foo' *must* have a valid
4648       # associated 'foo-local' rule; we define it as an empty rule by
4649       # default, so that the user can transparently extend it in his
4650       # own Makefile.am.
4651       pretty_print_rule ("$target-local:", '', '');
4652       # $target-recursive might as well be undefined, so do not add
4653       # it here; it's taken care of in subdirs.am anyway.
4654       depend (".PHONY", "$target-am", "$target-local");
4655     }
4659 # Handle check merge target specially.
4660 sub do_check_merge_target ()
4662   # Include user-defined local form of target.
4663   push @check_tests, 'check-local'
4664     if user_phony_rule 'check-local';
4666   # The check target must depend on the local equivalent of
4667   # 'all', to ensure all the primary targets are built.  Then it
4668   # must build the local check rules.
4669   $output_rules .= "check-am: all-am\n";
4670   if (@check)
4671     {
4672       pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ", @check);
4673       depend ('.MAKE', 'check-am');
4674     }
4676   if (@check_tests)
4677     {
4678       pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4679                          @check_tests);
4680       depend ('.MAKE', 'check-am');
4681     }
4683   depend '.PHONY', 'check', 'check-am';
4684   # Handle recursion.  We have to honor BUILT_SOURCES like for 'all:'.
4685   $output_rules .= ("check: "
4686                     . (var ('BUILT_SOURCES')
4687                        ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) "
4688                        : '')
4689                     . (var ('SUBDIRS') ? 'check-recursive' : 'check-am')
4690                     . "\n");
4691   depend ('.MAKE', 'check')
4692     if var ('BUILT_SOURCES');
4695 # Handle all 'clean' targets.
4696 sub handle_clean
4698   my ($makefile) = @_;
4700   # Clean the files listed in user variables if they exist.
4701   $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN
4702     if var ('MOSTLYCLEANFILES');
4703   $clean_files{'$(CLEANFILES)'} = CLEAN
4704     if var ('CLEANFILES');
4705   $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN
4706     if var ('DISTCLEANFILES');
4707   $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN
4708     if var ('MAINTAINERCLEANFILES');
4710   # Built sources are automatically removed by maintainer-clean.
4711   $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN
4712     if var ('BUILT_SOURCES');
4714   # Compute a list of "rm"s to run for each target.
4715   my %rms = (MOSTLY_CLEAN, [],
4716              CLEAN, [],
4717              DIST_CLEAN, [],
4718              MAINTAINER_CLEAN, []);
4720   foreach my $file (sort keys %clean_files)
4721     {
4722       my $when = $clean_files{$file};
4723       prog_error 'invalid entry in %clean_files'
4724         unless exists $rms{$when};
4726       my $rm = "rm -f $file";
4727       # If file is a variable, make sure when don't call 'rm -f' without args.
4728       $rm ="test -z \"$file\" || $rm"
4729         if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/);
4731       push @{$rms{$when}}, "\t-$rm\n";
4732     }
4734   $output_rules .= file_contents
4735     ('clean',
4736      new Automake::Location,
4737      MOSTLYCLEAN_RMS      => join ('', sort @{$rms{&MOSTLY_CLEAN}}),
4738      CLEAN_RMS            => join ('', sort @{$rms{&CLEAN}}),
4739      DISTCLEAN_RMS        => join ('', sort @{$rms{&DIST_CLEAN}}),
4740      MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}),
4741      MAKEFILE             => basename $makefile,
4742      );
4746 # Subroutine for handle_factored_dependencies() to let '.PHONY' and
4747 # other '.TARGETS' be last.  This is meant to be used as a comparison
4748 # subroutine passed to the sort built-int.
4749 sub target_cmp
4751   return 0 if $a eq $b;
4753   my $a1 = substr ($a, 0, 1);
4754   my $b1 = substr ($b, 0, 1);
4755   if ($a1 ne $b1)
4756     {
4757       return -1 if $b1 eq '.';
4758       return 1 if $a1 eq '.';
4759     }
4760   return $a cmp $b;
4764 # Handle everything related to gathered targets.
4765 sub handle_factored_dependencies ()
4767   # Reject bad hooks.
4768   foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook',
4769                      'uninstall-exec-local', 'uninstall-exec-hook',
4770                      'uninstall-dvi-local',
4771                      'uninstall-html-local',
4772                      'uninstall-info-local',
4773                      'uninstall-pdf-local',
4774                      'uninstall-ps-local')
4775     {
4776       my $x = $utarg;
4777       $x =~ s/-.*-/-/;
4778       reject_rule ($utarg, "use '$x', not '$utarg'");
4779     }
4781   reject_rule ('install-local',
4782                "use 'install-data-local' or 'install-exec-local', "
4783                . "not 'install-local'");
4785   reject_rule ('install-hook',
4786                "use 'install-data-hook' or 'install-exec-hook', "
4787                . "not 'install-hook'");
4789   # Install the -local hooks.
4790   foreach (sort keys %dependencies)
4791     {
4792       # Hooks are installed on the -am targets.
4793       s/-am$// or next;
4794       depend ("$_-am", "$_-local")
4795         if user_phony_rule "$_-local";
4796     }
4798   # Install the -hook hooks.
4799   # FIXME: Why not be as liberal as we are with -local hooks?
4800   foreach ('install-exec', 'install-data', 'uninstall')
4801     {
4802       if (user_phony_rule "$_-hook")
4803         {
4804           depend ('.MAKE', "$_-am");
4805           register_action("$_-am",
4806                           ("\t\@\$(NORMAL_INSTALL)\n"
4807                            . "\t\$(MAKE) \$(AM_MAKEFLAGS) $_-hook"));
4808         }
4809     }
4811   # All the required targets are phony.
4812   depend ('.PHONY', sort keys %required_targets);
4814   # Actually output gathered targets.
4815   foreach (sort target_cmp keys %dependencies)
4816     {
4817       # If there is nothing about this guy, skip it.
4818       next
4819         unless (@{$dependencies{$_}}
4820                 || $actions{$_}
4821                 || $required_targets{$_});
4823       # Define gathered targets in undefined conditions.
4824       # FIXME: Right now we must handle .PHONY as an exception,
4825       # because people write things like
4826       #    .PHONY: myphonytarget
4827       # to append dependencies.  This would not work if Automake
4828       # refrained from defining its own .PHONY target as it does
4829       # with other overridden targets.
4830       # Likewise for '.MAKE' and '.PRECIOUS'.
4831       my @undefined_conds = (TRUE,);
4832       if ($_ ne '.PHONY' && $_ ne '.MAKE' && $_ ne '.PRECIOUS')
4833         {
4834           @undefined_conds =
4835             Automake::Rule::define ($_, 'internal',
4836                                     RULE_AUTOMAKE, TRUE, INTERNAL);
4837         }
4838       my @uniq_deps = uniq (sort @{$dependencies{$_}});
4839       foreach my $cond (@undefined_conds)
4840         {
4841           my $condstr = $cond->subst_string;
4842           pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps);
4843           $output_rules .= $actions{$_} if defined $actions{$_};
4844           $output_rules .= "\n";
4845         }
4846     }
4850 sub handle_tests_dejagnu ()
4852     push (@check_tests, 'check-DEJAGNU');
4853     $output_rules .= file_contents ('dejagnu', new Automake::Location);
4856 # handle_per_suffix_test ($TEST_SUFFIX, [%TRANSFORM])
4857 #----------------------------------------------------
4858 sub handle_per_suffix_test
4860   my ($test_suffix, %transform) = @_;
4861   my ($pfx, $generic, $am_exeext);
4862   if ($test_suffix eq '')
4863     {
4864       $pfx = '';
4865       $generic = 0;
4866       $am_exeext = 'FALSE';
4867     }
4868   else
4869     {
4870       prog_error ("test suffix '$test_suffix' lacks leading dot")
4871         unless $test_suffix =~ m/^\.(.*)/;
4872       $pfx = uc ($1) . '_';
4873       $generic = 1;
4874       $am_exeext = exists $configure_vars{'EXEEXT'} ? 'am__EXEEXT'
4875                                                     : 'FALSE';
4876     }
4877   # The "test driver" program, deputed to handle tests protocol used by
4878   # test scripts.  By default, it's assumed that no protocol is used, so
4879   # we fall back to the old behaviour, implemented by the 'test-driver'
4880   # auxiliary script.
4881   if (! var "${pfx}LOG_DRIVER")
4882     {
4883       require_conf_file ("parallel-tests", FOREIGN, 'test-driver');
4884       define_variable ("${pfx}LOG_DRIVER",
4885                        "\$(SHELL) $am_config_aux_dir/test-driver",
4886                        INTERNAL);
4887     }
4888   my $driver = '$(' . $pfx . 'LOG_DRIVER)';
4889   my $driver_flags = '$(AM_' . $pfx . 'LOG_DRIVER_FLAGS)'
4890                        . ' $(' . $pfx . 'LOG_DRIVER_FLAGS)';
4891   my $compile = "${pfx}LOG_COMPILE";
4892   define_variable ($compile,
4893                    '$(' . $pfx . 'LOG_COMPILER)'
4894                       . ' $(AM_' .  $pfx . 'LOG_FLAGS)'
4895                       . ' $(' . $pfx . 'LOG_FLAGS)',
4896                      INTERNAL);
4897   $output_rules .= file_contents ('check2', new Automake::Location,
4898                                    GENERIC => $generic,
4899                                    DRIVER => $driver,
4900                                    DRIVER_FLAGS => $driver_flags,
4901                                    COMPILE => '$(' . $compile . ')',
4902                                    EXT => $test_suffix,
4903                                    am__EXEEXT => $am_exeext,
4904                                    %transform);
4907 # is_valid_test_extension ($EXT)
4908 # ------------------------------
4909 # Return true if $EXT can appear in $(TEST_EXTENSIONS), return false
4910 # otherwise.
4911 sub is_valid_test_extension
4913   my $ext = shift;
4914   return 1
4915     if ($ext =~ /^\.[a-zA-Z_][a-zA-Z0-9_]*$/);
4916   return 1
4917     if (exists $configure_vars{'EXEEXT'} && $ext eq subst ('EXEEXT'));
4918   return 0;
4922 sub handle_tests ()
4924   if (option 'dejagnu')
4925     {
4926       handle_tests_dejagnu;
4927     }
4928   else
4929     {
4930       foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
4931         {
4932           reject_var ($c, "'$c' defined but 'dejagnu' not in "
4933                       . "'AUTOMAKE_OPTIONS'");
4934         }
4935     }
4937   if (var ('TESTS'))
4938     {
4939       push (@check_tests, 'check-TESTS');
4940       my $check_deps = "@check";
4941       $output_rules .= file_contents ('check', new Automake::Location,
4942                                       SERIAL_TESTS => !! option 'serial-tests',
4943                                       CHECK_DEPS => $check_deps);
4945       # Tests that are known programs should have $(EXEEXT) appended.
4946       # For matching purposes, we need to adjust XFAIL_TESTS as well.
4947       append_exeext { exists $known_programs{$_[0]} } 'TESTS';
4948       append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS'
4949         if (var ('XFAIL_TESTS'));
4951       if (! option 'serial-tests')
4952         {
4953           define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL);
4954           my $suff = '.test';
4955           my $at_exeext = '';
4956           my $handle_exeext = exists $configure_vars{'EXEEXT'};
4957           if ($handle_exeext)
4958             {
4959               $at_exeext = subst ('EXEEXT');
4960               $suff = $at_exeext  . ' ' . $suff;
4961             }
4962           if (! var 'TEST_EXTENSIONS')
4963             {
4964               define_variable ('TEST_EXTENSIONS', $suff, INTERNAL);
4965             }
4966           my $var = var 'TEST_EXTENSIONS';
4967           # Currently, we are not able to deal with conditional contents
4968           # in TEST_EXTENSIONS.
4969           if ($var->has_conditional_contents)
4970            {
4971              msg_var 'unsupported', $var,
4972                      "'TEST_EXTENSIONS' cannot have conditional contents";
4973            }
4974           my @test_suffixes = $var->value_as_list_recursive;
4975           if ((my @invalid_test_suffixes =
4976                   grep { !is_valid_test_extension $_ } @test_suffixes) > 0)
4977             {
4978               error $var->rdef (TRUE)->location,
4979                     "invalid test extensions: @invalid_test_suffixes";
4980             }
4981           @test_suffixes = grep { is_valid_test_extension $_ } @test_suffixes;
4982           if ($handle_exeext)
4983             {
4984               unshift (@test_suffixes, $at_exeext)
4985                 unless @test_suffixes && $test_suffixes[0] eq $at_exeext;
4986             }
4987           unshift (@test_suffixes, '');
4989           transform_variable_recursively
4990             ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL,
4991               sub {
4992                 my ($subvar, $val, $cond, $full_cond) = @_;
4993                 my $obj = $val;
4994                 return $obj
4995                   if $val =~ /^\@.*\@$/;
4996                 $obj =~ s/\$\(EXEEXT\)$//o;
4998                 if ($val =~ /(\$\((top_)?srcdir\))\//o)
4999                   {
5000                     msg ('error', $subvar->rdef ($cond)->location,
5001                          "using '$1' in TESTS is currently broken: '$val'");
5002                   }
5004                 foreach my $test_suffix (@test_suffixes)
5005                   {
5006                     next
5007                       if $test_suffix eq $at_exeext || $test_suffix eq '';
5008                     return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log'
5009                       if substr ($obj, - length ($test_suffix)) eq $test_suffix;
5010                   }
5011                 my $base = $obj;
5012                 $obj .= '.log';
5013                 handle_per_suffix_test ('',
5014                                         OBJ => $obj,
5015                                         BASE => $base,
5016                                         SOURCE => $val);
5017                 return $obj;
5018               });
5020           my $nhelper=1;
5021           my $prev = 'TESTS';
5022           my $post = '';
5023           my $last_suffix = $test_suffixes[$#test_suffixes];
5024           my $cur = '';
5025           foreach my $test_suffix (@test_suffixes)
5026             {
5027               if ($test_suffix eq $last_suffix)
5028                 {
5029                   $cur = 'TEST_LOGS';
5030                 }
5031               else
5032                 {
5033                   $cur = 'am__test_logs' . $nhelper;
5034                 }
5035               define_variable ($cur,
5036                 '$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL);
5037               $post = '.log';
5038               $prev = $cur;
5039               $nhelper++;
5040               if ($test_suffix ne $at_exeext && $test_suffix ne '')
5041                 {
5042                   handle_per_suffix_test ($test_suffix,
5043                                           OBJ => '',
5044                                           BASE => '$*',
5045                                           SOURCE => '$<');
5046                 }
5047             }
5048           $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN;
5049           $clean_files{'$(TEST_LOGS:.log=.trs)'} = MOSTLY_CLEAN;
5050           $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN;
5051         }
5052     }
5055 sub handle_emacs_lisp ()
5057   my @elfiles = am_install_var ('-candist', 'lisp', 'LISP',
5058                                 'lisp', 'noinst');
5060   return if ! @elfiles;
5062   define_pretty_variable ('am__ELFILES', TRUE, INTERNAL,
5063                           map { $_->[1] } @elfiles);
5064   define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL,
5065                           '$(am__ELFILES:.el=.elc)');
5066   # This one can be overridden by users.
5067   define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)');
5069   push @all, '$(ELCFILES)';
5071   require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
5072                      'EMACS', 'lispdir');
5075 sub handle_python ()
5077   my @pyfiles = am_install_var ('-defaultdist', 'python', 'PYTHON',
5078                                 'noinst');
5079   return if ! @pyfiles;
5081   require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
5082   require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
5083   define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
5086 sub handle_java ()
5088     my @sourcelist = am_install_var ('-candist',
5089                                      'java', 'JAVA',
5090                                      'noinst', 'check');
5091     return if ! @sourcelist;
5093     my @prefixes = am_primary_prefixes ('JAVA', 1,
5094                                         'noinst', 'check');
5096     my $dir;
5097     my @java_sources = ();
5098     foreach my $prefix (@prefixes)
5099       {
5100         (my $curs = $prefix) =~ s/^(?:nobase_)?(?:dist_|nodist_)?//;
5102         next
5103           if $curs eq 'EXTRA';
5105         push @java_sources, '$(' . $prefix . '_JAVA' . ')';
5107         if (defined $dir)
5108           {
5109             err_var "${curs}_JAVA", "multiple _JAVA primaries in use"
5110              unless $curs eq $dir;
5111           }
5113         $dir = $curs;
5114       }
5116     define_pretty_variable ('am__java_sources', TRUE, INTERNAL,
5117                             "@java_sources");
5119     if ($dir eq 'check')
5120       {
5121         push (@check, "class$dir.stamp");
5122       }
5123     else
5124       {
5125         push (@all, "class$dir.stamp");
5126       }
5130 sub handle_minor_options ()
5132   if (option 'readme-alpha')
5133     {
5134       if ($relative_dir eq '.')
5135         {
5136           if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
5137             {
5138               msg ('error-gnits', $package_version_location,
5139                    "version '$package_version' doesn't follow " .
5140                    "Gnits standards");
5141             }
5142           if (defined $1 && (-f 'README-alpha' || -f 'README-alpha.md'))
5143             {
5144               # This means we have an alpha release.  See
5145               # GNITS_VERSION_PATTERN for details.
5146               my $af = -f 'README-alpha' ? 'README-alpha' : 'README-alpha.md';
5147               push_dist_common ($af);
5148             }
5149         }
5150     }
5153 ################################################################
5155 # ($OUTPUT, @INPUTS)
5156 # split_config_file_spec ($SPEC)
5157 # ------------------------------
5158 # Decode the Autoconf syntax for config files (files, headers, links
5159 # etc.).
5160 sub split_config_file_spec
5162   my ($spec) = @_;
5163   my ($output, @inputs) = split (/:/, $spec);
5165   push @inputs, "$output.in"
5166     unless @inputs;
5168   return ($output, @inputs);
5171 # $input
5172 # locate_am (@POSSIBLE_SOURCES)
5173 # -----------------------------
5174 # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in
5175 # This functions returns the first *.in file for which a *.am exists.
5176 # It returns undef otherwise.
5177 sub locate_am
5179   my (@rest) = @_;
5180   my $input;
5181   foreach my $file (@rest)
5182     {
5183       if (($file =~ /^(.*)\.in$/) && -f "$1.am")
5184         {
5185           $input = $file;
5186           last;
5187         }
5188     }
5189   return $input;
5192 my %make_list;
5194 # scan_autoconf_config_files ($WHERE, $CONFIG-FILES)
5195 # --------------------------------------------------
5196 # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
5197 # (or AC_OUTPUT).
5198 sub scan_autoconf_config_files
5200   my ($where, $config_files) = @_;
5202   # Look at potential Makefile.am's.
5203   foreach (split ' ', $config_files)
5204     {
5205       # Must skip empty string for Perl 4.
5206       next if $_ eq "\\" || $_ eq '';
5208       # Handle $local:$input syntax.
5209       my ($local, @rest) = split (/:/);
5210       @rest = ("$local.in",) unless @rest;
5211       # Keep in sync with test 'conffile-leading-dot.sh'.
5212       msg ('unsupported', $where,
5213            "omit leading './' from config file names such as '$local';"
5214            . "\nremake rules might be subtly broken otherwise")
5215         if ($local =~ /^\.\//);
5216       my $input = locate_am @rest;
5217       if ($input)
5218         {
5219           # We have a file that automake should generate.
5220           $make_list{$input} = join (':', ($local, @rest));
5221         }
5222       else
5223         {
5224           # We have a file that automake should cause to be
5225           # rebuilt, but shouldn't generate itself.
5226           push (@other_input_files, $_);
5227         }
5228       $ac_config_files_location{$local} = $where;
5229       $ac_config_files_condition{$local} =
5230         new Automake::Condition (@cond_stack)
5231           if (@cond_stack);
5232     }
5236 sub scan_autoconf_traces
5238   my ($filename) = @_;
5240   # Macros to trace, with their minimal number of arguments.
5241   #
5242   # IMPORTANT: If you add a macro here, you should also add this macro
5243   # =========  to Automake-preselection in autoconf/lib/autom4te.in.
5244   my %traced = (
5245                 AC_CANONICAL_BUILD => 0,
5246                 AC_CANONICAL_HOST => 0,
5247                 AC_CANONICAL_TARGET => 0,
5248                 AC_CONFIG_AUX_DIR => 1,
5249                 AC_CONFIG_FILES => 1,
5250                 AC_CONFIG_HEADERS => 1,
5251                 AC_CONFIG_LIBOBJ_DIR => 1,
5252                 AC_CONFIG_LINKS => 1,
5253                 AC_FC_SRCEXT => 1,
5254                 AC_INIT => 0,
5255                 AC_LIBSOURCE => 1,
5256                 AC_REQUIRE_AUX_FILE => 1,
5257                 AC_SUBST_TRACE => 1,
5258                 AM_AUTOMAKE_VERSION => 1,
5259                 AM_PROG_MKDIR_P => 0,
5260                 AM_CONDITIONAL => 2,
5261                 AM_EXTRA_RECURSIVE_TARGETS => 1,
5262                 AM_GNU_GETTEXT => 0,
5263                 AM_GNU_GETTEXT_INTL_SUBDIR => 0,
5264                 AM_INIT_AUTOMAKE => 0,
5265                 AM_MAINTAINER_MODE => 0,
5266                 AM_PROG_AR => 0,
5267                 _AM_SUBST_NOTMAKE => 1,
5268                 _AM_COND_IF => 1,
5269                 _AM_COND_ELSE => 1,
5270                 _AM_COND_ENDIF => 1,
5271                 LT_SUPPORTED_TAG => 1,
5272                 _LT_AC_TAGCONFIG => 0,
5273                 m4_include => 1,
5274                 m4_sinclude => 1,
5275                 sinclude => 1,
5276               );
5278   # Suppress all warnings from this invocation of autoconf.
5279   # The user is presumably about to run autoconf themselves
5280   # and will see its warnings then.
5281   local $ENV{WARNINGS} = 'none';
5283   my $traces = ($ENV{AUTOCONF} || '@am_AUTOCONF@') . " ";
5285   # Use a separator unlikely to be used, not ':', the default, which
5286   # has a precise meaning for AC_CONFIG_FILES and so on.
5287   $traces .= join (' ',
5288                    map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' }
5289                    (sort keys %traced));
5291   verb "running WARNINGS=$ENV{WARNINGS} $traces";
5292   my $tracefh = new Automake::XFile ("$traces $filename |");
5294   @cond_stack = ();
5295   my $where;
5297   while ($_ = $tracefh->getline)
5298     {
5299       chomp;
5300       my ($here, $depth, @args) = split (/::/);
5301       $where = new Automake::Location $here;
5302       my $macro = $args[0];
5304       prog_error ("unrequested trace '$macro'")
5305         unless exists $traced{$macro};
5307       # Skip and diagnose malformed calls.
5308       if ($#args < $traced{$macro})
5309         {
5310           msg ('syntax', $where, "not enough arguments for $macro");
5311           next;
5312         }
5314       # Alphabetical ordering please.
5315       if ($macro eq 'AC_CANONICAL_BUILD')
5316         {
5317           if ($seen_canonical <= AC_CANONICAL_BUILD)
5318             {
5319               $seen_canonical = AC_CANONICAL_BUILD;
5320             }
5321         }
5322       elsif ($macro eq 'AC_CANONICAL_HOST')
5323         {
5324           if ($seen_canonical <= AC_CANONICAL_HOST)
5325             {
5326               $seen_canonical = AC_CANONICAL_HOST;
5327             }
5328         }
5329       elsif ($macro eq 'AC_CANONICAL_TARGET')
5330         {
5331           $seen_canonical = AC_CANONICAL_TARGET;
5332         }
5333       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
5334         {
5335           if ($seen_init_automake)
5336             {
5337               error ($where, "AC_CONFIG_AUX_DIR must be called before "
5338                      . "AM_INIT_AUTOMAKE ...", partial => 1);
5339               error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here");
5340             }
5341           $config_aux_dir = $args[1];
5342           $config_aux_dir_set_in_configure_ac = 1;
5343           check_directory ($config_aux_dir, $where);
5344         }
5345       elsif ($macro eq 'AC_CONFIG_FILES')
5346         {
5347           # Look at potential Makefile.am's.
5348           scan_autoconf_config_files ($where, $args[1]);
5349         }
5350       elsif ($macro eq 'AC_CONFIG_HEADERS')
5351         {
5352           foreach my $spec (split (' ', $args[1]))
5353             {
5354               my ($dest, @src) = split (':', $spec);
5355               $ac_config_files_location{$dest} = $where;
5356               push @config_headers, $spec;
5357             }
5358         }
5359       elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR')
5360         {
5361           $config_libobj_dir = $args[1];
5362           check_directory ($config_libobj_dir, $where);
5363         }
5364       elsif ($macro eq 'AC_CONFIG_LINKS')
5365         {
5366           foreach my $spec (split (' ', $args[1]))
5367             {
5368               my ($dest, $src) = split (':', $spec);
5369               $ac_config_files_location{$dest} = $where;
5370               push @config_links, $spec;
5371             }
5372         }
5373       elsif ($macro eq 'AC_FC_SRCEXT')
5374         {
5375           my $suffix = $args[1];
5376           # These flags are used as %SOURCEFLAG% in depend2.am,
5377           # where the trailing space is important.
5378           $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') '
5379             if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08');
5380         }
5381       elsif ($macro eq 'AC_INIT')
5382         {
5383           if (defined $args[2])
5384             {
5385               $package_version = $args[2];
5386               $package_version_location = $where;
5387             }
5388         }
5389       elsif ($macro eq 'AC_LIBSOURCE')
5390         {
5391           $libsources{$args[1]} = $here;
5392         }
5393       elsif ($macro eq 'AC_REQUIRE_AUX_FILE')
5394         {
5395           # Only remember the first time a file is required.
5396           $required_aux_file{$args[1]} = $where
5397             unless exists $required_aux_file{$args[1]};
5398         }
5399       elsif ($macro eq 'AC_SUBST_TRACE')
5400         {
5401           # Just check for alphanumeric in AC_SUBST_TRACE.  If you do
5402           # AC_SUBST(5), then too bad.
5403           $configure_vars{$args[1]} = $where
5404             if $args[1] =~ /^\w+$/;
5405         }
5406       elsif ($macro eq 'AM_AUTOMAKE_VERSION')
5407         {
5408           error ($where,
5409                  "version mismatch.  This is Automake $VERSION,\n" .
5410                  "but the definition used by this AM_INIT_AUTOMAKE\n" .
5411                  "comes from Automake $args[1].  You should recreate\n" .
5412                  "aclocal.m4 with aclocal and run automake again.\n",
5413                  # $? = 63 is used to indicate version mismatch to missing.
5414                  exit_code => 63)
5415             if $VERSION ne $args[1];
5417           $seen_automake_version = 1;
5418         }
5419       elsif ($macro eq 'AM_PROG_MKDIR_P')
5420         {
5421           msg 'obsolete', $where, <<'EOF';
5422 The 'AM_PROG_MKDIR_P' macro is deprecated, and its use is discouraged.
5423 You should use the Autoconf-provided 'AC_PROG_MKDIR_P' macro instead,
5424 and use '$(MKDIR_P)' instead of '$(mkdir_p)'in your Makefile.am files.
5426         }
5427       elsif ($macro eq 'AM_CONDITIONAL')
5428         {
5429           $configure_cond{$args[1]} = $where;
5430         }
5431       elsif ($macro eq 'AM_EXTRA_RECURSIVE_TARGETS')
5432         {
5433           # Empty leading/trailing fields might be produced by split,
5434           # hence the grep is really needed.
5435           push @extra_recursive_targets,
5436                grep (/./, (split /\s+/, $args[1]));
5437         }
5438       elsif ($macro eq 'AM_GNU_GETTEXT')
5439         {
5440           $seen_gettext = $where;
5441           $ac_gettext_location = $where;
5442           $seen_gettext_external = grep ($_ eq 'external', @args);
5443         }
5444       elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR')
5445         {
5446           $seen_gettext_intl = $where;
5447         }
5448       elsif ($macro eq 'AM_INIT_AUTOMAKE')
5449         {
5450           $seen_init_automake = $where;
5451           if (defined $args[2])
5452             {
5453               msg 'obsolete', $where, <<'EOF';
5454 AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
5455 https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
5457               $package_version = $args[2];
5458               $package_version_location = $where;
5459             }
5460           elsif (defined $args[1])
5461             {
5462               my @opts = split (' ', $args[1]);
5463               @opts = map { { option => $_, where => $where } } @opts;
5464               exit $exit_code unless process_global_option_list (@opts);
5465             }
5466         }
5467       elsif ($macro eq 'AM_MAINTAINER_MODE')
5468         {
5469           $seen_maint_mode = $where;
5470         }
5471       elsif ($macro eq 'AM_PROG_AR')
5472         {
5473           $seen_ar = $where;
5474         }
5475       elsif ($macro eq '_AM_COND_IF')
5476         {
5477           cond_stack_if ('', $args[1], $where);
5478           error ($where, "missing m4 quoting, macro depth $depth")
5479             if ($depth != 1);
5480         }
5481       elsif ($macro eq '_AM_COND_ELSE')
5482         {
5483           cond_stack_else ('!', $args[1], $where);
5484           error ($where, "missing m4 quoting, macro depth $depth")
5485             if ($depth != 1);
5486         }
5487       elsif ($macro eq '_AM_COND_ENDIF')
5488         {
5489           cond_stack_endif (undef, undef, $where);
5490           error ($where, "missing m4 quoting, macro depth $depth")
5491             if ($depth != 1);
5492         }
5493       elsif ($macro eq '_AM_SUBST_NOTMAKE')
5494         {
5495           $ignored_configure_vars{$args[1]} = $where;
5496         }
5497       elsif ($macro eq 'm4_include'
5498              || $macro eq 'm4_sinclude'
5499              || $macro eq 'sinclude')
5500         {
5501           # Skip missing 'sinclude'd files.
5502           next if $macro ne 'm4_include' && ! -f $args[1];
5504           # Some modified versions of Autoconf don't use
5505           # frozen files.  Consequently it's possible that we see all
5506           # m4_include's performed during Autoconf's startup.
5507           # Obviously we don't want to distribute Autoconf's files
5508           # so we skip absolute filenames here.
5509           push @configure_deps, '$(top_srcdir)/' . $args[1]
5510             unless $here =~ m,^(?:\w:)?[\\/],;
5511           # Keep track of the greatest timestamp.
5512           if (-e $args[1])
5513             {
5514               my $mtime = mtime $args[1];
5515               $configure_deps_greatest_timestamp = $mtime
5516                 if $mtime > $configure_deps_greatest_timestamp;
5517             }
5518         }
5519       elsif ($macro eq 'LT_SUPPORTED_TAG')
5520         {
5521           $libtool_tags{$args[1]} = 1;
5522           $libtool_new_api = 1;
5523         }
5524       elsif ($macro eq '_LT_AC_TAGCONFIG')
5525         {
5526           # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5.
5527           # We use it to detect whether tags are supported.  Our
5528           # preferred interface is LT_SUPPORTED_TAG, but it was
5529           # introduced in Libtool 1.6.
5530           if (0 == keys %libtool_tags)
5531             {
5532               # Hardcode the tags supported by Libtool 1.5.
5533               %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1);
5534             }
5535         }
5536     }
5538   error ($where, "condition stack not properly closed")
5539     if (@cond_stack);
5541   $tracefh->close;
5545 # Check whether we use 'configure.ac' or 'configure.in'.
5546 # Scan it (and possibly 'aclocal.m4') for interesting things.
5547 # We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
5548 sub scan_autoconf_files ()
5550   # Reinitialize libsources here.  This isn't really necessary,
5551   # since we currently assume there is only one configure.ac.  But
5552   # that won't always be the case.
5553   %libsources = ();
5555   # Keep track of the youngest configure dependency.
5556   $configure_deps_greatest_timestamp = mtime $configure_ac;
5557   if (-e 'aclocal.m4')
5558     {
5559       my $mtime = mtime 'aclocal.m4';
5560       $configure_deps_greatest_timestamp = $mtime
5561         if $mtime > $configure_deps_greatest_timestamp;
5562     }
5564   scan_autoconf_traces ($configure_ac);
5566   @configure_input_files = sort keys %make_list;
5567   # Set input and output files if not specified by user.
5568   if (! @input_files)
5569     {
5570       @input_files = @configure_input_files;
5571       %output_files = %make_list;
5572     }
5575   if (! $seen_init_automake)
5576     {
5577       err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou "
5578               . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE,"
5579               . "\nthat aclocal.m4 is present in the top-level directory,\n"
5580               . "and that aclocal.m4 was recently regenerated "
5581               . "(using aclocal)");
5582     }
5583   else
5584     {
5585       if (! $seen_automake_version)
5586         {
5587           if (-f 'aclocal.m4')
5588             {
5589               error ($seen_init_automake,
5590                      "your implementation of AM_INIT_AUTOMAKE comes from " .
5591                      "an\nold Automake version.  You should recreate " .
5592                      "aclocal.m4\nwith aclocal and run automake again",
5593                      # $? = 63 is used to indicate version mismatch to missing.
5594                      exit_code => 63);
5595             }
5596           else
5597             {
5598               error ($seen_init_automake,
5599                      "no proper implementation of AM_INIT_AUTOMAKE was " .
5600                      "found,\nprobably because aclocal.m4 is missing.\n" .
5601                      "You should run aclocal to create this file, then\n" .
5602                      "run automake again");
5603             }
5604         }
5605     }
5607   locate_aux_dir ();
5609   # Look for some files we need.  Always check for these.  This
5610   # check must be done for every run, even those where we are only
5611   # looking at a subdir Makefile.  We must set relative_dir for
5612   # push_required_file to work.
5613   # Sort the files for stable verbose output.
5614   $relative_dir = '.';
5615   foreach my $file (sort keys %required_aux_file)
5616     {
5617       require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file)
5618     }
5619   err_am "'install.sh' is an anachronism; use 'install-sh' instead"
5620     if -f $config_aux_dir . '/install.sh';
5622   # Preserve dist_common for later.
5623   @configure_dist_common = @dist_common;
5626 ################################################################
5628 # Do any extra checking for GNU standards.
5629 sub check_gnu_standards ()
5631   if ($relative_dir eq '.')
5632     {
5633       # In top level (or only) directory.
5635       foreach my $file (@toplevelmd_ok)
5636         {
5637           next if $file eq 'THANKS'; # gnits, checked below
5638           # if non-.md is absent, and .md is present, require .md;
5639           # otherwise require non-.md.
5640           my $required
5641            = (! -f $file && -f "$file.md") ? "$file.md" : $file;
5642           require_file ("$am_file.am", GNU, $required);
5643         }
5645       # Accept one of these three licenses; default to COPYING.
5646       # Make sure we do not overwrite an existing license.
5647       my $license;
5648       foreach (qw /COPYING COPYING.LIB COPYING.LESSER/)
5649         {
5650           if (-f $_)
5651             {
5652               $license = $_;
5653               last;
5654             }
5655         }
5656       require_file ("$am_file.am", GNU, 'COPYING')
5657         unless $license;
5658     }
5660   for my $opt ('no-installman', 'no-installinfo')
5661     {
5662       msg ('error-gnu', option $opt,
5663            "option '$opt' disallowed by GNU standards")
5664         if option $opt;
5665     }
5668 # Do any extra checking for GNITS standards.
5669 sub check_gnits_standards ()
5671   if ($relative_dir eq '.')
5672     {
5673       # In top level (or only) directory.
5674       my $file = 'THANKS';
5675       my $required
5676        = (! -f $file && -f "$file.md") ? "$file.md" : $file;
5677       require_file ("$am_file.am", GNITS, $file);
5678     }
5681 ################################################################
5683 # Functions to handle files of each language.
5685 # Each 'lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
5686 # simple formula: Return value is LANG_SUBDIR if the resulting object
5687 # file should be in a subdir if the source file is, LANG_PROCESS if
5688 # file is to be dealt with, LANG_IGNORE otherwise.
5690 # Much of the actual processing is handled in
5691 # handle_single_transform.  These functions exist so that
5692 # auxiliary information can be recorded for a later cleanup pass.
5693 # Note that the calls to these functions are computed, so don't bother
5694 # searching for their precise names in the source.
5696 # This is just a convenience function that can be used to determine
5697 # when a subdir object should be used.
5698 sub lang_sub_obj ()
5700     return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS;
5703 # Rewrite a single header file.
5704 sub lang_header_rewrite
5706     # Header files are simply ignored.
5707     return LANG_IGNORE;
5710 # Rewrite a single Vala source file.
5711 sub lang_vala_rewrite
5713     my ($directory, $base, $ext) = @_;
5715     (my $newext = $ext) =~ s/vala$/c/;
5716     return (LANG_SUBDIR, $newext);
5719 # Rewrite a single yacc/yacc++ file.
5720 sub lang_yacc_rewrite
5722     my ($directory, $base, $ext) = @_;
5724     my $r = lang_sub_obj;
5725     (my $newext = $ext) =~ tr/y/c/;
5726     return ($r, $newext);
5728 sub lang_yaccxx_rewrite { lang_yacc_rewrite (@_); };
5730 # Rewrite a single lex/lex++ file.
5731 sub lang_lex_rewrite
5733     my ($directory, $base, $ext) = @_;
5735     my $r = lang_sub_obj;
5736     (my $newext = $ext) =~ tr/l/c/;
5737     return ($r, $newext);
5739 sub lang_lexxx_rewrite { lang_lex_rewrite (@_); };
5741 # Rewrite a single Java file.
5742 sub lang_java_rewrite
5744     return LANG_SUBDIR;
5747 # The lang_X_finish functions are called after all source file
5748 # processing is done.  Each should handle defining rules for the
5749 # language, etc.  A finish function is only called if a source file of
5750 # the appropriate type has been seen.
5752 sub lang_vala_finish_target
5754   my ($self, $name) = @_;
5756   my $derived = canonicalize ($name);
5757   my $var = var "${derived}_SOURCES";
5758   return unless $var;
5760   my @vala_sources = grep { /\.(vala|vapi)$/ } ($var->value_as_list_recursive);
5762   # For automake bug#11229.
5763   return unless @vala_sources;
5765   foreach my $vala_file (@vala_sources)
5766     {
5767       my $c_file = $vala_file;
5768       if ($c_file =~ s/(.*)\.vala$/$1.c/)
5769         {
5770           my $built_c_file = "\$(builddir)/$c_file";
5771           my $built_dir = dirname $built_c_file;
5772           my $base_c_file = basename $c_file;
5773           #
5774           # The -newer test here is checking "C file not older than Vala
5775           # file" (not "C file newer than Vala file"; see
5776           # https://bugs.gnu.org/44772. The log message on the commit
5777           # misleadingly says "reversed".
5778           #
5779           $output_rules .= "$built_c_file: \$(builddir)/${derived}_vala.stamp\n"
5780             . "\t\@if test ! -f \$@ && test \$(srcdir) != \$(builddir) && test -n \"\$\$(find -L \$(srcdir)/$vala_file -prune \! -newer \$(srcdir)/$c_file)\"; then cp -p \$(srcdir)/$c_file $built_c_file; fi\n"
5781             . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n"
5782             . "\t\@if test -f \$@; then :; else \\\n"
5783             . "\t  \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n"
5784             . "\t  if test $built_dir != .; then mv $base_c_file $built_dir/; fi \\\n"
5785             . "\tfi\n";
5786           $clean_files{$built_c_file} = DIST_CLEAN;
5787           $clean_files{"\$(srcdir)/$c_file"} = MAINTAINER_CLEAN;
5788         }
5789     }
5791   # Add rebuild rules for generated header and vapi files
5792   my $flags = var ($derived . '_VALAFLAGS');
5793   if ($flags)
5794     {
5795       my $lastflag = '';
5796       foreach my $flag ($flags->value_as_list_recursive)
5797         {
5798           if (grep (/^$lastflag$/, ('-H', '-h', '--header', '--internal-header',
5799                                     '--vapi', '--internal-vapi', '--gir')))
5800             {
5801               my $headerfile = "\$(builddir)/$flag";
5802               $output_rules .= "$headerfile: \$(builddir)/${derived}_vala.stamp\n"
5803                 . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n"
5804                 . "\t\@if test -f \$@; then :; else \\\n"
5805                 . "\t  \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n"
5806                 . "\tfi\n";
5808               # valac is not used when building from dist tarballs
5809               # distribute the generated files
5810               push_dist_common ($headerfile);
5811               $clean_files{$headerfile} = MAINTAINER_CLEAN;
5812             }
5813           if (grep (/$lastflag/, ('--library')))
5814             {
5815               my $headerfile = "\$(builddir)/$flag";
5816               $output_rules .= "$headerfile.vapi: \$(builddir)/${derived}_vala.stamp\n"
5817                 . "\t\@if test -f \$@; then :; else rm -f \$(builddir)/${derived}_vala.stamp; fi\n"
5818                 . "\t\@if test -f \$@; then :; else \\\n"
5819                 . "\t  \$(MAKE) \$(AM_MAKEFLAGS) \$(builddir)/${derived}_vala.stamp; \\\n"
5820                 . "\tfi\n";
5822               # valac is not used when building from dist tarballs
5823               # distribute the generated files
5824               my $vapi = "$headerfile.vapi";
5825               push_dist_common ($vapi);
5826               $clean_files{$headerfile.'.vapi'} = MAINTAINER_CLEAN;
5827             }
5828           $lastflag = $flag;
5829         }
5830     }
5832   my $compile = $self->compile;
5834   # Rewrite each occurrence of 'AM_VALAFLAGS' in the compile
5835   # rule into '${derived}_VALAFLAGS' if it exists.
5836   my $val = "${derived}_VALAFLAGS";
5837   $compile =~ s/\(AM_VALAFLAGS\)/\($val\)/
5838     if set_seen ($val);
5840   # VALAFLAGS is a user variable (per GNU Standards),
5841   # it should not be overridden in the Makefile...
5842   check_user_variables 'VALAFLAGS';
5844   my $dirname = dirname ($name);
5846   # Only generate C code, do not run C compiler
5847   $compile .= " -C";
5849   my $verbose = verbose_flag ('VALAC');
5850   my $silent = silent_flag ();
5851   my $stampfile = "\$(builddir)/${derived}_vala.stamp";
5853   $output_rules .=
5854     "\$(builddir)/${derived}_vala.stamp: @vala_sources\n".
5855 # Since the C files generated from the vala sources depend on the
5856 # ${derived}_vala.stamp file, we must ensure its timestamp is older than
5857 # those of the C files generated by the valac invocation below (this is
5858 # especially important on systems with sub-second timestamp resolution).
5859 # Thus we need to create the stamp file *before* invoking valac, and to
5860 # move it to its final location only after valac has been invoked.
5861     "\t${silent}rm -f \$\@ && echo stamp > \$\@-t\n".
5862     "\t${verbose}$compile \$^\n".
5863     "\t${silent}mv -f \$\@-t \$\@\n";
5865   push_dist_common ($stampfile);
5867   $clean_files{$stampfile} = MAINTAINER_CLEAN;
5870 # Add output rules to invoke valac and create stamp file as a witness
5871 # to handle multiple outputs. This function is called after all source
5872 # file processing is done.
5873 sub lang_vala_finish ()
5875   my ($self) = @_;
5877   foreach my $prog (sort keys %known_programs)
5878     {
5879       lang_vala_finish_target ($self, $prog);
5880     }
5882   while (my ($name) = each %known_libraries)
5883     {
5884       lang_vala_finish_target ($self, $name);
5885     }
5888 # The built .c files should be cleaned only on maintainer-clean
5889 # as the .c files are distributed. This function is called for each
5890 # .vala source file.
5891 sub lang_vala_target_hook
5893   my ($self, $aggregate, $output, $input, %transform) = @_;
5895   $clean_files{$output} = MAINTAINER_CLEAN;
5898 # This is a yacc helper which is called whenever we have decided to
5899 # compile a yacc file.
5900 sub lang_yacc_target_hook
5902     my ($self, $aggregate, $output, $input, %transform) = @_;
5904     # If some relevant *YFLAGS variable contains the '-d' flag, we'll
5905     # have to to generate special code.
5906     my $yflags_contains_minus_d = 0;
5908     foreach my $pfx ("", "${aggregate}_")
5909       {
5910         my $yflagsvar = var ("${pfx}YFLAGS");
5911         next unless $yflagsvar;
5912         # We cannot work reliably with conditionally-defined YFLAGS.
5913         if ($yflagsvar->has_conditional_contents)
5914           {
5915             msg_var ('unsupported', $yflagsvar,
5916                      "'${pfx}YFLAGS' cannot have conditional contents");
5917           }
5918         else
5919           {
5920             $yflags_contains_minus_d = 1
5921               if grep (/^-d$/, $yflagsvar->value_as_list_recursive);
5922           }
5923       }
5925     if ($yflags_contains_minus_d)
5926       {
5927         # Found a '-d' that applies to the compilation of this file.
5928         # Add a dependency for the generated header file, and arrange
5929         # for that file to be included in the distribution.
5931         # The extension of the output file (e.g., '.c' or '.cxx').
5932         # We'll need it to compute the name of the generated header file.
5933         (my $output_ext = basename ($output)) =~ s/.*(\.[^.]+)$/$1/;
5935         # We know that a yacc input should be turned into either a C or
5936         # C++ output file.  We depend on this fact (here and in yacc.am),
5937         # so check that it really holds.
5938         my $lang = $languages{$extension_map{$output_ext}};
5939         prog_error "invalid output name '$output' for yacc file '$input'"
5940           if (!$lang || ($lang->name ne 'c' && $lang->name ne 'cxx'));
5942         (my $header_ext = $output_ext) =~ s/c/h/g;
5943         # Quote $output_ext in the regexp, so that dots in it are taken
5944         # as literal dots, not as metacharacters.
5945         (my $header = $output) =~ s/\Q$output_ext\E$/$header_ext/;
5947         foreach my $cond (Automake::Rule::define (${header}, 'internal',
5948                                                   RULE_AUTOMAKE, TRUE,
5949                                                   INTERNAL))
5950           {
5951             my $condstr = $cond->subst_string;
5952             $output_rules .=
5953               "$condstr${header}: $output\n"
5954               # Recover from removal of $header
5955               . "$condstr\t\@if test ! -f \$@; then rm -f $output; else :; fi\n"
5956               . "$condstr\t\@if test ! -f \$@; then \$(MAKE) \$(AM_MAKEFLAGS) $output; else :; fi\n";
5957           }
5958         # Distribute the generated file, unless its .y source was
5959         # listed in a nodist_ variable.  (handle_source_transform()
5960         # will set DIST_SOURCE.)
5961         push_dist_common ($header)
5962           if $transform{'DIST_SOURCE'};
5964         # The GNU rules say that yacc/lex output files should be removed
5965         # by maintainer-clean.  However, if the files are not distributed,
5966         # then we want to remove them with "make clean"; otherwise,
5967         # "make distcheck" will fail.
5968         $clean_files{$header} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN;
5969       }
5970     # See the comment above for $HEADER.
5971     $clean_files{$output} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN;
5974 # This is a lex helper which is called whenever we have decided to
5975 # compile a lex file.
5976 sub lang_lex_target_hook
5978     my ($self, $aggregate, $output, $input, %transform) = @_;
5979     # The GNU rules say that yacc/lex output files should be removed
5980     # by maintainer-clean.  However, if the files are not distributed,
5981     # then we want to remove them with "make clean"; otherwise,
5982     # "make distcheck" will fail.
5983     $clean_files{$output} = $transform{'DIST_SOURCE'} ? MAINTAINER_CLEAN : CLEAN;
5986 # This is a helper for both lex and yacc.
5987 sub yacc_lex_finish_helper ()
5989   return if defined $language_scratch{'lex-yacc-done'};
5990   $language_scratch{'lex-yacc-done'} = 1;
5992   # FIXME: for now, no line number.
5993   require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
5994   define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
5997 sub lang_yacc_finish ()
5999   return if defined $language_scratch{'yacc-done'};
6000   $language_scratch{'yacc-done'} = 1;
6002   reject_var 'YACCFLAGS', "'YACCFLAGS' obsolete; use 'YFLAGS' instead";
6004   yacc_lex_finish_helper;
6008 sub lang_lex_finish ()
6010   return if defined $language_scratch{'lex-done'};
6011   $language_scratch{'lex-done'} = 1;
6013   yacc_lex_finish_helper;
6017 # Given a hash table of linker names, pick the name that has the most
6018 # precedence.  This is lame, but something has to have global
6019 # knowledge in order to eliminate the conflict.  Add more linkers as
6020 # required.
6021 sub resolve_linker
6023     my (%linkers) = @_;
6025     foreach my $l (qw(GCJLINK OBJCXXLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK))
6026     {
6027         return $l if defined $linkers{$l};
6028     }
6029     return 'LINK';
6032 # Called to indicate that an extension was used.
6033 sub saw_extension
6035     my ($ext) = @_;
6036     $extension_seen{$ext} = 1;
6039 # register_language (%ATTRIBUTE)
6040 # ------------------------------
6041 # Register a single language.
6042 # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
6043 sub register_language
6045   my (%option) = @_;
6047   # Set the defaults.
6048   $option{'autodep'} = 'no'
6049     unless defined $option{'autodep'};
6050   $option{'linker'} = ''
6051     unless defined $option{'linker'};
6052   $option{'flags'} = []
6053     unless defined $option{'flags'};
6054   $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) }
6055     unless defined $option{'output_extensions'};
6056   $option{'nodist_specific'} = 0
6057     unless defined $option{'nodist_specific'};
6059   my $lang = new Automake::Language (%option);
6061   # Fill indexes.
6062   $extension_map{$_} = $lang->name foreach @{$lang->extensions};
6063   $languages{$lang->name} = $lang;
6064   my $link = $lang->linker;
6065   if ($link)
6066     {
6067       if (exists $link_languages{$link})
6068         {
6069           prog_error ("'$link' has different definitions in "
6070                       . $lang->name . " and " . $link_languages{$link}->name)
6071             if $lang->link ne $link_languages{$link}->link;
6072         }
6073       else
6074         {
6075           $link_languages{$link} = $lang;
6076         }
6077     }
6079   # Update the pattern of known extensions.
6080   accept_extensions (@{$lang->extensions});
6082   # Update the suffix rules map.
6083   foreach my $suffix (@{$lang->extensions})
6084     {
6085       foreach my $dest ($lang->output_extensions->($suffix))
6086         {
6087           register_suffix_rule (INTERNAL, $suffix, $dest);
6088         }
6089     }
6092 # derive_suffix ($EXT, $OBJ)
6093 # --------------------------
6094 # This function is used to find a path from a user-specified suffix $EXT
6095 # to $OBJ or to some other suffix we recognize internally, e.g. 'cc'.
6096 sub derive_suffix
6098   my ($source_ext, $obj) = @_;
6100   while (!$extension_map{$source_ext} && $source_ext ne $obj)
6101     {
6102       my $new_source_ext = next_in_suffix_chain ($source_ext, $obj);
6103       last if not defined $new_source_ext;
6104       $source_ext = $new_source_ext;
6105     }
6107   return $source_ext;
6111 # Pretty-print something and append to '$output_rules'.
6112 sub pretty_print_rule
6114     $output_rules .= makefile_wrap (shift, shift, @_);
6118 ################################################################
6121 ## -------------------------------- ##
6122 ## Handling the conditional stack.  ##
6123 ## -------------------------------- ##
6126 # $STRING
6127 # make_conditional_string ($NEGATE, $COND)
6128 # ----------------------------------------
6129 sub make_conditional_string
6131   my ($negate, $cond) = @_;
6132   $cond = "${cond}_TRUE"
6133     unless $cond =~ /^TRUE|FALSE$/;
6134   $cond = Automake::Condition::conditional_negate ($cond)
6135     if $negate;
6136   return $cond;
6140 my %_am_macro_for_cond =
6141   (
6142   AMDEP => "one of the compiler tests\n"
6143            . "    AC_PROG_CC, AC_PROG_CXX, AC_PROG_OBJC, AC_PROG_OBJCXX,\n"
6144            . "    AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC",
6145   am__fastdepCC => 'AC_PROG_CC',
6146   am__fastdepCCAS => 'AM_PROG_AS',
6147   am__fastdepCXX => 'AC_PROG_CXX',
6148   am__fastdepGCJ => 'AM_PROG_GCJ',
6149   am__fastdepOBJC => 'AC_PROG_OBJC',
6150   am__fastdepOBJCXX => 'AC_PROG_OBJCXX',
6151   am__fastdepUPC => 'AM_PROG_UPC'
6152   );
6154 # $COND
6155 # cond_stack_if ($NEGATE, $COND, $WHERE)
6156 # --------------------------------------
6157 sub cond_stack_if
6159   my ($negate, $cond, $where) = @_;
6161   if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/)
6162     {
6163       my $text = "$cond does not appear in AM_CONDITIONAL";
6164       my $scope = US_LOCAL;
6165       if (exists $_am_macro_for_cond{$cond})
6166         {
6167           my $mac = $_am_macro_for_cond{$cond};
6168           $text .= "\n  The usual way to define '$cond' is to add ";
6169           $text .= ($mac =~ / /) ? $mac : "'$mac'";
6170           $text .= "\n  to '$configure_ac' and run 'aclocal' and 'autoconf' again";
6171           # These warnings appear in Automake files (depend2.am),
6172           # so there is no need to display them more than once:
6173           $scope = US_GLOBAL;
6174         }
6175       error $where, $text, uniq_scope => $scope;
6176     }
6178   push (@cond_stack, make_conditional_string ($negate, $cond));
6180   return new Automake::Condition (@cond_stack);
6184 # $COND
6185 # cond_stack_else ($NEGATE, $COND, $WHERE)
6186 # ----------------------------------------
6187 sub cond_stack_else
6189   my ($negate, $cond, $where) = @_;
6191   if (! @cond_stack)
6192     {
6193       error $where, "else without if";
6194       return FALSE;
6195     }
6197   $cond_stack[$#cond_stack] =
6198     Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]);
6200   # If $COND is given, check against it.
6201   if (defined $cond)
6202     {
6203       $cond = make_conditional_string ($negate, $cond);
6205       error ($where, "else reminder ($negate$cond) incompatible with "
6206              . "current conditional: $cond_stack[$#cond_stack]")
6207         if $cond_stack[$#cond_stack] ne $cond;
6208     }
6210   return new Automake::Condition (@cond_stack);
6214 # $COND
6215 # cond_stack_endif ($NEGATE, $COND, $WHERE)
6216 # -----------------------------------------
6217 sub cond_stack_endif
6219   my ($negate, $cond, $where) = @_;
6220   my $old_cond;
6222   if (! @cond_stack)
6223     {
6224       error $where, "endif without if";
6225       return TRUE;
6226     }
6228   # If $COND is given, check against it.
6229   if (defined $cond)
6230     {
6231       $cond = make_conditional_string ($negate, $cond);
6233       error ($where, "endif reminder ($negate$cond) incompatible with "
6234              . "current conditional: $cond_stack[$#cond_stack]")
6235         if $cond_stack[$#cond_stack] ne $cond;
6236     }
6238   pop @cond_stack;
6240   return new Automake::Condition (@cond_stack);
6247 ## ------------------------ ##
6248 ## Handling the variables.  ##
6249 ## ------------------------ ##
6252 # define_pretty_variable ($VAR, $COND, $WHERE, @VALUE)
6253 # ----------------------------------------------------
6254 # Like define_variable, but the value is a list, and the variable may
6255 # be defined conditionally.  The second argument is the condition
6256 # under which the value should be defined; this should be the empty
6257 # string to define the variable unconditionally.  The third argument
6258 # is a list holding the values to use for the variable.  The value is
6259 # pretty printed in the output file.
6260 sub define_pretty_variable
6262     my ($var, $cond, $where, @value) = @_;
6264     if (! vardef ($var, $cond))
6265     {
6266         Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value",
6267                                     '', $where, VAR_PRETTY);
6268         rvar ($var)->rdef ($cond)->set_seen;
6269     }
6273 # define_variable ($VAR, $VALUE, $WHERE)
6274 # --------------------------------------
6275 # Define a new Automake Makefile variable VAR to VALUE, but only if
6276 # not already defined.
6277 sub define_variable
6279     my ($var, $value, $where) = @_;
6280     define_pretty_variable ($var, TRUE, $where, $value);
6284 # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE)
6285 # ------------------------------------------------------------
6286 # Define the $VAR which content is the list of file names composed of
6287 # a @BASENAME and the $EXTENSION.
6288 sub define_files_variable ($\@$$)
6290   my ($var, $basename, $extension, $where) = @_;
6291   define_variable ($var,
6292                    join (' ', map { "$_.$extension" } @$basename),
6293                    $where);
6297 # Like define_variable, but define a variable to be the configure
6298 # substitution by the same name.
6299 sub define_configure_variable
6301   my ($var) = @_;
6302   # Some variables we do not want to output.  For instance it
6303   # would be a bad idea to output `U = @U@` when `@U@` can be
6304   # substituted as `\`.
6305   my $pretty = exists $ignored_configure_vars{$var} ? VAR_SILENT : VAR_ASIS;
6306   Automake::Variable::define ($var, VAR_CONFIGURE, '', TRUE, subst ($var),
6307                               '', $configure_vars{$var}, $pretty);
6311 # define_compiler_variable ($LANG)
6312 # --------------------------------
6313 # Define a compiler variable.  We also handle defining the 'LT'
6314 # version of the command when using libtool.
6315 sub define_compiler_variable
6317     my ($lang) = @_;
6319     my ($var, $value) = ($lang->compiler, $lang->compile);
6320     my $libtool_tag = '';
6321     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6322       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6323     define_variable ($var, $value, INTERNAL);
6324     if (var ('LIBTOOL'))
6325       {
6326         my $verbose = define_verbose_libtool ();
6327         define_variable ("LT$var",
6328                          "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS)"
6329                          . " \$(LIBTOOLFLAGS) --mode=compile $value",
6330                          INTERNAL);
6331       }
6332     define_verbose_tagvar ($lang->ccer || 'GEN');
6336 sub define_linker_variable
6338     my ($lang) = @_;
6340     my $libtool_tag = '';
6341     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6342       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6343     # CCLD = $(CC).
6344     define_variable ($lang->lder, $lang->ld, INTERNAL);
6345     # CCLINK = $(CCLD) blah blah...
6346     my $link = '';
6347     if (var ('LIBTOOL'))
6348       {
6349         my $verbose = define_verbose_libtool ();
6350         $link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) "
6351                 . "\$(LIBTOOLFLAGS) --mode=link ";
6352       }
6353     define_variable ($lang->linker, $link . $lang->link, INTERNAL);
6354     define_variable ($lang->compiler, $lang, INTERNAL);
6355     define_verbose_tagvar ($lang->lder || 'GEN');
6358 sub define_per_target_linker_variable
6360   my ($linker, $target) = @_;
6362   # If the user wrote a custom link command, we don't define ours.
6363   my $custom_link = "${target}_LINK";
6364   if (set_seen ($custom_link))
6365     {
6366       my $verbose = $custom_link if var (verbose_var ($custom_link));
6367       return ($custom_link, $verbose);
6368     }
6370   my $xlink = $linker ? $linker : 'LINK';
6372   my $lang = $link_languages{$xlink};
6373   prog_error "Unknown language for linker variable '$xlink'"
6374     unless $lang;
6376   my $link_command = $lang->link;
6377   if (var 'LIBTOOL')
6378     {
6379       my $libtool_tag = '';
6380       $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
6381         if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
6383       my $verbose = define_verbose_libtool ();
6384       $link_command =
6385         "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) "
6386         . "--mode=link " . $link_command;
6387     }
6389   # Rewrite each occurrence of 'AM_$flag' in the link
6390   # command into '${derived}_$flag' if it exists.
6391   my $orig_command = $link_command;
6392   my @flags = (@{$lang->flags}, 'LDFLAGS');
6393   push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL';
6394   for my $flag (@flags)
6395     {
6396       my $val = "${target}_$flag";
6397       $link_command =~ s/\(AM_$flag\)/\($val\)/
6398         if set_seen ($val);
6399     }
6401   # If the computed command is the same as the generic command, use
6402   # the command linker variable.
6403   return ($lang->linker, $lang->lder)
6404     if $link_command eq $orig_command;
6406   define_variable ("${target}_LINK", $link_command, INTERNAL);
6407   return ("${target}_LINK", $lang->lder);
6410 ################################################################
6412 # check_trailing_slash ($WHERE, $LINE)
6413 # ------------------------------------
6414 # Return 1 iff $LINE ends with a slash.
6415 # Might modify $LINE.
6416 sub check_trailing_slash ($\$)
6418   my ($where, $line) = @_;
6420   # Ignore '##' lines.
6421   return 0 if $$line =~ /$IGNORE_PATTERN/o;
6423   # Catch and fix a common error.
6424   msg "syntax", $where, "whitespace following trailing backslash"
6425     if $$line =~ s/\\\s+\n$/\\\n/;
6427   return $$line =~ /\\$/;
6431 # read_am_file ($AMFILE, $WHERE, $RELDIR)
6432 # ---------------------------------------
6433 # Read $AMFILE file name which is located in $RELDIR, and set up
6434 # global variables resetted by '&generate_makefile'.  Simultaneously
6435 # copy lines from $AMFILE into '$output_trailer', or define variables
6436 # as appropriate.
6438 # NOTE: We put rules in the trailer section.  We want user rules to
6439 # come after our generated stuff.
6440 sub read_am_file
6442     my ($amfile, $where, $reldir) = @_;
6443     my $canon_reldir = &canonicalize ($reldir);
6445     my $am_file = new Automake::XFile ("< $amfile");
6446     verb "reading $amfile";
6448     # Keep track of the youngest output dependency.
6449     my $mtime = mtime $amfile;
6450     $output_deps_greatest_timestamp = $mtime
6451       if $mtime > $output_deps_greatest_timestamp;
6453     my $spacing = '';
6454     my $comment = '';
6455     my $blank = 0;
6456     my $saw_bk = 0;
6457     my $var_look = VAR_ASIS;
6459     use constant IN_VAR_DEF => 0;
6460     use constant IN_RULE_DEF => 1;
6461     use constant IN_COMMENT => 2;
6462     my $prev_state = IN_RULE_DEF;
6464     while ($_ = $am_file->getline)
6465     {
6466         $where->set ("$amfile:$.");
6467         if (/$IGNORE_PATTERN/o)
6468         {
6469             # Merely delete comments beginning with two hashes.
6470         }
6471         elsif (/$WHITE_PATTERN/o)
6472         {
6473             error $where, "blank line following trailing backslash"
6474               if $saw_bk;
6475             # Stick a single white line before the incoming macro or rule.
6476             $spacing = "\n";
6477             $blank = 1;
6478             # Flush all comments seen so far.
6479             if ($comment ne '')
6480             {
6481                 $output_vars .= $comment;
6482                 $comment = '';
6483             }
6484         }
6485         elsif (/$COMMENT_PATTERN/o)
6486         {
6487             # Stick comments before the incoming macro or rule.  Make
6488             # sure a blank line precedes the first block of comments.
6489             $spacing = "\n" unless $blank;
6490             $blank = 1;
6491             $comment .= $spacing . $_;
6492             $spacing = '';
6493             $prev_state = IN_COMMENT;
6494         }
6495         else
6496         {
6497             last;
6498         }
6499         $saw_bk = check_trailing_slash ($where, $_);
6500     }
6502     # We save the conditional stack on entry, and then check to make
6503     # sure it is the same on exit.  This lets us conditionally include
6504     # other files.
6505     my @saved_cond_stack = @cond_stack;
6506     my $cond = new Automake::Condition (@cond_stack);
6508     my $last_var_name = '';
6509     my $last_var_type = '';
6510     my $last_var_value = '';
6511     my $last_where;
6512     # FIXME: shouldn't use $_ in this loop; it is too big.
6513     while ($_)
6514     {
6515         $where->set ("$amfile:$.");
6517         # Make sure the line is \n-terminated.
6518         chomp;
6519         $_ .= "\n";
6521         # Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
6522         # used by users.  @MAINT@ is an anachronism now.
6523         $_ =~ s/\@MAINT\@//g
6524             unless $seen_maint_mode;
6526         my $new_saw_bk = check_trailing_slash ($where, $_);
6528         if ($reldir eq '.')
6529           {
6530             # If present, eat the following '_' or '/', converting
6531             # "%reldir%/foo" and "%canon_reldir%_foo" into plain "foo"
6532             # when $reldir is '.'.
6533             $_ =~ s,%(D|reldir)%/,,g;
6534             $_ =~ s,%(C|canon_reldir)%_,,g;
6535           }
6536         $_ =~ s/%(D|reldir)%/${reldir}/g;
6537         $_ =~ s/%(C|canon_reldir)%/${canon_reldir}/g;
6539         if (/$IGNORE_PATTERN/o)
6540         {
6541             # Merely delete comments beginning with two hashes.
6543             # Keep any backslash from the previous line.
6544             $new_saw_bk = $saw_bk;
6545         }
6546         elsif (/$WHITE_PATTERN/o)
6547         {
6548             # Stick a single white line before the incoming macro or rule.
6549             $spacing = "\n";
6550             error $where, "blank line following trailing backslash"
6551               if $saw_bk;
6552         }
6553         elsif (/$COMMENT_PATTERN/o)
6554         {
6555             error $where, "comment following trailing backslash"
6556               if $saw_bk && $prev_state != IN_COMMENT;
6558             # Stick comments before the incoming macro or rule.
6559             $comment .= $spacing . $_;
6560             $spacing = '';
6561             $prev_state = IN_COMMENT;
6562         }
6563         elsif ($saw_bk)
6564         {
6565             if ($prev_state == IN_RULE_DEF)
6566             {
6567               my $cond = new Automake::Condition @cond_stack;
6568               $output_trailer .= $cond->subst_string;
6569               $output_trailer .= $_;
6570             }
6571             elsif ($prev_state == IN_COMMENT)
6572             {
6573                 # If the line doesn't start with a '#', add it.
6574                 # We do this because a continued comment like
6575                 #   # A = foo \
6576                 #         bar \
6577                 #         baz
6578                 # is not portable.  BSD make doesn't honor
6579                 # escaped newlines in comments.
6580                 s/^#?/#/;
6581                 $comment .= $spacing . $_;
6582             }
6583             else # $prev_state == IN_VAR_DEF
6584             {
6585               $last_var_value .= ' '
6586                 unless $last_var_value =~ /\s$/;
6587               $last_var_value .= $_;
6589               if (!/\\$/)
6590                 {
6591                   Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6592                                               $last_var_type, $cond,
6593                                               $last_var_value, $comment,
6594                                               $last_where, VAR_ASIS)
6595                     if $cond != FALSE;
6596                   $comment = $spacing = '';
6597                 }
6598             }
6599         }
6601         elsif (/$IF_PATTERN/o)
6602           {
6603             $cond = cond_stack_if ($1, $2, $where);
6604           }
6605         elsif (/$ELSE_PATTERN/o)
6606           {
6607             $cond = cond_stack_else ($1, $2, $where);
6608           }
6609         elsif (/$ENDIF_PATTERN/o)
6610           {
6611             $cond = cond_stack_endif ($1, $2, $where);
6612           }
6614         elsif (/$RULE_PATTERN/o)
6615         {
6616             # Found a rule.
6617             $prev_state = IN_RULE_DEF;
6619             # For now we have to output all definitions of user rules
6620             # and can't diagnose duplicates (see the comment in
6621             # Automake::Rule::define). So we go on and ignore the return value.
6622             Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where);
6624             check_variable_expansions ($_, $where);
6626             $output_trailer .= $comment . $spacing;
6627             my $cond = new Automake::Condition @cond_stack;
6628             $output_trailer .= $cond->subst_string;
6629             $output_trailer .= $_;
6630             $comment = $spacing = '';
6631         }
6632         elsif (/$ASSIGNMENT_PATTERN/o)
6633         {
6634             # Found a macro definition.
6635             $prev_state = IN_VAR_DEF;
6636             $last_var_name = $1;
6637             $last_var_type = $2;
6638             $last_var_value = $3;
6639             $last_where = $where->clone;
6640             if ($3 ne '' && substr ($3, -1) eq "\\")
6641               {
6642                 # We preserve the '\' because otherwise the long lines
6643                 # that are generated will be truncated by broken
6644                 # 'sed's.
6645                 $last_var_value = $3 . "\n";
6646               }
6647             # Normally we try to output variable definitions in the
6648             # same format they were input.  However, POSIX compliant
6649             # systems are not required to support lines longer than
6650             # 2048 bytes (most notably, some sed implementation are
6651             # limited to 4000 bytes, and sed is used by config.status
6652             # to rewrite Makefile.in into Makefile).  Moreover nobody
6653             # would really write such long lines by hand since it is
6654             # hardly maintainable.  So if a line is longer that 1000
6655             # bytes (an arbitrary limit), assume it has been
6656             # automatically generated by some tools, and flatten the
6657             # variable definition.  Otherwise, keep the variable as it
6658             # as been input.
6659             $var_look = VAR_PRETTY if length ($last_var_value) >= 1000;
6661             if (!/\\$/)
6662               {
6663                 Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6664                                             $last_var_type, $cond,
6665                                             $last_var_value, $comment,
6666                                             $last_where, $var_look)
6667                   if $cond != FALSE;
6668                 $comment = $spacing = '';
6669                 $var_look = VAR_ASIS;
6670               }
6671         }
6672         elsif (/$INCLUDE_PATTERN/o)
6673         {
6674             my $path = $1;
6676             if ($path =~ s/^\$\(top_srcdir\)\///)
6677               {
6678                 push (@include_stack, "\$\(top_srcdir\)/$path");
6679                 # Distribute any included file.
6681                 # Always use the $(top_srcdir) prefix in DIST_COMMON,
6682                 # otherwise OSF make will implicitly copy the included
6683                 # file in the build tree during "make distdir" to satisfy
6684                 # the dependency.
6685                 # (subdir-am-cond.sh and subdir-ac-cond.sh will fail)
6686                 push_dist_common ("\$\(top_srcdir\)/$path");
6687               }
6688             else
6689               {
6690                 $path =~ s/\$\(srcdir\)\///;
6691                 push (@include_stack, "\$\(srcdir\)/$path");
6692                 # Always use the $(srcdir) prefix in DIST_COMMON,
6693                 # otherwise OSF make will implicitly copy the included
6694                 # file in the build tree during "make distdir" to satisfy
6695                 # the dependency.
6696                 # (subdir-am-cond.sh and subdir-ac-cond.sh will fail)
6697                 push_dist_common ("\$\(srcdir\)/$path");
6698                 $path = $relative_dir . "/" . $path if $relative_dir ne '.';
6699               }
6700             my $new_reldir = File::Spec->abs2rel ($path, $relative_dir);
6701             $new_reldir = '.' if $new_reldir !~ s,/[^/]*$,,;
6702             $where->push_context ("'$path' included from here");
6703             read_am_file ($path, $where, $new_reldir);
6704             $where->pop_context;
6705         }
6706         else
6707         {
6708             # This isn't an error; it is probably a continued rule.
6709             # In fact, this is what we assume.
6710             $prev_state = IN_RULE_DEF;
6711             check_variable_expansions ($_, $where);
6712             $output_trailer .= $comment . $spacing;
6713             my $cond = new Automake::Condition @cond_stack;
6714             $output_trailer .= $cond->subst_string;
6715             $output_trailer .= $_;
6716             $comment = $spacing = '';
6717             error $where, "'#' comment at start of rule is unportable"
6718               if $_ =~ /^\t\s*\#/;
6719         }
6721         $saw_bk = $new_saw_bk;
6722         $_ = $am_file->getline;
6723     }
6725     $output_trailer .= $comment;
6727     error ($where, "trailing backslash on last line")
6728       if $saw_bk;
6730     error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack"
6731                     : "too many conditionals closed in include file"))
6732       if "@saved_cond_stack" ne "@cond_stack";
6736 # A helper for read_main_am_file which initializes configure variables
6737 # and variables from header-vars.am.
6738 sub define_standard_variables ()
6740   my $saved_output_vars = $output_vars;
6741   my ($comments, undef, $rules) =
6742     file_contents_internal (1, "$libdir/am/header-vars.am",
6743                             new Automake::Location);
6745   foreach my $var (sort keys %configure_vars)
6746     {
6747       define_configure_variable ($var);
6748     }
6750   $output_vars .= $comments . $rules;
6754 # read_main_am_file ($MAKEFILE_AM, $MAKEFILE_IN)
6755 # ----------------------------------------------
6756 sub read_main_am_file
6758     my ($amfile, $infile) = @_;
6760     # This supports the strange variable tricks we are about to play.
6761     prog_error ("variable defined before read_main_am_file\n" . variables_dump ())
6762       if (scalar (variables) > 0);
6764     # Generate copyright header for generated Makefile.in.
6765     # We do discard the output of predefined variables, handled below.
6766     $output_vars = ("# " . basename ($infile) . " generated by automake "
6767                    . $VERSION . " from " . basename ($amfile) . ".\n");
6768     $output_vars .= '# ' . subst ('configure_input') . "\n";
6769     $output_vars .= $gen_copyright;
6771     # We want to predefine as many variables as possible.  This lets
6772     # the user set them with '+=' in Makefile.am.
6773     define_standard_variables;
6775     # Read user file, which might override some of our values.
6776     read_am_file ($amfile, new Automake::Location, '.');
6781 ################################################################
6783 # $STRING
6784 # flatten ($ORIGINAL_STRING)
6785 # --------------------------
6786 sub flatten
6788   $_ = shift;
6790   s/\\\n//somg;
6791   s/\s+/ /g;
6792   s/^ //;
6793   s/ $//;
6795   return $_;
6799 # transform_token ($TOKEN, \%PAIRS, $KEY)
6800 # ---------------------------------------
6801 # Return the value associated to $KEY in %PAIRS, as used on $TOKEN
6802 # (which should be ?KEY? or any of the special %% requests)..
6803 sub transform_token ($\%$)
6805   my ($token, $transform, $key) = @_;
6806   my $res = $transform->{$key};
6807   prog_error "Unknown key '$key' in '$token'" unless defined $res;
6808   return $res;
6812 # transform ($TOKEN, \%PAIRS)
6813 # ---------------------------
6814 # If ($TOKEN, $VAL) is in %PAIRS:
6815 #   - replaces %KEY% with $VAL,
6816 #   - enables/disables ?KEY? and ?!KEY?,
6817 #   - replaces %?KEY% with TRUE or FALSE.
6818 sub transform ($\%)
6820   my ($token, $transform) = @_;
6822   # %KEY%.
6823   # Must be before the following pattern to exclude the case
6824   # when there is neither IFTRUE nor IFFALSE.
6825   if ($token =~ /^%([\w\-]+)%$/)
6826     {
6827       return transform_token ($token, %$transform, $1);
6828     }
6829   # %?KEY%.
6830   elsif ($token =~ /^%\?([\w\-]+)%$/)
6831     {
6832       return transform_token ($token, %$transform, $1) ? 'TRUE' : 'FALSE';
6833     }
6834   # ?KEY? and ?!KEY?.
6835   elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x)
6836     {
6837       my $neg = ($1 eq '!') ? 1 : 0;
6838       my $val = transform_token ($token, %$transform, $2);
6839       return (!!$val == $neg) ? '##%' : '';
6840     }
6841   else
6842     {
6843       prog_error "Unknown request format: $token";
6844     }
6847 # $TEXT
6848 # preprocess_file ($MAKEFILE, [%TRANSFORM])
6849 # -----------------------------------------
6850 # Load a $MAKEFILE, apply the %TRANSFORM, and return the result.
6851 # No extra parsing or post-processing is done (i.e., recognition of
6852 # rules declaration or of make variables definitions).
6853 sub preprocess_file
6855   my ($file, %transform) = @_;
6857   # Complete %transform with global options.
6858   # Note that %transform goes last, so it overrides global options.
6859   %transform = ( 'MAINTAINER-MODE'
6860                  => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',
6862                  'XZ'          => !! option 'dist-xz',
6863                  'LZIP'        => !! option 'dist-lzip',
6864                  'BZIP2'       => !! option 'dist-bzip2',
6865                  'COMPRESS'    => !! option 'dist-tarZ',
6866                  'GZIP'        =>  ! option 'no-dist-gzip',
6867                  'SHAR'        => !! option 'dist-shar',
6868                  'ZIP'         => !! option 'dist-zip',
6869                  'ZSTD'        => !! option 'dist-zstd',
6870                  'DIST_BUILT_SOURCES' => !! option 'dist-built-sources',
6872                  'INSTALL-INFO' =>  ! option 'no-installinfo',
6873                  'INSTALL-MAN'  =>  ! option 'no-installman',
6874                  'CK-NEWS'      => !! option 'check-news',
6876                  'SUBDIRS'      => !! var ('SUBDIRS'),
6877                  'TOPDIR_P'     => $relative_dir eq '.',
6879                  'BUILD'    => ($seen_canonical >= AC_CANONICAL_BUILD),
6880                  'HOST'     => ($seen_canonical >= AC_CANONICAL_HOST),
6881                  'TARGET'   => ($seen_canonical >= AC_CANONICAL_TARGET),
6883                  'LIBTOOL'      => !! var ('LIBTOOL'),
6884                  'NONLIBTOOL'   => 1,
6885                 %transform);
6887   if (! defined ($_ = $am_file_cache{$file}))
6888     {
6889       verb "reading $file";
6890       # Swallow the whole file.
6891       my $fc_file = new Automake::XFile "< $file";
6892       my $saved_dollar_slash = $/;
6893       undef $/;
6894       $_ = $fc_file->getline;
6895       $/ = $saved_dollar_slash;
6896       $fc_file->close;
6897       # Remove ##-comments.
6898       # Besides we don't need more than two consecutive new-lines.
6899       s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom;
6900       # Remember the contents of the just-read file.
6901       $am_file_cache{$file} = $_;
6902     }
6904   # Substitute Automake template tokens.
6905   s/(?: % \?? [\w\-]+ %
6906       | \? !? [\w\-]+ \?
6907     )/transform($&, %transform)/gex;
6908   # transform() may have added some ##%-comments to strip.
6909   # (we use '##%' instead of '##' so we can distinguish ##%##%##% from
6910   # ####### and do not remove the latter.)
6911   s/^[ \t]*(?:##%)+.*\n//gm;
6913   return $_;
6917 # @PARAGRAPHS
6918 # make_paragraphs ($MAKEFILE, [%TRANSFORM])
6919 # -----------------------------------------
6920 # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
6921 # paragraphs.
6922 sub make_paragraphs
6924   my ($file, %transform) = @_;
6925   $transform{FIRST} = !$transformed_files{$file};
6926   $transformed_files{$file} = 1;
6928   my @lines = split /(?<!\\)\n/, preprocess_file ($file, %transform);
6929   my @res;
6931   while (defined ($_ = shift @lines))
6932     {
6933       my $paragraph = $_;
6934       # If we are a rule, eat as long as we start with a tab.
6935       if (/$RULE_PATTERN/smo)
6936         {
6937           while (defined ($_ = shift @lines) && $_ =~ /^\t/)
6938             {
6939               $paragraph .= "\n$_";
6940             }
6941           unshift (@lines, $_);
6942         }
6944       # If we are a comments, eat as much comments as you can.
6945       elsif (/$COMMENT_PATTERN/smo)
6946         {
6947           while (defined ($_ = shift @lines)
6948                  && $_ =~ /$COMMENT_PATTERN/smo)
6949             {
6950               $paragraph .= "\n$_";
6951             }
6952           unshift (@lines, $_);
6953         }
6955       push @res, $paragraph;
6956     }
6958   return @res;
6963 # ($COMMENT, $VARIABLES, $RULES)
6964 # file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM])
6965 # ------------------------------------------------------------
6966 # Return contents of a file from $libdir/am, automatically skipping
6967 # macros or rules which are already known. $IS_AM iff the caller is
6968 # reading an Automake file (as opposed to the user's Makefile.am).
6969 sub file_contents_internal
6971     my ($is_am, $file, $where, %transform) = @_;
6973     $where->set ($file);
6975     my $result_vars = '';
6976     my $result_rules = '';
6977     my $comment = '';
6978     my $spacing = '';
6980     # The following flags are used to track rules spanning across
6981     # multiple paragraphs.
6982     my $is_rule = 0;            # 1 if we are processing a rule.
6983     my $discard_rule = 0;       # 1 if the current rule should not be output.
6985     # We save the conditional stack on entry, and then check to make
6986     # sure it is the same on exit.  This lets us conditionally include
6987     # other files.
6988     my @saved_cond_stack = @cond_stack;
6989     my $cond = new Automake::Condition (@cond_stack);
6991     foreach (make_paragraphs ($file, %transform))
6992     {
6993         # FIXME: no line number available.
6994         $where->set ($file);
6996         # Sanity checks.
6997         error $where, "blank line following trailing backslash:\n$_"
6998           if /\\$/;
6999         error $where, "comment following trailing backslash:\n$_"
7000           if /\\#/;
7002         if (/^$/)
7003         {
7004             $is_rule = 0;
7005             # Stick empty line before the incoming macro or rule.
7006             $spacing = "\n";
7007         }
7008         elsif (/$COMMENT_PATTERN/mso)
7009         {
7010             $is_rule = 0;
7011             # Stick comments before the incoming macro or rule.
7012             $comment = "$_\n";
7013         }
7015         # Handle inclusion of other files.
7016         elsif (/$INCLUDE_PATTERN/o)
7017         {
7018             if ($cond != FALSE)
7019               {
7020                 my $file = ($is_am ? "$libdir/am/" : '') . $1;
7021                 $where->push_context ("'$file' included from here");
7022                 # N-ary '.=' fails.
7023                 my ($com, $vars, $rules)
7024                   = file_contents_internal ($is_am, $file, $where, %transform);
7025                 $where->pop_context;
7026                 $comment .= $com;
7027                 $result_vars .= $vars;
7028                 $result_rules .= $rules;
7029               }
7030         }
7032         # Handling the conditionals.
7033         elsif (/$IF_PATTERN/o)
7034           {
7035             $cond = cond_stack_if ($1, $2, $file);
7036           }
7037         elsif (/$ELSE_PATTERN/o)
7038           {
7039             $cond = cond_stack_else ($1, $2, $file);
7040           }
7041         elsif (/$ENDIF_PATTERN/o)
7042           {
7043             $cond = cond_stack_endif ($1, $2, $file);
7044           }
7046         # Handling rules.
7047         elsif (/$RULE_PATTERN/mso)
7048         {
7049           $is_rule = 1;
7050           $discard_rule = 0;
7051           # Separate relationship from optional actions: the first
7052           # `new-line tab" not preceded by backslash (continuation
7053           # line).
7054           my $paragraph = $_;
7055           /^(.*?)(?:(?<!\\)\n(\t.*))?$/s;
7056           my ($relationship, $actions) = ($1, $2 || '');
7058           # Separate targets from dependencies: the first colon.
7059           $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
7060           my ($targets, $dependencies) = ($1, $2);
7061           # Remove the escaped new lines.
7062           # I don't know why, but I have to use a tmp $flat_deps.
7063           my $flat_deps = flatten ($dependencies);
7064           my @deps = split (' ', $flat_deps);
7066           foreach (split (' ', $targets))
7067             {
7068               # FIXME: 1. We are not robust to people defining several targets
7069               # at once, only some of them being in %dependencies.  The
7070               # actions from the targets in %dependencies are usually generated
7071               # from the content of %actions, but if some targets in $targets
7072               # are not in %dependencies the ELSE branch will output
7073               # a rule for all $targets (i.e. the targets which are both
7074               # in %dependencies and $targets will have two rules).
7076               # FIXME: 2. The logic here is not able to output a
7077               # multi-paragraph rule several time (e.g. for each condition
7078               # it is defined for) because it only knows the first paragraph.
7080               # FIXME: 3. We are not robust to people defining a subset
7081               # of a previously defined "multiple-target" rule.  E.g.
7082               # 'foo:' after 'foo bar:'.
7084               # Output only if not in FALSE.
7085               if (defined $dependencies{$_} && $cond != FALSE)
7086                 {
7087                   depend ($_, @deps);
7088                   register_action ($_, $actions);
7089                 }
7090               else
7091                 {
7092                   # Free-lance dependency.  Output the rule for all the
7093                   # targets instead of one by one.
7094                   my @undefined_conds =
7095                     Automake::Rule::define ($targets, $file,
7096                                             $is_am ? RULE_AUTOMAKE : RULE_USER,
7097                                             $cond, $where);
7098                   for my $undefined_cond (@undefined_conds)
7099                     {
7100                       my $condparagraph = $paragraph;
7101                       $condparagraph =~ s/^/$undefined_cond->subst_string/gme;
7102                       $result_rules .= "$spacing$comment$condparagraph\n";
7103                     }
7104                   if (scalar @undefined_conds == 0)
7105                     {
7106                       # Remember to discard next paragraphs
7107                       # if they belong to this rule.
7108                       # (but see also FIXME: #2 above.)
7109                       $discard_rule = 1;
7110                     }
7111                   $comment = $spacing = '';
7112                   last;
7113                 }
7114             }
7115         }
7117         elsif (/$ASSIGNMENT_PATTERN/mso)
7118         {
7119             my ($var, $type, $val) = ($1, $2, $3);
7120             error $where, "variable '$var' with trailing backslash"
7121               if /\\$/;
7123             $is_rule = 0;
7125             Automake::Variable::define ($var,
7126                                         $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE,
7127                                         $type, $cond, $val, $comment, $where,
7128                                         VAR_ASIS)
7129               if $cond != FALSE;
7131             $comment = $spacing = '';
7132         }
7133         else
7134         {
7135             # This isn't an error; it is probably some tokens which
7136             # configure is supposed to replace, such as '@SET-MAKE@',
7137             # or some part of a rule cut by an if/endif.
7138             if (! $cond->false && ! ($is_rule && $discard_rule))
7139               {
7140                 s/^/$cond->subst_string/gme;
7141                 $result_rules .= "$spacing$comment$_\n";
7142               }
7143             $comment = $spacing = '';
7144         }
7145     }
7147     error ($where, @cond_stack ?
7148            "unterminated conditionals: @cond_stack" :
7149            "too many conditionals closed in include file")
7150       if "@saved_cond_stack" ne "@cond_stack";
7152     return ($comment, $result_vars, $result_rules);
7156 # $CONTENTS
7157 # file_contents ($BASENAME, $WHERE, [%TRANSFORM])
7158 # -----------------------------------------------
7159 # Return contents of a file from $libdir/am, automatically skipping
7160 # macros or rules which are already known.
7161 sub file_contents
7163     my ($basename, $where, %transform) = @_;
7164     my ($comments, $variables, $rules) =
7165       file_contents_internal (1, "$libdir/am/$basename.am", $where,
7166                               %transform);
7167     return "$comments$variables$rules";
7171 # @PREFIX
7172 # am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)
7173 # ----------------------------------------------------
7174 # Find all variable prefixes that are used for install directories.  A
7175 # prefix 'zar' qualifies iff:
7177 # * 'zardir' is a variable.
7178 # * 'zar_PRIMARY' is a variable.
7180 # As a side effect, it looks for misspellings.  It is an error to have
7181 # a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
7182 # "bni_PROGRAMS".  However, unusual prefixes are allowed if a variable
7183 # of the same name (with "dir" appended) exists.  For instance, if the
7184 # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
7185 # This is to provide a little extra flexibility in those cases which
7186 # need it.
7187 sub am_primary_prefixes
7189   my ($primary, $can_dist, @prefixes) = @_;
7191   local $_;
7192   my %valid = map { $_ => 0 } @prefixes;
7193   $valid{'EXTRA'} = 0;
7194   foreach my $var (variables $primary)
7195     {
7196       # Automake is allowed to define variables that look like primaries
7197       # but which aren't.  E.g. INSTALL_sh_DATA.
7198       # Autoconf can also define variables like INSTALL_DATA, so
7199       # ignore all configure variables (at least those which are not
7200       # redefined in Makefile.am).
7201       # FIXME: We should make sure that these variables are not
7202       # conditionally defined (or else adjust the condition below).
7203       my $def = $var->def (TRUE);
7204       next if $def && $def->owner != VAR_MAKEFILE;
7206       my $varname = $var->name;
7208       if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
7209         {
7210           my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
7211           if ($dist ne '' && ! $can_dist)
7212             {
7213               err_var ($var,
7214                        "invalid variable '$varname': 'dist' is forbidden");
7215             }
7216           # Standard directories must be explicitly allowed.
7217           elsif (! defined $valid{$X} && exists $standard_prefix{$X})
7218             {
7219               err_var ($var,
7220                        "'${X}dir' is not a legitimate directory " .
7221                        "for '$primary'");
7222             }
7223           # A not explicitly valid directory is allowed if Xdir is defined.
7224           elsif (! defined $valid{$X} &&
7225                  $var->requires_variables ("'$varname' is used", "${X}dir"))
7226             {
7227               # Nothing to do.  Any error message has been output
7228               # by $var->requires_variables.
7229             }
7230           else
7231             {
7232               # Ensure all extended prefixes are actually used.
7233               $valid{"$base$dist$X"} = 1;
7234             }
7235         }
7236       else
7237         {
7238           prog_error "unexpected variable name: $varname";
7239         }
7240     }
7242   # Return only those which are actually defined.
7243   return sort grep { var ($_ . '_' . $primary) } keys %valid;
7247 # am_install_var (-OPTION..., file, HOW, where...)
7248 # ------------------------------------------------
7250 # Handle 'where_HOW' variable magic.  Does all lookups, generates
7251 # install code, and possibly generates code to define the primary
7252 # variable.  The first argument is the name of the .am file to munge,
7253 # the second argument is the primary variable (e.g. HEADERS), and all
7254 # subsequent arguments are possible installation locations.
7256 # Returns list of [$location, $value] pairs, where
7257 # $value's are the values in all where_HOW variable, and $location
7258 # there associated location (the place here their parent variables were
7259 # defined).
7261 # FIXME: this should be rewritten to be cleaner.  It should be broken
7262 # up into multiple functions.
7264 sub am_install_var
7266   my (@args) = @_;
7268   my $do_require = 1;
7269   my $can_dist = 0;
7270   my $default_dist = 0;
7271   while (@args)
7272     {
7273       if ($args[0] eq '-noextra')
7274         {
7275           $do_require = 0;
7276         }
7277       elsif ($args[0] eq '-candist')
7278         {
7279           $can_dist = 1;
7280         }
7281       elsif ($args[0] eq '-defaultdist')
7282         {
7283           $default_dist = 1;
7284           $can_dist = 1;
7285         }
7286       elsif ($args[0] !~ /^-/)
7287         {
7288           last;
7289         }
7290       shift (@args);
7291     }
7293   my ($file, $primary, @prefix) = @args;
7295   # Now that configure substitutions are allowed in where_HOW
7296   # variables, it is an error to actually define the primary.  We
7297   # allow 'JAVA', as it is customarily used to mean the Java
7298   # interpreter.  This is but one of several Java hacks.  Similarly,
7299   # 'PYTHON' is customarily used to mean the Python interpreter.
7300   reject_var $primary, "'$primary' is an anachronism"
7301     unless $primary eq 'JAVA' || $primary eq 'PYTHON';
7303   # Get the prefixes which are valid and actually used.
7304   @prefix = am_primary_prefixes ($primary, $can_dist, @prefix);
7306   # If a primary includes a configure substitution, then the EXTRA_
7307   # form is required.  Otherwise we can't properly do our job.
7308   my $require_extra;
7310   my @used = ();
7311   my @result = ();
7313   foreach my $X (@prefix)
7314     {
7315       my $nodir_name = $X;
7316       my $one_name = $X . '_' . $primary;
7317       my $one_var = var $one_name;
7319       my $strip_subdir = 1;
7320       # If subdir prefix should be preserved, do so.
7321       if ($nodir_name =~ /^nobase_/)
7322         {
7323           $strip_subdir = 0;
7324           $nodir_name =~ s/^nobase_//;
7325         }
7327       # If files should be distributed, do so.
7328       my $dist_p = 0;
7329       if ($can_dist)
7330         {
7331           $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
7332                      || (! $default_dist && $nodir_name =~ /^dist_/));
7333           $nodir_name =~ s/^(dist|nodist)_//;
7334         }
7337       # Use the location of the currently processed variable.
7338       # We are not processing a particular condition, so pick the first
7339       # available.
7340       my $tmpcond = $one_var->conditions->one_cond;
7341       my $where = $one_var->rdef ($tmpcond)->location->clone;
7343       # Append actual contents of where_PRIMARY variable to
7344       # @result, skipping @substitutions@.
7345       foreach my $locvals ($one_var->value_as_list_recursive (location => 1))
7346         {
7347           my ($loc, $value) = @$locvals;
7348           # Skip configure substitutions.
7349           if ($value =~ /^\@.*\@$/)
7350             {
7351               if ($nodir_name eq 'EXTRA')
7352                 {
7353                   error ($where,
7354                          "'$one_name' contains configure substitution, "
7355                          . "but shouldn't");
7356                 }
7357               # Check here to make sure variables defined in
7358               # configure.ac do not imply that EXTRA_PRIMARY
7359               # must be defined.
7360               elsif (! defined $configure_vars{$one_name})
7361                 {
7362                   $require_extra = $one_name
7363                     if $do_require;
7364                 }
7365             }
7366           else
7367             {
7368               # Strip any $(EXEEXT) suffix the user might have added,
7369               # or this will confuse handle_source_transform() and
7370               # check_canonical_spelling().
7371               # We'll add $(EXEEXT) back later anyway.
7372               # Do it here rather than in handle_programs so the
7373               # uniquifying at the end of this function works.
7374               ${$locvals}[1] =~ s/\$\(EXEEXT\)$//
7375                 if $primary eq 'PROGRAMS';
7377               push (@result, $locvals);
7378             }
7379         }
7380       # A blatant hack: we rewrite each _PROGRAMS primary to include
7381       # EXEEXT.
7382       append_exeext { 1 } $one_name
7383         if $primary eq 'PROGRAMS';
7384       # "EXTRA" shouldn't be used when generating clean targets,
7385       # all, or install targets.  We used to warn if EXTRA_FOO was
7386       # defined uselessly, but this was annoying.
7387       next
7388         if $nodir_name eq 'EXTRA';
7390       if ($nodir_name eq 'check')
7391         {
7392           push (@check, '$(' . $one_name . ')');
7393         }
7394       else
7395         {
7396           push (@used, '$(' . $one_name . ')');
7397         }
7399       # Is this to be installed?
7400       my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
7402       # If so, with install-exec? (or install-data?).
7403       my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o);
7405       my $check_options_p = $install_p && !! option 'std-options';
7407       # Use the location of the currently processed variable as context.
7408       $where->push_context ("while processing '$one_name'");
7410       # The variable containing all files to distribute.
7411       my $distvar = "\$($one_name)";
7412       $distvar = shadow_unconditionally ($one_name, $where)
7413         if ($dist_p && $one_var->has_conditional_contents);
7415       # Singular form of $PRIMARY.
7416       (my $one_primary = $primary) =~ s/S$//;
7417       $output_rules .= file_contents ($file, $where,
7418                                       PRIMARY     => $primary,
7419                                       ONE_PRIMARY => $one_primary,
7420                                       DIR         => $X,
7421                                       NDIR        => $nodir_name,
7422                                       BASE        => $strip_subdir,
7423                                       EXEC        => $exec_p,
7424                                       INSTALL     => $install_p,
7425                                       DIST        => $dist_p,
7426                                       DISTVAR     => $distvar,
7427                                       'CK-OPTS'   => $check_options_p);
7428     }
7430   # The JAVA variable is used as the name of the Java interpreter.
7431   # The PYTHON variable is used as the name of the Python interpreter.
7432   if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
7433     {
7434       # Define it.
7435       define_pretty_variable ($primary, TRUE, INTERNAL, @used);
7436       $output_vars .= "\n";
7437     }
7439   err_var ($require_extra,
7440            "'$require_extra' contains configure substitution,\n"
7441            . "but 'EXTRA_$primary' not defined")
7442     if ($require_extra && ! var ('EXTRA_' . $primary));
7444   # Push here because PRIMARY might be configure time determined.
7445   push (@all, '$(' . $primary . ')')
7446     if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
7448   # Make the result unique.  This lets the user use conditionals in
7449   # a natural way, but still lets us program lazily -- we don't have
7450   # to worry about handling a particular object more than once.
7451   # We will keep only one location per object.
7452   my %result = ();
7453   for my $pair (@result)
7454     {
7455       my ($loc, $val) = @$pair;
7456       $result{$val} = $loc;
7457     }
7458   my @l = sort keys %result;
7459   return map { [$result{$_}->clone, $_] } @l;
7463 ################################################################
7465 # Each key in this hash is the name of a directory holding a
7466 # Makefile.in.  These variables are local to 'is_make_dir'.
7467 my %make_dirs = ();
7468 my $make_dirs_set = 0;
7470 # is_make_dir ($DIRECTORY)
7471 # ------------------------
7472 sub is_make_dir
7474     my ($dir) = @_;
7475     if (! $make_dirs_set)
7476     {
7477         foreach my $iter (@configure_input_files)
7478         {
7479             $make_dirs{dirname ($iter)} = 1;
7480         }
7481         # We also want to notice Makefile.in's.
7482         foreach my $iter (@other_input_files)
7483         {
7484             if ($iter =~ /Makefile\.in$/)
7485             {
7486                 $make_dirs{dirname ($iter)} = 1;
7487             }
7488         }
7489         $make_dirs_set = 1;
7490     }
7491     return defined $make_dirs{$dir};
7494 ################################################################
7496 # Find the aux dir.  This should match the algorithm used by
7497 # ./configure. (See the Autoconf documentation for for
7498 # AC_CONFIG_AUX_DIR.)
7499 sub locate_aux_dir ()
7501   if (! $config_aux_dir_set_in_configure_ac)
7502     {
7503       # The default auxiliary directory is the first
7504       # of ., .., or ../.. that contains install-sh.
7505       # Assume . if install-sh doesn't exist yet.
7506       for my $dir (qw (. .. ../..))
7507         {
7508           if (-f "$dir/install-sh")
7509             {
7510               $config_aux_dir = $dir;
7511               last;
7512             }
7513         }
7514       $config_aux_dir = '.' unless $config_aux_dir;
7515     }
7516   # Avoid unsightly '/.'s.
7517   $am_config_aux_dir =
7518     '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
7519   $am_config_aux_dir =~ s,/*$,,;
7523 # push_required_file ($DIR, $FILE, $FULLFILE)
7524 # -------------------------------------------
7525 # Push the given file onto DIST_COMMON.
7526 sub push_required_file
7528   my ($dir, $file, $fullfile) = @_;
7530   # If the file to be distributed is in the same directory of the
7531   # currently processed Makefile.am, then we want to distribute it
7532   # from this same Makefile.am.
7533   if ($dir eq $relative_dir)
7534     {
7535       push_dist_common ($file);
7536     }
7537   # This is needed to allow a construct in a non-top-level Makefile.am
7538   # to require a file in the build-aux directory (see at least the test
7539   # script 'test-driver-is-distributed.sh').  This is related to the
7540   # automake bug#9546.  Note that the use of $config_aux_dir instead
7541   # of $am_config_aux_dir here is deliberate and necessary.
7542   elsif ($dir eq $config_aux_dir)
7543     {
7544       push_dist_common ("$am_config_aux_dir/$file");
7545     }
7546   # FIXME: another spacial case, for AC_LIBOBJ/AC_LIBSOURCE support.
7547   # We probably need some refactoring of this function and its callers,
7548   # to have a more explicit and systematic handling of all the special
7549   # cases; but, since there are only two of them, this is low-priority
7550   # ATM.
7551   elsif ($config_libobj_dir && $dir eq $config_libobj_dir)
7552     {
7553       # Avoid unsightly '/.'s.
7554       my $am_config_libobj_dir =
7555         '$(top_srcdir)' .
7556         ($config_libobj_dir eq '.' ? "" : "/$config_libobj_dir");
7557       $am_config_libobj_dir =~ s|/*$||;
7558       push_dist_common ("$am_config_libobj_dir/$file");
7559     }
7560   elsif ($relative_dir eq '.' && ! is_make_dir ($dir))
7561     {
7562       # If we are doing the topmost directory, and the file is in a
7563       # subdir which does not have a Makefile, then we distribute it
7564       # here.
7566       # If a required file is above the source tree, it is important
7567       # to prefix it with '$(srcdir)' so that no VPATH search is
7568       # performed.  Otherwise problems occur with Make implementations
7569       # that rewrite and simplify rules whose dependencies are found in a
7570       # VPATH location.  Here is an example with OSF1/Tru64 Make.
7571       #
7572       #   % cat Makefile
7573       #   VPATH = sub
7574       #   distdir: ../a
7575       #           echo ../a
7576       #   % ls
7577       #   Makefile a
7578       #   % make
7579       #   echo a
7580       #   a
7581       #
7582       # Dependency '../a' was found in 'sub/../a', but this make
7583       # implementation simplified it as 'a'.  (Note that the sub/
7584       # directory does not even exist.)
7585       #
7586       # This kind of VPATH rewriting seems hard to cancel.  The
7587       # distdir.am hack against VPATH rewriting works only when no
7588       # simplification is done, i.e., for dependencies which are in
7589       # subdirectories, not in enclosing directories.  Hence, in
7590       # the latter case we use a full path to make sure no VPATH
7591       # search occurs.
7592       $fullfile = '$(srcdir)/' . $fullfile
7593         if $dir =~ m,^\.\.(?:$|/),;
7595       push_dist_common ($fullfile);
7596     }
7597   else
7598     {
7599       prog_error "a Makefile in relative directory $relative_dir " .
7600                  "can't add files in directory $dir to DIST_COMMON";
7601     }
7605 # If a file name appears as a key in this hash, then it has already
7606 # been checked for.  This allows us not to report the same error more
7607 # than once.
7608 my %required_file_not_found = ();
7610 # required_file_check_or_copy ($WHERE, $DIRECTORY, $FILE)
7611 # -------------------------------------------------------
7612 # Verify that the file must exist in $DIRECTORY, or install it.
7613 sub required_file_check_or_copy
7615   my ($where, $dir, $file) = @_;
7617   my $fullfile = "$dir/$file";
7618   my $found_it = 0;
7619   my $dangling_sym = 0;
7621   if (-l $fullfile && ! -f $fullfile)
7622     {
7623       $dangling_sym = 1;
7624     }
7625   elsif (dir_has_case_matching_file ($dir, $file))
7626     {
7627       $found_it = 1;
7628     }
7630   # '--force-missing' only has an effect if '--add-missing' is
7631   # specified.
7632   return
7633     if $found_it && (! $add_missing || ! $force_missing);
7635   # If we've already looked for it, we're done.  You might wonder why we
7636   # don't do this before searching for the file.  If we do that, then
7637   # something like AC_OUTPUT([subdir/foo foo]) will fail to put 'foo.in'
7638   # into $(DIST_COMMON).
7639   if (! $found_it)
7640     {
7641       return if defined $required_file_not_found{$fullfile};
7642       $required_file_not_found{$fullfile} = 1;
7643     }
7644   if ($dangling_sym && $add_missing)
7645     {
7646       unlink ($fullfile);
7647     }
7649   my $trailer = '';
7650   my $trailer2 = '';
7651   my $suppress = 0;
7653   # Only install missing files according to our desired
7654   # strictness level.
7655   my $message = "required file '$fullfile' not found";
7656   if ($add_missing)
7657     {
7658       if (-f "$libdir/$file")
7659         {
7660           $suppress = 1;
7662           # Install the missing file.  Symlink if we
7663           # can, copy if we must.  Note: delete the file
7664           # first, in case it is a dangling symlink.
7665           $message = "installing '$fullfile'";
7667           # The license file should not be volatile.
7668           if ($file eq "COPYING")
7669             {
7670               $message .= " using GNU General Public License v3 file";
7671               $trailer2 = "\n    Consider adding the COPYING file"
7672                         . " to the version control system"
7673                         . "\n    for your code, to avoid questions"
7674                         . " about which license your project uses";
7675             }
7677           # Windows Perl will hang if we try to delete a
7678           # file that doesn't exist.
7679           unlink ($fullfile) if -f $fullfile;
7680           if ($symlink_exists && ! $copy_missing)
7681             {
7682               if (! symlink ("$libdir/$file", $fullfile)
7683                   || ! -e $fullfile)
7684                 {
7685                   $suppress = 0;
7686                   $trailer = "; error while making link: $!";
7687                 }
7688             }
7689           elsif (system ('cp', "$libdir/$file", $fullfile))
7690             {
7691               $suppress = 0;
7692               $trailer = "\n    error while copying";
7693             }
7694           set_dir_cache_file ($dir, $file);
7695         }
7696     }
7697   else
7698     {
7699       $trailer = "\n  'automake --add-missing' can install '$file'"
7700         if -f "$libdir/$file";
7701     }
7703   # If --force-missing was specified, and we have
7704   # actually found the file, then do nothing.
7705   return
7706     if $found_it && $force_missing;
7708   # If we couldn't install the file, but it is a target in
7709   # the Makefile, don't print anything.  This allows files
7710   # like README, AUTHORS, or THANKS to be generated.
7711   return
7712     if !$suppress && rule $file;
7714   msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2");
7718 # require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, $QUEUE, @FILES)
7719 # ---------------------------------------------------------------------
7720 # Verify that the file must exist in $DIRECTORY, or install it.
7721 # $MYSTRICT is the strictness level at which this file becomes required.
7722 # Worker threads may queue up the action to be serialized by the master,
7723 # if $QUEUE is true
7724 sub require_file_internal
7726   my ($where, $mystrict, $dir, $queue, @files) = @_;
7728   return
7729     unless $strictness >= $mystrict;
7731   foreach my $file (@files)
7732     {
7733       push_required_file ($dir, $file, "$dir/$file");
7734       if ($queue)
7735         {
7736           queue_required_file_check_or_copy ($required_conf_file_queue,
7737                                              QUEUE_CONF_FILE, $relative_dir,
7738                                              $where, $mystrict, @files);
7739         }
7740       else
7741         {
7742           required_file_check_or_copy ($where, $dir, $file);
7743         }
7744     }
7747 # require_file ($WHERE, $MYSTRICT, @FILES)
7748 # ----------------------------------------
7749 sub require_file
7751     my ($where, $mystrict, @files) = @_;
7752     require_file_internal ($where, $mystrict, $relative_dir, 0, @files);
7755 # require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7756 # ----------------------------------------------------------
7757 sub require_file_with_macro
7759     my ($cond, $macro, $mystrict, @files) = @_;
7760     $macro = rvar ($macro) unless ref $macro;
7761     require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7764 # require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7765 # ---------------------------------------------------------------
7766 # Require an AC_LIBSOURCEd file.  If AC_CONFIG_LIBOBJ_DIR was called, it
7767 # must be in that directory.  Otherwise expect it in the current directory.
7768 sub require_libsource_with_macro
7770     my ($cond, $macro, $mystrict, @files) = @_;
7771     $macro = rvar ($macro) unless ref $macro;
7772     if ($config_libobj_dir)
7773       {
7774         require_file_internal ($macro->rdef ($cond)->location, $mystrict,
7775                                $config_libobj_dir, 0, @files);
7776       }
7777     else
7778       {
7779         require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7780       }
7783 # queue_required_file_check_or_copy ($QUEUE, $KEY, $DIR, $WHERE,
7784 #                                    $MYSTRICT, @FILES)
7785 # --------------------------------------------------------------
7786 sub queue_required_file_check_or_copy
7788     my ($queue, $key, $dir, $where, $mystrict, @files) = @_;
7789     my @serial_loc;
7790     if (ref $where)
7791       {
7792         @serial_loc = (QUEUE_LOCATION, $where->serialize ());
7793       }
7794     else
7795       {
7796         @serial_loc = (QUEUE_STRING, $where);
7797       }
7798     $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files);
7801 # require_queued_file_check_or_copy ($QUEUE)
7802 # ------------------------------------------
7803 sub require_queued_file_check_or_copy
7805     my ($queue) = @_;
7806     my $where;
7807     my $dir = $queue->dequeue ();
7808     my $loc_key = $queue->dequeue ();
7809     if ($loc_key eq QUEUE_LOCATION)
7810       {
7811         $where = Automake::Location::deserialize ($queue);
7812       }
7813     elsif ($loc_key eq QUEUE_STRING)
7814       {
7815         $where = $queue->dequeue ();
7816       }
7817     else
7818       {
7819         prog_error "unexpected key $loc_key";
7820       }
7821     my $mystrict = $queue->dequeue ();
7822     my $nfiles = $queue->dequeue ();
7823     my @files;
7824     push @files, $queue->dequeue ()
7825       foreach (1 .. $nfiles);
7826     return
7827       unless $strictness >= $mystrict;
7828     foreach my $file (@files)
7829       {
7830         required_file_check_or_copy ($where, $config_aux_dir, $file);
7831       }
7834 # require_conf_file ($WHERE, $MYSTRICT, @FILES)
7835 # ---------------------------------------------
7836 # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR.
7837 sub require_conf_file
7839     my ($where, $mystrict, @files) = @_;
7840     my $queue = defined $required_conf_file_queue ? 1 : 0;
7841     require_file_internal ($where, $mystrict, $config_aux_dir,
7842                            $queue, @files);
7846 # require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7847 # ---------------------------------------------------------------
7848 sub require_conf_file_with_macro
7850     my ($cond, $macro, $mystrict, @files) = @_;
7851     require_conf_file (rvar ($macro)->rdef ($cond)->location,
7852                        $mystrict, @files);
7855 ################################################################
7857 # require_build_directory ($DIRECTORY)
7858 # ------------------------------------
7859 # Emit rules to create $DIRECTORY if needed, and return
7860 # the file that any target requiring this directory should be made
7861 # dependent upon.
7862 # We don't want to emit the rule twice, and want to reuse it
7863 # for directories with equivalent names (e.g., 'foo/bar' and './foo//bar').
7864 sub require_build_directory
7866   my $directory = shift;
7868   return $directory_map{$directory} if exists $directory_map{$directory};
7870   my $cdir = File::Spec->canonpath ($directory);
7872   if (exists $directory_map{$cdir})
7873     {
7874       my $stamp = $directory_map{$cdir};
7875       $directory_map{$directory} = $stamp;
7876       return $stamp;
7877     }
7879   my $dirstamp = "$cdir/\$(am__dirstamp)";
7881   $directory_map{$directory} = $dirstamp;
7882   $directory_map{$cdir} = $dirstamp;
7884   # Set a variable for the dirstamp basename.
7885   define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
7886                           '$(am__leading_dot)dirstamp');
7888   # Directory must be removed by 'make distclean'.
7889   $clean_files{$dirstamp} = DIST_CLEAN;
7891   $output_rules .= ("$dirstamp:\n"
7892                     . "\t\@\$(MKDIR_P) $directory\n"
7893                     . "\t\@: > $dirstamp\n");
7895   return $dirstamp;
7898 # require_build_directory_maybe ($FILE)
7899 # -------------------------------------
7900 # If $FILE lies in a subdirectory, emit a rule to create this
7901 # directory and return the file that $FILE should be made
7902 # dependent upon.  Otherwise, just return the empty string.
7903 sub require_build_directory_maybe
7905     my $file = shift;
7906     my $directory = dirname ($file);
7908     if ($directory ne '.')
7909     {
7910         return require_build_directory ($directory);
7911     }
7912     else
7913     {
7914         return '';
7915     }
7918 ################################################################
7920 # Push a list of files onto '@dist_common'.
7921 sub push_dist_common
7923   prog_error "push_dist_common run after handle_dist"
7924     if $handle_dist_run;
7925   push @dist_common, @_;
7929 ################################################################
7931 # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN)
7932 # ----------------------------------------------
7933 # Generate a Makefile.in given the name of the corresponding Makefile and
7934 # the name of the file output by config.status.
7935 sub generate_makefile
7937   my ($makefile_am, $makefile_in) = @_;
7939   # Reset all the Makefile.am related variables.
7940   initialize_per_input;
7942   # AUTOMAKE_OPTIONS can contains -W flags to disable or enable
7943   # warnings for this file.  So hold any warning issued before
7944   # we have processed AUTOMAKE_OPTIONS.
7945   buffer_messages ('warning');
7947   # $OUTPUT is encoded.  If it contains a ":" then the first element
7948   # is the real output file, and all remaining elements are input
7949   # files.  We don't scan or otherwise deal with these input files,
7950   # other than to mark them as dependencies.  See the subroutine
7951   # 'scan_autoconf_files' for details.
7952   my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in});
7954   $relative_dir = dirname ($makefile);
7956   read_main_am_file ($makefile_am, $makefile_in);
7957   if (not handle_options)
7958     {
7959       # Process buffered warnings.
7960       flush_messages;
7961       # Fatal error.  Just return, so we can continue with next file.
7962       return;
7963     }
7964   # Process buffered warnings.
7965   flush_messages;
7967   # There are a few install-related variables that you should not define.
7968   foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
7969     {
7970       my $v = var $var;
7971       if ($v)
7972         {
7973           my $def = $v->def (TRUE);
7974           prog_error "$var not defined in condition TRUE"
7975             unless $def;
7976           reject_var $var, "'$var' should not be defined"
7977             if $def->owner != VAR_AUTOMAKE;
7978         }
7979     }
7981   # Catch some obsolete variables.
7982   msg_var ('obsolete', 'INCLUDES',
7983            "'INCLUDES' is the old name for 'AM_CPPFLAGS' (or '*_CPPFLAGS')")
7984     if var ('INCLUDES');
7986   # Must do this after reading .am file.
7987   define_variable ('subdir', $relative_dir, INTERNAL);
7989   # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that
7990   # recursive rules are enabled.
7991   define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '')
7992     if var 'DIST_SUBDIRS' && ! var 'SUBDIRS';
7994   # Check first, because we might modify some state.
7995   check_gnu_standards;
7996   check_gnits_standards;
7998   handle_configure ($makefile_am, $makefile_in, $makefile, @inputs);
7999   handle_gettext;
8001   handle_targets;
8002   handle_libraries;
8003   handle_ltlibraries;
8004   handle_programs;
8005   handle_scripts;
8007   handle_silent;
8009   # These must be run after all the sources are scanned.  They use
8010   # variables defined by handle_libraries(), handle_ltlibraries(),
8011   # or handle_programs().
8012   handle_compile;
8013   handle_languages;
8014   handle_libtool;
8016   # Variables used by distdir.am and tags.am.
8017   define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources);
8018   if (! option 'no-dist')
8019     {
8020       define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources);
8021     }
8023   handle_texinfo;
8024   handle_emacs_lisp;
8025   handle_python;
8026   handle_java;
8027   handle_man_pages;
8028   handle_data;
8029   handle_headers;
8030   handle_subdirs;
8031   handle_user_recursion;
8032   handle_tags;
8033   handle_minor_options;
8034   # Must come after handle_programs so that %known_programs is up-to-date.
8035   handle_tests;
8037   # This must come after most other rules.
8038   handle_dist;
8040   handle_footer;
8041   do_check_merge_target;
8042   handle_all ($makefile);
8044   # FIXME: Gross!
8045   if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8046     {
8047       $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
8048     }
8049   if (var ('nobase_lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
8050     {
8051       $output_rules .= "install-binPROGRAMS: install-nobase_libLTLIBRARIES\n\n";
8052     }
8054   handle_install;
8055   handle_clean ($makefile);
8056   handle_factored_dependencies;
8058   # Comes last, because all the above procedures may have
8059   # defined or overridden variables.
8060   $output_vars .= output_variables;
8062   check_typos;
8064   if ($exit_code != 0)
8065     {
8066       verb "not writing $makefile_in because of earlier errors";
8067       return;
8068     }
8070   my $am_relative_dir = dirname ($makefile_am);
8071   mkdir ($am_relative_dir, 0755) if ! -d $am_relative_dir;
8073   # We make sure that 'all:' is the first target.
8074   my $output =
8075     "$output_vars$output_all$output_header$output_rules$output_trailer";
8077   # Decide whether we must update the output file or not.
8078   # We have to update in the following situations.
8079   #  * $force_generation is set.
8080   #  * any of the output dependencies is younger than the output
8081   #  * the contents of the output is different (this can happen
8082   #    if the project has been populated with a file listed in
8083   #    @common_files since the last run).
8084   # Output's dependencies are split in two sets:
8085   #  * dependencies which are also configure dependencies
8086   #    These do not change between each Makefile.am
8087   #  * other dependencies, specific to the Makefile.am being processed
8088   #    (such as the Makefile.am itself, or any Makefile fragment
8089   #    it includes).
8090   my $timestamp = mtime $makefile_in;
8091   if (! $force_generation
8092       && $configure_deps_greatest_timestamp < $timestamp
8093       && $output_deps_greatest_timestamp < $timestamp
8094       && $output eq contents ($makefile_in))
8095     {
8096       verb "$makefile_in unchanged";
8097       # No need to update.
8098       return;
8099     }
8101   if (-e $makefile_in)
8102     {
8103       unlink ($makefile_in)
8104         or fatal "cannot remove $makefile_in: $!";
8105     }
8107   my $gm_file = new Automake::XFile "> $makefile_in";
8108   verb "creating $makefile_in";
8109   print $gm_file $output;
8113 ################################################################
8116 # Helper function for usage().
8117 sub print_autodist_files
8119   my @lcomm = uniq (sort @_);
8121   my @four;
8122   format USAGE_FORMAT =
8123   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
8124   $four[0],           $four[1],           $four[2],           $four[3]
8126   local $~ = "USAGE_FORMAT";
8128   my $cols = 4;
8129   my $rows = int(@lcomm / $cols);
8130   my $rest = @lcomm % $cols;
8132   if ($rest)
8133     {
8134       $rows++;
8135     }
8136   else
8137     {
8138       $rest = $cols;
8139     }
8141   for (my $y = 0; $y < $rows; $y++)
8142     {
8143       @four = ("", "", "", "");
8144       for (my $x = 0; $x < $cols; $x++)
8145         {
8146           last if $y + 1 == $rows && $x == $rest;
8148           my $idx = (($x > $rest)
8149                ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
8150                : ($rows * $x));
8152           $idx += $y;
8153           $four[$x] = $lcomm[$idx];
8154         }
8155       write;
8156     }
8160 sub usage ()
8162     print "Usage: $0 [OPTION]... [Makefile]...
8164 Generate Makefile.in for configure from Makefile.am.
8166 Operation modes:
8167       --help               print this help, then exit
8168       --version            print version number, then exit
8169   -v, --verbose            verbosely list files processed
8170       --no-force           only update Makefile.in's that are out of date
8171   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY
8173 Dependency tracking:
8174   -i, --ignore-deps      disable dependency tracking code
8175       --include-deps     enable dependency tracking code
8177 Flavors:
8178       --foreign          set strictness to foreign
8179       --gnits            set strictness to gnits
8180       --gnu              set strictness to gnu
8182 Library files:
8183   -a, --add-missing      add missing standard files to package
8184       --libdir=DIR       set directory storing library files
8185       --print-libdir     print directory storing library files
8186   -c, --copy             with -a, copy missing files (default is symlink)
8187   -f, --force-missing    force update of standard files
8190     print Automake::ChannelDefs::usage (), "\n";
8192     print "\nFiles automatically distributed if found " .
8193           "(always):\n";
8194     print_autodist_files @common_files;
8195     print "\nFiles automatically distributed if found " .
8196           "(as .md if needed):\n";
8197     print_autodist_files (map { "${_}[.md]" } @toplevelmd_ok);
8198     print "\nFiles automatically distributed if found " .
8199           "(under certain conditions):\n";
8200     print_autodist_files @common_sometimes, 'README-alpha[.md]';
8202     print '
8203 Report bugs to <@PACKAGE_BUGREPORT@>.
8204 GNU Automake home page: <@PACKAGE_URL@>.
8205 General help using GNU software: <https://www.gnu.org/gethelp/>.
8208     # --help always returns 0 per GNU standards.
8209     exit 0;
8213 sub version ()
8215   print <<EOF;
8216 automake (GNU $PACKAGE) $VERSION
8217 Copyright (C) $RELEASE_YEAR Free Software Foundation, Inc.
8218 License GPLv2+: GNU GPL version 2 or later <https://gnu.org/licenses/gpl-2.0.html>
8219 This is free software: you are free to change and redistribute it.
8220 There is NO WARRANTY, to the extent permitted by law.
8222 Written by Tom Tromey <tromey\@redhat.com>
8223        and Alexandre Duret-Lutz <adl\@gnu.org>.
8225   # --version always returns 0 per GNU standards.
8226   exit 0;
8229 ################################################################
8231 # Parse command line.
8232 sub parse_arguments ()
8234   my $strict = 'gnu';
8235   my $ignore_deps = 0;
8236   my @warnings = ();
8238   my %cli_options =
8239     (
8240      'version' => \&version,
8241      'help'    => \&usage,
8242      'libdir=s' => \$libdir,
8243      'print-libdir'     => sub { print "$libdir\n"; exit 0; },
8244      'gnu'              => sub { $strict = 'gnu'; },
8245      'gnits'            => sub { $strict = 'gnits'; },
8246      'foreign'          => sub { $strict = 'foreign'; },
8247      'include-deps'     => sub { $ignore_deps = 0; },
8248      'i|ignore-deps'    => sub { $ignore_deps = 1; },
8249      'no-force' => sub { $force_generation = 0; },
8250      'f|force-missing'  => \$force_missing,
8251      'a|add-missing'    => \$add_missing,
8252      'c|copy'           => \$copy_missing,
8253      'v|verbose'        => sub { setup_channel 'verb', silent => 0; },
8254      'W|warnings=s'     => \@warnings,
8255      );
8257   use Automake::Getopt ();
8258   Automake::Getopt::parse_options %cli_options;
8260   set_strictness ($strict);
8261   my $cli_where = new Automake::Location;
8262   set_global_option ('no-dependencies', $cli_where) if $ignore_deps;
8263   parse_warnings @warnings;
8265   return unless @ARGV;
8267   my $errspec = 0;
8268   foreach my $arg (@ARGV)
8269     {
8270       fatal ("empty argument\nTry '$0 --help' for more information")
8271         if ($arg eq '');
8273       # Handle $local:$input syntax.
8274       my ($local, @rest) = split (/:/, $arg);
8275       @rest = ("$local.in",) unless @rest;
8276       my $input = locate_am @rest;
8277       if ($input)
8278         {
8279           push @input_files, $input;
8280           $output_files{$input} = join (':', ($local, @rest));
8281         }
8282       else
8283         {
8284           error "no Automake input file found for '$arg'";
8285           $errspec = 1;
8286         }
8287     }
8288   fatal "no input file found among supplied arguments"
8289     if $errspec && ! @input_files;
8293 # handle_makefile ($MAKEFILE)
8294 # ---------------------------
8295 sub handle_makefile
8297   my ($file) =  @_;
8298   ($am_file = $file) =~ s/\.in$//;
8299   if (! -f ($am_file . '.am'))
8300     {
8301       error "'$am_file.am' does not exist";
8302     }
8303   else
8304     {
8305       # Any warning setting now local to this Makefile.am.
8306       dup_channel_setup;
8308       generate_makefile ($am_file . '.am', $file);
8310       # Back out any warning setting.
8311       drop_channel_setup;
8312     }
8315 # Deal with all makefiles, without threads.
8316 sub handle_makefiles_serial ()
8318   foreach my $file (@input_files)
8319     {
8320       handle_makefile ($file);
8321     }
8324 # Logic for deciding how many worker threads to use.
8325 sub get_number_of_threads ()
8327   my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0;
8329   $nthreads = 0
8330     unless $nthreads =~ /^[0-9]+$/;
8332   # It doesn't make sense to use more threads than makefiles,
8333   my $max_threads = @input_files;
8335   if ($nthreads > $max_threads)
8336     {
8337       $nthreads = $max_threads;
8338     }
8339   return $nthreads;
8342 # handle_makefiles_threaded ($NTHREADS)
8343 # -------------------------------------
8344 # Deal with all makefiles, using threads.  The general strategy is to
8345 # spawn NTHREADS worker threads, dispatch makefiles to them, and let the
8346 # worker threads push back everything that needs serialization:
8347 # * warning and (normal) error messages, for stable stderr output
8348 #   order and content (avoiding duplicates, for example),
8349 # * races when installing aux files (and respective messages),
8350 # * races when collecting aux files for distribution.
8352 # The latter requires that the makefile that deals with the aux dir
8353 # files be handled last, done by the master thread.
8354 sub handle_makefiles_threaded
8356   my ($nthreads) = @_;
8358   # The file queue distributes all makefiles, the message queues
8359   # collect all serializations needed for respective files.
8360   my $file_queue = Thread::Queue->new;
8361   my %msg_queues;
8362   foreach my $file (@input_files)
8363     {
8364       $msg_queues{$file} = Thread::Queue->new;
8365     }
8367   verb "spawning $nthreads worker threads";
8368   my @threads = (1 .. $nthreads);
8369   foreach my $t (@threads)
8370     {
8371       $t = threads->new (sub
8372         {
8373           while (my $file = $file_queue->dequeue)
8374             {
8375               verb "handling $file";
8376               my $queue = $msg_queues{$file};
8377               setup_channel_queue ($queue, QUEUE_MESSAGE);
8378               $required_conf_file_queue = $queue;
8379               handle_makefile ($file);
8380               $queue->enqueue (undef);
8381               setup_channel_queue (undef, undef);
8382               $required_conf_file_queue = undef;
8383             }
8384           return $exit_code;
8385         });
8386     }
8388   # Queue all makefiles.
8389   verb "queuing " . @input_files . " input files";
8390   $file_queue->enqueue (@input_files, (undef) x @threads);
8392   # Collect and process serializations.
8393   foreach my $file (@input_files)
8394     {
8395       verb "dequeuing messages for " . $file;
8396       reset_local_duplicates ();
8397       my $queue = $msg_queues{$file};
8398       while (my $key = $queue->dequeue)
8399         {
8400           if ($key eq QUEUE_MESSAGE)
8401             {
8402               pop_channel_queue ($queue);
8403             }
8404           elsif ($key eq QUEUE_CONF_FILE)
8405             {
8406               require_queued_file_check_or_copy ($queue);
8407             }
8408           else
8409             {
8410               prog_error "unexpected key $key";
8411             }
8412         }
8413     }
8415   foreach my $t (@threads)
8416     {
8417       my @exit_thread = $t->join;
8418       $exit_code = $exit_thread[0]
8419         if ($exit_thread[0] > $exit_code);
8420     }
8423 ################################################################
8425 # Parse the WARNINGS environment variable.
8426 parse_WARNINGS;
8428 # Parse command line.
8429 parse_arguments;
8431 $configure_ac = require_configure_ac;
8433 # Do configure.ac scan only once.
8434 scan_autoconf_files;
8436 if (! @input_files)
8437   {
8438     my $msg = '';
8439     $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?"
8440       if -f 'Makefile.am';
8441     fatal ("no 'Makefile.am' found for any configure output$msg");
8442   }
8444 my $nthreads = get_number_of_threads ();
8446 if ($perl_threads && $nthreads >= 1)
8447   {
8448     handle_makefiles_threaded ($nthreads);
8449   }
8450 else
8451   {
8452     handle_makefiles_serial ();
8453   }
8455 exit $exit_code;