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