* NEWS: Mark de-ANSI-fication as being obsolete.
[automake.git] / automake.in
blob35fb1987759a0bb009b2ec2260023fd047460773
1 #!@PERL@ -w
2 # -*- perl -*-
3 # @configure_input@
5 eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
6     if 0;
8 # automake - create Makefile.in from Makefile.am
9 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
10 # 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2, or (at your option)
15 # any later version.
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 # 02110-1301, USA.
27 # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>.
28 # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and
29 # Alexandre Duret-Lutz <adl@gnu.org>.
31 package Language;
33 BEGIN
35   my $perllibdir = $ENV{'perllibdir'} || '@datadir@/@PACKAGE@-@APIVERSION@';
36   unshift @INC, (split '@PATH_SEPARATOR@', $perllibdir);
38   # Override SHELL.  This is required on DJGPP so that system() uses
39   # bash, not COMMAND.COM which doesn't quote arguments properly.
40   # Other systems aren't expected to use $SHELL when Automake
41   # runs, but it should be safe to drop the `if DJGPP' guard if
42   # it turns up other systems need the same thing.  After all,
43   # if SHELL is used, ./configure's SHELL is always better than
44   # the user's SHELL (which may be something like tcsh).
45   $ENV{'SHELL'} = '@SHELL@' if exists $ENV{'DJGPP'};
48 use Automake::Struct;
49 struct (# Short name of the language (c, f77...).
50         'name' => "\$",
51         # Nice name of the language (C, Fortran 77...).
52         'Name' => "\$",
54         # List of configure variables which must be defined.
55         'config_vars' => '@',
57         'ansi'    => "\$",
58         # `pure' is `1' or `'.  A `pure' language is one where, if
59         # all the files in a directory are of that language, then we
60         # do not require the C compiler or any code to call it.
61         'pure'   => "\$",
63         'autodep' => "\$",
65         # Name of the compiling variable (COMPILE).
66         'compiler'  => "\$",
67         # Content of the compiling variable.
68         'compile'  => "\$",
69         # Flag to require compilation without linking (-c).
70         'compile_flag' => "\$",
71         'extensions' => '@',
72         # A subroutine to compute a list of possible extensions of
73         # the product given the input extensions.
74         # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo'))
75         'output_extensions' => "\$",
76         # A list of flag variables used in 'compile'.
77         # (defaults to [])
78         'flags' => "@",
80         # Any tag to pass to libtool while compiling.
81         'libtool_tag' => "\$",
83         # The file to use when generating rules for this language.
84         # The default is 'depend2'.
85         'rule_file' => "\$",
87         # Name of the linking variable (LINK).
88         'linker' => "\$",
89         # Content of the linking variable.
90         'link' => "\$",
92         # Name of the linker variable (LD).
93         'lder' => "\$",
94         # Content of the linker variable ($(CC)).
95         'ld' => "\$",
97         # Flag to specify the output file (-o).
98         'output_flag' => "\$",
99         '_finish' => "\$",
101         # This is a subroutine which is called whenever we finally
102         # determine the context in which a source file will be
103         # compiled.
104         '_target_hook' => "\$",
106         # If TRUE, nodist_ sources will be compiled using specific rules
107         # (i.e. not inference rules).  The default is FALSE.
108         'nodist_specific' => "\$");
111 sub finish ($)
113   my ($self) = @_;
114   if (defined $self->_finish)
115     {
116       &{$self->_finish} ();
117     }
120 sub target_hook ($$$$%)
122     my ($self) = @_;
123     if (defined $self->_target_hook)
124     {
125         &{$self->_target_hook} (@_);
126     }
129 package Automake;
131 use strict;
132 use Automake::Config;
133 use Automake::General;
134 use Automake::XFile;
135 use Automake::Channels;
136 use Automake::ChannelDefs;
137 use Automake::Configure_ac;
138 use Automake::FileUtils;
139 use Automake::Location;
140 use Automake::Condition qw/TRUE FALSE/;
141 use Automake::DisjConditions;
142 use Automake::Options;
143 use Automake::Version;
144 use Automake::Variable;
145 use Automake::VarDef;
146 use Automake::Rule;
147 use Automake::RuleDef;
148 use Automake::Wrap 'makefile_wrap';
149 use File::Basename;
150 use File::Spec;
151 use Carp;
153 ## ----------- ##
154 ## Constants.  ##
155 ## ----------- ##
157 # Some regular expressions.  One reason to put them here is that it
158 # makes indentation work better in Emacs.
160 # Writing singled-quoted-$-terminated regexes is a pain because
161 # perl-mode thinks of $' as the ${'} variable (instead of a $ followed
162 # by a closing quote.  Letting perl-mode think the quote is not closed
163 # leads to all sort of misindentations.  On the other hand, defining
164 # regexes as double-quoted strings is far less readable.  So usually
165 # we will write:
167 #  $REGEX = '^regex_value' . "\$";
169 my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n';
170 my $WHITE_PATTERN = '^\s*' . "\$";
171 my $COMMENT_PATTERN = '^#';
172 my $TARGET_PATTERN='[$a-zA-Z_.@%][-.a-zA-Z0-9_(){}/$+@%]*';
173 # A rule has three parts: a list of targets, a list of dependencies,
174 # and optionally actions.
175 my $RULE_PATTERN =
176   "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$";
178 # Only recognize leading spaces, not leading tabs.  If we recognize
179 # leading tabs here then we need to make the reader smarter, because
180 # otherwise it will think rules like `foo=bar; \' are errors.
181 my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$";
182 # This pattern recognizes a Gnits version id and sets $1 if the
183 # release is an alpha release.  We also allow a suffix which can be
184 # used to extend the version number with a "fork" identifier.
185 my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?';
187 my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$";
188 my $ELSE_PATTERN =
189   '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
190 my $ENDIF_PATTERN =
191   '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$";
192 my $PATH_PATTERN = '(\w|[+/.-])+';
193 # This will pass through anything not of the prescribed form.
194 my $INCLUDE_PATTERN = ('^include\s+'
195                        . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')'
196                        . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')'
197                        . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$");
199 # Match `-d' as a command-line argument in a string.
200 my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)";
201 # Directories installed during 'install-exec' phase.
202 my $EXEC_DIR_PATTERN =
203   '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$";
205 # Values for AC_CANONICAL_*
206 use constant AC_CANONICAL_BUILD  => 1;
207 use constant AC_CANONICAL_HOST   => 2;
208 use constant AC_CANONICAL_TARGET => 3;
210 # Values indicating when something should be cleaned.
211 use constant MOSTLY_CLEAN     => 0;
212 use constant CLEAN            => 1;
213 use constant DIST_CLEAN       => 2;
214 use constant MAINTAINER_CLEAN => 3;
216 # Libtool files.
217 my @libtool_files = qw(ltmain.sh config.guess config.sub);
218 # ltconfig appears here for compatibility with old versions of libtool.
219 my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh);
221 # Commonly found files we look for and automatically include in
222 # DISTFILES.
223 my @common_files =
224     (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB
225         COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO
226         ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub
227         depcomp elisp-comp install-sh libversion.in mdate-sh missing
228         mkinstalldirs py-compile texinfo.tex ylwrap),
229      @libtool_files, @libtool_sometimes);
231 # Commonly used files we auto-include, but only sometimes.  This list
232 # is used for the --help output only.
233 my @common_sometimes =
234   qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure
235      configure.ac configure.in stamp-vti);
237 # Standard directories from the GNU Coding Standards, and additional
238 # pkg* directories from Automake.  Stored in a hash for fast member check.
239 my %standard_prefix =
240     map { $_ => 1 } (qw(bin data dataroot dvi exec html include info
241                         lib libexec lisp localstate man man1 man2 man3
242                         man4 man5 man6 man7 man8 man9 oldinclude pdf
243                         pkgdatadir pkgincludedir pkglibdir ps sbin
244                         sharedstate sysconf));
246 # Copyright on generated Makefile.ins.
247 my $gen_copyright = "\
248 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
249 # 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
250 # This Makefile.in is free software; the Free Software Foundation
251 # gives unlimited permission to copy and/or distribute it,
252 # with or without modifications, as long as this notice is preserved.
254 # This program is distributed in the hope that it will be useful,
255 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
256 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
257 # PARTICULAR PURPOSE.
260 # These constants are returned by lang_*_rewrite functions.
261 # LANG_SUBDIR means that the resulting object file should be in a
262 # subdir if the source file is.  In this case the file name cannot
263 # have `..' components.
264 use constant LANG_IGNORE  => 0;
265 use constant LANG_PROCESS => 1;
266 use constant LANG_SUBDIR  => 2;
268 # These are used when keeping track of whether an object can be built
269 # by two different paths.
270 use constant COMPILE_LIBTOOL  => 1;
271 use constant COMPILE_ORDINARY => 2;
273 # We can't always associate a location to a variable or a rule,
274 # when its defined by Automake.  We use INTERNAL in this case.
275 use constant INTERNAL => new Automake::Location;
278 ## ---------------------------------- ##
279 ## Variables related to the options.  ##
280 ## ---------------------------------- ##
282 # TRUE if we should always generate Makefile.in.
283 my $force_generation = 1;
285 # From the Perl manual.
286 my $symlink_exists = (eval 'symlink ("", "");', $@ eq '');
288 # TRUE if missing standard files should be installed.
289 my $add_missing = 0;
291 # TRUE if we should copy missing files; otherwise symlink if possible.
292 my $copy_missing = 0;
294 # TRUE if we should always update files that we know about.
295 my $force_missing = 0;
298 ## ---------------------------------------- ##
299 ## Variables filled during files scanning.  ##
300 ## ---------------------------------------- ##
302 # Name of the configure.ac file.
303 my $configure_ac;
305 # Files found by scanning configure.ac for LIBOBJS.
306 my %libsources = ();
308 # Names used in AC_CONFIG_HEADER call.
309 my @config_headers = ();
311 # Names used in AC_CONFIG_LINKS call.
312 my @config_links = ();
314 # Directory where output files go.  Actually, output files are
315 # relative to this directory.
316 my $output_directory;
318 # List of Makefile.am's to process, and their corresponding outputs.
319 my @input_files = ();
320 my %output_files = ();
322 # Complete list of Makefile.am's that exist.
323 my @configure_input_files = ();
325 # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's,
326 # and their outputs.
327 my @other_input_files = ();
328 # Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADER appears.
329 # The keys are the files created by these macros.
330 my %ac_config_files_location = ();
332 # Directory to search for configure-required files.  This
333 # will be computed by &locate_aux_dir and can be set using
334 # AC_CONFIG_AUX_DIR in configure.ac.
335 # $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree.
336 my $config_aux_dir = '';
337 my $config_aux_dir_set_in_configure_ac = 0;
338 # $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used
339 # in Makefiles.
340 my $am_config_aux_dir = '';
342 # Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR
343 # in configure.ac.
344 my $config_libobj_dir = '';
346 # Whether AM_GNU_GETTEXT has been seen in configure.ac.
347 my $seen_gettext = 0;
348 # Whether AM_GNU_GETTEXT([external]) is used.
349 my $seen_gettext_external = 0;
350 # Where AM_GNU_GETTEXT appears.
351 my $ac_gettext_location;
353 # Lists of tags supported by Libtool.
354 my %libtool_tags = ();
355 # 1 if Libtool uses LT_SUPPORTED_TAG.  If it does, then it also
356 # uses AC_REQUIRE_AUX_FILE.
357 my $libtool_new_api = 0;
359 # Most important AC_CANONICAL_* macro seen so far.
360 my $seen_canonical = 0;
361 # Location of that macro.
362 my $canonical_location;
364 # Where AM_MAINTAINER_MODE appears.
365 my $seen_maint_mode;
367 # Actual version we've seen.
368 my $package_version = '';
370 # Where version is defined.
371 my $package_version_location;
373 # TRUE if we've seen AC_ENABLE_MULTILIB.
374 my $seen_multilib = 0;
376 # TRUE if we've seen AM_PROG_CC_C_O
377 my $seen_cc_c_o = 0;
379 # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument.
380 my %required_aux_file = ();
382 # Where AM_INIT_AUTOMAKE is called;
383 my $seen_init_automake = 0;
385 # TRUE if we've seen AM_AUTOMAKE_VERSION.
386 my $seen_automake_version = 0;
388 # Hash table of discovered configure substitutions.  Keys are names,
389 # values are `FILE:LINE' strings which are used by error message
390 # generation.
391 my %configure_vars = ();
393 # Ignored configure substitutions (i.e., variables not to be output in
394 # Makefile.in)
395 my %ignored_configure_vars = ();
397 # Files included by $configure_ac.
398 my @configure_deps = ();
400 # Greatest timestamp of configure's dependencies.
401 my $configure_deps_greatest_timestamp = 0;
403 # Hash table of AM_CONDITIONAL variables seen in configure.
404 my %configure_cond = ();
406 # This maps extensions onto language names.
407 my %extension_map = ();
409 # List of the DIST_COMMON files we discovered while reading
410 # configure.in
411 my $configure_dist_common = '';
413 # This maps languages names onto objects.
414 my %languages = ();
415 # Maps each linker variable onto a language object.
416 my %link_languages = ();
418 # List of targets we must always output.
419 # FIXME: Complete, and remove falsely required targets.
420 my %required_targets =
421   (
422    'all'          => 1,
423    'dvi'          => 1,
424    'pdf'          => 1,
425    'ps'           => 1,
426    'info'         => 1,
427    'install-info' => 1,
428    'install'      => 1,
429    'install-data' => 1,
430    'install-exec' => 1,
431    'uninstall'    => 1,
433    # FIXME: Not required, temporary hacks.
434    # Well, actually they are sort of required: the -recursive
435    # targets will run them anyway...
436    'dvi-am'          => 1,
437    'pdf-am'          => 1,
438    'ps-am'           => 1,
439    'info-am'         => 1,
440    'install-data-am' => 1,
441    'install-exec-am' => 1,
442    'installcheck-am' => 1,
443    'uninstall-am' => 1,
445    'install-man' => 1,
446   );
448 # Set to 1 if this run will create the Makefile.in that distribute
449 # the files in config_aux_dir.
450 my $automake_will_process_aux_dir = 0;
452 # The name of the Makefile currently being processed.
453 my $am_file = 'BUG';
456 ################################################################
458 ## ------------------------------------------ ##
459 ## Variables reset by &initialize_per_input.  ##
460 ## ------------------------------------------ ##
462 # Basename and relative dir of the input file.
463 my $am_file_name;
464 my $am_relative_dir;
466 # Same but wrt Makefile.in.
467 my $in_file_name;
468 my $relative_dir;
470 # Relative path to the top directory.
471 my $topsrcdir;
473 # Greatest timestamp of the output's dependencies (excluding
474 # configure's dependencies).
475 my $output_deps_greatest_timestamp;
477 # These two variables are used when generating each Makefile.in.
478 # They hold the Makefile.in until it is ready to be printed.
479 my $output_rules;
480 my $output_vars;
481 my $output_trailer;
482 my $output_all;
483 my $output_header;
485 # This is the conditional stack, updated on if/else/endif, and
486 # used to build Condition objects.
487 my @cond_stack;
489 # This holds the set of included files.
490 my @include_stack;
492 # List of dependencies for the obvious targets.
493 my @all;
494 my @check;
495 my @check_tests;
497 # Keys in this hash table are files to delete.  The associated
498 # value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.)
499 my %clean_files;
501 # Keys in this hash table are object files or other files in
502 # subdirectories which need to be removed.  This only holds files
503 # which are created by compilations.  The value in the hash indicates
504 # when the file should be removed.
505 my %compile_clean_files;
507 # Keys in this hash table are directories where we expect to build a
508 # libtool object.  We use this information to decide what directories
509 # to delete.
510 my %libtool_clean_directories;
512 # Value of `$(SOURCES)', used by tags.am.
513 my @sources;
514 # Sources which go in the distribution.
515 my @dist_sources;
517 # This hash maps object file names onto their corresponding source
518 # file names.  This is used to ensure that each object is created
519 # by a single source file.
520 my %object_map;
522 # This hash maps object file names onto an integer value representing
523 # whether this object has been built via ordinary compilation or
524 # libtool compilation (the COMPILE_* constants).
525 my %object_compilation_map;
528 # This keeps track of the directories for which we've already
529 # created dirstamp code.  Keys are directories, values are stamp files.
530 # Several keys can share the same stamp files if they are equivalent
531 # (as are `.//foo' and `foo').
532 my %directory_map;
534 # All .P files.
535 my %dep_files;
537 # This is a list of all targets to run during "make dist".
538 my @dist_targets;
540 # Keep track of all programs declared in this Makefile, without
541 # $(EXEEXT).  @substitution@ are not listed.
542 my %known_programs;
544 # Keys in this hash are the basenames of files which must depend on
545 # ansi2knr.  Values are either the empty string, or the directory in
546 # which the ANSI source file appears; the directory must have a
547 # trailing `/'.
548 my %de_ansi_files;
550 # This is the name of the redirect `all' target to use.
551 my $all_target;
553 # This keeps track of which extensions we've seen (that we care
554 # about).
555 my %extension_seen;
557 # This is random scratch space for the language finish functions.
558 # Don't randomly overwrite it; examine other uses of keys first.
559 my %language_scratch;
561 # We keep track of which objects need special (per-executable)
562 # handling on a per-language basis.
563 my %lang_specific_files;
565 # This is set when `handle_dist' has finished.  Once this happens,
566 # we should no longer push on dist_common.
567 my $handle_dist_run;
569 # Used to store a set of linkers needed to generate the sources currently
570 # under consideration.
571 my %linkers_used;
573 # True if we need `LINK' defined.  This is a hack.
574 my $need_link;
576 # Was get_object_extension run?
577 # FIXME: This is a hack. a better switch should be found.
578 my $get_object_extension_was_run;
580 # Record each file processed by make_paragraphs.
581 my %transformed_files;
583 # Cache each file processed by make_paragraphs.
584 # (This is different from %transformed_files because
585 # %transformed_files is reset for each file while %am_file_cache
586 # it global to the run.)
587 my %am_file_cache;
589 ################################################################
591 # var_SUFFIXES_trigger ($TYPE, $VALUE)
592 # ------------------------------------
593 # This is called by Automake::Variable::define() when SUFFIXES
594 # is defined ($TYPE eq '') or appended ($TYPE eq '+').
595 # The work here needs to be performed as a side-effect of the
596 # macro_define() call because SUFFIXES definitions impact
597 # on $KNOWN_EXTENSIONS_PATTERN which is used used when parsing
598 # the input am file.
599 sub var_SUFFIXES_trigger ($$)
601     my ($type, $value) = @_;
602     accept_extensions (split (' ', $value));
604 Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger);
606 ################################################################
608 ## --------------------------------- ##
609 ## Forward subroutine declarations.  ##
610 ## --------------------------------- ##
611 sub register_language (%);
612 sub file_contents_internal ($$$%);
613 sub define_files_variable ($\@$$);
616 # &initialize_per_input ()
617 # ------------------------
618 # (Re)-Initialize per-Makefile.am variables.
619 sub initialize_per_input ()
621     reset_local_duplicates ();
623     $am_file_name = '';
624     $am_relative_dir = '';
626     $in_file_name = '';
627     $relative_dir = '';
629     $output_deps_greatest_timestamp = 0;
631     $output_rules = '';
632     $output_vars = '';
633     $output_trailer = '';
634     $output_all = '';
635     $output_header = '';
637     Automake::Options::reset;
638     Automake::Variable::reset;
639     Automake::Rule::reset;
641     @cond_stack = ();
643     @include_stack = ();
645     @all = ();
646     @check = ();
647     @check_tests = ();
649     %clean_files = ();
651     @sources = ();
652     @dist_sources = ();
654     %object_map = ();
655     %object_compilation_map = ();
657     %directory_map = ();
659     %dep_files = ();
661     @dist_targets = ();
663     %known_programs = ();
665     %de_ansi_files = ();
667     $all_target = '';
669     %extension_seen = ();
671     %language_scratch = ();
673     %lang_specific_files = ();
675     $handle_dist_run = 0;
677     $need_link = 0;
679     $get_object_extension_was_run = 0;
681     %compile_clean_files = ();
683     # We always include `.'.  This isn't strictly correct.
684     %libtool_clean_directories = ('.' => 1);
686     %transformed_files = ();
690 ################################################################
692 # Initialize our list of languages that are internally supported.
694 # C.
695 register_language ('name' => 'c',
696                    'Name' => 'C',
697                    'config_vars' => ['CC'],
698                    'ansi' => 1,
699                    'autodep' => '',
700                    'flags' => ['CFLAGS', 'CPPFLAGS'],
701                    'compiler' => 'COMPILE',
702                    'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)',
703                    'lder' => 'CCLD',
704                    'ld' => '$(CC)',
705                    'linker' => 'LINK',
706                    'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
707                    'compile_flag' => '-c',
708                    'libtool_tag' => 'CC',
709                    'extensions' => ['.c'],
710                    '_finish' => \&lang_c_finish);
712 # C++.
713 register_language ('name' => 'cxx',
714                    'Name' => 'C++',
715                    'config_vars' => ['CXX'],
716                    'linker' => 'CXXLINK',
717                    'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
718                    'autodep' => 'CXX',
719                    'flags' => ['CXXFLAGS', 'CPPFLAGS'],
720                    'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)',
721                    'compiler' => 'CXXCOMPILE',
722                    'compile_flag' => '-c',
723                    'output_flag' => '-o',
724                    'libtool_tag' => 'CXX',
725                    'lder' => 'CXXLD',
726                    'ld' => '$(CXX)',
727                    'pure' => 1,
728                    'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']);
730 # Objective C.
731 register_language ('name' => 'objc',
732                    'Name' => 'Objective C',
733                    'config_vars' => ['OBJC'],
734                    'linker' => 'OBJCLINK',
735                    'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
736                    'autodep' => 'OBJC',
737                    'flags' => ['OBJCFLAGS', 'CPPFLAGS'],
738                    'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)',
739                    'compiler' => 'OBJCCOMPILE',
740                    'compile_flag' => '-c',
741                    'output_flag' => '-o',
742                    'lder' => 'OBJCLD',
743                    'ld' => '$(OBJC)',
744                    'pure' => 1,
745                    'extensions' => ['.m']);
747 # Unified Parallel C.
748 register_language ('name' => 'upc',
749                    'Name' => 'Unified Parallel C',
750                    'config_vars' => ['UPC'],
751                    'linker' => 'UPCLINK',
752                    'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
753                    'autodep' => 'UPC',
754                    'flags' => ['UPCFLAGS', 'CPPFLAGS'],
755                    'compile' => '$(UPC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_UPCFLAGS) $(UPCFLAGS)',
756                    'compiler' => 'UPCCOMPILE',
757                    'compile_flag' => '-c',
758                    'output_flag' => '-o',
759                    'lder' => 'UPCLD',
760                    'ld' => '$(UPC)',
761                    'pure' => 1,
762                    'extensions' => ['.upc']);
764 # Headers.
765 register_language ('name' => 'header',
766                    'Name' => 'Header',
767                    'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh',
768                                     '.hpp', '.inc'],
769                    # No output.
770                    'output_extensions' => sub { return () },
771                    # Nothing to do.
772                    '_finish' => sub { });
774 # Yacc (C & C++).
775 register_language ('name' => 'yacc',
776                    'Name' => 'Yacc',
777                    'config_vars' => ['YACC'],
778                    'flags' => ['YFLAGS'],
779                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
780                    'compiler' => 'YACCCOMPILE',
781                    'extensions' => ['.y'],
782                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
783                                                 return ($ext,) },
784                    'rule_file' => 'yacc',
785                    '_finish' => \&lang_yacc_finish,
786                    '_target_hook' => \&lang_yacc_target_hook,
787                    'nodist_specific' => 1);
788 register_language ('name' => 'yaccxx',
789                    'Name' => 'Yacc (C++)',
790                    'config_vars' => ['YACC'],
791                    'rule_file' => 'yacc',
792                    'flags' => ['YFLAGS'],
793                    'compiler' => 'YACCCOMPILE',
794                    'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)',
795                    'extensions' => ['.y++', '.yy', '.yxx', '.ypp'],
796                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/;
797                                                 return ($ext,) },
798                    '_finish' => \&lang_yacc_finish,
799                    '_target_hook' => \&lang_yacc_target_hook,
800                    'nodist_specific' => 1);
802 # Lex (C & C++).
803 register_language ('name' => 'lex',
804                    'Name' => 'Lex',
805                    'config_vars' => ['LEX'],
806                    'rule_file' => 'lex',
807                    'flags' => ['LFLAGS'],
808                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
809                    'compiler' => 'LEXCOMPILE',
810                    'extensions' => ['.l'],
811                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
812                                                 return ($ext,) },
813                    '_finish' => \&lang_lex_finish,
814                    '_target_hook' => \&lang_lex_target_hook,
815                    'nodist_specific' => 1);
816 register_language ('name' => 'lexxx',
817                    'Name' => 'Lex (C++)',
818                    'config_vars' => ['LEX'],
819                    'rule_file' => 'lex',
820                    'flags' => ['LFLAGS'],
821                    'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)',
822                    'compiler' => 'LEXCOMPILE',
823                    'extensions' => ['.l++', '.ll', '.lxx', '.lpp'],
824                    'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/;
825                                                 return ($ext,) },
826                    '_finish' => \&lang_lex_finish,
827                    '_target_hook' => \&lang_lex_target_hook,
828                    'nodist_specific' => 1);
830 # Assembler.
831 register_language ('name' => 'asm',
832                    'Name' => 'Assembler',
833                    'config_vars' => ['CCAS', 'CCASFLAGS'],
835                    'flags' => ['CCASFLAGS'],
836                    # Users can set AM_CCASFLAGS to include DEFS, INCLUDES,
837                    # or anything else required.  They can also set CCAS.
838                    'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)',
839                    'compiler' => 'CCASCOMPILE',
840                    'compile_flag' => '-c',
841                    'extensions' => ['.s'],
843                    # With assembly we still use the C linker.
844                    '_finish' => \&lang_c_finish);
846 # Preprocessed Assembler.
847 register_language ('name' => 'cppasm',
848                    'Name' => 'Preprocessed Assembler',
849                    'config_vars' => ['CCAS', 'CCASFLAGS'],
851                    'autodep' => 'CCAS',
852                    'flags' => ['CCASFLAGS', 'CPPFLAGS'],
853                    # Users can set AM_CCASFLAGS to include DEFS, INCLUDES,
854                    # or anything else required beyond AM_CPPFLAGS.  They
855                    # can also set CCAS.
856                    'compile' => '$(CCAS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)',
857                    'compiler' => 'CPPASCOMPILE',
858                    'compile_flag' => '-c',
859                    'extensions' => ['.S'],
861                    # With assembly we still use the C linker.
862                    '_finish' => \&lang_c_finish);
864 # Fortran 77
865 register_language ('name' => 'f77',
866                    'Name' => 'Fortran 77',
867                    'linker' => 'F77LINK',
868                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
869                    'flags' => ['FFLAGS'],
870                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)',
871                    'compiler' => 'F77COMPILE',
872                    'compile_flag' => '-c',
873                    'output_flag' => '-o',
874                    'libtool_tag' => 'F77',
875                    'lder' => 'F77LD',
876                    'ld' => '$(F77)',
877                    'pure' => 1,
878                    'extensions' => ['.f', '.for']);
880 # Fortran
881 register_language ('name' => 'fc',
882                    'Name' => 'Fortran',
883                    'linker' => 'FCLINK',
884                    'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
885                    'flags' => ['FCFLAGS'],
886                    'compile' => '$(FC) $(AM_FCFLAGS) $(FCFLAGS)',
887                    'compiler' => 'FCCOMPILE',
888                    'compile_flag' => '-c',
889                    'output_flag' => '-o',
890                    'lder' => 'FCLD',
891                    'ld' => '$(FC)',
892                    'pure' => 1,
893                    'extensions' => ['.f90', '.f95']);
895 # Preprocessed Fortran
896 register_language ('name' => 'ppfc',
897                    'Name' => 'Preprocessed Fortran',
898                    'config_vars' => ['FC'],
899                    'linker' => 'FCLINK',
900                    'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
901                    'lder' => 'FCLD',
902                    'ld' => '$(FC)',
903                    'flags' => ['FCFLAGS', 'CPPFLAGS'],
904                    'compiler' => 'PPFCCOMPILE',
905                    'compile' => '$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)',
906                    'compile_flag' => '-c',
907                    'output_flag' => '-o',
908                    'libtool_tag' => 'FC',
909                    'pure' => 1,
910                    'extensions' => ['.F90','.F95']);
912 # Preprocessed Fortran 77
914 # The current support for preprocessing Fortran 77 just involves
915 # passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
916 # $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since
917 # this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51
918 # for `make' Version 3.76 Beta' (specifically, from info file
919 # `(make)Catalogue of Rules').
921 # A better approach would be to write an Autoconf test
922 # (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all
923 # Fortran 77 compilers know how to do preprocessing.  The Autoconf
924 # macro AC_PROG_FPP should test the Fortran 77 compiler first for
925 # preprocessing capabilities, and then fall back on cpp (if cpp were
926 # available).
927 register_language ('name' => 'ppf77',
928                    'Name' => 'Preprocessed Fortran 77',
929                    'config_vars' => ['F77'],
930                    'linker' => 'F77LINK',
931                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
932                    'lder' => 'F77LD',
933                    'ld' => '$(F77)',
934                    'flags' => ['FFLAGS', 'CPPFLAGS'],
935                    'compiler' => 'PPF77COMPILE',
936                    'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)',
937                    'compile_flag' => '-c',
938                    'output_flag' => '-o',
939                    'libtool_tag' => 'F77',
940                    'pure' => 1,
941                    'extensions' => ['.F']);
943 # Ratfor.
944 register_language ('name' => 'ratfor',
945                    'Name' => 'Ratfor',
946                    'config_vars' => ['F77'],
947                    'linker' => 'F77LINK',
948                    'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
949                    'lder' => 'F77LD',
950                    'ld' => '$(F77)',
951                    'flags' => ['RFLAGS', 'FFLAGS'],
952                    # FIXME also FFLAGS.
953                    'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)',
954                    'compiler' => 'RCOMPILE',
955                    'compile_flag' => '-c',
956                    'output_flag' => '-o',
957                    'libtool_tag' => 'F77',
958                    'pure' => 1,
959                    'extensions' => ['.r']);
961 # Java via gcj.
962 register_language ('name' => 'java',
963                    'Name' => 'Java',
964                    'config_vars' => ['GCJ'],
965                    'linker' => 'GCJLINK',
966                    'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@',
967                    'autodep' => 'GCJ',
968                    'flags' => ['GCJFLAGS'],
969                    'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)',
970                    'compiler' => 'GCJCOMPILE',
971                    'compile_flag' => '-c',
972                    'output_flag' => '-o',
973                    'libtool_tag' => 'GCJ',
974                    'lder' => 'GCJLD',
975                    'ld' => '$(GCJ)',
976                    'pure' => 1,
977                    'extensions' => ['.java', '.class', '.zip', '.jar']);
979 ################################################################
981 # Error reporting functions.
983 # err_am ($MESSAGE, [%OPTIONS])
984 # -----------------------------
985 # Uncategorized errors about the current Makefile.am.
986 sub err_am ($;%)
988   msg_am ('error', @_);
991 # err_ac ($MESSAGE, [%OPTIONS])
992 # -----------------------------
993 # Uncategorized errors about configure.ac.
994 sub err_ac ($;%)
996   msg_ac ('error', @_);
999 # msg_am ($CHANNEL, $MESSAGE, [%OPTIONS])
1000 # ---------------------------------------
1001 # Messages about about the current Makefile.am.
1002 sub msg_am ($$;%)
1004   my ($channel, $msg, %opts) = @_;
1005   msg $channel, "${am_file}.am", $msg, %opts;
1008 # msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS])
1009 # ---------------------------------------
1010 # Messages about about configure.ac.
1011 sub msg_ac ($$;%)
1013   my ($channel, $msg, %opts) = @_;
1014   msg $channel, $configure_ac, $msg, %opts;
1017 ################################################################
1019 # subst ($TEXT)
1020 # -------------
1021 # Return a configure-style substitution using the indicated text.
1022 # We do this to avoid having the substitutions directly in automake.in;
1023 # when we do that they are sometimes removed and this causes confusion
1024 # and bugs.
1025 sub subst ($)
1027     my ($text) = @_;
1028     return '@' . $text . '@';
1031 ################################################################
1034 # $BACKPATH
1035 # &backname ($REL-DIR)
1036 # --------------------
1037 # If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'.
1038 # For instance `src/foo' => `../..'.
1039 # Works with non strictly increasing paths, i.e., `src/../lib' => `..'.
1040 sub backname ($)
1042     my ($file) = @_;
1043     my @res;
1044     foreach (split (/\//, $file))
1045     {
1046         next if $_ eq '.' || $_ eq '';
1047         if ($_ eq '..')
1048         {
1049             pop @res;
1050         }
1051         else
1052         {
1053             push (@res, '..');
1054         }
1055     }
1056     return join ('/', @res) || '.';
1059 ################################################################
1062 # Handle AUTOMAKE_OPTIONS variable.  Return 1 on error, 0 otherwise.
1063 sub handle_options
1065   my $var = var ('AUTOMAKE_OPTIONS');
1066   if ($var)
1067     {
1068       if ($var->has_conditional_contents)
1069         {
1070           msg_var ('unsupported', $var,
1071                    "`AUTOMAKE_OPTIONS' cannot have conditional contents");
1072         }
1073       foreach my $locvals ($var->value_as_list_recursive (cond_filter => TRUE,
1074                                                           location => 1))
1075         {
1076           my ($loc, $value) = @$locvals;
1077           return 1 if (process_option_list ($loc, $value))
1078         }
1079     }
1081   if ($strictness == GNITS)
1082     {
1083       set_option ('readme-alpha', INTERNAL);
1084       set_option ('std-options', INTERNAL);
1085       set_option ('check-news', INTERNAL);
1086     }
1088   return 0;
1091 # shadow_unconditionally ($varname, $where)
1092 # -----------------------------------------
1093 # Return a $(variable) that contains all possible values
1094 # $varname can take.
1095 # If the VAR wasn't defined conditionally, return $(VAR).
1096 # Otherwise we create a am__VAR_DIST variable which contains
1097 # all possible values, and return $(am__VAR_DIST).
1098 sub shadow_unconditionally ($$)
1100   my ($varname, $where) = @_;
1101   my $var = var $varname;
1102   if ($var->has_conditional_contents)
1103     {
1104       $varname = "am__${varname}_DIST";
1105       my @files = uniq ($var->value_as_list_recursive);
1106       define_pretty_variable ($varname, TRUE, $where, @files);
1107     }
1108   return "\$($varname)"
1111 # get_object_extension ($EXTENSION)
1112 # ---------------------------------
1113 # Prefix $EXTENSION with $U if ansi2knr is in use.
1114 sub get_object_extension ($)
1116     my ($extension) = @_;
1118     # Check for automatic de-ANSI-fication.
1119     $extension = '$U' . $extension
1120       if option 'ansi2knr';
1122     $get_object_extension_was_run = 1;
1124     return $extension;
1127 # check_user_variables (@LIST)
1128 # ----------------------------
1129 # Make sure each variable VAR in @LIST do not exist, suggest using AM_VAR
1130 # otherwise.
1131 sub check_user_variables (@)
1133   my @dont_override = @_;
1134   foreach my $flag (@dont_override)
1135     {
1136       my $var = var $flag;
1137       if ($var)
1138         {
1139           for my $cond ($var->conditions->conds)
1140             {
1141               if ($var->rdef ($cond)->owner == VAR_MAKEFILE)
1142                 {
1143                   msg_cond_var ('gnu', $cond, $flag,
1144                                 "`$flag' is a user variable, "
1145                                 . "you should not override it;\n"
1146                                 . "use `AM_$flag' instead.");
1147                 }
1148             }
1149         }
1150     }
1153 # Call finish function for each language that was used.
1154 sub handle_languages
1156     if (! option 'no-dependencies')
1157     {
1158         # Include auto-dep code.  Don't include it if DEP_FILES would
1159         # be empty.
1160         if (&saw_sources_p (0) && keys %dep_files)
1161         {
1162             # Set location of depcomp.
1163             &define_variable ('depcomp',
1164                               "\$(SHELL) $am_config_aux_dir/depcomp",
1165                               INTERNAL);
1166             &define_variable ('am__depfiles_maybe', 'depfiles', INTERNAL);
1168             require_conf_file ("$am_file.am", FOREIGN, 'depcomp');
1170             my @deplist = sort keys %dep_files;
1171             # Generate each `include' individually.  Irix 6 make will
1172             # not properly include several files resulting from a
1173             # variable expansion; generating many separate includes
1174             # seems safest.
1175             $output_rules .= "\n";
1176             foreach my $iter (@deplist)
1177             {
1178                 $output_rules .= (subst ('AMDEP_TRUE')
1179                                   . subst ('am__include')
1180                                   . ' '
1181                                   . subst ('am__quote')
1182                                   . $iter
1183                                   . subst ('am__quote')
1184                                   . "\n");
1185             }
1187             # Compute the set of directories to remove in distclean-depend.
1188             my @depdirs = uniq (map { dirname ($_) } @deplist);
1189             $output_rules .= &file_contents ('depend',
1190                                              new Automake::Location,
1191                                              DEPDIRS => "@depdirs");
1192         }
1193     }
1194     else
1195     {
1196         &define_variable ('depcomp', '', INTERNAL);
1197         &define_variable ('am__depfiles_maybe', '', INTERNAL);
1198     }
1200     my %done;
1202     # Is the c linker needed?
1203     my $needs_c = 0;
1204     foreach my $ext (sort keys %extension_seen)
1205     {
1206         next unless $extension_map{$ext};
1208         my $lang = $languages{$extension_map{$ext}};
1210         my $rule_file = $lang->rule_file || 'depend2';
1212         # Get information on $LANG.
1213         my $pfx = $lang->autodep;
1214         my $fpfx = ($pfx eq '') ? 'CC' : $pfx;
1216         my ($AMDEP, $FASTDEP) =
1217           (option 'no-dependencies' || $lang->autodep eq 'no')
1218           ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx");
1220         my %transform = ('EXT'     => $ext,
1221                          'PFX'     => $pfx,
1222                          'FPFX'    => $fpfx,
1223                          'AMDEP'   => $AMDEP,
1224                          'FASTDEP' => $FASTDEP,
1225                          '-c'      => $lang->compile_flag || '',
1226                          # These are not used, but they need to be defined
1227                          # so &transform do not complain.
1228                          SUBDIROBJ     => 0,
1229                          'DERIVED-EXT' => 'BUG',
1230                          DIST_SOURCE   => 1,
1231                         );
1233         # Generate the appropriate rules for this extension.
1234         if (((! option 'no-dependencies') && $lang->autodep ne 'no')
1235             || defined $lang->compile)
1236         {
1237             # Some C compilers don't support -c -o.  Use it only if really
1238             # needed.
1239             my $output_flag = $lang->output_flag || '';
1240             $output_flag = '-o'
1241               if (! $output_flag
1242                   && $lang->name eq 'c'
1243                   && option 'subdir-objects');
1245             # Compute a possible derived extension.
1246             # This is not used by depend2.am.
1247             my $der_ext = (&{$lang->output_extensions} ($ext))[0];
1249             # When we output an inference rule like `.c.o:' we
1250             # have two cases to consider: either subdir-objects
1251             # is used, or it is not.
1252             #
1253             # In the latter case the rule is used to build objects
1254             # in the current directory, and dependencies always
1255             # go into `./$(DEPDIR)/'.  We can hard-code this value.
1256             #
1257             # In the former case the rule can be used to build
1258             # objects in sub-directories too.  Dependencies should
1259             # go into the appropriate sub-directories, e.g.,
1260             # `sub/$(DEPDIR)/'.  The value of this directory
1261             # need the be computed on-the-fly.
1262             #
1263             # DEPBASE holds the name of this directory, plus the
1264             # basename part of the object file (extensions Po, TPo,
1265             # Plo, TPlo will be added later as appropriate).  It is
1266             # either hardcoded, or a shell variable (`$depbase') that
1267             # will be computed by the rule.
1268             my $depbase =
1269               option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*';
1270             $output_rules .=
1271               file_contents ($rule_file,
1272                              new Automake::Location,
1273                              %transform,
1274                              GENERIC   => 1,
1276                              'DERIVED-EXT' => $der_ext,
1278                              DEPBASE   => $depbase,
1279                              BASE      => '$*',
1280                              SOURCE    => '$<',
1281                              OBJ       => '$@',
1282                              OBJOBJ    => '$@',
1283                              LTOBJ     => '$@',
1285                              COMPILE   => '$(' . $lang->compiler . ')',
1286                              LTCOMPILE => '$(LT' . $lang->compiler . ')',
1287                              -o        => $output_flag,
1288                              SUBDIROBJ => !! option 'subdir-objects');
1289         }
1291         # Now include code for each specially handled object with this
1292         # language.
1293         my %seen_files = ();
1294         foreach my $file (@{$lang_specific_files{$lang->name}})
1295         {
1296             my ($derived, $source, $obj, $myext, %file_transform) = @$file;
1298             # We might see a given object twice, for instance if it is
1299             # used under different conditions.
1300             next if defined $seen_files{$obj};
1301             $seen_files{$obj} = 1;
1303             prog_error ("found " . $lang->name .
1304                         " in handle_languages, but compiler not defined")
1305               unless defined $lang->compile;
1307             my $obj_compile = $lang->compile;
1309             # Rewrite each occurrence of `AM_$flag' in the compile
1310             # rule into `${derived}_$flag' if it exists.
1311             for my $flag (@{$lang->flags})
1312               {
1313                 my $val = "${derived}_$flag";
1314                 $obj_compile =~ s/\(AM_$flag\)/\($val\)/
1315                   if set_seen ($val);
1316               }
1318             my $libtool_tag = '';
1319             if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag})
1320               {
1321                 $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
1322               }
1324             my $ptltflags = "${derived}_LIBTOOLFLAGS";
1325             $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags;
1327             my $obj_ltcompile =
1328               "\$(LIBTOOL) $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) "
1329               . "--mode=compile $obj_compile";
1331             # We _need_ `-o' for per object rules.
1332             my $output_flag = $lang->output_flag || '-o';
1334             my $depbase = dirname ($obj);
1335             $depbase = ''
1336                 if $depbase eq '.';
1337             $depbase .= '/'
1338                 unless $depbase eq '';
1339             $depbase .= '$(DEPDIR)/' . basename ($obj);
1341             # Support for deansified files in subdirectories is ugly
1342             # enough to deserve an explanation.
1343             #
1344             # A Note about normal ansi2knr processing first.  On
1345             #
1346             #   AUTOMAKE_OPTIONS = ansi2knr
1347             #   bin_PROGRAMS = foo
1348             #   foo_SOURCES = foo.c
1349             #
1350             # we generate rules similar to:
1351             #
1352             #   foo: foo$U.o; link ...
1353             #   foo$U.o: foo$U.c; compile ...
1354             #   foo_.c: foo.c; ansi2knr ...
1355             #
1356             # this is fairly compact, and will call ansi2knr depending
1357             # on the value of $U (`' or `_').
1358             #
1359             # It's harder with subdir sources. On
1360             #
1361             #   AUTOMAKE_OPTIONS = ansi2knr
1362             #   bin_PROGRAMS = foo
1363             #   foo_SOURCES = sub/foo.c
1364             #
1365             # we have to create foo_.c in the current directory.
1366             # (Unless the user asks 'subdir-objects'.)  This is important
1367             # in case the same file (`foo.c') is compiled from other
1368             # directories with different cpp options: foo_.c would
1369             # be preprocessed for only one set of options if it were
1370             # put in the subdirectory.
1371             #
1372             # Because foo$U.o must be built from either foo_.c or
1373             # sub/foo.c we can't be as concise as in the first example.
1374             # Instead we output
1375             #
1376             #   foo: foo$U.o; link ...
1377             #   foo_.o: foo_.c; compile ...
1378             #   foo.o: sub/foo.c; compile ...
1379             #   foo_.c: foo.c; ansi2knr ...
1380             #
1381             # This is why we'll now transform $rule_file twice
1382             # if we detect this case.
1383             # A first time we output the compile rule with `$U'
1384             # replaced by `_' and the source directory removed,
1385             # and another time we simply remove `$U'.
1386             #
1387             # Note that at this point $source (as computed by
1388             # &handle_single_transform) is `sub/foo$U.c'.
1389             # This can be confusing: it can be used as-is when
1390             # subdir-objects is set, otherwise you have to know
1391             # it really means `foo_.c' or `sub/foo.c'.
1392             my $objdir = dirname ($obj);
1393             my $srcdir = dirname ($source);
1394             if ($lang->ansi && $obj =~ /\$U/)
1395               {
1396                 prog_error "`$obj' contains \$U, but `$source' doesn't."
1397                   if $source !~ /\$U/;
1399                 (my $source_ = $source) =~ s/\$U/_/g;
1400                 # Output an additional rule if _.c and .c are not in
1401                 # the same directory.  (_.c is always in $objdir.)
1402                 if ($objdir ne $srcdir)
1403                   {
1404                     (my $obj_ = $obj) =~ s/\$U/_/g;
1405                     (my $depbase_ = $depbase) =~ s/\$U/_/g;
1406                     $source_ = basename ($source_);
1408                     $output_rules .=
1409                       file_contents ($rule_file,
1410                                      new Automake::Location,
1411                                      %transform,
1412                                      GENERIC   => 0,
1414                                      DEPBASE   => $depbase_,
1415                                      BASE      => $obj_,
1416                                      SOURCE    => $source_,
1417                                      OBJ       => "$obj_$myext",
1418                                      OBJOBJ    => "$obj_.obj",
1419                                      LTOBJ     => "$obj_.lo",
1421                                      COMPILE   => $obj_compile,
1422                                      LTCOMPILE => $obj_ltcompile,
1423                                      -o        => $output_flag,
1424                                      %file_transform);
1425                     $obj =~ s/\$U//g;
1426                     $depbase =~ s/\$U//g;
1427                     $source =~ s/\$U//g;
1428                   }
1429               }
1431             $output_rules .=
1432               file_contents ($rule_file,
1433                              new Automake::Location,
1434                              %transform,
1435                              GENERIC   => 0,
1437                              DEPBASE   => $depbase,
1438                              BASE      => $obj,
1439                              SOURCE    => $source,
1440                              # Use $myext and not `.o' here, in case
1441                              # we are actually building a new source
1442                              # file -- e.g. via yacc.
1443                              OBJ       => "$obj$myext",
1444                              OBJOBJ    => "$obj.obj",
1445                              LTOBJ     => "$obj.lo",
1447                              COMPILE   => $obj_compile,
1448                              LTCOMPILE => $obj_ltcompile,
1449                              -o        => $output_flag,
1450                              %file_transform);
1451         }
1453         # The rest of the loop is done once per language.
1454         next if defined $done{$lang};
1455         $done{$lang} = 1;
1457         # Load the language dependent Makefile chunks.
1458         my %lang = map { uc ($_) => 0 } keys %languages;
1459         $lang{uc ($lang->name)} = 1;
1460         $output_rules .= file_contents ('lang-compile',
1461                                         new Automake::Location,
1462                                         %transform, %lang);
1464         # If the source to a program consists entirely of code from a
1465         # `pure' language, for instance C++ or Fortran 77, then we
1466         # don't need the C compiler code.  However if we run into
1467         # something unusual then we do generate the C code.  There are
1468         # probably corner cases here that do not work properly.
1469         # People linking Java code to Fortran code deserve pain.
1470         $needs_c ||= ! $lang->pure;
1472         define_compiler_variable ($lang)
1473           if ($lang->compile);
1475         define_linker_variable ($lang)
1476           if ($lang->link);
1478         require_variables ("$am_file.am", $lang->Name . " source seen",
1479                            TRUE, @{$lang->config_vars});
1481         # Call the finisher.
1482         $lang->finish;
1484         # Flags listed in `->flags' are user variables (per GNU Standards),
1485         # they should not be overridden in the Makefile...
1486         my @dont_override = @{$lang->flags};
1487         # ... and so is LDFLAGS.
1488         push @dont_override, 'LDFLAGS' if $lang->link;
1490         check_user_variables @dont_override;
1491     }
1493     # If the project is entirely C++ or entirely Fortran 77 (i.e., 1
1494     # suffix rule was learned), don't bother with the C stuff.  But if
1495     # anything else creeps in, then use it.
1496     $needs_c = 1
1497       if $need_link || suffix_rules_count > 1;
1499     if ($needs_c)
1500       {
1501         &define_compiler_variable ($languages{'c'})
1502           unless defined $done{$languages{'c'}};
1503         define_linker_variable ($languages{'c'});
1504       }
1508 # append_exeext { PREDICATE } $MACRO
1509 # ----------------------------------
1510 # Append $(EXEEXT) to each filename in $F appearing in the Makefile
1511 # variable $MACRO if &PREDICATE($F) is true.  @substitutions@ are
1512 # ignored.
1514 # This is typically used on all filenames of *_PROGRAMS, and filenames
1515 # of TESTS that are programs.
1516 sub append_exeext (&$)
1518   my ($pred, $macro) = @_;
1520   transform_variable_recursively
1521     ($macro, $macro, 'am__EXEEXT', 0, INTERNAL,
1522      sub {
1523        my ($subvar, $val, $cond, $full_cond) = @_;
1524        # Append $(EXEEXT) unless the user did it already, or it's a
1525        # @substitution@.
1526        $val .= '$(EXEEXT)'
1527          if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val);
1528        return $val;
1529      });
1533 # Check to make sure a source defined in LIBOBJS is not explicitly
1534 # mentioned.  This is a separate function (as opposed to being inlined
1535 # in handle_source_transform) because it isn't always appropriate to
1536 # do this check.
1537 sub check_libobjs_sources
1539   my ($one_file, $unxformed) = @_;
1541   foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
1542                       'dist_EXTRA_', 'nodist_EXTRA_')
1543     {
1544       my @files;
1545       my $varname = $prefix . $one_file . '_SOURCES';
1546       my $var = var ($varname);
1547       if ($var)
1548         {
1549           @files = $var->value_as_list_recursive;
1550         }
1551       elsif ($prefix eq '')
1552         {
1553           @files = ($unxformed . '.c');
1554         }
1555       else
1556         {
1557           next;
1558         }
1560       foreach my $file (@files)
1561         {
1562           err_var ($prefix . $one_file . '_SOURCES',
1563                    "automatically discovered file `$file' should not" .
1564                    " be explicitly mentioned")
1565             if defined $libsources{$file};
1566         }
1567     }
1571 # @OBJECTS
1572 # handle_single_transform ($VAR, $TOPPARENT, $DERIVED, $OBJ, $FILE, %TRANSFORM)
1573 # -----------------------------------------------------------------------------
1574 # Does much of the actual work for handle_source_transform.
1575 # Arguments are:
1576 #   $VAR is the name of the variable that the source filenames come from
1577 #   $TOPPARENT is the name of the _SOURCES variable which is being processed
1578 #   $DERIVED is the name of resulting executable or library
1579 #   $OBJ is the object extension (e.g., `$U.lo')
1580 #   $FILE the source file to transform
1581 #   %TRANSFORM contains extras arguments to pass to file_contents
1582 #     when producing explicit rules
1583 # Result is a list of the names of objects
1584 # %linkers_used will be updated with any linkers needed
1585 sub handle_single_transform ($$$$$%)
1587     my ($var, $topparent, $derived, $obj, $_file, %transform) = @_;
1588     my @files = ($_file);
1589     my @result = ();
1590     my $nonansi_obj = $obj;
1591     $nonansi_obj =~ s/\$U//g;
1593     # Turn sources into objects.  We use a while loop like this
1594     # because we might add to @files in the loop.
1595     while (scalar @files > 0)
1596     {
1597         $_ = shift @files;
1599         # Configure substitutions in _SOURCES variables are errors.
1600         if (/^\@.*\@$/)
1601         {
1602           my $parent_msg = '';
1603           $parent_msg = "\nand is referred to from `$topparent'"
1604             if $topparent ne $var->name;
1605           err_var ($var,
1606                    "`" . $var->name . "' includes configure substitution `$_'"
1607                    . $parent_msg . ";\nconfigure " .
1608                    "substitutions are not allowed in _SOURCES variables");
1609           next;
1610         }
1612         # If the source file is in a subdirectory then the `.o' is put
1613         # into the current directory, unless the subdir-objects option
1614         # is in effect.
1616         # Split file name into base and extension.
1617         next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/;
1618         my $full = $_;
1619         my $directory = $1 || '';
1620         my $base = $2;
1621         my $extension = $3;
1623         # We must generate a rule for the object if it requires its own flags.
1624         my $renamed = 0;
1625         my ($linker, $object);
1627         # This records whether we've seen a derived source file (e.g.
1628         # yacc output).
1629         my $derived_source = 0;
1631         # This holds the `aggregate context' of the file we are
1632         # currently examining.  If the file is compiled with
1633         # per-object flags, then it will be the name of the object.
1634         # Otherwise it will be `AM'.  This is used by the target hook
1635         # language function.
1636         my $aggregate = 'AM';
1638         $extension = &derive_suffix ($extension, $nonansi_obj);
1639         my $lang;
1640         if ($extension_map{$extension} &&
1641             ($lang = $languages{$extension_map{$extension}}))
1642         {
1643             # Found the language, so see what it says.
1644             &saw_extension ($extension);
1646             # Do we have per-executable flags for this executable?
1647             my $have_per_exec_flags = 0;
1648             my @peflags = @{$lang->flags};
1649             push @peflags, 'LIBTOOLFLAGS' if $nonansi_obj eq '.lo';
1650             foreach my $flag (@peflags)
1651               {
1652                 if (set_seen ("${derived}_$flag"))
1653                   {
1654                     $have_per_exec_flags = 1;
1655                     last;
1656                   }
1657               }
1659             # Note: computed subr call.  The language rewrite function
1660             # should return one of the LANG_* constants.  It could
1661             # also return a list whose first value is such a constant
1662             # and whose second value is a new source extension which
1663             # should be applied.  This means this particular language
1664             # generates another source file which we must then process
1665             # further.
1666             my $subr = \&{'lang_' . $lang->name . '_rewrite'};
1667             my ($r, $source_extension)
1668                 = &$subr ($directory, $base, $extension,
1669                           $nonansi_obj, $have_per_exec_flags, $var);
1670             # Skip this entry if we were asked not to process it.
1671             next if $r == LANG_IGNORE;
1673             # Now extract linker and other info.
1674             $linker = $lang->linker;
1676             my $this_obj_ext;
1677             if (defined $source_extension)
1678             {
1679                 $this_obj_ext = $source_extension;
1680                 $derived_source = 1;
1681             }
1682             elsif ($lang->ansi)
1683             {
1684                 $this_obj_ext = $obj;
1685             }
1686             else
1687             {
1688                 $this_obj_ext = $nonansi_obj;
1689             }
1690             $object = $base . $this_obj_ext;
1692             if ($have_per_exec_flags)
1693             {
1694                 # We have a per-executable flag in effect for this
1695                 # object.  In this case we rewrite the object's
1696                 # name to ensure it is unique.
1698                 # We choose the name `DERIVED_OBJECT' to ensure
1699                 # (1) uniqueness, and (2) continuity between
1700                 # invocations.  However, this will result in a
1701                 # name that is too long for losing systems, in
1702                 # some situations.  So we provide _SHORTNAME to
1703                 # override.
1705                 my $dname = $derived;
1706                 my $var = var ($derived . '_SHORTNAME');
1707                 if ($var)
1708                 {
1709                     # FIXME: should use the same Condition as
1710                     # the _SOURCES variable.  But this is really
1711                     # silly overkill -- nobody should have
1712                     # conditional shortnames.
1713                     $dname = $var->variable_value;
1714                 }
1715                 $object = $dname . '-' . $object;
1717                 prog_error ($lang->name . " flags defined without compiler")
1718                   if ! defined $lang->compile;
1720                 $renamed = 1;
1721             }
1723             # If rewrite said it was ok, put the object into a
1724             # subdir.
1725             if ($r == LANG_SUBDIR && $directory ne '')
1726             {
1727                 $object = $directory . '/' . $object;
1728             }
1730             # If the object file has been renamed (because per-target
1731             # flags are used) we cannot compile the file with an
1732             # inference rule: we need an explicit rule.
1733             #
1734             # If the source is in a subdirectory and the object is in
1735             # the current directory, we also need an explicit rule.
1736             #
1737             # If both source and object files are in a subdirectory
1738             # (this happens when the subdir-objects option is used),
1739             # then the inference will work.
1740             #
1741             # The latter case deserves a historical note.  When the
1742             # subdir-objects option was added on 1999-04-11 it was
1743             # thought that inferences rules would work for
1744             # subdirectory objects too.  Later, on 1999-11-22,
1745             # automake was changed to output explicit rules even for
1746             # subdir-objects.  Nobody remembers why, but this occured
1747             # soon after the merge of the user-dep-gen-branch so it
1748             # might be related.  In late 2003 people complained about
1749             # the size of the generated Makefile.ins (libgcj, with
1750             # 2200+ subdir objects was reported to have a 9MB
1751             # Makefile), so we now rely on inference rules again.
1752             # Maybe we'll run across the same issue as in the past,
1753             # but at least this time we can document it.  However since
1754             # dependency tracking has evolved it is possible that
1755             # our old problem no longer exists.
1756             # Using inference rules for subdir-objects has been tested
1757             # with GNU make, Solaris make, Ultrix make, BSD make,
1758             # HP-UX make, and OSF1 make successfully.
1759             if ($renamed
1760                 || ($directory ne '' && ! option 'subdir-objects')
1761                 # We must also use specific rules for a nodist_ source
1762                 # if its language requests it.
1763                 || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'}))
1764             {
1765                 my $obj_sans_ext = substr ($object, 0,
1766                                            - length ($this_obj_ext));
1767                 my $full_ansi = $full;
1768                 if ($lang->ansi && option 'ansi2knr')
1769                   {
1770                     $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/;
1771                     $obj_sans_ext .= '$U';
1772                   }
1774                 my @specifics = ($full_ansi, $obj_sans_ext,
1775                                  # Only use $this_obj_ext in the derived
1776                                  # source case because in the other case we
1777                                  # *don't* want $(OBJEXT) to appear here.
1778                                  ($derived_source ? $this_obj_ext : '.o'));
1780                 # If we renamed the object then we want to use the
1781                 # per-executable flag name.  But if this is simply a
1782                 # subdir build then we still want to use the AM_ flag
1783                 # name.
1784                 if ($renamed)
1785                   {
1786                     unshift @specifics, $derived;
1787                     $aggregate = $derived;
1788                   }
1789                 else
1790                   {
1791                     unshift @specifics, 'AM';
1792                   }
1794                 # Each item on this list is a reference to a list consisting
1795                 # of four values followed by additional transform flags for
1796                 # file_contents.   The four values are the derived flag prefix
1797                 # (e.g. for `foo_CFLAGS', it is `foo'), the name of the
1798                 # source file, the base name of the output file, and
1799                 # the extension for the object file.
1800                 push (@{$lang_specific_files{$lang->name}},
1801                       [@specifics, %transform]);
1802             }
1803         }
1804         elsif ($extension eq $nonansi_obj)
1805         {
1806             # This is probably the result of a direct suffix rule.
1807             # In this case we just accept the rewrite.
1808             $object = "$base$extension";
1809             $object = "$directory/$object" if $directory ne '';
1810             $linker = '';
1811         }
1812         else
1813         {
1814             # No error message here.  Used to have one, but it was
1815             # very unpopular.
1816             # FIXME: we could potentially do more processing here,
1817             # perhaps treating the new extension as though it were a
1818             # new source extension (as above).  This would require
1819             # more restructuring than is appropriate right now.
1820             next;
1821         }
1823         err_am "object `$object' created by `$full' and `$object_map{$object}'"
1824           if (defined $object_map{$object}
1825               && $object_map{$object} ne $full);
1827         my $comp_val = (($object =~ /\.lo$/)
1828                         ? COMPILE_LIBTOOL : COMPILE_ORDINARY);
1829         (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/;
1830         if (defined $object_compilation_map{$comp_obj}
1831             && $object_compilation_map{$comp_obj} != 0
1832             # Only see the error once.
1833             && ($object_compilation_map{$comp_obj}
1834                 != (COMPILE_LIBTOOL | COMPILE_ORDINARY))
1835             && $object_compilation_map{$comp_obj} != $comp_val)
1836           {
1837             err_am "object `$comp_obj' created both with libtool and without";
1838           }
1839         $object_compilation_map{$comp_obj} |= $comp_val;
1841         if (defined $lang)
1842         {
1843             # Let the language do some special magic if required.
1844             $lang->target_hook ($aggregate, $object, $full, %transform);
1845         }
1847         if ($derived_source)
1848           {
1849             prog_error ($lang->name . " has automatic dependency tracking")
1850               if $lang->autodep ne 'no';
1851             # Make sure this new source file is handled next.  That will
1852             # make it appear to be at the right place in the list.
1853             unshift (@files, $object);
1854             # Distribute derived sources unless the source they are
1855             # derived from is not.
1856             &push_dist_common ($object)
1857               unless ($topparent =~ /^(?:nobase_)?nodist_/);
1858             next;
1859           }
1861         $linkers_used{$linker} = 1;
1863         push (@result, $object);
1865         if (! defined $object_map{$object})
1866         {
1867             my @dep_list = ();
1868             $object_map{$object} = $full;
1870             # If resulting object is in subdir, we need to make
1871             # sure the subdir exists at build time.
1872             if ($object =~ /\//)
1873             {
1874                 # FIXME: check that $DIRECTORY is somewhere in the
1875                 # project
1877                 # For Java, the way we're handling it right now, a
1878                 # `..' component doesn't make sense.
1879                 if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//)
1880                   {
1881                     err_am "`$full' should not contain a `..' component";
1882                   }
1884                 # Make sure object is removed by `make mostlyclean'.
1885                 $compile_clean_files{$object} = MOSTLY_CLEAN;
1886                 # If we have a libtool object then we also must remove
1887                 # the ordinary .o.
1888                 if ($object =~ /\.lo$/)
1889                 {
1890                     (my $xobj = $object) =~ s,lo$,\$(OBJEXT),;
1891                     $compile_clean_files{$xobj} = MOSTLY_CLEAN;
1893                     # Remove any libtool object in this directory.
1894                     $libtool_clean_directories{$directory} = 1;
1895                 }
1897                 push (@dep_list, require_build_directory ($directory));
1899                 # If we're generating dependencies, we also want
1900                 # to make sure that the appropriate subdir of the
1901                 # .deps directory is created.
1902                 push (@dep_list,
1903                       require_build_directory ($directory . '/$(DEPDIR)'))
1904                   unless option 'no-dependencies';
1905             }
1907             &pretty_print_rule ($object . ':', "\t", @dep_list)
1908                 if scalar @dep_list > 0;
1909         }
1911         # Transform .o or $o file into .P file (for automatic
1912         # dependency code).
1913         if ($lang && $lang->autodep ne 'no')
1914         {
1915             my $depfile = $object;
1916             $depfile =~ s/\.([^.]*)$/.P$1/;
1917             $depfile =~ s/\$\(OBJEXT\)$/o/;
1918             $dep_files{dirname ($depfile) . '/$(DEPDIR)/'
1919                          . basename ($depfile)} = 1;
1920         }
1921     }
1923     return @result;
1927 # $LINKER
1928 # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE,
1929 #                              $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM)
1930 # ---------------------------------------------------------------------------
1931 # Define an _OBJECTS variable for a _SOURCES variable (or subvariable)
1933 # Arguments are:
1934 #   $VAR is the name of the _SOURCES variable
1935 #   $OBJVAR is the name of the _OBJECTS variable if known (otherwise
1936 #     it will be generated and returned).
1937 #   $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but
1938 #     work done to determine the linker will be).
1939 #   $ONE_FILE is the canonical (transformed) name of object to build
1940 #   $OBJ is the object extension (i.e. either `.o' or `.lo').
1941 #   $TOPPARENT is the _SOURCES variable being processed.
1942 #   $WHERE context into which this definition is done
1943 #   %TRANSFORM extra arguments to pass to file_contents when producing
1944 #     rules
1946 # Result is a pair ($LINKER, $OBJVAR):
1947 #    $LINKER is a boolean, true if a linker is needed to deal with the objects
1948 sub define_objects_from_sources ($$$$$$$%)
1950   my ($var, $objvar, $nodefine, $one_file,
1951       $obj, $topparent, $where, %transform) = @_;
1953   my $needlinker = "";
1955   transform_variable_recursively
1956     ($var, $objvar, 'am__objects', $nodefine, $where,
1957      # The transform code to run on each filename.
1958      sub {
1959        my ($subvar, $val, $cond, $full_cond) = @_;
1960        my @trans = handle_single_transform ($subvar, $topparent,
1961                                             $one_file, $obj, $val,
1962                                             %transform);
1963        $needlinker = "true" if @trans;
1964        return @trans;
1965      });
1967   return $needlinker;
1971 # handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM)
1972 # -----------------------------------------------------------------------------
1973 # Handle SOURCE->OBJECT transform for one program or library.
1974 # Arguments are:
1975 #   canonical (transformed) name of target to build
1976 #   actual target of object to build
1977 #   object extension (i.e., either `.o' or `$o')
1978 #   location of the source variable
1979 #   extra arguments to pass to file_contents when producing rules
1980 # Return the name of the linker variable that must be used.
1981 # Empty return means just use `LINK'.
1982 sub handle_source_transform ($$$$%)
1984     # one_file is canonical name.  unxformed is given name.  obj is
1985     # object extension.
1986     my ($one_file, $unxformed, $obj, $where, %transform) = @_;
1988     my $linker = '';
1990     # No point in continuing if _OBJECTS is defined.
1991     return if reject_var ($one_file . '_OBJECTS',
1992                           $one_file . '_OBJECTS should not be defined');
1994     my %used_pfx = ();
1995     my $needlinker;
1996     %linkers_used = ();
1997     foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_',
1998                         'dist_EXTRA_', 'nodist_EXTRA_')
1999     {
2000         my $varname = $prefix . $one_file . "_SOURCES";
2001         my $var = var $varname;
2002         next unless $var;
2004         # We are going to define _OBJECTS variables using the prefix.
2005         # Then we glom them all together.  So we can't use the null
2006         # prefix here as we need it later.
2007         my $xpfx = ($prefix eq '') ? 'am_' : $prefix;
2009         # Keep track of which prefixes we saw.
2010         $used_pfx{$xpfx} = 1
2011           unless $prefix =~ /EXTRA_/;
2013         push @sources, "\$($varname)";
2014         push @dist_sources, shadow_unconditionally ($varname, $where)
2015           unless (option ('no-dist') || $prefix =~ /^nodist_/);
2017         $needlinker |=
2018             define_objects_from_sources ($varname,
2019                                          $xpfx . $one_file . '_OBJECTS',
2020                                          $prefix =~ /EXTRA_/,
2021                                          $one_file, $obj, $varname, $where,
2022                                          DIST_SOURCE => ($prefix !~ /^nodist_/),
2023                                          %transform);
2024     }
2025     if ($needlinker)
2026     {
2027         $linker ||= &resolve_linker (%linkers_used);
2028     }
2030     my @keys = sort keys %used_pfx;
2031     if (scalar @keys == 0)
2032     {
2033         # The default source for libfoo.la is libfoo.c, but for
2034         # backward compatibility we first look at libfoo_la.c
2035         my $old_default_source = "$one_file.c";
2036         (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,.c,;
2037         if ($old_default_source ne $default_source
2038             && (rule $old_default_source
2039                 || rule '$(srcdir)/' . $old_default_source
2040                 || rule '${srcdir}/' . $old_default_source
2041                 || -f $old_default_source))
2042           {
2043             my $loc = $where->clone;
2044             $loc->pop_context;
2045             msg ('obsolete', $loc,
2046                  "the default source for `$unxformed' has been changed "
2047                  . "to `$default_source'.\n(Using `$old_default_source' for "
2048                  . "backward compatibility.)");
2049             $default_source = $old_default_source;
2050           }
2051         # If a rule exists to build this source with a $(srcdir)
2052         # prefix, use that prefix in our variables too.  This is for
2053         # the sake of BSD Make.
2054         if (rule '$(srcdir)/' . $default_source
2055             || rule '${srcdir}/' . $default_source)
2056           {
2057             $default_source = '$(srcdir)/' . $default_source;
2058           }
2060         &define_variable ($one_file . "_SOURCES", $default_source, $where);
2061         push (@sources, $default_source);
2062         push (@dist_sources, $default_source);
2064         %linkers_used = ();
2065         my (@result) =
2066           handle_single_transform ($one_file . '_SOURCES',
2067                                    $one_file . '_SOURCES',
2068                                    $one_file, $obj,
2069                                    $default_source, %transform);
2070         $linker ||= &resolve_linker (%linkers_used);
2071         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result);
2072     }
2073     else
2074     {
2075         @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys;
2076         define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys);
2077     }
2079     # If we want to use `LINK' we must make sure it is defined.
2080     if ($linker eq '')
2081     {
2082         $need_link = 1;
2083     }
2085     return $linker;
2089 # handle_lib_objects ($XNAME, $VAR)
2090 # ---------------------------------
2091 # Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables.
2092 # Also, generate _DEPENDENCIES variable if appropriate.
2093 # Arguments are:
2094 #   transformed name of object being built, or empty string if no object
2095 #   name of _LDADD/_LIBADD-type variable to examine
2096 # Returns 1 if LIBOBJS seen, 0 otherwise.
2097 sub handle_lib_objects
2099   my ($xname, $varname) = @_;
2101   my $var = var ($varname);
2102   prog_error "handle_lib_objects: `$varname' undefined"
2103     unless $var;
2104   prog_error "handle_lib_objects: unexpected variable name `$varname'"
2105     unless $varname =~ /^(.*)(?:LIB|LD)ADD$/;
2106   my $prefix = $1 || 'AM_';
2108   my $seen_libobjs = 0;
2109   my $flagvar = 0;
2111   transform_variable_recursively
2112     ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES',
2113      ! $xname, INTERNAL,
2114      # Transformation function, run on each filename.
2115      sub {
2116        my ($subvar, $val, $cond, $full_cond) = @_;
2118        if ($val =~ /^-/)
2119          {
2120            # Skip -lfoo and -Ldir silently; these are explicitly allowed.
2121            if ($val !~ /^-[lL]/ &&
2122                # Skip -dlopen and -dlpreopen; these are explicitly allowed
2123                # for Libtool libraries or programs.  (Actually we are a bit
2124                # laxest here since this code also applies to non-libtool
2125                # libraries or programs, for which -dlopen and -dlopreopen
2126                # are pure non-sence.  Diagnosting this doesn't seems very
2127                # important: the developer will quickly get complaints from
2128                # the linker.)
2129                $val !~ /^-dl(?:pre)?open$/ &&
2130                # Only get this error once.
2131                ! $flagvar)
2132              {
2133                $flagvar = 1;
2134                # FIXME: should display a stack of nested variables
2135                # as context when $var != $subvar.
2136                err_var ($var, "linker flags such as `$val' belong in "
2137                         . "`${prefix}LDFLAGS");
2138              }
2139            return ();
2140          }
2141        elsif ($val !~ /^\@.*\@$/)
2142          {
2143            # Assume we have a file of some sort, and output it into the
2144            # dependency variable.  Autoconf substitutions are not output;
2145            # rarely is a new dependency substituted into e.g. foo_LDADD
2146            # -- but bad things (e.g. -lX11) are routinely substituted.
2147            # Note that LIBOBJS and ALLOCA are exceptions to this rule,
2148            # and handled specially below.
2149            return $val;
2150          }
2151        elsif ($val =~ /^\@(LT)?LIBOBJS\@$/)
2152          {
2153            handle_LIBOBJS ($subvar, $cond, $1);
2154            $seen_libobjs = 1;
2155            return $val;
2156          }
2157        elsif ($val =~ /^\@(LT)?ALLOCA\@$/)
2158          {
2159            handle_ALLOCA ($subvar, $cond, $1);
2160            return $val;
2161          }
2162        else
2163          {
2164            return ();
2165          }
2166      });
2168   return $seen_libobjs;
2171 # handle_LIBOBJS_or_ALLOCA ($VAR)
2172 # -------------------------------
2173 # Definitions common to LIBOBJS and ALLOCA.
2174 # VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA.
2175 sub handle_LIBOBJS_or_ALLOCA ($)
2177   my ($var) = @_;
2179   my $dir = $config_libobj_dir ? "$config_libobj_dir/" : '';
2181   # If LIBOBJS files must be built in another directory we have
2182   # to define LIBOBJDIR and ensure the files get cleaned.
2183   # Otherwise LIBOBJDIR can be left undefined, and the cleaning
2184   # is achieved by `rm -f *.($OBJEXT)' in compile.am.
2185   if ($config_libobj_dir
2186       && $relative_dir ne $config_libobj_dir)
2187     {
2188       if (option 'subdir-objects')
2189         {
2190           # In the top-level Makefile we do not use $(top_builddir), because
2191           # we are already there, and since the targets are built without
2192           # a $(top_builddir), it helps BSD Make to match them with
2193           # dependencies.
2194           $dir = "$topsrcdir/$dir" if $relative_dir ne '.';
2195           define_variable ('LIBOBJDIR', "$dir", INTERNAL);
2196           $clean_files{"\$($var)"} = MOSTLY_CLEAN;
2197           # If LTLIBOBJS is used, we must also clear LIBOBJS (which might
2198           # be created by libtool as a side-effect of creating LTLIBOBJS).
2199           $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//;
2201         }
2202       else
2203         {
2204           error ("`\$($var)' cannot be used outside `$dir' if"
2205                  . " `subdir-objects' is not set");
2206         }
2207     }
2209   return $dir;
2212 sub handle_LIBOBJS ($$$)
2214   my ($var, $cond, $lt) = @_;
2215   my $myobjext = $lt ? 'lo' : 'o';
2216   $lt ||= '';
2218   $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS')
2219     if ! keys %libsources;
2221   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}LIBOBJS";
2223   foreach my $iter (keys %libsources)
2224     {
2225       if ($iter =~ /\.[cly]$/)
2226         {
2227           &saw_extension ($&);
2228           &saw_extension ('.c');
2229         }
2231       if ($iter =~ /\.h$/)
2232         {
2233           require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2234         }
2235       elsif ($iter ne 'alloca.c')
2236         {
2237           my $rewrite = $iter;
2238           $rewrite =~ s/\.c$/.P$myobjext/;
2239           $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1;
2240           $rewrite = "^" . quotemeta ($iter) . "\$";
2241           # Only require the file if it is not a built source.
2242           my $bs = var ('BUILT_SOURCES');
2243           if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive))
2244             {
2245               require_libsource_with_macro ($cond, $var, FOREIGN, $iter);
2246             }
2247         }
2248     }
2251 sub handle_ALLOCA ($$$)
2253   my ($var, $cond, $lt) = @_;
2254   my $myobjext = $lt ? 'lo' : 'o';
2255   $lt ||= '';
2256   my $dir = handle_LIBOBJS_or_ALLOCA "${lt}ALLOCA";
2258   $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA');
2259   $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1;
2260   require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c');
2261   &saw_extension ('.c');
2264 # Canonicalize the input parameter
2265 sub canonicalize
2267     my ($string) = @_;
2268     $string =~ tr/A-Za-z0-9_\@/_/c;
2269     return $string;
2272 # Canonicalize a name, and check to make sure the non-canonical name
2273 # is never used.  Returns canonical name.  Arguments are name and a
2274 # list of suffixes to check for.
2275 sub check_canonical_spelling
2277   my ($name, @suffixes) = @_;
2279   my $xname = &canonicalize ($name);
2280   if ($xname ne $name)
2281     {
2282       foreach my $xt (@suffixes)
2283         {
2284           reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'");
2285         }
2286     }
2288   return $xname;
2292 # handle_compile ()
2293 # -----------------
2294 # Set up the compile suite.
2295 sub handle_compile ()
2297     return
2298       unless $get_object_extension_was_run;
2300     # Boilerplate.
2301     my $default_includes = '';
2302     if (! option 'nostdinc')
2303       {
2304         $default_includes = ' -I. -I$(srcdir)';
2306         my $var = var 'CONFIG_HEADER';
2307         if ($var)
2308           {
2309             foreach my $hdr (split (' ', $var->variable_value))
2310               {
2311                 $default_includes .= ' -I' . dirname ($hdr);
2312               }
2313           }
2314       }
2316     my (@mostly_rms, @dist_rms);
2317     foreach my $item (sort keys %compile_clean_files)
2318     {
2319         if ($compile_clean_files{$item} == MOSTLY_CLEAN)
2320         {
2321             push (@mostly_rms, "\t-rm -f $item");
2322         }
2323         elsif ($compile_clean_files{$item} == DIST_CLEAN)
2324         {
2325             push (@dist_rms, "\t-rm -f $item");
2326         }
2327         else
2328         {
2329           prog_error 'invalid entry in %compile_clean_files';
2330         }
2331     }
2333     my ($coms, $vars, $rules) =
2334       &file_contents_internal (1, "$libdir/am/compile.am",
2335                                new Automake::Location,
2336                                ('DEFAULT_INCLUDES' => $default_includes,
2337                                 'MOSTLYRMS' => join ("\n", @mostly_rms),
2338                                 'DISTRMS' => join ("\n", @dist_rms)));
2339     $output_vars .= $vars;
2340     $output_rules .= "$coms$rules";
2342     # Check for automatic de-ANSI-fication.
2343     if (option 'ansi2knr')
2344       {
2345         my ($ansi2knr_filename, $ansi2knr_where) = @{option 'ansi2knr'};
2346         my $ansi2knr_dir = '';
2348         require_variables ($ansi2knr_where, "option `ansi2knr' is used",
2349                            TRUE, "ANSI2KNR", "U");
2351         # topdir is where ansi2knr should be.
2352         if ($ansi2knr_filename eq 'ansi2knr')
2353           {
2354             # Only require ansi2knr files if they should appear in
2355             # this directory.
2356             require_file ($ansi2knr_where, FOREIGN,
2357                           'ansi2knr.c', 'ansi2knr.1');
2359             # ansi2knr needs to be built before subdirs, so unshift it.
2360             unshift (@all, '$(ANSI2KNR)');
2361           }
2362         else
2363           {
2364             $ansi2knr_dir = dirname ($ansi2knr_filename);
2365           }
2367         $output_rules .= &file_contents ('ansi2knr',
2368                                          new Automake::Location,
2369                                          'ANSI2KNR-DIR' => $ansi2knr_dir);
2371     }
2374 # handle_libtool ()
2375 # -----------------
2376 # Handle libtool rules.
2377 sub handle_libtool
2379   return unless var ('LIBTOOL');
2381   # Libtool requires some files, but only at top level.
2382   # (Starting with Libtool 2.0 we do not have to bother.  These
2383   # requirements are done with AC_REQUIRE_AUX_FILE.)
2384   require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files)
2385     if $relative_dir eq '.' && ! $libtool_new_api;
2387   my @libtool_rms;
2388   foreach my $item (sort keys %libtool_clean_directories)
2389     {
2390       my $dir = ($item eq '.') ? '' : "$item/";
2391       # .libs is for Unix, _libs for DOS.
2392       push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs");
2393     }
2395   check_user_variables 'LIBTOOLFLAGS';
2397   # Output the libtool compilation rules.
2398   $output_rules .= &file_contents ('libtool',
2399                                    new Automake::Location,
2400                                    LTRMS => join ("\n", @libtool_rms));
2403 # handle_programs ()
2404 # ------------------
2405 # Handle C programs.
2406 sub handle_programs
2408   my @proglist = &am_install_var ('progs', 'PROGRAMS',
2409                                   'bin', 'sbin', 'libexec', 'pkglib',
2410                                   'noinst', 'check');
2411   return if ! @proglist;
2413   my $seen_global_libobjs =
2414     var ('LDADD') && &handle_lib_objects ('', 'LDADD');
2416   foreach my $pair (@proglist)
2417     {
2418       my ($where, $one_file) = @$pair;
2420       my $seen_libobjs = 0;
2421       my $obj = get_object_extension '.$(OBJEXT)';
2423       # Strip any $(EXEEXT) suffix the user might have added, or this
2424       # will confuse &handle_source_transform and &check_canonical_spelling.
2425       # We'll add $(EXEEXT) back later anyway.
2426       $one_file =~ s/\$\(EXEEXT\)$//;
2428       $known_programs{$one_file} = $where;
2430       # Canonicalize names and check for misspellings.
2431       my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS',
2432                                              '_SOURCES', '_OBJECTS',
2433                                              '_DEPENDENCIES');
2435       $where->push_context ("while processing program `$one_file'");
2436       $where->set (INTERNAL->get);
2438       my $linker = &handle_source_transform ($xname, $one_file, $obj, $where,
2439                                              NONLIBTOOL => 1, LIBTOOL => 0);
2441       if (var ($xname . "_LDADD"))
2442         {
2443           $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD');
2444         }
2445       else
2446         {
2447           # User didn't define prog_LDADD override.  So do it.
2448           &define_variable ($xname . '_LDADD', '$(LDADD)', $where);
2450           # This does a bit too much work.  But we need it to
2451           # generate _DEPENDENCIES when appropriate.
2452           if (var ('LDADD'))
2453             {
2454               $seen_libobjs = &handle_lib_objects ($xname, 'LDADD');
2455             }
2456         }
2458       reject_var ($xname . '_LIBADD',
2459                   "use `${xname}_LDADD', not `${xname}_LIBADD'");
2461       set_seen ($xname . '_DEPENDENCIES');
2462       set_seen ($xname . '_LDFLAGS');
2464       # Determine program to use for link.
2465       my $xlink = &define_per_target_linker_variable ($linker, $xname);
2467       # If the resulting program lies into a subdirectory,
2468       # make sure this directory will exist.
2469       my $dirstamp = require_build_directory_maybe ($one_file);
2471       $output_rules .= &file_contents ('program',
2472                                        $where,
2473                                        PROGRAM  => $one_file,
2474                                        XPROGRAM => $xname,
2475                                        XLINK    => $xlink,
2476                                        DIRSTAMP => $dirstamp,
2477                                        EXEEXT   => '$(EXEEXT)');
2479       if ($seen_libobjs || $seen_global_libobjs)
2480         {
2481           if (var ($xname . '_LDADD'))
2482             {
2483               &check_libobjs_sources ($xname, $xname . '_LDADD');
2484             }
2485           elsif (var ('LDADD'))
2486             {
2487               &check_libobjs_sources ($xname, 'LDADD');
2488             }
2489         }
2490     }
2494 # handle_libraries ()
2495 # -------------------
2496 # Handle libraries.
2497 sub handle_libraries
2499   my @liblist = &am_install_var ('libs', 'LIBRARIES',
2500                                  'lib', 'pkglib', 'noinst', 'check');
2501   return if ! @liblist;
2503   my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib',
2504                                     'noinst', 'check');
2506   if (@prefix)
2507     {
2508       my $var = rvar ($prefix[0] . '_LIBRARIES');
2509       $var->requires_variables ('library used', 'RANLIB');
2510     }
2512   &define_variable ('AR', 'ar', INTERNAL);
2513   &define_variable ('ARFLAGS', 'cru', INTERNAL);
2515   foreach my $pair (@liblist)
2516     {
2517       my ($where, $onelib) = @$pair;
2519       my $seen_libobjs = 0;
2520       # Check that the library fits the standard naming convention.
2521       my $bn = basename ($onelib);
2522       if ($bn !~ /^lib.*\.a$/)
2523         {
2524           $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/;
2525           my $suggestion = dirname ($onelib) . "/$bn";
2526           $suggestion =~ s|^\./||g;
2527           msg ('error-gnu/warn', $where,
2528                "`$onelib' is not a standard library name\n"
2529                . "did you mean `$suggestion'?")
2530         }
2532       $where->push_context ("while processing library `$onelib'");
2533       $where->set (INTERNAL->get);
2535       my $obj = get_object_extension '.$(OBJEXT)';
2537       # Canonicalize names and check for misspellings.
2538       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
2539                                             '_OBJECTS', '_DEPENDENCIES',
2540                                             '_AR');
2542       if (! var ($xlib . '_AR'))
2543         {
2544           &define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where);
2545         }
2547       # Generate support for conditional object inclusion in
2548       # libraries.
2549       if (var ($xlib . '_LIBADD'))
2550         {
2551           if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2552             {
2553               $seen_libobjs = 1;
2554             }
2555         }
2556       else
2557         {
2558           &define_variable ($xlib . "_LIBADD", '', $where);
2559         }
2561       reject_var ($xlib . '_LDADD',
2562                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2564       # Make sure we at look at this.
2565       set_seen ($xlib . '_DEPENDENCIES');
2567       &handle_source_transform ($xlib, $onelib, $obj, $where,
2568                                 NONLIBTOOL => 1, LIBTOOL => 0);
2570       # If the resulting library lies into a subdirectory,
2571       # make sure this directory will exist.
2572       my $dirstamp = require_build_directory_maybe ($onelib);
2574       $output_rules .= &file_contents ('library',
2575                                        $where,
2576                                        LIBRARY  => $onelib,
2577                                        XLIBRARY => $xlib,
2578                                        DIRSTAMP => $dirstamp);
2580       if ($seen_libobjs)
2581         {
2582           if (var ($xlib . '_LIBADD'))
2583             {
2584               &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2585             }
2586         }
2587     }
2591 # handle_ltlibraries ()
2592 # ---------------------
2593 # Handle shared libraries.
2594 sub handle_ltlibraries
2596   my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES',
2597                                  'noinst', 'lib', 'pkglib', 'check');
2598   return if ! @liblist;
2600   my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib',
2601                                     'noinst', 'check');
2603   if (@prefix)
2604     {
2605       my $var = rvar ($prefix[0] . '_LTLIBRARIES');
2606       $var->requires_variables ('Libtool library used', 'LIBTOOL');
2607     }
2609   my %instdirs = ();
2610   my %instconds = ();
2611   my %liblocations = ();        # Location (in Makefile.am) of each library.
2613   foreach my $key (@prefix)
2614     {
2615       # Get the installation directory of each library.
2616       (my $dir = $key) =~ s/^nobase_//;
2617       my $var = rvar ($key . '_LTLIBRARIES');
2619       # We reject libraries which are installed in several places
2620       # in the same condition, because we can only specify one
2621       # `-rpath' option.
2622       $var->traverse_recursively
2623         (sub
2624          {
2625            my ($var, $val, $cond, $full_cond) = @_;
2626            my $hcond = $full_cond->human;
2627            my $where = $var->rdef ($cond)->location;
2628            # A library cannot be installed in different directory
2629            # in overlapping conditions.
2630            if (exists $instconds{$val})
2631              {
2632                my ($msg, $acond) =
2633                  $instconds{$val}->ambiguous_p ($val, $full_cond);
2635                if ($msg)
2636                  {
2637                    error ($where, $msg, partial => 1);
2639                    my $dirtxt = "installed in `$dir'";
2640                    $dirtxt = "built for `$dir'"
2641                      if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check';
2642                    my $dircond =
2643                      $full_cond->true ? "" : " in condition $hcond";
2645                    error ($where, "`$val' should be $dirtxt$dircond ...",
2646                           partial => 1);
2648                    my $hacond = $acond->human;
2649                    my $adir = $instdirs{$val}{$acond};
2650                    my $adirtxt = "installed in `$adir'";
2651                    $adirtxt = "built for `$adir'"
2652                      if ($adir eq 'EXTRA' || $adir eq 'noinst'
2653                          || $adir eq 'check');
2654                    my $adircond = $acond->true ? "" : " in condition $hacond";
2656                    my $onlyone = ($dir ne $adir) ?
2657                      ("\nLibtool libraries can be built for only one "
2658                       . "destination.") : "";
2660                    error ($liblocations{$val}{$acond},
2661                           "... and should also be $adirtxt$adircond.$onlyone");
2662                    return;
2663                  }
2664              }
2665            else
2666              {
2667                $instconds{$val} = new Automake::DisjConditions;
2668              }
2669            $instdirs{$val}{$full_cond} = $dir;
2670            $liblocations{$val}{$full_cond} = $where;
2671            $instconds{$val} = $instconds{$val}->merge ($full_cond);
2672          },
2673          sub
2674          {
2675            return ();
2676          },
2677          skip_ac_subst => 1);
2678     }
2680   foreach my $pair (@liblist)
2681     {
2682       my ($where, $onelib) = @$pair;
2684       my $seen_libobjs = 0;
2685       my $obj = get_object_extension '.lo';
2687       # Canonicalize names and check for misspellings.
2688       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
2689                                             '_SOURCES', '_OBJECTS',
2690                                             '_DEPENDENCIES');
2692       # Check that the library fits the standard naming convention.
2693       my $libname_rx = '^lib.*\.la';
2694       my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS');
2695       my $ldvar2 = var ('LDFLAGS');
2696       if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive))
2697           || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive)))
2698         {
2699           # Relax name checking for libtool modules.
2700           $libname_rx = '\.la';
2701         }
2703       my $bn = basename ($onelib);
2704       if ($bn !~ /$libname_rx$/)
2705         {
2706           my $type = 'library';
2707           if ($libname_rx eq '\.la')
2708             {
2709               $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/;
2710               $type = 'module';
2711             }
2712           else
2713             {
2714               $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/;
2715             }
2716           my $suggestion = dirname ($onelib) . "/$bn";
2717           $suggestion =~ s|^\./||g;
2718           msg ('error-gnu/warn', $where,
2719                "`$onelib' is not a standard libtool $type name\n"
2720                . "did you mean `$suggestion'?")
2721         }
2723       $where->push_context ("while processing Libtool library `$onelib'");
2724       $where->set (INTERNAL->get);
2726       # Make sure we look at these.
2727       set_seen ($xlib . '_LDFLAGS');
2728       set_seen ($xlib . '_DEPENDENCIES');
2730       # Generate support for conditional object inclusion in
2731       # libraries.
2732       if (var ($xlib . '_LIBADD'))
2733         {
2734           if (&handle_lib_objects ($xlib, $xlib . '_LIBADD'))
2735             {
2736               $seen_libobjs = 1;
2737             }
2738         }
2739       else
2740         {
2741           &define_variable ($xlib . "_LIBADD", '', $where);
2742         }
2744       reject_var ("${xlib}_LDADD",
2745                   "use `${xlib}_LIBADD', not `${xlib}_LDADD'");
2748       my $linker = &handle_source_transform ($xlib, $onelib, $obj, $where,
2749                                              NONLIBTOOL => 0, LIBTOOL => 1);
2751       # Determine program to use for link.
2752       my $xlink = &define_per_target_linker_variable ($linker, $xlib);
2754       my $rpathvar = "am_${xlib}_rpath";
2755       my $rpath = "\$($rpathvar)";
2756       foreach my $rcond ($instconds{$onelib}->conds)
2757         {
2758           my $val;
2759           if ($instdirs{$onelib}{$rcond} eq 'EXTRA'
2760               || $instdirs{$onelib}{$rcond} eq 'noinst'
2761               || $instdirs{$onelib}{$rcond} eq 'check')
2762             {
2763               # It's an EXTRA_ library, so we can't specify -rpath,
2764               # because we don't know where the library will end up.
2765               # The user probably knows, but generally speaking automake
2766               # doesn't -- and in fact configure could decide
2767               # dynamically between two different locations.
2768               $val = '';
2769             }
2770           else
2771             {
2772               $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)');
2773             }
2774           if ($rcond->true)
2775             {
2776               # If $rcond is true there is only one condition and
2777               # there is no point defining an helper variable.
2778               $rpath = $val;
2779             }
2780           else
2781             {
2782               define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val);
2783             }
2784         }
2786       # If the resulting library lies into a subdirectory,
2787       # make sure this directory will exist.
2788       my $dirstamp = require_build_directory_maybe ($onelib);
2790       # Remember to cleanup .libs/ in this directory.
2791       my $dirname = dirname $onelib;
2792       $libtool_clean_directories{$dirname} = 1;
2794       $output_rules .= &file_contents ('ltlibrary',
2795                                        $where,
2796                                        LTLIBRARY  => $onelib,
2797                                        XLTLIBRARY => $xlib,
2798                                        RPATH      => $rpath,
2799                                        XLINK      => $xlink,
2800                                        DIRSTAMP   => $dirstamp);
2801       if ($seen_libobjs)
2802         {
2803           if (var ($xlib . '_LIBADD'))
2804             {
2805               &check_libobjs_sources ($xlib, $xlib . '_LIBADD');
2806             }
2807         }
2808     }
2811 # See if any _SOURCES variable were misspelled.
2812 sub check_typos ()
2814   # It is ok if the user sets this particular variable.
2815   set_seen 'AM_LDFLAGS';
2817   foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES')
2818     {
2819       foreach my $var (variables $primary)
2820         {
2821           my $varname = $var->name;
2822           # A configure variable is always legitimate.
2823           next if exists $configure_vars{$varname};
2825           for my $cond ($var->conditions->conds)
2826             {
2827               $varname =~ /^(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/;
2828               msg_var ('syntax', $var, "variable `$varname' is defined but no"
2829                        . " program or\nlibrary has `$1' as canonic name"
2830                        . " (possible typo)")
2831                 unless $var->rdef ($cond)->seen;
2832             }
2833         }
2834     }
2838 # Handle scripts.
2839 sub handle_scripts
2841     # NOTE we no longer automatically clean SCRIPTS, because it is
2842     # useful to sometimes distribute scripts verbatim.  This happens
2843     # e.g. in Automake itself.
2844     &am_install_var ('-candist', 'scripts', 'SCRIPTS',
2845                      'bin', 'sbin', 'libexec', 'pkgdata',
2846                      'noinst', 'check');
2852 ## ------------------------ ##
2853 ## Handling Texinfo files.  ##
2854 ## ------------------------ ##
2856 # ($OUTFILE, $VFILE, @CLEAN_FILES)
2857 # &scan_texinfo_file ($FILENAME)
2858 # ------------------------------
2859 # $OUTFILE     - name of the info file produced by $FILENAME.
2860 # $VFILE       - name of the version.texi file used (undef if none).
2861 # @CLEAN_FILES - list of byproducts (indexes etc.)
2862 sub scan_texinfo_file ($)
2864   my ($filename) = @_;
2866   # Some of the following extensions are always created, no matter
2867   # whether indexes are used or not.  Other (like cps, fns, ... pgs)
2868   # are only created when they are used.  We used to scan $FILENAME
2869   # for their use, but that is not enough: they could be used in
2870   # included files.  We can't scan included files because we don't
2871   # know the include path.  Therefore we always erase these files, no
2872   # matter whether they are used or not.
2873   #
2874   # (tmp is only created if an @macro is used and a certain e-TeX
2875   # feature is not available.)
2876   my %clean_suffixes =
2877     map { $_ => 1 } (qw(aux log toc tmp
2878                         cp cps
2879                         fn fns
2880                         ky kys
2881                         vr vrs
2882                         tp tps
2883                         pg pgs)); # grep 'new.*index' texinfo.tex
2885   my $texi = new Automake::XFile "< $filename";
2886   verb "reading $filename";
2888   my ($outfile, $vfile);
2889   while ($_ = $texi->getline)
2890     {
2891       if (/^\@setfilename +(\S+)/)
2892         {
2893           # Honor only the first @setfilename.  (It's possible to have
2894           # more occurrences later if the manual shows examples of how
2895           # to use @setfilename...)
2896           next if $outfile;
2898           $outfile = $1;
2899           if ($outfile =~ /\.([^.]+)$/ && $1 ne 'info')
2900             {
2901               error ("$filename:$.",
2902                      "output `$outfile' has unrecognized extension");
2903               return;
2904             }
2905         }
2906       # A "version.texi" file is actually any file whose name matches
2907       # "vers*.texi".
2908       elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/)
2909         {
2910           $vfile = $1;
2911         }
2913       # Try to find new or unused indexes.
2915       # Creating a new category of index.
2916       elsif (/^\@def(code)?index (\w+)/)
2917         {
2918           $clean_suffixes{$2} = 1;
2919           $clean_suffixes{"$2s"} = 1;
2920         }
2922       # Merging an index into an another.
2923       elsif (/^\@syn(code)?index (\w+) (\w+)/)
2924         {
2925           delete $clean_suffixes{"$2s"};
2926           $clean_suffixes{"$3s"} = 1;
2927         }
2929     }
2931   if (! $outfile)
2932     {
2933       err_am "`$filename' missing \@setfilename";
2934       return;
2935     }
2937   my $infobase = basename ($filename);
2938   $infobase =~ s/\.te?xi(nfo)?$//;
2939   return ($outfile, $vfile,
2940           map { "$infobase.$_" } (sort keys %clean_suffixes));
2944 # ($DIRSTAMP, @CLEAN_FILES)
2945 # output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES)
2946 # ------------------------------------------------------------------
2947 # SOURCE - the source Texinfo file
2948 # DEST - the destination Info file
2949 # INSRC - wether DEST should be built in the source tree
2950 # DEPENDENCIES - known dependencies
2951 sub output_texinfo_build_rules ($$$@)
2953   my ($source, $dest, $insrc, @deps) = @_;
2955   # Split `a.texi' into `a' and `.texi'.
2956   my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/);
2957   my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/);
2959   $ssfx ||= "";
2960   $dsfx ||= "";
2962   # We can output two kinds of rules: the "generic" rules use Make
2963   # suffix rules and are appropriate when $source and $dest do not lie
2964   # in a sub-directory; the "specific" rules are needed in the other
2965   # case.
2966   #
2967   # The former are output only once (this is not really apparent here,
2968   # but just remember that some logic deeper in Automake will not
2969   # output the same rule twice); while the later need to be output for
2970   # each Texinfo source.
2971   my $generic;
2972   my $makeinfoflags;
2973   my $sdir = dirname $source;
2974   if ($sdir eq '.' && dirname ($dest) eq '.')
2975     {
2976       $generic = 1;
2977       $makeinfoflags = '-I $(srcdir)';
2978     }
2979   else
2980     {
2981       $generic = 0;
2982       $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir";
2983     }
2985   # A directory can contain two kinds of info files: some built in the
2986   # source tree, and some built in the build tree.  The rules are
2987   # different in each case.  However we cannot output two different
2988   # set of generic rules.  Because in-source builds are more usual, we
2989   # use generic rules in this case and fall back to "specific" rules
2990   # for build-dir builds.  (It should not be a problem to invert this
2991   # if needed.)
2992   $generic = 0 unless $insrc;
2994   # We cannot use a suffix rule to build info files with an empty
2995   # extension.  Otherwise we would output a single suffix inference
2996   # rule, with separate dependencies, as in
2997   #
2998   #    .texi:
2999   #             $(MAKEINFO) ...
3000   #    foo.info: foo.texi
3001   #
3002   # which confuse Solaris make.  (See the Autoconf manual for
3003   # details.)  Therefore we use a specific rule in this case.  This
3004   # applies to info files only (dvi and pdf files always have an
3005   # extension).
3006   my $generic_info = ($generic && $dsfx) ? 1 : 0;
3008   # If the resulting file lie into a subdirectory,
3009   # make sure this directory will exist.
3010   my $dirstamp = require_build_directory_maybe ($dest);
3012   my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx;
3014   $output_rules .= file_contents ('texibuild',
3015                                   new Automake::Location,
3016                                   DEPS             => "@deps",
3017                                   DEST_PREFIX      => $dpfx,
3018                                   DEST_INFO_PREFIX => $dipfx,
3019                                   DEST_SUFFIX      => $dsfx,
3020                                   DIRSTAMP         => $dirstamp,
3021                                   GENERIC          => $generic,
3022                                   GENERIC_INFO     => $generic_info,
3023                                   INSRC            => $insrc,
3024                                   MAKEINFOFLAGS    => $makeinfoflags,
3025                                   SOURCE           => ($generic
3026                                                        ? '$<' : $source),
3027                                   SOURCE_INFO      => ($generic_info
3028                                                        ? '$<' : $source),
3029                                   SOURCE_REAL      => $source,
3030                                   SOURCE_SUFFIX    => $ssfx,
3031                                   );
3032   return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html");
3036 # $TEXICLEANS
3037 # handle_texinfo_helper ($info_texinfos)
3038 # --------------------------------------
3039 # Handle all Texinfo source; helper for handle_texinfo.
3040 sub handle_texinfo_helper ($)
3042   my ($info_texinfos) = @_;
3043   my (@infobase, @info_deps_list, @texi_deps);
3044   my %versions;
3045   my $done = 0;
3046   my @texi_cleans;
3048   # Build a regex matching user-cleaned files.
3049   my $d = var 'DISTCLEANFILES';
3050   my $c = var 'CLEANFILES';
3051   my @f = ();
3052   push @f, $d->value_as_list_recursive (inner_expand => 1) if $d;
3053   push @f, $c->value_as_list_recursive (inner_expand => 1) if $c;
3054   @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f;
3055   my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$';
3057   foreach my $texi
3058       ($info_texinfos->value_as_list_recursive (inner_expand => 1))
3059     {
3060       my $infobase = $texi;
3061       $infobase =~ s/\.(txi|texinfo|texi)$//;
3063       if ($infobase eq $texi)
3064         {
3065           # FIXME: report line number.
3066           err_am "texinfo file `$texi' has unrecognized extension";
3067           next;
3068         }
3070       push @infobase, $infobase;
3072       # If 'version.texi' is referenced by input file, then include
3073       # automatic versioning capability.
3074       my ($out_file, $vtexi, @clean_files) =
3075         scan_texinfo_file ("$relative_dir/$texi")
3076         or next;
3077       push (@texi_cleans, @clean_files);
3079       # If the Texinfo source is in a subdirectory, create the
3080       # resulting info in this subdirectory.  If it is in the current
3081       # directory, try hard to not prefix "./" because it breaks the
3082       # generic rules.
3083       my $outdir = dirname ($texi) . '/';
3084       $outdir = "" if $outdir eq './';
3085       $out_file =  $outdir . $out_file;
3087       # Until Automake 1.6.3, .info files were built in the
3088       # source tree.  This was an obstacle to the support of
3089       # non-distributed .info files, and non-distributed .texi
3090       # files.
3091       #
3092       # * Non-distributed .texi files is important in some packages
3093       #   where .texi files are built at make time, probably using
3094       #   other binaries built in the package itself, maybe using
3095       #   tools or information found on the build host.  Because
3096       #   these files are not distributed they are always rebuilt
3097       #   at make time; they should therefore not lie in the source
3098       #   directory.  One plan was to support this using
3099       #   nodist_info_TEXINFOS or something similar.  (Doing this
3100       #   requires some sanity checks.  For instance Automake should
3101       #   not allow:
3102       #      dist_info_TEXINFO = foo.texi
3103       #      nodist_foo_TEXINFO = included.texi
3104       #   because a distributed file should never depend on a
3105       #   non-distributed file.)
3106       #
3107       # * If .texi files are not distributed, then .info files should
3108       #   not be distributed either.  There are also cases where one
3109       #   want to distribute .texi files, but do not want to
3110       #   distribute the .info files.  For instance the Texinfo package
3111       #   distributes the tool used to build these files; it would
3112       #   be a waste of space to distribute them.  It's not clear
3113       #   which syntax we should use to indicate that .info files should
3114       #   not be distributed.  Akim Demaille suggested that eventually
3115       #   we switch to a new syntax:
3116       #   |  Maybe we should take some inspiration from what's already
3117       #   |  done in the rest of Automake.  Maybe there is too much
3118       #   |  syntactic sugar here, and you want
3119       #   |     nodist_INFO = bar.info
3120       #   |     dist_bar_info_SOURCES = bar.texi
3121       #   |     bar_texi_DEPENDENCIES = foo.texi
3122       #   |  with a bit of magic to have bar.info represent the whole
3123       #   |  bar*info set.  That's a lot more verbose that the current
3124       #   |  situation, but it is # not new, hence the user has less
3125       #   |  to learn.
3126       #   |
3127       #   |  But there is still too much room for meaningless specs:
3128       #   |     nodist_INFO = bar.info
3129       #   |     dist_bar_info_SOURCES = bar.texi
3130       #   |     dist_PS = bar.ps something-written-by-hand.ps
3131       #   |     nodist_bar_ps_SOURCES = bar.texi
3132       #   |     bar_texi_DEPENDENCIES = foo.texi
3133       #   |  here bar.texi is dist_ in line 2, and nodist_ in 4.
3134       #
3135       # Back to the point, it should be clear that in order to support
3136       # non-distributed .info files, we need to build them in the
3137       # build tree, not in the source tree (non-distributed .texi
3138       # files are less of a problem, because we do not output build
3139       # rules for them).  In Automake 1.7 .info build rules have been
3140       # largely cleaned up so that .info files get always build in the
3141       # build tree, even when distributed.  The idea was that
3142       #   (1) if during a VPATH build the .info file was found to be
3143       #       absent or out-of-date (in the source tree or in the
3144       #       build tree), Make would rebuild it in the build tree.
3145       #       If an up-to-date source-tree of the .info file existed,
3146       #       make would not rebuild it in the build tree.
3147       #   (2) having two copies of .info files, one in the source tree
3148       #       and one (newer) in the build tree is not a problem
3149       #       because `make dist' always pick files in the build tree
3150       #       first.
3151       # However it turned out the be a bad idea for several reasons:
3152       #   * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave
3153       #     like GNU Make on point (1) above.  These implementations
3154       #     of Make would always rebuild .info files in the build
3155       #     tree, even if such files were up to date in the source
3156       #     tree.  Consequently, it was impossible to perform a VPATH
3157       #     build of a package containing Texinfo files using these
3158       #     Make implementations.
3159       #     (Refer to the Autoconf Manual, section "Limitation of
3160       #     Make", paragraph "VPATH", item "target lookup", for
3161       #     an account of the differences between these
3162       #     implementations.)
3163       #   * The GNU Coding Standards require these files to be built
3164       #     in the source-tree (when they are distributed, that is).
3165       #   * Keeping a fresher copy of distributed files in the
3166       #     build tree can be annoying during development because
3167       #     - if the files is kept under CVS, you really want it
3168       #       to be updated in the source tree
3169       #     - it is confusing that `make distclean' does not erase
3170       #       all files in the build tree.
3171       #
3172       # Consequently, starting with Automake 1.8, .info files are
3173       # built in the source tree again.  Because we still plan to
3174       # support non-distributed .info files at some point, we
3175       # have a single variable ($INSRC) that controls whether
3176       # the current .info file must be built in the source tree
3177       # or in the build tree.  Actually this variable is switched
3178       # off for .info files that appear to be cleaned; this is
3179       # for backward compatibility with package such as Texinfo,
3180       # which do things like
3181       #   info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
3182       #   DISTCLEANFILES = texinfo texinfo-* info*.info*
3183       #   # Do not create info files for distribution.
3184       #   dist-info:
3185       # in order not to distribute .info files.
3186       my $insrc = ($out_file =~ $user_cleaned_files) ? 0 : 1;
3188       my $soutdir = '$(srcdir)/' . $outdir;
3189       $outdir = $soutdir if $insrc;
3191       # If user specified file_TEXINFOS, then use that as explicit
3192       # dependency list.
3193       @texi_deps = ();
3194       push (@texi_deps, "$soutdir$vtexi") if $vtexi;
3196       my $canonical = canonicalize ($infobase);
3197       if (var ($canonical . "_TEXINFOS"))
3198         {
3199           push (@texi_deps, '$(' . $canonical . '_TEXINFOS)');
3200           push_dist_common ('$(' . $canonical . '_TEXINFOS)');
3201         }
3203       my ($dirstamp, @cfiles) =
3204         output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps);
3205       push (@texi_cleans, @cfiles);
3207       push (@info_deps_list, $out_file);
3209       # If a vers*.texi file is needed, emit the rule.
3210       if ($vtexi)
3211         {
3212           err_am ("`$vtexi', included in `$texi', "
3213                   . "also included in `$versions{$vtexi}'")
3214             if defined $versions{$vtexi};
3215           $versions{$vtexi} = $texi;
3217           # We number the stamp-vti files.  This is doable since the
3218           # actual names don't matter much.  We only number starting
3219           # with the second one, so that the common case looks nice.
3220           my $vti = ($done ? $done : 'vti');
3221           ++$done;
3223           # This is ugly, but it is our historical practice.
3224           if ($config_aux_dir_set_in_configure_ac)
3225             {
3226               require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3227                                             'mdate-sh');
3228             }
3229           else
3230             {
3231               require_file_with_macro (TRUE, 'info_TEXINFOS',
3232                                        FOREIGN, 'mdate-sh');
3233             }
3235           my $conf_dir;
3236           if ($config_aux_dir_set_in_configure_ac)
3237             {
3238               $conf_dir = "$am_config_aux_dir/";
3239             }
3240           else
3241             {
3242               $conf_dir = '$(srcdir)/';
3243             }
3244           $output_rules .= file_contents ('texi-vers',
3245                                           new Automake::Location,
3246                                           TEXI     => $texi,
3247                                           VTI      => $vti,
3248                                           STAMPVTI => "${soutdir}stamp-$vti",
3249                                           VTEXI    => "$soutdir$vtexi",
3250                                           MDDIR    => $conf_dir,
3251                                           DIRSTAMP => $dirstamp);
3252         }
3253     }
3255   # Handle location of texinfo.tex.
3256   my $need_texi_file = 0;
3257   my $texinfodir;
3258   if (var ('TEXINFO_TEX'))
3259     {
3260       # The user defined TEXINFO_TEX so assume he knows what he is
3261       # doing.
3262       $texinfodir = ('$(srcdir)/'
3263                      . dirname (variable_value ('TEXINFO_TEX')));
3264     }
3265   elsif (option 'cygnus')
3266     {
3267       $texinfodir = '$(top_srcdir)/../texinfo';
3268       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
3269     }
3270   elsif ($config_aux_dir_set_in_configure_ac)
3271     {
3272       $texinfodir = $am_config_aux_dir;
3273       define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL);
3274       $need_texi_file = 2; # so that we require_conf_file later
3275     }
3276   else
3277     {
3278       $texinfodir = '$(srcdir)';
3279       $need_texi_file = 1;
3280     }
3281   define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL);
3283   push (@dist_targets, 'dist-info');
3285   if (! option 'no-installinfo')
3286     {
3287       # Make sure documentation is made and installed first.  Use
3288       # $(INFO_DEPS), not 'info', because otherwise recursive makes
3289       # get run twice during "make all".
3290       unshift (@all, '$(INFO_DEPS)');
3291     }
3293   define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL);
3294   define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL);
3295   define_files_variable ("PSS", @infobase, 'ps', INTERNAL);
3296   define_files_variable ("HTMLS", @infobase, 'html', INTERNAL);
3298   # This next isn't strictly needed now -- the places that look here
3299   # could easily be changed to look in info_TEXINFOS.  But this is
3300   # probably better, in case noinst_TEXINFOS is ever supported.
3301   define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL);
3303   # Do some error checking.  Note that this file is not required
3304   # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly
3305   # up above.
3306   if ($need_texi_file && ! option 'no-texinfo.tex')
3307     {
3308       if ($need_texi_file > 1)
3309         {
3310           require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3311                                         'texinfo.tex');
3312         }
3313       else
3314         {
3315           require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN,
3316                                    'texinfo.tex');
3317         }
3318     }
3320   return makefile_wrap ("", "\t  ", @texi_cleans);
3324 # handle_texinfo ()
3325 # -----------------
3326 # Handle all Texinfo source.
3327 sub handle_texinfo ()
3329   reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'";
3330   # FIXME: I think this is an obsolete future feature name.
3331   reject_var 'html_TEXINFOS', "HTML generation not yet supported";
3333   my $info_texinfos = var ('info_TEXINFOS');
3334   my $texiclean = "";
3335   if ($info_texinfos)
3336     {
3337       $texiclean = handle_texinfo_helper ($info_texinfos);
3338     }
3339   $output_rules .=  file_contents ('texinfos',
3340                                    new Automake::Location,
3341                                    TEXICLEAN     => $texiclean,
3342                                    'LOCAL-TEXIS' => !!$info_texinfos);
3346 # Handle any man pages.
3347 sub handle_man_pages
3349   reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'";
3351   # Find all the sections in use.  We do this by first looking for
3352   # "standard" sections, and then looking for any additional
3353   # sections used in man_MANS.
3354   my (%sections, %vlist);
3355   # We handle nodist_ for uniformity.  man pages aren't distributed
3356   # by default so it isn't actually very important.
3357   foreach my $pfx ('', 'dist_', 'nodist_')
3358     {
3359       # Add more sections as needed.
3360       foreach my $section ('0'..'9', 'n', 'l')
3361         {
3362           my $varname = $pfx . 'man' . $section . '_MANS';
3363           if (var ($varname))
3364             {
3365               $sections{$section} = 1;
3366               $varname = '$(' . $varname . ')';
3367               $vlist{$varname} = 1;
3369               &push_dist_common ($varname)
3370                 if $pfx eq 'dist_';
3371             }
3372         }
3374       my $varname = $pfx . 'man_MANS';
3375       my $var = var ($varname);
3376       if ($var)
3377         {
3378           foreach ($var->value_as_list_recursive)
3379             {
3380               # A page like `foo.1c' goes into man1dir.
3381               if (/\.([0-9a-z])([a-z]*)$/)
3382                 {
3383                   $sections{$1} = 1;
3384                 }
3385             }
3387           $varname = '$(' . $varname . ')';
3388           $vlist{$varname} = 1;
3389           &push_dist_common ($varname)
3390             if $pfx eq 'dist_';
3391         }
3392     }
3394   return unless %sections;
3396   # Now for each section, generate an install and uninstall rule.
3397   # Sort sections so output is deterministic.
3398   foreach my $section (sort keys %sections)
3399     {
3400       $output_rules .= &file_contents ('mans',
3401                                        new Automake::Location,
3402                                        SECTION => $section);
3403     }
3405   my @mans = sort keys %vlist;
3406   $output_vars .= file_contents ('mans-vars',
3407                                  new Automake::Location,
3408                                  MANS => "@mans");
3410   push (@all, '$(MANS)')
3411     unless option 'no-installman';
3414 # Handle DATA variables.
3415 sub handle_data
3417     &am_install_var ('-noextra', '-candist', 'data', 'DATA',
3418                      'data', 'dataroot', 'dvi', 'html', 'pdf', 'ps',
3419                      'sysconf', 'sharedstate', 'localstate',
3420                      'pkgdata', 'lisp', 'noinst', 'check');
3423 # Handle TAGS.
3424 sub handle_tags
3426     my @tag_deps = ();
3427     my @ctag_deps = ();
3428     if (var ('SUBDIRS'))
3429     {
3430         $output_rules .= ("tags-recursive:\n"
3431                           . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
3432                           # Never fail here if a subdir fails; it
3433                           # isn't important.
3434                           . "\t  test \"\$\$subdir\" = . || (cd \$\$subdir"
3435                           . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n"
3436                           . "\tdone\n");
3437         push (@tag_deps, 'tags-recursive');
3438         &depend ('.PHONY', 'tags-recursive');
3440         $output_rules .= ("ctags-recursive:\n"
3441                           . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n"
3442                           # Never fail here if a subdir fails; it
3443                           # isn't important.
3444                           . "\t  test \"\$\$subdir\" = . || (cd \$\$subdir"
3445                           . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n"
3446                           . "\tdone\n");
3447         push (@ctag_deps, 'ctags-recursive');
3448         &depend ('.PHONY', 'ctags-recursive');
3449     }
3451     if (&saw_sources_p (1)
3452         || var ('ETAGS_ARGS')
3453         || @tag_deps)
3454     {
3455         my @config;
3456         foreach my $spec (@config_headers)
3457         {
3458             my ($out, @ins) = split_config_file_spec ($spec);
3459             foreach my $in (@ins)
3460               {
3461                 # If the config header source is in this directory,
3462                 # require it.
3463                 push @config, basename ($in)
3464                   if $relative_dir eq dirname ($in);
3465               }
3466         }
3467         $output_rules .= &file_contents ('tags',
3468                                          new Automake::Location,
3469                                          CONFIG    => "@config",
3470                                          TAGSDIRS  => "@tag_deps",
3471                                          CTAGSDIRS => "@ctag_deps");
3473         set_seen 'TAGS_DEPENDENCIES';
3474     }
3475     elsif (reject_var ('TAGS_DEPENDENCIES',
3476                        "doesn't make sense to define `TAGS_DEPENDENCIES'"
3477                        . "without\nsources or `ETAGS_ARGS'"))
3478     {
3479     }
3480     else
3481     {
3482         # Every Makefile must define some sort of TAGS rule.
3483         # Otherwise, it would be possible for a top-level "make TAGS"
3484         # to fail because some subdirectory failed.
3485         $output_rules .= "tags: TAGS\nTAGS:\n\n";
3486         # Ditto ctags.
3487         $output_rules .= "ctags: CTAGS\nCTAGS:\n\n";
3488     }
3491 # Handle multilib support.
3492 sub handle_multilib
3494   if ($seen_multilib && $relative_dir eq '.')
3495     {
3496       $output_rules .= &file_contents ('multilib', new Automake::Location);
3497       push (@all, 'all-multi');
3498     }
3502 # user_phony_rule ($NAME)
3503 # -----------------------
3504 # Return false if rule $NAME does not exist.  Otherwise,
3505 # declare it as phony, complete its definition (in case it is
3506 # conditional), and return its Automake::Rule instance.
3507 sub user_phony_rule ($)
3509   my ($name) = @_;
3510   my $rule = rule $name;
3511   if ($rule)
3512     {
3513       depend ('.PHONY', $name);
3514       # Define $NAME in all condition where it is not already defined,
3515       # so that it is always OK to depend on $NAME.
3516       for my $c ($rule->not_always_defined_in_cond (TRUE)->conds)
3517         {
3518           Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE,
3519                                   $c, INTERNAL);
3520           $output_rules .= $c->subst_string . "$name:\n";
3521         }
3522     }
3523   return $rule;
3527 # $BOOLEAN
3528 # &for_dist_common ($A, $B)
3529 # -------------------------
3530 # Subroutine for &handle_dist: sort files to dist.
3532 # We put README first because it then becomes easier to make a
3533 # Usenet-compliant shar file (in these, README must be first).
3535 # FIXME: do more ordering of files here.
3536 sub for_dist_common
3538     return 0
3539         if $a eq $b;
3540     return -1
3541         if $a eq 'README';
3542     return 1
3543         if $b eq 'README';
3544     return $a cmp $b;
3547 # handle_dist
3548 # -----------
3549 # Handle 'dist' target.
3550 sub handle_dist ()
3552   # Substutions for distdit.am
3553   my %transform;
3555   # Define DIST_SUBDIRS.  This must always be done, regardless of the
3556   # no-dist setting: target like `distclean' or `maintainer-clean' use it.
3557   my $subdirs = var ('SUBDIRS');
3558   if ($subdirs)
3559     {
3560       # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS
3561       # to all possible directories, and use it.  If DIST_SUBDIRS is
3562       # defined, just use it.
3564       # Note that we check DIST_SUBDIRS first on purpose, so that
3565       # we don't call has_conditional_contents for now reason.
3566       # (In the past one project used so many conditional subdirectories
3567       # that calling has_conditional_contents on SUBDIRS caused
3568       # automake to grow to 150Mb -- this should not happen with
3569       # the current implementation of has_conditional_contents,
3570       # but it's more efficient to avoid the call anyway.)
3571       if (var ('DIST_SUBDIRS'))
3572         {
3573         }
3574       elsif ($subdirs->has_conditional_contents)
3575         {
3576           define_pretty_variable
3577             ('DIST_SUBDIRS', TRUE, INTERNAL,
3578              uniq ($subdirs->value_as_list_recursive));
3579         }
3580       else
3581         {
3582           # We always define this because that is what `distclean'
3583           # wants.
3584           define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL,
3585                                   '$(SUBDIRS)');
3586         }
3587     }
3589   # The remaining definitions are only required when a dist target is used.
3590   return if option 'no-dist';
3592   # At least one of the archive formats must be enabled.
3593   if ($relative_dir eq '.')
3594     {
3595       my $archive_defined = option 'no-dist-gzip' ? 0 : 1;
3596       $archive_defined ||=
3597         grep { option "dist-$_" } ('shar', 'zip', 'tarZ', 'bzip2');
3598       error (option 'no-dist-gzip',
3599              "no-dist-gzip specified but no dist-* specified, "
3600              . "at least one archive format must be enabled")
3601         unless $archive_defined;
3602     }
3604   # Look for common files that should be included in distribution.
3605   # If the aux dir is set, and it does not have a Makefile.am, then
3606   # we check for these files there as well.
3607   my $check_aux = 0;
3608   if ($relative_dir eq '.'
3609       && $config_aux_dir_set_in_configure_ac)
3610     {
3611       if (! &is_make_dir ($config_aux_dir))
3612         {
3613           $check_aux = 1;
3614         }
3615     }
3616   foreach my $cfile (@common_files)
3617     {
3618       if (dir_has_case_matching_file ($relative_dir, $cfile)
3619           # The file might be absent, but if it can be built it's ok.
3620           || rule $cfile)
3621         {
3622           &push_dist_common ($cfile);
3623         }
3625       # Don't use `elsif' here because a file might meaningfully
3626       # appear in both directories.
3627       if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile))
3628         {
3629           &push_dist_common ("$config_aux_dir/$cfile")
3630         }
3631     }
3633   # We might copy elements from $configure_dist_common to
3634   # %dist_common if we think we need to.  If the file appears in our
3635   # directory, we would have discovered it already, so we don't
3636   # check that.  But if the file is in a subdir without a Makefile,
3637   # we want to distribute it here if we are doing `.'.  Ugly!
3638   if ($relative_dir eq '.')
3639     {
3640       foreach my $file (split (' ' , $configure_dist_common))
3641         {
3642           push_dist_common ($file)
3643             unless is_make_dir (dirname ($file));
3644         }
3645     }
3647   # Files to distributed.  Don't use ->value_as_list_recursive
3648   # as it recursively expands `$(dist_pkgdata_DATA)' etc.
3649   my @dist_common = split (' ', rvar ('DIST_COMMON')->variable_value);
3650   @dist_common = uniq (sort for_dist_common (@dist_common));
3651   variable_delete 'DIST_COMMON';
3652   define_pretty_variable ('DIST_COMMON', TRUE, INTERNAL, @dist_common);
3654   # Now that we've processed DIST_COMMON, disallow further attempts
3655   # to set it.
3656   $handle_dist_run = 1;
3658   # Scan EXTRA_DIST to see if we need to distribute anything from a
3659   # subdir.  If so, add it to the list.  I didn't want to do this
3660   # originally, but there were so many requests that I finally
3661   # relented.
3662   my $extra_dist = var ('EXTRA_DIST');
3664   $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook';
3665   $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external;
3667   # If the target `dist-hook' exists, make sure it is run.  This
3668   # allows users to do random weird things to the distribution
3669   # before it is packaged up.
3670   push (@dist_targets, 'dist-hook')
3671     if user_phony_rule 'dist-hook';
3672   $transform{'DIST-TARGETS'} = join (' ', @dist_targets);
3674   my $flm = option ('filename-length-max');
3675   my $filename_filter = $flm ? '.' x $flm->[1] : '';
3677   $output_rules .= &file_contents ('distdir',
3678                                    new Automake::Location,
3679                                    %transform,
3680                                    FILENAME_FILTER => $filename_filter);
3684 # check_directory ($NAME, $WHERE)
3685 # -------------------------------
3686 # Ensure $NAME is a directory, and that it uses sane name.
3687 # Use $WHERE as a location in the diagnostic, if any.
3688 sub check_directory ($$)
3690   my ($dir, $where) = @_;
3692   error $where, "required directory $relative_dir/$dir does not exist"
3693     unless -d "$relative_dir/$dir";
3695   # If an `obj/' directory exists, BSD make will enter it before
3696   # reading `Makefile'.  Hence the `Makefile' in the current directory
3697   # will not be read.
3698   #
3699   #  % cat Makefile
3700   #  all:
3701   #          echo Hello
3702   #  % cat obj/Makefile
3703   #  all:
3704   #          echo World
3705   #  % make      # GNU make
3706   #  echo Hello
3707   #  Hello
3708   #  % pmake     # BSD make
3709   #  echo World
3710   #  World
3711   msg ('portability', $where,
3712        "naming a subdirectory `obj' causes troubles with BSD make")
3713     if $dir eq 'obj';
3715   # `aux' is probably the most important of the following forbidden name,
3716   # since it's tempting to use it as an AC_CONFIG_AUX_DIR.
3717   msg ('portability', $where,
3718        "name `$dir' is reserved on W32 and DOS platforms")
3719     if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/);
3722 # check_directories_in_var ($VARIABLE)
3723 # ------------------------------------
3724 # Recursively check all items in variables $VARIABLE as directories
3725 sub check_directories_in_var ($)
3727   my ($var) = @_;
3728   $var->traverse_recursively
3729     (sub
3730      {
3731        my ($var, $val, $cond, $full_cond) = @_;
3732        check_directory ($val, $var->rdef ($cond)->location);
3733        return ();
3734      },
3735      undef,
3736      skip_ac_subst => 1);
3739 # &handle_subdirs ()
3740 # ------------------
3741 # Handle subdirectories.
3742 sub handle_subdirs ()
3744   my $subdirs = var ('SUBDIRS');
3745   return
3746     unless $subdirs;
3748   check_directories_in_var $subdirs;
3750   my $dsubdirs = var ('DIST_SUBDIRS');
3751   check_directories_in_var $dsubdirs
3752     if $dsubdirs;
3754   $output_rules .= &file_contents ('subdirs', new Automake::Location);
3755   rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross!
3759 # ($REGEN, @DEPENDENCIES)
3760 # &scan_aclocal_m4
3761 # ----------------
3762 # If aclocal.m4 creation is automated, return the list of its dependencies.
3763 sub scan_aclocal_m4 ()
3765   my $regen_aclocal = 0;
3767   set_seen 'CONFIG_STATUS_DEPENDENCIES';
3768   set_seen 'CONFIGURE_DEPENDENCIES';
3770   if (-f 'aclocal.m4')
3771     {
3772       &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL);
3774       my $aclocal = new Automake::XFile "< aclocal.m4";
3775       my $line = $aclocal->getline;
3776       $regen_aclocal = $line =~ 'generated automatically by aclocal';
3777     }
3779   my @ac_deps = ();
3781   if (set_seen ('ACLOCAL_M4_SOURCES'))
3782     {
3783       push (@ac_deps, '$(ACLOCAL_M4_SOURCES)');
3784       msg_var ('obsolete', 'ACLOCAL_M4_SOURCES',
3785                "`ACLOCAL_M4_SOURCES' is obsolete.\n"
3786                . "It should be safe to simply remove it.");
3787     }
3789   # Note that it might be possible that aclocal.m4 doesn't exist but
3790   # should be auto-generated.  This case probably isn't very
3791   # important.
3793   return ($regen_aclocal, @ac_deps);
3797 # Helper function for substitute_ac_subst_variables.
3798 sub substitute_ac_subst_variables_worker($)
3800   my ($token) = @_;
3801   return "\@$token\@" if var $token;
3802   return "\${$token\}";
3805 # substitute_ac_subst_variables ($TEXT)
3806 # -------------------------------------
3807 # Replace any occurence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST
3808 # variable.
3809 sub substitute_ac_subst_variables ($)
3811   my ($text) = @_;
3812   $text =~ s/\${([^ \t=:+{}]+)}/&substitute_ac_subst_variables_worker ($1)/ge;
3813   return $text;
3816 # @DEPENDENCIES
3817 # &prepend_srcdir (@INPUTS)
3818 # -------------------------
3819 # Prepend $(srcdir) or $(top_srcdir) to all @INPUTS.  The idea is that
3820 # if an input file has a directory part the same as the current
3821 # directory, then the directory part is simply replaced by $(srcdir).
3822 # But if the directory part is different, then $(top_srcdir) is
3823 # prepended.
3824 sub prepend_srcdir (@)
3826   my (@inputs) = @_;
3827   my @newinputs;
3829   foreach my $single (@inputs)
3830     {
3831       if (dirname ($single) eq $relative_dir)
3832         {
3833           push (@newinputs, '$(srcdir)/' . basename ($single));
3834         }
3835       else
3836         {
3837           push (@newinputs, '$(top_srcdir)/' . $single);
3838         }
3839     }
3840   return @newinputs;
3843 # @DEPENDENCIES
3844 # rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS)
3845 # ---------------------------------------------------
3846 # Compute a list of dependencies appropriate for the rebuild
3847 # rule of
3848 #   AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...)
3849 # Also distribute $INPUTs which are not build by another AC_CONFIG_FILES.
3850 sub rewrite_inputs_into_dependencies ($@)
3852   my ($file, @inputs) = @_;
3853   my @res = ();
3855   for my $i (@inputs)
3856     {
3857       # We cannot create dependencies on shell variables.
3858       next if (substitute_ac_subst_variables $i) =~ /\$/;
3860       if (exists $ac_config_files_location{$i})
3861         {
3862           my $di = dirname $i;
3863           if ($di eq $relative_dir)
3864             {
3865               $i = basename $i;
3866             }
3867           # In the top-level Makefile we do not use $(top_builddir), because
3868           # we are already there, and since the targets are built without
3869           # a $(top_builddir), it helps BSD Make to match them with
3870           # dependencies.
3871           elsif ($relative_dir ne '.')
3872             {
3873               $i = '$(top_builddir)/' . $i;
3874             }
3875         }
3876       else
3877         {
3878           msg ('error', $ac_config_files_location{$file},
3879                "required file `$i' not found")
3880             unless $i =~ /\$/ || exists $output_files{$i} || -f $i;
3881           ($i) = prepend_srcdir ($i);
3882           push_dist_common ($i);
3883         }
3884       push @res, $i;
3885     }
3886   return @res;
3891 # &handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS)
3892 # ------------------------------------------------------------------
3893 # Handle remaking and configure stuff.
3894 # We need the name of the input file, to do proper remaking rules.
3895 sub handle_configure ($$$@)
3897   my ($makefile_am, $makefile_in, $makefile, @inputs) = @_;
3899   prog_error 'empty @inputs'
3900     unless @inputs;
3902   my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am,
3903                                                             $makefile_in);
3904   my $rel_makefile = basename $makefile;
3906   my $colon_infile = ':' . join (':', @inputs);
3907   $colon_infile = '' if $colon_infile eq ":$makefile.in";
3908   my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs);
3909   my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4;
3910   define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL,
3911                           @configure_deps, @aclocal_m4_deps,
3912                           '$(top_srcdir)/' . $configure_ac);
3913   my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)');
3914   push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4';
3915   define_pretty_variable ('am__configure_deps', TRUE, INTERNAL,
3916                           @configuredeps);
3918   $output_rules .= file_contents
3919     ('configure',
3920      new Automake::Location,
3921      MAKEFILE              => $rel_makefile,
3922      'MAKEFILE-DEPS'       => "@rewritten",
3923      'CONFIG-MAKEFILE'     => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@',
3924      'MAKEFILE-IN'         => $rel_makefile_in,
3925      'MAKEFILE-IN-DEPS'    => "@include_stack",
3926      'MAKEFILE-AM'         => $rel_makefile_am,
3927      STRICTNESS            => global_option 'cygnus'
3928                                 ? 'cygnus' : $strictness_name,
3929      'USE-DEPS'            => global_option 'no-dependencies'
3930                                 ? ' --ignore-deps' : '',
3931      'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile",
3932      'REGEN-ACLOCAL-M4'    => $regen_aclocal_m4);
3934   if ($relative_dir eq '.')
3935     {
3936       &push_dist_common ('acconfig.h')
3937         if -f 'acconfig.h';
3938     }
3940   # If we have a configure header, require it.
3941   my $hdr_index = 0;
3942   my @distclean_config;
3943   foreach my $spec (@config_headers)
3944     {
3945       $hdr_index += 1;
3946       # $CONFIG_H_PATH: config.h from top level.
3947       my ($config_h_path, @ins) = split_config_file_spec ($spec);
3948       my $config_h_dir = dirname ($config_h_path);
3950       # If the header is in the current directory we want to build
3951       # the header here.  Otherwise, if we're at the topmost
3952       # directory and the header's directory doesn't have a
3953       # Makefile, then we also want to build the header.
3954       if ($relative_dir eq $config_h_dir
3955           || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir)))
3956         {
3957           my ($cn_sans_dir, $stamp_dir);
3958           if ($relative_dir eq $config_h_dir)
3959             {
3960               $cn_sans_dir = basename ($config_h_path);
3961               $stamp_dir = '';
3962             }
3963           else
3964             {
3965               $cn_sans_dir = $config_h_path;
3966               if ($config_h_dir eq '.')
3967                 {
3968                   $stamp_dir = '';
3969                 }
3970               else
3971                 {
3972                   $stamp_dir = $config_h_dir . '/';
3973                 }
3974             }
3976           # This will also distribute all inputs.
3977           @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins);
3979           # Cannot define rebuild rules for filenames with shell variables.
3980           next if (substitute_ac_subst_variables $config_h_path) =~ /\$/;
3982           # Header defined in this directory.
3983           my @files;
3984           if (-f $config_h_path . '.top')
3985             {
3986               push (@files, "$cn_sans_dir.top");
3987             }
3988           if (-f $config_h_path . '.bot')
3989             {
3990               push (@files, "$cn_sans_dir.bot");
3991             }
3993           push_dist_common (@files);
3995           # For now, acconfig.h can only appear in the top srcdir.
3996           if (-f 'acconfig.h')
3997             {
3998               push (@files, '$(top_srcdir)/acconfig.h');
3999             }
4001           my $stamp = "${stamp_dir}stamp-h${hdr_index}";
4002           $output_rules .=
4003             file_contents ('remake-hdr',
4004                            new Automake::Location,
4005                            FILES            => "@files",
4006                            CONFIG_H         => $cn_sans_dir,
4007                            CONFIG_HIN       => $ins[0],
4008                            CONFIG_H_DEPS    => "@ins",
4009                            CONFIG_H_PATH    => $config_h_path,
4010                            STAMP            => "$stamp");
4012           push @distclean_config, $cn_sans_dir, $stamp;
4013         }
4014     }
4016   $output_rules .= file_contents ('clean-hdr',
4017                                   new Automake::Location,
4018                                   FILES => "@distclean_config")
4019     if @distclean_config;
4021   # Distribute and define mkinstalldirs only if it is already present
4022   # in the package, for backward compatibility (some people may still
4023   # use $(mkinstalldirs)).
4024   my $mkidpath = "$config_aux_dir/mkinstalldirs";
4025   if (-f $mkidpath)
4026     {
4027       # Use require_file so that any existing script gets updated
4028       # by --force-missing.
4029       require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs');
4030       define_variable ('mkinstalldirs',
4031                        "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL);
4032     }
4033   else
4034     {
4035       # Use $(install_sh), not $(MKDIR_P) because the latter requires
4036       # at least one argument, and $(mkinstalldirs) used to work
4037       # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)).
4038       define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL);
4039     }
4041   reject_var ('CONFIG_HEADER',
4042               "`CONFIG_HEADER' is an anachronism; now determined "
4043               . "automatically\nfrom `$configure_ac'");
4045   my @config_h;
4046   foreach my $spec (@config_headers)
4047     {
4048       my ($out, @ins) = split_config_file_spec ($spec);
4049       # Generate CONFIG_HEADER define.
4050       if ($relative_dir eq dirname ($out))
4051         {
4052           push @config_h, basename ($out);
4053         }
4054       else
4055         {
4056           push @config_h, "\$(top_builddir)/$out";
4057         }
4058     }
4059   define_variable ("CONFIG_HEADER", "@config_h", INTERNAL)
4060     if @config_h;
4062   # Now look for other files in this directory which must be remade
4063   # by config.status, and generate rules for them.
4064   my @actual_other_files = ();
4065   foreach my $lfile (@other_input_files)
4066     {
4067       my $file;
4068       my @inputs;
4069       if ($lfile =~ /^([^:]*):(.*)$/)
4070         {
4071           # This is the ":" syntax of AC_OUTPUT.
4072           $file = $1;
4073           @inputs = split (':', $2);
4074         }
4075       else
4076         {
4077           # Normal usage.
4078           $file = $lfile;
4079           @inputs = $file . '.in';
4080         }
4082       # Automake files should not be stored in here, but in %MAKE_LIST.
4083       prog_error ("$lfile in \@other_input_files\n"
4084                   . "\@other_input_files = (@other_input_files)")
4085         if -f $file . '.am';
4087       my $local = basename ($file);
4089       # We skip files that aren't in this directory.  However, if
4090       # the file's directory does not have a Makefile, and we are
4091       # currently doing `.', then we create a rule to rebuild the
4092       # file in the subdir.
4093       my $fd = dirname ($file);
4094       if ($fd ne $relative_dir)
4095         {
4096           if ($relative_dir eq '.' && ! &is_make_dir ($fd))
4097             {
4098               $local = $file;
4099             }
4100           else
4101             {
4102               next;
4103             }
4104         }
4106       my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs);
4108       # Cannot output rules for shell variables.
4109       next if (substitute_ac_subst_variables $local) =~ /\$/;
4111       $output_rules .= ($local . ': '
4112                         . '$(top_builddir)/config.status '
4113                         . "@rewritten_inputs\n"
4114                         . "\t"
4115                         . 'cd $(top_builddir) && '
4116                         . '$(SHELL) ./config.status '
4117                         . ($relative_dir eq '.' ? '' : '$(subdir)/')
4118                         . '$@'
4119                         . "\n");
4120       push (@actual_other_files, $local);
4121     }
4123   # For links we should clean destinations and distribute sources.
4124   foreach my $spec (@config_links)
4125     {
4126       my ($link, $file) = split /:/, $spec;
4127       # Some people do AC_CONFIG_LINKS($computed).  We only handle
4128       # the DEST:SRC form.
4129       next unless $file;
4130       my $where = $ac_config_files_location{$link};
4132       # Skip destinations that contain shell variables.
4133       if ((substitute_ac_subst_variables $link) !~ /\$/)
4134         {
4135           # We skip links that aren't in this directory.  However, if
4136           # the link's directory does not have a Makefile, and we are
4137           # currently doing `.', then we add the link to CONFIG_CLEAN_FILES
4138           # in `.'s Makefile.in.
4139           my $local = basename ($link);
4140           my $fd = dirname ($link);
4141           if ($fd ne $relative_dir)
4142             {
4143               if ($relative_dir eq '.' && ! &is_make_dir ($fd))
4144                 {
4145                   $local = $link;
4146                 }
4147               else
4148                 {
4149                   $local = undef;
4150                 }
4151             }
4152           push @actual_other_files, $local if $local;
4153         }
4155       # Do not process sources that contain shell variables.
4156       if ((substitute_ac_subst_variables $file) !~ /\$/)
4157         {
4158           my $fd = dirname ($file);
4160           # We distribute files that are in this directory.
4161           # At the top-level (`.') we also distribute files whose
4162           # directory does not have a Makefile.
4163           if (($fd eq $relative_dir)
4164               || ($relative_dir eq '.' && ! &is_make_dir ($fd)))
4165             {
4166               # The following will distribute $file as a side-effect when
4167               # it is appropriate (i.e., when $file is not already an output).
4168               # We do not need the result, just the side-effect.
4169               rewrite_inputs_into_dependencies ($link, $file);
4170             }
4171         }
4172     }
4174   # These files get removed by "make distclean".
4175   define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL,
4176                           @actual_other_files);
4179 # Handle C headers.
4180 sub handle_headers
4182     my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include',
4183                              'oldinclude', 'pkginclude',
4184                              'noinst', 'check');
4185     foreach (@r)
4186     {
4187       next unless $_->[1] =~ /\..*$/;
4188       &saw_extension ($&);
4189     }
4192 sub handle_gettext
4194   return if ! $seen_gettext || $relative_dir ne '.';
4196   my $subdirs = var 'SUBDIRS';
4198   if (! $subdirs)
4199     {
4200       err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined";
4201       return;
4202     }
4204   # Perform some sanity checks to help users get the right setup.
4205   # We disable these tests when po/ doesn't exist in order not to disallow
4206   # unusual gettext setups.
4207   #
4208   # Bruno Haible:
4209   # | The idea is:
4210   # |
4211   # |  1) If a package doesn't have a directory po/ at top level, it
4212   # |     will likely have multiple po/ directories in subpackages.
4213   # |
4214   # |  2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT
4215   # |     is used without 'external'. It is also useful to warn for the
4216   # |     presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both
4217   # |     warnings apply only to the usual layout of packages, therefore
4218   # |     they should both be disabled if no po/ directory is found at
4219   # |     top level.
4221   if (-d 'po')
4222     {
4223       my @subdirs = $subdirs->value_as_list_recursive;
4225       msg_var ('syntax', $subdirs,
4226                "AM_GNU_GETTEXT used but `po' not in SUBDIRS")
4227         if ! grep ($_ eq 'po', @subdirs);
4229       # intl/ is not required when AM_GNU_GETTEXT is called with
4230       # the `external' option.
4231       msg_var ('syntax', $subdirs,
4232                "AM_GNU_GETTEXT used but `intl' not in SUBDIRS")
4233         if (! $seen_gettext_external
4234             && ! grep ($_ eq 'intl', @subdirs));
4236       # intl/ should not be used with AM_GNU_GETTEXT([external])
4237       msg_var ('syntax', $subdirs,
4238                "`intl' should not be in SUBDIRS when "
4239                . "AM_GNU_GETTEXT([external]) is used")
4240         if ($seen_gettext_external && grep ($_ eq 'intl', @subdirs));
4241     }
4243   require_file ($ac_gettext_location, GNU, 'ABOUT-NLS');
4246 # Handle footer elements.
4247 sub handle_footer
4249     reject_rule ('.SUFFIXES',
4250                  "use variable `SUFFIXES', not target `.SUFFIXES'");
4252     # Note: AIX 4.1 /bin/make will fail if any suffix rule appears
4253     # before .SUFFIXES.  So we make sure that .SUFFIXES appears before
4254     # anything else, by sticking it right after the default: target.
4255     $output_header .= ".SUFFIXES:\n";
4256     my $suffixes = var 'SUFFIXES';
4257     my @suffixes = Automake::Rule::suffixes;
4258     if (@suffixes || $suffixes)
4259     {
4260         # Make sure SUFFIXES has unique elements.  Sort them to ensure
4261         # the output remains consistent.  However, $(SUFFIXES) is
4262         # always at the start of the list, unsorted.  This is done
4263         # because make will choose rules depending on the ordering of
4264         # suffixes, and this lets the user have some control.  Push
4265         # actual suffixes, and not $(SUFFIXES).  Some versions of make
4266         # do not like variable substitutions on the .SUFFIXES line.
4267         my @user_suffixes = ($suffixes
4268                              ? $suffixes->value_as_list_recursive : ());
4270         my %suffixes = map { $_ => 1 } @suffixes;
4271         delete @suffixes{@user_suffixes};
4273         $output_header .= (".SUFFIXES: "
4274                            . join (' ', @user_suffixes, sort keys %suffixes)
4275                            . "\n");
4276     }
4278     $output_trailer .= file_contents ('footer', new Automake::Location);
4282 # Generate `make install' rules.
4283 sub handle_install ()
4285   $output_rules .= &file_contents
4286     ('install',
4287      new Automake::Location,
4288      maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES')
4289                              ? (" \$(BUILT_SOURCES)\n"
4290                                 . "\t\$(MAKE) \$(AM_MAKEFLAGS)")
4291                              : ''),
4292      'installdirs-local' => (user_phony_rule 'installdirs-local'
4293                              ? ' installdirs-local' : ''),
4294      am__installdirs => variable_value ('am__installdirs') || '');
4298 # Deal with all and all-am.
4299 sub handle_all ($)
4301     my ($makefile) = @_;
4303     # Output `all-am'.
4305     # Put this at the beginning for the sake of non-GNU makes.  This
4306     # is still wrong if these makes can run parallel jobs.  But it is
4307     # right enough.
4308     unshift (@all, basename ($makefile));
4310     foreach my $spec (@config_headers)
4311       {
4312         my ($out, @ins) = split_config_file_spec ($spec);
4313         push (@all, basename ($out))
4314           if dirname ($out) eq $relative_dir;
4315       }
4317     # Install `all' hooks.
4318     push (@all, "all-local")
4319       if user_phony_rule "all-local";
4321     &pretty_print_rule ("all-am:", "\t\t", @all);
4322     &depend ('.PHONY', 'all-am', 'all');
4325     # Output `all'.
4327     my @local_headers = ();
4328     push @local_headers, '$(BUILT_SOURCES)'
4329       if var ('BUILT_SOURCES');
4330     foreach my $spec (@config_headers)
4331       {
4332         my ($out, @ins) = split_config_file_spec ($spec);
4333         push @local_headers, basename ($out)
4334           if dirname ($out) eq $relative_dir;
4335       }
4337     if (@local_headers)
4338       {
4339         # We need to make sure config.h is built before we recurse.
4340         # We also want to make sure that built sources are built
4341         # before any ordinary `all' targets are run.  We can't do this
4342         # by changing the order of dependencies to the "all" because
4343         # that breaks when using parallel makes.  Instead we handle
4344         # things explicitly.
4345         $output_all .= ("all: @local_headers"
4346                         . "\n\t"
4347                         . '$(MAKE) $(AM_MAKEFLAGS) '
4348                         . (var ('SUBDIRS') ? 'all-recursive' : 'all-am')
4349                         . "\n\n");
4350       }
4351     else
4352       {
4353         $output_all .= "all: " . (var ('SUBDIRS')
4354                                   ? 'all-recursive' : 'all-am') . "\n\n";
4355       }
4359 # &do_check_merge_target ()
4360 # -------------------------
4361 # Handle check merge target specially.
4362 sub do_check_merge_target ()
4364   # Include user-defined local form of target.
4365   push @check_tests, 'check-local'
4366     if user_phony_rule 'check-local';
4368   # In --cygnus mode, check doesn't depend on all.
4369   if (option 'cygnus')
4370     {
4371       # Just run the local check rules.
4372       pretty_print_rule ('check-am:', "\t\t", @check);
4373     }
4374   else
4375     {
4376       # The check target must depend on the local equivalent of
4377       # `all', to ensure all the primary targets are built.  Then it
4378       # must build the local check rules.
4379       $output_rules .= "check-am: all-am\n";
4380       pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4381                          @check)
4382         if @check;
4383     }
4384   pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t  ",
4385                      @check_tests)
4386     if @check_tests;
4388   depend '.PHONY', 'check', 'check-am';
4389   # Handle recursion.  We have to honor BUILT_SOURCES like for `all:'.
4390   $output_rules .= ("check: "
4391                     . (var ('BUILT_SOURCES')
4392                        ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) "
4393                        : '')
4394                     . (var ('SUBDIRS') ? 'check-recursive' : 'check-am')
4395                     . "\n");
4398 # handle_clean ($MAKEFILE)
4399 # ------------------------
4400 # Handle all 'clean' targets.
4401 sub handle_clean ($)
4403   my ($makefile) = @_;
4405   # Clean the files listed in user variables if they exist.
4406   $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN
4407     if var ('MOSTLYCLEANFILES');
4408   $clean_files{'$(CLEANFILES)'} = CLEAN
4409     if var ('CLEANFILES');
4410   $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN
4411     if var ('DISTCLEANFILES');
4412   $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN
4413     if var ('MAINTAINERCLEANFILES');
4415   # Built sources are automatically removed by maintainer-clean.
4416   $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN
4417     if var ('BUILT_SOURCES');
4419   # Compute a list of "rm"s to run for each target.
4420   my %rms = (MOSTLY_CLEAN, [],
4421              CLEAN, [],
4422              DIST_CLEAN, [],
4423              MAINTAINER_CLEAN, []);
4425   foreach my $file (keys %clean_files)
4426     {
4427       my $when = $clean_files{$file};
4428       prog_error 'invalid entry in %clean_files'
4429         unless exists $rms{$when};
4431       my $rm = "rm -f $file";
4432       # If file is a variable, make sure when don't call `rm -f' without args.
4433       $rm ="test -z \"$file\" || $rm"
4434         if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/);
4436       push @{$rms{$when}}, "\t-$rm\n";
4437     }
4439   $output_rules .= &file_contents
4440     ('clean',
4441      new Automake::Location,
4442      MOSTLYCLEAN_RMS      => join ('', sort @{$rms{&MOSTLY_CLEAN}}),
4443      CLEAN_RMS            => join ('', sort @{$rms{&CLEAN}}),
4444      DISTCLEAN_RMS        => join ('', sort @{$rms{&DIST_CLEAN}}),
4445      MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}),
4446      MAKEFILE             => basename $makefile,
4447      );
4451 # &target_cmp ($A, $B)
4452 # --------------------
4453 # Subroutine for &handle_factored_dependencies to let `.PHONY' and
4454 # other `.TARGETS' be last.
4455 sub target_cmp
4457   return 0 if $a eq $b;
4459   my $a1 = substr ($a, 0, 1);
4460   my $b1 = substr ($b, 0, 1);
4461   if ($a1 ne $b1)
4462     {
4463       return -1 if $b1 eq '.';
4464       return 1 if $a1 eq '.';
4465     }
4466   return $a cmp $b;
4470 # &handle_factored_dependencies ()
4471 # --------------------------------
4472 # Handle everything related to gathered targets.
4473 sub handle_factored_dependencies
4475   # Reject bad hooks.
4476   foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook',
4477                      'uninstall-exec-local', 'uninstall-exec-hook',
4478                      'uninstall-dvi-local',
4479                      'uninstall-html-local',
4480                      'uninstall-info-local',
4481                      'uninstall-pdf-local',
4482                      'uninstall-ps-local')
4483     {
4484       my $x = $utarg;
4485       $x =~ s/-.*-/-/;
4486       reject_rule ($utarg, "use `$x', not `$utarg'");
4487     }
4489   reject_rule ('install-local',
4490                "use `install-data-local' or `install-exec-local', "
4491                . "not `install-local'");
4493   reject_rule ('install-hook',
4494                "use `install-data-hook' or `install-exec-hook', "
4495                . "not `install-hook'");
4497   # Install the -local hooks.
4498   foreach (keys %dependencies)
4499     {
4500       # Hooks are installed on the -am targets.
4501       s/-am$// or next;
4502       depend ("$_-am", "$_-local")
4503         if user_phony_rule "$_-local";
4504     }
4506   # Install the -hook hooks.
4507   # FIXME: Why not be as liberal as we are with -local hooks?
4508   foreach ('install-exec', 'install-data', 'uninstall')
4509     {
4510       if (user_phony_rule "$_-hook")
4511         {
4512           $actions{"$_-am"} .=
4513             ("\t\@\$(NORMAL_INSTALL)\n"
4514              . "\t" . '$(MAKE) $(AM_MAKEFLAGS) ' . "$_-hook\n");
4515           depend ('.MAKE', "$_-am");
4516         }
4517     }
4519   # All the required targets are phony.
4520   depend ('.PHONY', keys %required_targets);
4522   # Actually output gathered targets.
4523   foreach (sort target_cmp keys %dependencies)
4524     {
4525       # If there is nothing about this guy, skip it.
4526       next
4527         unless (@{$dependencies{$_}}
4528                 || $actions{$_}
4529                 || $required_targets{$_});
4531       # Define gathered targets in undefined conditions.
4532       # FIXME: Right now we must handle .PHONY as an exception,
4533       # because people write things like
4534       #    .PHONY: myphonytarget
4535       # to append dependencies.  This would not work if Automake
4536       # refrained from defining its own .PHONY target as it does
4537       # with other overridden targets.
4538       # Likewise for `.MAKE'.
4539       my @undefined_conds = (TRUE,);
4540       if ($_ ne '.PHONY' && $_ ne '.MAKE')
4541         {
4542           @undefined_conds =
4543             Automake::Rule::define ($_, 'internal',
4544                                     RULE_AUTOMAKE, TRUE, INTERNAL);
4545         }
4546       my @uniq_deps = uniq (sort @{$dependencies{$_}});
4547       foreach my $cond (@undefined_conds)
4548         {
4549           my $condstr = $cond->subst_string;
4550           &pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps);
4551           $output_rules .= $actions{$_} if defined $actions{$_};
4552           $output_rules .= "\n";
4553         }
4554     }
4558 # &handle_tests_dejagnu ()
4559 # ------------------------
4560 sub handle_tests_dejagnu
4562     push (@check_tests, 'check-DEJAGNU');
4563     $output_rules .= file_contents ('dejagnu', new Automake::Location);
4567 # Handle TESTS variable and other checks.
4568 sub handle_tests
4570   if (option 'dejagnu')
4571     {
4572       &handle_tests_dejagnu;
4573     }
4574   else
4575     {
4576       foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS')
4577         {
4578           reject_var ($c, "`$c' defined but `dejagnu' not in "
4579                       . "`AUTOMAKE_OPTIONS'");
4580         }
4581     }
4583   if (var ('TESTS'))
4584     {
4585       push (@check_tests, 'check-TESTS');
4586       $output_rules .= &file_contents ('check', new Automake::Location);
4588       # Tests that are known programs should have $(EXEEXT) appended.
4589       append_exeext { exists $known_programs{$_[0]} } 'TESTS';
4590     }
4593 # Handle Emacs Lisp.
4594 sub handle_emacs_lisp
4596   my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP',
4597                                  'lisp', 'noinst');
4599   return if ! @elfiles;
4601   define_pretty_variable ('am__ELFILES', TRUE, INTERNAL,
4602                           map { $_->[1] } @elfiles);
4603   define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL,
4604                           '$(am__ELFILES:.el=.elc)');
4605   # This one can be overridden by users.
4606   define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)');
4608   push @all, '$(ELCFILES)';
4610   require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE,
4611                      'EMACS', 'lispdir');
4612   require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp');
4613   &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL);
4616 # Handle Python
4617 sub handle_python
4619   my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON',
4620                                  'noinst');
4621   return if ! @pyfiles;
4623   require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON');
4624   require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile');
4625   &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL);
4628 # Handle Java.
4629 sub handle_java
4631     my @sourcelist = &am_install_var ('-candist',
4632                                       'java', 'JAVA',
4633                                       'java', 'noinst', 'check');
4634     return if ! @sourcelist;
4636     my @prefix = am_primary_prefixes ('JAVA', 1,
4637                                       'java', 'noinst', 'check');
4639     my $dir;
4640     foreach my $curs (@prefix)
4641       {
4642         next
4643           if $curs eq 'EXTRA';
4645         err_var "${curs}_JAVA", "multiple _JAVA primaries in use"
4646           if defined $dir;
4647         $dir = $curs;
4648       }
4651     push (@all, 'class' . $dir . '.stamp');
4655 # Handle some of the minor options.
4656 sub handle_minor_options
4658   if (option 'readme-alpha')
4659     {
4660       if ($relative_dir eq '.')
4661         {
4662           if ($package_version !~ /^$GNITS_VERSION_PATTERN$/)
4663             {
4664               msg ('error-gnits', $package_version_location,
4665                    "version `$package_version' doesn't follow " .
4666                    "Gnits standards");
4667             }
4668           if (defined $1 && -f 'README-alpha')
4669             {
4670               # This means we have an alpha release.  See
4671               # GNITS_VERSION_PATTERN for details.
4672               push_dist_common ('README-alpha');
4673             }
4674         }
4675     }
4678 ################################################################
4680 # ($OUTPUT, @INPUTS)
4681 # &split_config_file_spec ($SPEC)
4682 # -------------------------------
4683 # Decode the Autoconf syntax for config files (files, headers, links
4684 # etc.).
4685 sub split_config_file_spec ($)
4687   my ($spec) = @_;
4688   my ($output, @inputs) = split (/:/, $spec);
4690   push @inputs, "$output.in"
4691     unless @inputs;
4693   return ($output, @inputs);
4696 # $input
4697 # locate_am (@POSSIBLE_SOURCES)
4698 # -----------------------------
4699 # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in
4700 # This functions returns the first *.in file for which a *.am exists.
4701 # It returns undef otherwise.
4702 sub locate_am (@)
4704   my (@rest) = @_;
4705   my $input;
4706   foreach my $file (@rest)
4707     {
4708       if (($file =~ /^(.*)\.in$/) && -f "$1.am")
4709         {
4710           $input = $file;
4711           last;
4712         }
4713     }
4714   return $input;
4717 my %make_list;
4719 # &scan_autoconf_config_files ($WHERE, $CONFIG-FILES)
4720 # ---------------------------------------------------
4721 # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES
4722 # (or AC_OUTPUT).
4723 sub scan_autoconf_config_files ($$)
4725   my ($where, $config_files) = @_;
4727   # Look at potential Makefile.am's.
4728   foreach (split ' ', $config_files)
4729     {
4730       # Must skip empty string for Perl 4.
4731       next if $_ eq "\\" || $_ eq '';
4733       # Handle $local:$input syntax.
4734       my ($local, @rest) = split (/:/);
4735       @rest = ("$local.in",) unless @rest;
4736       my $input = locate_am @rest;
4737       if ($input)
4738         {
4739           # We have a file that automake should generate.
4740           $make_list{$input} = join (':', ($local, @rest));
4741         }
4742       else
4743         {
4744           # We have a file that automake should cause to be
4745           # rebuilt, but shouldn't generate itself.
4746           push (@other_input_files, $_);
4747         }
4748       $ac_config_files_location{$local} = $where;
4749     }
4753 # &scan_autoconf_traces ($FILENAME)
4754 # ---------------------------------
4755 sub scan_autoconf_traces ($)
4757   my ($filename) = @_;
4759   # Macros to trace, with their minimal number of arguments.
4760   #
4761   # IMPORTANT: If you add a macro here, you should also add this macro
4762   # =========  to Automake-preselection in autoconf/lib/autom4te.in.
4763   my %traced = (
4764                 AC_CANONICAL_BUILD => 0,
4765                 AC_CANONICAL_HOST => 0,
4766                 AC_CANONICAL_TARGET => 0,
4767                 AC_CONFIG_AUX_DIR => 1,
4768                 AC_CONFIG_FILES => 1,
4769                 AC_CONFIG_HEADERS => 1,
4770                 AC_CONFIG_LIBOBJ_DIR => 1,
4771                 AC_CONFIG_LINKS => 1,
4772                 AC_INIT => 0,
4773                 AC_LIBSOURCE => 1,
4774                 AC_REQUIRE_AUX_FILE => 1,
4775                 AC_SUBST_TRACE => 1,
4776                 AM_AUTOMAKE_VERSION => 1,
4777                 AM_CONDITIONAL => 2,
4778                 AM_ENABLE_MULTILIB => 0,
4779                 AM_GNU_GETTEXT => 0,
4780                 AM_INIT_AUTOMAKE => 0,
4781                 AM_MAINTAINER_MODE => 0,
4782                 AM_PROG_CC_C_O => 0,
4783                 _AM_SUBST_NOTMAKE => 1,
4784                 LT_SUPPORTED_TAG => 1,
4785                 _LT_AC_TAGCONFIG => 0,
4786                 m4_include => 1,
4787                 m4_sinclude => 1,
4788                 sinclude => 1,
4789               );
4791   my $traces = ($ENV{AUTOCONF} || 'autoconf') . " ";
4793   # Use a separator unlikely to be used, not `:', the default, which
4794   # has a precise meaning for AC_CONFIG_FILES and so on.
4795   $traces .= join (' ',
4796                    map { "--trace=$_" . ':\$f:\$l::\$n::\${::}%' }
4797                    (keys %traced));
4799   my $tracefh = new Automake::XFile ("$traces $filename |");
4800   verb "reading $traces";
4802   while ($_ = $tracefh->getline)
4803     {
4804       chomp;
4805       my ($here, @args) = split (/::/);
4806       my $where = new Automake::Location $here;
4807       my $macro = $args[0];
4809       prog_error ("unrequested trace `$macro'")
4810         unless exists $traced{$macro};
4812       # Skip and diagnose malformed calls.
4813       if ($#args < $traced{$macro})
4814         {
4815           msg ('syntax', $where, "not enough arguments for $macro");
4816           next;
4817         }
4819       # Alphabetical ordering please.
4820       if ($macro eq 'AC_CANONICAL_BUILD')
4821         {
4822           if ($seen_canonical <= AC_CANONICAL_BUILD)
4823             {
4824               $seen_canonical = AC_CANONICAL_BUILD;
4825               $canonical_location = $where;
4826             }
4827         }
4828       elsif ($macro eq 'AC_CANONICAL_HOST')
4829         {
4830           if ($seen_canonical <= AC_CANONICAL_HOST)
4831             {
4832               $seen_canonical = AC_CANONICAL_HOST;
4833               $canonical_location = $where;
4834             }
4835         }
4836       elsif ($macro eq 'AC_CANONICAL_TARGET')
4837         {
4838           $seen_canonical = AC_CANONICAL_TARGET;
4839           $canonical_location = $where;
4840         }
4841       elsif ($macro eq 'AC_CONFIG_AUX_DIR')
4842         {
4843           if ($seen_init_automake)
4844             {
4845               error ($where, "AC_CONFIG_AUX_DIR must be called before "
4846                      . "AM_INIT_AUTOMAKE...", partial => 1);
4847               error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here");
4848             }
4849           $config_aux_dir = $args[1];
4850           $config_aux_dir_set_in_configure_ac = 1;
4851           $relative_dir = '.';
4852           check_directory ($config_aux_dir, $where);
4853         }
4854       elsif ($macro eq 'AC_CONFIG_FILES')
4855         {
4856           # Look at potential Makefile.am's.
4857           scan_autoconf_config_files ($where, $args[1]);
4858         }
4859       elsif ($macro eq 'AC_CONFIG_HEADERS')
4860         {
4861           foreach my $spec (split (' ', $args[1]))
4862             {
4863               my ($dest, @src) = split (':', $spec);
4864               $ac_config_files_location{$dest} = $where;
4865               push @config_headers, $spec;
4866             }
4867         }
4868       elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR')
4869         {
4870           $config_libobj_dir = $args[1];
4871           $relative_dir = '.';
4872           check_directory ($config_libobj_dir, $where);
4873         }
4874       elsif ($macro eq 'AC_CONFIG_LINKS')
4875         {
4876           foreach my $spec (split (' ', $args[1]))
4877             {
4878               my ($dest, $src) = split (':', $spec);
4879               $ac_config_files_location{$dest} = $where;
4880               push @config_links, $spec;
4881             }
4882         }
4883       elsif ($macro eq 'AC_INIT')
4884         {
4885           if (defined $args[2])
4886             {
4887               $package_version = $args[2];
4888               $package_version_location = $where;
4889             }
4890         }
4891       elsif ($macro eq 'AC_LIBSOURCE')
4892         {
4893           $libsources{$args[1]} = $here;
4894         }
4895       elsif ($macro eq 'AC_REQUIRE_AUX_FILE')
4896         {
4897           # Only remember the first time a file is required.
4898           $required_aux_file{$args[1]} = $where
4899             unless exists $required_aux_file{$args[1]};
4900         }
4901       elsif ($macro eq 'AC_SUBST_TRACE')
4902         {
4903           # Just check for alphanumeric in AC_SUBST_TRACE.  If you do
4904           # AC_SUBST(5), then too bad.
4905           $configure_vars{$args[1]} = $where
4906             if $args[1] =~ /^\w+$/;
4907         }
4908       elsif ($macro eq 'AM_AUTOMAKE_VERSION')
4909         {
4910           error ($where,
4911                  "version mismatch.  This is Automake $VERSION,\n" .
4912                  "but the definition used by this AM_INIT_AUTOMAKE\n" .
4913                  "comes from Automake $args[1].  You should recreate\n" .
4914                  "aclocal.m4 with aclocal and run automake again.\n",
4915                  # $? = 63 is used to indicate version mismatch to missing.
4916                  exit_code => 63)
4917             if $VERSION ne $args[1];
4919           $seen_automake_version = 1;
4920         }
4921       elsif ($macro eq 'AM_CONDITIONAL')
4922         {
4923           $configure_cond{$args[1]} = $where;
4924         }
4925       elsif ($macro eq 'AM_ENABLE_MULTILIB')
4926         {
4927           $seen_multilib = $where;
4928         }
4929       elsif ($macro eq 'AM_GNU_GETTEXT')
4930         {
4931           $seen_gettext = $where;
4932           $ac_gettext_location = $where;
4933           $seen_gettext_external = grep ($_ eq 'external', @args);
4934         }
4935       elsif ($macro eq 'AM_INIT_AUTOMAKE')
4936         {
4937           $seen_init_automake = $where;
4938           if (defined $args[2])
4939             {
4940               $package_version = $args[2];
4941               $package_version_location = $where;
4942             }
4943           elsif (defined $args[1])
4944             {
4945               exit $exit_code
4946                 if (process_global_option_list ($where,
4947                                                 split (' ', $args[1])));
4948             }
4949         }
4950       elsif ($macro eq 'AM_MAINTAINER_MODE')
4951         {
4952           $seen_maint_mode = $where;
4953         }
4954       elsif ($macro eq 'AM_PROG_CC_C_O')
4955         {
4956           $seen_cc_c_o = $where;
4957         }
4958       elsif ($macro eq '_AM_SUBST_NOTMAKE')
4959         {
4960           $ignored_configure_vars{$args[1]} = $where;
4961         }
4962       elsif ($macro eq 'm4_include'
4963              || $macro eq 'm4_sinclude'
4964              || $macro eq 'sinclude')
4965         {
4966           # Skip missing `sinclude'd files.
4967           next if $macro ne 'm4_include' && ! -f $args[1];
4969           # Some modified versions of Autoconf don't use
4970           # forzen files.  Consequently it's possible that we see all
4971           # m4_include's performed during Autoconf's startup.
4972           # Obviously we don't want to distribute Autoconf's files
4973           # so we skip absolute filenames here.
4974           push @configure_deps, '$(top_srcdir)/' . $args[1]
4975             unless $here =~ m,^(?:\w:)?[\\/],;
4976           # Keep track of the greatest timestamp.
4977           if (-e $args[1])
4978             {
4979               my $mtime = mtime $args[1];
4980               $configure_deps_greatest_timestamp = $mtime
4981                 if $mtime > $configure_deps_greatest_timestamp;
4982             }
4983         }
4984       elsif ($macro eq 'LT_SUPPORTED_TAG')
4985         {
4986           $libtool_tags{$args[1]} = 1;
4987           $libtool_new_api = 1;
4988         }
4989       elsif ($macro eq '_LT_AC_TAGCONFIG')
4990         {
4991           # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5.
4992           # We use it to detect whether tags are supported.  Our
4993           # prefered interface is LT_SUPPORTED_TAG, but it was
4994           # introduced in Libtool 1.6.
4995           if (0 == keys %libtool_tags)
4996             {
4997               # Hardcode the tags supported by Libtool 1.5.
4998               %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1);
4999             }
5000         }
5001     }
5003   $tracefh->close;
5007 # &scan_autoconf_files ()
5008 # -----------------------
5009 # Check whether we use `configure.ac' or `configure.in'.
5010 # Scan it (and possibly `aclocal.m4') for interesting things.
5011 # We must scan aclocal.m4 because there might be AC_SUBSTs and such there.
5012 sub scan_autoconf_files ()
5014   # Reinitialize libsources here.  This isn't really necessary,
5015   # since we currently assume there is only one configure.ac.  But
5016   # that won't always be the case.
5017   %libsources = ();
5019   # Keep track of the youngest configure dependency.
5020   $configure_deps_greatest_timestamp = mtime $configure_ac;
5021   if (-e 'aclocal.m4')
5022     {
5023       my $mtime = mtime 'aclocal.m4';
5024       $configure_deps_greatest_timestamp = $mtime
5025         if $mtime > $configure_deps_greatest_timestamp;
5026     }
5028   scan_autoconf_traces ($configure_ac);
5030   @configure_input_files = sort keys %make_list;
5031   # Set input and output files if not specified by user.
5032   if (! @input_files)
5033     {
5034       @input_files = @configure_input_files;
5035       %output_files = %make_list;
5036     }
5039   if (! $seen_init_automake)
5040     {
5041       err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou "
5042               . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE,"
5043               . "\nthat aclocal.m4 is present in the top-level directory,\n"
5044               . "and that aclocal.m4 was recently regenerated "
5045               . "(using aclocal).");
5046     }
5047   else
5048     {
5049       if (! $seen_automake_version)
5050         {
5051           if (-f 'aclocal.m4')
5052             {
5053               error ($seen_init_automake,
5054                      "your implementation of AM_INIT_AUTOMAKE comes from " .
5055                      "an\nold Automake version.  You should recreate " .
5056                      "aclocal.m4\nwith aclocal and run automake again.\n",
5057                      # $? = 63 is used to indicate version mismatch to missing.
5058                      exit_code => 63);
5059             }
5060           else
5061             {
5062               error ($seen_init_automake,
5063                      "no proper implementation of AM_INIT_AUTOMAKE was " .
5064                      "found,\nprobably because aclocal.m4 is missing...\n" .
5065                      "You should run aclocal to create this file, then\n" .
5066                      "run automake again.\n");
5067             }
5068         }
5069     }
5071   locate_aux_dir ();
5073   # Reorder @input_files so that the Makefile that distributes aux
5074   # files is processed last.  This is important because each directory
5075   # can require auxiliary scripts and we should wait until they have
5076   # been installed before distributing them.
5078   # The Makefile.in that distribute the aux files is the one in
5079   # $config_aux_dir or the top-level Makefile.
5080   my $auxdirdist = is_make_dir ($config_aux_dir) ? $config_aux_dir : '.';
5081   my @new_input_files = ();
5082   while (@input_files)
5083     {
5084       my $in = pop @input_files;
5085       my @ins = split (/:/, $output_files{$in});
5086       if (dirname ($ins[0]) eq $auxdirdist)
5087         {
5088           push @new_input_files, $in;
5089           $automake_will_process_aux_dir = 1;
5090         }
5091       else
5092         {
5093           unshift @new_input_files, $in;
5094         }
5095     }
5096   @input_files = @new_input_files;
5098   # If neither the auxdir/Makefile nor the ./Makefile are generated
5099   # by Automake, we won't distribute the aux files anyway.  Assume
5100   # the user know what (s)he does, and pretend we will distribute
5101   # them to disable the error in require_file_internal.
5102   $automake_will_process_aux_dir = 1 if ! is_make_dir ($auxdirdist);
5104   # Look for some files we need.  Always check for these.  This
5105   # check must be done for every run, even those where we are only
5106   # looking at a subdir Makefile.  We must set relative_dir for
5107   # maybe_push_required_file to work.
5108   $relative_dir = '.';
5109   foreach my $file (keys %required_aux_file)
5110     {
5111       require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file)
5112     }
5113   err_am "`install.sh' is an anachronism; use `install-sh' instead"
5114     if -f $config_aux_dir . '/install.sh';
5116   # Preserve dist_common for later.
5117   $configure_dist_common = variable_value ('DIST_COMMON') || '';
5121 ################################################################
5123 # Set up for Cygnus mode.
5124 sub check_cygnus
5126   my $cygnus = option 'cygnus';
5127   return unless $cygnus;
5129   set_strictness ('foreign');
5130   set_option ('no-installinfo', $cygnus);
5131   set_option ('no-dependencies', $cygnus);
5132   set_option ('no-dist', $cygnus);
5134   err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified"
5135     if !$seen_maint_mode;
5138 # Do any extra checking for GNU standards.
5139 sub check_gnu_standards
5141   if ($relative_dir eq '.')
5142     {
5143       # In top level (or only) directory.
5144       require_file ("$am_file.am", GNU,
5145                     qw/INSTALL NEWS README AUTHORS ChangeLog/);
5147       # Accept one of these three licenses; default to COPYING.
5148       # Make sure we do not overwrite an existing license.
5149       my $license;
5150       foreach (qw /COPYING COPYING.LIB COPYING.LESSER/)
5151         {
5152           if (-f $_)
5153             {
5154               $license = $_;
5155               last;
5156             }
5157         }
5158       require_file ("$am_file.am", GNU, 'COPYING')
5159         unless $license;
5160     }
5162   for my $opt ('no-installman', 'no-installinfo')
5163     {
5164       msg ('error-gnu', option $opt,
5165            "option `$opt' disallowed by GNU standards")
5166         if option $opt;
5167     }
5170 # Do any extra checking for GNITS standards.
5171 sub check_gnits_standards
5173   if ($relative_dir eq '.')
5174     {
5175       # In top level (or only) directory.
5176       require_file ("$am_file.am", GNITS, 'THANKS');
5177     }
5180 ################################################################
5182 # Functions to handle files of each language.
5184 # Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a
5185 # simple formula: Return value is LANG_SUBDIR if the resulting object
5186 # file should be in a subdir if the source file is, LANG_PROCESS if
5187 # file is to be dealt with, LANG_IGNORE otherwise.
5189 # Much of the actual processing is handled in
5190 # handle_single_transform.  These functions exist so that
5191 # auxiliary information can be recorded for a later cleanup pass.
5192 # Note that the calls to these functions are computed, so don't bother
5193 # searching for their precise names in the source.
5195 # This is just a convenience function that can be used to determine
5196 # when a subdir object should be used.
5197 sub lang_sub_obj
5199     return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS;
5202 # Rewrite a single C source file.
5203 sub lang_c_rewrite
5205   my ($directory, $base, $ext, $nonansi_obj, $have_per_exec_flags, $var) = @_;
5207   if (option 'ansi2knr' && $base =~ /_$/)
5208     {
5209       # FIXME: include line number in error.
5210       err_am "C source file `$base.c' would be deleted by ansi2knr rules";
5211     }
5213   my $r = LANG_PROCESS;
5214   if (option 'subdir-objects')
5215     {
5216       $r = LANG_SUBDIR;
5217       if ($directory && $directory ne '.')
5218         {
5219           $base = $directory . '/' . $base;
5221           # libtool is always able to put the object at the proper place,
5222           # so we do not have to require AM_PROG_CC_C_O when building .lo files.
5223           msg_var ('portability', $var,
5224                    "compiling `$base.c' in subdir requires "
5225                    . "`AM_PROG_CC_C_O' in `$configure_ac'",
5226                    uniq_scope => US_GLOBAL,
5227                    uniq_part => 'AM_PROG_CC_C_O subdir')
5228             unless $seen_cc_c_o || $nonansi_obj eq '.lo';
5229         }
5231       # In this case we already have the directory information, so
5232       # don't add it again.
5233       $de_ansi_files{$base} = '';
5234     }
5235   else
5236     {
5237       $de_ansi_files{$base} = (($directory eq '.' || $directory eq '')
5238                                ? ''
5239                                : "$directory/");
5240     }
5242   if (! $seen_cc_c_o
5243       && $have_per_exec_flags
5244       && ! option 'subdir-objects'
5245       && $nonansi_obj ne '.lo')
5246     {
5247       msg_var ('portability',
5248                $var, "compiling `$base.c' with per-target flags requires "
5249                . "`AM_PROG_CC_C_O' in `$configure_ac'",
5250                uniq_scope => US_GLOBAL,
5251                uniq_part => 'AM_PROG_CC_C_O per-target')
5252     }
5254     return $r;
5257 # Rewrite a single C++ source file.
5258 sub lang_cxx_rewrite
5260     return &lang_sub_obj;
5263 # Rewrite a single header file.
5264 sub lang_header_rewrite
5266     # Header files are simply ignored.
5267     return LANG_IGNORE;
5270 # Rewrite a single yacc file.
5271 sub lang_yacc_rewrite
5273     my ($directory, $base, $ext) = @_;
5275     my $r = &lang_sub_obj;
5276     (my $newext = $ext) =~ tr/y/c/;
5277     return ($r, $newext);
5280 # Rewrite a single yacc++ file.
5281 sub lang_yaccxx_rewrite
5283     my ($directory, $base, $ext) = @_;
5285     my $r = &lang_sub_obj;
5286     (my $newext = $ext) =~ tr/y/c/;
5287     return ($r, $newext);
5290 # Rewrite a single lex file.
5291 sub lang_lex_rewrite
5293     my ($directory, $base, $ext) = @_;
5295     my $r = &lang_sub_obj;
5296     (my $newext = $ext) =~ tr/l/c/;
5297     return ($r, $newext);
5300 # Rewrite a single lex++ file.
5301 sub lang_lexxx_rewrite
5303     my ($directory, $base, $ext) = @_;
5305     my $r = &lang_sub_obj;
5306     (my $newext = $ext) =~ tr/l/c/;
5307     return ($r, $newext);
5310 # Rewrite a single assembly file.
5311 sub lang_asm_rewrite
5313     return &lang_sub_obj;
5316 # Rewrite a single preprocessed assembly file.
5317 sub lang_cppasm_rewrite
5319     return &lang_sub_obj;
5322 # Rewrite a single Fortran 77 file.
5323 sub lang_f77_rewrite
5325     return LANG_PROCESS;
5328 # Rewrite a single Fortran file.
5329 sub lang_fc_rewrite
5331     return LANG_PROCESS;
5334 # Rewrite a single preprocessed Fortran file.
5335 sub lang_ppfc_rewrite
5337     return LANG_PROCESS;
5340 # Rewrite a single preprocessed Fortran 77 file.
5341 sub lang_ppf77_rewrite
5343     return LANG_PROCESS;
5346 # Rewrite a single ratfor file.
5347 sub lang_ratfor_rewrite
5349     return LANG_PROCESS;
5352 # Rewrite a single Objective C file.
5353 sub lang_objc_rewrite
5355     return &lang_sub_obj;
5358 # Rewrite a single Unified Parallel C file.
5359 sub lang_upc_rewrite
5361     return &lang_sub_obj;
5364 # Rewrite a single Java file.
5365 sub lang_java_rewrite
5367     return LANG_SUBDIR;
5370 # The lang_X_finish functions are called after all source file
5371 # processing is done.  Each should handle defining rules for the
5372 # language, etc.  A finish function is only called if a source file of
5373 # the appropriate type has been seen.
5375 sub lang_c_finish
5377     # Push all libobjs files onto de_ansi_files.  We actually only
5378     # push files which exist in the current directory, and which are
5379     # genuine source files.
5380     foreach my $file (keys %libsources)
5381     {
5382         if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file")
5383         {
5384             $de_ansi_files{$1} = ''
5385         }
5386     }
5388     if (option 'ansi2knr' && keys %de_ansi_files)
5389     {
5390         # Make all _.c files depend on their corresponding .c files.
5391         my @objects;
5392         foreach my $base (sort keys %de_ansi_files)
5393         {
5394             # Each _.c file must depend on ansi2knr; otherwise it
5395             # might be used in a parallel build before it is built.
5396             # We need to support files in the srcdir and in the build
5397             # dir (because these files might be auto-generated.  But
5398             # we can't use $< -- some makes only define $< during a
5399             # suffix rule.
5400             my $ansfile = $de_ansi_files{$base} . $base . '.c';
5401             $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t"
5402                               . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) '
5403                               . '`if test -f $(srcdir)/' . $ansfile
5404                               . '; then echo $(srcdir)/' . $ansfile
5405                               . '; else echo ' . $ansfile . '; fi` '
5406                               . "| sed 's/^# \\([0-9]\\)/#line \\1/' "
5407                               . '| $(ANSI2KNR) > $@'
5408                               # If ansi2knr fails then we shouldn't
5409                               # create the _.c file
5410                               . " || rm -f \$\@\n");
5411             push (@objects, $base . '_.$(OBJEXT)');
5412             push (@objects, $base . '_.lo')
5413               if var ('LIBTOOL');
5415             # Explicitly clean the _.c files if they are in a
5416             # subdirectory. (In the current directory they get erased
5417             # by a `rm -f *_.c' rule.)
5418             $clean_files{$base . '_.c'} = MOSTLY_CLEAN
5419               if dirname ($base) ne '.';
5420         }
5422         # Make all _.o (and _.lo) files depend on ansi2knr.
5423         # Use a sneaky little hack to make it print nicely.
5424         &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)');
5425     }
5428 # This is a yacc helper which is called whenever we have decided to
5429 # compile a yacc file.
5430 sub lang_yacc_target_hook
5432     my ($self, $aggregate, $output, $input, %transform) = @_;
5434     my $flag = $aggregate . "_YFLAGS";
5435     my $flagvar = var $flag;
5436     my $YFLAGSvar = var 'YFLAGS';
5437     if (($flagvar && $flagvar->variable_value =~ /$DASH_D_PATTERN/o)
5438         || ($YFLAGSvar && $YFLAGSvar->variable_value =~ /$DASH_D_PATTERN/o))
5439     {
5440         (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//;
5441         my $header = $output_base . '.h';
5443         # Found a `-d' that applies to the compilation of this file.
5444         # Add a dependency for the generated header file, and arrange
5445         # for that file to be included in the distribution.
5446         foreach my $cond (Automake::Rule::define (${header}, 'internal',
5447                                                   RULE_AUTOMAKE, TRUE,
5448                                                   INTERNAL))
5449           {
5450             my $condstr = $cond->subst_string;
5451             $output_rules .=
5452               "$condstr${header}: $output\n"
5453               # Recover from removal of $header
5454               . "$condstr\t\@if test ! -f \$@; then \\\n"
5455               . "$condstr\t  rm -f $output; \\\n"
5456               . "$condstr\t  \$(MAKE) \$(AM_MAKEFLAGS) $output; \\\n"
5457               . "$condstr\telse :; fi\n";
5458           }
5459         # Distribute the generated file, unless its .y source was
5460         # listed in a nodist_ variable.  (&handle_source_transform
5461         # will set DIST_SOURCE.)
5462         &push_dist_common ($header)
5463           if $transform{'DIST_SOURCE'};
5465         # If the files are built in the build directory, then we want
5466         # to remove them with `make clean'.  If they are in srcdir
5467         # they shouldn't be touched.  However, we can't determine this
5468         # statically, and the GNU rules say that yacc/lex output files
5469         # should be removed by maintainer-clean.  So that's what we
5470         # do.
5471         $clean_files{$header} = MAINTAINER_CLEAN;
5472     }
5473     # Erase $OUTPUT on `make maintainer-clean' (by GNU standards).
5474     # See the comment above for $HEADER.
5475     $clean_files{$output} = MAINTAINER_CLEAN;
5478 # This is a lex helper which is called whenever we have decided to
5479 # compile a lex file.
5480 sub lang_lex_target_hook
5482     my ($self, $aggregate, $output, $input) = @_;
5483     # If the files are built in the build directory, then we want to
5484     # remove them with `make clean'.  If they are in srcdir they
5485     # shouldn't be touched.  However, we can't determine this
5486     # statically, and the GNU rules say that yacc/lex output files
5487     # should be removed by maintainer-clean.  So that's what we do.
5488     $clean_files{$output} = MAINTAINER_CLEAN;
5491 # This is a helper for both lex and yacc.
5492 sub yacc_lex_finish_helper
5494   return if defined $language_scratch{'lex-yacc-done'};
5495   $language_scratch{'lex-yacc-done'} = 1;
5497   # FIXME: for now, no line number.
5498   require_conf_file ($configure_ac, FOREIGN, 'ylwrap');
5499   &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL);
5502 sub lang_yacc_finish
5504   return if defined $language_scratch{'yacc-done'};
5505   $language_scratch{'yacc-done'} = 1;
5507   reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead";
5509   yacc_lex_finish_helper;
5513 sub lang_lex_finish
5515   return if defined $language_scratch{'lex-done'};
5516   $language_scratch{'lex-done'} = 1;
5518   yacc_lex_finish_helper;
5522 # Given a hash table of linker names, pick the name that has the most
5523 # precedence.  This is lame, but something has to have global
5524 # knowledge in order to eliminate the conflict.  Add more linkers as
5525 # required.
5526 sub resolve_linker
5528     my (%linkers) = @_;
5530     foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK))
5531     {
5532         return $l if defined $linkers{$l};
5533     }
5534     return 'LINK';
5537 # Called to indicate that an extension was used.
5538 sub saw_extension
5540     my ($ext) = @_;
5541     if (! defined $extension_seen{$ext})
5542     {
5543         $extension_seen{$ext} = 1;
5544     }
5545     else
5546     {
5547         ++$extension_seen{$ext};
5548     }
5551 # Return the number of files seen for a given language.  Knows about
5552 # special cases we care about.  FIXME: this is hideous.  We need
5553 # something that involves real language objects.  For instance yacc
5554 # and yaccxx could both derive from a common yacc class which would
5555 # know about the strange ylwrap requirement.  (Or better yet we could
5556 # just not support legacy yacc!)
5557 sub count_files_for_language
5559     my ($name) = @_;
5561     my @names;
5562     if ($name eq 'yacc' || $name eq 'yaccxx')
5563     {
5564         @names = ('yacc', 'yaccxx');
5565     }
5566     elsif ($name eq 'lex' || $name eq 'lexxx')
5567     {
5568         @names = ('lex', 'lexxx');
5569     }
5570     else
5571     {
5572         @names = ($name);
5573     }
5575     my $r = 0;
5576     foreach $name (@names)
5577     {
5578         my $lang = $languages{$name};
5579         foreach my $ext (@{$lang->extensions})
5580         {
5581             $r += $extension_seen{$ext}
5582                 if defined $extension_seen{$ext};
5583         }
5584     }
5586     return $r
5589 # Called to ask whether source files have been seen . If HEADERS is 1,
5590 # headers can be included.
5591 sub saw_sources_p
5593     my ($headers) = @_;
5595     # count all the sources
5596     my $count = 0;
5597     foreach my $val (values %extension_seen)
5598     {
5599         $count += $val;
5600     }
5602     if (!$headers)
5603     {
5604         $count -= count_files_for_language ('header');
5605     }
5607     return $count > 0;
5611 # register_language (%ATTRIBUTE)
5612 # ------------------------------
5613 # Register a single language.
5614 # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE.
5615 sub register_language (%)
5617   my (%option) = @_;
5619   # Set the defaults.
5620   $option{'ansi'} = 0
5621     unless defined $option{'ansi'};
5622   $option{'autodep'} = 'no'
5623     unless defined $option{'autodep'};
5624   $option{'linker'} = ''
5625     unless defined $option{'linker'};
5626   $option{'flags'} = []
5627     unless defined $option{'flags'};
5628   $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) }
5629     unless defined $option{'output_extensions'};
5630   $option{'nodist_specific'} = 0
5631     unless defined $option{'nodist_specific'};
5633   my $lang = new Language (%option);
5635   # Fill indexes.
5636   $extension_map{$_} = $lang->name foreach @{$lang->extensions};
5637   $languages{$lang->name} = $lang;
5638   my $link = $lang->linker;
5639   if ($link)
5640     {
5641       if (exists $link_languages{$link})
5642         {
5643           prog_error ("`$link' has different definitions in "
5644                       . $lang->name . " and " . $link_languages{$link}->name)
5645             if $lang->link ne $link_languages{$link}->link;
5646         }
5647       else
5648         {
5649           $link_languages{$link} = $lang;
5650         }
5651     }
5653   # Update the pattern of known extensions.
5654   accept_extensions (@{$lang->extensions});
5656   # Upate the $suffix_rule map.
5657   foreach my $suffix (@{$lang->extensions})
5658     {
5659       foreach my $dest (&{$lang->output_extensions} ($suffix))
5660         {
5661           register_suffix_rule (INTERNAL, $suffix, $dest);
5662         }
5663     }
5666 # derive_suffix ($EXT, $OBJ)
5667 # --------------------------
5668 # This function is used to find a path from a user-specified suffix $EXT
5669 # to $OBJ or to some other suffix we recognize internally, e.g. `cc'.
5670 sub derive_suffix ($$)
5672   my ($source_ext, $obj) = @_;
5674   while (! $extension_map{$source_ext}
5675          && $source_ext ne $obj
5676          && exists $suffix_rules->{$source_ext}
5677          && exists $suffix_rules->{$source_ext}{$obj})
5678     {
5679       $source_ext = $suffix_rules->{$source_ext}{$obj}[0];
5680     }
5682   return $source_ext;
5686 ################################################################
5688 # Pretty-print something and append to output_rules.
5689 sub pretty_print_rule
5691     $output_rules .= &makefile_wrap (@_);
5695 ################################################################
5698 ## -------------------------------- ##
5699 ## Handling the conditional stack.  ##
5700 ## -------------------------------- ##
5703 # $STRING
5704 # make_conditional_string ($NEGATE, $COND)
5705 # ----------------------------------------
5706 sub make_conditional_string ($$)
5708   my ($negate, $cond) = @_;
5709   $cond = "${cond}_TRUE"
5710     unless $cond =~ /^TRUE|FALSE$/;
5711   $cond = Automake::Condition::conditional_negate ($cond)
5712     if $negate;
5713   return $cond;
5717 # $COND
5718 # cond_stack_if ($NEGATE, $COND, $WHERE)
5719 # --------------------------------------
5720 sub cond_stack_if ($$$)
5722   my ($negate, $cond, $where) = @_;
5724   error $where, "$cond does not appear in AM_CONDITIONAL"
5725     if ! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/;
5727   push (@cond_stack, make_conditional_string ($negate, $cond));
5729   return new Automake::Condition (@cond_stack);
5733 # $COND
5734 # cond_stack_else ($NEGATE, $COND, $WHERE)
5735 # ----------------------------------------
5736 sub cond_stack_else ($$$)
5738   my ($negate, $cond, $where) = @_;
5740   if (! @cond_stack)
5741     {
5742       error $where, "else without if";
5743       return FALSE;
5744     }
5746   $cond_stack[$#cond_stack] =
5747     Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]);
5749   # If $COND is given, check against it.
5750   if (defined $cond)
5751     {
5752       $cond = make_conditional_string ($negate, $cond);
5754       error ($where, "else reminder ($negate$cond) incompatible with "
5755              . "current conditional: $cond_stack[$#cond_stack]")
5756         if $cond_stack[$#cond_stack] ne $cond;
5757     }
5759   return new Automake::Condition (@cond_stack);
5763 # $COND
5764 # cond_stack_endif ($NEGATE, $COND, $WHERE)
5765 # -----------------------------------------
5766 sub cond_stack_endif ($$$)
5768   my ($negate, $cond, $where) = @_;
5769   my $old_cond;
5771   if (! @cond_stack)
5772     {
5773       error $where, "endif without if";
5774       return TRUE;
5775     }
5777   # If $COND is given, check against it.
5778   if (defined $cond)
5779     {
5780       $cond = make_conditional_string ($negate, $cond);
5782       error ($where, "endif reminder ($negate$cond) incompatible with "
5783              . "current conditional: $cond_stack[$#cond_stack]")
5784         if $cond_stack[$#cond_stack] ne $cond;
5785     }
5787   pop @cond_stack;
5789   return new Automake::Condition (@cond_stack);
5796 ## ------------------------ ##
5797 ## Handling the variables.  ##
5798 ## ------------------------ ##
5801 # &define_pretty_variable ($VAR, $COND, $WHERE, @VALUE)
5802 # -----------------------------------------------------
5803 # Like define_variable, but the value is a list, and the variable may
5804 # be defined conditionally.  The second argument is the Condition
5805 # under which the value should be defined; this should be the empty
5806 # string to define the variable unconditionally.  The third argument
5807 # is a list holding the values to use for the variable.  The value is
5808 # pretty printed in the output file.
5809 sub define_pretty_variable ($$$@)
5811     my ($var, $cond, $where, @value) = @_;
5813     if (! vardef ($var, $cond))
5814     {
5815         Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value",
5816                                     '', $where, VAR_PRETTY);
5817         rvar ($var)->rdef ($cond)->set_seen;
5818     }
5822 # define_variable ($VAR, $VALUE, $WHERE)
5823 # --------------------------------------
5824 # Define a new Automake Makefile variable VAR to VALUE, but only if
5825 # not already defined.
5826 sub define_variable ($$$)
5828     my ($var, $value, $where) = @_;
5829     define_pretty_variable ($var, TRUE, $where, $value);
5833 # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE)
5834 # -----------------------------------------------------------
5835 # Define the $VAR which content is the list of file names composed of
5836 # a @BASENAME and the $EXTENSION.
5837 sub define_files_variable ($\@$$)
5839   my ($var, $basename, $extension, $where) = @_;
5840   define_variable ($var,
5841                    join (' ', map { "$_.$extension" } @$basename),
5842                    $where);
5846 # Like define_variable, but define a variable to be the configure
5847 # substitution by the same name.
5848 sub define_configure_variable ($)
5850   my ($var) = @_;
5852   my $pretty = VAR_ASIS;
5853   my $owner = VAR_CONFIGURE;
5855   # Some variables we do not want to output.  For instance it
5856   # would be a bad idea to output `U = @U@` when `@U@` can be
5857   # substituted as `\`.
5858   $pretty = VAR_SILENT if exists $ignored_configure_vars{$var};
5860   # ANSI2KNR is a variable that Automake wants to redefine, so
5861   # it must be owned by Automake.  (It is also used as a proof
5862   # that AM_C_PROTOTYPES has been run, that's why we do not simply
5863   # omit the AC_SUBST.)
5864   $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR';
5866   Automake::Variable::define ($var, $owner, '', TRUE, subst $var,
5867                               '', $configure_vars{$var}, $pretty);
5871 # define_compiler_variable ($LANG)
5872 # --------------------------------
5873 # Define a compiler variable.  We also handle defining the `LT'
5874 # version of the command when using libtool.
5875 sub define_compiler_variable ($)
5877     my ($lang) = @_;
5879     my ($var, $value) = ($lang->compiler, $lang->compile);
5880     my $libtool_tag = '';
5881     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
5882       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
5883     &define_variable ($var, $value, INTERNAL);
5884     &define_variable ("LT$var",
5885                       "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) "
5886                       . "\$(LIBTOOLFLAGS) --mode=compile $value",
5887                       INTERNAL)
5888       if var ('LIBTOOL');
5892 # define_linker_variable ($LANG)
5893 # ------------------------------
5894 # Define linker variables.
5895 sub define_linker_variable ($)
5897     my ($lang) = @_;
5899     my $libtool_tag = '';
5900     $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
5901       if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
5902     # CCLD = $(CC).
5903     &define_variable ($lang->lder, $lang->ld, INTERNAL);
5904     # CCLINK = $(CCLD) blah blah...
5905     &define_variable ($lang->linker,
5906                       ((var ('LIBTOOL') ?
5907                         "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) "
5908                         . "\$(LIBTOOLFLAGS) --mode=link " : '')
5909                        . $lang->link),
5910                       INTERNAL);
5913 sub define_per_target_linker_variable ($$)
5915   my ($linker, $target) = @_;
5917   # If the user wrote a custom link command, we don't define ours.
5918   return "${target}_LINK"
5919     if set_seen "${target}_LINK";
5921   my $xlink = $linker ? $linker : 'LINK';
5923   my $lang = $link_languages{$xlink};
5924   prog_error "Unknown language for linker variable `$xlink'"
5925     unless $lang;
5927   my $link_command = $lang->link;
5928   if (var 'LIBTOOL')
5929     {
5930       my $libtool_tag = '';
5931       $libtool_tag = '--tag=' . $lang->libtool_tag . ' '
5932         if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag};
5934       $link_command =
5935         "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) "
5936         . "--mode=link " . $link_command;
5937     }
5939   # Rewrite each occurrence of `AM_$flag' in the link
5940   # command into `${derived}_$flag' if it exists.
5941   my $orig_command = $link_command;
5942   my @flags = (@{$lang->flags}, 'LDFLAGS');
5943   push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL';
5944   for my $flag (@flags)
5945     {
5946       my $val = "${target}_$flag";
5947       $link_command =~ s/\(AM_$flag\)/\($val\)/
5948         if set_seen ($val);
5949     }
5951   # If the computed command is the same as the generic command, use
5952   # the command linker variable.
5953   return $lang->linker
5954     if $link_command eq $orig_command;
5956   &define_variable ("${target}_LINK", $link_command, INTERNAL);
5957   return "${target}_LINK";
5960 ################################################################
5962 # &check_trailing_slash ($WHERE, $LINE)
5963 # --------------------------------------
5964 # Return 1 iff $LINE ends with a slash.
5965 # Might modify $LINE.
5966 sub check_trailing_slash ($\$)
5968   my ($where, $line) = @_;
5970   # Ignore `##' lines.
5971   return 0 if $$line =~ /$IGNORE_PATTERN/o;
5973   # Catch and fix a common error.
5974   msg "syntax", $where, "whitespace following trailing backslash"
5975     if $$line =~ s/\\\s+\n$/\\\n/;
5977   return $$line =~ /\\$/;
5981 # &read_am_file ($AMFILE, $WHERE)
5982 # -------------------------------
5983 # Read Makefile.am and set up %contents.  Simultaneously copy lines
5984 # from Makefile.am into $output_trailer, or define variables as
5985 # appropriate.  NOTE we put rules in the trailer section.  We want
5986 # user rules to come after our generated stuff.
5987 sub read_am_file ($$)
5989     my ($amfile, $where) = @_;
5991     my $am_file = new Automake::XFile ("< $amfile");
5992     verb "reading $amfile";
5994     # Keep track of the youngest output dependency.
5995     my $mtime = mtime $amfile;
5996     $output_deps_greatest_timestamp = $mtime
5997       if $mtime > $output_deps_greatest_timestamp;
5999     my $spacing = '';
6000     my $comment = '';
6001     my $blank = 0;
6002     my $saw_bk = 0;
6003     my $var_look = VAR_ASIS;
6005     use constant IN_VAR_DEF => 0;
6006     use constant IN_RULE_DEF => 1;
6007     use constant IN_COMMENT => 2;
6008     my $prev_state = IN_RULE_DEF;
6010     while ($_ = $am_file->getline)
6011     {
6012         $where->set ("$amfile:$.");
6013         if (/$IGNORE_PATTERN/o)
6014         {
6015             # Merely delete comments beginning with two hashes.
6016         }
6017         elsif (/$WHITE_PATTERN/o)
6018         {
6019             error $where, "blank line following trailing backslash"
6020               if $saw_bk;
6021             # Stick a single white line before the incoming macro or rule.
6022             $spacing = "\n";
6023             $blank = 1;
6024             # Flush all comments seen so far.
6025             if ($comment ne '')
6026             {
6027                 $output_vars .= $comment;
6028                 $comment = '';
6029             }
6030         }
6031         elsif (/$COMMENT_PATTERN/o)
6032         {
6033             # Stick comments before the incoming macro or rule.  Make
6034             # sure a blank line precedes the first block of comments.
6035             $spacing = "\n" unless $blank;
6036             $blank = 1;
6037             $comment .= $spacing . $_;
6038             $spacing = '';
6039             $prev_state = IN_COMMENT;
6040         }
6041         else
6042         {
6043             last;
6044         }
6045         $saw_bk = check_trailing_slash ($where, $_);
6046     }
6048     # We save the conditional stack on entry, and then check to make
6049     # sure it is the same on exit.  This lets us conditionally include
6050     # other files.
6051     my @saved_cond_stack = @cond_stack;
6052     my $cond = new Automake::Condition (@cond_stack);
6054     my $last_var_name = '';
6055     my $last_var_type = '';
6056     my $last_var_value = '';
6057     my $last_where;
6058     # FIXME: shouldn't use $_ in this loop; it is too big.
6059     while ($_)
6060     {
6061         $where->set ("$amfile:$.");
6063         # Make sure the line is \n-terminated.
6064         chomp;
6065         $_ .= "\n";
6067         # Don't look at MAINTAINER_MODE_TRUE here.  That shouldn't be
6068         # used by users.  @MAINT@ is an anachronism now.
6069         $_ =~ s/\@MAINT\@//g
6070             unless $seen_maint_mode;
6072         my $new_saw_bk = check_trailing_slash ($where, $_);
6074         if (/$IGNORE_PATTERN/o)
6075         {
6076             # Merely delete comments beginning with two hashes.
6078             # Keep any backslash from the previous line.
6079             $new_saw_bk = $saw_bk;
6080         }
6081         elsif (/$WHITE_PATTERN/o)
6082         {
6083             # Stick a single white line before the incoming macro or rule.
6084             $spacing = "\n";
6085             error $where, "blank line following trailing backslash"
6086               if $saw_bk;
6087         }
6088         elsif (/$COMMENT_PATTERN/o)
6089         {
6090             error $where, "comment following trailing backslash"
6091               if $saw_bk && $comment eq '';
6093             # Stick comments before the incoming macro or rule.
6094             $comment .= $spacing . $_;
6095             $spacing = '';
6096             $prev_state = IN_COMMENT;
6097         }
6098         elsif ($saw_bk)
6099         {
6100             if ($prev_state == IN_RULE_DEF)
6101             {
6102               my $cond = new Automake::Condition @cond_stack;
6103               $output_trailer .= $cond->subst_string;
6104               $output_trailer .= $_;
6105             }
6106             elsif ($prev_state == IN_COMMENT)
6107             {
6108                 # If the line doesn't start with a `#', add it.
6109                 # We do this because a continued comment like
6110                 #   # A = foo \
6111                 #         bar \
6112                 #         baz
6113                 # is not portable.  BSD make doesn't honor
6114                 # escaped newlines in comments.
6115                 s/^#?/#/;
6116                 $comment .= $spacing . $_;
6117             }
6118             else # $prev_state == IN_VAR_DEF
6119             {
6120               $last_var_value .= ' '
6121                 unless $last_var_value =~ /\s$/;
6122               $last_var_value .= $_;
6124               if (!/\\$/)
6125                 {
6126                   Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6127                                               $last_var_type, $cond,
6128                                               $last_var_value, $comment,
6129                                               $last_where, VAR_ASIS)
6130                     if $cond != FALSE;
6131                   $comment = $spacing = '';
6132                 }
6133             }
6134         }
6136         elsif (/$IF_PATTERN/o)
6137           {
6138             $cond = cond_stack_if ($1, $2, $where);
6139           }
6140         elsif (/$ELSE_PATTERN/o)
6141           {
6142             $cond = cond_stack_else ($1, $2, $where);
6143           }
6144         elsif (/$ENDIF_PATTERN/o)
6145           {
6146             $cond = cond_stack_endif ($1, $2, $where);
6147           }
6149         elsif (/$RULE_PATTERN/o)
6150         {
6151             # Found a rule.
6152             $prev_state = IN_RULE_DEF;
6154             # For now we have to output all definitions of user rules
6155             # and can't diagnose duplicates (see the comment in
6156             # Automake::Rule::define). So we go on and ignore the return value.
6157             Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where);
6159             check_variable_expansions ($_, $where);
6161             $output_trailer .= $comment . $spacing;
6162             my $cond = new Automake::Condition @cond_stack;
6163             $output_trailer .= $cond->subst_string;
6164             $output_trailer .= $_;
6165             $comment = $spacing = '';
6166         }
6167         elsif (/$ASSIGNMENT_PATTERN/o)
6168         {
6169             # Found a macro definition.
6170             $prev_state = IN_VAR_DEF;
6171             $last_var_name = $1;
6172             $last_var_type = $2;
6173             $last_var_value = $3;
6174             $last_where = $where->clone;
6175             if ($3 ne '' && substr ($3, -1) eq "\\")
6176               {
6177                 # We preserve the `\' because otherwise the long lines
6178                 # that are generated will be truncated by broken
6179                 # `sed's.
6180                 $last_var_value = $3 . "\n";
6181               }
6182             # Normally we try to output variable definitions in the
6183             # same format they were input.  However, POSIX compliant
6184             # systems are not required to support lines longer than
6185             # 2048 bytes (most notably, some sed implementation are
6186             # limited to 4000 bytes, and sed is used by config.status
6187             # to rewrite Makefile.in into Makefile).  Moreover nobody
6188             # would really write such long lines by hand since it is
6189             # hardly maintainable.  So if a line is longer that 1000
6190             # bytes (an arbitrary limit), assume it has been
6191             # automatically generated by some tools, and flatten the
6192             # variable definition.  Otherwise, keep the variable as it
6193             # as been input.
6194             $var_look = VAR_PRETTY if length ($last_var_value) >= 1000;
6196             if (!/\\$/)
6197               {
6198                 Automake::Variable::define ($last_var_name, VAR_MAKEFILE,
6199                                             $last_var_type, $cond,
6200                                             $last_var_value, $comment,
6201                                             $last_where, $var_look)
6202                   if $cond != FALSE;
6203                 $comment = $spacing = '';
6204                 $var_look = VAR_ASIS;
6205               }
6206         }
6207         elsif (/$INCLUDE_PATTERN/o)
6208         {
6209             my $path = $1;
6211             if ($path =~ s/^\$\(top_srcdir\)\///)
6212               {
6213                 push (@include_stack, "\$\(top_srcdir\)/$path");
6214                 # Distribute any included file.
6216                 # Always use the $(top_srcdir) prefix in DIST_COMMON,
6217                 # otherwise OSF make will implicitly copy the included
6218                 # file in the build tree during `make distdir' to satisfy
6219                 # the dependency.
6220                 # (subdircond2.test and subdircond3.test will fail.)
6221                 push_dist_common ("\$\(top_srcdir\)/$path");
6222               }
6223             else
6224               {
6225                 $path =~ s/\$\(srcdir\)\///;
6226                 push (@include_stack, "\$\(srcdir\)/$path");
6227                 # Always use the $(srcdir) prefix in DIST_COMMON,
6228                 # otherwise OSF make will implicitly copy the included
6229                 # file in the build tree during `make distdir' to satisfy
6230                 # the dependency.
6231                 # (subdircond2.test and subdircond3.test will fail.)
6232                 push_dist_common ("\$\(srcdir\)/$path");
6233                 $path = $relative_dir . "/" . $path if $relative_dir ne '.';
6234               }
6235             $where->push_context ("`$path' included from here");
6236             &read_am_file ($path, $where);
6237             $where->pop_context;
6238         }
6239         else
6240         {
6241             # This isn't an error; it is probably a continued rule.
6242             # In fact, this is what we assume.
6243             $prev_state = IN_RULE_DEF;
6244             check_variable_expansions ($_, $where);
6245             $output_trailer .= $comment . $spacing;
6246             my $cond = new Automake::Condition @cond_stack;
6247             $output_trailer .= $cond->subst_string;
6248             $output_trailer .= $_;
6249             $comment = $spacing = '';
6250             error $where, "`#' comment at start of rule is unportable"
6251               if $_ =~ /^\t\s*\#/;
6252         }
6254         $saw_bk = $new_saw_bk;
6255         $_ = $am_file->getline;
6256     }
6258     $output_trailer .= $comment;
6260     error ($where, "trailing backslash on last line")
6261       if $saw_bk;
6263     error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack"
6264                     : "too many conditionals closed in include file"))
6265       if "@saved_cond_stack" ne "@cond_stack";
6269 # define_standard_variables ()
6270 # ----------------------------
6271 # A helper for read_main_am_file which initializes configure variables
6272 # and variables from header-vars.am.
6273 sub define_standard_variables
6275   my $saved_output_vars = $output_vars;
6276   my ($comments, undef, $rules) =
6277     file_contents_internal (1, "$libdir/am/header-vars.am",
6278                             new Automake::Location);
6280   foreach my $var (sort keys %configure_vars)
6281     {
6282       &define_configure_variable ($var);
6283     }
6285   $output_vars .= $comments . $rules;
6288 # Read main am file.
6289 sub read_main_am_file
6291     my ($amfile) = @_;
6293     # This supports the strange variable tricks we are about to play.
6294     prog_error (macros_dump () . "variable defined before read_main_am_file")
6295       if (scalar (variables) > 0);
6297     # Generate copyright header for generated Makefile.in.
6298     # We do discard the output of predefined variables, handled below.
6299     $output_vars = ("# $in_file_name generated by automake "
6300                    . $VERSION . " from $am_file_name.\n");
6301     $output_vars .= '# ' . subst ('configure_input') . "\n";
6302     $output_vars .= $gen_copyright;
6304     # We want to predefine as many variables as possible.  This lets
6305     # the user set them with `+=' in Makefile.am.
6306     &define_standard_variables;
6308     # Read user file, which might override some of our values.
6309     &read_am_file ($amfile, new Automake::Location);
6314 ################################################################
6316 # $FLATTENED
6317 # &flatten ($STRING)
6318 # ------------------
6319 # Flatten the $STRING and return the result.
6320 sub flatten
6322   $_ = shift;
6324   s/\\\n//somg;
6325   s/\s+/ /g;
6326   s/^ //;
6327   s/ $//;
6329   return $_;
6332 # transform($TOKEN, \%PAIRS)
6333 # ==========================
6334 # If ($TOKEN, $VAL) is in %PAIRS:
6335 #   - replaces %$TOKEN% with $VAL,
6336 #   - enables/disables ?$TOKEN? and ?!$TOKEN?,
6337 #   - replaces %?$TOKEN% with TRUE or FALSE.
6338 sub transform($$)
6340   my ($token, $transform) = @_;
6342   if (substr ($token, 0, 1) eq '%')
6343     {
6344       my $cond = (substr ($token, 1, 1) eq '?') ? 1 : 0;
6345       $token = substr ($token, 1 + $cond, -1);
6346       my $val = $transform->{$token};
6347       prog_error "Unknown %token% `$token'" unless defined $val;
6348       if ($cond)
6349         {
6350           return $val ? 'TRUE' : 'FALSE';
6351         }
6352       else
6353         {
6354           return $val;
6355         }
6356     }
6357   # Now $token is '?xxx?' or '?!xxx?'.
6358   my $neg = (substr ($token, 1, 1) eq '!') ? 1 : 0;
6359   $token = substr ($token, 1 + $neg, -1);
6360   my $val = $transform->{$token};
6361   prog_error "Unknown ?token? `$token' (neg = $neg)" unless defined $val;
6362   return (!!$val == $neg) ? '##%' : '';
6365 # @PARAGRAPHS
6366 # &make_paragraphs ($MAKEFILE, [%TRANSFORM])
6367 # ------------------------------------------
6368 # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of
6369 # paragraphs.
6370 sub make_paragraphs ($%)
6372   my ($file, %transform) = @_;
6374   # Complete %transform with global options.
6375   # Note that %transform goes last, so it overrides global options.
6376   %transform = ('CYGNUS'      => !! option 'cygnus',
6377                  'MAINTAINER-MODE'
6378                  => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '',
6380                  'BZIP2'       => !! option 'dist-bzip2',
6381                  'COMPRESS'    => !! option 'dist-tarZ',
6382                  'GZIP'        =>  ! option 'no-dist-gzip',
6383                  'SHAR'        => !! option 'dist-shar',
6384                  'ZIP'         => !! option 'dist-zip',
6386                  'INSTALL-INFO' =>  ! option 'no-installinfo',
6387                  'INSTALL-MAN'  =>  ! option 'no-installman',
6388                  'CK-NEWS'      => !! option 'check-news',
6390                  'SUBDIRS'      => !! var ('SUBDIRS'),
6391                  'TOPDIR_P'     => $relative_dir eq '.',
6393                  'BUILD'    => ($seen_canonical >= AC_CANONICAL_BUILD),
6394                  'HOST'     => ($seen_canonical >= AC_CANONICAL_HOST),
6395                  'TARGET'   => ($seen_canonical >= AC_CANONICAL_TARGET),
6397                  'LIBTOOL'      => !! var ('LIBTOOL'),
6398                  'NONLIBTOOL'   => 1,
6399                  'FIRST'        => ! $transformed_files{$file},
6400                 %transform);
6402   $transformed_files{$file} = 1;
6403   $_ = $am_file_cache{$file};
6405   if (! defined $_)
6406     {
6407       verb "reading $file";
6408       # Swallow the whole file.
6409       my $fc_file = new Automake::XFile "< $file";
6410       my $saved_dollar_slash = $/;
6411       undef $/;
6412       $_ = $fc_file->getline;
6413       $/ = $saved_dollar_slash;
6414       $fc_file->close;
6416       # Remove ##-comments.
6417       # Besides we don't need more than two consecutive new-lines.
6418       s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom;
6420       $am_file_cache{$file} = $_;
6421     }
6423   # Substitute Automake template tokens.
6424   s/(?:%\??[\w\-]+%|\?!?[\w\-]+\?)/transform($&, \%transform)/ge;
6425   # transform() may have added some ##%-comments to strip.
6426   # (we use `##%' instead of `##' so we can distinguish ##%##%##% from
6427   # ####### and do not remove the latter.)
6428   s/^[ \t]*(?:##%)+.*\n//gm;
6430   # Split at unescaped new lines.
6431   my @lines = split (/(?<!\\)\n/, $_);
6432   my @res;
6434   while (defined ($_ = shift @lines))
6435     {
6436       my $paragraph = $_;
6437       # If we are a rule, eat as long as we start with a tab.
6438       if (/$RULE_PATTERN/smo)
6439         {
6440           while (defined ($_ = shift @lines) && $_ =~ /^\t/)
6441             {
6442               $paragraph .= "\n$_";
6443             }
6444           unshift (@lines, $_);
6445         }
6447       # If we are a comments, eat as much comments as you can.
6448       elsif (/$COMMENT_PATTERN/smo)
6449         {
6450           while (defined ($_ = shift @lines)
6451                  && $_ =~ /$COMMENT_PATTERN/smo)
6452             {
6453               $paragraph .= "\n$_";
6454             }
6455           unshift (@lines, $_);
6456         }
6458       push @res, $paragraph;
6459     }
6461   return @res;
6466 # ($COMMENT, $VARIABLES, $RULES)
6467 # &file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM])
6468 # -------------------------------------------------------------
6469 # Return contents of a file from $libdir/am, automatically skipping
6470 # macros or rules which are already known. $IS_AM iff the caller is
6471 # reading an Automake file (as opposed to the user's Makefile.am).
6472 sub file_contents_internal ($$$%)
6474     my ($is_am, $file, $where, %transform) = @_;
6476     $where->set ($file);
6478     my $result_vars = '';
6479     my $result_rules = '';
6480     my $comment = '';
6481     my $spacing = '';
6483     # The following flags are used to track rules spanning across
6484     # multiple paragraphs.
6485     my $is_rule = 0;            # 1 if we are processing a rule.
6486     my $discard_rule = 0;       # 1 if the current rule should not be output.
6488     # We save the conditional stack on entry, and then check to make
6489     # sure it is the same on exit.  This lets us conditionally include
6490     # other files.
6491     my @saved_cond_stack = @cond_stack;
6492     my $cond = new Automake::Condition (@cond_stack);
6494     foreach (make_paragraphs ($file, %transform))
6495     {
6496         # FIXME: no line number available.
6497         $where->set ($file);
6499         # Sanity checks.
6500         error $where, "blank line following trailing backslash:\n$_"
6501           if /\\$/;
6502         error $where, "comment following trailing backslash:\n$_"
6503           if /\\#/;
6505         if (/^$/)
6506         {
6507             $is_rule = 0;
6508             # Stick empty line before the incoming macro or rule.
6509             $spacing = "\n";
6510         }
6511         elsif (/$COMMENT_PATTERN/mso)
6512         {
6513             $is_rule = 0;
6514             # Stick comments before the incoming macro or rule.
6515             $comment = "$_\n";
6516         }
6518         # Handle inclusion of other files.
6519         elsif (/$INCLUDE_PATTERN/o)
6520         {
6521             if ($cond != FALSE)
6522               {
6523                 my $file = ($is_am ? "$libdir/am/" : '') . $1;
6524                 $where->push_context ("`$file' included from here");
6525                 # N-ary `.=' fails.
6526                 my ($com, $vars, $rules)
6527                   = file_contents_internal ($is_am, $file, $where, %transform);
6528                 $where->pop_context;
6529                 $comment .= $com;
6530                 $result_vars .= $vars;
6531                 $result_rules .= $rules;
6532               }
6533         }
6535         # Handling the conditionals.
6536         elsif (/$IF_PATTERN/o)
6537           {
6538             $cond = cond_stack_if ($1, $2, $file);
6539           }
6540         elsif (/$ELSE_PATTERN/o)
6541           {
6542             $cond = cond_stack_else ($1, $2, $file);
6543           }
6544         elsif (/$ENDIF_PATTERN/o)
6545           {
6546             $cond = cond_stack_endif ($1, $2, $file);
6547           }
6549         # Handling rules.
6550         elsif (/$RULE_PATTERN/mso)
6551         {
6552           $is_rule = 1;
6553           $discard_rule = 0;
6554           # Separate relationship from optional actions: the first
6555           # `new-line tab" not preceded by backslash (continuation
6556           # line).
6557           my $paragraph = $_;
6558           /^(.*?)(?:(?<!\\)\n(\t.*))?$/s;
6559           my ($relationship, $actions) = ($1, $2 || '');
6561           # Separate targets from dependencies: the first colon.
6562           $relationship =~ /^([^:]+\S+) *: *(.*)$/som;
6563           my ($targets, $dependencies) = ($1, $2);
6564           # Remove the escaped new lines.
6565           # I don't know why, but I have to use a tmp $flat_deps.
6566           my $flat_deps = &flatten ($dependencies);
6567           my @deps = split (' ', $flat_deps);
6569           foreach (split (' ' , $targets))
6570             {
6571               # FIXME: 1. We are not robust to people defining several targets
6572               # at once, only some of them being in %dependencies.  The
6573               # actions from the targets in %dependencies are usually generated
6574               # from the content of %actions, but if some targets in $targets
6575               # are not in %dependencies the ELSE branch will output
6576               # a rule for all $targets (i.e. the targets which are both
6577               # in %dependencies and $targets will have two rules).
6579               # FIXME: 2. The logic here is not able to output a
6580               # multi-paragraph rule several time (e.g. for each condition
6581               # it is defined for) because it only knows the first paragraph.
6583               # FIXME: 3. We are not robust to people defining a subset
6584               # of a previously defined "multiple-target" rule.  E.g.
6585               # `foo:' after `foo bar:'.
6587               # Output only if not in FALSE.
6588               if (defined $dependencies{$_} && $cond != FALSE)
6589                 {
6590                   &depend ($_, @deps);
6591                   if ($actions{$_})
6592                     {
6593                       $actions{$_} .= "\n$actions" if $actions;
6594                     }
6595                   else
6596                     {
6597                       $actions{$_} = $actions;
6598                     }
6599                 }
6600               else
6601                 {
6602                   # Free-lance dependency.  Output the rule for all the
6603                   # targets instead of one by one.
6604                   my @undefined_conds =
6605                     Automake::Rule::define ($targets, $file,
6606                                             $is_am ? RULE_AUTOMAKE : RULE_USER,
6607                                             $cond, $where);
6608                   for my $undefined_cond (@undefined_conds)
6609                     {
6610                       my $condparagraph = $paragraph;
6611                       $condparagraph =~ s/^/$undefined_cond->subst_string/gme;
6612                       $result_rules .= "$spacing$comment$condparagraph\n";
6613                     }
6614                   if (scalar @undefined_conds == 0)
6615                     {
6616                       # Remember to discard next paragraphs
6617                       # if they belong to this rule.
6618                       # (but see also FIXME: #2 above.)
6619                       $discard_rule = 1;
6620                     }
6621                   $comment = $spacing = '';
6622                   last;
6623                 }
6624             }
6625         }
6627         elsif (/$ASSIGNMENT_PATTERN/mso)
6628         {
6629             my ($var, $type, $val) = ($1, $2, $3);
6630             error $where, "variable `$var' with trailing backslash"
6631               if /\\$/;
6633             $is_rule = 0;
6635             Automake::Variable::define ($var,
6636                                         $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE,
6637                                         $type, $cond, $val, $comment, $where,
6638                                         VAR_ASIS)
6639               if $cond != FALSE;
6641             $comment = $spacing = '';
6642         }
6643         else
6644         {
6645             # This isn't an error; it is probably some tokens which
6646             # configure is supposed to replace, such as `@SET-MAKE@',
6647             # or some part of a rule cut by an if/endif.
6648             if (! $cond->false && ! ($is_rule && $discard_rule))
6649               {
6650                 s/^/$cond->subst_string/gme;
6651                 $result_rules .= "$spacing$comment$_\n";
6652               }
6653             $comment = $spacing = '';
6654         }
6655     }
6657     error ($where, @cond_stack ?
6658            "unterminated conditionals: @cond_stack" :
6659            "too many conditionals closed in include file")
6660       if "@saved_cond_stack" ne "@cond_stack";
6662     return ($comment, $result_vars, $result_rules);
6666 # $CONTENTS
6667 # &file_contents ($BASENAME, $WHERE, [%TRANSFORM])
6668 # ------------------------------------------------
6669 # Return contents of a file from $libdir/am, automatically skipping
6670 # macros or rules which are already known.
6671 sub file_contents ($$%)
6673     my ($basename, $where, %transform) = @_;
6674     my ($comments, $variables, $rules) =
6675       file_contents_internal (1, "$libdir/am/$basename.am", $where,
6676                               %transform);
6677     return "$comments$variables$rules";
6681 # @PREFIX
6682 # &am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES)
6683 # -----------------------------------------------------
6684 # Find all variable prefixes that are used for install directories.  A
6685 # prefix `zar' qualifies iff:
6687 # * `zardir' is a variable.
6688 # * `zar_PRIMARY' is a variable.
6690 # As a side effect, it looks for misspellings.  It is an error to have
6691 # a variable ending in a "reserved" suffix whose prefix is unknown, e.g.
6692 # "bin_PROGRAMS".  However, unusual prefixes are allowed if a variable
6693 # of the same name (with "dir" appended) exists.  For instance, if the
6694 # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid.
6695 # This is to provide a little extra flexibility in those cases which
6696 # need it.
6697 sub am_primary_prefixes ($$@)
6699   my ($primary, $can_dist, @prefixes) = @_;
6701   local $_;
6702   my %valid = map { $_ => 0 } @prefixes;
6703   $valid{'EXTRA'} = 0;
6704   foreach my $var (variables $primary)
6705     {
6706       # Automake is allowed to define variables that look like primaries
6707       # but which aren't.  E.g. INSTALL_sh_DATA.
6708       # Autoconf can also define variables like INSTALL_DATA, so
6709       # ignore all configure variables (at least those which are not
6710       # redefined in Makefile.am).
6711       # FIXME: We should make sure that these variables are not
6712       # conditionally defined (or else adjust the condition below).
6713       my $def = $var->def (TRUE);
6714       next if $def && $def->owner != VAR_MAKEFILE;
6716       my $varname = $var->name;
6718       if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/)
6719         {
6720           my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || '');
6721           if ($dist ne '' && ! $can_dist)
6722             {
6723               err_var ($var,
6724                        "invalid variable `$varname': `dist' is forbidden");
6725             }
6726           # Standard directories must be explicitly allowed.
6727           elsif (! defined $valid{$X} && exists $standard_prefix{$X})
6728             {
6729               err_var ($var,
6730                        "`${X}dir' is not a legitimate directory " .
6731                        "for `$primary'");
6732             }
6733           # A not explicitly valid directory is allowed if Xdir is defined.
6734           elsif (! defined $valid{$X} &&
6735                  $var->requires_variables ("`$varname' is used", "${X}dir"))
6736             {
6737               # Nothing to do.  Any error message has been output
6738               # by $var->requires_variables.
6739             }
6740           else
6741             {
6742               # Ensure all extended prefixes are actually used.
6743               $valid{"$base$dist$X"} = 1;
6744             }
6745         }
6746       else
6747         {
6748           prog_error "unexpected variable name: $varname";
6749         }
6750     }
6752   # Return only those which are actually defined.
6753   return sort grep { var ($_ . '_' . $primary) } keys %valid;
6757 # Handle `where_HOW' variable magic.  Does all lookups, generates
6758 # install code, and possibly generates code to define the primary
6759 # variable.  The first argument is the name of the .am file to munge,
6760 # the second argument is the primary variable (e.g. HEADERS), and all
6761 # subsequent arguments are possible installation locations.
6763 # Returns list of [$location, $value] pairs, where
6764 # $value's are the values in all where_HOW variable, and $location
6765 # there associated location (the place here their parent variables were
6766 # defined).
6768 # FIXME: this should be rewritten to be cleaner.  It should be broken
6769 # up into multiple functions.
6771 # Usage is: am_install_var (OPTION..., file, HOW, where...)
6772 sub am_install_var
6774   my (@args) = @_;
6776   my $do_require = 1;
6777   my $can_dist = 0;
6778   my $default_dist = 0;
6779   while (@args)
6780     {
6781       if ($args[0] eq '-noextra')
6782         {
6783           $do_require = 0;
6784         }
6785       elsif ($args[0] eq '-candist')
6786         {
6787           $can_dist = 1;
6788         }
6789       elsif ($args[0] eq '-defaultdist')
6790         {
6791           $default_dist = 1;
6792           $can_dist = 1;
6793         }
6794       elsif ($args[0] !~ /^-/)
6795         {
6796           last;
6797         }
6798       shift (@args);
6799     }
6801   my ($file, $primary, @prefix) = @args;
6803   # Now that configure substitutions are allowed in where_HOW
6804   # variables, it is an error to actually define the primary.  We
6805   # allow `JAVA', as it is customarily used to mean the Java
6806   # interpreter.  This is but one of several Java hacks.  Similarly,
6807   # `PYTHON' is customarily used to mean the Python interpreter.
6808   reject_var $primary, "`$primary' is an anachronism"
6809     unless $primary eq 'JAVA' || $primary eq 'PYTHON';
6811   # Get the prefixes which are valid and actually used.
6812   @prefix = am_primary_prefixes ($primary, $can_dist, @prefix);
6814   # If a primary includes a configure substitution, then the EXTRA_
6815   # form is required.  Otherwise we can't properly do our job.
6816   my $require_extra;
6818   my @used = ();
6819   my @result = ();
6821   foreach my $X (@prefix)
6822     {
6823       my $nodir_name = $X;
6824       my $one_name = $X . '_' . $primary;
6825       my $one_var = var $one_name;
6827       my $strip_subdir = 1;
6828       # If subdir prefix should be preserved, do so.
6829       if ($nodir_name =~ /^nobase_/)
6830         {
6831           $strip_subdir = 0;
6832           $nodir_name =~ s/^nobase_//;
6833         }
6835       # If files should be distributed, do so.
6836       my $dist_p = 0;
6837       if ($can_dist)
6838         {
6839           $dist_p = (($default_dist && $nodir_name !~ /^nodist_/)
6840                      || (! $default_dist && $nodir_name =~ /^dist_/));
6841           $nodir_name =~ s/^(dist|nodist)_//;
6842         }
6845       # Use the location of the currently processed variable.
6846       # We are not processing a particular condition, so pick the first
6847       # available.
6848       my $tmpcond = $one_var->conditions->one_cond;
6849       my $where = $one_var->rdef ($tmpcond)->location->clone;
6851       # Append actual contents of where_PRIMARY variable to
6852       # @result, skipping @substitutions@.
6853       foreach my $locvals ($one_var->value_as_list_recursive (location => 1))
6854         {
6855           my ($loc, $value) = @$locvals;
6856           # Skip configure substitutions.
6857           if ($value =~ /^\@.*\@$/)
6858             {
6859               if ($nodir_name eq 'EXTRA')
6860                 {
6861                   error ($where,
6862                          "`$one_name' contains configure substitution, "
6863                          . "but shouldn't");
6864                 }
6865               # Check here to make sure variables defined in
6866               # configure.ac do not imply that EXTRA_PRIMARY
6867               # must be defined.
6868               elsif (! defined $configure_vars{$one_name})
6869                 {
6870                   $require_extra = $one_name
6871                     if $do_require;
6872                 }
6873             }
6874           else
6875             {
6876               push (@result, $locvals);
6877             }
6878         }
6879       # A blatant hack: we rewrite each _PROGRAMS primary to include
6880       # EXEEXT.
6881       append_exeext { 1 } $one_name
6882         if $primary eq 'PROGRAMS';
6883       # "EXTRA" shouldn't be used when generating clean targets,
6884       # all, or install targets.  We used to warn if EXTRA_FOO was
6885       # defined uselessly, but this was annoying.
6886       next
6887         if $nodir_name eq 'EXTRA';
6889       if ($nodir_name eq 'check')
6890         {
6891           push (@check, '$(' . $one_name . ')');
6892         }
6893       else
6894         {
6895           push (@used, '$(' . $one_name . ')');
6896         }
6898       # Is this to be installed?
6899       my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check';
6901       # If so, with install-exec? (or install-data?).
6902       my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o);
6904       my $check_options_p = $install_p && !! option 'std-options';
6906       # Use the location of the currently processed variable as context.
6907       $where->push_context ("while processing `$one_name'");
6909       # The variable containing all file to distribute.
6910       my $distvar = "\$($one_name)";
6911       $distvar = shadow_unconditionally ($one_name, $where)
6912         if ($dist_p && $one_var->has_conditional_contents);
6914       # Singular form of $PRIMARY.
6915       (my $one_primary = $primary) =~ s/S$//;
6916       $output_rules .= &file_contents ($file, $where,
6917                                        PRIMARY     => $primary,
6918                                        ONE_PRIMARY => $one_primary,
6919                                        DIR         => $X,
6920                                        NDIR        => $nodir_name,
6921                                        BASE        => $strip_subdir,
6923                                        EXEC      => $exec_p,
6924                                        INSTALL   => $install_p,
6925                                        DIST      => $dist_p,
6926                                        DISTVAR   => $distvar,
6927                                        'CK-OPTS' => $check_options_p);
6928     }
6930   # The JAVA variable is used as the name of the Java interpreter.
6931   # The PYTHON variable is used as the name of the Python interpreter.
6932   if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON')
6933     {
6934       # Define it.
6935       define_pretty_variable ($primary, TRUE, INTERNAL, @used);
6936       $output_vars .= "\n";
6937     }
6939   err_var ($require_extra,
6940            "`$require_extra' contains configure substitution,\n"
6941            . "but `EXTRA_$primary' not defined")
6942     if ($require_extra && ! var ('EXTRA_' . $primary));
6944   # Push here because PRIMARY might be configure time determined.
6945   push (@all, '$(' . $primary . ')')
6946     if @used && $primary ne 'JAVA' && $primary ne 'PYTHON';
6948   # Make the result unique.  This lets the user use conditionals in
6949   # a natural way, but still lets us program lazily -- we don't have
6950   # to worry about handling a particular object more than once.
6951   # We will keep only one location per object.
6952   my %result = ();
6953   for my $pair (@result)
6954     {
6955       my ($loc, $val) = @$pair;
6956       $result{$val} = $loc;
6957     }
6958   my @l = sort keys %result;
6959   return map { [$result{$_}->clone, $_] } @l;
6963 ################################################################
6965 # Each key in this hash is the name of a directory holding a
6966 # Makefile.in.  These variables are local to `is_make_dir'.
6967 my %make_dirs = ();
6968 my $make_dirs_set = 0;
6970 sub is_make_dir
6972     my ($dir) = @_;
6973     if (! $make_dirs_set)
6974     {
6975         foreach my $iter (@configure_input_files)
6976         {
6977             $make_dirs{dirname ($iter)} = 1;
6978         }
6979         # We also want to notice Makefile.in's.
6980         foreach my $iter (@other_input_files)
6981         {
6982             if ($iter =~ /Makefile\.in$/)
6983             {
6984                 $make_dirs{dirname ($iter)} = 1;
6985             }
6986         }
6987         $make_dirs_set = 1;
6988     }
6989     return defined $make_dirs{$dir};
6992 ################################################################
6994 # Find the aux dir.  This should match the algorithm used by
6995 # ./configure. (See the Autoconf documentation for for
6996 # AC_CONFIG_AUX_DIR.)
6997 sub locate_aux_dir ()
6999   if (! $config_aux_dir_set_in_configure_ac)
7000     {
7001       # The default auxiliary directory is the first
7002       # of ., .., or ../.. that contains install-sh.
7003       # Assume . if install-sh doesn't exist yet.
7004       for my $dir (qw (. .. ../..))
7005         {
7006           if (-f "$dir/install-sh")
7007             {
7008               $config_aux_dir = $dir;
7009               last;
7010             }
7011         }
7012       $config_aux_dir = '.' unless $config_aux_dir;
7013     }
7014   # Avoid unsightly '/.'s.
7015   $am_config_aux_dir =
7016     '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir");
7017   $am_config_aux_dir =~ s,/*$,,;
7021 # &maybe_push_required_file ($DIR, $FILE, $FULLFILE)
7022 # --------------------------------------------------
7023 # See if we want to push this file onto dist_common.  This function
7024 # encodes the rules for deciding when to do so.
7025 sub maybe_push_required_file
7027   my ($dir, $file, $fullfile) = @_;
7029   if ($dir eq $relative_dir)
7030     {
7031       push_dist_common ($file);
7032       return 1;
7033     }
7034   elsif ($relative_dir eq '.' && ! &is_make_dir ($dir))
7035     {
7036       # If we are doing the topmost directory, and the file is in a
7037       # subdir which does not have a Makefile, then we distribute it
7038       # here.
7040       # If a required file is above the source tree, it is important
7041       # to prefix it with `$(srcdir)' so that no VPATH search is
7042       # performed.  Otherwise problems occur with Make implementations
7043       # that rewrite and simplify rules whose dependencies are found in a
7044       # VPATH location.  Here is an example with OSF1/Tru64 Make.
7045       #
7046       #   % cat Makefile
7047       #   VPATH = sub
7048       #   distdir: ../a
7049       #           echo ../a
7050       #   % ls
7051       #   Makefile a
7052       #   % make
7053       #   echo a
7054       #   a
7055       #
7056       # Dependency `../a' was found in `sub/../a', but this make
7057       # implementation simplified it as `a'.  (Note that the sub/
7058       # directory does not even exist.)
7059       #
7060       # This kind of VPATH rewriting seems hard to cancel.  The
7061       # distdir.am hack against VPATH rewriting works only when no
7062       # simplification is done, i.e., for dependencies which are in
7063       # subdirectories, not in enclosing directories.  Hence, in
7064       # the latter case we use a full path to make sure no VPATH
7065       # search occurs.
7066       $fullfile = '$(srcdir)/' . $fullfile
7067         if $dir =~ m,^\.\.(?:$|/),;
7069       push_dist_common ($fullfile);
7070       return 1;
7071     }
7072   return 0;
7076 # If a file name appears as a key in this hash, then it has already
7077 # been checked for.  This allows us not to report the same error more
7078 # than once.
7079 my %required_file_not_found = ();
7081 # &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES)
7082 # --------------------------------------------------------------
7083 # Verify that the file must exist in $DIRECTORY, or install it.
7084 # $MYSTRICT is the strictness level at which this file becomes required.
7085 sub require_file_internal ($$$@)
7087   my ($where, $mystrict, $dir, @files) = @_;
7089   foreach my $file (@files)
7090     {
7091       my $fullfile = "$dir/$file";
7092       my $found_it = 0;
7093       my $dangling_sym = 0;
7095       if (-l $fullfile && ! -f $fullfile)
7096         {
7097           $dangling_sym = 1;
7098         }
7099       elsif (dir_has_case_matching_file ($dir, $file))
7100         {
7101           $found_it = 1;
7102           maybe_push_required_file ($dir, $file, $fullfile);
7103         }
7105       # `--force-missing' only has an effect if `--add-missing' is
7106       # specified.
7107       if ($found_it && (! $add_missing || ! $force_missing))
7108         {
7109           next;
7110         }
7111       else
7112         {
7113           # If we've already looked for it, we're done.  You might
7114           # wonder why we don't do this before searching for the
7115           # file.  If we do that, then something like
7116           # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into
7117           # DIST_COMMON.
7118           if (! $found_it)
7119             {
7120               next if defined $required_file_not_found{$fullfile};
7121               $required_file_not_found{$fullfile} = 1;
7122             }
7124           if ($strictness >= $mystrict)
7125             {
7126               if ($dangling_sym && $add_missing)
7127                 {
7128                   unlink ($fullfile);
7129                 }
7131               my $trailer = '';
7132               my $suppress = 0;
7134               # Only install missing files according to our desired
7135               # strictness level.
7136               my $message = "required file `$fullfile' not found";
7137               if ($add_missing)
7138                 {
7139                   if (-f "$libdir/$file")
7140                     {
7141                       $suppress = 1;
7143                       # Install the missing file.  Symlink if we
7144                       # can, copy if we must.  Note: delete the file
7145                       # first, in case it is a dangling symlink.
7146                       $message = "installing `$fullfile'";
7147                       # Windows Perl will hang if we try to delete a
7148                       # file that doesn't exist.
7149                       unlink ($fullfile) if -f $fullfile;
7150                       if ($symlink_exists && ! $copy_missing)
7151                         {
7152                           if (! symlink ("$libdir/$file", $fullfile))
7153                             {
7154                               $suppress = 0;
7155                               $trailer = "; error while making link: $!";
7156                             }
7157                         }
7158                       elsif (system ('cp', "$libdir/$file", $fullfile))
7159                         {
7160                           $suppress = 0;
7161                           $trailer = "\n    error while copying";
7162                         }
7163                       reset_dir_cache ($dir);
7164                     }
7166                   if (! maybe_push_required_file (dirname ($fullfile),
7167                                                   $file, $fullfile))
7168                     {
7169                       if (! $found_it && ! $automake_will_process_aux_dir)
7170                         {
7171                           # We have added the file but could not push it
7172                           # into DIST_COMMON, probably because this is
7173                           # an auxiliary file and we are not processing
7174                           # the top level Makefile.  Furthermore Automake
7175                           # hasn't been asked to create the Makefile.in
7176                           # that distribute the aux dir files.
7177                           error ($where, 'Please make a full run of automake'
7178                                  . " so $fullfile gets distributed.");
7179                         }
7180                     }
7181                 }
7182               else
7183                 {
7184                   $trailer = "\n  `automake --add-missing' can install `$file'"
7185                     if -f "$libdir/$file";
7186                 }
7188               # If --force-missing was specified, and we have
7189               # actually found the file, then do nothing.
7190               next
7191                 if $found_it && $force_missing;
7193               # If we couldn' install the file, but it is a target in
7194               # the Makefile, don't print anything.  This allows files
7195               # like README, AUTHORS, or THANKS to be generated.
7196               next
7197                 if !$suppress && rule $file;
7199               msg ($suppress ? 'note' : 'error', $where, "$message$trailer");
7200             }
7201         }
7202     }
7205 # &require_file ($WHERE, $MYSTRICT, @FILES)
7206 # -----------------------------------------
7207 sub require_file ($$@)
7209     my ($where, $mystrict, @files) = @_;
7210     require_file_internal ($where, $mystrict, $relative_dir, @files);
7213 # &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7214 # -----------------------------------------------------------
7215 sub require_file_with_macro ($$$@)
7217     my ($cond, $macro, $mystrict, @files) = @_;
7218     $macro = rvar ($macro) unless ref $macro;
7219     require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7222 # &require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7223 # ----------------------------------------------------------------
7224 # Require an AC_LIBSOURCEd file.  If AC_CONFIG_LIBOBJ_DIR was called, it
7225 # must be in that directory.  Otherwise expect it in the current directory.
7226 sub require_libsource_with_macro ($$$@)
7228     my ($cond, $macro, $mystrict, @files) = @_;
7229     $macro = rvar ($macro) unless ref $macro;
7230     if ($config_libobj_dir)
7231       {
7232         require_file_internal ($macro->rdef ($cond)->location, $mystrict,
7233                                $config_libobj_dir, @files);
7234       }
7235     else
7236       {
7237         require_file ($macro->rdef ($cond)->location, $mystrict, @files);
7238       }
7241 # &require_conf_file ($WHERE, $MYSTRICT, @FILES)
7242 # ----------------------------------------------
7243 # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR.
7244 sub require_conf_file ($$@)
7246     my ($where, $mystrict, @files) = @_;
7247     require_file_internal ($where, $mystrict, $config_aux_dir, @files);
7251 # &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES)
7252 # ----------------------------------------------------------------
7253 sub require_conf_file_with_macro ($$$@)
7255     my ($cond, $macro, $mystrict, @files) = @_;
7256     require_conf_file (rvar ($macro)->rdef ($cond)->location,
7257                        $mystrict, @files);
7260 ################################################################
7262 # &require_build_directory ($DIRECTORY)
7263 # ------------------------------------
7264 # Emit rules to create $DIRECTORY if needed, and return
7265 # the file that any target requiring this directory should be made
7266 # dependent upon.
7267 # We don't want to emit the rule twice, and want to reuse it
7268 # for directories with equivalent names (e.g., `foo/bar' and `./foo//bar').
7269 sub require_build_directory ($)
7271   my $directory = shift;
7273   return $directory_map{$directory} if exists $directory_map{$directory};
7275   my $cdir = File::Spec->canonpath ($directory);
7277   if (exists $directory_map{$cdir})
7278     {
7279       my $stamp = $directory_map{$cdir};
7280       $directory_map{$directory} = $stamp;
7281       return $stamp;
7282     }
7284   my $dirstamp = "$cdir/\$(am__dirstamp)";
7286   $directory_map{$directory} = $dirstamp;
7287   $directory_map{$cdir} = $dirstamp;
7289   # Set a variable for the dirstamp basename.
7290   define_pretty_variable ('am__dirstamp', TRUE, INTERNAL,
7291                           '$(am__leading_dot)dirstamp');
7293   # Directory must be removed by `make distclean'.
7294   $clean_files{$dirstamp} = DIST_CLEAN;
7296   $output_rules .= ("$dirstamp:\n"
7297                     . "\t\@\$(MKDIR_P) $directory\n"
7298                     . "\t\@: > $dirstamp\n");
7300   return $dirstamp;
7303 # &require_build_directory_maybe ($FILE)
7304 # --------------------------------------
7305 # If $FILE lies in a subdirectory, emit a rule to create this
7306 # directory and return the file that $FILE should be made
7307 # dependent upon.  Otherwise, just return the empty string.
7308 sub require_build_directory_maybe ($)
7310     my $file = shift;
7311     my $directory = dirname ($file);
7313     if ($directory ne '.')
7314     {
7315         return require_build_directory ($directory);
7316     }
7317     else
7318     {
7319         return '';
7320     }
7323 ################################################################
7325 # Push a list of files onto dist_common.
7326 sub push_dist_common
7328   prog_error "push_dist_common run after handle_dist"
7329     if $handle_dist_run;
7330   Automake::Variable::define ('DIST_COMMON', VAR_AUTOMAKE, '+', TRUE, "@_",
7331                               '', INTERNAL, VAR_PRETTY);
7335 ################################################################
7337 # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN)
7338 # ----------------------------------------------
7339 # Generate a Makefile.in given the name of the corresponding Makefile and
7340 # the name of the file output by config.status.
7341 sub generate_makefile ($$)
7343   my ($makefile_am, $makefile_in) = @_;
7345   # Reset all the Makefile.am related variables.
7346   initialize_per_input;
7348   # AUTOMAKE_OPTIONS can contains -W flags to disable or enable
7349   # warnings for this file.  So hold any warning issued before
7350   # we have processed AUTOMAKE_OPTIONS.
7351   buffer_messages ('warning');
7353   # Name of input file ("Makefile.am") and output file
7354   # ("Makefile.in").  These have no directory components.
7355   $am_file_name = basename ($makefile_am);
7356   $in_file_name = basename ($makefile_in);
7358   # $OUTPUT is encoded.  If it contains a ":" then the first element
7359   # is the real output file, and all remaining elements are input
7360   # files.  We don't scan or otherwise deal with these input files,
7361   # other than to mark them as dependencies.  See
7362   # &scan_autoconf_files for details.
7363   my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in});
7365   $relative_dir = dirname ($makefile);
7366   $am_relative_dir = dirname ($makefile_am);
7367   $topsrcdir = backname ($relative_dir);
7369   read_main_am_file ($makefile_am);
7370   if (handle_options)
7371     {
7372       # Process buffered warnings.
7373       flush_messages;
7374       # Fatal error.  Just return, so we can continue with next file.
7375       return;
7376     }
7377   # Process buffered warnings.
7378   flush_messages;
7380   # There are a few install-related variables that you should not define.
7381   foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL')
7382     {
7383       my $v = var $var;
7384       if ($v)
7385         {
7386           my $def = $v->def (TRUE);
7387           prog_error "$var not defined in condition TRUE"
7388             unless $def;
7389           reject_var $var, "`$var' should not be defined"
7390             if $def->owner != VAR_AUTOMAKE;
7391         }
7392     }
7394   # Catch some obsolete variables.
7395   msg_var ('obsolete', 'INCLUDES',
7396            "`INCLUDES' is the old name for `AM_CPPFLAGS' (or `*_CPPFLAGS')")
7397     if var ('INCLUDES');
7399   # Must do this after reading .am file.
7400   define_variable ('subdir', $relative_dir, INTERNAL);
7402   # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that
7403   # recursive rules are enabled.
7404   define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '')
7405     if var 'DIST_SUBDIRS' && ! var 'SUBDIRS';
7407   # Check first, because we might modify some state.
7408   check_cygnus;
7409   check_gnu_standards;
7410   check_gnits_standards;
7412   handle_configure ($makefile_am, $makefile_in, $makefile, @inputs);
7413   handle_gettext;
7414   handle_libraries;
7415   handle_ltlibraries;
7416   handle_programs;
7417   handle_scripts;
7419   # These must be run after all the sources are scanned.  They
7420   # use variables defined by &handle_libraries, &handle_ltlibraries,
7421   # or &handle_programs.
7422   handle_compile;
7423   handle_languages;
7424   handle_libtool;
7426   # Variables used by distdir.am and tags.am.
7427   define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources);
7428   if (! option 'no-dist')
7429     {
7430       define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources);
7431     }
7433   handle_multilib;
7434   handle_texinfo;
7435   handle_emacs_lisp;
7436   handle_python;
7437   handle_java;
7438   handle_man_pages;
7439   handle_data;
7440   handle_headers;
7441   handle_subdirs;
7442   handle_tags;
7443   handle_minor_options;
7444   # Must come after handle_programs so that %known_programs is up-to-date.
7445   handle_tests;
7447   # This must come after most other rules.
7448   handle_dist;
7450   handle_footer;
7451   do_check_merge_target;
7452   handle_all ($makefile);
7454   # FIXME: Gross!
7455   if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS'))
7456     {
7457       $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n";
7458     }
7460   handle_install;
7461   handle_clean ($makefile);
7462   handle_factored_dependencies;
7464   # Comes last, because all the above procedures may have
7465   # defined or overridden variables.
7466   $output_vars .= output_variables;
7468   check_typos;
7470   my ($out_file) = $output_directory . '/' . $makefile_in;
7472   if ($exit_code != 0)
7473     {
7474       verb "not writing $out_file because of earlier errors";
7475       return;
7476     }
7478   if (! -d ($output_directory . '/' . $am_relative_dir))
7479     {
7480       mkdir ($output_directory . '/' . $am_relative_dir, 0755);
7481     }
7483   # We make sure that `all:' is the first target.
7484   my $output =
7485     "$output_vars$output_all$output_header$output_rules$output_trailer";
7487   # Decide whether we must update the output file or not.
7488   # We have to update in the following situations.
7489   #  * $force_generation is set.
7490   #  * any of the output dependencies is younger than the output
7491   #  * the contents of the output is different (this can happen
7492   #    if the project has been populated with a file listed in
7493   #    @common_files since the last run).
7494   # Output's dependencies are split in two sets:
7495   #  * dependencies which are also configure dependencies
7496   #    These do not change between each Makefile.am
7497   #  * other dependencies, specific to the Makefile.am being processed
7498   #    (such as the Makefile.am itself, or any Makefile fragment
7499   #    it includes).
7500   my $timestamp = mtime $out_file;
7501   if (! $force_generation
7502       && $configure_deps_greatest_timestamp < $timestamp
7503       && $output_deps_greatest_timestamp < $timestamp
7504       && $output eq contents ($out_file))
7505     {
7506       verb "$out_file unchanged";
7507       # No need to update.
7508       return;
7509     }
7511   if (-e $out_file)
7512     {
7513       unlink ($out_file)
7514         or fatal "cannot remove $out_file: $!\n";
7515     }
7517   my $gm_file = new Automake::XFile "> $out_file";
7518   verb "creating $out_file";
7519   print $gm_file $output;
7522 ################################################################
7527 ################################################################
7529 # Print usage information.
7530 sub usage ()
7532     print "Usage: $0 [OPTION] ... [Makefile]...
7534 Generate Makefile.in for configure from Makefile.am.
7536 Operation modes:
7537       --help               print this help, then exit
7538       --version            print version number, then exit
7539   -v, --verbose            verbosely list files processed
7540       --no-force           only update Makefile.in's that are out of date
7541   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY
7543 Dependency tracking:
7544   -i, --ignore-deps      disable dependency tracking code
7545       --include-deps     enable dependency tracking code
7547 Flavors:
7548       --cygnus           assume program is part of Cygnus-style tree
7549       --foreign          set strictness to foreign
7550       --gnits            set strictness to gnits
7551       --gnu              set strictness to gnu
7553 Library files:
7554   -a, --add-missing      add missing standard files to package
7555       --libdir=DIR       directory storing library files
7556   -c, --copy             with -a, copy missing files (default is symlink)
7557   -f, --force-missing    force update of standard files
7560     Automake::ChannelDefs::usage;
7562     my ($last, @lcomm);
7563     $last = '';
7564     foreach my $iter (sort ((@common_files, @common_sometimes)))
7565     {
7566         push (@lcomm, $iter) unless $iter eq $last;
7567         $last = $iter;
7568     }
7570     my @four;
7571     print "\nFiles which are automatically distributed, if found:\n";
7572     format USAGE_FORMAT =
7573   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<   @<<<<<<<<<<<<<<<<
7574   $four[0],           $four[1],           $four[2],           $four[3]
7576     $~ = "USAGE_FORMAT";
7578     my $cols = 4;
7579     my $rows = int(@lcomm / $cols);
7580     my $rest = @lcomm % $cols;
7582     if ($rest)
7583     {
7584         $rows++;
7585     }
7586     else
7587     {
7588         $rest = $cols;
7589     }
7591     for (my $y = 0; $y < $rows; $y++)
7592     {
7593         @four = ("", "", "", "");
7594         for (my $x = 0; $x < $cols; $x++)
7595         {
7596             last if $y + 1 == $rows && $x == $rest;
7598             my $idx = (($x > $rest)
7599                        ?  ($rows * $rest + ($rows - 1) * ($x - $rest))
7600                        : ($rows * $x));
7602             $idx += $y;
7603             $four[$x] = $lcomm[$idx];
7604         }
7605         write;
7606     }
7608     print "\nReport bugs to <bug-automake\@gnu.org>.\n";
7610     # --help always returns 0 per GNU standards.
7611     exit 0;
7615 # &version ()
7616 # -----------
7617 # Print version information
7618 sub version ()
7620   print <<EOF;
7621 automake (GNU $PACKAGE) $VERSION
7622 Written by Tom Tromey <tromey\@redhat.com>
7623        and Alexandre Duret-Lutz <adl\@gnu.org>.
7625 Copyright 2006 Free Software Foundation, Inc.
7626 This is free software; see the source for copying conditions.  There is NO
7627 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
7629   # --version always returns 0 per GNU standards.
7630   exit 0;
7633 ################################################################
7635 # Parse command line.
7636 sub parse_arguments ()
7638   # Start off as gnu.
7639   set_strictness ('gnu');
7641   my $cli_where = new Automake::Location;
7642   my %cli_options =
7643     (
7644      'libdir=s'         => \$libdir,
7645      'gnu'              => sub { set_strictness ('gnu'); },
7646      'gnits'            => sub { set_strictness ('gnits'); },
7647      'cygnus'           => sub { set_global_option ('cygnus', $cli_where); },
7648      'foreign'          => sub { set_strictness ('foreign'); },
7649      'include-deps'     => sub { unset_global_option ('no-dependencies'); },
7650      'i|ignore-deps'    => sub { set_global_option ('no-dependencies',
7651                                                     $cli_where); },
7652      'no-force'         => sub { $force_generation = 0; },
7653      'f|force-missing'  => \$force_missing,
7654      'o|output-dir=s'   => \$output_directory,
7655      'a|add-missing'    => \$add_missing,
7656      'c|copy'           => \$copy_missing,
7657      'v|verbose'        => sub { setup_channel 'verb', silent => 0; },
7658      'W|warnings=s'     => \&parse_warnings,
7659      # These long options (--Werror and --Wno-error) for backward
7660      # compatibility.  Use -Werror and -Wno-error today.
7661      'Werror'           => sub { parse_warnings 'W', 'error'; },
7662      'Wno-error'        => sub { parse_warnings 'W', 'no-error'; },
7663      );
7664   use Getopt::Long;
7665   Getopt::Long::config ("bundling", "pass_through");
7667   # See if --version or --help is used.  We want to process these before
7668   # anything else because the GNU Coding Standards require us to
7669   # `exit 0' after processing these options, and we can't guarantee this
7670   # if we treat other options first.  (Handling other options first
7671   # could produce error diagnostics, and in this condition it is
7672   # confusing if Automake does `exit 0'.)
7673   my %cli_options_1st_pass =
7674     (
7675      'version' => \&version,
7676      'help'    => \&usage,
7677      # Recognize all other options (and their arguments) but do nothing.
7678      map { $_ => sub {} } (keys %cli_options)
7679      );
7680   my @ARGV_backup = @ARGV;
7681   Getopt::Long::GetOptions %cli_options_1st_pass
7682     or exit 1;
7683   @ARGV = @ARGV_backup;
7685   # Now *really* process the options.  This time we know that --help
7686   # and --version are not present, but we specify them nonetheless so
7687   # that ambiguous abbreviation are diagnosed.
7688   Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {}
7689     or exit 1;
7691   if (defined $output_directory)
7692     {
7693       msg 'obsolete', "`--output-dir' is deprecated\n";
7694     }
7695   else
7696     {
7697       # In the next release we'll remove this entirely.
7698       $output_directory = '.';
7699     }
7701   return unless @ARGV;
7703   if ($ARGV[0] =~ /^-./)
7704     {
7705       my %argopts;
7706       for my $k (keys %cli_options)
7707         {
7708           if ($k =~ /(.*)=s$/)
7709             {
7710               map { $argopts{(length ($_) == 1)
7711                              ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
7712             }
7713         }
7714       if ($ARGV[0] eq '--')
7715         {
7716           shift @ARGV;
7717         }
7718       elsif (exists $argopts{$ARGV[0]})
7719         {
7720           fatal ("option `$ARGV[0]' requires an argument\n"
7721                  . "Try `$0 --help' for more information.");
7722         }
7723       else
7724         {
7725           fatal ("unrecognized option `$ARGV[0]'.\n"
7726                  . "Try `$0 --help' for more information.");
7727         }
7728     }
7730   my $errspec = 0;
7731   foreach my $arg (@ARGV)
7732     {
7733       fatal ("empty argument\nTry `$0 --help' for more information.")
7734         if ($arg eq '');
7736       # Handle $local:$input syntax.
7737       my ($local, @rest) = split (/:/, $arg);
7738       @rest = ("$local.in",) unless @rest;
7739       my $input = locate_am @rest;
7740       if ($input)
7741         {
7742           push @input_files, $input;
7743           $output_files{$input} = join (':', ($local, @rest));
7744         }
7745       else
7746         {
7747           error "no Automake input file found for `$arg'";
7748           $errspec = 1;
7749         }
7750     }
7751   fatal "no input file found among supplied arguments"
7752     if $errspec && ! @input_files;
7755 ################################################################
7757 # Parse the WARNINGS environment variable.
7758 parse_WARNINGS;
7760 # Parse command line.
7761 parse_arguments;
7763 $configure_ac = require_configure_ac;
7765 # Do configure.ac scan only once.
7766 scan_autoconf_files;
7768 if (! @input_files)
7769   {
7770     my $msg = '';
7771     $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?"
7772       if -f 'Makefile.am';
7773     fatal ("no `Makefile.am' found for any configure output$msg");
7774   }
7776 # Now do all the work on each file.
7777 foreach my $file (@input_files)
7778   {
7779     ($am_file = $file) =~ s/\.in$//;
7780     if (! -f ($am_file . '.am'))
7781       {
7782         error "`$am_file.am' does not exist";
7783       }
7784     else
7785       {
7786         # Any warning setting now local to this Makefile.am.
7787         dup_channel_setup;
7789         generate_makefile ($am_file . '.am', $file);
7791         # Back out any warning setting.
7792         drop_channel_setup;
7793       }
7794   }
7796 exit $exit_code;
7799 ### Setup "GNU" style for perl-mode and cperl-mode.
7800 ## Local Variables:
7801 ## perl-indent-level: 2
7802 ## perl-continued-statement-offset: 2
7803 ## perl-continued-brace-offset: 0
7804 ## perl-brace-offset: 0
7805 ## perl-brace-imaginary-offset: 0
7806 ## perl-label-offset: -2
7807 ## cperl-indent-level: 2
7808 ## cperl-brace-offset: 0
7809 ## cperl-continued-brace-offset: 0
7810 ## cperl-label-offset: -2
7811 ## cperl-extra-newline-before-brace: t
7812 ## cperl-merge-trailing-else: nil
7813 ## cperl-continued-statement-offset: 2
7814 ## End: