File: | /usr/local/bin/automake |
Coverage: | 8.2% |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | #!/usr/bin/perl -w | ||||||
2 | # -*- perl -*- | ||||||
3 | # Generated from automake.in; do not edit by hand. | ||||||
4 | |||||||
5 | 1 | 3 | eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac' | ||||
6 | if 0; | ||||||
7 | |||||||
8 | # automake - create Makefile.in from Makefile.am | ||||||
9 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||||||
10 | # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, | ||||||
11 | # Inc. | ||||||
12 | |||||||
13 | # This program is free software; you can redistribute it and/or modify | ||||||
14 | # it under the terms of the GNU General Public License as published by | ||||||
15 | # the Free Software Foundation; either version 2, or (at your option) | ||||||
16 | # any later version. | ||||||
17 | |||||||
18 | # This program is distributed in the hope that it will be useful, | ||||||
19 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
20 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
21 | # GNU General Public License for more details. | ||||||
22 | |||||||
23 | # You should have received a copy of the GNU General Public License | ||||||
24 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||||
25 | |||||||
26 | # Originally written by David Mackenzie <djm@gnu.ai.mit.edu>. | ||||||
27 | # Perl reimplementation by Tom Tromey <tromey@redhat.com>, and | ||||||
28 | # Alexandre Duret-Lutz <adl@gnu.org>. | ||||||
29 | |||||||
30 | package Language; | ||||||
31 | |||||||
32 | BEGIN | ||||||
33 | { | ||||||
34 | 1 | 19 | my $perllibdir = $ENV{'perllibdir'} || '/usr/local/share/automake-1.11'; | ||||
35 | 1 | 4 | unshift @INC, (split ':', $perllibdir); | ||||
36 | |||||||
37 | # Override SHELL. This is required on DJGPP so that system() uses | ||||||
38 | # bash, not COMMAND.COM which doesn't quote arguments properly. | ||||||
39 | # Other systems aren't expected to use $SHELL when Automake | ||||||
40 | # runs, but it should be safe to drop the `if DJGPP' guard if | ||||||
41 | # it turns up other systems need the same thing. After all, | ||||||
42 | # if SHELL is used, ./configure's SHELL is always better than | ||||||
43 | # the user's SHELL (which may be something like tcsh). | ||||||
44 | 1 | 5 | $ENV{'SHELL'} = '/bin/sh' if exists $ENV{'DJDIR'}; | ||||
45 | } | ||||||
46 | |||||||
47 | 1 1 1 | 22 1 7 | use Automake::Struct; | ||||
48 | 1 | 9 | struct (# Short name of the language (c, f77...). | ||||
49 | 'name' => "\$", | ||||||
50 | # Nice name of the language (C, Fortran 77...). | ||||||
51 | 'Name' => "\$", | ||||||
52 | |||||||
53 | # List of configure variables which must be defined. | ||||||
54 | 'config_vars' => '@', | ||||||
55 | |||||||
56 | 'ansi' => "\$", | ||||||
57 | # `pure' is `1' or `'. A `pure' language is one where, if | ||||||
58 | # all the files in a directory are of that language, then we | ||||||
59 | # do not require the C compiler or any code to call it. | ||||||
60 | 'pure' => "\$", | ||||||
61 | |||||||
62 | 'autodep' => "\$", | ||||||
63 | |||||||
64 | # Name of the compiling variable (COMPILE). | ||||||
65 | 'compiler' => "\$", | ||||||
66 | # Content of the compiling variable. | ||||||
67 | 'compile' => "\$", | ||||||
68 | # Flag to require compilation without linking (-c). | ||||||
69 | 'compile_flag' => "\$", | ||||||
70 | 'extensions' => '@', | ||||||
71 | # A subroutine to compute a list of possible extensions of | ||||||
72 | # the product given the input extensions. | ||||||
73 | # (defaults to a subroutine which returns ('.$(OBJEXT)', '.lo')) | ||||||
74 | 'output_extensions' => "\$", | ||||||
75 | # A list of flag variables used in 'compile'. | ||||||
76 | # (defaults to []) | ||||||
77 | 'flags' => "@", | ||||||
78 | |||||||
79 | # Any tag to pass to libtool while compiling. | ||||||
80 | 'libtool_tag' => "\$", | ||||||
81 | |||||||
82 | # The file to use when generating rules for this language. | ||||||
83 | # The default is 'depend2'. | ||||||
84 | 'rule_file' => "\$", | ||||||
85 | |||||||
86 | # Name of the linking variable (LINK). | ||||||
87 | 'linker' => "\$", | ||||||
88 | # Content of the linking variable. | ||||||
89 | 'link' => "\$", | ||||||
90 | |||||||
91 | # Name of the compiler variable (CC). | ||||||
92 | 'ccer' => "\$", | ||||||
93 | |||||||
94 | # Name of the linker variable (LD). | ||||||
95 | 'lder' => "\$", | ||||||
96 | # Content of the linker variable ($(CC)). | ||||||
97 | 'ld' => "\$", | ||||||
98 | |||||||
99 | # Flag to specify the output file (-o). | ||||||
100 | 'output_flag' => "\$", | ||||||
101 | '_finish' => "\$", | ||||||
102 | |||||||
103 | # This is a subroutine which is called whenever we finally | ||||||
104 | # determine the context in which a source file will be | ||||||
105 | # compiled. | ||||||
106 | '_target_hook' => "\$", | ||||||
107 | |||||||
108 | # If TRUE, nodist_ sources will be compiled using specific rules | ||||||
109 | # (i.e. not inference rules). The default is FALSE. | ||||||
110 | 'nodist_specific' => "\$"); | ||||||
111 | |||||||
112 | |||||||
113 | sub finish ($) | ||||||
114 | { | ||||||
115 | 0 | 0 | my ($self) = @_; | ||||
116 | 0 | 0 | if (defined $self->_finish) | ||||
117 | { | ||||||
118 | 0 0 | 0 0 | &{$self->_finish} (@_); | ||||
119 | } | ||||||
120 | } | ||||||
121 | |||||||
122 | sub target_hook ($$$$%) | ||||||
123 | { | ||||||
124 | 0 | 0 | my ($self) = @_; | ||||
125 | 0 | 0 | if (defined $self->_target_hook) | ||||
126 | { | ||||||
127 | 0 0 | 0 0 | &{$self->_target_hook} (@_); | ||||
128 | } | ||||||
129 | } | ||||||
130 | |||||||
131 | package Automake; | ||||||
132 | |||||||
133 | 1 1 1 | 4 1 3 | use strict; | ||||
134 | 1 1 1 | 11 1 6 | use Automake::Config; | ||||
135 | BEGIN | ||||||
136 | { | ||||||
137 | 1 | 5 | if ($perl_threads) | ||||
138 | { | ||||||
139 | 1 | 7 | require threads; | ||||
140 | 1 | 3 | import threads; | ||||
141 | 1 | 8 | require Thread::Queue; | ||||
142 | 1 | 11 | import Thread::Queue; | ||||
143 | } | ||||||
144 | } | ||||||
145 | 1 1 1 | 12 1 8 | use Automake::General; | ||||
146 | 1 1 1 | 15 2 13 | use Automake::XFile; | ||||
147 | 1 1 1 | 5 1 5 | use Automake::Channels; | ||||
148 | 1 1 1 | 4 1 5 | use Automake::ChannelDefs; | ||||
149 | 1 1 1 | 13 2 6 | use Automake::Configure_ac; | ||||
150 | 1 1 1 | 5 1 2 | use Automake::FileUtils; | ||||
151 | 1 1 1 | 2 1 8 | use Automake::Location; | ||||
152 | 1 1 1 | 11 1 8 | use Automake::Condition qw/TRUE FALSE/; | ||||
153 | 1 1 1 | 12 2 174 | use Automake::DisjConditions; | ||||
154 | 1 1 1 | 12 2 6 | use Automake::Options; | ||||
155 | 1 1 1 | 3 1 4 | use Automake::Version; | ||||
156 | 1 1 1 | 11 1 8 | use Automake::Variable; | ||||
157 | 1 1 1 | 5 1 3 | use Automake::VarDef; | ||||
158 | 1 1 1 | 12 1 6 | use Automake::Rule; | ||||
159 | 1 1 1 | 4 1 3 | use Automake::RuleDef; | ||||
160 | 1 1 1 | 4 1 3 | use Automake::Wrap 'makefile_wrap'; | ||||
161 | 1 1 1 | 5 1 6 | use File::Basename; | ||||
162 | 1 1 1 | 4 1 6 | use File::Spec; | ||||
163 | 1 1 1 | 3 1 3 | use Carp; | ||||
164 | |||||||
165 | ## ----------- ## | ||||||
166 | ## Constants. ## | ||||||
167 | ## ----------- ## | ||||||
168 | |||||||
169 | # Some regular expressions. One reason to put them here is that it | ||||||
170 | # makes indentation work better in Emacs. | ||||||
171 | |||||||
172 | # Writing singled-quoted-$-terminated regexes is a pain because | ||||||
173 | # perl-mode thinks of $' as the ${'} variable (instead of a $ followed | ||||||
174 | # by a closing quote. Letting perl-mode think the quote is not closed | ||||||
175 | # leads to all sort of misindentations. On the other hand, defining | ||||||
176 | # regexes as double-quoted strings is far less readable. So usually | ||||||
177 | # we will write: | ||||||
178 | # | ||||||
179 | # $REGEX = '^regex_value' . "\$"; | ||||||
180 | |||||||
181 | 1 | 2 | my $IGNORE_PATTERN = '^\s*##([^#\n].*)?\n'; | ||||
182 | 1 | 3 | my $WHITE_PATTERN = '^\s*' . "\$"; | ||||
183 | 1 | 1 | my $COMMENT_PATTERN = '^#'; | ||||
184 | 1 | 1 | my $TARGET_PATTERN='[$a-zA-Z0-9_.@%][-.a-zA-Z0-9_(){}/$+@%]*'; | ||||
185 | # A rule has three parts: a list of targets, a list of dependencies, | ||||||
186 | # and optionally actions. | ||||||
187 | 1 | 4 | my $RULE_PATTERN = | ||||
188 | "^($TARGET_PATTERN(?:(?:\\\\\n|\\s)+$TARGET_PATTERN)*) *:([^=].*|)\$"; | ||||||
189 | |||||||
190 | # Only recognize leading spaces, not leading tabs. If we recognize | ||||||
191 | # leading tabs here then we need to make the reader smarter, because | ||||||
192 | # otherwise it will think rules like `foo=bar; \' are errors. | ||||||
193 | 1 | 1 | my $ASSIGNMENT_PATTERN = '^ *([^ \t=:+]*)\s*([:+]?)=\s*(.*)' . "\$"; | ||||
194 | # This pattern recognizes a Gnits version id and sets $1 if the | ||||||
195 | # release is an alpha release. We also allow a suffix which can be | ||||||
196 | # used to extend the version number with a "fork" identifier. | ||||||
197 | 1 | 2 | my $GNITS_VERSION_PATTERN = '\d+\.\d+([a-z]|\.\d+)?(-[A-Za-z0-9]+)?'; | ||||
198 | |||||||
199 | 1 | 2 | my $IF_PATTERN = '^if\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*)\s*(?:#.*)?' . "\$"; | ||||
200 | 1 | 1 | my $ELSE_PATTERN = | ||||
201 | '^else(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; | ||||||
202 | 1 | 1 | my $ENDIF_PATTERN = | ||||
203 | '^endif(?:\s+(!?)\s*([A-Za-z][A-Za-z0-9_]*))?\s*(?:#.*)?' . "\$"; | ||||||
204 | 1 | 2 | my $PATH_PATTERN = '(\w|[+/.-])+'; | ||||
205 | # This will pass through anything not of the prescribed form. | ||||||
206 | 1 | 4 | my $INCLUDE_PATTERN = ('^include\s+' | ||||
207 | . '((\$\(top_srcdir\)/' . $PATH_PATTERN . ')' | ||||||
208 | . '|(\$\(srcdir\)/' . $PATH_PATTERN . ')' | ||||||
209 | . '|([^/\$]' . $PATH_PATTERN . '))\s*(#.*)?' . "\$"); | ||||||
210 | |||||||
211 | # Match `-d' as a command-line argument in a string. | ||||||
212 | 1 | 2 | my $DASH_D_PATTERN = "(^|\\s)-d(\\s|\$)"; | ||||
213 | # Directories installed during 'install-exec' phase. | ||||||
214 | 1 | 1 | my $EXEC_DIR_PATTERN = | ||||
215 | '^(?:bin|sbin|libexec|sysconf|localstate|lib|pkglib|.*exec.*)' . "\$"; | ||||||
216 | |||||||
217 | # Values for AC_CANONICAL_* | ||||||
218 | 1 1 1 | 5 1 4 | use constant AC_CANONICAL_BUILD => 1; | ||||
219 | 1 1 1 | 3 1 3 | use constant AC_CANONICAL_HOST => 2; | ||||
220 | 1 1 1 | 3 1 3 | use constant AC_CANONICAL_TARGET => 3; | ||||
221 | |||||||
222 | # Values indicating when something should be cleaned. | ||||||
223 | 1 1 1 | 4 4 2 | use constant MOSTLY_CLEAN => 0; | ||||
224 | 1 1 1 | 3 1 3 | use constant CLEAN => 1; | ||||
225 | 1 1 1 | 3 1 2 | use constant DIST_CLEAN => 2; | ||||
226 | 1 1 1 | 7 2 2 | use constant MAINTAINER_CLEAN => 3; | ||||
227 | |||||||
228 | # Libtool files. | ||||||
229 | 1 | 4 | my @libtool_files = qw(ltmain.sh config.guess config.sub); | ||||
230 | # ltconfig appears here for compatibility with old versions of libtool. | ||||||
231 | 1 | 3 | my @libtool_sometimes = qw(ltconfig ltcf-c.sh ltcf-cxx.sh ltcf-gcj.sh); | ||||
232 | |||||||
233 | # Commonly found files we look for and automatically include in | ||||||
234 | # DISTFILES. | ||||||
235 | 1 | 8 | my @common_files = | ||||
236 | (qw(ABOUT-GNU ABOUT-NLS AUTHORS BACKLOG COPYING COPYING.DOC COPYING.LIB | ||||||
237 | COPYING.LESSER ChangeLog INSTALL NEWS README THANKS TODO | ||||||
238 | ansi2knr.1 ansi2knr.c compile config.guess config.rpath config.sub | ||||||
239 | depcomp elisp-comp install-sh libversion.in mdate-sh missing | ||||||
240 | mkinstalldirs py-compile texinfo.tex ylwrap), | ||||||
241 | @libtool_files, @libtool_sometimes); | ||||||
242 | |||||||
243 | # Commonly used files we auto-include, but only sometimes. This list | ||||||
244 | # is used for the --help output only. | ||||||
245 | 1 | 4 | my @common_sometimes = | ||||
246 | qw(aclocal.m4 acconfig.h config.h.top config.h.bot configure | ||||||
247 | configure.ac configure.in stamp-vti); | ||||||
248 | |||||||
249 | # Standard directories from the GNU Coding Standards, and additional | ||||||
250 | # pkg* directories from Automake. Stored in a hash for fast member check. | ||||||
251 | 32 | 59 | my %standard_prefix = | ||||
252 | 1 | 4 | map { $_ => 1 } (qw(bin data dataroot dvi exec html include info | ||||
253 | lib libexec lisp localstate man man1 man2 man3 | ||||||
254 | man4 man5 man6 man7 man8 man9 oldinclude pdf | ||||||
255 | pkgdatadir pkgincludedir pkglibdir pkglibexecdir | ||||||
256 | ps sbin sharedstate sysconf)); | ||||||
257 | |||||||
258 | # Copyright on generated Makefile.ins. | ||||||
259 | 1 | 5 | my $gen_copyright = "\ | ||||
260 | # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, | ||||||
261 | # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, | ||||||
262 | # Inc. | ||||||
263 | # This Makefile.in is free software; the Free Software Foundation | ||||||
264 | # gives unlimited permission to copy and/or distribute it, | ||||||
265 | # with or without modifications, as long as this notice is preserved. | ||||||
266 | |||||||
267 | # This program is distributed in the hope that it will be useful, | ||||||
268 | # but WITHOUT ANY WARRANTY, to the extent permitted by law; without | ||||||
269 | # even the implied warranty of MERCHANTABILITY or FITNESS FOR A | ||||||
270 | # PARTICULAR PURPOSE. | ||||||
271 | "; | ||||||
272 | |||||||
273 | # These constants are returned by the lang_*_rewrite functions. | ||||||
274 | # LANG_SUBDIR means that the resulting object file should be in a | ||||||
275 | # subdir if the source file is. In this case the file name cannot | ||||||
276 | # have `..' components. | ||||||
277 | 1 1 1 | 4 2 2 | use constant LANG_IGNORE => 0; | ||||
278 | 1 1 1 | 3 1 3 | use constant LANG_PROCESS => 1; | ||||
279 | 1 1 1 | 3 1 3 | use constant LANG_SUBDIR => 2; | ||||
280 | |||||||
281 | # These are used when keeping track of whether an object can be built | ||||||
282 | # by two different paths. | ||||||
283 | 1 1 1 | 4 1 3 | use constant COMPILE_LIBTOOL => 1; | ||||
284 | 1 1 1 | 7 1 3 | use constant COMPILE_ORDINARY => 2; | ||||
285 | |||||||
286 | # We can't always associate a location to a variable or a rule, | ||||||
287 | # when it's defined by Automake. We use INTERNAL in this case. | ||||||
288 | 1 1 1 | 4 1 4 | use constant INTERNAL => new Automake::Location; | ||||
289 | |||||||
290 | # Serialization keys for message queues. | ||||||
291 | 1 1 1 | 3 2 2 | use constant QUEUE_MESSAGE => "msg"; | ||||
292 | 1 1 1 | 3 2 2 | use constant QUEUE_CONF_FILE => "conf file"; | ||||
293 | 1 1 1 | 3 1 2 | use constant QUEUE_LOCATION => "location"; | ||||
294 | 1 1 1 | 3 1 2 | use constant QUEUE_STRING => "string"; | ||||
295 | |||||||
296 | |||||||
297 | ## ---------------------------------- ## | ||||||
298 | ## Variables related to the options. ## | ||||||
299 | ## ---------------------------------- ## | ||||||
300 | |||||||
301 | # TRUE if we should always generate Makefile.in. | ||||||
302 | 1 | 2 | my $force_generation = 1; | ||||
303 | |||||||
304 | # From the Perl manual. | ||||||
305 | 1 | 20 | my $symlink_exists = (eval 'symlink ("", "");', $@ eq ''); | ||||
306 | |||||||
307 | # TRUE if missing standard files should be installed. | ||||||
308 | 1 | 2 | my $add_missing = 0; | ||||
309 | |||||||
310 | # TRUE if we should copy missing files; otherwise symlink if possible. | ||||||
311 | 1 | 2 | my $copy_missing = 0; | ||||
312 | |||||||
313 | # TRUE if we should always update files that we know about. | ||||||
314 | 1 | 2 | my $force_missing = 0; | ||||
315 | |||||||
316 | |||||||
317 | ## ---------------------------------------- ## | ||||||
318 | ## Variables filled during files scanning. ## | ||||||
319 | ## ---------------------------------------- ## | ||||||
320 | |||||||
321 | # Name of the configure.ac file. | ||||||
322 | 1 | 1 | my $configure_ac; | ||||
323 | |||||||
324 | # Files found by scanning configure.ac for LIBOBJS. | ||||||
325 | 1 | 2 | my %libsources = (); | ||||
326 | |||||||
327 | # Names used in AC_CONFIG_HEADER call. | ||||||
328 | 1 | 2 | my @config_headers = (); | ||||
329 | |||||||
330 | # Names used in AC_CONFIG_LINKS call. | ||||||
331 | 1 | 2 | my @config_links = (); | ||||
332 | |||||||
333 | # Directory where output files go. Actually, output files are | ||||||
334 | # relative to this directory. | ||||||
335 | 1 | 2 | my $output_directory; | ||||
336 | |||||||
337 | # List of Makefile.am's to process, and their corresponding outputs. | ||||||
338 | 1 | 1 | my @input_files = (); | ||||
339 | 1 | 1 | my %output_files = (); | ||||
340 | |||||||
341 | # Complete list of Makefile.am's that exist. | ||||||
342 | 1 | 2 | my @configure_input_files = (); | ||||
343 | |||||||
344 | # List of files in AC_CONFIG_FILES/AC_OUTPUT without Makefile.am's, | ||||||
345 | # and their outputs. | ||||||
346 | 1 | 2 | my @other_input_files = (); | ||||
347 | # Where each AC_CONFIG_FILES/AC_OUTPUT/AC_CONFIG_LINK/AC_CONFIG_HEADER appears. | ||||||
348 | # The keys are the files created by these macros. | ||||||
349 | 1 | 1 | my %ac_config_files_location = (); | ||||
350 | # The condition under which AC_CONFIG_FOOS appears. | ||||||
351 | 1 | 1 | my %ac_config_files_condition = (); | ||||
352 | |||||||
353 | # Directory to search for configure-required files. This | ||||||
354 | # will be computed by &locate_aux_dir and can be set using | ||||||
355 | # AC_CONFIG_AUX_DIR in configure.ac. | ||||||
356 | # $CONFIG_AUX_DIR is the `raw' directory, valid only in the source-tree. | ||||||
357 | 1 | 2 | my $config_aux_dir = ''; | ||||
358 | 1 | 1 | my $config_aux_dir_set_in_configure_ac = 0; | ||||
359 | # $AM_CONFIG_AUX_DIR is prefixed with $(top_srcdir), so it can be used | ||||||
360 | # in Makefiles. | ||||||
361 | 1 | 1 | my $am_config_aux_dir = ''; | ||||
362 | |||||||
363 | # Directory to search for AC_LIBSOURCE files, as set by AC_CONFIG_LIBOBJ_DIR | ||||||
364 | # in configure.ac. | ||||||
365 | 1 | 2 | my $config_libobj_dir = ''; | ||||
366 | |||||||
367 | # Whether AM_GNU_GETTEXT has been seen in configure.ac. | ||||||
368 | 1 | 1 | my $seen_gettext = 0; | ||||
369 | # Whether AM_GNU_GETTEXT([external]) is used. | ||||||
370 | 1 | 1 | my $seen_gettext_external = 0; | ||||
371 | # Where AM_GNU_GETTEXT appears. | ||||||
372 | 1 | 2 | my $ac_gettext_location; | ||||
373 | # Whether AM_GNU_GETTEXT_INTL_SUBDIR has been seen. | ||||||
374 | 1 | 1 | my $seen_gettext_intl = 0; | ||||
375 | |||||||
376 | # Lists of tags supported by Libtool. | ||||||
377 | 1 | 2 | my %libtool_tags = (); | ||||
378 | # 1 if Libtool uses LT_SUPPORTED_TAG. If it does, then it also | ||||||
379 | # uses AC_REQUIRE_AUX_FILE. | ||||||
380 | 1 | 2 | my $libtool_new_api = 0; | ||||
381 | |||||||
382 | # Most important AC_CANONICAL_* macro seen so far. | ||||||
383 | 1 | 1 | my $seen_canonical = 0; | ||||
384 | # Location of that macro. | ||||||
385 | 1 | 1 | my $canonical_location; | ||||
386 | |||||||
387 | # Where AM_MAINTAINER_MODE appears. | ||||||
388 | 1 | 1 | my $seen_maint_mode; | ||||
389 | |||||||
390 | # Actual version we've seen. | ||||||
391 | 1 | 1 | my $package_version = ''; | ||||
392 | |||||||
393 | # Where version is defined. | ||||||
394 | 1 | 1 | my $package_version_location; | ||||
395 | |||||||
396 | # TRUE if we've seen AM_ENABLE_MULTILIB. | ||||||
397 | 1 | 1 | my $seen_multilib = 0; | ||||
398 | |||||||
399 | # TRUE if we've seen AM_PROG_CC_C_O | ||||||
400 | 1 | 2 | my $seen_cc_c_o = 0; | ||||
401 | |||||||
402 | # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument. | ||||||
403 | 1 | 2 | my %required_aux_file = (); | ||||
404 | |||||||
405 | # Where AM_INIT_AUTOMAKE is called; | ||||||
406 | 1 | 1 | my $seen_init_automake = 0; | ||||
407 | |||||||
408 | # TRUE if we've seen AM_AUTOMAKE_VERSION. | ||||||
409 | 1 | 1 | my $seen_automake_version = 0; | ||||
410 | |||||||
411 | # Hash table of discovered configure substitutions. Keys are names, | ||||||
412 | # values are `FILE:LINE' strings which are used by error message | ||||||
413 | # generation. | ||||||
414 | 1 | 1 | my %configure_vars = (); | ||||
415 | |||||||
416 | # Ignored configure substitutions (i.e., variables not to be output in | ||||||
417 | # Makefile.in) | ||||||
418 | 1 | 2 | my %ignored_configure_vars = (); | ||||
419 | |||||||
420 | # Files included by $configure_ac. | ||||||
421 | 1 | 2 | my @configure_deps = (); | ||||
422 | |||||||
423 | # Greatest timestamp of configure's dependencies. | ||||||
424 | 1 | 1 | my $configure_deps_greatest_timestamp = 0; | ||||
425 | |||||||
426 | # Hash table of AM_CONDITIONAL variables seen in configure. | ||||||
427 | 1 | 1 | my %configure_cond = (); | ||||
428 | |||||||
429 | # This maps extensions onto language names. | ||||||
430 | 1 | 2 | my %extension_map = (); | ||||
431 | |||||||
432 | # List of the DIST_COMMON files we discovered while reading | ||||||
433 | # configure.in | ||||||
434 | 1 | 1 | my $configure_dist_common = ''; | ||||
435 | |||||||
436 | # This maps languages names onto objects. | ||||||
437 | 1 | 2 | my %languages = (); | ||||
438 | # Maps each linker variable onto a language object. | ||||||
439 | 1 | 1 | my %link_languages = (); | ||||
440 | |||||||
441 | # maps extensions to needed source flags. | ||||||
442 | 1 | 1 | my %sourceflags = (); | ||||
443 | |||||||
444 | # List of targets we must always output. | ||||||
445 | # FIXME: Complete, and remove falsely required targets. | ||||||
446 | 1 | 13 | my %required_targets = | ||||
447 | ( | ||||||
448 | 'all' => 1, | ||||||
449 | 'dvi' => 1, | ||||||
450 | 'pdf' => 1, | ||||||
451 | 'ps' => 1, | ||||||
452 | 'info' => 1, | ||||||
453 | 'install-info' => 1, | ||||||
454 | 'install' => 1, | ||||||
455 | 'install-data' => 1, | ||||||
456 | 'install-exec' => 1, | ||||||
457 | 'uninstall' => 1, | ||||||
458 | |||||||
459 | # FIXME: Not required, temporary hacks. | ||||||
460 | # Well, actually they are sort of required: the -recursive | ||||||
461 | # targets will run them anyway... | ||||||
462 | 'html-am' => 1, | ||||||
463 | 'dvi-am' => 1, | ||||||
464 | 'pdf-am' => 1, | ||||||
465 | 'ps-am' => 1, | ||||||
466 | 'info-am' => 1, | ||||||
467 | 'install-data-am' => 1, | ||||||
468 | 'install-exec-am' => 1, | ||||||
469 | 'install-html-am' => 1, | ||||||
470 | 'install-dvi-am' => 1, | ||||||
471 | 'install-pdf-am' => 1, | ||||||
472 | 'install-ps-am' => 1, | ||||||
473 | 'install-info-am' => 1, | ||||||
474 | 'installcheck-am' => 1, | ||||||
475 | 'uninstall-am' => 1, | ||||||
476 | |||||||
477 | 'install-man' => 1, | ||||||
478 | ); | ||||||
479 | |||||||
480 | # Set to 1 if this run will create the Makefile.in that distributes | ||||||
481 | # the files in config_aux_dir. | ||||||
482 | 1 | 2 | my $automake_will_process_aux_dir = 0; | ||||
483 | |||||||
484 | # The name of the Makefile currently being processed. | ||||||
485 | 1 | 1 | my $am_file = 'BUG'; | ||||
486 | |||||||
487 | |||||||
488 | ################################################################ | ||||||
489 | |||||||
490 | ## ------------------------------------------ ## | ||||||
491 | ## Variables reset by &initialize_per_input. ## | ||||||
492 | ## ------------------------------------------ ## | ||||||
493 | |||||||
494 | # Basename and relative dir of the input file. | ||||||
495 | 1 | 1 | my $am_file_name; | ||||
496 | 1 | 1 | my $am_relative_dir; | ||||
497 | |||||||
498 | # Same but wrt Makefile.in. | ||||||
499 | 1 | 1 | my $in_file_name; | ||||
500 | 1 | 1 | my $relative_dir; | ||||
501 | |||||||
502 | # Relative path to the top directory. | ||||||
503 | 1 | 1 | my $topsrcdir; | ||||
504 | |||||||
505 | # Greatest timestamp of the output's dependencies (excluding | ||||||
506 | # configure's dependencies). | ||||||
507 | 1 | 1 | my $output_deps_greatest_timestamp; | ||||
508 | |||||||
509 | # These variables are used when generating each Makefile.in. | ||||||
510 | # They hold the Makefile.in until it is ready to be printed. | ||||||
511 | 1 | 1 | my $output_vars; | ||||
512 | 1 | 1 | my $output_all; | ||||
513 | 1 | 1 | my $output_header; | ||||
514 | 1 | 1 | my $output_rules; | ||||
515 | 1 | 7 | my $output_trailer; | ||||
516 | |||||||
517 | # This is the conditional stack, updated on if/else/endif, and | ||||||
518 | # used to build Condition objects. | ||||||
519 | 1 | 1 | my @cond_stack; | ||||
520 | |||||||
521 | # This holds the set of included files. | ||||||
522 | 1 | 1 | my @include_stack; | ||||
523 | |||||||
524 | # List of dependencies for the obvious targets. | ||||||
525 | 1 | 1 | my @all; | ||||
526 | 1 | 2 | my @check; | ||||
527 | 1 | 1 | my @check_tests; | ||||
528 | |||||||
529 | # Keys in this hash table are files to delete. The associated | ||||||
530 | # value tells when this should happen (MOSTLY_CLEAN, DIST_CLEAN, etc.) | ||||||
531 | 1 | 1 | my %clean_files; | ||||
532 | |||||||
533 | # Keys in this hash table are object files or other files in | ||||||
534 | # subdirectories which need to be removed. This only holds files | ||||||
535 | # which are created by compilations. The value in the hash indicates | ||||||
536 | # when the file should be removed. | ||||||
537 | 1 | 1 | my %compile_clean_files; | ||||
538 | |||||||
539 | # Keys in this hash table are directories where we expect to build a | ||||||
540 | # libtool object. We use this information to decide what directories | ||||||
541 | # to delete. | ||||||
542 | 1 | 1 | my %libtool_clean_directories; | ||||
543 | |||||||
544 | # Value of `$(SOURCES)', used by tags.am. | ||||||
545 | 1 | 1 | my @sources; | ||||
546 | # Sources which go in the distribution. | ||||||
547 | 1 | 1 | my @dist_sources; | ||||
548 | |||||||
549 | # This hash maps object file names onto their corresponding source | ||||||
550 | # file names. This is used to ensure that each object is created | ||||||
551 | # by a single source file. | ||||||
552 | 1 | 1 | my %object_map; | ||||
553 | |||||||
554 | # This hash maps object file names onto an integer value representing | ||||||
555 | # whether this object has been built via ordinary compilation or | ||||||
556 | # libtool compilation (the COMPILE_* constants). | ||||||
557 | 1 | 1 | my %object_compilation_map; | ||||
558 | |||||||
559 | |||||||
560 | # This keeps track of the directories for which we've already | ||||||
561 | # created dirstamp code. Keys are directories, values are stamp files. | ||||||
562 | # Several keys can share the same stamp files if they are equivalent | ||||||
563 | # (as are `.//foo' and `foo'). | ||||||
564 | 1 | 1 | my %directory_map; | ||||
565 | |||||||
566 | # All .P files. | ||||||
567 | 1 | 1 | my %dep_files; | ||||
568 | |||||||
569 | # This is a list of all targets to run during "make dist". | ||||||
570 | 1 | 1 | my @dist_targets; | ||||
571 | |||||||
572 | # Keep track of all programs declared in this Makefile, without | ||||||
573 | # $(EXEEXT). @substitutions@ are not listed. | ||||||
574 | 1 | 1 | my %known_programs; | ||||
575 | 1 | 1 | my %known_libraries; | ||||
576 | |||||||
577 | # Keys in this hash are the basenames of files which must depend on | ||||||
578 | # ansi2knr. Values are either the empty string, or the directory in | ||||||
579 | # which the ANSI source file appears; the directory must have a | ||||||
580 | # trailing `/'. | ||||||
581 | 1 | 1 | my %de_ansi_files; | ||||
582 | |||||||
583 | # This keeps track of which extensions we've seen (that we care | ||||||
584 | # about). | ||||||
585 | 1 | 1 | my %extension_seen; | ||||
586 | |||||||
587 | # This is random scratch space for the language finish functions. | ||||||
588 | # Don't randomly overwrite it; examine other uses of keys first. | ||||||
589 | 1 | 2 | my %language_scratch; | ||||
590 | |||||||
591 | # We keep track of which objects need special (per-executable) | ||||||
592 | # handling on a per-language basis. | ||||||
593 | 1 | 1 | my %lang_specific_files; | ||||
594 | |||||||
595 | # This is set when `handle_dist' has finished. Once this happens, | ||||||
596 | # we should no longer push on dist_common. | ||||||
597 | 1 | 2 | my $handle_dist_run; | ||||
598 | |||||||
599 | # Used to store a set of linkers needed to generate the sources currently | ||||||
600 | # under consideration. | ||||||
601 | 1 | 1 | my %linkers_used; | ||||
602 | |||||||
603 | # True if we need `LINK' defined. This is a hack. | ||||||
604 | 1 | 1 | my $need_link; | ||||
605 | |||||||
606 | # Was get_object_extension run? | ||||||
607 | # FIXME: This is a hack. a better switch should be found. | ||||||
608 | 1 | 1 | my $get_object_extension_was_run; | ||||
609 | |||||||
610 | # Record each file processed by make_paragraphs. | ||||||
611 | 1 | 3 | my %transformed_files; | ||||
612 | |||||||
613 | |||||||
614 | ################################################################ | ||||||
615 | |||||||
616 | ## ---------------------------------------------- ## | ||||||
617 | ## Variables not reset by &initialize_per_input. ## | ||||||
618 | ## ---------------------------------------------- ## | ||||||
619 | |||||||
620 | # Cache each file processed by make_paragraphs. | ||||||
621 | # (This is different from %transformed_files because | ||||||
622 | # %transformed_files is reset for each file while %am_file_cache | ||||||
623 | # it global to the run.) | ||||||
624 | 1 | 1 | my %am_file_cache; | ||||
625 | |||||||
626 | ################################################################ | ||||||
627 | |||||||
628 | # var_SUFFIXES_trigger ($TYPE, $VALUE) | ||||||
629 | # ------------------------------------ | ||||||
630 | # This is called by Automake::Variable::define() when SUFFIXES | ||||||
631 | # is defined ($TYPE eq '') or appended ($TYPE eq '+'). | ||||||
632 | # The work here needs to be performed as a side-effect of the | ||||||
633 | # macro_define() call because SUFFIXES definitions impact | ||||||
634 | # on $KNOWN_EXTENSIONS_PATTERN which is used used when parsing | ||||||
635 | # the input am file. | ||||||
636 | sub var_SUFFIXES_trigger ($$) | ||||||
637 | { | ||||||
638 | 0 | 0 | my ($type, $value) = @_; | ||||
639 | 0 | 0 | accept_extensions (split (' ', $value)); | ||||
640 | } | ||||||
641 | 1 | 6 | Automake::Variable::hook ('SUFFIXES', \&var_SUFFIXES_trigger); | ||||
642 | |||||||
643 | ################################################################ | ||||||
644 | |||||||
645 | ## --------------------------------- ## | ||||||
646 | ## Forward subroutine declarations. ## | ||||||
647 | ## --------------------------------- ## | ||||||
648 | sub register_language (%); | ||||||
649 | sub file_contents_internal ($$$%); | ||||||
650 | sub define_files_variable ($\@$$); | ||||||
651 | |||||||
652 | |||||||
653 | # &initialize_per_input () | ||||||
654 | # ------------------------ | ||||||
655 | # (Re)-Initialize per-Makefile.am variables. | ||||||
656 | sub initialize_per_input () | ||||||
657 | { | ||||||
658 | 0 | 0 | reset_local_duplicates (); | ||||
659 | |||||||
660 | 0 | 0 | $am_file_name = undef; | ||||
661 | 0 | 0 | $am_relative_dir = undef; | ||||
662 | |||||||
663 | 0 | 0 | $in_file_name = undef; | ||||
664 | 0 | 0 | $relative_dir = undef; | ||||
665 | 0 | 0 | $topsrcdir = undef; | ||||
666 | |||||||
667 | 0 | 0 | $output_deps_greatest_timestamp = 0; | ||||
668 | |||||||
669 | 0 | 0 | $output_vars = ''; | ||||
670 | 0 | 0 | $output_all = ''; | ||||
671 | 0 | 0 | $output_header = ''; | ||||
672 | 0 | 0 | $output_rules = ''; | ||||
673 | 0 | 0 | $output_trailer = ''; | ||||
674 | |||||||
675 | 0 | 0 | Automake::Options::reset; | ||||
676 | 0 | 0 | Automake::Variable::reset; | ||||
677 | 0 | 0 | Automake::Rule::reset; | ||||
678 | |||||||
679 | 0 | 0 | @cond_stack = (); | ||||
680 | |||||||
681 | 0 | 0 | @include_stack = (); | ||||
682 | |||||||
683 | 0 | 0 | @all = (); | ||||
684 | 0 | 0 | @check = (); | ||||
685 | 0 | 0 | @check_tests = (); | ||||
686 | |||||||
687 | 0 | 0 | %clean_files = (); | ||||
688 | 0 | 0 | %compile_clean_files = (); | ||||
689 | |||||||
690 | # We always include `.'. This isn't strictly correct. | ||||||
691 | 0 | 0 | %libtool_clean_directories = ('.' => 1); | ||||
692 | |||||||
693 | 0 | 0 | @sources = (); | ||||
694 | 0 | 0 | @dist_sources = (); | ||||
695 | |||||||
696 | 0 | 0 | %object_map = (); | ||||
697 | 0 | 0 | %object_compilation_map = (); | ||||
698 | |||||||
699 | 0 | 0 | %directory_map = (); | ||||
700 | |||||||
701 | 0 | 0 | %dep_files = (); | ||||
702 | |||||||
703 | 0 | 0 | @dist_targets = (); | ||||
704 | |||||||
705 | 0 | 0 | %known_programs = (); | ||||
706 | 0 | 0 | %known_libraries= (); | ||||
707 | |||||||
708 | 0 | 0 | %de_ansi_files = (); | ||||
709 | |||||||
710 | 0 | 0 | %extension_seen = (); | ||||
711 | |||||||
712 | 0 | 0 | %language_scratch = (); | ||||
713 | |||||||
714 | 0 | 0 | %lang_specific_files = (); | ||||
715 | |||||||
716 | 0 | 0 | $handle_dist_run = 0; | ||||
717 | |||||||
718 | 0 | 0 | $need_link = 0; | ||||
719 | |||||||
720 | 0 | 0 | $get_object_extension_was_run = 0; | ||||
721 | |||||||
722 | 0 | 0 | %transformed_files = (); | ||||
723 | } | ||||||
724 | |||||||
725 | |||||||
726 | ################################################################ | ||||||
727 | |||||||
728 | # Initialize our list of languages that are internally supported. | ||||||
729 | |||||||
730 | # C. | ||||||
731 | 1 | 10 | register_language ('name' => 'c', | ||||
732 | 'Name' => 'C', | ||||||
733 | 'config_vars' => ['CC'], | ||||||
734 | 'ansi' => 1, | ||||||
735 | 'autodep' => '', | ||||||
736 | 'flags' => ['CFLAGS', 'CPPFLAGS'], | ||||||
737 | 'ccer' => 'CC', | ||||||
738 | 'compiler' => 'COMPILE', | ||||||
739 | 'compile' => '$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)', | ||||||
740 | 'lder' => 'CCLD', | ||||||
741 | 'ld' => '$(CC)', | ||||||
742 | 'linker' => 'LINK', | ||||||
743 | 'link' => '$(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
744 | 'compile_flag' => '-c', | ||||||
745 | 'libtool_tag' => 'CC', | ||||||
746 | 'extensions' => ['.c'], | ||||||
747 | '_finish' => \&lang_c_finish); | ||||||
748 | |||||||
749 | # C++. | ||||||
750 | 1 | 8 | register_language ('name' => 'cxx', | ||||
751 | 'Name' => 'C++', | ||||||
752 | 'config_vars' => ['CXX'], | ||||||
753 | 'linker' => 'CXXLINK', | ||||||
754 | 'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
755 | 'autodep' => 'CXX', | ||||||
756 | 'flags' => ['CXXFLAGS', 'CPPFLAGS'], | ||||||
757 | 'compile' => '$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)', | ||||||
758 | 'ccer' => 'CXX', | ||||||
759 | 'compiler' => 'CXXCOMPILE', | ||||||
760 | 'compile_flag' => '-c', | ||||||
761 | 'output_flag' => '-o', | ||||||
762 | 'libtool_tag' => 'CXX', | ||||||
763 | 'lder' => 'CXXLD', | ||||||
764 | 'ld' => '$(CXX)', | ||||||
765 | 'pure' => 1, | ||||||
766 | 'extensions' => ['.c++', '.cc', '.cpp', '.cxx', '.C']); | ||||||
767 | |||||||
768 | # Objective C. | ||||||
769 | 1 | 7 | register_language ('name' => 'objc', | ||||
770 | 'Name' => 'Objective C', | ||||||
771 | 'config_vars' => ['OBJC'], | ||||||
772 | 'linker' => 'OBJCLINK', | ||||||
773 | 'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
774 | 'autodep' => 'OBJC', | ||||||
775 | 'flags' => ['OBJCFLAGS', 'CPPFLAGS'], | ||||||
776 | 'compile' => '$(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_OBJCFLAGS) $(OBJCFLAGS)', | ||||||
777 | 'ccer' => 'OBJC', | ||||||
778 | 'compiler' => 'OBJCCOMPILE', | ||||||
779 | 'compile_flag' => '-c', | ||||||
780 | 'output_flag' => '-o', | ||||||
781 | 'lder' => 'OBJCLD', | ||||||
782 | 'ld' => '$(OBJC)', | ||||||
783 | 'pure' => 1, | ||||||
784 | 'extensions' => ['.m']); | ||||||
785 | |||||||
786 | # Unified Parallel C. | ||||||
787 | 1 | 7 | register_language ('name' => 'upc', | ||||
788 | 'Name' => 'Unified Parallel C', | ||||||
789 | 'config_vars' => ['UPC'], | ||||||
790 | 'linker' => 'UPCLINK', | ||||||
791 | 'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
792 | 'autodep' => 'UPC', | ||||||
793 | 'flags' => ['UPCFLAGS', 'CPPFLAGS'], | ||||||
794 | 'compile' => '$(UPC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_UPCFLAGS) $(UPCFLAGS)', | ||||||
795 | 'ccer' => 'UPC', | ||||||
796 | 'compiler' => 'UPCCOMPILE', | ||||||
797 | 'compile_flag' => '-c', | ||||||
798 | 'output_flag' => '-o', | ||||||
799 | 'lder' => 'UPCLD', | ||||||
800 | 'ld' => '$(UPC)', | ||||||
801 | 'pure' => 1, | ||||||
802 | 'extensions' => ['.upc']); | ||||||
803 | |||||||
804 | # Headers. | ||||||
805 | register_language ('name' => 'header', | ||||||
806 | 'Name' => 'Header', | ||||||
807 | 'extensions' => ['.h', '.H', '.hxx', '.h++', '.hh', | ||||||
808 | '.hpp', '.inc'], | ||||||
809 | # No output. | ||||||
810 | 7 | 18 | 'output_extensions' => sub { return () }, | ||||
811 | # Nothing to do. | ||||||
812 | 1 0 | 8 0 | '_finish' => sub { }); | ||||
813 | |||||||
814 | # Vala | ||||||
815 | register_language ('name' => 'vala', | ||||||
816 | 'Name' => 'Vala', | ||||||
817 | 'config_vars' => ['VALAC'], | ||||||
818 | 'flags' => [], | ||||||
819 | 'compile' => '$(VALAC) $(AM_VALAFLAGS) $(VALAFLAGS)', | ||||||
820 | 'ccer' => 'VALAC', | ||||||
821 | 'compiler' => 'VALACOMPILE', | ||||||
822 | 'extensions' => ['.vala'], | ||||||
823 | 1 | 8 | 'output_extensions' => sub { (my $ext = $_[0]) =~ s/vala$/c/; | ||||
824 | 1 | 2 | return ($ext,) }, | ||||
825 | 1 | 10 | 'rule_file' => 'vala', | ||||
826 | '_finish' => \&lang_vala_finish, | ||||||
827 | '_target_hook' => \&lang_vala_target_hook, | ||||||
828 | 'nodist_specific' => 1); | ||||||
829 | |||||||
830 | # Yacc (C & C++). | ||||||
831 | register_language ('name' => 'yacc', | ||||||
832 | 'Name' => 'Yacc', | ||||||
833 | 'config_vars' => ['YACC'], | ||||||
834 | 'flags' => ['YFLAGS'], | ||||||
835 | 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', | ||||||
836 | 'ccer' => 'YACC', | ||||||
837 | 'compiler' => 'YACCCOMPILE', | ||||||
838 | 'extensions' => ['.y'], | ||||||
839 | 1 | 6 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; | ||||
840 | 1 | 2 | return ($ext,) }, | ||||
841 | 1 | 13 | 'rule_file' => 'yacc', | ||||
842 | '_finish' => \&lang_yacc_finish, | ||||||
843 | '_target_hook' => \&lang_yacc_target_hook, | ||||||
844 | 'nodist_specific' => 1); | ||||||
845 | register_language ('name' => 'yaccxx', | ||||||
846 | 'Name' => 'Yacc (C++)', | ||||||
847 | 'config_vars' => ['YACC'], | ||||||
848 | 'rule_file' => 'yacc', | ||||||
849 | 'flags' => ['YFLAGS'], | ||||||
850 | 'ccer' => 'YACC', | ||||||
851 | 'compiler' => 'YACCCOMPILE', | ||||||
852 | 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', | ||||||
853 | 'extensions' => ['.y++', '.yy', '.yxx', '.ypp'], | ||||||
854 | 4 | 6 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/y/c/; | ||||
855 | 4 | 8 | return ($ext,) }, | ||||
856 | 1 | 10 | '_finish' => \&lang_yacc_finish, | ||||
857 | '_target_hook' => \&lang_yacc_target_hook, | ||||||
858 | 'nodist_specific' => 1); | ||||||
859 | |||||||
860 | # Lex (C & C++). | ||||||
861 | register_language ('name' => 'lex', | ||||||
862 | 'Name' => 'Lex', | ||||||
863 | 'config_vars' => ['LEX'], | ||||||
864 | 'rule_file' => 'lex', | ||||||
865 | 'flags' => ['LFLAGS'], | ||||||
866 | 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', | ||||||
867 | 'ccer' => 'LEX', | ||||||
868 | 'compiler' => 'LEXCOMPILE', | ||||||
869 | 'extensions' => ['.l'], | ||||||
870 | 1 | 2 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; | ||||
871 | 1 | 2 | return ($ext,) }, | ||||
872 | 1 | 14 | '_finish' => \&lang_lex_finish, | ||||
873 | '_target_hook' => \&lang_lex_target_hook, | ||||||
874 | 'nodist_specific' => 1); | ||||||
875 | register_language ('name' => 'lexxx', | ||||||
876 | 'Name' => 'Lex (C++)', | ||||||
877 | 'config_vars' => ['LEX'], | ||||||
878 | 'rule_file' => 'lex', | ||||||
879 | 'flags' => ['LFLAGS'], | ||||||
880 | 'compile' => '$(LEX) $(LFLAGS) $(AM_LFLAGS)', | ||||||
881 | 'ccer' => 'LEX', | ||||||
882 | 'compiler' => 'LEXCOMPILE', | ||||||
883 | 'extensions' => ['.l++', '.ll', '.lxx', '.lpp'], | ||||||
884 | 4 | 8 | 'output_extensions' => sub { (my $ext = $_[0]) =~ tr/l/c/; | ||||
885 | 4 | 8 | return ($ext,) }, | ||||
886 | 1 | 10 | '_finish' => \&lang_lex_finish, | ||||
887 | '_target_hook' => \&lang_lex_target_hook, | ||||||
888 | 'nodist_specific' => 1); | ||||||
889 | |||||||
890 | # Assembler. | ||||||
891 | 1 | 7 | register_language ('name' => 'asm', | ||||
892 | 'Name' => 'Assembler', | ||||||
893 | 'config_vars' => ['CCAS', 'CCASFLAGS'], | ||||||
894 | |||||||
895 | 'flags' => ['CCASFLAGS'], | ||||||
896 | # Users can set AM_CCASFLAGS to include DEFS, INCLUDES, | ||||||
897 | # or anything else required. They can also set CCAS. | ||||||
898 | # Or simply use Preprocessed Assembler. | ||||||
899 | 'compile' => '$(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)', | ||||||
900 | 'ccer' => 'CCAS', | ||||||
901 | 'compiler' => 'CCASCOMPILE', | ||||||
902 | 'compile_flag' => '-c', | ||||||
903 | 'output_flag' => '-o', | ||||||
904 | 'extensions' => ['.s'], | ||||||
905 | |||||||
906 | # With assembly we still use the C linker. | ||||||
907 | '_finish' => \&lang_c_finish); | ||||||
908 | |||||||
909 | # Preprocessed Assembler. | ||||||
910 | 1 | 8 | register_language ('name' => 'cppasm', | ||||
911 | 'Name' => 'Preprocessed Assembler', | ||||||
912 | 'config_vars' => ['CCAS', 'CCASFLAGS'], | ||||||
913 | |||||||
914 | 'autodep' => 'CCAS', | ||||||
915 | 'flags' => ['CCASFLAGS', 'CPPFLAGS'], | ||||||
916 | 'compile' => '$(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)', | ||||||
917 | 'ccer' => 'CPPAS', | ||||||
918 | 'compiler' => 'CPPASCOMPILE', | ||||||
919 | 'compile_flag' => '-c', | ||||||
920 | 'output_flag' => '-o', | ||||||
921 | 'extensions' => ['.S', '.sx'], | ||||||
922 | |||||||
923 | # With assembly we still use the C linker. | ||||||
924 | '_finish' => \&lang_c_finish); | ||||||
925 | |||||||
926 | # Fortran 77 | ||||||
927 | 1 | 8 | register_language ('name' => 'f77', | ||||
928 | 'Name' => 'Fortran 77', | ||||||
929 | 'config_vars' => ['F77'], | ||||||
930 | 'linker' => 'F77LINK', | ||||||
931 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
932 | 'flags' => ['FFLAGS'], | ||||||
933 | 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS)', | ||||||
934 | 'ccer' => 'F77', | ||||||
935 | 'compiler' => 'F77COMPILE', | ||||||
936 | 'compile_flag' => '-c', | ||||||
937 | 'output_flag' => '-o', | ||||||
938 | 'libtool_tag' => 'F77', | ||||||
939 | 'lder' => 'F77LD', | ||||||
940 | 'ld' => '$(F77)', | ||||||
941 | 'pure' => 1, | ||||||
942 | 'extensions' => ['.f', '.for']); | ||||||
943 | |||||||
944 | # Fortran | ||||||
945 | 1 | 8 | register_language ('name' => 'fc', | ||||
946 | 'Name' => 'Fortran', | ||||||
947 | 'config_vars' => ['FC'], | ||||||
948 | 'linker' => 'FCLINK', | ||||||
949 | 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
950 | 'flags' => ['FCFLAGS'], | ||||||
951 | 'compile' => '$(FC) $(AM_FCFLAGS) $(FCFLAGS)', | ||||||
952 | 'ccer' => 'FC', | ||||||
953 | 'compiler' => 'FCCOMPILE', | ||||||
954 | 'compile_flag' => '-c', | ||||||
955 | 'output_flag' => '-o', | ||||||
956 | 'libtool_tag' => 'FC', | ||||||
957 | 'lder' => 'FCLD', | ||||||
958 | 'ld' => '$(FC)', | ||||||
959 | 'pure' => 1, | ||||||
960 | 'extensions' => ['.f90', '.f95', '.f03', '.f08']); | ||||||
961 | |||||||
962 | # Preprocessed Fortran | ||||||
963 | 1 | 7 | register_language ('name' => 'ppfc', | ||||
964 | 'Name' => 'Preprocessed Fortran', | ||||||
965 | 'config_vars' => ['FC'], | ||||||
966 | 'linker' => 'FCLINK', | ||||||
967 | 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
968 | 'lder' => 'FCLD', | ||||||
969 | 'ld' => '$(FC)', | ||||||
970 | 'flags' => ['FCFLAGS', 'CPPFLAGS'], | ||||||
971 | 'ccer' => 'PPFC', | ||||||
972 | 'compiler' => 'PPFCCOMPILE', | ||||||
973 | 'compile' => '$(FC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)', | ||||||
974 | 'compile_flag' => '-c', | ||||||
975 | 'output_flag' => '-o', | ||||||
976 | 'libtool_tag' => 'FC', | ||||||
977 | 'pure' => 1, | ||||||
978 | 'extensions' => ['.F90','.F95', '.F03', '.F08']); | ||||||
979 | |||||||
980 | # Preprocessed Fortran 77 | ||||||
981 | # | ||||||
982 | # The current support for preprocessing Fortran 77 just involves | ||||||
983 | # passing `$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) | ||||||
984 | # $(CPPFLAGS)' as additional flags to the Fortran 77 compiler, since | ||||||
985 | # this is how GNU Make does it; see the `GNU Make Manual, Edition 0.51 | ||||||
986 | # for `make' Version 3.76 Beta' (specifically, from info file | ||||||
987 | # `(make)Catalogue of Rules'). | ||||||
988 | # | ||||||
989 | # A better approach would be to write an Autoconf test | ||||||
990 | # (i.e. AC_PROG_FPP) for a Fortran 77 preprocessor, because not all | ||||||
991 | # Fortran 77 compilers know how to do preprocessing. The Autoconf | ||||||
992 | # macro AC_PROG_FPP should test the Fortran 77 compiler first for | ||||||
993 | # preprocessing capabilities, and then fall back on cpp (if cpp were | ||||||
994 | # available). | ||||||
995 | 1 | 8 | register_language ('name' => 'ppf77', | ||||
996 | 'Name' => 'Preprocessed Fortran 77', | ||||||
997 | 'config_vars' => ['F77'], | ||||||
998 | 'linker' => 'F77LINK', | ||||||
999 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
1000 | 'lder' => 'F77LD', | ||||||
1001 | 'ld' => '$(F77)', | ||||||
1002 | 'flags' => ['FFLAGS', 'CPPFLAGS'], | ||||||
1003 | 'ccer' => 'PPF77', | ||||||
1004 | 'compiler' => 'PPF77COMPILE', | ||||||
1005 | 'compile' => '$(F77) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)', | ||||||
1006 | 'compile_flag' => '-c', | ||||||
1007 | 'output_flag' => '-o', | ||||||
1008 | 'libtool_tag' => 'F77', | ||||||
1009 | 'pure' => 1, | ||||||
1010 | 'extensions' => ['.F']); | ||||||
1011 | |||||||
1012 | # Ratfor. | ||||||
1013 | 1 | 7 | register_language ('name' => 'ratfor', | ||||
1014 | 'Name' => 'Ratfor', | ||||||
1015 | 'config_vars' => ['F77'], | ||||||
1016 | 'linker' => 'F77LINK', | ||||||
1017 | 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
1018 | 'lder' => 'F77LD', | ||||||
1019 | 'ld' => '$(F77)', | ||||||
1020 | 'flags' => ['RFLAGS', 'FFLAGS'], | ||||||
1021 | # FIXME also FFLAGS. | ||||||
1022 | 'compile' => '$(F77) $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)', | ||||||
1023 | 'ccer' => 'F77', | ||||||
1024 | 'compiler' => 'RCOMPILE', | ||||||
1025 | 'compile_flag' => '-c', | ||||||
1026 | 'output_flag' => '-o', | ||||||
1027 | 'libtool_tag' => 'F77', | ||||||
1028 | 'pure' => 1, | ||||||
1029 | 'extensions' => ['.r']); | ||||||
1030 | |||||||
1031 | # Java via gcj. | ||||||
1032 | 1 | 8 | register_language ('name' => 'java', | ||||
1033 | 'Name' => 'Java', | ||||||
1034 | 'config_vars' => ['GCJ'], | ||||||
1035 | 'linker' => 'GCJLINK', | ||||||
1036 | 'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', | ||||||
1037 | 'autodep' => 'GCJ', | ||||||
1038 | 'flags' => ['GCJFLAGS'], | ||||||
1039 | 'compile' => '$(GCJ) $(AM_GCJFLAGS) $(GCJFLAGS)', | ||||||
1040 | 'ccer' => 'GCJ', | ||||||
1041 | 'compiler' => 'GCJCOMPILE', | ||||||
1042 | 'compile_flag' => '-c', | ||||||
1043 | 'output_flag' => '-o', | ||||||
1044 | 'libtool_tag' => 'GCJ', | ||||||
1045 | 'lder' => 'GCJLD', | ||||||
1046 | 'ld' => '$(GCJ)', | ||||||
1047 | 'pure' => 1, | ||||||
1048 | 'extensions' => ['.java', '.class', '.zip', '.jar']); | ||||||
1049 | |||||||
1050 | ################################################################ | ||||||
1051 | |||||||
1052 | # Error reporting functions. | ||||||
1053 | |||||||
1054 | # err_am ($MESSAGE, [%OPTIONS]) | ||||||
1055 | # ----------------------------- | ||||||
1056 | # Uncategorized errors about the current Makefile.am. | ||||||
1057 | sub err_am ($;%) | ||||||
1058 | { | ||||||
1059 | 0 | 0 | msg_am ('error', @_); | ||||
1060 | } | ||||||
1061 | |||||||
1062 | # err_ac ($MESSAGE, [%OPTIONS]) | ||||||
1063 | # ----------------------------- | ||||||
1064 | # Uncategorized errors about configure.ac. | ||||||
1065 | sub err_ac ($;%) | ||||||
1066 | { | ||||||
1067 | 0 | 0 | msg_ac ('error', @_); | ||||
1068 | } | ||||||
1069 | |||||||
1070 | # msg_am ($CHANNEL, $MESSAGE, [%OPTIONS]) | ||||||
1071 | # --------------------------------------- | ||||||
1072 | # Messages about about the current Makefile.am. | ||||||
1073 | sub msg_am ($$;%) | ||||||
1074 | { | ||||||
1075 | 0 | 0 | my ($channel, $msg, %opts) = @_; | ||||
1076 | 0 | 0 | msg $channel, "${am_file}.am", $msg, %opts; | ||||
1077 | } | ||||||
1078 | |||||||
1079 | # msg_ac ($CHANNEL, $MESSAGE, [%OPTIONS]) | ||||||
1080 | # --------------------------------------- | ||||||
1081 | # Messages about about configure.ac. | ||||||
1082 | sub msg_ac ($$;%) | ||||||
1083 | { | ||||||
1084 | 0 | 0 | my ($channel, $msg, %opts) = @_; | ||||
1085 | 0 | 0 | msg $channel, $configure_ac, $msg, %opts; | ||||
1086 | } | ||||||
1087 | |||||||
1088 | ################################################################ | ||||||
1089 | |||||||
1090 | # subst ($TEXT) | ||||||
1091 | # ------------- | ||||||
1092 | # Return a configure-style substitution using the indicated text. | ||||||
1093 | # We do this to avoid having the substitutions directly in automake.in; | ||||||
1094 | # when we do that they are sometimes removed and this causes confusion | ||||||
1095 | # and bugs. | ||||||
1096 | sub subst ($) | ||||||
1097 | { | ||||||
1098 | 0 | 0 | my ($text) = @_; | ||||
1099 | 0 | 0 | return '@' . $text . '@'; | ||||
1100 | } | ||||||
1101 | |||||||
1102 | ################################################################ | ||||||
1103 | |||||||
1104 | |||||||
1105 | # $BACKPATH | ||||||
1106 | # &backname ($REL-DIR) | ||||||
1107 | # -------------------- | ||||||
1108 | # If I `cd $REL-DIR', then to come back, I should `cd $BACKPATH'. | ||||||
1109 | # For instance `src/foo' => `../..'. | ||||||
1110 | # Works with non strictly increasing paths, i.e., `src/../lib' => `..'. | ||||||
1111 | sub backname ($) | ||||||
1112 | { | ||||||
1113 | 0 | 0 | my ($file) = @_; | ||||
1114 | 0 | 0 | my @res; | ||||
1115 | 0 | 0 | foreach (split (/\//, $file)) | ||||
1116 | { | ||||||
1117 | 0 | 0 | next if $_ eq '.' || $_ eq ''; | ||||
1118 | 0 | 0 | if ($_ eq '..') | ||||
1119 | { | ||||||
1120 | pop @res | ||||||
1121 | 0 | 0 | or prog_error ("trying to reverse path `$file' pointing outside tree"); | ||||
1122 | } | ||||||
1123 | else | ||||||
1124 | { | ||||||
1125 | 0 | 0 | push (@res, '..'); | ||||
1126 | } | ||||||
1127 | } | ||||||
1128 | 0 | 0 | return join ('/', @res) || '.'; | ||||
1129 | } | ||||||
1130 | |||||||
1131 | ################################################################ | ||||||
1132 | |||||||
1133 | # `silent-rules' mode handling functions. | ||||||
1134 | |||||||
1135 | # verbose_var (NAME) | ||||||
1136 | # ------------------ | ||||||
1137 | # The public variable stem used to implement `silent-rules'. | ||||||
1138 | sub verbose_var ($) | ||||||
1139 | { | ||||||
1140 | 0 | 0 | my ($name) = @_; | ||||
1141 | 0 | 0 | return 'AM_V_' . $name; | ||||
1142 | } | ||||||
1143 | |||||||
1144 | # verbose_private_var (NAME) | ||||||
1145 | # -------------------------- | ||||||
1146 | # The naming policy for the private variables for `silent-rules'. | ||||||
1147 | sub verbose_private_var ($) | ||||||
1148 | { | ||||||
1149 | 0 | 0 | my ($name) = @_; | ||||
1150 | 0 | 0 | return 'am__v_' . $name; | ||||
1151 | } | ||||||
1152 | |||||||
1153 | # define_verbose_var (NAME, VAL) | ||||||
1154 | # ------------------------------ | ||||||
1155 | # For `silent-rules' mode, setup VAR and dispatcher, to expand to VAL if silent. | ||||||
1156 | sub define_verbose_var ($$) | ||||||
1157 | { | ||||||
1158 | 0 | 0 | my ($name, $val) = @_; | ||||
1159 | 0 | 0 | my $var = verbose_var ($name); | ||||
1160 | 0 | 0 | my $pvar = verbose_private_var ($name); | ||||
1161 | 0 | 0 | my $silent_var = $pvar . '_0'; | ||||
1162 | 0 | 0 | if (option 'silent-rules') | ||||
1163 | { | ||||||
1164 | # Using `$V' instead of `$(V)' breaks IRIX make. | ||||||
1165 | 0 | 0 | define_variable ($var, '$(' . $pvar . '_$(V))', INTERNAL); | ||||
1166 | 0 | 0 | define_variable ($pvar . '_', '$(' . $pvar . '_$(AM_DEFAULT_VERBOSITY))', INTERNAL); | ||||
1167 | 0 | 0 | Automake::Variable::define ($silent_var, VAR_AUTOMAKE, '', TRUE, $val, | ||||
1168 | '', INTERNAL, VAR_ASIS) | ||||||
1169 | if (! vardef ($silent_var, TRUE)); | ||||||
1170 | } | ||||||
1171 | } | ||||||
1172 | |||||||
1173 | # Above should not be needed in the general automake code. | ||||||
1174 | |||||||
1175 | # verbose_flag (NAME) | ||||||
1176 | # ------------------- | ||||||
1177 | # Contents of %VERBOSE%: variable to expand before rule command. | ||||||
1178 | sub verbose_flag ($) | ||||||
1179 | { | ||||||
1180 | 0 | 0 | my ($name) = @_; | ||||
1181 | 0 | 0 | return '$(' . verbose_var ($name) . ')' | ||||
1182 | if (option 'silent-rules'); | ||||||
1183 | 0 | 0 | return ''; | ||||
1184 | } | ||||||
1185 | |||||||
1186 | # silent_flag | ||||||
1187 | # ----------- | ||||||
1188 | # Contents of %SILENT%: variable to expand to `@' when silent. | ||||||
1189 | sub silent_flag () | ||||||
1190 | { | ||||||
1191 | 0 | 0 | return verbose_flag ('at'); | ||||
1192 | } | ||||||
1193 | |||||||
1194 | # define_verbose_tagvar (NAME) | ||||||
1195 | # ---------------------------- | ||||||
1196 | # Engage the needed `silent-rules' machinery for tag NAME. | ||||||
1197 | sub define_verbose_tagvar ($) | ||||||
1198 | { | ||||||
1199 | 0 | 0 | my ($name) = @_; | ||||
1200 | 0 | 0 | if (option 'silent-rules') | ||||
1201 | { | ||||||
1202 | 0 | 0 | define_verbose_var ($name, '@echo " '. $name . ' ' x (6 - length ($name)) . '" $@;'); | ||||
1203 | 0 | 0 | define_verbose_var ('at', '@'); | ||||
1204 | } | ||||||
1205 | } | ||||||
1206 | |||||||
1207 | # define_verbose_libtool | ||||||
1208 | # ---------------------- | ||||||
1209 | # Engage the needed `silent-rules' machinery for `libtool --silent'. | ||||||
1210 | sub define_verbose_libtool () | ||||||
1211 | { | ||||||
1212 | 0 | 0 | define_verbose_var ('lt', '--silent'); | ||||
1213 | 0 | 0 | return verbose_flag ('lt'); | ||||
1214 | } | ||||||
1215 | |||||||
1216 | |||||||
1217 | ################################################################ | ||||||
1218 | |||||||
1219 | |||||||
1220 | # Handle AUTOMAKE_OPTIONS variable. Return 1 on error, 0 otherwise. | ||||||
1221 | sub handle_options | ||||||
1222 | { | ||||||
1223 | 0 | 0 | my $var = var ('AUTOMAKE_OPTIONS'); | ||||
1224 | 0 | 0 | if ($var) | ||||
1225 | { | ||||||
1226 | 0 | 0 | if ($var->has_conditional_contents) | ||||
1227 | { | ||||||
1228 | 0 | 0 | msg_var ('unsupported', $var, | ||||
1229 | "`AUTOMAKE_OPTIONS' cannot have conditional contents"); | ||||||
1230 | } | ||||||
1231 | 0 | 0 | foreach my $locvals ($var->value_as_list_recursive (cond_filter => TRUE, | ||||
1232 | location => 1)) | ||||||
1233 | { | ||||||
1234 | 0 | 0 | my ($loc, $value) = @$locvals; | ||||
1235 | 0 | 0 | return 1 if (process_option_list ($loc, $value)) | ||||
1236 | } | ||||||
1237 | } | ||||||
1238 | |||||||
1239 | # Override portability-recursive warning. | ||||||
1240 | 0 | 0 | switch_warning ('no-portability-recursive') | ||||
1241 | if option 'silent-rules'; | ||||||
1242 | |||||||
1243 | 0 | 0 | if ($strictness == GNITS) | ||||
1244 | { | ||||||
1245 | 0 | 0 | set_option ('readme-alpha', INTERNAL); | ||||
1246 | 0 | 0 | set_option ('std-options', INTERNAL); | ||||
1247 | 0 | 0 | set_option ('check-news', INTERNAL); | ||||
1248 | } | ||||||
1249 | |||||||
1250 | 0 | 0 | return 0; | ||||
1251 | } | ||||||
1252 | |||||||
1253 | # shadow_unconditionally ($varname, $where) | ||||||
1254 | # ----------------------------------------- | ||||||
1255 | # Return a $(variable) that contains all possible values | ||||||
1256 | # $varname can take. | ||||||
1257 | # If the VAR wasn't defined conditionally, return $(VAR). | ||||||
1258 | # Otherwise we create an am__VAR_DIST variable which contains | ||||||
1259 | # all possible values, and return $(am__VAR_DIST). | ||||||
1260 | sub shadow_unconditionally ($$) | ||||||
1261 | { | ||||||
1262 | 0 | 0 | my ($varname, $where) = @_; | ||||
1263 | 0 | 0 | my $var = var $varname; | ||||
1264 | 0 | 0 | if ($var->has_conditional_contents) | ||||
1265 | { | ||||||
1266 | 0 | 0 | $varname = "am__${varname}_DIST"; | ||||
1267 | 0 | 0 | my @files = uniq ($var->value_as_list_recursive); | ||||
1268 | 0 | 0 | define_pretty_variable ($varname, TRUE, $where, @files); | ||||
1269 | } | ||||||
1270 | 0 | 0 | return "\$($varname)" | ||||
1271 | } | ||||||
1272 | |||||||
1273 | # get_object_extension ($EXTENSION) | ||||||
1274 | # --------------------------------- | ||||||
1275 | # Prefix $EXTENSION with $U if ansi2knr is in use. | ||||||
1276 | sub get_object_extension ($) | ||||||
1277 | { | ||||||
1278 | 0 | 0 | my ($extension) = @_; | ||||
1279 | |||||||
1280 | # Check for automatic de-ANSI-fication. | ||||||
1281 | 0 | 0 | $extension = '$U' . $extension | ||||
1282 | if option 'ansi2knr'; | ||||||
1283 | |||||||
1284 | 0 | 0 | $get_object_extension_was_run = 1; | ||||
1285 | |||||||
1286 | 0 | 0 | return $extension; | ||||
1287 | } | ||||||
1288 | |||||||
1289 | # check_user_variables (@LIST) | ||||||
1290 | # ---------------------------- | ||||||
1291 | # Make sure each variable VAR in @LIST does not exist, suggest using AM_VAR | ||||||
1292 | # otherwise. | ||||||
1293 | sub check_user_variables (@) | ||||||
1294 | { | ||||||
1295 | 0 | 0 | my @dont_override = @_; | ||||
1296 | 0 | 0 | foreach my $flag (@dont_override) | ||||
1297 | { | ||||||
1298 | 0 | 0 | my $var = var $flag; | ||||
1299 | 0 | 0 | if ($var) | ||||
1300 | { | ||||||
1301 | 0 | 0 | for my $cond ($var->conditions->conds) | ||||
1302 | { | ||||||
1303 | 0 | 0 | if ($var->rdef ($cond)->owner == VAR_MAKEFILE) | ||||
1304 | { | ||||||
1305 | 0 | 0 | msg_cond_var ('gnu', $cond, $flag, | ||||
1306 | "`$flag' is a user variable, " | ||||||
1307 | . "you should not override it;\n" | ||||||
1308 | . "use `AM_$flag' instead."); | ||||||
1309 | } | ||||||
1310 | } | ||||||
1311 | } | ||||||
1312 | } | ||||||
1313 | } | ||||||
1314 | |||||||
1315 | # Call finish function for each language that was used. | ||||||
1316 | sub handle_languages | ||||||
1317 | { | ||||||
1318 | 0 | 0 | if (! option 'no-dependencies') | ||||
1319 | { | ||||||
1320 | # Include auto-dep code. Don't include it if DEP_FILES would | ||||||
1321 | # be empty. | ||||||
1322 | 0 | 0 | if (&saw_sources_p (0) && keys %dep_files) | ||||
1323 | { | ||||||
1324 | # Set location of depcomp. | ||||||
1325 | 0 | 0 | &define_variable ('depcomp', | ||||
1326 | "\$(SHELL) $am_config_aux_dir/depcomp", | ||||||
1327 | INTERNAL); | ||||||
1328 | 0 | 0 | &define_variable ('am__depfiles_maybe', 'depfiles', INTERNAL); | ||||
1329 | |||||||
1330 | 0 | 0 | require_conf_file ("$am_file.am", FOREIGN, 'depcomp'); | ||||
1331 | |||||||
1332 | 0 | 0 | my @deplist = sort keys %dep_files; | ||||
1333 | # Generate each `include' individually. Irix 6 make will | ||||||
1334 | # not properly include several files resulting from a | ||||||
1335 | # variable expansion; generating many separate includes | ||||||
1336 | # seems safest. | ||||||
1337 | 0 | 0 | $output_rules .= "\n"; | ||||
1338 | 0 | 0 | foreach my $iter (@deplist) | ||||
1339 | { | ||||||
1340 | 0 | 0 | $output_rules .= (subst ('AMDEP_TRUE') | ||||
1341 | . subst ('am__include') | ||||||
1342 | . ' ' | ||||||
1343 | . subst ('am__quote') | ||||||
1344 | . $iter | ||||||
1345 | . subst ('am__quote') | ||||||
1346 | . "\n"); | ||||||
1347 | } | ||||||
1348 | |||||||
1349 | # Compute the set of directories to remove in distclean-depend. | ||||||
1350 | 0 0 | 0 0 | my @depdirs = uniq (map { dirname ($_) } @deplist); | ||||
1351 | 0 | 0 | $output_rules .= &file_contents ('depend', | ||||
1352 | new Automake::Location, | ||||||
1353 | DEPDIRS => "@depdirs"); | ||||||
1354 | } | ||||||
1355 | } | ||||||
1356 | else | ||||||
1357 | { | ||||||
1358 | 0 | 0 | &define_variable ('depcomp', '', INTERNAL); | ||||
1359 | 0 | 0 | &define_variable ('am__depfiles_maybe', '', INTERNAL); | ||||
1360 | } | ||||||
1361 | |||||||
1362 | 0 | 0 | my %done; | ||||
1363 | |||||||
1364 | # Is the c linker needed? | ||||||
1365 | 0 | 0 | my $needs_c = 0; | ||||
1366 | 0 | 0 | foreach my $ext (sort keys %extension_seen) | ||||
1367 | { | ||||||
1368 | 0 | 0 | next unless $extension_map{$ext}; | ||||
1369 | |||||||
1370 | 0 | 0 | my $lang = $languages{$extension_map{$ext}}; | ||||
1371 | |||||||
1372 | 0 | 0 | my $rule_file = $lang->rule_file || 'depend2'; | ||||
1373 | |||||||
1374 | # Get information on $LANG. | ||||||
1375 | 0 | 0 | my $pfx = $lang->autodep; | ||||
1376 | 0 | 0 | my $fpfx = ($pfx eq '') ? 'CC' : $pfx; | ||||
1377 | |||||||
1378 | 0 | 0 | my ($AMDEP, $FASTDEP) = | ||||
1379 | (option 'no-dependencies' || $lang->autodep eq 'no') | ||||||
1380 | ? ('FALSE', 'FALSE') : ('AMDEP', "am__fastdep$fpfx"); | ||||||
1381 | |||||||
1382 | 0 | 0 | my $verbose = verbose_flag ($lang->ccer || 'GEN'); | ||||
1383 | 0 | 0 | my $silent = silent_flag (); | ||||
1384 | |||||||
1385 | 0 | 0 | my %transform = ('EXT' => $ext, | ||||
1386 | 'PFX' => $pfx, | ||||||
1387 | 'FPFX' => $fpfx, | ||||||
1388 | 'AMDEP' => $AMDEP, | ||||||
1389 | 'FASTDEP' => $FASTDEP, | ||||||
1390 | '-c' => $lang->compile_flag || '', | ||||||
1391 | # These are not used, but they need to be defined | ||||||
1392 | # so &transform do not complain. | ||||||
1393 | SUBDIROBJ => 0, | ||||||
1394 | 'DERIVED-EXT' => 'BUG', | ||||||
1395 | DIST_SOURCE => 1, | ||||||
1396 | VERBOSE => $verbose, | ||||||
1397 | SILENT => $silent, | ||||||
1398 | ); | ||||||
1399 | |||||||
1400 | # Generate the appropriate rules for this extension. | ||||||
1401 | 0 | 0 | if (((! option 'no-dependencies') && $lang->autodep ne 'no') | ||||
1402 | || defined $lang->compile) | ||||||
1403 | { | ||||||
1404 | # Some C compilers don't support -c -o. Use it only if really | ||||||
1405 | # needed. | ||||||
1406 | 0 | 0 | my $output_flag = $lang->output_flag || ''; | ||||
1407 | 0 | 0 | $output_flag = '-o' | ||||
1408 | if (! $output_flag | ||||||
1409 | && $lang->name eq 'c' | ||||||
1410 | && option 'subdir-objects'); | ||||||
1411 | |||||||
1412 | # Compute a possible derived extension. | ||||||
1413 | # This is not used by depend2.am. | ||||||
1414 | 0 0 | 0 0 | my $der_ext = (&{$lang->output_extensions} ($ext))[0]; | ||||
1415 | |||||||
1416 | # When we output an inference rule like `.c.o:' we | ||||||
1417 | # have two cases to consider: either subdir-objects | ||||||
1418 | # is used, or it is not. | ||||||
1419 | # | ||||||
1420 | # In the latter case the rule is used to build objects | ||||||
1421 | # in the current directory, and dependencies always | ||||||
1422 | # go into `./$(DEPDIR)/'. We can hard-code this value. | ||||||
1423 | # | ||||||
1424 | # In the former case the rule can be used to build | ||||||
1425 | # objects in sub-directories too. Dependencies should | ||||||
1426 | # go into the appropriate sub-directories, e.g., | ||||||
1427 | # `sub/$(DEPDIR)/'. The value of this directory | ||||||
1428 | # needs to be computed on-the-fly. | ||||||
1429 | # | ||||||
1430 | # DEPBASE holds the name of this directory, plus the | ||||||
1431 | # basename part of the object file (extensions Po, TPo, | ||||||
1432 | # Plo, TPlo will be added later as appropriate). It is | ||||||
1433 | # either hardcoded, or a shell variable (`$depbase') that | ||||||
1434 | # will be computed by the rule. | ||||||
1435 | 0 | 0 | my $depbase = | ||||
1436 | option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*'; | ||||||
1437 | 0 | 0 | $output_rules .= | ||||
1438 | file_contents ($rule_file, | ||||||
1439 | new Automake::Location, | ||||||
1440 | %transform, | ||||||
1441 | GENERIC => 1, | ||||||
1442 | |||||||
1443 | 'DERIVED-EXT' => $der_ext, | ||||||
1444 | |||||||
1445 | DEPBASE => $depbase, | ||||||
1446 | BASE => '$*', | ||||||
1447 | SOURCE => '$<', | ||||||
1448 | SOURCEFLAG => $sourceflags{$ext} || '', | ||||||
1449 | OBJ => '$@', | ||||||
1450 | OBJOBJ => '$@', | ||||||
1451 | LTOBJ => '$@', | ||||||
1452 | |||||||
1453 | COMPILE => '$(' . $lang->compiler . ')', | ||||||
1454 | LTCOMPILE => '$(LT' . $lang->compiler . ')', | ||||||
1455 | -o => $output_flag, | ||||||
1456 | SUBDIROBJ => !! option 'subdir-objects'); | ||||||
1457 | } | ||||||
1458 | |||||||
1459 | # Now include code for each specially handled object with this | ||||||
1460 | # language. | ||||||
1461 | 0 | 0 | my %seen_files = (); | ||||
1462 | 0 0 | 0 0 | foreach my $file (@{$lang_specific_files{$lang->name}}) | ||||
1463 | { | ||||||
1464 | 0 | 0 | my ($derived, $source, $obj, $myext, $srcext, %file_transform) = @$file; | ||||
1465 | |||||||
1466 | # We might see a given object twice, for instance if it is | ||||||
1467 | # used under different conditions. | ||||||
1468 | 0 | 0 | next if defined $seen_files{$obj}; | ||||
1469 | 0 | 0 | $seen_files{$obj} = 1; | ||||
1470 | |||||||
1471 | 0 | 0 | prog_error ("found " . $lang->name . | ||||
1472 | " in handle_languages, but compiler not defined") | ||||||
1473 | unless defined $lang->compile; | ||||||
1474 | |||||||
1475 | 0 | 0 | my $obj_compile = $lang->compile; | ||||
1476 | |||||||
1477 | # Rewrite each occurrence of `AM_$flag' in the compile | ||||||
1478 | # rule into `${derived}_$flag' if it exists. | ||||||
1479 | 0 0 | 0 0 | for my $flag (@{$lang->flags}) | ||||
1480 | { | ||||||
1481 | 0 | 0 | my $val = "${derived}_$flag"; | ||||
1482 | 0 | 0 | $obj_compile =~ s/\(AM_$flag\)/\($val\)/ | ||||
1483 | if set_seen ($val); | ||||||
1484 | } | ||||||
1485 | |||||||
1486 | 0 | 0 | my $libtool_tag = ''; | ||||
1487 | 0 | 0 | if ($lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}) | ||||
1488 | { | ||||||
1489 | 0 | 0 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' | ||||
1490 | } | ||||||
1491 | |||||||
1492 | 0 | 0 | my $ptltflags = "${derived}_LIBTOOLFLAGS"; | ||||
1493 | 0 | 0 | $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags; | ||||
1494 | |||||||
1495 | 0 | 0 | my $ltverbose = define_verbose_libtool (); | ||||
1496 | 0 | 0 | my $obj_ltcompile = | ||||
1497 | "\$(LIBTOOL) $ltverbose $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) " | ||||||
1498 | . "--mode=compile $obj_compile"; | ||||||
1499 | |||||||
1500 | # We _need_ `-o' for per object rules. | ||||||
1501 | 0 | 0 | my $output_flag = $lang->output_flag || '-o'; | ||||
1502 | |||||||
1503 | 0 | 0 | my $depbase = dirname ($obj); | ||||
1504 | 0 | 0 | $depbase = '' | ||||
1505 | if $depbase eq '.'; | ||||||
1506 | 0 | 0 | $depbase .= '/' | ||||
1507 | unless $depbase eq ''; | ||||||
1508 | 0 | 0 | $depbase .= '$(DEPDIR)/' . basename ($obj); | ||||
1509 | |||||||
1510 | # Support for deansified files in subdirectories is ugly | ||||||
1511 | # enough to deserve an explanation. | ||||||
1512 | # | ||||||
1513 | # A Note about normal ansi2knr processing first. On | ||||||
1514 | # | ||||||
1515 | # AUTOMAKE_OPTIONS = ansi2knr | ||||||
1516 | # bin_PROGRAMS = foo | ||||||
1517 | # foo_SOURCES = foo.c | ||||||
1518 | # | ||||||
1519 | # we generate rules similar to: | ||||||
1520 | # | ||||||
1521 | # foo: foo$U.o; link ... | ||||||
1522 | # foo$U.o: foo$U.c; compile ... | ||||||
1523 | # foo_.c: foo.c; ansi2knr ... | ||||||
1524 | # | ||||||
1525 | # this is fairly compact, and will call ansi2knr depending | ||||||
1526 | # on the value of $U (`' or `_'). | ||||||
1527 | # | ||||||
1528 | # It's harder with subdir sources. On | ||||||
1529 | # | ||||||
1530 | # AUTOMAKE_OPTIONS = ansi2knr | ||||||
1531 | # bin_PROGRAMS = foo | ||||||
1532 | # foo_SOURCES = sub/foo.c | ||||||
1533 | # | ||||||
1534 | # we have to create foo_.c in the current directory. | ||||||
1535 | # (Unless the user asks 'subdir-objects'.) This is important | ||||||
1536 | # in case the same file (`foo.c') is compiled from other | ||||||
1537 | # directories with different cpp options: foo_.c would | ||||||
1538 | # be preprocessed for only one set of options if it were | ||||||
1539 | # put in the subdirectory. | ||||||
1540 | # | ||||||
1541 | # Because foo$U.o must be built from either foo_.c or | ||||||
1542 | # sub/foo.c we can't be as concise as in the first example. | ||||||
1543 | # Instead we output | ||||||
1544 | # | ||||||
1545 | # foo: foo$U.o; link ... | ||||||
1546 | # foo_.o: foo_.c; compile ... | ||||||
1547 | # foo.o: sub/foo.c; compile ... | ||||||
1548 | # foo_.c: foo.c; ansi2knr ... | ||||||
1549 | # | ||||||
1550 | # This is why we'll now transform $rule_file twice | ||||||
1551 | # if we detect this case. | ||||||
1552 | # A first time we output the compile rule with `$U' | ||||||
1553 | # replaced by `_' and the source directory removed, | ||||||
1554 | # and another time we simply remove `$U'. | ||||||
1555 | # | ||||||
1556 | # Note that at this point $source (as computed by | ||||||
1557 | # &handle_single_transform) is `sub/foo$U.c'. | ||||||
1558 | # This can be confusing: it can be used as-is when | ||||||
1559 | # subdir-objects is set, otherwise you have to know | ||||||
1560 | # it really means `foo_.c' or `sub/foo.c'. | ||||||
1561 | 0 | 0 | my $objdir = dirname ($obj); | ||||
1562 | 0 | 0 | my $srcdir = dirname ($source); | ||||
1563 | 0 | 0 | if ($lang->ansi && $obj =~ /\$U/) | ||||
1564 | { | ||||||
1565 | 0 | 0 | prog_error "`$obj' contains \$U, but `$source' doesn't." | ||||
1566 | if $source !~ /\$U/; | ||||||
1567 | |||||||
1568 | 0 | 0 | (my $source_ = $source) =~ s/\$U/_/g; | ||||
1569 | # Output an additional rule if _.c and .c are not in | ||||||
1570 | # the same directory. (_.c is always in $objdir.) | ||||||
1571 | 0 | 0 | if ($objdir ne $srcdir) | ||||
1572 | { | ||||||
1573 | 0 | 0 | (my $obj_ = $obj) =~ s/\$U/_/g; | ||||
1574 | 0 | 0 | (my $depbase_ = $depbase) =~ s/\$U/_/g; | ||||
1575 | 0 | 0 | $source_ = basename ($source_); | ||||
1576 | |||||||
1577 | 0 | 0 | $output_rules .= | ||||
1578 | file_contents ($rule_file, | ||||||
1579 | new Automake::Location, | ||||||
1580 | %transform, | ||||||
1581 | GENERIC => 0, | ||||||
1582 | |||||||
1583 | DEPBASE => $depbase_, | ||||||
1584 | BASE => $obj_, | ||||||
1585 | SOURCE => $source_, | ||||||
1586 | SOURCEFLAG => $sourceflags{$srcext} || '', | ||||||
1587 | OBJ => "$obj_$myext", | ||||||
1588 | OBJOBJ => "$obj_.obj", | ||||||
1589 | LTOBJ => "$obj_.lo", | ||||||
1590 | |||||||
1591 | COMPILE => $obj_compile, | ||||||
1592 | LTCOMPILE => $obj_ltcompile, | ||||||
1593 | -o => $output_flag, | ||||||
1594 | %file_transform); | ||||||
1595 | 0 | 0 | $obj =~ s/\$U//g; | ||||
1596 | 0 | 0 | $depbase =~ s/\$U//g; | ||||
1597 | 0 | 0 | $source =~ s/\$U//g; | ||||
1598 | } | ||||||
1599 | } | ||||||
1600 | |||||||
1601 | $output_rules .= | ||||||
1602 | 0 | 0 | file_contents ($rule_file, | ||||
1603 | new Automake::Location, | ||||||
1604 | %transform, | ||||||
1605 | GENERIC => 0, | ||||||
1606 | |||||||
1607 | DEPBASE => $depbase, | ||||||
1608 | BASE => $obj, | ||||||
1609 | SOURCE => $source, | ||||||
1610 | SOURCEFLAG => $sourceflags{$srcext} || '', | ||||||
1611 | # Use $myext and not `.o' here, in case | ||||||
1612 | # we are actually building a new source | ||||||
1613 | # file -- e.g. via yacc. | ||||||
1614 | OBJ => "$obj$myext", | ||||||
1615 | OBJOBJ => "$obj.obj", | ||||||
1616 | LTOBJ => "$obj.lo", | ||||||
1617 | |||||||
1618 | VERBOSE => $verbose, | ||||||
1619 | SILENT => $silent, | ||||||
1620 | COMPILE => $obj_compile, | ||||||
1621 | LTCOMPILE => $obj_ltcompile, | ||||||
1622 | -o => $output_flag, | ||||||
1623 | %file_transform); | ||||||
1624 | } | ||||||
1625 | |||||||
1626 | # The rest of the loop is done once per language. | ||||||
1627 | 0 | 0 | next if defined $done{$lang}; | ||||
1628 | 0 | 0 | $done{$lang} = 1; | ||||
1629 | |||||||
1630 | # Load the language dependent Makefile chunks. | ||||||
1631 | 0 0 | 0 0 | my %lang = map { uc ($_) => 0 } keys %languages; | ||||
1632 | 0 | 0 | $lang{uc ($lang->name)} = 1; | ||||
1633 | 0 | 0 | $output_rules .= file_contents ('lang-compile', | ||||
1634 | new Automake::Location, | ||||||
1635 | %transform, %lang); | ||||||
1636 | |||||||
1637 | # If the source to a program consists entirely of code from a | ||||||
1638 | # `pure' language, for instance C++ or Fortran 77, then we | ||||||
1639 | # don't need the C compiler code. However if we run into | ||||||
1640 | # something unusual then we do generate the C code. There are | ||||||
1641 | # probably corner cases here that do not work properly. | ||||||
1642 | # People linking Java code to Fortran code deserve pain. | ||||||
1643 | 0 | 0 | $needs_c ||= ! $lang->pure; | ||||
1644 | |||||||
1645 | 0 | 0 | define_compiler_variable ($lang) | ||||
1646 | if ($lang->compile); | ||||||
1647 | |||||||
1648 | 0 | 0 | define_linker_variable ($lang) | ||||
1649 | if ($lang->link); | ||||||
1650 | |||||||
1651 | 0 | 0 | require_variables ("$am_file.am", $lang->Name . " source seen", | ||||
1652 | 0 | 0 | TRUE, @{$lang->config_vars}); | ||||
1653 | |||||||
1654 | # Call the finisher. | ||||||
1655 | 0 | 0 | $lang->finish; | ||||
1656 | |||||||
1657 | # Flags listed in `->flags' are user variables (per GNU Standards), | ||||||
1658 | # they should not be overridden in the Makefile... | ||||||
1659 | 0 0 | 0 0 | my @dont_override = @{$lang->flags}; | ||||
1660 | # ... and so is LDFLAGS. | ||||||
1661 | 0 | 0 | push @dont_override, 'LDFLAGS' if $lang->link; | ||||
1662 | |||||||
1663 | 0 | 0 | check_user_variables @dont_override; | ||||
1664 | } | ||||||
1665 | |||||||
1666 | # If the project is entirely C++ or entirely Fortran 77 (i.e., 1 | ||||||
1667 | # suffix rule was learned), don't bother with the C stuff. But if | ||||||
1668 | # anything else creeps in, then use it. | ||||||
1669 | 0 | 0 | $needs_c = 1 | ||||
1670 | if $need_link || suffix_rules_count > 1; | ||||||
1671 | |||||||
1672 | 0 | 0 | if ($needs_c) | ||||
1673 | { | ||||||
1674 | 0 | 0 | &define_compiler_variable ($languages{'c'}) | ||||
1675 | unless defined $done{$languages{'c'}}; | ||||||
1676 | 0 | 0 | define_linker_variable ($languages{'c'}); | ||||
1677 | } | ||||||
1678 | |||||||
1679 | # Always provide the user with `AM_V_GEN' for `silent-rules' mode. | ||||||
1680 | 0 | 0 | define_verbose_tagvar ('GEN'); | ||||
1681 | } | ||||||
1682 | |||||||
1683 | |||||||
1684 | # append_exeext { PREDICATE } $MACRO | ||||||
1685 | # ---------------------------------- | ||||||
1686 | # Append $(EXEEXT) to each filename in $F appearing in the Makefile | ||||||
1687 | # variable $MACRO if &PREDICATE($F) is true. @substitutions@ are | ||||||
1688 | # ignored. | ||||||
1689 | # | ||||||
1690 | # This is typically used on all filenames of *_PROGRAMS, and filenames | ||||||
1691 | # of TESTS that are programs. | ||||||
1692 | sub append_exeext (&$) | ||||||
1693 | { | ||||||
1694 | 0 | 0 | my ($pred, $macro) = @_; | ||||
1695 | |||||||
1696 | transform_variable_recursively | ||||||
1697 | ($macro, $macro, 'am__EXEEXT', 0, INTERNAL, | ||||||
1698 | sub { | ||||||
1699 | 0 | 0 | my ($subvar, $val, $cond, $full_cond) = @_; | ||||
1700 | # Append $(EXEEXT) unless the user did it already, or it's a | ||||||
1701 | # @substitution@. | ||||||
1702 | 0 | 0 | $val .= '$(EXEEXT)' | ||||
1703 | if $val !~ /(?:\$\(EXEEXT\)$|^[@]\w+[@]$)/ && &$pred ($val); | ||||||
1704 | 0 | 0 | return $val; | ||||
1705 | 0 | 0 | }); | ||||
1706 | } | ||||||
1707 | |||||||
1708 | |||||||
1709 | # Check to make sure a source defined in LIBOBJS is not explicitly | ||||||
1710 | # mentioned. This is a separate function (as opposed to being inlined | ||||||
1711 | # in handle_source_transform) because it isn't always appropriate to | ||||||
1712 | # do this check. | ||||||
1713 | sub check_libobjs_sources | ||||||
1714 | { | ||||||
1715 | 0 | 0 | my ($one_file, $unxformed) = @_; | ||||
1716 | |||||||
1717 | 0 | 0 | foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', | ||||
1718 | 'dist_EXTRA_', 'nodist_EXTRA_') | ||||||
1719 | { | ||||||
1720 | 0 | 0 | my @files; | ||||
1721 | 0 | 0 | my $varname = $prefix . $one_file . '_SOURCES'; | ||||
1722 | 0 | 0 | my $var = var ($varname); | ||||
1723 | 0 | 0 | if ($var) | ||||
1724 | { | ||||||
1725 | 0 | 0 | @files = $var->value_as_list_recursive; | ||||
1726 | } | ||||||
1727 | elsif ($prefix eq '') | ||||||
1728 | { | ||||||
1729 | 0 | 0 | @files = ($unxformed . '.c'); | ||||
1730 | } | ||||||
1731 | else | ||||||
1732 | { | ||||||
1733 | 0 | 0 | next; | ||||
1734 | } | ||||||
1735 | |||||||
1736 | 0 | 0 | foreach my $file (@files) | ||||
1737 | { | ||||||
1738 | 0 | 0 | err_var ($prefix . $one_file . '_SOURCES', | ||||
1739 | "automatically discovered file `$file' should not" . | ||||||
1740 | " be explicitly mentioned") | ||||||
1741 | if defined $libsources{$file}; | ||||||
1742 | } | ||||||
1743 | } | ||||||
1744 | } | ||||||
1745 | |||||||
1746 | |||||||
1747 | # @OBJECTS | ||||||
1748 | # handle_single_transform ($VAR, $TOPPARENT, $DERIVED, $OBJ, $FILE, %TRANSFORM) | ||||||
1749 | # ----------------------------------------------------------------------------- | ||||||
1750 | # Does much of the actual work for handle_source_transform. | ||||||
1751 | # Arguments are: | ||||||
1752 | # $VAR is the name of the variable that the source filenames come from | ||||||
1753 | # $TOPPARENT is the name of the _SOURCES variable which is being processed | ||||||
1754 | # $DERIVED is the name of resulting executable or library | ||||||
1755 | # $OBJ is the object extension (e.g., `$U.lo') | ||||||
1756 | # $FILE the source file to transform | ||||||
1757 | # %TRANSFORM contains extras arguments to pass to file_contents | ||||||
1758 | # when producing explicit rules | ||||||
1759 | # Result is a list of the names of objects | ||||||
1760 | # %linkers_used will be updated with any linkers needed | ||||||
1761 | sub handle_single_transform ($$$$$%) | ||||||
1762 | { | ||||||
1763 | 0 | 0 | my ($var, $topparent, $derived, $obj, $_file, %transform) = @_; | ||||
1764 | 0 | 0 | my @files = ($_file); | ||||
1765 | 0 | 0 | my @result = (); | ||||
1766 | 0 | 0 | my $nonansi_obj = $obj; | ||||
1767 | 0 | 0 | $nonansi_obj =~ s/\$U//g; | ||||
1768 | |||||||
1769 | # Turn sources into objects. We use a while loop like this | ||||||
1770 | # because we might add to @files in the loop. | ||||||
1771 | 0 | 0 | while (scalar @files > 0) | ||||
1772 | { | ||||||
1773 | 0 | 0 | $_ = shift @files; | ||||
1774 | |||||||
1775 | # Configure substitutions in _SOURCES variables are errors. | ||||||
1776 | 0 | 0 | if (/^\@.*\@$/) | ||||
1777 | { | ||||||
1778 | 0 | 0 | my $parent_msg = ''; | ||||
1779 | 0 | 0 | $parent_msg = "\nand is referred to from `$topparent'" | ||||
1780 | if $topparent ne $var->name; | ||||||
1781 | 0 | 0 | err_var ($var, | ||||
1782 | "`" . $var->name . "' includes configure substitution `$_'" | ||||||
1783 | . $parent_msg . ";\nconfigure " . | ||||||
1784 | "substitutions are not allowed in _SOURCES variables"); | ||||||
1785 | 0 | 0 | next; | ||||
1786 | } | ||||||
1787 | |||||||
1788 | # If the source file is in a subdirectory then the `.o' is put | ||||||
1789 | # into the current directory, unless the subdir-objects option | ||||||
1790 | # is in effect. | ||||||
1791 | |||||||
1792 | # Split file name into base and extension. | ||||||
1793 | 0 | 0 | next if ! /^(?:(.*)\/)?([^\/]*)($KNOWN_EXTENSIONS_PATTERN)$/; | ||||
1794 | 0 | 0 | my $full = $_; | ||||
1795 | 0 | 0 | my $directory = $1 || ''; | ||||
1796 | 0 | 0 | my $base = $2; | ||||
1797 | 0 | 0 | my $extension = $3; | ||||
1798 | |||||||
1799 | # We must generate a rule for the object if it requires its own flags. | ||||||
1800 | 0 | 0 | my $renamed = 0; | ||||
1801 | 0 | 0 | my ($linker, $object); | ||||
1802 | |||||||
1803 | # This records whether we've seen a derived source file (e.g. | ||||||
1804 | # yacc output). | ||||||
1805 | 0 | 0 | my $derived_source = 0; | ||||
1806 | |||||||
1807 | # This holds the `aggregate context' of the file we are | ||||||
1808 | # currently examining. If the file is compiled with | ||||||
1809 | # per-object flags, then it will be the name of the object. | ||||||
1810 | # Otherwise it will be `AM'. This is used by the target hook | ||||||
1811 | # language function. | ||||||
1812 | 0 | 0 | my $aggregate = 'AM'; | ||||
1813 | |||||||
1814 | 0 | 0 | $extension = &derive_suffix ($extension, $nonansi_obj); | ||||
1815 | 0 | 0 | my $lang; | ||||
1816 | 0 | 0 | if ($extension_map{$extension} && | ||||
1817 | ($lang = $languages{$extension_map{$extension}})) | ||||||
1818 | { | ||||||
1819 | # Found the language, so see what it says. | ||||||
1820 | 0 | 0 | &saw_extension ($extension); | ||||
1821 | |||||||
1822 | # Do we have per-executable flags for this executable? | ||||||
1823 | 0 | 0 | my $have_per_exec_flags = 0; | ||||
1824 | 0 0 | 0 0 | my @peflags = @{$lang->flags}; | ||||
1825 | 0 | 0 | push @peflags, 'LIBTOOLFLAGS' if $nonansi_obj eq '.lo'; | ||||
1826 | 0 | 0 | foreach my $flag (@peflags) | ||||
1827 | { | ||||||
1828 | 0 | 0 | if (set_seen ("${derived}_$flag")) | ||||
1829 | { | ||||||
1830 | 0 | 0 | $have_per_exec_flags = 1; | ||||
1831 | 0 | 0 | last; | ||||
1832 | } | ||||||
1833 | } | ||||||
1834 | |||||||
1835 | # Note: computed subr call. The language rewrite function | ||||||
1836 | # should return one of the LANG_* constants. It could | ||||||
1837 | # also return a list whose first value is such a constant | ||||||
1838 | # and whose second value is a new source extension which | ||||||
1839 | # should be applied. This means this particular language | ||||||
1840 | # generates another source file which we must then process | ||||||
1841 | # further. | ||||||
1842 | 0 0 | 0 0 | my $subr = \&{'lang_' . $lang->name . '_rewrite'}; | ||||
1843 | 0 | 0 | my ($r, $source_extension) | ||||
1844 | = &$subr ($directory, $base, $extension, | ||||||
1845 | $nonansi_obj, $have_per_exec_flags, $var); | ||||||
1846 | # Skip this entry if we were asked not to process it. | ||||||
1847 | 0 | 0 | next if $r == LANG_IGNORE; | ||||
1848 | |||||||
1849 | # Now extract linker and other info. | ||||||
1850 | 0 | 0 | $linker = $lang->linker; | ||||
1851 | |||||||
1852 | 0 | 0 | my $this_obj_ext; | ||||
1853 | 0 | 0 | if (defined $source_extension) | ||||
1854 | { | ||||||
1855 | 0 | 0 | $this_obj_ext = $source_extension; | ||||
1856 | 0 | 0 | $derived_source = 1; | ||||
1857 | } | ||||||
1858 | elsif ($lang->ansi) | ||||||
1859 | { | ||||||
1860 | 0 | 0 | $this_obj_ext = $obj; | ||||
1861 | } | ||||||
1862 | else | ||||||
1863 | { | ||||||
1864 | 0 | 0 | $this_obj_ext = $nonansi_obj; | ||||
1865 | } | ||||||
1866 | 0 | 0 | $object = $base . $this_obj_ext; | ||||
1867 | |||||||
1868 | 0 | 0 | if ($have_per_exec_flags) | ||||
1869 | { | ||||||
1870 | # We have a per-executable flag in effect for this | ||||||
1871 | # object. In this case we rewrite the object's | ||||||
1872 | # name to ensure it is unique. | ||||||
1873 | |||||||
1874 | # We choose the name `DERIVED_OBJECT' to ensure | ||||||
1875 | # (1) uniqueness, and (2) continuity between | ||||||
1876 | # invocations. However, this will result in a | ||||||
1877 | # name that is too long for losing systems, in | ||||||
1878 | # some situations. So we provide _SHORTNAME to | ||||||
1879 | # override. | ||||||
1880 | |||||||
1881 | 0 | 0 | my $dname = $derived; | ||||
1882 | 0 | 0 | my $var = var ($derived . '_SHORTNAME'); | ||||
1883 | 0 | 0 | if ($var) | ||||
1884 | { | ||||||
1885 | # FIXME: should use the same Condition as | ||||||
1886 | # the _SOURCES variable. But this is really | ||||||
1887 | # silly overkill -- nobody should have | ||||||
1888 | # conditional shortnames. | ||||||
1889 | 0 | 0 | $dname = $var->variable_value; | ||||
1890 | } | ||||||
1891 | 0 | 0 | $object = $dname . '-' . $object; | ||||
1892 | |||||||
1893 | 0 | 0 | prog_error ($lang->name . " flags defined without compiler") | ||||
1894 | if ! defined $lang->compile; | ||||||
1895 | |||||||
1896 | 0 | 0 | $renamed = 1; | ||||
1897 | } | ||||||
1898 | |||||||
1899 | # If rewrite said it was ok, put the object into a | ||||||
1900 | # subdir. | ||||||
1901 | 0 | 0 | if ($r == LANG_SUBDIR && $directory ne '') | ||||
1902 | { | ||||||
1903 | 0 | 0 | $object = $directory . '/' . $object; | ||||
1904 | } | ||||||
1905 | |||||||
1906 | # If the object file has been renamed (because per-target | ||||||
1907 | # flags are used) we cannot compile the file with an | ||||||
1908 | # inference rule: we need an explicit rule. | ||||||
1909 | # | ||||||
1910 | # If the source is in a subdirectory and the object is in | ||||||
1911 | # the current directory, we also need an explicit rule. | ||||||
1912 | # | ||||||
1913 | # If both source and object files are in a subdirectory | ||||||
1914 | # (this happens when the subdir-objects option is used), | ||||||
1915 | # then the inference will work. | ||||||
1916 | # | ||||||
1917 | # The latter case deserves a historical note. When the | ||||||
1918 | # subdir-objects option was added on 1999-04-11 it was | ||||||
1919 | # thought that inferences rules would work for | ||||||
1920 | # subdirectory objects too. Later, on 1999-11-22, | ||||||
1921 | # automake was changed to output explicit rules even for | ||||||
1922 | # subdir-objects. Nobody remembers why, but this occurred | ||||||
1923 | # soon after the merge of the user-dep-gen-branch so it | ||||||
1924 | # might be related. In late 2003 people complained about | ||||||
1925 | # the size of the generated Makefile.ins (libgcj, with | ||||||
1926 | # 2200+ subdir objects was reported to have a 9MB | ||||||
1927 | # Makefile), so we now rely on inference rules again. | ||||||
1928 | # Maybe we'll run across the same issue as in the past, | ||||||
1929 | # but at least this time we can document it. However since | ||||||
1930 | # dependency tracking has evolved it is possible that | ||||||
1931 | # our old problem no longer exists. | ||||||
1932 | # Using inference rules for subdir-objects has been tested | ||||||
1933 | # with GNU make, Solaris make, Ultrix make, BSD make, | ||||||
1934 | # HP-UX make, and OSF1 make successfully. | ||||||
1935 | 0 | 0 | if ($renamed | ||||
1936 | || ($directory ne '' && ! option 'subdir-objects') | ||||||
1937 | # We must also use specific rules for a nodist_ source | ||||||
1938 | # if its language requests it. | ||||||
1939 | || ($lang->nodist_specific && ! $transform{'DIST_SOURCE'})) | ||||||
1940 | { | ||||||
1941 | 0 | 0 | my $obj_sans_ext = substr ($object, 0, | ||||
1942 | - length ($this_obj_ext)); | ||||||
1943 | 0 | 0 | my $full_ansi; | ||||
1944 | 0 | 0 | if ($directory ne '') | ||||
1945 | { | ||||||
1946 | 0 | 0 | $full_ansi = $directory . '/' . $base . $extension; | ||||
1947 | } | ||||||
1948 | else | ||||||
1949 | { | ||||||
1950 | 0 | 0 | $full_ansi = $base . $extension; | ||||
1951 | } | ||||||
1952 | |||||||
1953 | 0 | 0 | if ($lang->ansi && option 'ansi2knr') | ||||
1954 | { | ||||||
1955 | 0 | 0 | $full_ansi =~ s/$KNOWN_EXTENSIONS_PATTERN$/\$U$&/; | ||||
1956 | 0 | 0 | $obj_sans_ext .= '$U'; | ||||
1957 | } | ||||||
1958 | |||||||
1959 | 0 | 0 | my @specifics = ($full_ansi, $obj_sans_ext, | ||||
1960 | # Only use $this_obj_ext in the derived | ||||||
1961 | # source case because in the other case we | ||||||
1962 | # *don't* want $(OBJEXT) to appear here. | ||||||
1963 | ($derived_source ? $this_obj_ext : '.o'), | ||||||
1964 | $extension); | ||||||
1965 | |||||||
1966 | # If we renamed the object then we want to use the | ||||||
1967 | # per-executable flag name. But if this is simply a | ||||||
1968 | # subdir build then we still want to use the AM_ flag | ||||||
1969 | # name. | ||||||
1970 | 0 | 0 | if ($renamed) | ||||
1971 | { | ||||||
1972 | 0 | 0 | unshift @specifics, $derived; | ||||
1973 | 0 | 0 | $aggregate = $derived; | ||||
1974 | } | ||||||
1975 | else | ||||||
1976 | { | ||||||
1977 | 0 | 0 | unshift @specifics, 'AM'; | ||||
1978 | } | ||||||
1979 | |||||||
1980 | # Each item on this list is a reference to a list consisting | ||||||
1981 | # of four values followed by additional transform flags for | ||||||
1982 | # file_contents. The four values are the derived flag prefix | ||||||
1983 | # (e.g. for `foo_CFLAGS', it is `foo'), the name of the | ||||||
1984 | # source file, the base name of the output file, and | ||||||
1985 | # the extension for the object file. | ||||||
1986 | 0 0 | 0 0 | push (@{$lang_specific_files{$lang->name}}, | ||||
1987 | [@specifics, %transform]); | ||||||
1988 | } | ||||||
1989 | } | ||||||
1990 | elsif ($extension eq $nonansi_obj) | ||||||
1991 | { | ||||||
1992 | # This is probably the result of a direct suffix rule. | ||||||
1993 | # In this case we just accept the rewrite. | ||||||
1994 | 0 | 0 | $object = "$base$extension"; | ||||
1995 | 0 | 0 | $object = "$directory/$object" if $directory ne ''; | ||||
1996 | 0 | 0 | $linker = ''; | ||||
1997 | } | ||||||
1998 | else | ||||||
1999 | { | ||||||
2000 | # No error message here. Used to have one, but it was | ||||||
2001 | # very unpopular. | ||||||
2002 | # FIXME: we could potentially do more processing here, | ||||||
2003 | # perhaps treating the new extension as though it were a | ||||||
2004 | # new source extension (as above). This would require | ||||||
2005 | # more restructuring than is appropriate right now. | ||||||
2006 | 0 | 0 | next; | ||||
2007 | } | ||||||
2008 | |||||||
2009 | 0 | 0 | err_am "object `$object' created by `$full' and `$object_map{$object}'" | ||||
2010 | if (defined $object_map{$object} | ||||||
2011 | && $object_map{$object} ne $full); | ||||||
2012 | |||||||
2013 | 0 | 0 | my $comp_val = (($object =~ /\.lo$/) | ||||
2014 | ? COMPILE_LIBTOOL : COMPILE_ORDINARY); | ||||||
2015 | 0 | 0 | (my $comp_obj = $object) =~ s/\.lo$/.\$(OBJEXT)/; | ||||
2016 | 0 | 0 | if (defined $object_compilation_map{$comp_obj} | ||||
2017 | && $object_compilation_map{$comp_obj} != 0 | ||||||
2018 | # Only see the error once. | ||||||
2019 | && ($object_compilation_map{$comp_obj} | ||||||
2020 | != (COMPILE_LIBTOOL | COMPILE_ORDINARY)) | ||||||
2021 | && $object_compilation_map{$comp_obj} != $comp_val) | ||||||
2022 | { | ||||||
2023 | 0 | 0 | err_am "object `$comp_obj' created both with libtool and without"; | ||||
2024 | } | ||||||
2025 | 0 | 0 | $object_compilation_map{$comp_obj} |= $comp_val; | ||||
2026 | |||||||
2027 | 0 | 0 | if (defined $lang) | ||||
2028 | { | ||||||
2029 | # Let the language do some special magic if required. | ||||||
2030 | 0 | 0 | $lang->target_hook ($aggregate, $object, $full, %transform); | ||||
2031 | } | ||||||
2032 | |||||||
2033 | 0 | 0 | if ($derived_source) | ||||
2034 | { | ||||||
2035 | 0 | 0 | prog_error ($lang->name . " has automatic dependency tracking") | ||||
2036 | if $lang->autodep ne 'no'; | ||||||
2037 | # Make sure this new source file is handled next. That will | ||||||
2038 | # make it appear to be at the right place in the list. | ||||||
2039 | 0 | 0 | unshift (@files, $object); | ||||
2040 | # Distribute derived sources unless the source they are | ||||||
2041 | # derived from is not. | ||||||
2042 | 0 | 0 | &push_dist_common ($object) | ||||
2043 | unless ($topparent =~ /^(?:nobase_)?nodist_/); | ||||||
2044 | 0 | 0 | next; | ||||
2045 | } | ||||||
2046 | |||||||
2047 | 0 | 0 | $linkers_used{$linker} = 1; | ||||
2048 | |||||||
2049 | 0 | 0 | push (@result, $object); | ||||
2050 | |||||||
2051 | 0 | 0 | if (! defined $object_map{$object}) | ||||
2052 | { | ||||||
2053 | 0 | 0 | my @dep_list = (); | ||||
2054 | 0 | 0 | $object_map{$object} = $full; | ||||
2055 | |||||||
2056 | # If resulting object is in subdir, we need to make | ||||||
2057 | # sure the subdir exists at build time. | ||||||
2058 | 0 | 0 | if ($object =~ /\//) | ||||
2059 | { | ||||||
2060 | # FIXME: check that $DIRECTORY is somewhere in the | ||||||
2061 | # project | ||||||
2062 | |||||||
2063 | # For Java, the way we're handling it right now, a | ||||||
2064 | # `..' component doesn't make sense. | ||||||
2065 | 0 | 0 | if ($lang && $lang->name eq 'java' && $object =~ /(\/|^)\.\.\//) | ||||
2066 | { | ||||||
2067 | 0 | 0 | err_am "`$full' should not contain a `..' component"; | ||||
2068 | } | ||||||
2069 | |||||||
2070 | # Make sure object is removed by `make mostlyclean'. | ||||||
2071 | 0 | 0 | $compile_clean_files{$object} = MOSTLY_CLEAN; | ||||
2072 | # If we have a libtool object then we also must remove | ||||||
2073 | # the ordinary .o. | ||||||
2074 | 0 | 0 | if ($object =~ /\.lo$/) | ||||
2075 | { | ||||||
2076 | 0 | 0 | (my $xobj = $object) =~ s,lo$,\$(OBJEXT),; | ||||
2077 | 0 | 0 | $compile_clean_files{$xobj} = MOSTLY_CLEAN; | ||||
2078 | |||||||
2079 | # Remove any libtool object in this directory. | ||||||
2080 | 0 | 0 | $libtool_clean_directories{$directory} = 1; | ||||
2081 | } | ||||||
2082 | |||||||
2083 | 0 | 0 | push (@dep_list, require_build_directory ($directory)); | ||||
2084 | |||||||
2085 | # If we're generating dependencies, we also want | ||||||
2086 | # to make sure that the appropriate subdir of the | ||||||
2087 | # .deps directory is created. | ||||||
2088 | 0 | 0 | push (@dep_list, | ||||
2089 | require_build_directory ($directory . '/$(DEPDIR)')) | ||||||
2090 | unless option 'no-dependencies'; | ||||||
2091 | } | ||||||
2092 | |||||||
2093 | 0 | 0 | &pretty_print_rule ($object . ':', "\t", @dep_list) | ||||
2094 | if scalar @dep_list > 0; | ||||||
2095 | } | ||||||
2096 | |||||||
2097 | # Transform .o or $o file into .P file (for automatic | ||||||
2098 | # dependency code). | ||||||
2099 | 0 | 0 | if ($lang && $lang->autodep ne 'no') | ||||
2100 | { | ||||||
2101 | 0 | 0 | my $depfile = $object; | ||||
2102 | 0 | 0 | $depfile =~ s/\.([^.]*)$/.P$1/; | ||||
2103 | 0 | 0 | $depfile =~ s/\$\(OBJEXT\)$/o/; | ||||
2104 | 0 | 0 | $dep_files{dirname ($depfile) . '/$(DEPDIR)/' | ||||
2105 | . basename ($depfile)} = 1; | ||||||
2106 | } | ||||||
2107 | } | ||||||
2108 | |||||||
2109 | 0 | 0 | return @result; | ||||
2110 | } | ||||||
2111 | |||||||
2112 | |||||||
2113 | # $LINKER | ||||||
2114 | # define_objects_from_sources ($VAR, $OBJVAR, $NODEFINE, $ONE_FILE, | ||||||
2115 | # $OBJ, $PARENT, $TOPPARENT, $WHERE, %TRANSFORM) | ||||||
2116 | # --------------------------------------------------------------------------- | ||||||
2117 | # Define an _OBJECTS variable for a _SOURCES variable (or subvariable) | ||||||
2118 | # | ||||||
2119 | # Arguments are: | ||||||
2120 | # $VAR is the name of the _SOURCES variable | ||||||
2121 | # $OBJVAR is the name of the _OBJECTS variable if known (otherwise | ||||||
2122 | # it will be generated and returned). | ||||||
2123 | # $NODEFINE is a boolean: if true, $OBJVAR will not be defined (but | ||||||
2124 | # work done to determine the linker will be). | ||||||
2125 | # $ONE_FILE is the canonical (transformed) name of object to build | ||||||
2126 | # $OBJ is the object extension (i.e. either `.o' or `.lo'). | ||||||
2127 | # $TOPPARENT is the _SOURCES variable being processed. | ||||||
2128 | # $WHERE context into which this definition is done | ||||||
2129 | # %TRANSFORM extra arguments to pass to file_contents when producing | ||||||
2130 | # rules | ||||||
2131 | # | ||||||
2132 | # Result is a pair ($LINKER, $OBJVAR): | ||||||
2133 | # $LINKER is a boolean, true if a linker is needed to deal with the objects | ||||||
2134 | sub define_objects_from_sources ($$$$$$$%) | ||||||
2135 | { | ||||||
2136 | 0 | 0 | my ($var, $objvar, $nodefine, $one_file, | ||||
2137 | $obj, $topparent, $where, %transform) = @_; | ||||||
2138 | |||||||
2139 | 0 | 0 | my $needlinker = ""; | ||||
2140 | |||||||
2141 | transform_variable_recursively | ||||||
2142 | ($var, $objvar, 'am__objects', $nodefine, $where, | ||||||
2143 | # The transform code to run on each filename. | ||||||
2144 | sub { | ||||||
2145 | 0 | 0 | my ($subvar, $val, $cond, $full_cond) = @_; | ||||
2146 | 0 | 0 | my @trans = handle_single_transform ($subvar, $topparent, | ||||
2147 | $one_file, $obj, $val, | ||||||
2148 | %transform); | ||||||
2149 | 0 | 0 | $needlinker = "true" if @trans; | ||||
2150 | 0 | 0 | return @trans; | ||||
2151 | 0 | 0 | }); | ||||
2152 | |||||||
2153 | 0 | 0 | return $needlinker; | ||||
2154 | } | ||||||
2155 | |||||||
2156 | |||||||
2157 | # handle_source_transform ($CANON_TARGET, $TARGET, $OBJEXT, $WHERE, %TRANSFORM) | ||||||
2158 | # ----------------------------------------------------------------------------- | ||||||
2159 | # Handle SOURCE->OBJECT transform for one program or library. | ||||||
2160 | # Arguments are: | ||||||
2161 | # canonical (transformed) name of target to build | ||||||
2162 | # actual target of object to build | ||||||
2163 | # object extension (i.e., either `.o' or `$o') | ||||||
2164 | # location of the source variable | ||||||
2165 | # extra arguments to pass to file_contents when producing rules | ||||||
2166 | # Return the name of the linker variable that must be used. | ||||||
2167 | # Empty return means just use `LINK'. | ||||||
2168 | sub handle_source_transform ($$$$%) | ||||||
2169 | { | ||||||
2170 | # one_file is canonical name. unxformed is given name. obj is | ||||||
2171 | # object extension. | ||||||
2172 | 0 | 0 | my ($one_file, $unxformed, $obj, $where, %transform) = @_; | ||||
2173 | |||||||
2174 | 0 | 0 | my $linker = ''; | ||||
2175 | |||||||
2176 | # No point in continuing if _OBJECTS is defined. | ||||||
2177 | 0 | 0 | return if reject_var ($one_file . '_OBJECTS', | ||||
2178 | $one_file . '_OBJECTS should not be defined'); | ||||||
2179 | |||||||
2180 | 0 | 0 | my %used_pfx = (); | ||||
2181 | 0 | 0 | my $needlinker; | ||||
2182 | 0 | 0 | %linkers_used = (); | ||||
2183 | 0 | 0 | foreach my $prefix ('', 'EXTRA_', 'dist_', 'nodist_', | ||||
2184 | 'dist_EXTRA_', 'nodist_EXTRA_') | ||||||
2185 | { | ||||||
2186 | 0 | 0 | my $varname = $prefix . $one_file . "_SOURCES"; | ||||
2187 | 0 | 0 | my $var = var $varname; | ||||
2188 | 0 | 0 | next unless $var; | ||||
2189 | |||||||
2190 | # We are going to define _OBJECTS variables using the prefix. | ||||||
2191 | # Then we glom them all together. So we can't use the null | ||||||
2192 | # prefix here as we need it later. | ||||||
2193 | 0 | 0 | my $xpfx = ($prefix eq '') ? 'am_' : $prefix; | ||||
2194 | |||||||
2195 | # Keep track of which prefixes we saw. | ||||||
2196 | 0 | 0 | $used_pfx{$xpfx} = 1 | ||||
2197 | unless $prefix =~ /EXTRA_/; | ||||||
2198 | |||||||
2199 | 0 | 0 | push @sources, "\$($varname)"; | ||||
2200 | 0 | 0 | push @dist_sources, shadow_unconditionally ($varname, $where) | ||||
2201 | unless (option ('no-dist') || $prefix =~ /^nodist_/); | ||||||
2202 | |||||||
2203 | 0 | 0 | $needlinker |= | ||||
2204 | define_objects_from_sources ($varname, | ||||||
2205 | $xpfx . $one_file . '_OBJECTS', | ||||||
2206 | $prefix =~ /EXTRA_/, | ||||||
2207 | $one_file, $obj, $varname, $where, | ||||||
2208 | DIST_SOURCE => ($prefix !~ /^nodist_/), | ||||||
2209 | %transform); | ||||||
2210 | } | ||||||
2211 | 0 | 0 | if ($needlinker) | ||||
2212 | { | ||||||
2213 | 0 | 0 | $linker ||= &resolve_linker (%linkers_used); | ||||
2214 | } | ||||||
2215 | |||||||
2216 | 0 | 0 | my @keys = sort keys %used_pfx; | ||||
2217 | 0 | 0 | if (scalar @keys == 0) | ||||
2218 | { | ||||||
2219 | # The default source for libfoo.la is libfoo.c, but for | ||||||
2220 | # backward compatibility we first look at libfoo_la.c, | ||||||
2221 | # if no default source suffix is given. | ||||||
2222 | 0 | 0 | my $old_default_source = "$one_file.c"; | ||||
2223 | 0 | 0 | my $ext_var = var ('AM_DEFAULT_SOURCE_EXT'); | ||||
2224 | 0 | 0 | my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c'; | ||||
2225 | 0 | 0 | msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most one value") | ||||
2226 | if $default_source_ext =~ /[\t ]/; | ||||||
2227 | 0 | 0 | (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,$default_source_ext,; | ||||
2228 | 0 | 0 | if ($old_default_source ne $default_source | ||||
2229 | && !$ext_var | ||||||
2230 | && (rule $old_default_source | ||||||
2231 | || rule '$(srcdir)/' . $old_default_source | ||||||
2232 | || rule '${srcdir}/' . $old_default_source | ||||||
2233 | || -f $old_default_source)) | ||||||
2234 | { | ||||||
2235 | 0 | 0 | my $loc = $where->clone; | ||||
2236 | 0 | 0 | $loc->pop_context; | ||||
2237 | 0 | 0 | msg ('obsolete', $loc, | ||||
2238 | "the default source for `$unxformed' has been changed " | ||||||
2239 | . "to `$default_source'.\n(Using `$old_default_source' for " | ||||||
2240 | . "backward compatibility.)"); | ||||||
2241 | 0 | 0 | $default_source = $old_default_source; | ||||
2242 | } | ||||||
2243 | # If a rule exists to build this source with a $(srcdir) | ||||||
2244 | # prefix, use that prefix in our variables too. This is for | ||||||
2245 | # the sake of BSD Make. | ||||||
2246 | 0 | 0 | if (rule '$(srcdir)/' . $default_source | ||||
2247 | || rule '${srcdir}/' . $default_source) | ||||||
2248 | { | ||||||
2249 | 0 | 0 | $default_source = '$(srcdir)/' . $default_source; | ||||
2250 | } | ||||||
2251 | |||||||
2252 | 0 | 0 | &define_variable ($one_file . "_SOURCES", $default_source, $where); | ||||
2253 | 0 | 0 | push (@sources, $default_source); | ||||
2254 | 0 | 0 | push (@dist_sources, $default_source); | ||||
2255 | |||||||
2256 | 0 | 0 | %linkers_used = (); | ||||
2257 | 0 | 0 | my (@result) = | ||||
2258 | handle_single_transform ($one_file . '_SOURCES', | ||||||
2259 | $one_file . '_SOURCES', | ||||||
2260 | $one_file, $obj, | ||||||
2261 | $default_source, %transform); | ||||||
2262 | 0 | 0 | $linker ||= &resolve_linker (%linkers_used); | ||||
2263 | 0 | 0 | define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @result); | ||||
2264 | } | ||||||
2265 | else | ||||||
2266 | { | ||||||
2267 | 0 0 | 0 0 | @keys = map { '$(' . $_ . $one_file . '_OBJECTS)' } @keys; | ||||
2268 | 0 | 0 | define_pretty_variable ($one_file . '_OBJECTS', TRUE, $where, @keys); | ||||
2269 | } | ||||||
2270 | |||||||
2271 | # If we want to use `LINK' we must make sure it is defined. | ||||||
2272 | 0 | 0 | if ($linker eq '') | ||||
2273 | { | ||||||
2274 | 0 | 0 | $need_link = 1; | ||||
2275 | } | ||||||
2276 | |||||||
2277 | 0 | 0 | return $linker; | ||||
2278 | } | ||||||
2279 | |||||||
2280 | |||||||
2281 | # handle_lib_objects ($XNAME, $VAR) | ||||||
2282 | # --------------------------------- | ||||||
2283 | # Special-case ALLOCA and LIBOBJS substitutions in _LDADD or _LIBADD variables. | ||||||
2284 | # Also, generate _DEPENDENCIES variable if appropriate. | ||||||
2285 | # Arguments are: | ||||||
2286 | # transformed name of object being built, or empty string if no object | ||||||
2287 | # name of _LDADD/_LIBADD-type variable to examine | ||||||
2288 | # Returns 1 if LIBOBJS seen, 0 otherwise. | ||||||
2289 | sub handle_lib_objects | ||||||
2290 | { | ||||||
2291 | 0 | 0 | my ($xname, $varname) = @_; | ||||
2292 | |||||||
2293 | 0 | 0 | my $var = var ($varname); | ||||
2294 | 0 | 0 | prog_error "handle_lib_objects: `$varname' undefined" | ||||
2295 | unless $var; | ||||||
2296 | 0 | 0 | prog_error "handle_lib_objects: unexpected variable name `$varname'" | ||||
2297 | unless $varname =~ /^(.*)(?:LIB|LD)ADD$/; | ||||||
2298 | 0 | 0 | my $prefix = $1 || 'AM_'; | ||||
2299 | |||||||
2300 | 0 | 0 | my $seen_libobjs = 0; | ||||
2301 | 0 | 0 | my $flagvar = 0; | ||||
2302 | |||||||
2303 | transform_variable_recursively | ||||||
2304 | ($varname, $xname . '_DEPENDENCIES', 'am__DEPENDENCIES', | ||||||
2305 | ! $xname, INTERNAL, | ||||||
2306 | # Transformation function, run on each filename. | ||||||
2307 | sub { | ||||||
2308 | 0 | 0 | my ($subvar, $val, $cond, $full_cond) = @_; | ||||
2309 | |||||||
2310 | 0 | 0 | if ($val =~ /^-/) | ||||
2311 | { | ||||||
2312 | # Skip -lfoo and -Ldir silently; these are explicitly allowed. | ||||||
2313 | 0 | 0 | if ($val !~ /^-[lL]/ && | ||||
2314 | # Skip -dlopen and -dlpreopen; these are explicitly allowed | ||||||
2315 | # for Libtool libraries or programs. (Actually we are a bit | ||||||
2316 | # laxe here since this code also applies to non-libtool | ||||||
2317 | # libraries or programs, for which -dlopen and -dlopreopen | ||||||
2318 | # are pure nonsense. Diagnosing this doesn't seem very | ||||||
2319 | # important: the developer will quickly get complaints from | ||||||
2320 | # the linker.) | ||||||
2321 | $val !~ /^-dl(?:pre)?open$/ && | ||||||
2322 | # Only get this error once. | ||||||
2323 | ! $flagvar) | ||||||
2324 | { | ||||||
2325 | 0 | 0 | $flagvar = 1; | ||||
2326 | # FIXME: should display a stack of nested variables | ||||||
2327 | # as context when $var != $subvar. | ||||||
2328 | 0 | 0 | err_var ($var, "linker flags such as `$val' belong in " | ||||
2329 | . "`${prefix}LDFLAGS"); | ||||||
2330 | } | ||||||
2331 | 0 | 0 | return (); | ||||
2332 | } | ||||||
2333 | elsif ($val !~ /^\@.*\@$/) | ||||||
2334 | { | ||||||
2335 | # Assume we have a file of some sort, and output it into the | ||||||
2336 | # dependency variable. Autoconf substitutions are not output; | ||||||
2337 | # rarely is a new dependency substituted into e.g. foo_LDADD | ||||||
2338 | # -- but bad things (e.g. -lX11) are routinely substituted. | ||||||
2339 | # Note that LIBOBJS and ALLOCA are exceptions to this rule, | ||||||
2340 | # and handled specially below. | ||||||
2341 | 0 | 0 | return $val; | ||||
2342 | } | ||||||
2343 | elsif ($val =~ /^\@(LT)?LIBOBJS\@$/) | ||||||
2344 | { | ||||||
2345 | 0 | 0 | handle_LIBOBJS ($subvar, $cond, $1); | ||||
2346 | 0 | 0 | $seen_libobjs = 1; | ||||
2347 | 0 | 0 | return $val; | ||||
2348 | } | ||||||
2349 | elsif ($val =~ /^\@(LT)?ALLOCA\@$/) | ||||||
2350 | { | ||||||
2351 | 0 | 0 | handle_ALLOCA ($subvar, $cond, $1); | ||||
2352 | 0 | 0 | return $val; | ||||
2353 | } | ||||||
2354 | else | ||||||
2355 | { | ||||||
2356 | 0 | 0 | return (); | ||||
2357 | } | ||||||
2358 | 0 | 0 | }); | ||||
2359 | |||||||
2360 | 0 | 0 | return $seen_libobjs; | ||||
2361 | } | ||||||
2362 | |||||||
2363 | # handle_LIBOBJS_or_ALLOCA ($VAR) | ||||||
2364 | # ------------------------------- | ||||||
2365 | # Definitions common to LIBOBJS and ALLOCA. | ||||||
2366 | # VAR should be one of LIBOBJS, LTLIBOBJS, ALLOCA, or LTALLOCA. | ||||||
2367 | sub handle_LIBOBJS_or_ALLOCA ($) | ||||||
2368 | { | ||||||
2369 | 0 | 0 | my ($var) = @_; | ||||
2370 | |||||||
2371 | 0 | 0 | my $dir = ''; | ||||
2372 | |||||||
2373 | # If LIBOBJS files must be built in another directory we have | ||||||
2374 | # to define LIBOBJDIR and ensure the files get cleaned. | ||||||
2375 | # Otherwise LIBOBJDIR can be left undefined, and the cleaning | ||||||
2376 | # is achieved by `rm -f *.$(OBJEXT)' in compile.am. | ||||||
2377 | 0 | 0 | if ($config_libobj_dir | ||||
2378 | && $relative_dir ne $config_libobj_dir) | ||||||
2379 | { | ||||||
2380 | 0 | 0 | if (option 'subdir-objects') | ||||
2381 | { | ||||||
2382 | # In the top-level Makefile we do not use $(top_builddir), because | ||||||
2383 | # we are already there, and since the targets are built without | ||||||
2384 | # a $(top_builddir), it helps BSD Make to match them with | ||||||
2385 | # dependencies. | ||||||
2386 | 0 | 0 | $dir = "$config_libobj_dir/" if $config_libobj_dir ne '.'; | ||||
2387 | 0 | 0 | $dir = "$topsrcdir/$dir" if $relative_dir ne '.'; | ||||
2388 | 0 | 0 | define_variable ('LIBOBJDIR', "$dir", INTERNAL); | ||||
2389 | 0 | 0 | $clean_files{"\$($var)"} = MOSTLY_CLEAN; | ||||
2390 | # If LTLIBOBJS is used, we must also clear LIBOBJS (which might | ||||||
2391 | # be created by libtool as a side-effect of creating LTLIBOBJS). | ||||||
2392 | 0 | 0 | $clean_files{"\$($var)"} = MOSTLY_CLEAN if $var =~ s/^LT//; | ||||
2393 | } | ||||||
2394 | else | ||||||
2395 | { | ||||||
2396 | 0 | 0 | error ("`\$($var)' cannot be used outside `$config_libobj_dir' if" | ||||
2397 | . " `subdir-objects' is not set"); | ||||||
2398 | } | ||||||
2399 | } | ||||||
2400 | |||||||
2401 | 0 | 0 | return $dir; | ||||
2402 | } | ||||||
2403 | |||||||
2404 | sub handle_LIBOBJS ($$$) | ||||||
2405 | { | ||||||
2406 | 0 | 0 | my ($var, $cond, $lt) = @_; | ||||
2407 | 0 | 0 | my $myobjext = $lt ? 'lo' : 'o'; | ||||
2408 | 0 | 0 | $lt ||= ''; | ||||
2409 | |||||||
2410 | 0 | 0 | $var->requires_variables ("\@${lt}LIBOBJS\@ used", $lt . 'LIBOBJS') | ||||
2411 | if ! keys %libsources; | ||||||
2412 | |||||||
2413 | 0 | 0 | my $dir = handle_LIBOBJS_or_ALLOCA "${lt}LIBOBJS"; | ||||
2414 | |||||||
2415 | 0 | 0 | foreach my $iter (keys %libsources) | ||||
2416 | { | ||||||
2417 | 0 | 0 | if ($iter =~ /\.[cly]$/) | ||||
2418 | { | ||||||
2419 | 0 | 0 | &saw_extension ($&); | ||||
2420 | 0 | 0 | &saw_extension ('.c'); | ||||
2421 | } | ||||||
2422 | |||||||
2423 | 0 | 0 | if ($iter =~ /\.h$/) | ||||
2424 | { | ||||||
2425 | 0 | 0 | require_libsource_with_macro ($cond, $var, FOREIGN, $iter); | ||||
2426 | } | ||||||
2427 | elsif ($iter ne 'alloca.c') | ||||||
2428 | { | ||||||
2429 | 0 | 0 | my $rewrite = $iter; | ||||
2430 | 0 | 0 | $rewrite =~ s/\.c$/.P$myobjext/; | ||||
2431 | 0 | 0 | $dep_files{$dir . '$(DEPDIR)/' . $rewrite} = 1; | ||||
2432 | 0 | 0 | $rewrite = "^" . quotemeta ($iter) . "\$"; | ||||
2433 | # Only require the file if it is not a built source. | ||||||
2434 | 0 | 0 | my $bs = var ('BUILT_SOURCES'); | ||||
2435 | 0 | 0 | if (! $bs || ! grep (/$rewrite/, $bs->value_as_list_recursive)) | ||||
2436 | { | ||||||
2437 | 0 | 0 | require_libsource_with_macro ($cond, $var, FOREIGN, $iter); | ||||
2438 | } | ||||||
2439 | } | ||||||
2440 | } | ||||||
2441 | } | ||||||
2442 | |||||||
2443 | sub handle_ALLOCA ($$$) | ||||||
2444 | { | ||||||
2445 | 0 | 0 | my ($var, $cond, $lt) = @_; | ||||
2446 | 0 | 0 | my $myobjext = $lt ? 'lo' : 'o'; | ||||
2447 | 0 | 0 | $lt ||= ''; | ||||
2448 | 0 | 0 | my $dir = handle_LIBOBJS_or_ALLOCA "${lt}ALLOCA"; | ||||
2449 | |||||||
2450 | 0 | 0 | $var->requires_variables ("\@${lt}ALLOCA\@ used", $lt . 'ALLOCA'); | ||||
2451 | 0 | 0 | $dep_files{$dir . '$(DEPDIR)/alloca.P' . $myobjext} = 1; | ||||
2452 | 0 | 0 | require_libsource_with_macro ($cond, $var, FOREIGN, 'alloca.c'); | ||||
2453 | 0 | 0 | &saw_extension ('.c'); | ||||
2454 | } | ||||||
2455 | |||||||
2456 | # Canonicalize the input parameter | ||||||
2457 | sub canonicalize | ||||||
2458 | { | ||||||
2459 | 0 | 0 | my ($string) = @_; | ||||
2460 | 0 | 0 | $string =~ tr/A-Za-z0-9_\@/_/c; | ||||
2461 | 0 | 0 | return $string; | ||||
2462 | } | ||||||
2463 | |||||||
2464 | # Canonicalize a name, and check to make sure the non-canonical name | ||||||
2465 | # is never used. Returns canonical name. Arguments are name and a | ||||||
2466 | # list of suffixes to check for. | ||||||
2467 | sub check_canonical_spelling | ||||||
2468 | { | ||||||
2469 | 0 | 0 | my ($name, @suffixes) = @_; | ||||
2470 | |||||||
2471 | 0 | 0 | my $xname = &canonicalize ($name); | ||||
2472 | 0 | 0 | if ($xname ne $name) | ||||
2473 | { | ||||||
2474 | 0 | 0 | foreach my $xt (@suffixes) | ||||
2475 | { | ||||||
2476 | 0 | 0 | reject_var ("$name$xt", "use `$xname$xt', not `$name$xt'"); | ||||
2477 | } | ||||||
2478 | } | ||||||
2479 | |||||||
2480 | 0 | 0 | return $xname; | ||||
2481 | } | ||||||
2482 | |||||||
2483 | |||||||
2484 | # handle_compile () | ||||||
2485 | # ----------------- | ||||||
2486 | # Set up the compile suite. | ||||||
2487 | sub handle_compile () | ||||||
2488 | { | ||||||
2489 | return | ||||||
2490 | 0 | 0 | unless $get_object_extension_was_run; | ||||
2491 | |||||||
2492 | # Boilerplate. | ||||||
2493 | 0 | 0 | my $default_includes = ''; | ||||
2494 | 0 | 0 | if (! option 'nostdinc') | ||||
2495 | { | ||||||
2496 | 0 | 0 | my @incs = ('-I.', subst ('am__isrc')); | ||||
2497 | |||||||
2498 | 0 | 0 | my $var = var 'CONFIG_HEADER'; | ||||
2499 | 0 | 0 | if ($var) | ||||
2500 | { | ||||||
2501 | 0 | 0 | foreach my $hdr (split (' ', $var->variable_value)) | ||||
2502 | { | ||||||
2503 | 0 | 0 | push @incs, '-I' . dirname ($hdr); | ||||
2504 | } | ||||||
2505 | } | ||||||
2506 | # We want `-I. -I$(srcdir)', but the latter -I is redundant | ||||||
2507 | # and unaesthetic in non-VPATH builds. We use `-I.@am__isrc@` | ||||||
2508 | # instead. It will be replaced by '-I.' or '-I. -I$(srcdir)'. | ||||||
2509 | # Items in CONFIG_HEADER are never in $(srcdir) so it is safe | ||||||
2510 | # to just put @am__isrc@ right after `-I.', without a space. | ||||||
2511 | 0 | 0 | ($default_includes = ' ' . uniq (@incs)) =~ s/ @/@/; | ||||
2512 | } | ||||||
2513 | |||||||
2514 | 0 | 0 | my (@mostly_rms, @dist_rms); | ||||
2515 | 0 | 0 | foreach my $item (sort keys %compile_clean_files) | ||||
2516 | { | ||||||
2517 | 0 | 0 | if ($compile_clean_files{$item} == MOSTLY_CLEAN) | ||||
2518 | { | ||||||
2519 | 0 | 0 | push (@mostly_rms, "\t-rm -f $item"); | ||||
2520 | } | ||||||
2521 | elsif ($compile_clean_files{$item} == DIST_CLEAN) | ||||||
2522 | { | ||||||
2523 | 0 | 0 | push (@dist_rms, "\t-rm -f $item"); | ||||
2524 | } | ||||||
2525 | else | ||||||
2526 | { | ||||||
2527 | 0 | 0 | prog_error 'invalid entry in %compile_clean_files'; | ||||
2528 | } | ||||||
2529 | } | ||||||
2530 | |||||||
2531 | 0 | 0 | my ($coms, $vars, $rules) = | ||||
2532 | &file_contents_internal (1, "$libdir/am/compile.am", | ||||||
2533 | new Automake::Location, | ||||||
2534 | ('DEFAULT_INCLUDES' => $default_includes, | ||||||
2535 | 'MOSTLYRMS' => join ("\n", @mostly_rms), | ||||||
2536 | 'DISTRMS' => join ("\n", @dist_rms))); | ||||||
2537 | 0 | 0 | $output_vars .= $vars; | ||||
2538 | 0 | 0 | $output_rules .= "$coms$rules"; | ||||
2539 | |||||||
2540 | # Check for automatic de-ANSI-fication. | ||||||
2541 | 0 | 0 | if (option 'ansi2knr') | ||||
2542 | { | ||||||
2543 | 0 0 | 0 0 | my ($ansi2knr_filename, $ansi2knr_where) = @{option 'ansi2knr'}; | ||||
2544 | 0 | 0 | my $ansi2knr_dir = ''; | ||||
2545 | |||||||
2546 | 0 | 0 | require_variables ($ansi2knr_where, "option `ansi2knr' is used", | ||||
2547 | TRUE, "ANSI2KNR", "U"); | ||||||
2548 | |||||||
2549 | # topdir is where ansi2knr should be. | ||||||
2550 | 0 | 0 | if ($ansi2knr_filename eq 'ansi2knr') | ||||
2551 | { | ||||||
2552 | # Only require ansi2knr files if they should appear in | ||||||
2553 | # this directory. | ||||||
2554 | 0 | 0 | require_file ($ansi2knr_where, FOREIGN, | ||||
2555 | 'ansi2knr.c', 'ansi2knr.1'); | ||||||
2556 | |||||||
2557 | # ansi2knr needs to be built before subdirs, so unshift it. | ||||||
2558 | 0 | 0 | unshift (@all, '$(ANSI2KNR)'); | ||||
2559 | } | ||||||
2560 | else | ||||||
2561 | { | ||||||
2562 | 0 | 0 | $ansi2knr_dir = dirname ($ansi2knr_filename); | ||||
2563 | } | ||||||
2564 | |||||||
2565 | 0 | 0 | $output_rules .= &file_contents ('ansi2knr', | ||||
2566 | new Automake::Location, | ||||||
2567 | 'ANSI2KNR-DIR' => $ansi2knr_dir); | ||||||
2568 | |||||||
2569 | } | ||||||
2570 | } | ||||||
2571 | |||||||
2572 | # handle_libtool () | ||||||
2573 | # ----------------- | ||||||
2574 | # Handle libtool rules. | ||||||
2575 | sub handle_libtool | ||||||
2576 | { | ||||||
2577 | 0 | 0 | return unless var ('LIBTOOL'); | ||||
2578 | |||||||
2579 | # Libtool requires some files, but only at top level. | ||||||
2580 | # (Starting with Libtool 2.0 we do not have to bother. These | ||||||
2581 | # requirements are done with AC_REQUIRE_AUX_FILE.) | ||||||
2582 | 0 | 0 | require_conf_file_with_macro (TRUE, 'LIBTOOL', FOREIGN, @libtool_files) | ||||
2583 | if $relative_dir eq '.' && ! $libtool_new_api; | ||||||
2584 | |||||||
2585 | 0 | 0 | my @libtool_rms; | ||||
2586 | 0 | 0 | foreach my $item (sort keys %libtool_clean_directories) | ||||
2587 | { | ||||||
2588 | 0 | 0 | my $dir = ($item eq '.') ? '' : "$item/"; | ||||
2589 | # .libs is for Unix, _libs for DOS. | ||||||
2590 | 0 | 0 | push (@libtool_rms, "\t-rm -rf ${dir}.libs ${dir}_libs"); | ||||
2591 | } | ||||||
2592 | |||||||
2593 | 0 | 0 | check_user_variables 'LIBTOOLFLAGS'; | ||||
2594 | |||||||
2595 | # Output the libtool compilation rules. | ||||||
2596 | 0 | 0 | $output_rules .= &file_contents ('libtool', | ||||
2597 | new Automake::Location, | ||||||
2598 | LTRMS => join ("\n", @libtool_rms)); | ||||||
2599 | } | ||||||
2600 | |||||||
2601 | # handle_programs () | ||||||
2602 | # ------------------ | ||||||
2603 | # Handle C programs. | ||||||
2604 | sub handle_programs | ||||||
2605 | { | ||||||
2606 | 0 | 0 | my @proglist = &am_install_var ('progs', 'PROGRAMS', | ||||
2607 | 'bin', 'sbin', 'libexec', 'pkglib', | ||||||
2608 | 'noinst', 'check'); | ||||||
2609 | 0 | 0 | return if ! @proglist; | ||||
2610 | |||||||
2611 | 0 | 0 | my $seen_global_libobjs = | ||||
2612 | var ('LDADD') && &handle_lib_objects ('', 'LDADD'); | ||||||
2613 | |||||||
2614 | 0 | 0 | foreach my $pair (@proglist) | ||||
2615 | { | ||||||
2616 | 0 | 0 | my ($where, $one_file) = @$pair; | ||||
2617 | |||||||
2618 | 0 | 0 | my $seen_libobjs = 0; | ||||
2619 | 0 | 0 | my $obj = get_object_extension '.$(OBJEXT)'; | ||||
2620 | |||||||
2621 | 0 | 0 | $known_programs{$one_file} = $where; | ||||
2622 | |||||||
2623 | # Canonicalize names and check for misspellings. | ||||||
2624 | 0 | 0 | my $xname = &check_canonical_spelling ($one_file, '_LDADD', '_LDFLAGS', | ||||
2625 | '_SOURCES', '_OBJECTS', | ||||||
2626 | '_DEPENDENCIES'); | ||||||
2627 | |||||||
2628 | 0 | 0 | $where->push_context ("while processing program `$one_file'"); | ||||
2629 | 0 | 0 | $where->set (INTERNAL->get); | ||||
2630 | |||||||
2631 | 0 | 0 | my $linker = &handle_source_transform ($xname, $one_file, $obj, $where, | ||||
2632 | NONLIBTOOL => 1, LIBTOOL => 0); | ||||||
2633 | |||||||
2634 | 0 | 0 | if (var ($xname . "_LDADD")) | ||||
2635 | { | ||||||
2636 | 0 | 0 | $seen_libobjs = &handle_lib_objects ($xname, $xname . '_LDADD'); | ||||
2637 | } | ||||||
2638 | else | ||||||
2639 | { | ||||||
2640 | # User didn't define prog_LDADD override. So do it. | ||||||
2641 | 0 | 0 | &define_variable ($xname . '_LDADD', '$(LDADD)', $where); | ||||
2642 | |||||||
2643 | # This does a bit too much work. But we need it to | ||||||
2644 | # generate _DEPENDENCIES when appropriate. | ||||||
2645 | 0 | 0 | if (var ('LDADD')) | ||||
2646 | { | ||||||
2647 | 0 | 0 | $seen_libobjs = &handle_lib_objects ($xname, 'LDADD'); | ||||
2648 | } | ||||||
2649 | } | ||||||
2650 | |||||||
2651 | 0 | 0 | reject_var ($xname . '_LIBADD', | ||||
2652 | "use `${xname}_LDADD', not `${xname}_LIBADD'"); | ||||||
2653 | |||||||
2654 | 0 | 0 | set_seen ($xname . '_DEPENDENCIES'); | ||||
2655 | 0 | 0 | set_seen ($xname . '_LDFLAGS'); | ||||
2656 | |||||||
2657 | # Determine program to use for link. | ||||||
2658 | 0 | 0 | my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xname); | ||||
2659 | 0 | 0 | $vlink = verbose_flag ($vlink || 'GEN'); | ||||
2660 | |||||||
2661 | # If the resulting program lies into a subdirectory, | ||||||
2662 | # make sure this directory will exist. | ||||||
2663 | 0 | 0 | my $dirstamp = require_build_directory_maybe ($one_file); | ||||
2664 | |||||||
2665 | 0 | 0 | $libtool_clean_directories{dirname ($one_file)} = 1; | ||||
2666 | |||||||
2667 | 0 | 0 | $output_rules .= &file_contents ('program', | ||||
2668 | $where, | ||||||
2669 | PROGRAM => $one_file, | ||||||
2670 | XPROGRAM => $xname, | ||||||
2671 | XLINK => $xlink, | ||||||
2672 | VERBOSE => $vlink, | ||||||
2673 | DIRSTAMP => $dirstamp, | ||||||
2674 | EXEEXT => '$(EXEEXT)'); | ||||||
2675 | |||||||
2676 | 0 | 0 | if ($seen_libobjs || $seen_global_libobjs) | ||||
2677 | { | ||||||
2678 | 0 | 0 | if (var ($xname . '_LDADD')) | ||||
2679 | { | ||||||
2680 | 0 | 0 | &check_libobjs_sources ($xname, $xname . '_LDADD'); | ||||
2681 | } | ||||||
2682 | elsif (var ('LDADD')) | ||||||
2683 | { | ||||||
2684 | 0 | 0 | &check_libobjs_sources ($xname, 'LDADD'); | ||||
2685 | } | ||||||
2686 | } | ||||||
2687 | } | ||||||
2688 | } | ||||||
2689 | |||||||
2690 | |||||||
2691 | # handle_libraries () | ||||||
2692 | # ------------------- | ||||||
2693 | # Handle libraries. | ||||||
2694 | sub handle_libraries | ||||||
2695 | { | ||||||
2696 | 0 | 0 | my @liblist = &am_install_var ('libs', 'LIBRARIES', | ||||
2697 | 'lib', 'pkglib', 'noinst', 'check'); | ||||||
2698 | 0 | 0 | return if ! @liblist; | ||||
2699 | |||||||
2700 | 0 | 0 | my @prefix = am_primary_prefixes ('LIBRARIES', 0, 'lib', 'pkglib', | ||||
2701 | 'noinst', 'check'); | ||||||
2702 | |||||||
2703 | 0 | 0 | if (@prefix) | ||||
2704 | { | ||||||
2705 | 0 | 0 | my $var = rvar ($prefix[0] . '_LIBRARIES'); | ||||
2706 | 0 | 0 | $var->requires_variables ('library used', 'RANLIB'); | ||||
2707 | } | ||||||
2708 | |||||||
2709 | 0 | 0 | &define_variable ('AR', 'ar', INTERNAL); | ||||
2710 | 0 | 0 | &define_variable ('ARFLAGS', 'cru', INTERNAL); | ||||
2711 | 0 | 0 | &define_verbose_tagvar ('AR'); | ||||
2712 | |||||||
2713 | 0 | 0 | foreach my $pair (@liblist) | ||||
2714 | { | ||||||
2715 | 0 | 0 | my ($where, $onelib) = @$pair; | ||||
2716 | |||||||
2717 | 0 | 0 | my $seen_libobjs = 0; | ||||
2718 | # Check that the library fits the standard naming convention. | ||||||
2719 | 0 | 0 | my $bn = basename ($onelib); | ||||
2720 | 0 | 0 | if ($bn !~ /^lib.*\.a$/) | ||||
2721 | { | ||||||
2722 | 0 | 0 | $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.a/; | ||||
2723 | 0 | 0 | my $suggestion = dirname ($onelib) . "/$bn"; | ||||
2724 | 0 | 0 | $suggestion =~ s|^\./||g; | ||||
2725 | 0 | 0 | msg ('error-gnu/warn', $where, | ||||
2726 | "`$onelib' is not a standard library name\n" | ||||||
2727 | . "did you mean `$suggestion'?") | ||||||
2728 | } | ||||||
2729 | |||||||
2730 | 0 | 0 | ($known_libraries{$onelib} = $bn) =~ s/\.a$//; | ||||
2731 | |||||||
2732 | 0 | 0 | $where->push_context ("while processing library `$onelib'"); | ||||
2733 | 0 | 0 | $where->set (INTERNAL->get); | ||||
2734 | |||||||
2735 | 0 | 0 | my $obj = get_object_extension '.$(OBJEXT)'; | ||||
2736 | |||||||
2737 | # Canonicalize names and check for misspellings. | ||||||
2738 | 0 | 0 | my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES', | ||||
2739 | '_OBJECTS', '_DEPENDENCIES', | ||||||
2740 | '_AR'); | ||||||
2741 | |||||||
2742 | 0 | 0 | if (! var ($xlib . '_AR')) | ||||
2743 | { | ||||||
2744 | 0 | 0 | &define_variable ($xlib . '_AR', '$(AR) $(ARFLAGS)', $where); | ||||
2745 | } | ||||||
2746 | |||||||
2747 | # Generate support for conditional object inclusion in | ||||||
2748 | # libraries. | ||||||
2749 | 0 | 0 | if (var ($xlib . '_LIBADD')) | ||||
2750 | { | ||||||
2751 | 0 | 0 | if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) | ||||
2752 | { | ||||||
2753 | 0 | 0 | $seen_libobjs = 1; | ||||
2754 | } | ||||||
2755 | } | ||||||
2756 | else | ||||||
2757 | { | ||||||
2758 | 0 | 0 | &define_variable ($xlib . "_LIBADD", '', $where); | ||||
2759 | } | ||||||
2760 | |||||||
2761 | 0 | 0 | reject_var ($xlib . '_LDADD', | ||||
2762 | "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); | ||||||
2763 | |||||||
2764 | # Make sure we at look at this. | ||||||
2765 | 0 | 0 | set_seen ($xlib . '_DEPENDENCIES'); | ||||
2766 | |||||||
2767 | 0 | 0 | &handle_source_transform ($xlib, $onelib, $obj, $where, | ||||
2768 | NONLIBTOOL => 1, LIBTOOL => 0); | ||||||
2769 | |||||||
2770 | # If the resulting library lies into a subdirectory, | ||||||
2771 | # make sure this directory will exist. | ||||||
2772 | 0 | 0 | my $dirstamp = require_build_directory_maybe ($onelib); | ||||
2773 | 0 | 0 | my $verbose = verbose_flag ('AR'); | ||||
2774 | 0 | 0 | my $silent = silent_flag (); | ||||
2775 | |||||||
2776 | 0 | 0 | $output_rules .= &file_contents ('library', | ||||
2777 | $where, | ||||||
2778 | VERBOSE => $verbose, | ||||||
2779 | SILENT => $silent, | ||||||
2780 | LIBRARY => $onelib, | ||||||
2781 | XLIBRARY => $xlib, | ||||||
2782 | DIRSTAMP => $dirstamp); | ||||||
2783 | |||||||
2784 | 0 | 0 | if ($seen_libobjs) | ||||
2785 | { | ||||||
2786 | 0 | 0 | if (var ($xlib . '_LIBADD')) | ||||
2787 | { | ||||||
2788 | 0 | 0 | &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); | ||||
2789 | } | ||||||
2790 | } | ||||||
2791 | } | ||||||
2792 | } | ||||||
2793 | |||||||
2794 | |||||||
2795 | # handle_ltlibraries () | ||||||
2796 | # --------------------- | ||||||
2797 | # Handle shared libraries. | ||||||
2798 | sub handle_ltlibraries | ||||||
2799 | { | ||||||
2800 | 0 | 0 | my @liblist = &am_install_var ('ltlib', 'LTLIBRARIES', | ||||
2801 | 'noinst', 'lib', 'pkglib', 'check'); | ||||||
2802 | 0 | 0 | return if ! @liblist; | ||||
2803 | |||||||
2804 | 0 | 0 | my @prefix = am_primary_prefixes ('LTLIBRARIES', 0, 'lib', 'pkglib', | ||||
2805 | 'noinst', 'check'); | ||||||
2806 | |||||||
2807 | 0 | 0 | if (@prefix) | ||||
2808 | { | ||||||
2809 | 0 | 0 | my $var = rvar ($prefix[0] . '_LTLIBRARIES'); | ||||
2810 | 0 | 0 | $var->requires_variables ('Libtool library used', 'LIBTOOL'); | ||||
2811 | } | ||||||
2812 | |||||||
2813 | 0 | 0 | my %instdirs = (); | ||||
2814 | 0 | 0 | my %instsubdirs = (); | ||||
2815 | 0 | 0 | my %instconds = (); | ||||
2816 | 0 | 0 | my %liblocations = (); # Location (in Makefile.am) of each library. | ||||
2817 | |||||||
2818 | 0 | 0 | foreach my $key (@prefix) | ||||
2819 | { | ||||||
2820 | # Get the installation directory of each library. | ||||||
2821 | 0 | 0 | my $dir = $key; | ||||
2822 | 0 | 0 | my $strip_subdir = 1; | ||||
2823 | 0 | 0 | if ($dir =~ /^nobase_/) | ||||
2824 | { | ||||||
2825 | 0 | 0 | $dir =~ s/^nobase_//; | ||||
2826 | 0 | 0 | $strip_subdir = 0; | ||||
2827 | } | ||||||
2828 | 0 | 0 | my $var = rvar ($key . '_LTLIBRARIES'); | ||||
2829 | |||||||
2830 | # We reject libraries which are installed in several places | ||||||
2831 | # in the same condition, because we can only specify one | ||||||
2832 | # `-rpath' option. | ||||||
2833 | $var->traverse_recursively | ||||||
2834 | (sub | ||||||
2835 | { | ||||||
2836 | 0 | 0 | my ($var, $val, $cond, $full_cond) = @_; | ||||
2837 | 0 | 0 | my $hcond = $full_cond->human; | ||||
2838 | 0 | 0 | my $where = $var->rdef ($cond)->location; | ||||
2839 | 0 | 0 | my $ldir = ''; | ||||
2840 | 0 | 0 | $ldir = '/' . dirname ($val) | ||||
2841 | if (!$strip_subdir); | ||||||
2842 | # A library cannot be installed in different directories | ||||||
2843 | # in overlapping conditions. | ||||||
2844 | 0 | 0 | if (exists $instconds{$val}) | ||||
2845 | { | ||||||
2846 | 0 | 0 | my ($msg, $acond) = | ||||
2847 | $instconds{$val}->ambiguous_p ($val, $full_cond); | ||||||
2848 | |||||||
2849 | 0 | 0 | if ($msg) | ||||
2850 | { | ||||||
2851 | 0 | 0 | error ($where, $msg, partial => 1); | ||||
2852 | 0 | 0 | my $dirtxt = "installed " . ($strip_subdir ? "in" : "below") . " `$dir'"; | ||||
2853 | 0 | 0 | $dirtxt = "built for `$dir'" | ||||
2854 | if $dir eq 'EXTRA' || $dir eq 'noinst' || $dir eq 'check'; | ||||||
2855 | 0 | 0 | my $dircond = | ||||
2856 | $full_cond->true ? "" : " in condition $hcond"; | ||||||
2857 | |||||||
2858 | 0 | 0 | error ($where, "`$val' should be $dirtxt$dircond ...", | ||||
2859 | partial => 1); | ||||||
2860 | |||||||
2861 | 0 | 0 | my $hacond = $acond->human; | ||||
2862 | 0 | 0 | my $adir = $instdirs{$val}{$acond}; | ||||
2863 | 0 | 0 | my $adirtxt = "installed in `$adir'"; | ||||
2864 | 0 | 0 | $adirtxt = "built for `$adir'" | ||||
2865 | if ($adir eq 'EXTRA' || $adir eq 'noinst' | ||||||
2866 | || $adir eq 'check'); | ||||||
2867 | 0 | 0 | my $adircond = $acond->true ? "" : " in condition $hacond"; | ||||
2868 | |||||||
2869 | 0 | 0 | my $onlyone = ($dir ne $adir) ? | ||||
2870 | ("\nLibtool libraries can be built for only one " | ||||||
2871 | . "destination.") : ""; | ||||||
2872 | |||||||
2873 | 0 | 0 | error ($liblocations{$val}{$acond}, | ||||
2874 | "... and should also be $adirtxt$adircond.$onlyone"); | ||||||
2875 | 0 | 0 | return; | ||||
2876 | } | ||||||
2877 | } | ||||||
2878 | else | ||||||
2879 | { | ||||||
2880 | 0 | 0 | $instconds{$val} = new Automake::DisjConditions; | ||||
2881 | } | ||||||
2882 | 0 | 0 | $instdirs{$val}{$full_cond} = $dir; | ||||
2883 | 0 | 0 | $instsubdirs{$val}{$full_cond} = $ldir; | ||||
2884 | 0 | 0 | $liblocations{$val}{$full_cond} = $where; | ||||
2885 | 0 | 0 | $instconds{$val} = $instconds{$val}->merge ($full_cond); | ||||
2886 | }, | ||||||
2887 | sub | ||||||
2888 | { | ||||||
2889 | 0 | 0 | return (); | ||||
2890 | }, | ||||||
2891 | 0 | 0 | skip_ac_subst => 1); | ||||
2892 | } | ||||||
2893 | |||||||
2894 | 0 | 0 | foreach my $pair (@liblist) | ||||
2895 | { | ||||||
2896 | 0 | 0 | my ($where, $onelib) = @$pair; | ||||
2897 | |||||||
2898 | 0 | 0 | my $seen_libobjs = 0; | ||||
2899 | 0 | 0 | my $obj = get_object_extension '.lo'; | ||||
2900 | |||||||
2901 | # Canonicalize names and check for misspellings. | ||||||
2902 | 0 | 0 | my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS', | ||||
2903 | '_SOURCES', '_OBJECTS', | ||||||
2904 | '_DEPENDENCIES'); | ||||||
2905 | |||||||
2906 | # Check that the library fits the standard naming convention. | ||||||
2907 | 0 | 0 | my $libname_rx = '^lib.*\.la'; | ||||
2908 | 0 | 0 | my $ldvar = var ("${xlib}_LDFLAGS") || var ('AM_LDFLAGS'); | ||||
2909 | 0 | 0 | my $ldvar2 = var ('LDFLAGS'); | ||||
2910 | 0 | 0 | if (($ldvar && grep (/-module/, $ldvar->value_as_list_recursive)) | ||||
2911 | || ($ldvar2 && grep (/-module/, $ldvar2->value_as_list_recursive))) | ||||||
2912 | { | ||||||
2913 | # Relax name checking for libtool modules. | ||||||
2914 | 0 | 0 | $libname_rx = '\.la'; | ||||
2915 | } | ||||||
2916 | |||||||
2917 | 0 | 0 | my $bn = basename ($onelib); | ||||
2918 | 0 | 0 | if ($bn !~ /$libname_rx$/) | ||||
2919 | { | ||||||
2920 | 0 | 0 | my $type = 'library'; | ||||
2921 | 0 | 0 | if ($libname_rx eq '\.la') | ||||
2922 | { | ||||||
2923 | 0 | 0 | $bn =~ s/^(lib|)(.*?)(?:\.[^.]*)?$/$1$2.la/; | ||||
2924 | 0 | 0 | $type = 'module'; | ||||
2925 | } | ||||||
2926 | else | ||||||
2927 | { | ||||||
2928 | 0 | 0 | $bn =~ s/^(?:lib)?(.*?)(?:\.[^.]*)?$/lib$1.la/; | ||||
2929 | } | ||||||
2930 | 0 | 0 | my $suggestion = dirname ($onelib) . "/$bn"; | ||||
2931 | 0 | 0 | $suggestion =~ s|^\./||g; | ||||
2932 | 0 | 0 | msg ('error-gnu/warn', $where, | ||||
2933 | "`$onelib' is not a standard libtool $type name\n" | ||||||
2934 | . "did you mean `$suggestion'?") | ||||||
2935 | } | ||||||
2936 | |||||||
2937 | 0 | 0 | ($known_libraries{$onelib} = $bn) =~ s/\.la$//; | ||||
2938 | |||||||
2939 | 0 | 0 | $where->push_context ("while processing Libtool library `$onelib'"); | ||||
2940 | 0 | 0 | $where->set (INTERNAL->get); | ||||
2941 | |||||||
2942 | # Make sure we look at these. | ||||||
2943 | 0 | 0 | set_seen ($xlib . '_LDFLAGS'); | ||||
2944 | 0 | 0 | set_seen ($xlib . '_DEPENDENCIES'); | ||||
2945 | |||||||
2946 | # Generate support for conditional object inclusion in | ||||||
2947 | # libraries. | ||||||
2948 | 0 | 0 | if (var ($xlib . '_LIBADD')) | ||||
2949 | { | ||||||
2950 | 0 | 0 | if (&handle_lib_objects ($xlib, $xlib . '_LIBADD')) | ||||
2951 | { | ||||||
2952 | 0 | 0 | $seen_libobjs = 1; | ||||
2953 | } | ||||||
2954 | } | ||||||
2955 | else | ||||||
2956 | { | ||||||
2957 | 0 | 0 | &define_variable ($xlib . "_LIBADD", '', $where); | ||||
2958 | } | ||||||
2959 | |||||||
2960 | 0 | 0 | reject_var ("${xlib}_LDADD", | ||||
2961 | "use `${xlib}_LIBADD', not `${xlib}_LDADD'"); | ||||||
2962 | |||||||
2963 | |||||||
2964 | 0 | 0 | my $linker = &handle_source_transform ($xlib, $onelib, $obj, $where, | ||||
2965 | NONLIBTOOL => 0, LIBTOOL => 1); | ||||||
2966 | |||||||
2967 | # Determine program to use for link. | ||||||
2968 | 0 | 0 | my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xlib); | ||||
2969 | 0 | 0 | $vlink = verbose_flag ($vlink || 'GEN'); | ||||
2970 | |||||||
2971 | 0 | 0 | my $rpathvar = "am_${xlib}_rpath"; | ||||
2972 | 0 | 0 | my $rpath = "\$($rpathvar)"; | ||||
2973 | 0 | 0 | foreach my $rcond ($instconds{$onelib}->conds) | ||||
2974 | { | ||||||
2975 | 0 | 0 | my $val; | ||||
2976 | 0 | 0 | if ($instdirs{$onelib}{$rcond} eq 'EXTRA' | ||||
2977 | || $instdirs{$onelib}{$rcond} eq 'noinst' | ||||||
2978 | || $instdirs{$onelib}{$rcond} eq 'check') | ||||||
2979 | { | ||||||
2980 | # It's an EXTRA_ library, so we can't specify -rpath, | ||||||
2981 | # because we don't know where the library will end up. | ||||||
2982 | # The user probably knows, but generally speaking automake | ||||||
2983 | # doesn't -- and in fact configure could decide | ||||||
2984 | # dynamically between two different locations. | ||||||
2985 | 0 | 0 | $val = ''; | ||||
2986 | } | ||||||
2987 | else | ||||||
2988 | { | ||||||
2989 | 0 | 0 | $val = ('-rpath $(' . $instdirs{$onelib}{$rcond} . 'dir)'); | ||||
2990 | 0 | 0 | $val .= $instsubdirs{$onelib}{$rcond} | ||||
2991 | if defined $instsubdirs{$onelib}{$rcond}; | ||||||
2992 | } | ||||||
2993 | 0 | 0 | if ($rcond->true) | ||||
2994 | { | ||||||
2995 | # If $rcond is true there is only one condition and | ||||||
2996 | # there is no point defining an helper variable. | ||||||
2997 | 0 | 0 | $rpath = $val; | ||||
2998 | } | ||||||
2999 | else | ||||||
3000 | { | ||||||
3001 | 0 | 0 | define_pretty_variable ($rpathvar, $rcond, INTERNAL, $val); | ||||
3002 | } | ||||||
3003 | } | ||||||
3004 | |||||||
3005 | # If the resulting library lies into a subdirectory, | ||||||
3006 | # make sure this directory will exist. | ||||||
3007 | 0 | 0 | my $dirstamp = require_build_directory_maybe ($onelib); | ||||
3008 | |||||||
3009 | # Remember to cleanup .libs/ in this directory. | ||||||
3010 | 0 | 0 | my $dirname = dirname $onelib; | ||||
3011 | 0 | 0 | $libtool_clean_directories{$dirname} = 1; | ||||
3012 | |||||||
3013 | 0 | 0 | $output_rules .= &file_contents ('ltlibrary', | ||||
3014 | $where, | ||||||
3015 | LTLIBRARY => $onelib, | ||||||
3016 | XLTLIBRARY => $xlib, | ||||||
3017 | RPATH => $rpath, | ||||||
3018 | XLINK => $xlink, | ||||||
3019 | VERBOSE => $vlink, | ||||||
3020 | DIRSTAMP => $dirstamp); | ||||||
3021 | 0 | 0 | if ($seen_libobjs) | ||||
3022 | { | ||||||
3023 | 0 | 0 | if (var ($xlib . '_LIBADD')) | ||||
3024 | { | ||||||
3025 | 0 | 0 | &check_libobjs_sources ($xlib, $xlib . '_LIBADD'); | ||||
3026 | } | ||||||
3027 | } | ||||||
3028 | } | ||||||
3029 | } | ||||||
3030 | |||||||
3031 | # See if any _SOURCES variable were misspelled. | ||||||
3032 | sub check_typos () | ||||||
3033 | { | ||||||
3034 | # It is ok if the user sets this particular variable. | ||||||
3035 | 0 | 0 | set_seen 'AM_LDFLAGS'; | ||||
3036 | |||||||
3037 | 0 | 0 | foreach my $primary ('SOURCES', 'LIBADD', 'LDADD', 'LDFLAGS', 'DEPENDENCIES') | ||||
3038 | { | ||||||
3039 | 0 | 0 | foreach my $var (variables $primary) | ||||
3040 | { | ||||||
3041 | 0 | 0 | my $varname = $var->name; | ||||
3042 | # A configure variable is always legitimate. | ||||||
3043 | 0 | 0 | next if exists $configure_vars{$varname}; | ||||
3044 | |||||||
3045 | 0 | 0 | for my $cond ($var->conditions->conds) | ||||
3046 | { | ||||||
3047 | 0 | 0 | $varname =~ /^(?:nobase_)?(?:dist_|nodist_)?(.*)_[[:alnum:]]+$/; | ||||
3048 | 0 | 0 | msg_var ('syntax', $var, "variable `$varname' is defined but no" | ||||
3049 | . " program or\nlibrary has `$1' as canonical name" | ||||||
3050 | . " (possible typo)") | ||||||
3051 | unless $var->rdef ($cond)->seen; | ||||||
3052 | } | ||||||
3053 | } | ||||||
3054 | } | ||||||
3055 | } | ||||||
3056 | |||||||
3057 | |||||||
3058 | # Handle scripts. | ||||||
3059 | sub handle_scripts | ||||||
3060 | { | ||||||
3061 | # NOTE we no longer automatically clean SCRIPTS, because it is | ||||||
3062 | # useful to sometimes distribute scripts verbatim. This happens | ||||||
3063 | # e.g. in Automake itself. | ||||||
3064 | 0 | 0 | &am_install_var ('-candist', 'scripts', 'SCRIPTS', | ||||
3065 | 'bin', 'sbin', 'libexec', 'pkgdata', | ||||||
3066 | 'noinst', 'check'); | ||||||
3067 | } | ||||||
3068 | |||||||
3069 | |||||||
3070 | |||||||
3071 | |||||||
3072 | ## ------------------------ ## | ||||||
3073 | ## Handling Texinfo files. ## | ||||||
3074 | ## ------------------------ ## | ||||||
3075 | |||||||
3076 | # ($OUTFILE, $VFILE, @CLEAN_FILES) | ||||||
3077 | # &scan_texinfo_file ($FILENAME) | ||||||
3078 | # ------------------------------ | ||||||
3079 | # $OUTFILE - name of the info file produced by $FILENAME. | ||||||
3080 | # $VFILE - name of the version.texi file used (undef if none). | ||||||
3081 | # @CLEAN_FILES - list of byproducts (indexes etc.) | ||||||
3082 | sub scan_texinfo_file ($) | ||||||
3083 | { | ||||||
3084 | 0 | 0 | my ($filename) = @_; | ||||
3085 | |||||||
3086 | # Some of the following extensions are always created, no matter | ||||||
3087 | # whether indexes are used or not. Other (like cps, fns, ... pgs) | ||||||
3088 | # are only created when they are used. We used to scan $FILENAME | ||||||
3089 | # for their use, but that is not enough: they could be used in | ||||||
3090 | # included files. We can't scan included files because we don't | ||||||
3091 | # know the include path. Therefore we always erase these files, no | ||||||
3092 | # matter whether they are used or not. | ||||||
3093 | # | ||||||
3094 | # (tmp is only created if an @macro is used and a certain e-TeX | ||||||
3095 | # feature is not available.) | ||||||
3096 | 0 | 0 | my %clean_suffixes = | ||||
3097 | 0 | 0 | map { $_ => 1 } (qw(aux log toc tmp | ||||
3098 | cp cps | ||||||
3099 | fn fns | ||||||
3100 | ky kys | ||||||
3101 | vr vrs | ||||||
3102 | tp tps | ||||||
3103 | pg pgs)); # grep 'new.*index' texinfo.tex | ||||||
3104 | |||||||
3105 | 0 | 0 | my $texi = new Automake::XFile "< $filename"; | ||||
3106 | 0 | 0 | verb "reading $filename"; | ||||
3107 | |||||||
3108 | 0 | 0 | my ($outfile, $vfile); | ||||
3109 | 0 | 0 | while ($_ = $texi->getline) | ||||
3110 | { | ||||||
3111 | 0 | 0 | if (/^\@setfilename +(\S+)/) | ||||
3112 | { | ||||||
3113 | # Honor only the first @setfilename. (It's possible to have | ||||||
3114 | # more occurrences later if the manual shows examples of how | ||||||
3115 | # to use @setfilename...) | ||||||
3116 | 0 | 0 | next if $outfile; | ||||
3117 | |||||||
3118 | 0 | 0 | $outfile = $1; | ||||
3119 | 0 | 0 | if ($outfile =~ /\.([^.]+)$/ && $1 ne 'info') | ||||
3120 | { | ||||||
3121 | 0 | 0 | error ("$filename:$.", | ||||
3122 | "output `$outfile' has unrecognized extension"); | ||||||
3123 | 0 | 0 | return; | ||||
3124 | } | ||||||
3125 | } | ||||||
3126 | # A "version.texi" file is actually any file whose name matches | ||||||
3127 | # "vers*.texi". | ||||||
3128 | elsif (/^\@include\s+(vers[^.]*\.texi)\s*$/) | ||||||
3129 | { | ||||||
3130 | 0 | 0 | $vfile = $1; | ||||
3131 | } | ||||||
3132 | |||||||
3133 | # Try to find new or unused indexes. | ||||||
3134 | |||||||
3135 | # Creating a new category of index. | ||||||
3136 | elsif (/^\@def(code)?index (\w+)/) | ||||||
3137 | { | ||||||
3138 | 0 | 0 | $clean_suffixes{$2} = 1; | ||||
3139 | 0 | 0 | $clean_suffixes{"$2s"} = 1; | ||||
3140 | } | ||||||
3141 | |||||||
3142 | # Merging an index into an another. | ||||||
3143 | elsif (/^\@syn(code)?index (\w+) (\w+)/) | ||||||
3144 | { | ||||||
3145 | 0 | 0 | delete $clean_suffixes{"$2s"}; | ||||
3146 | 0 | 0 | $clean_suffixes{"$3s"} = 1; | ||||
3147 | } | ||||||
3148 | |||||||
3149 | } | ||||||
3150 | |||||||
3151 | 0 | 0 | if (! $outfile) | ||||
3152 | { | ||||||
3153 | 0 | 0 | err_am "`$filename' missing \@setfilename"; | ||||
3154 | 0 | 0 | return; | ||||
3155 | } | ||||||
3156 | |||||||
3157 | 0 | 0 | my $infobase = basename ($filename); | ||||
3158 | 0 | 0 | $infobase =~ s/\.te?xi(nfo)?$//; | ||||
3159 | 0 | 0 | return ($outfile, $vfile, | ||||
3160 | 0 | 0 | map { "$infobase.$_" } (sort keys %clean_suffixes)); | ||||
3161 | } | ||||||
3162 | |||||||
3163 | |||||||
3164 | # ($DIRSTAMP, @CLEAN_FILES) | ||||||
3165 | # output_texinfo_build_rules ($SOURCE, $DEST, $INSRC, @DEPENDENCIES) | ||||||
3166 | # ------------------------------------------------------------------ | ||||||
3167 | # SOURCE - the source Texinfo file | ||||||
3168 | # DEST - the destination Info file | ||||||
3169 | # INSRC - wether DEST should be built in the source tree | ||||||
3170 | # DEPENDENCIES - known dependencies | ||||||
3171 | sub output_texinfo_build_rules ($$$@) | ||||||
3172 | { | ||||||
3173 | 0 | 0 | my ($source, $dest, $insrc, @deps) = @_; | ||||
3174 | |||||||
3175 | # Split `a.texi' into `a' and `.texi'. | ||||||
3176 | 0 | 0 | my ($spfx, $ssfx) = ($source =~ /^(.*?)(\.[^.]*)?$/); | ||||
3177 | 0 | 0 | my ($dpfx, $dsfx) = ($dest =~ /^(.*?)(\.[^.]*)?$/); | ||||
3178 | |||||||
3179 | 0 | 0 | $ssfx ||= ""; | ||||
3180 | 0 | 0 | $dsfx ||= ""; | ||||
3181 | |||||||
3182 | # We can output two kinds of rules: the "generic" rules use Make | ||||||
3183 | # suffix rules and are appropriate when $source and $dest do not lie | ||||||
3184 | # in a sub-directory; the "specific" rules are needed in the other | ||||||
3185 | # case. | ||||||
3186 | # | ||||||
3187 | # The former are output only once (this is not really apparent here, | ||||||
3188 | # but just remember that some logic deeper in Automake will not | ||||||
3189 | # output the same rule twice); while the later need to be output for | ||||||
3190 | # each Texinfo source. | ||||||
3191 | 0 | 0 | my $generic; | ||||
3192 | 0 | 0 | my $makeinfoflags; | ||||
3193 | 0 | 0 | my $sdir = dirname $source; | ||||
3194 | 0 | 0 | if ($sdir eq '.' && dirname ($dest) eq '.') | ||||
3195 | { | ||||||
3196 | 0 | 0 | $generic = 1; | ||||
3197 | 0 | 0 | $makeinfoflags = '-I $(srcdir)'; | ||||
3198 | } | ||||||
3199 | else | ||||||
3200 | { | ||||||
3201 | 0 | 0 | $generic = 0; | ||||
3202 | 0 | 0 | $makeinfoflags = "-I $sdir -I \$(srcdir)/$sdir"; | ||||
3203 | } | ||||||
3204 | |||||||
3205 | # A directory can contain two kinds of info files: some built in the | ||||||
3206 | # source tree, and some built in the build tree. The rules are | ||||||
3207 | # different in each case. However we cannot output two different | ||||||
3208 | # set of generic rules. Because in-source builds are more usual, we | ||||||
3209 | # use generic rules in this case and fall back to "specific" rules | ||||||
3210 | # for build-dir builds. (It should not be a problem to invert this | ||||||
3211 | # if needed.) | ||||||
3212 | 0 | 0 | $generic = 0 unless $insrc; | ||||
3213 | |||||||
3214 | # We cannot use a suffix rule to build info files with an empty | ||||||
3215 | # extension. Otherwise we would output a single suffix inference | ||||||
3216 | # rule, with separate dependencies, as in | ||||||
3217 | # | ||||||
3218 | # .texi: | ||||||
3219 | # $(MAKEINFO) ... | ||||||
3220 | # foo.info: foo.texi | ||||||
3221 | # | ||||||
3222 | # which confuse Solaris make. (See the Autoconf manual for | ||||||
3223 | # details.) Therefore we use a specific rule in this case. This | ||||||
3224 | # applies to info files only (dvi and pdf files always have an | ||||||
3225 | # extension). | ||||||
3226 | 0 | 0 | my $generic_info = ($generic && $dsfx) ? 1 : 0; | ||||
3227 | |||||||
3228 | # If the resulting file lie into a subdirectory, | ||||||
3229 | # make sure this directory will exist. | ||||||
3230 | 0 | 0 | my $dirstamp = require_build_directory_maybe ($dest); | ||||
3231 | |||||||
3232 | 0 | 0 | my $dipfx = ($insrc ? '$(srcdir)/' : '') . $dpfx; | ||||
3233 | |||||||
3234 | 0 | 0 | $output_rules .= file_contents ('texibuild', | ||||
3235 | new Automake::Location, | ||||||
3236 | DEPS => "@deps", | ||||||
3237 | DEST_PREFIX => $dpfx, | ||||||
3238 | DEST_INFO_PREFIX => $dipfx, | ||||||
3239 | DEST_SUFFIX => $dsfx, | ||||||
3240 | DIRSTAMP => $dirstamp, | ||||||
3241 | GENERIC => $generic, | ||||||
3242 | GENERIC_INFO => $generic_info, | ||||||
3243 | INSRC => $insrc, | ||||||
3244 | MAKEINFOFLAGS => $makeinfoflags, | ||||||
3245 | SOURCE => ($generic | ||||||
3246 | ? '$<' : $source), | ||||||
3247 | SOURCE_INFO => ($generic_info | ||||||
3248 | ? '$<' : $source), | ||||||
3249 | SOURCE_REAL => $source, | ||||||
3250 | SOURCE_SUFFIX => $ssfx, | ||||||
3251 | ); | ||||||
3252 | 0 | 0 | return ($dirstamp, "$dpfx.dvi", "$dpfx.pdf", "$dpfx.ps", "$dpfx.html"); | ||||
3253 | } | ||||||
3254 | |||||||
3255 | |||||||
3256 | # ($MOSTLYCLEAN, $TEXICLEAN, $MAINTCLEAN) | ||||||
3257 | # handle_texinfo_helper ($info_texinfos) | ||||||
3258 | # -------------------------------------- | ||||||
3259 | # Handle all Texinfo source; helper for handle_texinfo. | ||||||
3260 | sub handle_texinfo_helper ($) | ||||||
3261 | { | ||||||
3262 | 0 | 0 | my ($info_texinfos) = @_; | ||||
3263 | 0 | 0 | my (@infobase, @info_deps_list, @texi_deps); | ||||
3264 | 0 | 0 | my %versions; | ||||
3265 | 0 | 0 | my $done = 0; | ||||
3266 | 0 | 0 | my (@mostly_cleans, @texi_cleans, @maint_cleans) = ('', '', ''); | ||||
3267 | |||||||
3268 | # Build a regex matching user-cleaned files. | ||||||
3269 | 0 | 0 | my $d = var 'DISTCLEANFILES'; | ||||
3270 | 0 | 0 | my $c = var 'CLEANFILES'; | ||||
3271 | 0 | 0 | my @f = (); | ||||
3272 | 0 | 0 | push @f, $d->value_as_list_recursive (inner_expand => 1) if $d; | ||||
3273 | 0 | 0 | push @f, $c->value_as_list_recursive (inner_expand => 1) if $c; | ||||
3274 | 0 0 0 0 | 0 0 0 0 | @f = map { s|[^A-Za-z_0-9*\[\]\-]|\\$&|g; s|\*|[^/]*|g; $_; } @f; | ||||
3275 | 0 | 0 | my $user_cleaned_files = '^(?:' . join ('|', @f) . ')$'; | ||||
3276 | |||||||
3277 | 0 | 0 | foreach my $texi | ||||
3278 | ($info_texinfos->value_as_list_recursive (inner_expand => 1)) | ||||||
3279 | { | ||||||
3280 | 0 | 0 | my $infobase = $texi; | ||||
3281 | 0 | 0 | $infobase =~ s/\.(txi|texinfo|texi)$//; | ||||
3282 | |||||||
3283 | 0 | 0 | if ($infobase eq $texi) | ||||
3284 | { | ||||||
3285 | # FIXME: report line number. | ||||||
3286 | 0 | 0 | err_am "texinfo file `$texi' has unrecognized extension"; | ||||
3287 | 0 | 0 | next; | ||||
3288 | } | ||||||
3289 | |||||||
3290 | 0 | 0 | push @infobase, $infobase; | ||||
3291 | |||||||
3292 | # If 'version.texi' is referenced by input file, then include | ||||||
3293 | # automatic versioning capability. | ||||||
3294 | 0 | 0 | my ($out_file, $vtexi, @clean_files) = | ||||
3295 | scan_texinfo_file ("$relative_dir/$texi") | ||||||
3296 | or next; | ||||||
3297 | 0 | 0 | push (@mostly_cleans, @clean_files); | ||||
3298 | |||||||
3299 | # If the Texinfo source is in a subdirectory, create the | ||||||
3300 | # resulting info in this subdirectory. If it is in the current | ||||||
3301 | # directory, try hard to not prefix "./" because it breaks the | ||||||
3302 | # generic rules. | ||||||
3303 | 0 | 0 | my $outdir = dirname ($texi) . '/'; | ||||
3304 | 0 | 0 | $outdir = "" if $outdir eq './'; | ||||
3305 | 0 | 0 | $out_file = $outdir . $out_file; | ||||
3306 | |||||||
3307 | # Until Automake 1.6.3, .info files were built in the | ||||||
3308 | # source tree. This was an obstacle to the support of | ||||||
3309 | # non-distributed .info files, and non-distributed .texi | ||||||
3310 | # files. | ||||||
3311 | # | ||||||
3312 | # * Non-distributed .texi files is important in some packages | ||||||
3313 | # where .texi files are built at make time, probably using | ||||||
3314 | # other binaries built in the package itself, maybe using | ||||||
3315 | # tools or information found on the build host. Because | ||||||
3316 | # these files are not distributed they are always rebuilt | ||||||
3317 | # at make time; they should therefore not lie in the source | ||||||
3318 | # directory. One plan was to support this using | ||||||
3319 | # nodist_info_TEXINFOS or something similar. (Doing this | ||||||
3320 | # requires some sanity checks. For instance Automake should | ||||||
3321 | # not allow: | ||||||
3322 | # dist_info_TEXINFOS = foo.texi | ||||||
3323 | # nodist_foo_TEXINFOS = included.texi | ||||||
3324 | # because a distributed file should never depend on a | ||||||
3325 | # non-distributed file.) | ||||||
3326 | # | ||||||
3327 | # * If .texi files are not distributed, then .info files should | ||||||
3328 | # not be distributed either. There are also cases where one | ||||||
3329 | # wants to distribute .texi files, but does not want to | ||||||
3330 | # distribute the .info files. For instance the Texinfo package | ||||||
3331 | # distributes the tool used to build these files; it would | ||||||
3332 | # be a waste of space to distribute them. It's not clear | ||||||
3333 | # which syntax we should use to indicate that .info files should | ||||||
3334 | # not be distributed. Akim Demaille suggested that eventually | ||||||
3335 | # we switch to a new syntax: | ||||||
3336 | # | Maybe we should take some inspiration from what's already | ||||||
3337 | # | done in the rest of Automake. Maybe there is too much | ||||||
3338 | # | syntactic sugar here, and you want | ||||||
3339 | # | nodist_INFO = bar.info | ||||||
3340 | # | dist_bar_info_SOURCES = bar.texi | ||||||
3341 | # | bar_texi_DEPENDENCIES = foo.texi | ||||||
3342 | # | with a bit of magic to have bar.info represent the whole | ||||||
3343 | # | bar*info set. That's a lot more verbose that the current | ||||||
3344 | # | situation, but it is # not new, hence the user has less | ||||||
3345 | # | to learn. | ||||||
3346 | # | | ||||||
3347 | # | But there is still too much room for meaningless specs: | ||||||
3348 | # | nodist_INFO = bar.info | ||||||
3349 | # | dist_bar_info_SOURCES = bar.texi | ||||||
3350 | # | dist_PS = bar.ps something-written-by-hand.ps | ||||||
3351 | # | nodist_bar_ps_SOURCES = bar.texi | ||||||
3352 | # | bar_texi_DEPENDENCIES = foo.texi | ||||||
3353 | # | here bar.texi is dist_ in line 2, and nodist_ in 4. | ||||||
3354 | # | ||||||
3355 | # Back to the point, it should be clear that in order to support | ||||||
3356 | # non-distributed .info files, we need to build them in the | ||||||
3357 | # build tree, not in the source tree (non-distributed .texi | ||||||
3358 | # files are less of a problem, because we do not output build | ||||||
3359 | # rules for them). In Automake 1.7 .info build rules have been | ||||||
3360 | # largely cleaned up so that .info files get always build in the | ||||||
3361 | # build tree, even when distributed. The idea was that | ||||||
3362 | # (1) if during a VPATH build the .info file was found to be | ||||||
3363 | # absent or out-of-date (in the source tree or in the | ||||||
3364 | # build tree), Make would rebuild it in the build tree. | ||||||
3365 | # If an up-to-date source-tree of the .info file existed, | ||||||
3366 | # make would not rebuild it in the build tree. | ||||||
3367 | # (2) having two copies of .info files, one in the source tree | ||||||
3368 | # and one (newer) in the build tree is not a problem | ||||||
3369 | # because `make dist' always pick files in the build tree | ||||||
3370 | # first. | ||||||
3371 | # However it turned out the be a bad idea for several reasons: | ||||||
3372 | # * Tru64, OpenBSD, and FreeBSD (not NetBSD) Make do not behave | ||||||
3373 | # like GNU Make on point (1) above. These implementations | ||||||
3374 | # of Make would always rebuild .info files in the build | ||||||
3375 | # tree, even if such files were up to date in the source | ||||||
3376 | # tree. Consequently, it was impossible to perform a VPATH | ||||||
3377 | # build of a package containing Texinfo files using these | ||||||
3378 | # Make implementations. | ||||||
3379 | # (Refer to the Autoconf Manual, section "Limitation of | ||||||
3380 | # Make", paragraph "VPATH", item "target lookup", for | ||||||
3381 | # an account of the differences between these | ||||||
3382 | # implementations.) | ||||||
3383 | # * The GNU Coding Standards require these files to be built | ||||||
3384 | # in the source-tree (when they are distributed, that is). | ||||||
3385 | # * Keeping a fresher copy of distributed files in the | ||||||
3386 | # build tree can be annoying during development because | ||||||
3387 | # - if the files is kept under CVS, you really want it | ||||||
3388 | # to be updated in the source tree | ||||||
3389 | # - it is confusing that `make distclean' does not erase | ||||||
3390 | # all files in the build tree. | ||||||
3391 | # | ||||||
3392 | # Consequently, starting with Automake 1.8, .info files are | ||||||
3393 | # built in the source tree again. Because we still plan to | ||||||
3394 | # support non-distributed .info files at some point, we | ||||||
3395 | # have a single variable ($INSRC) that controls whether | ||||||
3396 | # the current .info file must be built in the source tree | ||||||
3397 | # or in the build tree. Actually this variable is switched | ||||||
3398 | # off for .info files that appear to be cleaned; this is | ||||||
3399 | # for backward compatibility with package such as Texinfo, | ||||||
3400 | # which do things like | ||||||
3401 | # info_TEXINFOS = texinfo.txi info-stnd.texi info.texi | ||||||
3402 | # DISTCLEANFILES = texinfo texinfo-* info*.info* | ||||||
3403 | # # Do not create info files for distribution. | ||||||
3404 | # dist-info: | ||||||
3405 | # in order not to distribute .info files. | ||||||
3406 | 0 | 0 | my $insrc = ($out_file =~ $user_cleaned_files) ? 0 : 1; | ||||
3407 | |||||||
3408 | 0 | 0 | my $soutdir = '$(srcdir)/' . $outdir; | ||||
3409 | 0 | 0 | $outdir = $soutdir if $insrc; | ||||
3410 | |||||||
3411 | # If user specified file_TEXINFOS, then use that as explicit | ||||||
3412 | # dependency list. | ||||||
3413 | 0 | 0 | @texi_deps = (); | ||||
3414 | 0 | 0 | push (@texi_deps, "$soutdir$vtexi") if $vtexi; | ||||
3415 | |||||||
3416 | 0 | 0 | my $canonical = canonicalize ($infobase); | ||||
3417 | 0 | 0 | if (var ($canonical . "_TEXINFOS")) | ||||
3418 | { | ||||||
3419 | 0 | 0 | push (@texi_deps, '$(' . $canonical . '_TEXINFOS)'); | ||||
3420 | 0 | 0 | push_dist_common ('$(' . $canonical . '_TEXINFOS)'); | ||||
3421 | } | ||||||
3422 | |||||||
3423 | 0 | 0 | my ($dirstamp, @cfiles) = | ||||
3424 | output_texinfo_build_rules ($texi, $out_file, $insrc, @texi_deps); | ||||||
3425 | 0 | 0 | push (@texi_cleans, @cfiles); | ||||
3426 | |||||||
3427 | 0 | 0 | push (@info_deps_list, $out_file); | ||||
3428 | |||||||
3429 | # If a vers*.texi file is needed, emit the rule. | ||||||
3430 | 0 | 0 | if ($vtexi) | ||||
3431 | { | ||||||
3432 | 0 | 0 | err_am ("`$vtexi', included in `$texi', " | ||||
3433 | . "also included in `$versions{$vtexi}'") | ||||||
3434 | if defined $versions{$vtexi}; | ||||||
3435 | 0 | 0 | $versions{$vtexi} = $texi; | ||||
3436 | |||||||
3437 | # We number the stamp-vti files. This is doable since the | ||||||
3438 | # actual names don't matter much. We only number starting | ||||||
3439 | # with the second one, so that the common case looks nice. | ||||||
3440 | 0 | 0 | my $vti = ($done ? $done : 'vti'); | ||||
3441 | 0 | 0 | ++$done; | ||||
3442 | |||||||
3443 | # This is ugly, but it is our historical practice. | ||||||
3444 | 0 | 0 | if ($config_aux_dir_set_in_configure_ac) | ||||
3445 | { | ||||||
3446 | 0 | 0 | require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, | ||||
3447 | 'mdate-sh'); | ||||||
3448 | } | ||||||
3449 | else | ||||||
3450 | { | ||||||
3451 | 0 | 0 | require_file_with_macro (TRUE, 'info_TEXINFOS', | ||||
3452 | FOREIGN, 'mdate-sh'); | ||||||
3453 | } | ||||||
3454 | |||||||
3455 | 0 | 0 | my $conf_dir; | ||||
3456 | 0 | 0 | if ($config_aux_dir_set_in_configure_ac) | ||||
3457 | { | ||||||
3458 | 0 | 0 | $conf_dir = "$am_config_aux_dir/"; | ||||
3459 | } | ||||||
3460 | else | ||||||
3461 | { | ||||||
3462 | 0 | 0 | $conf_dir = '$(srcdir)/'; | ||||
3463 | } | ||||||
3464 | 0 | 0 | $output_rules .= file_contents ('texi-vers', | ||||
3465 | new Automake::Location, | ||||||
3466 | TEXI => $texi, | ||||||
3467 | VTI => $vti, | ||||||
3468 | STAMPVTI => "${soutdir}stamp-$vti", | ||||||
3469 | VTEXI => "$soutdir$vtexi", | ||||||
3470 | MDDIR => $conf_dir, | ||||||
3471 | DIRSTAMP => $dirstamp); | ||||||
3472 | } | ||||||
3473 | } | ||||||
3474 | |||||||
3475 | # Handle location of texinfo.tex. | ||||||
3476 | 0 | 0 | my $need_texi_file = 0; | ||||
3477 | 0 | 0 | my $texinfodir; | ||||
3478 | 0 | 0 | if (var ('TEXINFO_TEX')) | ||||
3479 | { | ||||||
3480 | # The user defined TEXINFO_TEX so assume he knows what he is | ||||||
3481 | # doing. | ||||||
3482 | 0 | 0 | $texinfodir = ('$(srcdir)/' | ||||
3483 | . dirname (variable_value ('TEXINFO_TEX'))); | ||||||
3484 | } | ||||||
3485 | elsif (option 'cygnus') | ||||||
3486 | { | ||||||
3487 | 0 | 0 | $texinfodir = '$(top_srcdir)/../texinfo'; | ||||
3488 | 0 | 0 | define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL); | ||||
3489 | } | ||||||
3490 | elsif ($config_aux_dir_set_in_configure_ac) | ||||||
3491 | { | ||||||
3492 | 0 | 0 | $texinfodir = $am_config_aux_dir; | ||||
3493 | 0 | 0 | define_variable ('TEXINFO_TEX', "$texinfodir/texinfo.tex", INTERNAL); | ||||
3494 | 0 | 0 | $need_texi_file = 2; # so that we require_conf_file later | ||||
3495 | } | ||||||
3496 | else | ||||||
3497 | { | ||||||
3498 | 0 | 0 | $texinfodir = '$(srcdir)'; | ||||
3499 | 0 | 0 | $need_texi_file = 1; | ||||
3500 | } | ||||||
3501 | 0 | 0 | define_variable ('am__TEXINFO_TEX_DIR', $texinfodir, INTERNAL); | ||||
3502 | |||||||
3503 | 0 | 0 | push (@dist_targets, 'dist-info'); | ||||
3504 | |||||||
3505 | 0 | 0 | if (! option 'no-installinfo') | ||||
3506 | { | ||||||
3507 | # Make sure documentation is made and installed first. Use | ||||||
3508 | # $(INFO_DEPS), not 'info', because otherwise recursive makes | ||||||
3509 | # get run twice during "make all". | ||||||
3510 | 0 | 0 | unshift (@all, '$(INFO_DEPS)'); | ||||
3511 | } | ||||||
3512 | |||||||
3513 | 0 | 0 | define_files_variable ("DVIS", @infobase, 'dvi', INTERNAL); | ||||
3514 | 0 | 0 | define_files_variable ("PDFS", @infobase, 'pdf', INTERNAL); | ||||
3515 | 0 | 0 | define_files_variable ("PSS", @infobase, 'ps', INTERNAL); | ||||
3516 | 0 | 0 | define_files_variable ("HTMLS", @infobase, 'html', INTERNAL); | ||||
3517 | |||||||
3518 | # This next isn't strictly needed now -- the places that look here | ||||||
3519 | # could easily be changed to look in info_TEXINFOS. But this is | ||||||
3520 | # probably better, in case noinst_TEXINFOS is ever supported. | ||||||
3521 | 0 | 0 | define_variable ("TEXINFOS", variable_value ('info_TEXINFOS'), INTERNAL); | ||||
3522 | |||||||
3523 | # Do some error checking. Note that this file is not required | ||||||
3524 | # when in Cygnus mode; instead we defined TEXINFO_TEX explicitly | ||||||
3525 | # up above. | ||||||
3526 | 0 | 0 | if ($need_texi_file && ! option 'no-texinfo.tex') | ||||
3527 | { | ||||||
3528 | 0 | 0 | if ($need_texi_file > 1) | ||||
3529 | { | ||||||
3530 | 0 | 0 | require_conf_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, | ||||
3531 | 'texinfo.tex'); | ||||||
3532 | } | ||||||
3533 | else | ||||||
3534 | { | ||||||
3535 | 0 | 0 | require_file_with_macro (TRUE, 'info_TEXINFOS', FOREIGN, | ||||
3536 | 'texinfo.tex'); | ||||||
3537 | } | ||||||
3538 | } | ||||||
3539 | |||||||
3540 | 0 | 0 | return (makefile_wrap ("", "\t ", @mostly_cleans), | ||||
3541 | makefile_wrap ("", "\t ", @texi_cleans), | ||||||
3542 | makefile_wrap ("", "\t ", @maint_cleans)); | ||||||
3543 | } | ||||||
3544 | |||||||
3545 | |||||||
3546 | # handle_texinfo () | ||||||
3547 | # ----------------- | ||||||
3548 | # Handle all Texinfo source. | ||||||
3549 | sub handle_texinfo () | ||||||
3550 | { | ||||||
3551 | 0 | 0 | reject_var 'TEXINFOS', "`TEXINFOS' is an anachronism; use `info_TEXINFOS'"; | ||||
3552 | # FIXME: I think this is an obsolete future feature name. | ||||||
3553 | 0 | 0 | reject_var 'html_TEXINFOS', "HTML generation not yet supported"; | ||||
3554 | |||||||
3555 | 0 | 0 | my $info_texinfos = var ('info_TEXINFOS'); | ||||
3556 | 0 | 0 | my ($mostlyclean, $clean, $maintclean) = ('', '', ''); | ||||
3557 | 0 | 0 | if ($info_texinfos) | ||||
3558 | { | ||||||
3559 | 0 | 0 | ($mostlyclean, $clean, $maintclean) = handle_texinfo_helper ($info_texinfos); | ||||
3560 | 0 | 0 | chomp $mostlyclean; | ||||
3561 | 0 | 0 | chomp $clean; | ||||
3562 | 0 | 0 | chomp $maintclean; | ||||
3563 | } | ||||||
3564 | |||||||
3565 | 0 | 0 | $output_rules .= file_contents ('texinfos', | ||||
3566 | new Automake::Location, | ||||||
3567 | MOSTLYCLEAN => $mostlyclean, | ||||||
3568 | TEXICLEAN => $clean, | ||||||
3569 | MAINTCLEAN => $maintclean, | ||||||
3570 | 'LOCAL-TEXIS' => !!$info_texinfos); | ||||||
3571 | } | ||||||
3572 | |||||||
3573 | |||||||
3574 | # Handle any man pages. | ||||||
3575 | sub handle_man_pages | ||||||
3576 | { | ||||||
3577 | 0 | 0 | reject_var 'MANS', "`MANS' is an anachronism; use `man_MANS'"; | ||||
3578 | |||||||
3579 | # Find all the sections in use. We do this by first looking for | ||||||
3580 | # "standard" sections, and then looking for any additional | ||||||
3581 | # sections used in man_MANS. | ||||||
3582 | 0 | 0 | my (%sections, %notrans_sections, %trans_sections, | ||||
3583 | %notrans_vars, %trans_vars, %notrans_sect_vars, %trans_sect_vars); | ||||||
3584 | # We handle nodist_ for uniformity. man pages aren't distributed | ||||||
3585 | # by default so it isn't actually very important. | ||||||
3586 | 0 | 0 | foreach my $npfx ('', 'notrans_') | ||||
3587 | { | ||||||
3588 | 0 | 0 | foreach my $pfx ('', 'dist_', 'nodist_') | ||||
3589 | { | ||||||
3590 | # Add more sections as needed. | ||||||
3591 | 0 | 0 | foreach my $section ('0'..'9', 'n', 'l') | ||||
3592 | { | ||||||
3593 | 0 | 0 | my $varname = $npfx . $pfx . 'man' . $section . '_MANS'; | ||||
3594 | 0 | 0 | if (var ($varname)) | ||||
3595 | { | ||||||
3596 | 0 | 0 | $sections{$section} = 1; | ||||
3597 | 0 | 0 | $varname = '$(' . $varname . ')'; | ||||
3598 | 0 | 0 | if ($npfx eq 'notrans_') | ||||
3599 | { | ||||||
3600 | 0 | 0 | $notrans_sections{$section} = 1; | ||||
3601 | 0 | 0 | $notrans_sect_vars{$varname} = 1; | ||||
3602 | } | ||||||
3603 | else | ||||||
3604 | { | ||||||
3605 | 0 | 0 | $trans_sections{$section} = 1; | ||||
3606 | 0 | 0 | $trans_sect_vars{$varname} = 1; | ||||
3607 | } | ||||||
3608 | |||||||
3609 | 0 | 0 | &push_dist_common ($varname) | ||||
3610 | if $pfx eq 'dist_'; | ||||||
3611 | } | ||||||
3612 | } | ||||||
3613 | |||||||
3614 | 0 | 0 | my $varname = $npfx . $pfx . 'man_MANS'; | ||||
3615 | 0 | 0 | my $var = var ($varname); | ||||
3616 | 0 | 0 | if ($var) | ||||
3617 | { | ||||||
3618 | 0 | 0 | foreach ($var->value_as_list_recursive) | ||||
3619 | { | ||||||
3620 | # A page like `foo.1c' goes into man1dir. | ||||||
3621 | 0 | 0 | if (/\.([0-9a-z])([a-z]*)$/) | ||||
3622 | { | ||||||
3623 | 0 | 0 | $sections{$1} = 1; | ||||
3624 | 0 | 0 | if ($npfx eq 'notrans_') | ||||
3625 | { | ||||||
3626 | 0 | 0 | $notrans_sections{$1} = 1; | ||||
3627 | } | ||||||
3628 | else | ||||||
3629 | { | ||||||
3630 | 0 | 0 | $trans_sections{$1} = 1; | ||||
3631 | } | ||||||
3632 | } | ||||||
3633 | } | ||||||
3634 | |||||||
3635 | 0 | 0 | $varname = '$(' . $varname . ')'; | ||||
3636 | 0 | 0 | if ($npfx eq 'notrans_') | ||||
3637 | { | ||||||
3638 | 0 | 0 | $notrans_vars{$varname} = 1; | ||||
3639 | } | ||||||
3640 | else | ||||||
3641 | { | ||||||
3642 | 0 | 0 | $trans_vars{$varname} = 1; | ||||
3643 | } | ||||||
3644 | 0 | 0 | &push_dist_common ($varname) | ||||
3645 | if $pfx eq 'dist_'; | ||||||
3646 | } | ||||||
3647 | } | ||||||
3648 | } | ||||||
3649 | |||||||
3650 | 0 | 0 | return unless %sections; | ||||
3651 | |||||||
3652 | 0 | 0 | my @unsorted_deps; | ||||
3653 | |||||||
3654 | # Build section independent variables. | ||||||
3655 | 0 | 0 | my $have_notrans = %notrans_vars; | ||||
3656 | 0 | 0 | my @notrans_list = sort keys %notrans_vars; | ||||
3657 | 0 | 0 | my $have_trans = %trans_vars; | ||||
3658 | 0 | 0 | my @trans_list = sort keys %trans_vars; | ||||
3659 | |||||||
3660 | # Now for each section, generate an install and uninstall rule. | ||||||
3661 | # Sort sections so output is deterministic. | ||||||
3662 | 0 | 0 | foreach my $section (sort keys %sections) | ||||
3663 | { | ||||||
3664 | # Build section dependent variables. | ||||||
3665 | 0 | 0 | my $notrans_mans = $have_notrans || exists $notrans_sections{$section}; | ||||
3666 | 0 | 0 | my $trans_mans = $have_trans || exists $trans_sections{$section}; | ||||
3667 | 0 | 0 | my (%notrans_this_sect, %trans_this_sect); | ||||
3668 | 0 | 0 | my $expr = 'man' . $section . '_MANS'; | ||||
3669 | 0 | 0 | foreach my $varname (keys %notrans_sect_vars) | ||||
3670 | { | ||||||
3671 | 0 | 0 | if ($varname =~ /$expr/) | ||||
3672 | { | ||||||
3673 | 0 | 0 | $notrans_this_sect{$varname} = 1; | ||||
3674 | } | ||||||
3675 | } | ||||||
3676 | 0 | 0 | foreach my $varname (keys %trans_sect_vars) | ||||
3677 | { | ||||||
3678 | 0 | 0 | if ($varname =~ /$expr/) | ||||
3679 | { | ||||||
3680 | 0 | 0 | $trans_this_sect{$varname} = 1; | ||||
3681 | } | ||||||
3682 | } | ||||||
3683 | 0 | 0 | my @notrans_sect_list = sort keys %notrans_this_sect; | ||||
3684 | 0 | 0 | my @trans_sect_list = sort keys %trans_this_sect; | ||||
3685 | 0 | 0 | @unsorted_deps = (keys %notrans_vars, keys %trans_vars, | ||||
3686 | keys %notrans_this_sect, keys %trans_this_sect); | ||||||
3687 | 0 | 0 | my @deps = sort @unsorted_deps; | ||||
3688 | 0 | 0 | $output_rules .= &file_contents ('mans', | ||||
3689 | new Automake::Location, | ||||||
3690 | SECTION => $section, | ||||||
3691 | DEPS => "@deps", | ||||||
3692 | NOTRANS_MANS => $notrans_mans, | ||||||
3693 | NOTRANS_SECT_LIST => "@notrans_sect_list", | ||||||
3694 | HAVE_NOTRANS => $have_notrans, | ||||||
3695 | NOTRANS_LIST => "@notrans_list", | ||||||
3696 | TRANS_MANS => $trans_mans, | ||||||
3697 | TRANS_SECT_LIST => "@trans_sect_list", | ||||||
3698 | HAVE_TRANS => $have_trans, | ||||||
3699 | TRANS_LIST => "@trans_list"); | ||||||
3700 | } | ||||||
3701 | |||||||
3702 | 0 | 0 | @unsorted_deps = (keys %notrans_vars, keys %trans_vars, | ||||
3703 | keys %notrans_sect_vars, keys %trans_sect_vars); | ||||||
3704 | 0 | 0 | my @mans = sort @unsorted_deps; | ||||
3705 | 0 | 0 | $output_vars .= file_contents ('mans-vars', | ||||
3706 | new Automake::Location, | ||||||
3707 | MANS => "@mans"); | ||||||
3708 | |||||||
3709 | 0 | 0 | push (@all, '$(MANS)') | ||||
3710 | unless option 'no-installman'; | ||||||
3711 | } | ||||||
3712 | |||||||
3713 | # Handle DATA variables. | ||||||
3714 | sub handle_data | ||||||
3715 | { | ||||||
3716 | 0 | 0 | &am_install_var ('-noextra', '-candist', 'data', 'DATA', | ||||
3717 | 'data', 'dataroot', 'dvi', 'html', 'pdf', 'ps', | ||||||
3718 | 'sysconf', 'sharedstate', 'localstate', | ||||||
3719 | 'pkgdata', 'lisp', 'noinst', 'check'); | ||||||
3720 | } | ||||||
3721 | |||||||
3722 | # Handle TAGS. | ||||||
3723 | sub handle_tags | ||||||
3724 | { | ||||||
3725 | 0 | 0 | my @tag_deps = (); | ||||
3726 | 0 | 0 | my @ctag_deps = (); | ||||
3727 | 0 | 0 | if (var ('SUBDIRS')) | ||||
3728 | { | ||||||
3729 | 0 | 0 | $output_rules .= ("tags-recursive:\n" | ||||
3730 | . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" | ||||||
3731 | # Never fail here if a subdir fails; it | ||||||
3732 | # isn't important. | ||||||
3733 | . "\t test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir" | ||||||
3734 | . " && \$(MAKE) \$(AM_MAKEFLAGS) tags); \\\n" | ||||||
3735 | . "\tdone\n"); | ||||||
3736 | 0 | 0 | push (@tag_deps, 'tags-recursive'); | ||||
3737 | 0 | 0 | &depend ('.PHONY', 'tags-recursive'); | ||||
3738 | 0 | 0 | &depend ('.MAKE', 'tags-recursive'); | ||||
3739 | |||||||
3740 | 0 | 0 | $output_rules .= ("ctags-recursive:\n" | ||||
3741 | . "\tlist=\'\$(SUBDIRS)\'; for subdir in \$\$list; do \\\n" | ||||||
3742 | # Never fail here if a subdir fails; it | ||||||
3743 | # isn't important. | ||||||
3744 | . "\t test \"\$\$subdir\" = . || (\$(am__cd) \$\$subdir" | ||||||
3745 | . " && \$(MAKE) \$(AM_MAKEFLAGS) ctags); \\\n" | ||||||
3746 | . "\tdone\n"); | ||||||
3747 | 0 | 0 | push (@ctag_deps, 'ctags-recursive'); | ||||
3748 | 0 | 0 | &depend ('.PHONY', 'ctags-recursive'); | ||||
3749 | 0 | 0 | &depend ('.MAKE', 'ctags-recursive'); | ||||
3750 | } | ||||||
3751 | |||||||
3752 | 0 | 0 | if (&saw_sources_p (1) | ||||
3753 | || var ('ETAGS_ARGS') | ||||||
3754 | || @tag_deps) | ||||||
3755 | { | ||||||
3756 | 0 | 0 | my @config; | ||||
3757 | 0 | 0 | foreach my $spec (@config_headers) | ||||
3758 | { | ||||||
3759 | 0 | 0 | my ($out, @ins) = split_config_file_spec ($spec); | ||||
3760 | 0 | 0 | foreach my $in (@ins) | ||||
3761 | { | ||||||
3762 | # If the config header source is in this directory, | ||||||
3763 | # require it. | ||||||
3764 | 0 | 0 | push @config, basename ($in) | ||||
3765 | if $relative_dir eq dirname ($in); | ||||||
3766 | } | ||||||
3767 | } | ||||||
3768 | 0 | 0 | $output_rules .= &file_contents ('tags', | ||||
3769 | new Automake::Location, | ||||||
3770 | CONFIG => "@config", | ||||||
3771 | TAGSDIRS => "@tag_deps", | ||||||
3772 | CTAGSDIRS => "@ctag_deps"); | ||||||
3773 | |||||||
3774 | 0 | 0 | set_seen 'TAGS_DEPENDENCIES'; | ||||
3775 | } | ||||||
3776 | elsif (reject_var ('TAGS_DEPENDENCIES', | ||||||
3777 | "doesn't make sense to define `TAGS_DEPENDENCIES'" | ||||||
3778 | . "without\nsources or `ETAGS_ARGS'")) | ||||||
3779 | { | ||||||
3780 | } | ||||||
3781 | else | ||||||
3782 | { | ||||||
3783 | # Every Makefile must define some sort of TAGS rule. | ||||||
3784 | # Otherwise, it would be possible for a top-level "make TAGS" | ||||||
3785 | # to fail because some subdirectory failed. | ||||||
3786 | 0 | 0 | $output_rules .= "tags: TAGS\nTAGS:\n\n"; | ||||
3787 | # Ditto ctags. | ||||||
3788 | 0 | 0 | $output_rules .= "ctags: CTAGS\nCTAGS:\n\n"; | ||||
3789 | } | ||||||
3790 | } | ||||||
3791 | |||||||
3792 | # Handle multilib support. | ||||||
3793 | sub handle_multilib | ||||||
3794 | { | ||||||
3795 | 0 | 0 | if ($seen_multilib && $relative_dir eq '.') | ||||
3796 | { | ||||||
3797 | 0 | 0 | $output_rules .= &file_contents ('multilib', new Automake::Location); | ||||
3798 | 0 | 0 | push (@all, 'all-multi'); | ||||
3799 | } | ||||||
3800 | } | ||||||
3801 | |||||||
3802 | |||||||
3803 | # user_phony_rule ($NAME) | ||||||
3804 | # ----------------------- | ||||||
3805 | # Return false if rule $NAME does not exist. Otherwise, | ||||||
3806 | # declare it as phony, complete its definition (in case it is | ||||||
3807 | # conditional), and return its Automake::Rule instance. | ||||||
3808 | sub user_phony_rule ($) | ||||||
3809 | { | ||||||
3810 | 0 | 0 | my ($name) = @_; | ||||
3811 | 0 | 0 | my $rule = rule $name; | ||||
3812 | 0 | 0 | if ($rule) | ||||
3813 | { | ||||||
3814 | 0 | 0 | depend ('.PHONY', $name); | ||||
3815 | # Define $NAME in all condition where it is not already defined, | ||||||
3816 | # so that it is always OK to depend on $NAME. | ||||||
3817 | 0 | 0 | for my $c ($rule->not_always_defined_in_cond (TRUE)->conds) | ||||
3818 | { | ||||||
3819 | 0 | 0 | Automake::Rule::define ($name, 'internal', RULE_AUTOMAKE, | ||||
3820 | $c, INTERNAL); | ||||||
3821 | 0 | 0 | $output_rules .= $c->subst_string . "$name:\n"; | ||||
3822 | } | ||||||
3823 | } | ||||||
3824 | 0 | 0 | return $rule; | ||||
3825 | } | ||||||
3826 | |||||||
3827 | |||||||
3828 | # $BOOLEAN | ||||||
3829 | # &for_dist_common ($A, $B) | ||||||
3830 | # ------------------------- | ||||||
3831 | # Subroutine for &handle_dist: sort files to dist. | ||||||
3832 | # | ||||||
3833 | # We put README first because it then becomes easier to make a | ||||||
3834 | # Usenet-compliant shar file (in these, README must be first). | ||||||
3835 | # | ||||||
3836 | # FIXME: do more ordering of files here. | ||||||
3837 | sub for_dist_common | ||||||
3838 | { | ||||||
3839 | 0 | 0 | return 0 | ||||
3840 | if $a eq $b; | ||||||
3841 | 0 | 0 | return -1 | ||||
3842 | if $a eq 'README'; | ||||||
3843 | 0 | 0 | return 1 | ||||
3844 | if $b eq 'README'; | ||||||
3845 | 0 | 0 | return $a cmp $b; | ||||
3846 | } | ||||||
3847 | |||||||
3848 | # handle_dist | ||||||
3849 | # ----------- | ||||||
3850 | # Handle 'dist' target. | ||||||
3851 | sub handle_dist () | ||||||
3852 | { | ||||||
3853 | # Substitutions for distdir.am | ||||||
3854 | 0 | 0 | my %transform; | ||||
3855 | |||||||
3856 | # Define DIST_SUBDIRS. This must always be done, regardless of the | ||||||
3857 | # no-dist setting: target like `distclean' or `maintainer-clean' use it. | ||||||
3858 | 0 | 0 | my $subdirs = var ('SUBDIRS'); | ||||
3859 | 0 | 0 | if ($subdirs) | ||||
3860 | { | ||||||
3861 | # If SUBDIRS is conditionally defined, then set DIST_SUBDIRS | ||||||
3862 | # to all possible directories, and use it. If DIST_SUBDIRS is | ||||||
3863 | # defined, just use it. | ||||||
3864 | |||||||
3865 | # Note that we check DIST_SUBDIRS first on purpose, so that | ||||||
3866 | # we don't call has_conditional_contents for now reason. | ||||||
3867 | # (In the past one project used so many conditional subdirectories | ||||||
3868 | # that calling has_conditional_contents on SUBDIRS caused | ||||||
3869 | # automake to grow to 150Mb -- this should not happen with | ||||||
3870 | # the current implementation of has_conditional_contents, | ||||||
3871 | # but it's more efficient to avoid the call anyway.) | ||||||
3872 | 0 | 0 | if (var ('DIST_SUBDIRS')) | ||||
3873 | { | ||||||
3874 | } | ||||||
3875 | elsif ($subdirs->has_conditional_contents) | ||||||
3876 | { | ||||||
3877 | 0 | 0 | define_pretty_variable | ||||
3878 | ('DIST_SUBDIRS', TRUE, INTERNAL, | ||||||
3879 | uniq ($subdirs->value_as_list_recursive)); | ||||||
3880 | } | ||||||
3881 | else | ||||||
3882 | { | ||||||
3883 | # We always define this because that is what `distclean' | ||||||
3884 | # wants. | ||||||
3885 | 0 | 0 | define_pretty_variable ('DIST_SUBDIRS', TRUE, INTERNAL, | ||||
3886 | '$(SUBDIRS)'); | ||||||
3887 | } | ||||||
3888 | } | ||||||
3889 | |||||||
3890 | # The remaining definitions are only required when a dist target is used. | ||||||
3891 | 0 | 0 | return if option 'no-dist'; | ||||
3892 | |||||||
3893 | # At least one of the archive formats must be enabled. | ||||||
3894 | 0 | 0 | if ($relative_dir eq '.') | ||||
3895 | { | ||||||
3896 | 0 | 0 | my $archive_defined = option 'no-dist-gzip' ? 0 : 1; | ||||
3897 | 0 | 0 | $archive_defined ||= | ||||
3898 | 0 | 0 | grep { option "dist-$_" } qw(shar zip tarZ bzip2 lzma xz); | ||||
3899 | 0 | 0 | error (option 'no-dist-gzip', | ||||
3900 | "no-dist-gzip specified but no dist-* specified, " | ||||||
3901 | . "at least one archive format must be enabled") | ||||||
3902 | unless $archive_defined; | ||||||
3903 | } | ||||||
3904 | |||||||
3905 | # Look for common files that should be included in distribution. | ||||||
3906 | # If the aux dir is set, and it does not have a Makefile.am, then | ||||||
3907 | # we check for these files there as well. | ||||||
3908 | 0 | 0 | my $check_aux = 0; | ||||
3909 | 0 | 0 | if ($relative_dir eq '.' | ||||
3910 | && $config_aux_dir_set_in_configure_ac) | ||||||
3911 | { | ||||||
3912 | 0 | 0 | if (! &is_make_dir ($config_aux_dir)) | ||||
3913 | { | ||||||
3914 | 0 | 0 | $check_aux = 1; | ||||
3915 | } | ||||||
3916 | } | ||||||
3917 | 0 | 0 | foreach my $cfile (@common_files) | ||||
3918 | { | ||||||
3919 | 0 | 0 | if (dir_has_case_matching_file ($relative_dir, $cfile) | ||||
3920 | # The file might be absent, but if it can be built it's ok. | ||||||
3921 | || rule $cfile) | ||||||
3922 | { | ||||||
3923 | 0 | 0 | &push_dist_common ($cfile); | ||||
3924 | } | ||||||
3925 | |||||||
3926 | # Don't use `elsif' here because a file might meaningfully | ||||||
3927 | # appear in both directories. | ||||||
3928 | 0 | 0 | if ($check_aux && dir_has_case_matching_file ($config_aux_dir, $cfile)) | ||||
3929 | { | ||||||
3930 | 0 | 0 | &push_dist_common ("$config_aux_dir/$cfile") | ||||
3931 | } | ||||||
3932 | } | ||||||
3933 | |||||||
3934 | # We might copy elements from $configure_dist_common to | ||||||
3935 | # %dist_common if we think we need to. If the file appears in our | ||||||
3936 | # directory, we would have discovered it already, so we don't | ||||||
3937 | # check that. But if the file is in a subdir without a Makefile, | ||||||
3938 | # we want to distribute it here if we are doing `.'. Ugly! | ||||||
3939 | 0 | 0 | if ($relative_dir eq '.') | ||||
3940 | { | ||||||
3941 | 0 | 0 | foreach my $file (split (' ' , $configure_dist_common)) | ||||
3942 | { | ||||||
3943 | 0 | 0 | push_dist_common ($file) | ||||
3944 | unless is_make_dir (dirname ($file)); | ||||||
3945 | } | ||||||
3946 | } | ||||||
3947 | |||||||
3948 | # Files to distributed. Don't use ->value_as_list_recursive | ||||||
3949 | # as it recursively expands `$(dist_pkgdata_DATA)' etc. | ||||||
3950 | 0 | 0 | my @dist_common = split (' ', rvar ('DIST_COMMON')->variable_value); | ||||
3951 | 0 | 0 | @dist_common = uniq (sort for_dist_common (@dist_common)); | ||||
3952 | 0 | 0 | variable_delete 'DIST_COMMON'; | ||||
3953 | 0 | 0 | define_pretty_variable ('DIST_COMMON', TRUE, INTERNAL, @dist_common); | ||||
3954 | |||||||
3955 | # Now that we've processed DIST_COMMON, disallow further attempts | ||||||
3956 | # to set it. | ||||||
3957 | 0 | 0 | $handle_dist_run = 1; | ||||
3958 | |||||||
3959 | # Scan EXTRA_DIST to see if we need to distribute anything from a | ||||||
3960 | # subdir. If so, add it to the list. I didn't want to do this | ||||||
3961 | # originally, but there were so many requests that I finally | ||||||
3962 | # relented. | ||||||
3963 | 0 | 0 | my $extra_dist = var ('EXTRA_DIST'); | ||||
3964 | |||||||
3965 | 0 | 0 | $transform{'DISTCHECK-HOOK'} = !! rule 'distcheck-hook'; | ||||
3966 | 0 | 0 | $transform{'GETTEXT'} = $seen_gettext && !$seen_gettext_external; | ||||
3967 | |||||||
3968 | # If the target `dist-hook' exists, make sure it is run. This | ||||||
3969 | # allows users to do random weird things to the distribution | ||||||
3970 | # before it is packaged up. | ||||||
3971 | 0 | 0 | push (@dist_targets, 'dist-hook') | ||||
3972 | if user_phony_rule 'dist-hook'; | ||||||
3973 | 0 | 0 | $transform{'DIST-TARGETS'} = join (' ', @dist_targets); | ||||
3974 | |||||||
3975 | 0 | 0 | my $flm = option ('filename-length-max'); | ||||
3976 | 0 | 0 | my $filename_filter = $flm ? '.' x $flm->[1] : ''; | ||||
3977 | |||||||
3978 | 0 | 0 | $output_rules .= &file_contents ('distdir', | ||||
3979 | new Automake::Location, | ||||||
3980 | %transform, | ||||||
3981 | FILENAME_FILTER => $filename_filter); | ||||||
3982 | } | ||||||
3983 | |||||||
3984 | |||||||
3985 | # check_directory ($NAME, $WHERE) | ||||||
3986 | # ------------------------------- | ||||||
3987 | # Ensure $NAME is a directory, and that it uses a sane name. | ||||||
3988 | # Use $WHERE as a location in the diagnostic, if any. | ||||||
3989 | sub check_directory ($$) | ||||||
3990 | { | ||||||
3991 | 0 | 0 | my ($dir, $where) = @_; | ||||
3992 | |||||||
3993 | 0 | 0 | error $where, "required directory $relative_dir/$dir does not exist" | ||||
3994 | unless -d "$relative_dir/$dir"; | ||||||
3995 | |||||||
3996 | # If an `obj/' directory exists, BSD make will enter it before | ||||||
3997 | # reading `Makefile'. Hence the `Makefile' in the current directory | ||||||
3998 | # will not be read. | ||||||
3999 | # | ||||||
4000 | # % cat Makefile | ||||||
4001 | # all: | ||||||
4002 | # echo Hello | ||||||
4003 | # % cat obj/Makefile | ||||||
4004 | # all: | ||||||
4005 | # echo World | ||||||
4006 | # % make # GNU make | ||||||
4007 | # echo Hello | ||||||
4008 | # Hello | ||||||
4009 | # % pmake # BSD make | ||||||
4010 | # echo World | ||||||
4011 | # World | ||||||
4012 | 0 | 0 | msg ('portability', $where, | ||||
4013 | "naming a subdirectory `obj' causes troubles with BSD make") | ||||||
4014 | if $dir eq 'obj'; | ||||||
4015 | |||||||
4016 | # `aux' is probably the most important of the following forbidden name, | ||||||
4017 | # since it's tempting to use it as an AC_CONFIG_AUX_DIR. | ||||||
4018 | 0 | 0 | msg ('portability', $where, | ||||
4019 | "name `$dir' is reserved on W32 and DOS platforms") | ||||||
4020 | if grep (/^\Q$dir\E$/i, qw/aux lpt1 lpt2 lpt3 com1 com2 com3 com4 con prn/); | ||||||
4021 | } | ||||||
4022 | |||||||
4023 | # check_directories_in_var ($VARIABLE) | ||||||
4024 | # ------------------------------------ | ||||||
4025 | # Recursively check all items in variables $VARIABLE as directories | ||||||
4026 | sub check_directories_in_var ($) | ||||||
4027 | { | ||||||
4028 | 0 | 0 | my ($var) = @_; | ||||
4029 | $var->traverse_recursively | ||||||
4030 | (sub | ||||||
4031 | { | ||||||
4032 | 0 | 0 | my ($var, $val, $cond, $full_cond) = @_; | ||||
4033 | 0 | 0 | check_directory ($val, $var->rdef ($cond)->location); | ||||
4034 | 0 | 0 | return (); | ||||
4035 | }, | ||||||
4036 | undef, | ||||||
4037 | 0 | 0 | skip_ac_subst => 1); | ||||
4038 | } | ||||||
4039 | |||||||
4040 | # &handle_subdirs () | ||||||
4041 | # ------------------ | ||||||
4042 | # Handle subdirectories. | ||||||
4043 | sub handle_subdirs () | ||||||
4044 | { | ||||||
4045 | 0 | 0 | my $subdirs = var ('SUBDIRS'); | ||||
4046 | return | ||||||
4047 | 0 | 0 | unless $subdirs; | ||||
4048 | |||||||
4049 | 0 | 0 | check_directories_in_var $subdirs; | ||||
4050 | |||||||
4051 | 0 | 0 | my $dsubdirs = var ('DIST_SUBDIRS'); | ||||
4052 | 0 | 0 | check_directories_in_var $dsubdirs | ||||
4053 | if $dsubdirs; | ||||||
4054 | |||||||
4055 | 0 | 0 | $output_rules .= &file_contents ('subdirs', new Automake::Location); | ||||
4056 | 0 | 0 | rvar ('RECURSIVE_TARGETS')->rdef (TRUE)->{'pretty'} = VAR_SORTED; # Gross! | ||||
4057 | } | ||||||
4058 | |||||||
4059 | |||||||
4060 | # ($REGEN, @DEPENDENCIES) | ||||||
4061 | # &scan_aclocal_m4 | ||||||
4062 | # ---------------- | ||||||
4063 | # If aclocal.m4 creation is automated, return the list of its dependencies. | ||||||
4064 | sub scan_aclocal_m4 () | ||||||
4065 | { | ||||||
4066 | 0 | 0 | my $regen_aclocal = 0; | ||||
4067 | |||||||
4068 | 0 | 0 | set_seen 'CONFIG_STATUS_DEPENDENCIES'; | ||||
4069 | 0 | 0 | set_seen 'CONFIGURE_DEPENDENCIES'; | ||||
4070 | |||||||
4071 | 0 | 0 | if (-f 'aclocal.m4') | ||||
4072 | { | ||||||
4073 | 0 | 0 | &define_variable ("ACLOCAL_M4", '$(top_srcdir)/aclocal.m4', INTERNAL); | ||||
4074 | |||||||
4075 | 0 | 0 | my $aclocal = new Automake::XFile "< aclocal.m4"; | ||||
4076 | 0 | 0 | my $line = $aclocal->getline; | ||||
4077 | 0 | 0 | $regen_aclocal = $line =~ 'generated automatically by aclocal'; | ||||
4078 | } | ||||||
4079 | |||||||
4080 | 0 | 0 | my @ac_deps = (); | ||||
4081 | |||||||
4082 | 0 | 0 | if (set_seen ('ACLOCAL_M4_SOURCES')) | ||||
4083 | { | ||||||
4084 | 0 | 0 | push (@ac_deps, '$(ACLOCAL_M4_SOURCES)'); | ||||
4085 | 0 | 0 | msg_var ('obsolete', 'ACLOCAL_M4_SOURCES', | ||||
4086 | "`ACLOCAL_M4_SOURCES' is obsolete.\n" | ||||||
4087 | . "It should be safe to simply remove it."); | ||||||
4088 | } | ||||||
4089 | |||||||
4090 | # Note that it might be possible that aclocal.m4 doesn't exist but | ||||||
4091 | # should be auto-generated. This case probably isn't very | ||||||
4092 | # important. | ||||||
4093 | |||||||
4094 | 0 | 0 | return ($regen_aclocal, @ac_deps); | ||||
4095 | } | ||||||
4096 | |||||||
4097 | |||||||
4098 | # Helper function for substitute_ac_subst_variables. | ||||||
4099 | sub substitute_ac_subst_variables_worker($) | ||||||
4100 | { | ||||||
4101 | 0 | 0 | my ($token) = @_; | ||||
4102 | 0 | 0 | return "\@$token\@" if var $token; | ||||
4103 | 0 | 0 | return "\${$token\}"; | ||||
4104 | } | ||||||
4105 | |||||||
4106 | # substitute_ac_subst_variables ($TEXT) | ||||||
4107 | # ------------------------------------- | ||||||
4108 | # Replace any occurrence of ${FOO} in $TEXT by @FOO@ if FOO is an AC_SUBST | ||||||
4109 | # variable. | ||||||
4110 | sub substitute_ac_subst_variables ($) | ||||||
4111 | { | ||||||
4112 | 0 | 0 | my ($text) = @_; | ||||
4113 | 0 0 | 0 0 | $text =~ s/\${([^ \t=:+{}]+)}/&substitute_ac_subst_variables_worker ($1)/ge; | ||||
4114 | 0 | 0 | return $text; | ||||
4115 | } | ||||||
4116 | |||||||
4117 | # @DEPENDENCIES | ||||||
4118 | # &prepend_srcdir (@INPUTS) | ||||||
4119 | # ------------------------- | ||||||
4120 | # Prepend $(srcdir) or $(top_srcdir) to all @INPUTS. The idea is that | ||||||
4121 | # if an input file has a directory part the same as the current | ||||||
4122 | # directory, then the directory part is simply replaced by $(srcdir). | ||||||
4123 | # But if the directory part is different, then $(top_srcdir) is | ||||||
4124 | # prepended. | ||||||
4125 | sub prepend_srcdir (@) | ||||||
4126 | { | ||||||
4127 | 0 | 0 | my (@inputs) = @_; | ||||
4128 | 0 | 0 | my @newinputs; | ||||
4129 | |||||||
4130 | 0 | 0 | foreach my $single (@inputs) | ||||
4131 | { | ||||||
4132 | 0 | 0 | if (dirname ($single) eq $relative_dir) | ||||
4133 | { | ||||||
4134 | 0 | 0 | push (@newinputs, '$(srcdir)/' . basename ($single)); | ||||
4135 | } | ||||||
4136 | else | ||||||
4137 | { | ||||||
4138 | 0 | 0 | push (@newinputs, '$(top_srcdir)/' . $single); | ||||
4139 | } | ||||||
4140 | } | ||||||
4141 | 0 | 0 | return @newinputs; | ||||
4142 | } | ||||||
4143 | |||||||
4144 | # @DEPENDENCIES | ||||||
4145 | # rewrite_inputs_into_dependencies ($OUTPUT, @INPUTS) | ||||||
4146 | # --------------------------------------------------- | ||||||
4147 | # Compute a list of dependencies appropriate for the rebuild | ||||||
4148 | # rule of | ||||||
4149 | # AC_CONFIG_FILES($OUTPUT:$INPUT[0]:$INPUTS[1]:...) | ||||||
4150 | # Also distribute $INPUTs which are not built by another AC_CONFIG_FOOS. | ||||||
4151 | sub rewrite_inputs_into_dependencies ($@) | ||||||
4152 | { | ||||||
4153 | 0 | 0 | my ($file, @inputs) = @_; | ||||
4154 | 0 | 0 | my @res = (); | ||||
4155 | |||||||
4156 | 0 | 0 | for my $i (@inputs) | ||||
4157 | { | ||||||
4158 | # We cannot create dependencies on shell variables. | ||||||
4159 | 0 | 0 | next if (substitute_ac_subst_variables $i) =~ /\$/; | ||||
4160 | |||||||
4161 | 0 | 0 | if (exists $ac_config_files_location{$i} && $i ne $file) | ||||
4162 | { | ||||||
4163 | 0 | 0 | my $di = dirname $i; | ||||
4164 | 0 | 0 | if ($di eq $relative_dir) | ||||
4165 | { | ||||||
4166 | 0 | 0 | $i = basename $i; | ||||
4167 | } | ||||||
4168 | # In the top-level Makefile we do not use $(top_builddir), because | ||||||
4169 | # we are already there, and since the targets are built without | ||||||
4170 | # a $(top_builddir), it helps BSD Make to match them with | ||||||
4171 | # dependencies. | ||||||
4172 | elsif ($relative_dir ne '.') | ||||||
4173 | { | ||||||
4174 | 0 | 0 | $i = '$(top_builddir)/' . $i; | ||||
4175 | } | ||||||
4176 | } | ||||||
4177 | else | ||||||
4178 | { | ||||||
4179 | 0 | 0 | msg ('error', $ac_config_files_location{$file}, | ||||
4180 | "required file `$i' not found") | ||||||
4181 | unless $i =~ /\$/ || exists $output_files{$i} || -f $i; | ||||||
4182 | 0 | 0 | ($i) = prepend_srcdir ($i); | ||||
4183 | 0 | 0 | push_dist_common ($i); | ||||
4184 | } | ||||||
4185 | 0 | 0 | push @res, $i; | ||||
4186 | } | ||||||
4187 | 0 | 0 | return @res; | ||||
4188 | } | ||||||
4189 | |||||||
4190 | |||||||
4191 | |||||||
4192 | # &handle_configure ($MAKEFILE_AM, $MAKEFILE_IN, $MAKEFILE, @INPUTS) | ||||||
4193 | # ------------------------------------------------------------------ | ||||||
4194 | # Handle remaking and configure stuff. | ||||||
4195 | # We need the name of the input file, to do proper remaking rules. | ||||||
4196 | sub handle_configure ($$$@) | ||||||
4197 | { | ||||||
4198 | 0 | 0 | my ($makefile_am, $makefile_in, $makefile, @inputs) = @_; | ||||
4199 | |||||||
4200 | 0 | 0 | prog_error 'empty @inputs' | ||||
4201 | unless @inputs; | ||||||
4202 | |||||||
4203 | 0 | 0 | my ($rel_makefile_am, $rel_makefile_in) = prepend_srcdir ($makefile_am, | ||||
4204 | $makefile_in); | ||||||
4205 | 0 | 0 | my $rel_makefile = basename $makefile; | ||||
4206 | |||||||
4207 | 0 | 0 | my $colon_infile = ':' . join (':', @inputs); | ||||
4208 | 0 | 0 | $colon_infile = '' if $colon_infile eq ":$makefile.in"; | ||||
4209 | 0 | 0 | my @rewritten = rewrite_inputs_into_dependencies ($makefile, @inputs); | ||||
4210 | 0 | 0 | my ($regen_aclocal_m4, @aclocal_m4_deps) = scan_aclocal_m4; | ||||
4211 | 0 | 0 | define_pretty_variable ('am__aclocal_m4_deps', TRUE, INTERNAL, | ||||
4212 | @configure_deps, @aclocal_m4_deps, | ||||||
4213 | '$(top_srcdir)/' . $configure_ac); | ||||||
4214 | 0 | 0 | my @configuredeps = ('$(am__aclocal_m4_deps)', '$(CONFIGURE_DEPENDENCIES)'); | ||||
4215 | 0 | 0 | push @configuredeps, '$(ACLOCAL_M4)' if -f 'aclocal.m4'; | ||||
4216 | 0 | 0 | define_pretty_variable ('am__configure_deps', TRUE, INTERNAL, | ||||
4217 | @configuredeps); | ||||||
4218 | |||||||
4219 | 0 | 0 | my $automake_options = '--' . (global_option 'cygnus' ? 'cygnus' : $strictness_name) | ||||
4220 | . (global_option 'no-dependencies' ? ' --ignore-deps' : ''); | ||||||
4221 | |||||||
4222 | 0 | 0 | $output_rules .= file_contents | ||||
4223 | ('configure', | ||||||
4224 | new Automake::Location, | ||||||
4225 | MAKEFILE => $rel_makefile, | ||||||
4226 | 'MAKEFILE-DEPS' => "@rewritten", | ||||||
4227 | 'CONFIG-MAKEFILE' => ($relative_dir eq '.') ? '$@' : '$(subdir)/$@', | ||||||
4228 | 'MAKEFILE-IN' => $rel_makefile_in, | ||||||
4229 | 'MAKEFILE-IN-DEPS' => "@include_stack", | ||||||
4230 | 'MAKEFILE-AM' => $rel_makefile_am, | ||||||
4231 | 'AUTOMAKE-OPTIONS' => $automake_options, | ||||||
4232 | 'MAKEFILE-AM-SOURCES' => "$makefile$colon_infile", | ||||||
4233 | 'REGEN-ACLOCAL-M4' => $regen_aclocal_m4, | ||||||
4234 | VERBOSE => verbose_flag ('GEN')); | ||||||
4235 | |||||||
4236 | 0 | 0 | if ($relative_dir eq '.') | ||||
4237 | { | ||||||
4238 | 0 | 0 | &push_dist_common ('acconfig.h') | ||||
4239 | if -f 'acconfig.h'; | ||||||
4240 | } | ||||||
4241 | |||||||
4242 | # If we have a configure header, require it. | ||||||
4243 | 0 | 0 | my $hdr_index = 0; | ||||
4244 | 0 | 0 | my @distclean_config; | ||||
4245 | 0 | 0 | foreach my $spec (@config_headers) | ||||
4246 | { | ||||||
4247 | 0 | 0 | $hdr_index += 1; | ||||
4248 | # $CONFIG_H_PATH: config.h from top level. | ||||||
4249 | 0 | 0 | my ($config_h_path, @ins) = split_config_file_spec ($spec); | ||||
4250 | 0 | 0 | my $config_h_dir = dirname ($config_h_path); | ||||
4251 | |||||||
4252 | # If the header is in the current directory we want to build | ||||||
4253 | # the header here. Otherwise, if we're at the topmost | ||||||
4254 | # directory and the header's directory doesn't have a | ||||||
4255 | # Makefile, then we also want to build the header. | ||||||
4256 | 0 | 0 | if ($relative_dir eq $config_h_dir | ||||
4257 | || ($relative_dir eq '.' && ! &is_make_dir ($config_h_dir))) | ||||||
4258 | { | ||||||
4259 | 0 | 0 | my ($cn_sans_dir, $stamp_dir); | ||||
4260 | 0 | 0 | if ($relative_dir eq $config_h_dir) | ||||
4261 | { | ||||||
4262 | 0 | 0 | $cn_sans_dir = basename ($config_h_path); | ||||
4263 | 0 | 0 | $stamp_dir = ''; | ||||
4264 | } | ||||||
4265 | else | ||||||
4266 | { | ||||||
4267 | 0 | 0 | $cn_sans_dir = $config_h_path; | ||||
4268 | 0 | 0 | if ($config_h_dir eq '.') | ||||
4269 | { | ||||||
4270 | 0 | 0 | $stamp_dir = ''; | ||||
4271 | } | ||||||
4272 | else | ||||||
4273 | { | ||||||
4274 | 0 | 0 | $stamp_dir = $config_h_dir . '/'; | ||||
4275 | } | ||||||
4276 | } | ||||||
4277 | |||||||
4278 | # This will also distribute all inputs. | ||||||
4279 | 0 | 0 | @ins = rewrite_inputs_into_dependencies ($config_h_path, @ins); | ||||
4280 | |||||||
4281 | # Cannot define rebuild rules for filenames with shell variables. | ||||||
4282 | 0 | 0 | next if (substitute_ac_subst_variables $config_h_path) =~ /\$/; | ||||
4283 | |||||||
4284 | # Header defined in this directory. | ||||||
4285 | 0 | 0 | my @files; | ||||
4286 | 0 | 0 | if (-f $config_h_path . '.top') | ||||
4287 | { | ||||||
4288 | 0 | 0 | push (@files, "$cn_sans_dir.top"); | ||||
4289 | } | ||||||
4290 | 0 | 0 | if (-f $config_h_path . '.bot') | ||||
4291 | { | ||||||
4292 | 0 | 0 | push (@files, "$cn_sans_dir.bot"); | ||||
4293 | } | ||||||
4294 | |||||||
4295 | 0 | 0 | push_dist_common (@files); | ||||
4296 | |||||||
4297 | # For now, acconfig.h can only appear in the top srcdir. | ||||||
4298 | 0 | 0 | if (-f 'acconfig.h') | ||||
4299 | { | ||||||
4300 | 0 | 0 | push (@files, '$(top_srcdir)/acconfig.h'); | ||||
4301 | } | ||||||
4302 | |||||||
4303 | 0 | 0 | my $stamp = "${stamp_dir}stamp-h${hdr_index}"; | ||||
4304 | 0 | 0 | $output_rules .= | ||||
4305 | file_contents ('remake-hdr', | ||||||
4306 | new Automake::Location, | ||||||
4307 | FILES => "@files", | ||||||
4308 | CONFIG_H => $cn_sans_dir, | ||||||
4309 | CONFIG_HIN => $ins[0], | ||||||
4310 | CONFIG_H_DEPS => "@ins", | ||||||
4311 | CONFIG_H_PATH => $config_h_path, | ||||||
4312 | STAMP => "$stamp"); | ||||||
4313 | |||||||
4314 | 0 | 0 | push @distclean_config, $cn_sans_dir, $stamp; | ||||
4315 | } | ||||||
4316 | } | ||||||
4317 | |||||||
4318 | 0 | 0 | $output_rules .= file_contents ('clean-hdr', | ||||
4319 | new Automake::Location, | ||||||
4320 | FILES => "@distclean_config") | ||||||
4321 | if @distclean_config; | ||||||
4322 | |||||||
4323 | # Distribute and define mkinstalldirs only if it is already present | ||||||
4324 | # in the package, for backward compatibility (some people may still | ||||||
4325 | # use $(mkinstalldirs)). | ||||||
4326 | 0 | 0 | my $mkidpath = "$config_aux_dir/mkinstalldirs"; | ||||
4327 | 0 | 0 | if (-f $mkidpath) | ||||
4328 | { | ||||||
4329 | # Use require_file so that any existing script gets updated | ||||||
4330 | # by --force-missing. | ||||||
4331 | 0 | 0 | require_conf_file ($mkidpath, FOREIGN, 'mkinstalldirs'); | ||||
4332 | 0 | 0 | define_variable ('mkinstalldirs', | ||||
4333 | "\$(SHELL) $am_config_aux_dir/mkinstalldirs", INTERNAL); | ||||||
4334 | } | ||||||
4335 | else | ||||||
4336 | { | ||||||
4337 | # Use $(install_sh), not $(MKDIR_P) because the latter requires | ||||||
4338 | # at least one argument, and $(mkinstalldirs) used to work | ||||||
4339 | # even without arguments (e.g. $(mkinstalldirs) $(conditional_dir)). | ||||||
4340 | 0 | 0 | define_variable ('mkinstalldirs', '$(install_sh) -d', INTERNAL); | ||||
4341 | } | ||||||
4342 | |||||||
4343 | 0 | 0 | reject_var ('CONFIG_HEADER', | ||||
4344 | "`CONFIG_HEADER' is an anachronism; now determined " | ||||||
4345 | . "automatically\nfrom `$configure_ac'"); | ||||||
4346 | |||||||
4347 | 0 | 0 | my @config_h; | ||||
4348 | 0 | 0 | foreach my $spec (@config_headers) | ||||
4349 | { | ||||||
4350 | 0 | 0 | my ($out, @ins) = split_config_file_spec ($spec); | ||||
4351 | # Generate CONFIG_HEADER define. | ||||||
4352 | 0 | 0 | if ($relative_dir eq dirname ($out)) | ||||
4353 | { | ||||||
4354 | 0 | 0 | push @config_h, basename ($out); | ||||
4355 | } | ||||||
4356 | else | ||||||
4357 | { | ||||||
4358 | 0 | 0 | push @config_h, "\$(top_builddir)/$out"; | ||||
4359 | } | ||||||
4360 | } | ||||||
4361 | 0 | 0 | define_variable ("CONFIG_HEADER", "@config_h", INTERNAL) | ||||
4362 | if @config_h; | ||||||
4363 | |||||||
4364 | # Now look for other files in this directory which must be remade | ||||||
4365 | # by config.status, and generate rules for them. | ||||||
4366 | 0 | 0 | my @actual_other_files = (); | ||||
4367 | # These get cleaned only in a VPATH build. | ||||||
4368 | 0 | 0 | my @actual_other_vpath_files = (); | ||||
4369 | 0 | 0 | foreach my $lfile (@other_input_files) | ||||
4370 | { | ||||||
4371 | 0 | 0 | my $file; | ||||
4372 | 0 | 0 | my @inputs; | ||||
4373 | 0 | 0 | if ($lfile =~ /^([^:]*):(.*)$/) | ||||
4374 | { | ||||||
4375 | # This is the ":" syntax of AC_OUTPUT. | ||||||
4376 | 0 | 0 | $file = $1; | ||||
4377 | 0 | 0 | @inputs = split (':', $2); | ||||
4378 | } | ||||||
4379 | else | ||||||
4380 | { | ||||||
4381 | # Normal usage. | ||||||
4382 | 0 | 0 | $file = $lfile; | ||||
4383 | 0 | 0 | @inputs = $file . '.in'; | ||||
4384 | } | ||||||
4385 | |||||||
4386 | # Automake files should not be stored in here, but in %MAKE_LIST. | ||||||
4387 | 0 | 0 | prog_error ("$lfile in \@other_input_files\n" | ||||
4388 | . "\@other_input_files = (@other_input_files)") | ||||||
4389 | if -f $file . '.am'; | ||||||
4390 | |||||||
4391 | 0 | 0 | my $local = basename ($file); | ||||
4392 | |||||||
4393 | # We skip files that aren't in this directory. However, if | ||||||
4394 | # the file's directory does not have a Makefile, and we are | ||||||
4395 | # currently doing `.', then we create a rule to rebuild the | ||||||
4396 | # file in the subdir. | ||||||
4397 | 0 | 0 | my $fd = dirname ($file); | ||||
4398 | 0 | 0 | if ($fd ne $relative_dir) | ||||
4399 | { | ||||||
4400 | 0 | 0 | if ($relative_dir eq '.' && ! &is_make_dir ($fd)) | ||||
4401 | { | ||||||
4402 | 0 | 0 | $local = $file; | ||||
4403 | } | ||||||
4404 | else | ||||||
4405 | { | ||||||
4406 | 0 | 0 | next; | ||||
4407 | } | ||||||
4408 | } | ||||||
4409 | |||||||
4410 | 0 | 0 | my @rewritten_inputs = rewrite_inputs_into_dependencies ($file, @inputs); | ||||
4411 | |||||||
4412 | # Cannot output rules for shell variables. | ||||||
4413 | 0 | 0 | next if (substitute_ac_subst_variables $local) =~ /\$/; | ||||
4414 | |||||||
4415 | 0 | 0 | my $condstr = ''; | ||||
4416 | 0 | 0 | my $cond = $ac_config_files_condition{$lfile}; | ||||
4417 | 0 | 0 | if (defined $cond) | ||||
4418 | { | ||||||
4419 | 0 | 0 | $condstr = $cond->subst_string; | ||||
4420 | 0 | 0 | Automake::Rule::define ($local, $configure_ac, RULE_AUTOMAKE, $cond, | ||||
4421 | $ac_config_files_location{$file}); | ||||||
4422 | } | ||||||
4423 | 0 | 0 | $output_rules .= ($condstr . $local . ': ' | ||||
4424 | . '$(top_builddir)/config.status ' | ||||||
4425 | . "@rewritten_inputs\n" | ||||||
4426 | . $condstr . "\t" | ||||||
4427 | . 'cd $(top_builddir) && ' | ||||||
4428 | . '$(SHELL) ./config.status ' | ||||||
4429 | . ($relative_dir eq '.' ? '' : '$(subdir)/') | ||||||
4430 | . '$@' | ||||||
4431 | . "\n"); | ||||||
4432 | 0 | 0 | push (@actual_other_files, $local); | ||||
4433 | } | ||||||
4434 | |||||||
4435 | # For links we should clean destinations and distribute sources. | ||||||
4436 | 0 | 0 | foreach my $spec (@config_links) | ||||
4437 | { | ||||||
4438 | 0 | 0 | my ($link, $file) = split /:/, $spec; | ||||
4439 | # Some people do AC_CONFIG_LINKS($computed). We only handle | ||||||
4440 | # the DEST:SRC form. | ||||||
4441 | 0 | 0 | next unless $file; | ||||
4442 | 0 | 0 | my $where = $ac_config_files_location{$link}; | ||||
4443 | |||||||
4444 | # Skip destinations that contain shell variables. | ||||||
4445 | 0 | 0 | if ((substitute_ac_subst_variables $link) !~ /\$/) | ||||
4446 | { | ||||||
4447 | # We skip links that aren't in this directory. However, if | ||||||
4448 | # the link's directory does not have a Makefile, and we are | ||||||
4449 | # currently doing `.', then we add the link to CONFIG_CLEAN_FILES | ||||||
4450 | # in `.'s Makefile.in. | ||||||
4451 | 0 | 0 | my $local = basename ($link); | ||||
4452 | 0 | 0 | my $fd = dirname ($link); | ||||
4453 | 0 | 0 | if ($fd ne $relative_dir) | ||||
4454 | { | ||||||
4455 | 0 | 0 | if ($relative_dir eq '.' && ! &is_make_dir ($fd)) | ||||
4456 | { | ||||||
4457 | 0 | 0 | $local = $link; | ||||
4458 | } | ||||||
4459 | else | ||||||
4460 | { | ||||||
4461 | 0 | 0 | $local = undef; | ||||
4462 | } | ||||||
4463 | } | ||||||
4464 | 0 | 0 | if ($file ne $link) | ||||
4465 | { | ||||||
4466 | 0 | 0 | push @actual_other_files, $local if $local; | ||||
4467 | } | ||||||
4468 | else | ||||||
4469 | { | ||||||
4470 | 0 | 0 | push @actual_other_vpath_files, $local if $local; | ||||
4471 | } | ||||||
4472 | } | ||||||
4473 | |||||||
4474 | # Do not process sources that contain shell variables. | ||||||
4475 | 0 | 0 | if ((substitute_ac_subst_variables $file) !~ /\$/) | ||||
4476 | { | ||||||
4477 | 0 | 0 | my $fd = dirname ($file); | ||||
4478 | |||||||
4479 | # We distribute files that are in this directory. | ||||||
4480 | # At the top-level (`.') we also distribute files whose | ||||||
4481 | # directory does not have a Makefile. | ||||||
4482 | 0 | 0 | if (($fd eq $relative_dir) | ||||
4483 | || ($relative_dir eq '.' && ! &is_make_dir ($fd))) | ||||||
4484 | { | ||||||
4485 | # The following will distribute $file as a side-effect when | ||||||
4486 | # it is appropriate (i.e., when $file is not already an output). | ||||||
4487 | # We do not need the result, just the side-effect. | ||||||
4488 | 0 | 0 | rewrite_inputs_into_dependencies ($link, $file); | ||||
4489 | } | ||||||
4490 | } | ||||||
4491 | } | ||||||
4492 | |||||||
4493 | # These files get removed by "make distclean". | ||||||
4494 | 0 | 0 | define_pretty_variable ('CONFIG_CLEAN_FILES', TRUE, INTERNAL, | ||||
4495 | @actual_other_files); | ||||||
4496 | 0 | 0 | define_pretty_variable ('CONFIG_CLEAN_VPATH_FILES', TRUE, INTERNAL, | ||||
4497 | @actual_other_vpath_files); | ||||||
4498 | } | ||||||
4499 | |||||||
4500 | # Handle C headers. | ||||||
4501 | sub handle_headers | ||||||
4502 | { | ||||||
4503 | 0 | 0 | my @r = &am_install_var ('-defaultdist', 'header', 'HEADERS', 'include', | ||||
4504 | 'oldinclude', 'pkginclude', | ||||||
4505 | 'noinst', 'check'); | ||||||
4506 | 0 | 0 | foreach (@r) | ||||
4507 | { | ||||||
4508 | 0 | 0 | next unless $_->[1] =~ /\..*$/; | ||||
4509 | 0 | 0 | &saw_extension ($&); | ||||
4510 | } | ||||||
4511 | } | ||||||
4512 | |||||||
4513 | sub handle_gettext | ||||||
4514 | { | ||||||
4515 | 0 | 0 | return if ! $seen_gettext || $relative_dir ne '.'; | ||||
4516 | |||||||
4517 | 0 | 0 | my $subdirs = var 'SUBDIRS'; | ||||
4518 | |||||||
4519 | 0 | 0 | if (! $subdirs) | ||||
4520 | { | ||||||
4521 | 0 | 0 | err_ac "AM_GNU_GETTEXT used but SUBDIRS not defined"; | ||||
4522 | 0 | 0 | return; | ||||
4523 | } | ||||||
4524 | |||||||
4525 | # Perform some sanity checks to help users get the right setup. | ||||||
4526 | # We disable these tests when po/ doesn't exist in order not to disallow | ||||||
4527 | # unusual gettext setups. | ||||||
4528 | # | ||||||
4529 | # Bruno Haible: | ||||||
4530 | # | The idea is: | ||||||
4531 | # | | ||||||
4532 | # | 1) If a package doesn't have a directory po/ at top level, it | ||||||
4533 | # | will likely have multiple po/ directories in subpackages. | ||||||
4534 | # | | ||||||
4535 | # | 2) It is useful to warn for the absence of intl/ if AM_GNU_GETTEXT | ||||||
4536 | # | is used without 'external'. It is also useful to warn for the | ||||||
4537 | # | presence of intl/ if AM_GNU_GETTEXT([external]) is used. Both | ||||||
4538 | # | warnings apply only to the usual layout of packages, therefore | ||||||
4539 | # | they should both be disabled if no po/ directory is found at | ||||||
4540 | # | top level. | ||||||
4541 | |||||||
4542 | 0 | 0 | if (-d 'po') | ||||
4543 | { | ||||||
4544 | 0 | 0 | my @subdirs = $subdirs->value_as_list_recursive; | ||||
4545 | |||||||
4546 | 0 | 0 | msg_var ('syntax', $subdirs, | ||||
4547 | "AM_GNU_GETTEXT used but `po' not in SUBDIRS") | ||||||
4548 | if ! grep ($_ eq 'po', @subdirs); | ||||||
4549 | |||||||
4550 | # intl/ is not required when AM_GNU_GETTEXT is called with the | ||||||
4551 | # `external' option and AM_GNU_GETTEXT_INTL_SUBDIR is not called. | ||||||
4552 | 0 | 0 | msg_var ('syntax', $subdirs, | ||||
4553 | "AM_GNU_GETTEXT used but `intl' not in SUBDIRS") | ||||||
4554 | if (! ($seen_gettext_external && ! $seen_gettext_intl) | ||||||
4555 | && ! grep ($_ eq 'intl', @subdirs)); | ||||||
4556 | |||||||
4557 | # intl/ should not be used with AM_GNU_GETTEXT([external]), except | ||||||
4558 | # if AM_GNU_GETTEXT_INTL_SUBDIR is called. | ||||||
4559 | 0 | 0 | msg_var ('syntax', $subdirs, | ||||
4560 | "`intl' should not be in SUBDIRS when " | ||||||
4561 | . "AM_GNU_GETTEXT([external]) is used") | ||||||
4562 | if ($seen_gettext_external && ! $seen_gettext_intl | ||||||
4563 | && grep ($_ eq 'intl', @subdirs)); | ||||||
4564 | } | ||||||
4565 | |||||||
4566 | 0 | 0 | require_file ($ac_gettext_location, GNU, 'ABOUT-NLS'); | ||||
4567 | } | ||||||
4568 | |||||||
4569 | # Handle footer elements. | ||||||
4570 | sub handle_footer | ||||||
4571 | { | ||||||
4572 | 0 | 0 | reject_rule ('.SUFFIXES', | ||||
4573 | "use variable `SUFFIXES', not target `.SUFFIXES'"); | ||||||
4574 | |||||||
4575 | # Note: AIX 4.1 /bin/make will fail if any suffix rule appears | ||||||
4576 | # before .SUFFIXES. So we make sure that .SUFFIXES appears before | ||||||
4577 | # anything else, by sticking it right after the default: target. | ||||||
4578 | 0 | 0 | $output_header .= ".SUFFIXES:\n"; | ||||
4579 | 0 | 0 | my $suffixes = var 'SUFFIXES'; | ||||
4580 | 0 | 0 | my @suffixes = Automake::Rule::suffixes; | ||||
4581 | 0 | 0 | if (@suffixes || $suffixes) | ||||
4582 | { | ||||||
4583 | # Make sure SUFFIXES has unique elements. Sort them to ensure | ||||||
4584 | # the output remains consistent. However, $(SUFFIXES) is | ||||||
4585 | # always at the start of the list, unsorted. This is done | ||||||
4586 | # because make will choose rules depending on the ordering of | ||||||
4587 | # suffixes, and this lets the user have some control. Push | ||||||
4588 | # actual suffixes, and not $(SUFFIXES). Some versions of make | ||||||
4589 | # do not like variable substitutions on the .SUFFIXES line. | ||||||
4590 | 0 | 0 | my @user_suffixes = ($suffixes | ||||
4591 | ? $suffixes->value_as_list_recursive : ()); | ||||||
4592 | |||||||
4593 | 0 0 | 0 0 | my %suffixes = map { $_ => 1 } @suffixes; | ||||
4594 | 0 | 0 | delete @suffixes{@user_suffixes}; | ||||
4595 | |||||||
4596 | 0 | 0 | $output_header .= (".SUFFIXES: " | ||||
4597 | . join (' ', @user_suffixes, sort keys %suffixes) | ||||||
4598 | . "\n"); | ||||||
4599 | } | ||||||
4600 | |||||||
4601 | 0 | 0 | $output_trailer .= file_contents ('footer', new Automake::Location); | ||||
4602 | } | ||||||
4603 | |||||||
4604 | |||||||
4605 | # Generate `make install' rules. | ||||||
4606 | sub handle_install () | ||||||
4607 | { | ||||||
4608 | 0 | 0 | $output_rules .= &file_contents | ||||
4609 | ('install', | ||||||
4610 | new Automake::Location, | ||||||
4611 | maybe_BUILT_SOURCES => (set_seen ('BUILT_SOURCES') | ||||||
4612 | ? (" \$(BUILT_SOURCES)\n" | ||||||
4613 | . "\t\$(MAKE) \$(AM_MAKEFLAGS)") | ||||||
4614 | : ''), | ||||||
4615 | 'installdirs-local' => (user_phony_rule 'installdirs-local' | ||||||
4616 | ? ' installdirs-local' : ''), | ||||||
4617 | am__installdirs => variable_value ('am__installdirs') || ''); | ||||||
4618 | } | ||||||
4619 | |||||||
4620 | |||||||
4621 | # Deal with all and all-am. | ||||||
4622 | sub handle_all ($) | ||||||
4623 | { | ||||||
4624 | 0 | 0 | my ($makefile) = @_; | ||||
4625 | |||||||
4626 | # Output `all-am'. | ||||||
4627 | |||||||
4628 | # Put this at the beginning for the sake of non-GNU makes. This | ||||||
4629 | # is still wrong if these makes can run parallel jobs. But it is | ||||||
4630 | # right enough. | ||||||
4631 | 0 | 0 | unshift (@all, basename ($makefile)); | ||||
4632 | |||||||
4633 | 0 | 0 | foreach my $spec (@config_headers) | ||||
4634 | { | ||||||
4635 | 0 | 0 | my ($out, @ins) = split_config_file_spec ($spec); | ||||
4636 | 0 | 0 | push (@all, basename ($out)) | ||||
4637 | if dirname ($out) eq $relative_dir; | ||||||
4638 | } | ||||||
4639 | |||||||
4640 | # Install `all' hooks. | ||||||
4641 | 0 | 0 | push (@all, "all-local") | ||||
4642 | if user_phony_rule "all-local"; | ||||||
4643 | |||||||
4644 | 0 | 0 | &pretty_print_rule ("all-am:", "\t\t", @all); | ||||
4645 | 0 | 0 | &depend ('.PHONY', 'all-am', 'all'); | ||||
4646 | |||||||
4647 | |||||||
4648 | # Output `all'. | ||||||
4649 | |||||||
4650 | 0 | 0 | my @local_headers = (); | ||||
4651 | 0 | 0 | push @local_headers, '$(BUILT_SOURCES)' | ||||
4652 | if var ('BUILT_SOURCES'); | ||||||
4653 | 0 | 0 | foreach my $spec (@config_headers) | ||||
4654 | { | ||||||
4655 | 0 | 0 | my ($out, @ins) = split_config_file_spec ($spec); | ||||
4656 | 0 | 0 | push @local_headers, basename ($out) | ||||
4657 | if dirname ($out) eq $relative_dir; | ||||||
4658 | } | ||||||
4659 | |||||||
4660 | 0 | 0 | if (@local_headers) | ||||
4661 | { | ||||||
4662 | # We need to make sure config.h is built before we recurse. | ||||||
4663 | # We also want to make sure that built sources are built | ||||||
4664 | # before any ordinary `all' targets are run. We can't do this | ||||||
4665 | # by changing the order of dependencies to the "all" because | ||||||
4666 | # that breaks when using parallel makes. Instead we handle | ||||||
4667 | # things explicitly. | ||||||
4668 | 0 | 0 | $output_all .= ("all: @local_headers" | ||||
4669 | . "\n\t" | ||||||
4670 | . '$(MAKE) $(AM_MAKEFLAGS) ' | ||||||
4671 | . (var ('SUBDIRS') ? 'all-recursive' : 'all-am') | ||||||
4672 | . "\n\n"); | ||||||
4673 | 0 | 0 | depend ('.MAKE', 'all'); | ||||
4674 | } | ||||||
4675 | else | ||||||
4676 | { | ||||||
4677 | 0 | 0 | $output_all .= "all: " . (var ('SUBDIRS') | ||||
4678 | ? 'all-recursive' : 'all-am') . "\n\n"; | ||||||
4679 | } | ||||||
4680 | } | ||||||
4681 | |||||||
4682 | |||||||
4683 | # &do_check_merge_target () | ||||||
4684 | # ------------------------- | ||||||
4685 | # Handle check merge target specially. | ||||||
4686 | sub do_check_merge_target () | ||||||
4687 | { | ||||||
4688 | # Include user-defined local form of target. | ||||||
4689 | 0 | 0 | push @check_tests, 'check-local' | ||||
4690 | if user_phony_rule 'check-local'; | ||||||
4691 | |||||||
4692 | # In --cygnus mode, check doesn't depend on all. | ||||||
4693 | 0 | 0 | if (option 'cygnus') | ||||
4694 | { | ||||||
4695 | # Just run the local check rules. | ||||||
4696 | 0 | 0 | pretty_print_rule ('check-am:', "\t\t", @check); | ||||
4697 | } | ||||||
4698 | else | ||||||
4699 | { | ||||||
4700 | # The check target must depend on the local equivalent of | ||||||
4701 | # `all', to ensure all the primary targets are built. Then it | ||||||
4702 | # must build the local check rules. | ||||||
4703 | 0 | 0 | $output_rules .= "check-am: all-am\n"; | ||||
4704 | 0 | 0 | if (@check) | ||||
4705 | { | ||||||
4706 | 0 | 0 | pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", | ||||
4707 | @check); | ||||||
4708 | 0 | 0 | depend ('.MAKE', 'check-am'); | ||||
4709 | } | ||||||
4710 | } | ||||||
4711 | 0 | 0 | if (@check_tests) | ||||
4712 | { | ||||||
4713 | 0 | 0 | pretty_print_rule ("\t\$(MAKE) \$(AM_MAKEFLAGS)", "\t ", | ||||
4714 | @check_tests); | ||||||
4715 | 0 | 0 | depend ('.MAKE', 'check-am'); | ||||
4716 | } | ||||||
4717 | |||||||
4718 | 0 | 0 | depend '.PHONY', 'check', 'check-am'; | ||||
4719 | # Handle recursion. We have to honor BUILT_SOURCES like for `all:'. | ||||||
4720 | 0 | 0 | $output_rules .= ("check: " | ||||
4721 | . (var ('BUILT_SOURCES') | ||||||
4722 | ? "\$(BUILT_SOURCES)\n\t\$(MAKE) \$(AM_MAKEFLAGS) " | ||||||
4723 | : '') | ||||||
4724 | . (var ('SUBDIRS') ? 'check-recursive' : 'check-am') | ||||||
4725 | . "\n"); | ||||||
4726 | 0 | 0 | depend ('.MAKE', 'check') | ||||
4727 | if var ('BUILT_SOURCES'); | ||||||
4728 | } | ||||||
4729 | |||||||
4730 | # handle_clean ($MAKEFILE) | ||||||
4731 | # ------------------------ | ||||||
4732 | # Handle all 'clean' targets. | ||||||
4733 | sub handle_clean ($) | ||||||
4734 | { | ||||||
4735 | 0 | 0 | my ($makefile) = @_; | ||||
4736 | |||||||
4737 | # Clean the files listed in user variables if they exist. | ||||||
4738 | 0 | 0 | $clean_files{'$(MOSTLYCLEANFILES)'} = MOSTLY_CLEAN | ||||
4739 | if var ('MOSTLYCLEANFILES'); | ||||||
4740 | 0 | 0 | $clean_files{'$(CLEANFILES)'} = CLEAN | ||||
4741 | if var ('CLEANFILES'); | ||||||
4742 | 0 | 0 | $clean_files{'$(DISTCLEANFILES)'} = DIST_CLEAN | ||||
4743 | if var ('DISTCLEANFILES'); | ||||||
4744 | 0 | 0 | $clean_files{'$(MAINTAINERCLEANFILES)'} = MAINTAINER_CLEAN | ||||
4745 | if var ('MAINTAINERCLEANFILES'); | ||||||
4746 | |||||||
4747 | # Built sources are automatically removed by maintainer-clean. | ||||||
4748 | 0 | 0 | $clean_files{'$(BUILT_SOURCES)'} = MAINTAINER_CLEAN | ||||
4749 | if var ('BUILT_SOURCES'); | ||||||
4750 | |||||||
4751 | # Compute a list of "rm"s to run for each target. | ||||||
4752 | 0 | 0 | my %rms = (MOSTLY_CLEAN, [], | ||||
4753 | CLEAN, [], | ||||||
4754 | DIST_CLEAN, [], | ||||||
4755 | MAINTAINER_CLEAN, []); | ||||||
4756 | |||||||
4757 | 0 | 0 | foreach my $file (keys %clean_files) | ||||
4758 | { | ||||||
4759 | 0 | 0 | my $when = $clean_files{$file}; | ||||
4760 | 0 | 0 | prog_error 'invalid entry in %clean_files' | ||||
4761 | unless exists $rms{$when}; | ||||||
4762 | |||||||
4763 | 0 | 0 | my $rm = "rm -f $file"; | ||||
4764 | # If file is a variable, make sure when don't call `rm -f' without args. | ||||||
4765 | 0 | 0 | $rm ="test -z \"$file\" || $rm" | ||||
4766 | if ($file =~ /^\s*\$(\(.*\)|\{.*\})\s*$/); | ||||||
4767 | |||||||
4768 | 0 0 | 0 0 | push @{$rms{$when}}, "\t-$rm\n"; | ||||
4769 | } | ||||||
4770 | |||||||
4771 | 0 | 0 | $output_rules .= &file_contents | ||||
4772 | ('clean', | ||||||
4773 | new Automake::Location, | ||||||
4774 | 0 | 0 | MOSTLYCLEAN_RMS => join ('', sort @{$rms{&MOSTLY_CLEAN}}), | ||||
4775 | 0 | 0 | CLEAN_RMS => join ('', sort @{$rms{&CLEAN}}), | ||||
4776 | 0 | 0 | DISTCLEAN_RMS => join ('', sort @{$rms{&DIST_CLEAN}}), | ||||
4777 | 0 | 0 | MAINTAINER_CLEAN_RMS => join ('', sort @{$rms{&MAINTAINER_CLEAN}}), | ||||
4778 | MAKEFILE => basename $makefile, | ||||||
4779 | ); | ||||||
4780 | } | ||||||
4781 | |||||||
4782 | |||||||
4783 | # &target_cmp ($A, $B) | ||||||
4784 | # -------------------- | ||||||
4785 | # Subroutine for &handle_factored_dependencies to let `.PHONY' and | ||||||
4786 | # other `.TARGETS' be last. | ||||||
4787 | sub target_cmp | ||||||
4788 | { | ||||||
4789 | 0 | 0 | return 0 if $a eq $b; | ||||
4790 | |||||||
4791 | 0 | 0 | my $a1 = substr ($a, 0, 1); | ||||
4792 | 0 | 0 | my $b1 = substr ($b, 0, 1); | ||||
4793 | 0 | 0 | if ($a1 ne $b1) | ||||
4794 | { | ||||||
4795 | 0 | 0 | return -1 if $b1 eq '.'; | ||||
4796 | 0 | 0 | return 1 if $a1 eq '.'; | ||||
4797 | } | ||||||
4798 | 0 | 0 | return $a cmp $b; | ||||
4799 | } | ||||||
4800 | |||||||
4801 | |||||||
4802 | # &handle_factored_dependencies () | ||||||
4803 | # -------------------------------- | ||||||
4804 | # Handle everything related to gathered targets. | ||||||
4805 | sub handle_factored_dependencies | ||||||
4806 | { | ||||||
4807 | # Reject bad hooks. | ||||||
4808 | 0 | 0 | foreach my $utarg ('uninstall-data-local', 'uninstall-data-hook', | ||||
4809 | 'uninstall-exec-local', 'uninstall-exec-hook', | ||||||
4810 | 'uninstall-dvi-local', | ||||||
4811 | 'uninstall-html-local', | ||||||
4812 | 'uninstall-info-local', | ||||||
4813 | 'uninstall-pdf-local', | ||||||
4814 | 'uninstall-ps-local') | ||||||
4815 | { | ||||||
4816 | 0 | 0 | my $x = $utarg; | ||||
4817 | 0 | 0 | $x =~ s/-.*-/-/; | ||||
4818 | 0 | 0 | reject_rule ($utarg, "use `$x', not `$utarg'"); | ||||
4819 | } | ||||||
4820 | |||||||
4821 | 0 | 0 | reject_rule ('install-local', | ||||
4822 | "use `install-data-local' or `install-exec-local', " | ||||||
4823 | . "not `install-local'"); | ||||||
4824 | |||||||
4825 | 0 | 0 | reject_rule ('install-hook', | ||||
4826 | "use `install-data-hook' or `install-exec-hook', " | ||||||
4827 | . "not `install-hook'"); | ||||||
4828 | |||||||
4829 | # Install the -local hooks. | ||||||
4830 | 0 | 0 | foreach (keys %dependencies) | ||||
4831 | { | ||||||
4832 | # Hooks are installed on the -am targets. | ||||||
4833 | 0 | 0 | s/-am$// or next; | ||||
4834 | 0 | 0 | depend ("$_-am", "$_-local") | ||||
4835 | if user_phony_rule "$_-local"; | ||||||
4836 | } | ||||||
4837 | |||||||
4838 | # Install the -hook hooks. | ||||||
4839 | # FIXME: Why not be as liberal as we are with -local hooks? | ||||||
4840 | 0 | 0 | foreach ('install-exec', 'install-data', 'uninstall') | ||||
4841 | { | ||||||
4842 | 0 | 0 | if (user_phony_rule "$_-hook") | ||||
4843 | { | ||||||
4844 | 0 | 0 | depend ('.MAKE', "$_-am"); | ||||
4845 | 0 | 0 | register_action("$_-am", | ||||
4846 | ("\t\@\$(NORMAL_INSTALL)\n" | ||||||
4847 | . "\t\$(MAKE) \$(AM_MAKEFLAGS) $_-hook")); | ||||||
4848 | } | ||||||
4849 | } | ||||||
4850 | |||||||
4851 | # All the required targets are phony. | ||||||
4852 | 0 | 0 | depend ('.PHONY', keys %required_targets); | ||||
4853 | |||||||
4854 | # Actually output gathered targets. | ||||||
4855 | 0 | 0 | foreach (sort target_cmp keys %dependencies) | ||||
4856 | { | ||||||
4857 | # If there is nothing about this guy, skip it. | ||||||
4858 | next | ||||||
4859 | 0 0 | 0 0 | unless (@{$dependencies{$_}} | ||||
4860 | || $actions{$_} | ||||||
4861 | || $required_targets{$_}); | ||||||
4862 | |||||||
4863 | # Define gathered targets in undefined conditions. | ||||||
4864 | # FIXME: Right now we must handle .PHONY as an exception, | ||||||
4865 | # because people write things like | ||||||
4866 | # .PHONY: myphonytarget | ||||||
4867 | # to append dependencies. This would not work if Automake | ||||||
4868 | # refrained from defining its own .PHONY target as it does | ||||||
4869 | # with other overridden targets. | ||||||
4870 | # Likewise for `.MAKE'. | ||||||
4871 | 0 | 0 | my @undefined_conds = (TRUE,); | ||||
4872 | 0 | 0 | if ($_ ne '.PHONY' && $_ ne '.MAKE') | ||||
4873 | { | ||||||
4874 | 0 | 0 | @undefined_conds = | ||||
4875 | Automake::Rule::define ($_, 'internal', | ||||||
4876 | RULE_AUTOMAKE, TRUE, INTERNAL); | ||||||
4877 | } | ||||||
4878 | 0 0 | 0 0 | my @uniq_deps = uniq (sort @{$dependencies{$_}}); | ||||
4879 | 0 | 0 | foreach my $cond (@undefined_conds) | ||||
4880 | { | ||||||
4881 | 0 | 0 | my $condstr = $cond->subst_string; | ||||
4882 | 0 | 0 | &pretty_print_rule ("$condstr$_:", "$condstr\t", @uniq_deps); | ||||
4883 | 0 | 0 | $output_rules .= $actions{$_} if defined $actions{$_}; | ||||
4884 | 0 | 0 | $output_rules .= "\n"; | ||||
4885 | } | ||||||
4886 | } | ||||||
4887 | } | ||||||
4888 | |||||||
4889 | |||||||
4890 | # &handle_tests_dejagnu () | ||||||
4891 | # ------------------------ | ||||||
4892 | sub handle_tests_dejagnu | ||||||
4893 | { | ||||||
4894 | 0 | 0 | push (@check_tests, 'check-DEJAGNU'); | ||||
4895 | 0 | 0 | $output_rules .= file_contents ('dejagnu', new Automake::Location); | ||||
4896 | } | ||||||
4897 | |||||||
4898 | |||||||
4899 | # Handle TESTS variable and other checks. | ||||||
4900 | sub handle_tests | ||||||
4901 | { | ||||||
4902 | 0 | 0 | if (option 'dejagnu') | ||||
4903 | { | ||||||
4904 | 0 | 0 | &handle_tests_dejagnu; | ||||
4905 | } | ||||||
4906 | else | ||||||
4907 | { | ||||||
4908 | 0 | 0 | foreach my $c ('DEJATOOL', 'RUNTEST', 'RUNTESTFLAGS') | ||||
4909 | { | ||||||
4910 | 0 | 0 | reject_var ($c, "`$c' defined but `dejagnu' not in " | ||||
4911 | . "`AUTOMAKE_OPTIONS'"); | ||||||
4912 | } | ||||||
4913 | } | ||||||
4914 | |||||||
4915 | 0 | 0 | if (var ('TESTS')) | ||||
4916 | { | ||||||
4917 | 0 | 0 | push (@check_tests, 'check-TESTS'); | ||||
4918 | 0 | 0 | $output_rules .= &file_contents ('check', new Automake::Location, | ||||
4919 | COLOR => !! option 'color-tests', | ||||||
4920 | PARALLEL_TESTS => !! option 'parallel-tests'); | ||||||
4921 | |||||||
4922 | # Tests that are known programs should have $(EXEEXT) appended. | ||||||
4923 | # For matching purposes, we need to adjust XFAIL_TESTS as well. | ||||||
4924 | 0 0 | 0 0 | append_exeext { exists $known_programs{$_[0]} } 'TESTS'; | ||||
4925 | 0 0 | 0 0 | append_exeext { exists $known_programs{$_[0]} } 'XFAIL_TESTS' | ||||
4926 | if (var ('XFAIL_TESTS')); | ||||||
4927 | |||||||
4928 | 0 | 0 | if (option 'parallel-tests') | ||||
4929 | { | ||||||
4930 | 0 | 0 | define_variable ('TEST_SUITE_LOG', 'test-suite.log', INTERNAL); | ||||
4931 | 0 | 0 | define_variable ('TEST_SUITE_HTML', '$(TEST_SUITE_LOG:.log=.html)', INTERNAL); | ||||
4932 | 0 | 0 | my $suff = '.test'; | ||||
4933 | 0 | 0 | my $at_exeext = ''; | ||||
4934 | 0 | 0 | my $handle_exeext = exists $configure_vars{'EXEEXT'}; | ||||
4935 | 0 | 0 | if ($handle_exeext) | ||||
4936 | { | ||||||
4937 | 0 | 0 | $at_exeext = subst ('EXEEXT'); | ||||
4938 | 0 | 0 | $suff = $at_exeext . ' ' . $suff; | ||||
4939 | } | ||||||
4940 | 0 | 0 | define_variable ('TEST_EXTENSIONS', $suff, INTERNAL); | ||||
4941 | # FIXME: this mishandles conditions. | ||||||
4942 | 0 | 0 | my @test_suffixes = (var 'TEST_EXTENSIONS')->value_as_list_recursive; | ||||
4943 | 0 | 0 | if ($handle_exeext) | ||||
4944 | { | ||||||
4945 | 0 | 0 | unshift (@test_suffixes, $at_exeext) | ||||
4946 | unless $test_suffixes[0] eq $at_exeext; | ||||||
4947 | } | ||||||
4948 | 0 | 0 | unshift (@test_suffixes, ''); | ||||
4949 | |||||||
4950 | transform_variable_recursively | ||||||
4951 | ('TESTS', 'TEST_LOGS', 'am__testlogs', 1, INTERNAL, | ||||||
4952 | sub { | ||||||
4953 | 0 | 0 | my ($subvar, $val, $cond, $full_cond) = @_; | ||||
4954 | 0 | 0 | my $obj = $val; | ||||
4955 | 0 | 0 | return $obj | ||||
4956 | if $val =~ /^\@.*\@$/; | ||||||
4957 | 0 | 0 | $obj =~ s/\$\(EXEEXT\)$//o; | ||||
4958 | |||||||
4959 | 0 | 0 | if ($val =~ /(\$\((top_)?srcdir\))\//o) | ||||
4960 | { | ||||||
4961 | 0 | 0 | msg ('error', $subvar->rdef ($cond)->location, | ||||
4962 | "parallel-tests: using `$1' in TESTS is currently broken: `$val'"); | ||||||
4963 | } | ||||||
4964 | |||||||
4965 | 0 | 0 | foreach my $test_suffix (@test_suffixes) | ||||
4966 | { | ||||||
4967 | next | ||||||
4968 | 0 | 0 | if $test_suffix eq $at_exeext || $test_suffix eq ''; | ||||
4969 | 0 | 0 | return substr ($obj, 0, length ($obj) - length ($test_suffix)) . '.log' | ||||
4970 | if substr ($obj, - length ($test_suffix)) eq $test_suffix; | ||||||
4971 | } | ||||||
4972 | 0 | 0 | $obj .= '.log'; | ||||
4973 | 0 | 0 | my $compile = 'LOG_COMPILE'; | ||||
4974 | 0 | 0 | define_variable ($compile, | ||||
4975 | '$(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)', INTERNAL); | ||||||
4976 | 0 | 0 | $output_rules .= file_contents ('check2', new Automake::Location, | ||||
4977 | GENERIC => 0, | ||||||
4978 | OBJ => $obj, | ||||||
4979 | SOURCE => $val, | ||||||
4980 | COMPILE =>'$(' . $compile . ')', | ||||||
4981 | EXT => '', | ||||||
4982 | am__EXEEXT => 'FALSE'); | ||||||
4983 | 0 | 0 | return $obj; | ||||
4984 | 0 | 0 | }); | ||||
4985 | |||||||
4986 | 0 | 0 | my $nhelper=1; | ||||
4987 | 0 | 0 | my $prev = 'TESTS'; | ||||
4988 | 0 | 0 | my $post = ''; | ||||
4989 | 0 | 0 | my $last_suffix = $test_suffixes[$#test_suffixes]; | ||||
4990 | 0 | 0 | my $cur = ''; | ||||
4991 | 0 | 0 | foreach my $test_suffix (@test_suffixes) | ||||
4992 | { | ||||||
4993 | 0 | 0 | if ($test_suffix eq $last_suffix) | ||||
4994 | { | ||||||
4995 | 0 | 0 | $cur = 'TEST_LOGS'; | ||||
4996 | } | ||||||
4997 | else | ||||||
4998 | { | ||||||
4999 | 0 | 0 | $cur = 'am__test_logs' . $nhelper; | ||||
5000 | } | ||||||
5001 | 0 | 0 | define_variable ($cur, | ||||
5002 | '$(' . $prev . ':' . $test_suffix . $post . '=.log)', INTERNAL); | ||||||
5003 | 0 | 0 | $post = '.log'; | ||||
5004 | 0 | 0 | $prev = $cur; | ||||
5005 | 0 | 0 | $nhelper++; | ||||
5006 | 0 | 0 | if ($test_suffix ne $at_exeext && $test_suffix ne '') | ||||
5007 | { | ||||||
5008 | 0 | 0 | (my $ext = $test_suffix) =~ s/^\.//; | ||||
5009 | 0 | 0 | $ext = uc $ext; | ||||
5010 | 0 | 0 | my $compile = $ext . '_LOG_COMPILE'; | ||||
5011 | 0 | 0 | define_variable ($compile, | ||||
5012 | '$(' . $ext . '_LOG_COMPILER) $(AM_' . $ext . '_LOG_FLAGS)' | ||||||
5013 | . ' $(' . $ext . '_LOG_FLAGS)', INTERNAL); | ||||||
5014 | 0 | 0 | my $am_exeext = $handle_exeext ? 'am__EXEEXT' : 'FALSE'; | ||||
5015 | 0 | 0 | $output_rules .= file_contents ('check2', new Automake::Location, | ||||
5016 | GENERIC => 1, | ||||||
5017 | OBJ => '', | ||||||
5018 | SOURCE => '$<', | ||||||
5019 | COMPILE => '$(' . $compile . ')', | ||||||
5020 | EXT => $test_suffix, | ||||||
5021 | am__EXEEXT => $am_exeext); | ||||||
5022 | } | ||||||
5023 | } | ||||||
5024 | |||||||
5025 | 0 | 0 | define_variable ('TEST_LOGS_TMP', '$(TEST_LOGS:.log=.log-t)', INTERNAL); | ||||
5026 | |||||||
5027 | 0 | 0 | $clean_files{'$(TEST_LOGS_TMP)'} = MOSTLY_CLEAN; | ||||
5028 | 0 | 0 | $clean_files{'$(TEST_LOGS)'} = MOSTLY_CLEAN; | ||||
5029 | 0 | 0 | $clean_files{'$(TEST_SUITE_LOG)'} = MOSTLY_CLEAN; | ||||
5030 | 0 | 0 | $clean_files{'$(TEST_SUITE_HTML)'} = MOSTLY_CLEAN; | ||||
5031 | } | ||||||
5032 | } | ||||||
5033 | } | ||||||
5034 | |||||||
5035 | # Handle Emacs Lisp. | ||||||
5036 | sub handle_emacs_lisp | ||||||
5037 | { | ||||||
5038 | 0 | 0 | my @elfiles = &am_install_var ('-candist', 'lisp', 'LISP', | ||||
5039 | 'lisp', 'noinst'); | ||||||
5040 | |||||||
5041 | 0 | 0 | return if ! @elfiles; | ||||
5042 | |||||||
5043 | 0 | 0 | define_pretty_variable ('am__ELFILES', TRUE, INTERNAL, | ||||
5044 | 0 | 0 | map { $_->[1] } @elfiles); | ||||
5045 | 0 | 0 | define_pretty_variable ('am__ELCFILES', TRUE, INTERNAL, | ||||
5046 | '$(am__ELFILES:.el=.elc)'); | ||||||
5047 | # This one can be overridden by users. | ||||||
5048 | 0 | 0 | define_pretty_variable ('ELCFILES', TRUE, INTERNAL, '$(LISP:.el=.elc)'); | ||||
5049 | |||||||
5050 | 0 | 0 | push @all, '$(ELCFILES)'; | ||||
5051 | |||||||
5052 | 0 | 0 | require_variables ($elfiles[0][0], "Emacs Lisp sources seen", TRUE, | ||||
5053 | 'EMACS', 'lispdir'); | ||||||
5054 | 0 | 0 | require_conf_file ($elfiles[0][0], FOREIGN, 'elisp-comp'); | ||||
5055 | 0 | 0 | &define_variable ('elisp_comp', "$am_config_aux_dir/elisp-comp", INTERNAL); | ||||
5056 | } | ||||||
5057 | |||||||
5058 | # Handle Python | ||||||
5059 | sub handle_python | ||||||
5060 | { | ||||||
5061 | 0 | 0 | my @pyfiles = &am_install_var ('-defaultdist', 'python', 'PYTHON', | ||||
5062 | 'noinst'); | ||||||
5063 | 0 | 0 | return if ! @pyfiles; | ||||
5064 | |||||||
5065 | 0 | 0 | require_variables ($pyfiles[0][0], "Python sources seen", TRUE, 'PYTHON'); | ||||
5066 | 0 | 0 | require_conf_file ($pyfiles[0][0], FOREIGN, 'py-compile'); | ||||
5067 | 0 | 0 | &define_variable ('py_compile', "$am_config_aux_dir/py-compile", INTERNAL); | ||||
5068 | } | ||||||
5069 | |||||||
5070 | # Handle Java. | ||||||
5071 | sub handle_java | ||||||
5072 | { | ||||||
5073 | 0 | 0 | my @sourcelist = &am_install_var ('-candist', | ||||
5074 | 'java', 'JAVA', | ||||||
5075 | 'java', 'noinst', 'check'); | ||||||
5076 | 0 | 0 | return if ! @sourcelist; | ||||
5077 | |||||||
5078 | 0 | 0 | my @prefix = am_primary_prefixes ('JAVA', 1, | ||||
5079 | 'java', 'noinst', 'check'); | ||||||
5080 | |||||||
5081 | 0 | 0 | my $dir; | ||||
5082 | 0 | 0 | foreach my $curs (@prefix) | ||||
5083 | { | ||||||
5084 | next | ||||||
5085 | 0 | 0 | if $curs eq 'EXTRA'; | ||||
5086 | |||||||
5087 | 0 | 0 | err_var "${curs}_JAVA", "multiple _JAVA primaries in use" | ||||
5088 | if defined $dir; | ||||||
5089 | 0 | 0 | $dir = $curs; | ||||
5090 | } | ||||||
5091 | |||||||
5092 | |||||||
5093 | 0 | 0 | push (@all, 'class' . $dir . '.stamp'); | ||||
5094 | } | ||||||
5095 | |||||||
5096 | |||||||
5097 | # Handle some of the minor options. | ||||||
5098 | sub handle_minor_options | ||||||
5099 | { | ||||||
5100 | 0 | 0 | if (option 'readme-alpha') | ||||
5101 | { | ||||||
5102 | 0 | 0 | if ($relative_dir eq '.') | ||||
5103 | { | ||||||
5104 | 0 | 0 | if ($package_version !~ /^$GNITS_VERSION_PATTERN$/) | ||||
5105 | { | ||||||
5106 | 0 | 0 | msg ('error-gnits', $package_version_location, | ||||
5107 | "version `$package_version' doesn't follow " . | ||||||
5108 | "Gnits standards"); | ||||||
5109 | } | ||||||
5110 | 0 | 0 | if (defined $1 && -f 'README-alpha') | ||||
5111 | { | ||||||
5112 | # This means we have an alpha release. See | ||||||
5113 | # GNITS_VERSION_PATTERN for details. | ||||||
5114 | 0 | 0 | push_dist_common ('README-alpha'); | ||||
5115 | } | ||||||
5116 | } | ||||||
5117 | } | ||||||
5118 | } | ||||||
5119 | |||||||
5120 | ################################################################ | ||||||
5121 | |||||||
5122 | # ($OUTPUT, @INPUTS) | ||||||
5123 | # &split_config_file_spec ($SPEC) | ||||||
5124 | # ------------------------------- | ||||||
5125 | # Decode the Autoconf syntax for config files (files, headers, links | ||||||
5126 | # etc.). | ||||||
5127 | sub split_config_file_spec ($) | ||||||
5128 | { | ||||||
5129 | 0 | 0 | my ($spec) = @_; | ||||
5130 | 0 | 0 | my ($output, @inputs) = split (/:/, $spec); | ||||
5131 | |||||||
5132 | 0 | 0 | push @inputs, "$output.in" | ||||
5133 | unless @inputs; | ||||||
5134 | |||||||
5135 | 0 | 0 | return ($output, @inputs); | ||||
5136 | } | ||||||
5137 | |||||||
5138 | # $input | ||||||
5139 | # locate_am (@POSSIBLE_SOURCES) | ||||||
5140 | # ----------------------------- | ||||||
5141 | # AC_CONFIG_FILES allow specifications such as Makefile:top.in:mid.in:bot.in | ||||||
5142 | # This functions returns the first *.in file for which a *.am exists. | ||||||
5143 | # It returns undef otherwise. | ||||||
5144 | sub locate_am (@) | ||||||
5145 | { | ||||||
5146 | 0 | 0 | my (@rest) = @_; | ||||
5147 | 0 | 0 | my $input; | ||||
5148 | 0 | 0 | foreach my $file (@rest) | ||||
5149 | { | ||||||
5150 | 0 | 0 | if (($file =~ /^(.*)\.in$/) && -f "$1.am") | ||||
5151 | { | ||||||
5152 | 0 | 0 | $input = $file; | ||||
5153 | 0 | 0 | last; | ||||
5154 | } | ||||||
5155 | } | ||||||
5156 | 0 | 0 | return $input; | ||||
5157 | } | ||||||
5158 | |||||||
5159 | 1 | 2 | my %make_list; | ||||
5160 | |||||||
5161 | # &scan_autoconf_config_files ($WHERE, $CONFIG-FILES) | ||||||
5162 | # --------------------------------------------------- | ||||||
5163 | # Study $CONFIG-FILES which is the first argument to AC_CONFIG_FILES | ||||||
5164 | # (or AC_OUTPUT). | ||||||
5165 | sub scan_autoconf_config_files ($$) | ||||||
5166 | { | ||||||
5167 | 0 | 0 | my ($where, $config_files) = @_; | ||||
5168 | |||||||
5169 | # Look at potential Makefile.am's. | ||||||
5170 | 0 | 0 | foreach (split ' ', $config_files) | ||||
5171 | { | ||||||
5172 | # Must skip empty string for Perl 4. | ||||||
5173 | 0 | 0 | next if $_ eq "\\" || $_ eq ''; | ||||
5174 | |||||||
5175 | # Handle $local:$input syntax. | ||||||
5176 | 0 | 0 | my ($local, @rest) = split (/:/); | ||||
5177 | 0 | 0 | @rest = ("$local.in",) unless @rest; | ||||
5178 | 0 | 0 | msg ('portability', $where, | ||||
5179 | "Omit leading `./' from config file names such as `$local'," | ||||||
5180 | . "\nas not all make implementations treat `file' and `./file' equally.") | ||||||
5181 | if ($local =~ /^\.\//); | ||||||
5182 | 0 | 0 | my $input = locate_am @rest; | ||||
5183 | 0 | 0 | if ($input) | ||||
5184 | { | ||||||
5185 | # We have a file that automake should generate. | ||||||
5186 | 0 | 0 | $make_list{$input} = join (':', ($local, @rest)); | ||||
5187 | } | ||||||
5188 | else | ||||||
5189 | { | ||||||
5190 | # We have a file that automake should cause to be | ||||||
5191 | # rebuilt, but shouldn't generate itself. | ||||||
5192 | 0 | 0 | push (@other_input_files, $_); | ||||
5193 | } | ||||||
5194 | 0 | 0 | $ac_config_files_location{$local} = $where; | ||||
5195 | 0 | 0 | $ac_config_files_condition{$local} = | ||||
5196 | new Automake::Condition (@cond_stack) | ||||||
5197 | if (@cond_stack); | ||||||
5198 | } | ||||||
5199 | } | ||||||
5200 | |||||||
5201 | |||||||
5202 | # &scan_autoconf_traces ($FILENAME) | ||||||
5203 | # --------------------------------- | ||||||
5204 | sub scan_autoconf_traces ($) | ||||||
5205 | { | ||||||
5206 | 0 | 0 | my ($filename) = @_; | ||||
5207 | |||||||
5208 | # Macros to trace, with their minimal number of arguments. | ||||||
5209 | # | ||||||
5210 | # IMPORTANT: If you add a macro here, you should also add this macro | ||||||
5211 | # ========= to Automake-preselection in autoconf/lib/autom4te.in. | ||||||
5212 | 0 | 0 | my %traced = ( | ||||
5213 | AC_CANONICAL_BUILD => 0, | ||||||
5214 | AC_CANONICAL_HOST => 0, | ||||||
5215 | AC_CANONICAL_TARGET => 0, | ||||||
5216 | AC_CONFIG_AUX_DIR => 1, | ||||||
5217 | AC_CONFIG_FILES => 1, | ||||||
5218 | AC_CONFIG_HEADERS => 1, | ||||||
5219 | AC_CONFIG_LIBOBJ_DIR => 1, | ||||||
5220 | AC_CONFIG_LINKS => 1, | ||||||
5221 | AC_FC_SRCEXT => 1, | ||||||
5222 | AC_INIT => 0, | ||||||
5223 | AC_LIBSOURCE => 1, | ||||||
5224 | AC_REQUIRE_AUX_FILE => 1, | ||||||
5225 | AC_SUBST_TRACE => 1, | ||||||
5226 | AM_AUTOMAKE_VERSION => 1, | ||||||
5227 | AM_CONDITIONAL => 2, | ||||||
5228 | AM_ENABLE_MULTILIB => 0, | ||||||
5229 | AM_GNU_GETTEXT => 0, | ||||||
5230 | AM_GNU_GETTEXT_INTL_SUBDIR => 0, | ||||||
5231 | AM_INIT_AUTOMAKE => 0, | ||||||
5232 | AM_MAINTAINER_MODE => 0, | ||||||
5233 | AM_PROG_CC_C_O => 0, | ||||||
5234 | AM_SILENT_RULES => 0, | ||||||
5235 | _AM_SUBST_NOTMAKE => 1, | ||||||
5236 | _AM_COND_IF => 1, | ||||||
5237 | _AM_COND_ELSE => 1, | ||||||
5238 | _AM_COND_ENDIF => 1, | ||||||
5239 | LT_SUPPORTED_TAG => 1, | ||||||
5240 | _LT_AC_TAGCONFIG => 0, | ||||||
5241 | m4_include => 1, | ||||||
5242 | m4_sinclude => 1, | ||||||
5243 | sinclude => 1, | ||||||
5244 | ); | ||||||
5245 | |||||||
5246 | 0 | 0 | my $traces = ($ENV{AUTOCONF} || 'autoconf') . " "; | ||||
5247 | |||||||
5248 | # Use a separator unlikely to be used, not `:', the default, which | ||||||
5249 | # has a precise meaning for AC_CONFIG_FILES and so on. | ||||||
5250 | 0 | 0 | $traces .= join (' ', | ||||
5251 | 0 | 0 | map { "--trace=$_" . ':\$f:\$l::\$d::\$n::\${::}%' } | ||||
5252 | (keys %traced)); | ||||||
5253 | |||||||
5254 | 0 | 0 | my $tracefh = new Automake::XFile ("$traces $filename |"); | ||||
5255 | 0 | 0 | verb "reading $traces"; | ||||
5256 | |||||||
5257 | 0 | 0 | @cond_stack = (); | ||||
5258 | 0 | 0 | my $where; | ||||
5259 | |||||||
5260 | 0 | 0 | while ($_ = $tracefh->getline) | ||||
5261 | { | ||||||
5262 | 0 | 0 | chomp; | ||||
5263 | 0 | 0 | my ($here, $depth, @args) = split (/::/); | ||||
5264 | 0 | 0 | $where = new Automake::Location $here; | ||||
5265 | 0 | 0 | my $macro = $args[0]; | ||||
5266 | |||||||
5267 | 0 | 0 | prog_error ("unrequested trace `$macro'") | ||||
5268 | unless exists $traced{$macro}; | ||||||
5269 | |||||||
5270 | # Skip and diagnose malformed calls. | ||||||
5271 | 0 | 0 | if ($#args < $traced{$macro}) | ||||
5272 | { | ||||||
5273 | 0 | 0 | msg ('syntax', $where, "not enough arguments for $macro"); | ||||
5274 | 0 | 0 | next; | ||||
5275 | } | ||||||
5276 | |||||||
5277 | # Alphabetical ordering please. | ||||||
5278 | 0 | 0 | if ($macro eq 'AC_CANONICAL_BUILD') | ||||
5279 | { | ||||||
5280 | 0 | 0 | if ($seen_canonical <= AC_CANONICAL_BUILD) | ||||
5281 | { | ||||||
5282 | 0 | 0 | $seen_canonical = AC_CANONICAL_BUILD; | ||||
5283 | 0 | 0 | $canonical_location = $where; | ||||
5284 | } | ||||||
5285 | } | ||||||
5286 | elsif ($macro eq 'AC_CANONICAL_HOST') | ||||||
5287 | { | ||||||
5288 | 0 | 0 | if ($seen_canonical <= AC_CANONICAL_HOST) | ||||
5289 | { | ||||||
5290 | 0 | 0 | $seen_canonical = AC_CANONICAL_HOST; | ||||
5291 | 0 | 0 | $canonical_location = $where; | ||||
5292 | } | ||||||
5293 | } | ||||||
5294 | elsif ($macro eq 'AC_CANONICAL_TARGET') | ||||||
5295 | { | ||||||
5296 | 0 | 0 | $seen_canonical = AC_CANONICAL_TARGET; | ||||
5297 | 0 | 0 | $canonical_location = $where; | ||||
5298 | } | ||||||
5299 | elsif ($macro eq 'AC_CONFIG_AUX_DIR') | ||||||
5300 | { | ||||||
5301 | 0 | 0 | if ($seen_init_automake) | ||||
5302 | { | ||||||
5303 | 0 | 0 | error ($where, "AC_CONFIG_AUX_DIR must be called before " | ||||
5304 | . "AM_INIT_AUTOMAKE...", partial => 1); | ||||||
5305 | 0 | 0 | error ($seen_init_automake, "... AM_INIT_AUTOMAKE called here"); | ||||
5306 | } | ||||||
5307 | 0 | 0 | $config_aux_dir = $args[1]; | ||||
5308 | 0 | 0 | $config_aux_dir_set_in_configure_ac = 1; | ||||
5309 | 0 | 0 | $relative_dir = '.'; | ||||
5310 | 0 | 0 | check_directory ($config_aux_dir, $where); | ||||
5311 | } | ||||||
5312 | elsif ($macro eq 'AC_CONFIG_FILES') | ||||||
5313 | { | ||||||
5314 | # Look at potential Makefile.am's. | ||||||
5315 | 0 | 0 | scan_autoconf_config_files ($where, $args[1]); | ||||
5316 | } | ||||||
5317 | elsif ($macro eq 'AC_CONFIG_HEADERS') | ||||||
5318 | { | ||||||
5319 | 0 | 0 | foreach my $spec (split (' ', $args[1])) | ||||
5320 | { | ||||||
5321 | 0 | 0 | my ($dest, @src) = split (':', $spec); | ||||
5322 | 0 | 0 | $ac_config_files_location{$dest} = $where; | ||||
5323 | 0 | 0 | push @config_headers, $spec; | ||||
5324 | } | ||||||
5325 | } | ||||||
5326 | elsif ($macro eq 'AC_CONFIG_LIBOBJ_DIR') | ||||||
5327 | { | ||||||
5328 | 0 | 0 | $config_libobj_dir = $args[1]; | ||||
5329 | 0 | 0 | $relative_dir = '.'; | ||||
5330 | 0 | 0 | check_directory ($config_libobj_dir, $where); | ||||
5331 | } | ||||||
5332 | elsif ($macro eq 'AC_CONFIG_LINKS') | ||||||
5333 | { | ||||||
5334 | 0 | 0 | foreach my $spec (split (' ', $args[1])) | ||||
5335 | { | ||||||
5336 | 0 | 0 | my ($dest, $src) = split (':', $spec); | ||||
5337 | 0 | 0 | $ac_config_files_location{$dest} = $where; | ||||
5338 | 0 | 0 | push @config_links, $spec; | ||||
5339 | } | ||||||
5340 | } | ||||||
5341 | elsif ($macro eq 'AC_FC_SRCEXT') | ||||||
5342 | { | ||||||
5343 | 0 | 0 | my $suffix = $args[1]; | ||||
5344 | # These flags are used as %SOURCEFLAG% in depend2.am, | ||||||
5345 | # where the trailing space is important. | ||||||
5346 | 0 | 0 | $sourceflags{'.' . $suffix} = '$(FCFLAGS_' . $suffix . ') ' | ||||
5347 | if ($suffix eq 'f90' || $suffix eq 'f95' || $suffix eq 'f03' || $suffix eq 'f08'); | ||||||
5348 | } | ||||||
5349 | elsif ($macro eq 'AC_INIT') | ||||||
5350 | { | ||||||
5351 | 0 | 0 | if (defined $args[2]) | ||||
5352 | { | ||||||
5353 | 0 | 0 | $package_version = $args[2]; | ||||
5354 | 0 | 0 | $package_version_location = $where; | ||||
5355 | } | ||||||
5356 | } | ||||||
5357 | elsif ($macro eq 'AC_LIBSOURCE') | ||||||
5358 | { | ||||||
5359 | 0 | 0 | $libsources{$args[1]} = $here; | ||||
5360 | } | ||||||
5361 | elsif ($macro eq 'AC_REQUIRE_AUX_FILE') | ||||||
5362 | { | ||||||
5363 | # Only remember the first time a file is required. | ||||||
5364 | 0 | 0 | $required_aux_file{$args[1]} = $where | ||||
5365 | unless exists $required_aux_file{$args[1]}; | ||||||
5366 | } | ||||||
5367 | elsif ($macro eq 'AC_SUBST_TRACE') | ||||||
5368 | { | ||||||
5369 | # Just check for alphanumeric in AC_SUBST_TRACE. If you do | ||||||
5370 | # AC_SUBST(5), then too bad. | ||||||
5371 | 0 | 0 | $configure_vars{$args[1]} = $where | ||||
5372 | if $args[1] =~ /^\w+$/; | ||||||
5373 | } | ||||||
5374 | elsif ($macro eq 'AM_AUTOMAKE_VERSION') | ||||||
5375 | { | ||||||
5376 | 0 | 0 | error ($where, | ||||
5377 | "version mismatch. This is Automake $VERSION,\n" . | ||||||
5378 | "but the definition used by this AM_INIT_AUTOMAKE\n" . | ||||||
5379 | "comes from Automake $args[1]. You should recreate\n" . | ||||||
5380 | "aclocal.m4 with aclocal and run automake again.\n", | ||||||
5381 | # $? = 63 is used to indicate version mismatch to missing. | ||||||
5382 | exit_code => 63) | ||||||
5383 | if $VERSION ne $args[1]; | ||||||
5384 | |||||||
5385 | 0 | 0 | $seen_automake_version = 1; | ||||
5386 | } | ||||||
5387 | elsif ($macro eq 'AM_CONDITIONAL') | ||||||
5388 | { | ||||||
5389 | 0 | 0 | $configure_cond{$args[1]} = $where; | ||||
5390 | } | ||||||
5391 | elsif ($macro eq 'AM_ENABLE_MULTILIB') | ||||||
5392 | { | ||||||
5393 | 0 | 0 | $seen_multilib = $where; | ||||
5394 | } | ||||||
5395 | elsif ($macro eq 'AM_GNU_GETTEXT') | ||||||
5396 | { | ||||||
5397 | 0 | 0 | $seen_gettext = $where; | ||||
5398 | 0 | 0 | $ac_gettext_location = $where; | ||||
5399 | 0 | 0 | $seen_gettext_external = grep ($_ eq 'external', @args); | ||||
5400 | } | ||||||
5401 | elsif ($macro eq 'AM_GNU_GETTEXT_INTL_SUBDIR') | ||||||
5402 | { | ||||||
5403 | 0 | 0 | $seen_gettext_intl = $where; | ||||
5404 | } | ||||||
5405 | elsif ($macro eq 'AM_INIT_AUTOMAKE') | ||||||
5406 | { | ||||||
5407 | 0 | 0 | $seen_init_automake = $where; | ||||
5408 | 0 | 0 | if (defined $args[2]) | ||||
5409 | { | ||||||
5410 | 0 | 0 | $package_version = $args[2]; | ||||
5411 | 0 | 0 | $package_version_location = $where; | ||||
5412 | } | ||||||
5413 | elsif (defined $args[1]) | ||||||
5414 | { | ||||||
5415 | 0 | 0 | exit $exit_code | ||||
5416 | if (process_global_option_list ($where, | ||||||
5417 | split (' ', $args[1]))); | ||||||
5418 | } | ||||||
5419 | } | ||||||
5420 | elsif ($macro eq 'AM_MAINTAINER_MODE') | ||||||
5421 | { | ||||||
5422 | 0 | 0 | $seen_maint_mode = $where; | ||||
5423 | } | ||||||
5424 | elsif ($macro eq 'AM_PROG_CC_C_O') | ||||||
5425 | { | ||||||
5426 | 0 | 0 | $seen_cc_c_o = $where; | ||||
5427 | } | ||||||
5428 | elsif ($macro eq 'AM_SILENT_RULES') | ||||||
5429 | { | ||||||
5430 | 0 | 0 | set_global_option ('silent-rules', $where); | ||||
5431 | } | ||||||
5432 | elsif ($macro eq '_AM_COND_IF') | ||||||
5433 | { | ||||||
5434 | 0 | 0 | cond_stack_if ('', $args[1], $where); | ||||
5435 | 0 | 0 | error ($where, "missing m4 quoting, macro depth $depth") | ||||
5436 | if ($depth != 1); | ||||||
5437 | } | ||||||
5438 | elsif ($macro eq '_AM_COND_ELSE') | ||||||
5439 | { | ||||||
5440 | 0 | 0 | cond_stack_else ('!', $args[1], $where); | ||||
5441 | 0 | 0 | error ($where, "missing m4 quoting, macro depth $depth") | ||||
5442 | if ($depth != 1); | ||||||
5443 | } | ||||||
5444 | elsif ($macro eq '_AM_COND_ENDIF') | ||||||
5445 | { | ||||||
5446 | 0 | 0 | cond_stack_endif (undef, undef, $where); | ||||
5447 | 0 | 0 | error ($where, "missing m4 quoting, macro depth $depth") | ||||
5448 | if ($depth != 1); | ||||||
5449 | } | ||||||
5450 | elsif ($macro eq '_AM_SUBST_NOTMAKE') | ||||||
5451 | { | ||||||
5452 | 0 | 0 | $ignored_configure_vars{$args[1]} = $where; | ||||
5453 | } | ||||||
5454 | elsif ($macro eq 'm4_include' | ||||||
5455 | || $macro eq 'm4_sinclude' | ||||||
5456 | || $macro eq 'sinclude') | ||||||
5457 | { | ||||||
5458 | # Skip missing `sinclude'd files. | ||||||
5459 | 0 | 0 | next if $macro ne 'm4_include' && ! -f $args[1]; | ||||
5460 | |||||||
5461 | # Some modified versions of Autoconf don't use | ||||||
5462 | # frozen files. Consequently it's possible that we see all | ||||||
5463 | # m4_include's performed during Autoconf's startup. | ||||||
5464 | # Obviously we don't want to distribute Autoconf's files | ||||||
5465 | # so we skip absolute filenames here. | ||||||
5466 | 0 | 0 | push @configure_deps, '$(top_srcdir)/' . $args[1] | ||||
5467 | unless $here =~ m,^(?:\w:)?[\\/],; | ||||||
5468 | # Keep track of the greatest timestamp. | ||||||
5469 | 0 | 0 | if (-e $args[1]) | ||||
5470 | { | ||||||
5471 | 0 | 0 | my $mtime = mtime $args[1]; | ||||
5472 | 0 | 0 | $configure_deps_greatest_timestamp = $mtime | ||||
5473 | if $mtime > $configure_deps_greatest_timestamp; | ||||||
5474 | } | ||||||
5475 | } | ||||||
5476 | elsif ($macro eq 'LT_SUPPORTED_TAG') | ||||||
5477 | { | ||||||
5478 | 0 | 0 | $libtool_tags{$args[1]} = 1; | ||||
5479 | 0 | 0 | $libtool_new_api = 1; | ||||
5480 | } | ||||||
5481 | elsif ($macro eq '_LT_AC_TAGCONFIG') | ||||||
5482 | { | ||||||
5483 | # _LT_AC_TAGCONFIG is an old macro present in Libtool 1.5. | ||||||
5484 | # We use it to detect whether tags are supported. Our | ||||||
5485 | # preferred interface is LT_SUPPORTED_TAG, but it was | ||||||
5486 | # introduced in Libtool 1.6. | ||||||
5487 | 0 | 0 | if (0 == keys %libtool_tags) | ||||
5488 | { | ||||||
5489 | # Hardcode the tags supported by Libtool 1.5. | ||||||
5490 | 0 | 0 | %libtool_tags = (CC => 1, CXX => 1, GCJ => 1, F77 => 1); | ||||
5491 | } | ||||||
5492 | } | ||||||
5493 | } | ||||||
5494 | |||||||
5495 | 0 | 0 | error ($where, "condition stack not properly closed") | ||||
5496 | if (@cond_stack); | ||||||
5497 | |||||||
5498 | 0 | 0 | $tracefh->close; | ||||
5499 | } | ||||||
5500 | |||||||
5501 | |||||||
5502 | # &scan_autoconf_files () | ||||||
5503 | # ----------------------- | ||||||
5504 | # Check whether we use `configure.ac' or `configure.in'. | ||||||
5505 | # Scan it (and possibly `aclocal.m4') for interesting things. | ||||||
5506 | # We must scan aclocal.m4 because there might be AC_SUBSTs and such there. | ||||||
5507 | sub scan_autoconf_files () | ||||||
5508 | { | ||||||
5509 | # Reinitialize libsources here. This isn't really necessary, | ||||||
5510 | # since we currently assume there is only one configure.ac. But | ||||||
5511 | # that won't always be the case. | ||||||
5512 | 0 | 0 | %libsources = (); | ||||
5513 | |||||||
5514 | # Keep track of the youngest configure dependency. | ||||||
5515 | 0 | 0 | $configure_deps_greatest_timestamp = mtime $configure_ac; | ||||
5516 | 0 | 0 | if (-e 'aclocal.m4') | ||||
5517 | { | ||||||
5518 | 0 | 0 | my $mtime = mtime 'aclocal.m4'; | ||||
5519 | 0 | 0 | $configure_deps_greatest_timestamp = $mtime | ||||
5520 | if $mtime > $configure_deps_greatest_timestamp; | ||||||
5521 | } | ||||||
5522 | |||||||
5523 | 0 | 0 | scan_autoconf_traces ($configure_ac); | ||||
5524 | |||||||
5525 | 0 | 0 | @configure_input_files = sort keys %make_list; | ||||
5526 | # Set input and output files if not specified by user. | ||||||
5527 | 0 | 0 | if (! @input_files) | ||||
5528 | { | ||||||
5529 | 0 | 0 | @input_files = @configure_input_files; | ||||
5530 | 0 | 0 | %output_files = %make_list; | ||||
5531 | } | ||||||
5532 | |||||||
5533 | |||||||
5534 | 0 | 0 | if (! $seen_init_automake) | ||||
5535 | { | ||||||
5536 | 0 | 0 | err_ac ("no proper invocation of AM_INIT_AUTOMAKE was found.\nYou " | ||||
5537 | . "should verify that $configure_ac invokes AM_INIT_AUTOMAKE," | ||||||
5538 | . "\nthat aclocal.m4 is present in the top-level directory,\n" | ||||||
5539 | . "and that aclocal.m4 was recently regenerated " | ||||||
5540 | . "(using aclocal)."); | ||||||
5541 | } | ||||||
5542 | else | ||||||
5543 | { | ||||||
5544 | 0 | 0 | if (! $seen_automake_version) | ||||
5545 | { | ||||||
5546 | 0 | 0 | if (-f 'aclocal.m4') | ||||
5547 | { | ||||||
5548 | 0 | 0 | error ($seen_init_automake, | ||||
5549 | "your implementation of AM_INIT_AUTOMAKE comes from " . | ||||||
5550 | "an\nold Automake version. You should recreate " . | ||||||
5551 | "aclocal.m4\nwith aclocal and run automake again.\n", | ||||||
5552 | # $? = 63 is used to indicate version mismatch to missing. | ||||||
5553 | exit_code => 63); | ||||||
5554 | } | ||||||
5555 | else | ||||||
5556 | { | ||||||
5557 | 0 | 0 | error ($seen_init_automake, | ||||
5558 | "no proper implementation of AM_INIT_AUTOMAKE was " . | ||||||
5559 | "found,\nprobably because aclocal.m4 is missing...\n" . | ||||||
5560 | "You should run aclocal to create this file, then\n" . | ||||||
5561 | "run automake again.\n"); | ||||||
5562 | } | ||||||
5563 | } | ||||||
5564 | } | ||||||
5565 | |||||||
5566 | 0 | 0 | locate_aux_dir (); | ||||
5567 | |||||||
5568 | # Reorder @input_files so that the Makefile that distributes aux | ||||||
5569 | # files is processed last. This is important because each directory | ||||||
5570 | # can require auxiliary scripts and we should wait until they have | ||||||
5571 | # been installed before distributing them. | ||||||
5572 | |||||||
5573 | # The Makefile.in that distribute the aux files is the one in | ||||||
5574 | # $config_aux_dir or the top-level Makefile. | ||||||
5575 | 0 | 0 | my $auxdirdist = is_make_dir ($config_aux_dir) ? $config_aux_dir : '.'; | ||||
5576 | 0 | 0 | my @new_input_files = (); | ||||
5577 | 0 | 0 | while (@input_files) | ||||
5578 | { | ||||||
5579 | 0 | 0 | my $in = pop @input_files; | ||||
5580 | 0 | 0 | my @ins = split (/:/, $output_files{$in}); | ||||
5581 | 0 | 0 | if (dirname ($ins[0]) eq $auxdirdist) | ||||
5582 | { | ||||||
5583 | 0 | 0 | push @new_input_files, $in; | ||||
5584 | 0 | 0 | $automake_will_process_aux_dir = 1; | ||||
5585 | } | ||||||
5586 | else | ||||||
5587 | { | ||||||
5588 | 0 | 0 | unshift @new_input_files, $in; | ||||
5589 | } | ||||||
5590 | } | ||||||
5591 | 0 | 0 | @input_files = @new_input_files; | ||||
5592 | |||||||
5593 | # If neither the auxdir/Makefile nor the ./Makefile are generated | ||||||
5594 | # by Automake, we won't distribute the aux files anyway. Assume | ||||||
5595 | # the user know what (s)he does, and pretend we will distribute | ||||||
5596 | # them to disable the error in require_file_internal. | ||||||
5597 | 0 | 0 | $automake_will_process_aux_dir = 1 if ! is_make_dir ($auxdirdist); | ||||
5598 | |||||||
5599 | # Look for some files we need. Always check for these. This | ||||||
5600 | # check must be done for every run, even those where we are only | ||||||
5601 | # looking at a subdir Makefile. We must set relative_dir for | ||||||
5602 | # maybe_push_required_file to work. | ||||||
5603 | # Sort the files for stable verbose output. | ||||||
5604 | 0 | 0 | $relative_dir = '.'; | ||||
5605 | 0 | 0 | foreach my $file (sort keys %required_aux_file) | ||||
5606 | { | ||||||
5607 | 0 | 0 | require_conf_file ($required_aux_file{$file}->get, FOREIGN, $file) | ||||
5608 | } | ||||||
5609 | 0 | 0 | err_am "`install.sh' is an anachronism; use `install-sh' instead" | ||||
5610 | if -f $config_aux_dir . '/install.sh'; | ||||||
5611 | |||||||
5612 | # Preserve dist_common for later. | ||||||
5613 | 0 | 0 | $configure_dist_common = variable_value ('DIST_COMMON') || ''; | ||||
5614 | |||||||
5615 | } | ||||||
5616 | |||||||
5617 | ################################################################ | ||||||
5618 | |||||||
5619 | # Set up for Cygnus mode. | ||||||
5620 | sub check_cygnus | ||||||
5621 | { | ||||||
5622 | 0 | 0 | my $cygnus = option 'cygnus'; | ||||
5623 | 0 | 0 | return unless $cygnus; | ||||
5624 | |||||||
5625 | 0 | 0 | set_strictness ('foreign'); | ||||
5626 | 0 | 0 | set_option ('no-installinfo', $cygnus); | ||||
5627 | 0 | 0 | set_option ('no-dependencies', $cygnus); | ||||
5628 | 0 | 0 | set_option ('no-dist', $cygnus); | ||||
5629 | |||||||
5630 | 0 | 0 | err_ac "`AM_MAINTAINER_MODE' required when --cygnus specified" | ||||
5631 | if !$seen_maint_mode; | ||||||
5632 | } | ||||||
5633 | |||||||
5634 | # Do any extra checking for GNU standards. | ||||||
5635 | sub check_gnu_standards | ||||||
5636 | { | ||||||
5637 | 0 | 0 | if ($relative_dir eq '.') | ||||
5638 | { | ||||||
5639 | # In top level (or only) directory. | ||||||
5640 | 0 | 0 | require_file ("$am_file.am", GNU, | ||||
5641 | qw/INSTALL NEWS README AUTHORS ChangeLog/); | ||||||
5642 | |||||||
5643 | # Accept one of these three licenses; default to COPYING. | ||||||
5644 | # Make sure we do not overwrite an existing license. | ||||||
5645 | 0 | 0 | my $license; | ||||
5646 | 0 | 0 | foreach (qw /COPYING COPYING.LIB COPYING.LESSER/) | ||||
5647 | { | ||||||
5648 | 0 | 0 | if (-f $_) | ||||
5649 | { | ||||||
5650 | 0 | 0 | $license = $_; | ||||
5651 | 0 | 0 | last; | ||||
5652 | } | ||||||
5653 | } | ||||||
5654 | 0 | 0 | require_file ("$am_file.am", GNU, 'COPYING') | ||||
5655 | unless $license; | ||||||
5656 | } | ||||||
5657 | |||||||
5658 | 0 | 0 | for my $opt ('no-installman', 'no-installinfo') | ||||
5659 | { | ||||||
5660 | 0 | 0 | msg ('error-gnu', option $opt, | ||||
5661 | "option `$opt' disallowed by GNU standards") | ||||||
5662 | if option $opt; | ||||||
5663 | } | ||||||
5664 | } | ||||||
5665 | |||||||
5666 | # Do any extra checking for GNITS standards. | ||||||
5667 | sub check_gnits_standards | ||||||
5668 | { | ||||||
5669 | 0 | 0 | if ($relative_dir eq '.') | ||||
5670 | { | ||||||
5671 | # In top level (or only) directory. | ||||||
5672 | 0 | 0 | require_file ("$am_file.am", GNITS, 'THANKS'); | ||||
5673 | } | ||||||
5674 | } | ||||||
5675 | |||||||
5676 | ################################################################ | ||||||
5677 | # | ||||||
5678 | # Functions to handle files of each language. | ||||||
5679 | |||||||
5680 | # Each `lang_X_rewrite($DIRECTORY, $BASE, $EXT)' function follows a | ||||||
5681 | # simple formula: Return value is LANG_SUBDIR if the resulting object | ||||||
5682 | # file should be in a subdir if the source file is, LANG_PROCESS if | ||||||
5683 | # file is to be dealt with, LANG_IGNORE otherwise. | ||||||
5684 | |||||||
5685 | # Much of the actual processing is handled in | ||||||
5686 | # handle_single_transform. These functions exist so that | ||||||
5687 | # auxiliary information can be recorded for a later cleanup pass. | ||||||
5688 | # Note that the calls to these functions are computed, so don't bother | ||||||
5689 | # searching for their precise names in the source. | ||||||
5690 | |||||||
5691 | # This is just a convenience function that can be used to determine | ||||||
5692 | # when a subdir object should be used. | ||||||
5693 | sub lang_sub_obj | ||||||
5694 | { | ||||||
5695 | 0 | 0 | return option 'subdir-objects' ? LANG_SUBDIR : LANG_PROCESS; | ||||
5696 | } | ||||||
5697 | |||||||
5698 | # Rewrite a single C source file. | ||||||
5699 | sub lang_c_rewrite | ||||||
5700 | { | ||||||
5701 | 0 | 0 | my ($directory, $base, $ext, $nonansi_obj, $have_per_exec_flags, $var) = @_; | ||||
5702 | |||||||
5703 | 0 | 0 | if (option 'ansi2knr' && $base =~ /_$/) | ||||
5704 | { | ||||||
5705 | # FIXME: include line number in error. | ||||||
5706 | 0 | 0 | err_am "C source file `$base.c' would be deleted by ansi2knr rules"; | ||||
5707 | } | ||||||
5708 | |||||||
5709 | 0 | 0 | my $r = LANG_PROCESS; | ||||
5710 | 0 | 0 | if (option 'subdir-objects') | ||||
5711 | { | ||||||
5712 | 0 | 0 | $r = LANG_SUBDIR; | ||||
5713 | 0 | 0 | if ($directory && $directory ne '.') | ||||
5714 | { | ||||||
5715 | 0 | 0 | $base = $directory . '/' . $base; | ||||
5716 | |||||||
5717 | # libtool is always able to put the object at the proper place, | ||||||
5718 | # so we do not have to require AM_PROG_CC_C_O when building .lo files. | ||||||
5719 | 0 | 0 | msg_var ('portability', $var, | ||||
5720 | "compiling `$base.c' in subdir requires " | ||||||
5721 | . "`AM_PROG_CC_C_O' in `$configure_ac'", | ||||||
5722 | uniq_scope => US_GLOBAL, | ||||||
5723 | uniq_part => 'AM_PROG_CC_C_O subdir') | ||||||
5724 | unless $seen_cc_c_o || $nonansi_obj eq '.lo'; | ||||||
5725 | } | ||||||
5726 | |||||||
5727 | # In this case we already have the directory information, so | ||||||
5728 | # don't add it again. | ||||||
5729 | 0 | 0 | $de_ansi_files{$base} = ''; | ||||
5730 | } | ||||||
5731 | else | ||||||
5732 | { | ||||||
5733 | 0 | 0 | $de_ansi_files{$base} = (($directory eq '.' || $directory eq '') | ||||
5734 | ? '' | ||||||
5735 | : "$directory/"); | ||||||
5736 | } | ||||||
5737 | |||||||
5738 | 0 | 0 | if (! $seen_cc_c_o | ||||
5739 | && $have_per_exec_flags | ||||||
5740 | && ! option 'subdir-objects' | ||||||
5741 | && $nonansi_obj ne '.lo') | ||||||
5742 | { | ||||||
5743 | 0 | 0 | msg_var ('portability', | ||||
5744 | $var, "compiling `$base.c' with per-target flags requires " | ||||||
5745 | . "`AM_PROG_CC_C_O' in `$configure_ac'", | ||||||
5746 | uniq_scope => US_GLOBAL, | ||||||
5747 | uniq_part => 'AM_PROG_CC_C_O per-target') | ||||||
5748 | } | ||||||
5749 | |||||||
5750 | 0 | 0 | return $r; | ||||
5751 | } | ||||||
5752 | |||||||
5753 | # Rewrite a single C++ source file. | ||||||
5754 | sub lang_cxx_rewrite | ||||||
5755 | { | ||||||
5756 | 0 | 0 | return &lang_sub_obj; | ||||
5757 | } | ||||||
5758 | |||||||
5759 | # Rewrite a single header file. | ||||||
5760 | sub lang_header_rewrite | ||||||
5761 | { | ||||||
5762 | # Header files are simply ignored. | ||||||
5763 | 0 | 0 | return LANG_IGNORE; | ||||
5764 | } | ||||||
5765 | |||||||
5766 | # Rewrite a single Vala source file. | ||||||
5767 | sub lang_vala_rewrite | ||||||
5768 | { | ||||||
5769 | 0 | 0 | my ($directory, $base, $ext) = @_; | ||||
5770 | |||||||
5771 | 0 | 0 | (my $newext = $ext) =~ s/vala$/c/; | ||||
5772 | 0 | 0 | return (LANG_SUBDIR, $newext); | ||||
5773 | } | ||||||
5774 | |||||||
5775 | # Rewrite a single yacc file. | ||||||
5776 | sub lang_yacc_rewrite | ||||||
5777 | { | ||||||
5778 | 0 | 0 | my ($directory, $base, $ext) = @_; | ||||
5779 | |||||||
5780 | 0 | 0 | my $r = &lang_sub_obj; | ||||
5781 | 0 | 0 | (my $newext = $ext) =~ tr/y/c/; | ||||
5782 | 0 | 0 | return ($r, $newext); | ||||
5783 | } | ||||||
5784 | |||||||
5785 | # Rewrite a single yacc++ file. | ||||||
5786 | sub lang_yaccxx_rewrite | ||||||
5787 | { | ||||||
5788 | 0 | 0 | my ($directory, $base, $ext) = @_; | ||||
5789 | |||||||
5790 | 0 | 0 | my $r = &lang_sub_obj; | ||||
5791 | 0 | 0 | (my $newext = $ext) =~ tr/y/c/; | ||||
5792 | 0 | 0 | return ($r, $newext); | ||||
5793 | } | ||||||
5794 | |||||||
5795 | # Rewrite a single lex file. | ||||||
5796 | sub lang_lex_rewrite | ||||||
5797 | { | ||||||
5798 | 0 | 0 | my ($directory, $base, $ext) = @_; | ||||
5799 | |||||||
5800 | 0 | 0 | my $r = &lang_sub_obj; | ||||
5801 | 0 | 0 | (my $newext = $ext) =~ tr/l/c/; | ||||
5802 | 0 | 0 | return ($r, $newext); | ||||
5803 | } | ||||||
5804 | |||||||
5805 | # Rewrite a single lex++ file. | ||||||
5806 | sub lang_lexxx_rewrite | ||||||
5807 | { | ||||||
5808 | 0 | 0 | my ($directory, $base, $ext) = @_; | ||||
5809 | |||||||
5810 | 0 | 0 | my $r = &lang_sub_obj; | ||||
5811 | 0 | 0 | (my $newext = $ext) =~ tr/l/c/; | ||||
5812 | 0 | 0 | return ($r, $newext); | ||||
5813 | } | ||||||
5814 | |||||||
5815 | # Rewrite a single assembly file. | ||||||
5816 | sub lang_asm_rewrite | ||||||
5817 | { | ||||||
5818 | 0 | 0 | return &lang_sub_obj; | ||||
5819 | } | ||||||
5820 | |||||||
5821 | # Rewrite a single preprocessed assembly file. | ||||||
5822 | sub lang_cppasm_rewrite | ||||||
5823 | { | ||||||
5824 | 0 | 0 | return &lang_sub_obj; | ||||
5825 | } | ||||||
5826 | |||||||
5827 | # Rewrite a single Fortran 77 file. | ||||||
5828 | sub lang_f77_rewrite | ||||||
5829 | { | ||||||
5830 | 0 | 0 | return &lang_sub_obj; | ||||
5831 | } | ||||||
5832 | |||||||
5833 | # Rewrite a single Fortran file. | ||||||
5834 | sub lang_fc_rewrite | ||||||
5835 | { | ||||||
5836 | 0 | 0 | return &lang_sub_obj; | ||||
5837 | } | ||||||
5838 | |||||||
5839 | # Rewrite a single preprocessed Fortran file. | ||||||
5840 | sub lang_ppfc_rewrite | ||||||
5841 | { | ||||||
5842 | 0 | 0 | return &lang_sub_obj; | ||||
5843 | } | ||||||
5844 | |||||||
5845 | # Rewrite a single preprocessed Fortran 77 file. | ||||||
5846 | sub lang_ppf77_rewrite | ||||||
5847 | { | ||||||
5848 | 0 | 0 | return &lang_sub_obj; | ||||
5849 | } | ||||||
5850 | |||||||
5851 | # Rewrite a single ratfor file. | ||||||
5852 | sub lang_ratfor_rewrite | ||||||
5853 | { | ||||||
5854 | 0 | 0 | return &lang_sub_obj; | ||||
5855 | } | ||||||
5856 | |||||||
5857 | # Rewrite a single Objective C file. | ||||||
5858 | sub lang_objc_rewrite | ||||||
5859 | { | ||||||
5860 | 0 | 0 | return &lang_sub_obj; | ||||
5861 | } | ||||||
5862 | |||||||
5863 | # Rewrite a single Unified Parallel C file. | ||||||
5864 | sub lang_upc_rewrite | ||||||
5865 | { | ||||||
5866 | 0 | 0 | return &lang_sub_obj; | ||||
5867 | } | ||||||
5868 | |||||||
5869 | # Rewrite a single Java file. | ||||||
5870 | sub lang_java_rewrite | ||||||
5871 | { | ||||||
5872 | 0 | 0 | return LANG_SUBDIR; | ||||
5873 | } | ||||||
5874 | |||||||
5875 | # The lang_X_finish functions are called after all source file | ||||||
5876 | # processing is done. Each should handle defining rules for the | ||||||
5877 | # language, etc. A finish function is only called if a source file of | ||||||
5878 | # the appropriate type has been seen. | ||||||
5879 | |||||||
5880 | sub lang_c_finish | ||||||
5881 | { | ||||||
5882 | # Push all libobjs files onto de_ansi_files. We actually only | ||||||
5883 | # push files which exist in the current directory, and which are | ||||||
5884 | # genuine source files. | ||||||
5885 | 0 | 0 | foreach my $file (keys %libsources) | ||||
5886 | { | ||||||
5887 | 0 | 0 | if ($file =~ /^(.*)\.[cly]$/ && -f "$relative_dir/$file") | ||||
5888 | { | ||||||
5889 | 0 | 0 | $de_ansi_files{$1} = '' | ||||
5890 | } | ||||||
5891 | } | ||||||
5892 | |||||||
5893 | 0 | 0 | if (option 'ansi2knr' && keys %de_ansi_files) | ||||
5894 | { | ||||||
5895 | # Make all _.c files depend on their corresponding .c files. | ||||||
5896 | 0 | 0 | my @objects; | ||||
5897 | 0 | 0 | foreach my $base (sort keys %de_ansi_files) | ||||
5898 | { | ||||||
5899 | # Each _.c file must depend on ansi2knr; otherwise it | ||||||
5900 | # might be used in a parallel build before it is built. | ||||||
5901 | # We need to support files in the srcdir and in the build | ||||||
5902 | # dir (because these files might be auto-generated. But | ||||||
5903 | # we can't use $< -- some makes only define $< during a | ||||||
5904 | # suffix rule. | ||||||
5905 | 0 | 0 | my $ansfile = $de_ansi_files{$base} . $base . '.c'; | ||||
5906 | 0 | 0 | $output_rules .= ($base . "_.c: $ansfile \$(ANSI2KNR)\n\t" | ||||
5907 | . '$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) ' | ||||||
5908 | . '`if test -f $(srcdir)/' . $ansfile | ||||||
5909 | . '; then echo $(srcdir)/' . $ansfile | ||||||
5910 | . '; else echo ' . $ansfile . '; fi` ' | ||||||
5911 | . "| sed 's/^# \\([0-9]\\)/#line \\1/' " | ||||||
5912 | . '| $(ANSI2KNR) > $@' | ||||||
5913 | # If ansi2knr fails then we shouldn't | ||||||
5914 | # create the _.c file | ||||||
5915 | . " || rm -f \$\@\n"); | ||||||
5916 | 0 | 0 | push (@objects, $base . '_.$(OBJEXT)'); | ||||
5917 | 0 | 0 | push (@objects, $base . '_.lo') | ||||
5918 | if var ('LIBTOOL'); | ||||||
5919 | |||||||
5920 | # Explicitly clean the _.c files if they are in a | ||||||
5921 | # subdirectory. (In the current directory they get erased | ||||||
5922 | # by a `rm -f *_.c' rule.) | ||||||
5923 | 0 | 0 | $clean_files{$base . '_.c'} = MOSTLY_CLEAN | ||||
5924 | if dirname ($base) ne '.'; | ||||||
5925 | } | ||||||
5926 | |||||||
5927 | # Make all _.o (and _.lo) files depend on ansi2knr. | ||||||
5928 | # Use a sneaky little hack to make it print nicely. | ||||||
5929 | 0 | 0 | &pretty_print_rule ('', '', @objects, ':', '$(ANSI2KNR)'); | ||||
5930 | } | ||||||
5931 | } | ||||||
5932 | |||||||
5933 | sub lang_vala_finish_target ($$) | ||||||
5934 | { | ||||||
5935 | 0 | 0 | my ($self, $name) = @_; | ||||
5936 | |||||||
5937 | 0 | 0 | my $derived = canonicalize ($name); | ||||
5938 | 0 | 0 | my $varname = $derived . '_SOURCES'; | ||||
5939 | 0 | 0 | my $var = var ($varname); | ||||
5940 | |||||||
5941 | 0 | 0 | if ($var) | ||||
5942 | { | ||||||
5943 | 0 | 0 | foreach my $file ($var->value_as_list_recursive) | ||||
5944 | { | ||||||
5945 | 0 | 0 | $output_rules .= "\$(srcdir)/$file: \$(srcdir)/${derived}_vala.stamp\n". | ||||
5946 | "\t\@if test -f \$@; then :; else \\\n". | ||||||
5947 | "\t rm -f \$(srcdir)/${derived}_vala.stamp; \\\n". | ||||||
5948 | "\t \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n". | ||||||
5949 | "\tfi\n" | ||||||
5950 | if $file =~ s/(.*)\.vala$/$1.c/; | ||||||
5951 | } | ||||||
5952 | } | ||||||
5953 | |||||||
5954 | # Add rebuild rules for generated header and vapi files | ||||||
5955 | 0 | 0 | my $flags = var ($derived . '_VALAFLAGS'); | ||||
5956 | 0 | 0 | if ($flags) | ||||
5957 | { | ||||||
5958 | 0 | 0 | my $lastflag = ''; | ||||
5959 | 0 | 0 | foreach my $flag ($flags->value_as_list_recursive) | ||||
5960 | { | ||||||
5961 | 0 | 0 | if (grep (/$lastflag/, ('-H', '-h', '--header', '--internal-header', | ||||
5962 | '--vapi', '--internal-vapi', '--gir'))) | ||||||
5963 | { | ||||||
5964 | 0 | 0 | my $headerfile = $flag; | ||||
5965 | 0 | 0 | $output_rules .= "\$(srcdir)/$headerfile: \$(srcdir)/${derived}_vala.stamp\n". | ||||
5966 | "\t\@if test -f \$@; then :; else \\\n". | ||||||
5967 | "\t rm -f \$(srcdir)/${derived}_vala.stamp; \\\n". | ||||||
5968 | "\t \$(am__cd) \$(srcdir) && \$(MAKE) \$(AM_MAKEFLAGS) ${derived}_vala.stamp; \\\n". | ||||||
5969 | "\tfi\n"; | ||||||
5970 | |||||||
5971 | # valac is not used when building from dist tarballs | ||||||
5972 | # distribute the generated files | ||||||
5973 | 0 | 0 | push_dist_common ($headerfile); | ||||
5974 | 0 | 0 | $clean_files{$headerfile} = MAINTAINER_CLEAN; | ||||
5975 | } | ||||||
5976 | 0 | 0 | $lastflag = $flag; | ||||
5977 | } | ||||||
5978 | } | ||||||
5979 | |||||||
5980 | 0 | 0 | my $compile = $self->compile; | ||||
5981 | |||||||
5982 | # Rewrite each occurrence of `AM_VALAFLAGS' in the compile | ||||||
5983 | # rule into `${derived}_VALAFLAGS' if it exists. | ||||||
5984 | 0 | 0 | my $val = "${derived}_VALAFLAGS"; | ||||
5985 | 0 | 0 | $compile =~ s/\(AM_VALAFLAGS\)/\($val\)/ | ||||
5986 | if set_seen ($val); | ||||||
5987 | |||||||
5988 | # VALAFLAGS is a user variable (per GNU Standards), | ||||||
5989 | # it should not be overridden in the Makefile... | ||||||
5990 | 0 | 0 | check_user_variables ['VALAFLAGS']; | ||||
5991 | |||||||
5992 | 0 | 0 | my $dirname = dirname ($name); | ||||
5993 | |||||||
5994 | # Only generate C code, do not run C compiler | ||||||
5995 | 0 | 0 | $compile .= " -C"; | ||||
5996 | |||||||
5997 | 0 | 0 | my $verbose = verbose_flag ('VALAC'); | ||||
5998 | 0 | 0 | my $silent = silent_flag (); | ||||
5999 | |||||||
6000 | 0 | 0 | $output_rules .= | ||||
6001 | "${derived}_vala.stamp: \$(${derived}_SOURCES)\n". | ||||||
6002 | "\t${verbose}${compile} \$(${derived}_SOURCES)\n". | ||||||
6003 | "\t${silent}touch \$@\n"; | ||||||
6004 | |||||||
6005 | 0 | 0 | push_dist_common ("${derived}_vala.stamp"); | ||||
6006 | |||||||
6007 | 0 | 0 | $clean_files{"${derived}_vala.stamp"} = MAINTAINER_CLEAN; | ||||
6008 | } | ||||||
6009 | |||||||
6010 | # Add output rules to invoke valac and create stamp file as a witness | ||||||
6011 | # to handle multiple outputs. This function is called after all source | ||||||
6012 | # file processing is done. | ||||||
6013 | sub lang_vala_finish | ||||||
6014 | { | ||||||
6015 | 0 | 0 | my ($self) = @_; | ||||
6016 | |||||||
6017 | 0 | 0 | foreach my $prog (keys %known_programs) | ||||
6018 | { | ||||||
6019 | 0 | 0 | lang_vala_finish_target ($self, $prog); | ||||
6020 | } | ||||||
6021 | |||||||
6022 | 0 | 0 | while (my ($name) = each %known_libraries) | ||||
6023 | { | ||||||
6024 | 0 | 0 | lang_vala_finish_target ($self, $name); | ||||
6025 | } | ||||||
6026 | } | ||||||
6027 | |||||||
6028 | # The built .c files should be cleaned only on maintainer-clean | ||||||
6029 | # as the .c files are distributed. This function is called for each | ||||||
6030 | # .vala source file. | ||||||
6031 | sub lang_vala_target_hook | ||||||
6032 | { | ||||||
6033 | 0 | 0 | my ($self, $aggregate, $output, $input, %transform) = @_; | ||||
6034 | |||||||
6035 | 0 | 0 | $clean_files{$output} = MAINTAINER_CLEAN; | ||||
6036 | } | ||||||
6037 | |||||||
6038 | # This is a yacc helper which is called whenever we have decided to | ||||||
6039 | # compile a yacc file. | ||||||
6040 | sub lang_yacc_target_hook | ||||||
6041 | { | ||||||
6042 | 0 | 0 | my ($self, $aggregate, $output, $input, %transform) = @_; | ||||
6043 | |||||||
6044 | 0 | 0 | my $flag = $aggregate . "_YFLAGS"; | ||||
6045 | 0 | 0 | my $flagvar = var $flag; | ||||
6046 | 0 | 0 | my $YFLAGSvar = var 'YFLAGS'; | ||||
6047 | 0 | 0 | if (($flagvar && $flagvar->variable_value =~ /$DASH_D_PATTERN/o) | ||||
6048 | || ($YFLAGSvar && $YFLAGSvar->variable_value =~ /$DASH_D_PATTERN/o)) | ||||||
6049 | { | ||||||
6050 | 0 | 0 | (my $output_base = $output) =~ s/$KNOWN_EXTENSIONS_PATTERN$//; | ||||
6051 | 0 | 0 | my $header = $output_base . '.h'; | ||||
6052 | |||||||
6053 | # Found a `-d' that applies to the compilation of this file. | ||||||
6054 | # Add a dependency for the generated header file, and arrange | ||||||
6055 | # for that file to be included in the distribution. | ||||||
6056 | 0 | 0 | foreach my $cond (Automake::Rule::define (${header}, 'internal', | ||||
6057 | RULE_AUTOMAKE, TRUE, | ||||||
6058 | INTERNAL)) | ||||||
6059 | { | ||||||
6060 | 0 | 0 | my $condstr = $cond->subst_string; | ||||
6061 | 0 | 0 | $output_rules .= | ||||
6062 | "$condstr${header}: $output\n" | ||||||
6063 | # Recover from removal of $header | ||||||
6064 | . "$condstr\t\@if test ! -f \$@; then \\\n" | ||||||
6065 | . "$condstr\t rm -f $output; \\\n" | ||||||
6066 | . "$condstr\t \$(MAKE) \$(AM_MAKEFLAGS) $output; \\\n" | ||||||
6067 | . "$condstr\telse :; fi\n"; | ||||||
6068 | } | ||||||
6069 | # Distribute the generated file, unless its .y source was | ||||||
6070 | # listed in a nodist_ variable. (&handle_source_transform | ||||||
6071 | # will set DIST_SOURCE.) | ||||||
6072 | 0 | 0 | &push_dist_common ($header) | ||||
6073 | if $transform{'DIST_SOURCE'}; | ||||||
6074 | |||||||
6075 | # If the files are built in the build directory, then we want | ||||||
6076 | # to remove them with `make clean'. If they are in srcdir | ||||||
6077 | # they shouldn't be touched. However, we can't determine this | ||||||
6078 | # statically, and the GNU rules say that yacc/lex output files | ||||||
6079 | # should be removed by maintainer-clean. So that's what we | ||||||
6080 | # do. | ||||||
6081 | 0 | 0 | $clean_files{$header} = MAINTAINER_CLEAN; | ||||
6082 | } | ||||||
6083 | # Erase $OUTPUT on `make maintainer-clean' (by GNU standards). | ||||||
6084 | # See the comment above for $HEADER. | ||||||
6085 | 0 | 0 | $clean_files{$output} = MAINTAINER_CLEAN; | ||||
6086 | } | ||||||
6087 | |||||||
6088 | # This is a lex helper which is called whenever we have decided to | ||||||
6089 | # compile a lex file. | ||||||
6090 | sub lang_lex_target_hook | ||||||
6091 | { | ||||||
6092 | 0 | 0 | my ($self, $aggregate, $output, $input) = @_; | ||||
6093 | # If the files are built in the build directory, then we want to | ||||||
6094 | # remove them with `make clean'. If they are in srcdir they | ||||||
6095 | # shouldn't be touched. However, we can't determine this | ||||||
6096 | # statically, and the GNU rules say that yacc/lex output files | ||||||
6097 | # should be removed by maintainer-clean. So that's what we do. | ||||||
6098 | 0 | 0 | $clean_files{$output} = MAINTAINER_CLEAN; | ||||
6099 | } | ||||||
6100 | |||||||
6101 | # This is a helper for both lex and yacc. | ||||||
6102 | sub yacc_lex_finish_helper | ||||||
6103 | { | ||||||
6104 | 0 | 0 | return if defined $language_scratch{'lex-yacc-done'}; | ||||
6105 | 0 | 0 | $language_scratch{'lex-yacc-done'} = 1; | ||||
6106 | |||||||
6107 | # FIXME: for now, no line number. | ||||||
6108 | 0 | 0 | require_conf_file ($configure_ac, FOREIGN, 'ylwrap'); | ||||
6109 | 0 | 0 | &define_variable ('YLWRAP', "$am_config_aux_dir/ylwrap", INTERNAL); | ||||
6110 | } | ||||||
6111 | |||||||
6112 | sub lang_yacc_finish | ||||||
6113 | { | ||||||
6114 | 0 | 0 | return if defined $language_scratch{'yacc-done'}; | ||||
6115 | 0 | 0 | $language_scratch{'yacc-done'} = 1; | ||||
6116 | |||||||
6117 | 0 | 0 | reject_var 'YACCFLAGS', "`YACCFLAGS' obsolete; use `YFLAGS' instead"; | ||||
6118 | |||||||
6119 | 0 | 0 | yacc_lex_finish_helper; | ||||
6120 | } | ||||||
6121 | |||||||
6122 | |||||||
6123 | sub lang_lex_finish | ||||||
6124 | { | ||||||
6125 | 0 | 0 | return if defined $language_scratch{'lex-done'}; | ||||
6126 | 0 | 0 | $language_scratch{'lex-done'} = 1; | ||||
6127 | |||||||
6128 | 0 | 0 | yacc_lex_finish_helper; | ||||
6129 | } | ||||||
6130 | |||||||
6131 | |||||||
6132 | # Given a hash table of linker names, pick the name that has the most | ||||||
6133 | # precedence. This is lame, but something has to have global | ||||||
6134 | # knowledge in order to eliminate the conflict. Add more linkers as | ||||||
6135 | # required. | ||||||
6136 | sub resolve_linker | ||||||
6137 | { | ||||||
6138 | 0 | 0 | my (%linkers) = @_; | ||||
6139 | |||||||
6140 | 0 | 0 | foreach my $l (qw(GCJLINK CXXLINK F77LINK FCLINK OBJCLINK UPCLINK)) | ||||
6141 | { | ||||||
6142 | 0 | 0 | return $l if defined $linkers{$l}; | ||||
6143 | } | ||||||
6144 | 0 | 0 | return 'LINK'; | ||||
6145 | } | ||||||
6146 | |||||||
6147 | # Called to indicate that an extension was used. | ||||||
6148 | sub saw_extension | ||||||
6149 | { | ||||||
6150 | 0 | 0 | my ($ext) = @_; | ||||
6151 | 0 | 0 | if (! defined $extension_seen{$ext}) | ||||
6152 | { | ||||||
6153 | 0 | 0 | $extension_seen{$ext} = 1; | ||||
6154 | } | ||||||
6155 | else | ||||||
6156 | { | ||||||
6157 | 0 | 0 | ++$extension_seen{$ext}; | ||||
6158 | } | ||||||
6159 | } | ||||||
6160 | |||||||
6161 | # Return the number of files seen for a given language. Knows about | ||||||
6162 | # special cases we care about. FIXME: this is hideous. We need | ||||||
6163 | # something that involves real language objects. For instance yacc | ||||||
6164 | # and yaccxx could both derive from a common yacc class which would | ||||||
6165 | # know about the strange ylwrap requirement. (Or better yet we could | ||||||
6166 | # just not support legacy yacc!) | ||||||
6167 | sub count_files_for_language | ||||||
6168 | { | ||||||
6169 | 0 | 0 | my ($name) = @_; | ||||
6170 | |||||||
6171 | 0 | 0 | my @names; | ||||
6172 | 0 | 0 | if ($name eq 'yacc' || $name eq 'yaccxx') | ||||
6173 | { | ||||||
6174 | 0 | 0 | @names = ('yacc', 'yaccxx'); | ||||
6175 | } | ||||||
6176 | elsif ($name eq 'lex' || $name eq 'lexxx') | ||||||
6177 | { | ||||||
6178 | 0 | 0 | @names = ('lex', 'lexxx'); | ||||
6179 | } | ||||||
6180 | else | ||||||
6181 | { | ||||||
6182 | 0 | 0 | @names = ($name); | ||||
6183 | } | ||||||
6184 | |||||||
6185 | 0 | 0 | my $r = 0; | ||||
6186 | 0 | 0 | foreach $name (@names) | ||||
6187 | { | ||||||
6188 | 0 | 0 | my $lang = $languages{$name}; | ||||
6189 | 0 0 | 0 0 | foreach my $ext (@{$lang->extensions}) | ||||
6190 | { | ||||||
6191 | 0 | 0 | $r += $extension_seen{$ext} | ||||
6192 | if defined $extension_seen{$ext}; | ||||||
6193 | } | ||||||
6194 | } | ||||||
6195 | |||||||
6196 | 0 | 0 | return $r | ||||
6197 | } | ||||||
6198 | |||||||
6199 | # Called to ask whether source files have been seen . If HEADERS is 1, | ||||||
6200 | # headers can be included. | ||||||
6201 | sub saw_sources_p | ||||||
6202 | { | ||||||
6203 | 0 | 0 | my ($headers) = @_; | ||||
6204 | |||||||
6205 | # count all the sources | ||||||
6206 | 0 | 0 | my $count = 0; | ||||
6207 | 0 | 0 | foreach my $val (values %extension_seen) | ||||
6208 | { | ||||||
6209 | 0 | 0 | $count += $val; | ||||
6210 | } | ||||||
6211 | |||||||
6212 | 0 | 0 | if (!$headers) | ||||
6213 | { | ||||||
6214 | 0 | 0 | $count -= count_files_for_language ('header'); | ||||
6215 | } | ||||||
6216 | |||||||
6217 | 0 | 0 | return $count > 0; | ||||
6218 | } | ||||||
6219 | |||||||
6220 | |||||||
6221 | # register_language (%ATTRIBUTE) | ||||||
6222 | # ------------------------------ | ||||||
6223 | # Register a single language. | ||||||
6224 | # Each %ATTRIBUTE is of the form ATTRIBUTE => VALUE. | ||||||
6225 | sub register_language (%) | ||||||
6226 | { | ||||||
6227 | 18 | 94 | my (%option) = @_; | ||||
6228 | |||||||
6229 | # Set the defaults. | ||||||
6230 | 18 | 51 | $option{'ansi'} = 0 | ||||
6231 | unless defined $option{'ansi'}; | ||||||
6232 | 18 | 44 | $option{'autodep'} = 'no' | ||||
6233 | unless defined $option{'autodep'}; | ||||||
6234 | 18 | 40 | $option{'linker'} = '' | ||||
6235 | unless defined $option{'linker'}; | ||||||
6236 | 18 | 33 | $option{'flags'} = [] | ||||
6237 | unless defined $option{'flags'}; | ||||||
6238 | 27 | 53 | $option{'output_extensions'} = sub { return ( '.$(OBJEXT)', '.lo' ) } | ||||
6239 | 18 | 68 | unless defined $option{'output_extensions'}; | ||||
6240 | 18 | 48 | $option{'nodist_specific'} = 0 | ||||
6241 | unless defined $option{'nodist_specific'}; | ||||||
6242 | |||||||
6243 | 18 | 83 | my $lang = new Language (%option); | ||||
6244 | |||||||
6245 | # Fill indexes. | ||||||
6246 | 18 18 18 | 29 19 41 | $extension_map{$_} = $lang->name foreach @{$lang->extensions}; | ||||
6247 | 18 | 44 | $languages{$lang->name} = $lang; | ||||
6248 | 18 | 40 | my $link = $lang->linker; | ||||
6249 | 18 | 29 | if ($link) | ||||
6250 | { | ||||||
6251 | 10 | 21 | if (exists $link_languages{$link}) | ||||
6252 | { | ||||||
6253 | 3 | 7 | prog_error ("`$link' has different definitions in " | ||||
6254 | . $lang->name . " and " . $link_languages{$link}->name) | ||||||
6255 | if $lang->link ne $link_languages{$link}->link; | ||||||
6256 | } | ||||||
6257 | else | ||||||
6258 | { | ||||||
6259 | 7 | 14 | $link_languages{$link} = $lang; | ||||
6260 | } | ||||||
6261 | } | ||||||
6262 | |||||||
6263 | # Update the pattern of known extensions. | ||||||
6264 | 18 18 | 16 38 | accept_extensions (@{$lang->extensions}); | ||||
6265 | |||||||
6266 | # Upate the $suffix_rule map. | ||||||
6267 | 18 18 | 41 35 | foreach my $suffix (@{$lang->extensions}) | ||||
6268 | { | ||||||
6269 | 45 45 | 48 93 | foreach my $dest (&{$lang->output_extensions} ($suffix)) | ||||
6270 | { | ||||||
6271 | 65 | 137 | register_suffix_rule (INTERNAL, $suffix, $dest); | ||||
6272 | } | ||||||
6273 | } | ||||||
6274 | } | ||||||
6275 | |||||||
6276 | # derive_suffix ($EXT, $OBJ) | ||||||
6277 | # -------------------------- | ||||||
6278 | # This function is used to find a path from a user-specified suffix $EXT | ||||||
6279 | # to $OBJ or to some other suffix we recognize internally, e.g. `cc'. | ||||||
6280 | sub derive_suffix ($$) | ||||||
6281 | { | ||||||
6282 | 0 | 0 | my ($source_ext, $obj) = @_; | ||||
6283 | |||||||
6284 | 0 | 0 | while (! $extension_map{$source_ext} | ||||
6285 | && $source_ext ne $obj | ||||||
6286 | && exists $suffix_rules->{$source_ext} | ||||||
6287 | && exists $suffix_rules->{$source_ext}{$obj}) | ||||||
6288 | { | ||||||
6289 | 0 | 0 | $source_ext = $suffix_rules->{$source_ext}{$obj}[0]; | ||||
6290 | } | ||||||
6291 | |||||||
6292 | 0 | 0 | return $source_ext; | ||||
6293 | } | ||||||
6294 | |||||||
6295 | |||||||
6296 | ################################################################ | ||||||
6297 | |||||||
6298 | # Pretty-print something and append to output_rules. | ||||||
6299 | sub pretty_print_rule | ||||||
6300 | { | ||||||
6301 | 0 | 0 | $output_rules .= &makefile_wrap (@_); | ||||
6302 | } | ||||||
6303 | |||||||
6304 | |||||||
6305 | ################################################################ | ||||||
6306 | |||||||
6307 | |||||||
6308 | ## -------------------------------- ## | ||||||
6309 | ## Handling the conditional stack. ## | ||||||
6310 | ## -------------------------------- ## | ||||||
6311 | |||||||
6312 | |||||||
6313 | # $STRING | ||||||
6314 | # make_conditional_string ($NEGATE, $COND) | ||||||
6315 | # ---------------------------------------- | ||||||
6316 | sub make_conditional_string ($$) | ||||||
6317 | { | ||||||
6318 | 0 | 0 | my ($negate, $cond) = @_; | ||||
6319 | 0 | 0 | $cond = "${cond}_TRUE" | ||||
6320 | unless $cond =~ /^TRUE|FALSE$/; | ||||||
6321 | 0 | 0 | $cond = Automake::Condition::conditional_negate ($cond) | ||||
6322 | if $negate; | ||||||
6323 | 0 | 0 | return $cond; | ||||
6324 | } | ||||||
6325 | |||||||
6326 | |||||||
6327 | 1 | 9 | my %_am_macro_for_cond = | ||||
6328 | ( | ||||||
6329 | AMDEP => "one of the compiler tests\n" | ||||||
6330 | . " AC_PROG_CC, AC_PROG_CXX, AC_PROG_CXX, AC_PROG_OBJC,\n" | ||||||
6331 | . " AM_PROG_AS, AM_PROG_GCJ, AM_PROG_UPC", | ||||||
6332 | am__fastdepCC => 'AC_PROG_CC', | ||||||
6333 | am__fastdepCCAS => 'AM_PROG_AS', | ||||||
6334 | am__fastdepCXX => 'AC_PROG_CXX', | ||||||
6335 | am__fastdepGCJ => 'AM_PROG_GCJ', | ||||||
6336 | am__fastdepOBJC => 'AC_PROG_OBJC', | ||||||
6337 | am__fastdepUPC => 'AM_PROG_UPC' | ||||||
6338 | ); | ||||||
6339 | |||||||
6340 | # $COND | ||||||
6341 | # cond_stack_if ($NEGATE, $COND, $WHERE) | ||||||
6342 | # -------------------------------------- | ||||||
6343 | sub cond_stack_if ($$$) | ||||||
6344 | { | ||||||
6345 | 0 | 0 | my ($negate, $cond, $where) = @_; | ||||
6346 | |||||||
6347 | 0 | 0 | if (! $configure_cond{$cond} && $cond !~ /^TRUE|FALSE$/) | ||||
6348 | { | ||||||
6349 | 0 | 0 | my $text = "$cond does not appear in AM_CONDITIONAL"; | ||||
6350 | 0 | 0 | my $scope = US_LOCAL; | ||||
6351 | 0 | 0 | if (exists $_am_macro_for_cond{$cond}) | ||||
6352 | { | ||||||
6353 | 0 | 0 | my $mac = $_am_macro_for_cond{$cond}; | ||||
6354 | 0 | 0 | $text .= "\n The usual way to define `$cond' is to add "; | ||||
6355 | 0 | 0 | $text .= ($mac =~ / /) ? $mac : "`$mac'"; | ||||
6356 | 0 | 0 | $text .= "\n to `$configure_ac' and run `aclocal' and `autoconf' again."; | ||||
6357 | # These warnings appear in Automake files (depend2.am), | ||||||
6358 | # so there is no need to display them more than once: | ||||||
6359 | 0 | 0 | $scope = US_GLOBAL; | ||||
6360 | } | ||||||
6361 | 0 | 0 | error $where, $text, uniq_scope => $scope; | ||||
6362 | } | ||||||
6363 | |||||||
6364 | 0 | 0 | push (@cond_stack, make_conditional_string ($negate, $cond)); | ||||
6365 | |||||||
6366 | 0 | 0 | return new Automake::Condition (@cond_stack); | ||||
6367 | } | ||||||
6368 | |||||||
6369 | |||||||
6370 | # $COND | ||||||
6371 | # cond_stack_else ($NEGATE, $COND, $WHERE) | ||||||
6372 | # ---------------------------------------- | ||||||
6373 | sub cond_stack_else ($$$) | ||||||
6374 | { | ||||||
6375 | 0 | 0 | my ($negate, $cond, $where) = @_; | ||||
6376 | |||||||
6377 | 0 | 0 | if (! @cond_stack) | ||||
6378 | { | ||||||
6379 | 0 | 0 | error $where, "else without if"; | ||||
6380 | 0 | 0 | return FALSE; | ||||
6381 | } | ||||||
6382 | |||||||
6383 | 0 | 0 | $cond_stack[$#cond_stack] = | ||||
6384 | Automake::Condition::conditional_negate ($cond_stack[$#cond_stack]); | ||||||
6385 | |||||||
6386 | # If $COND is given, check against it. | ||||||
6387 | 0 | 0 | if (defined $cond) | ||||
6388 | { | ||||||
6389 | 0 | 0 | $cond = make_conditional_string ($negate, $cond); | ||||
6390 | |||||||
6391 | 0 | 0 | error ($where, "else reminder ($negate$cond) incompatible with " | ||||
6392 | . "current conditional: $cond_stack[$#cond_stack]") | ||||||
6393 | if $cond_stack[$#cond_stack] ne $cond; | ||||||
6394 | } | ||||||
6395 | |||||||
6396 | 0 | 0 | return new Automake::Condition (@cond_stack); | ||||
6397 | } | ||||||
6398 | |||||||
6399 | |||||||
6400 | # $COND | ||||||
6401 | # cond_stack_endif ($NEGATE, $COND, $WHERE) | ||||||
6402 | # ----------------------------------------- | ||||||
6403 | sub cond_stack_endif ($$$) | ||||||
6404 | { | ||||||
6405 | 0 | 0 | my ($negate, $cond, $where) = @_; | ||||
6406 | 0 | 0 | my $old_cond; | ||||
6407 | |||||||
6408 | 0 | 0 | if (! @cond_stack) | ||||
6409 | { | ||||||
6410 | 0 | 0 | error $where, "endif without if"; | ||||
6411 | 0 | 0 | return TRUE; | ||||
6412 | } | ||||||
6413 | |||||||
6414 | # If $COND is given, check against it. | ||||||
6415 | 0 | 0 | if (defined $cond) | ||||
6416 | { | ||||||
6417 | 0 | 0 | $cond = make_conditional_string ($negate, $cond); | ||||
6418 | |||||||
6419 | 0 | 0 | error ($where, "endif reminder ($negate$cond) incompatible with " | ||||
6420 | . "current conditional: $cond_stack[$#cond_stack]") | ||||||
6421 | if $cond_stack[$#cond_stack] ne $cond; | ||||||
6422 | } | ||||||
6423 | |||||||
6424 | 0 | 0 | pop @cond_stack; | ||||
6425 | |||||||
6426 | 0 | 0 | return new Automake::Condition (@cond_stack); | ||||
6427 | } | ||||||
6428 | |||||||
6429 | |||||||
6430 | |||||||
6431 | |||||||
6432 | |||||||
6433 | ## ------------------------ ## | ||||||
6434 | ## Handling the variables. ## | ||||||
6435 | ## ------------------------ ## | ||||||
6436 | |||||||
6437 | |||||||
6438 | # &define_pretty_variable ($VAR, $COND, $WHERE, @VALUE) | ||||||
6439 | # ----------------------------------------------------- | ||||||
6440 | # Like define_variable, but the value is a list, and the variable may | ||||||
6441 | # be defined conditionally. The second argument is the condition | ||||||
6442 | # under which the value should be defined; this should be the empty | ||||||
6443 | # string to define the variable unconditionally. The third argument | ||||||
6444 | # is a list holding the values to use for the variable. The value is | ||||||
6445 | # pretty printed in the output file. | ||||||
6446 | sub define_pretty_variable ($$$@) | ||||||
6447 | { | ||||||
6448 | 0 | 0 | my ($var, $cond, $where, @value) = @_; | ||||
6449 | |||||||
6450 | 0 | 0 | if (! vardef ($var, $cond)) | ||||
6451 | { | ||||||
6452 | 0 | 0 | Automake::Variable::define ($var, VAR_AUTOMAKE, '', $cond, "@value", | ||||
6453 | '', $where, VAR_PRETTY); | ||||||
6454 | 0 | 0 | rvar ($var)->rdef ($cond)->set_seen; | ||||
6455 | } | ||||||
6456 | } | ||||||
6457 | |||||||
6458 | |||||||
6459 | # define_variable ($VAR, $VALUE, $WHERE) | ||||||
6460 | # -------------------------------------- | ||||||
6461 | # Define a new Automake Makefile variable VAR to VALUE, but only if | ||||||
6462 | # not already defined. | ||||||
6463 | sub define_variable ($$$) | ||||||
6464 | { | ||||||
6465 | 0 | 0 | my ($var, $value, $where) = @_; | ||||
6466 | 0 | 0 | define_pretty_variable ($var, TRUE, $where, $value); | ||||
6467 | } | ||||||
6468 | |||||||
6469 | |||||||
6470 | # define_files_variable ($VAR, \@BASENAME, $EXTENSION, $WHERE) | ||||||
6471 | # ----------------------------------------------------------- | ||||||
6472 | # Define the $VAR which content is the list of file names composed of | ||||||
6473 | # a @BASENAME and the $EXTENSION. | ||||||
6474 | sub define_files_variable ($\@$$) | ||||||
6475 | { | ||||||
6476 | 0 | 0 | my ($var, $basename, $extension, $where) = @_; | ||||
6477 | 0 | 0 | define_variable ($var, | ||||
6478 | 0 | 0 | join (' ', map { "$_.$extension" } @$basename), | ||||
6479 | $where); | ||||||
6480 | } | ||||||
6481 | |||||||
6482 | |||||||
6483 | # Like define_variable, but define a variable to be the configure | ||||||
6484 | # substitution by the same name. | ||||||
6485 | sub define_configure_variable ($) | ||||||
6486 | { | ||||||
6487 | 0 | 0 | my ($var) = @_; | ||||
6488 | |||||||
6489 | 0 | 0 | my $pretty = VAR_ASIS; | ||||
6490 | 0 | 0 | my $owner = VAR_CONFIGURE; | ||||
6491 | |||||||
6492 | # Some variables we do not want to output. For instance it | ||||||
6493 | # would be a bad idea to output `U = @U@` when `@U@` can be | ||||||
6494 | # substituted as `\`. | ||||||
6495 | 0 | 0 | $pretty = VAR_SILENT if exists $ignored_configure_vars{$var}; | ||||
6496 | |||||||
6497 | # ANSI2KNR is a variable that Automake wants to redefine, so | ||||||
6498 | # it must be owned by Automake. (It is also used as a proof | ||||||
6499 | # that AM_C_PROTOTYPES has been run, that's why we do not simply | ||||||
6500 | # omit the AC_SUBST.) | ||||||
6501 | 0 | 0 | $owner = VAR_AUTOMAKE if $var eq 'ANSI2KNR'; | ||||
6502 | |||||||
6503 | 0 | 0 | Automake::Variable::define ($var, $owner, '', TRUE, subst $var, | ||||
6504 | '', $configure_vars{$var}, $pretty); | ||||||
6505 | } | ||||||
6506 | |||||||
6507 | |||||||
6508 | # define_compiler_variable ($LANG) | ||||||
6509 | # -------------------------------- | ||||||
6510 | # Define a compiler variable. We also handle defining the `LT' | ||||||
6511 | # version of the command when using libtool. | ||||||
6512 | sub define_compiler_variable ($) | ||||||
6513 | { | ||||||
6514 | 0 | 0 | my ($lang) = @_; | ||||
6515 | |||||||
6516 | 0 | 0 | my ($var, $value) = ($lang->compiler, $lang->compile); | ||||
6517 | 0 | 0 | my $libtool_tag = ''; | ||||
6518 | 0 | 0 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' | ||||
6519 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; | ||||||
6520 | 0 | 0 | &define_variable ($var, $value, INTERNAL); | ||||
6521 | 0 | 0 | if (var ('LIBTOOL')) | ||||
6522 | { | ||||||
6523 | 0 | 0 | my $verbose = define_verbose_libtool (); | ||||
6524 | 0 | 0 | &define_variable ("LT$var", | ||||
6525 | "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) " | ||||||
6526 | . "\$(LIBTOOLFLAGS) --mode=compile $value", | ||||||
6527 | INTERNAL); | ||||||
6528 | } | ||||||
6529 | 0 | 0 | define_verbose_tagvar ($lang->ccer || 'GEN'); | ||||
6530 | } | ||||||
6531 | |||||||
6532 | |||||||
6533 | # define_linker_variable ($LANG) | ||||||
6534 | # ------------------------------ | ||||||
6535 | # Define linker variables. | ||||||
6536 | sub define_linker_variable ($) | ||||||
6537 | { | ||||||
6538 | 0 | 0 | my ($lang) = @_; | ||||
6539 | |||||||
6540 | 0 | 0 | my $libtool_tag = ''; | ||||
6541 | 0 | 0 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' | ||||
6542 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; | ||||||
6543 | # CCLD = $(CC). | ||||||
6544 | 0 | 0 | &define_variable ($lang->lder, $lang->ld, INTERNAL); | ||||
6545 | # CCLINK = $(CCLD) blah blah... | ||||||
6546 | 0 | 0 | my $link = ''; | ||||
6547 | 0 | 0 | if (var ('LIBTOOL')) | ||||
6548 | { | ||||||
6549 | 0 | 0 | my $verbose = define_verbose_libtool (); | ||||
6550 | 0 | 0 | $link = "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) " | ||||
6551 | . "\$(LIBTOOLFLAGS) --mode=link "; | ||||||
6552 | } | ||||||
6553 | 0 | 0 | &define_variable ($lang->linker, $link . $lang->link, INTERNAL); | ||||
6554 | 0 | 0 | &define_variable ($lang->compiler, $lang); | ||||
6555 | 0 | 0 | &define_verbose_tagvar ($lang->lder || 'GEN'); | ||||
6556 | } | ||||||
6557 | |||||||
6558 | sub define_per_target_linker_variable ($$) | ||||||
6559 | { | ||||||
6560 | 0 | 0 | my ($linker, $target) = @_; | ||||
6561 | |||||||
6562 | # If the user wrote a custom link command, we don't define ours. | ||||||
6563 | 0 | 0 | return "${target}_LINK" | ||||
6564 | if set_seen "${target}_LINK"; | ||||||
6565 | |||||||
6566 | 0 | 0 | my $xlink = $linker ? $linker : 'LINK'; | ||||
6567 | |||||||
6568 | 0 | 0 | my $lang = $link_languages{$xlink}; | ||||
6569 | 0 | 0 | prog_error "Unknown language for linker variable `$xlink'" | ||||
6570 | unless $lang; | ||||||
6571 | |||||||
6572 | 0 | 0 | my $link_command = $lang->link; | ||||
6573 | 0 | 0 | if (var 'LIBTOOL') | ||||
6574 | { | ||||||
6575 | 0 | 0 | my $libtool_tag = ''; | ||||
6576 | 0 | 0 | $libtool_tag = '--tag=' . $lang->libtool_tag . ' ' | ||||
6577 | if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; | ||||||
6578 | |||||||
6579 | 0 | 0 | my $verbose = define_verbose_libtool (); | ||||
6580 | 0 | 0 | $link_command = | ||||
6581 | "\$(LIBTOOL) $verbose $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) " | ||||||
6582 | . "--mode=link " . $link_command; | ||||||
6583 | } | ||||||
6584 | |||||||
6585 | # Rewrite each occurrence of `AM_$flag' in the link | ||||||
6586 | # command into `${derived}_$flag' if it exists. | ||||||
6587 | 0 | 0 | my $orig_command = $link_command; | ||||
6588 | 0 0 | 0 0 | my @flags = (@{$lang->flags}, 'LDFLAGS'); | ||||
6589 | 0 | 0 | push @flags, 'LIBTOOLFLAGS' if var 'LIBTOOL'; | ||||
6590 | 0 | 0 | for my $flag (@flags) | ||||
6591 | { | ||||||
6592 | 0 | 0 | my $val = "${target}_$flag"; | ||||
6593 | 0 | 0 | $link_command =~ s/\(AM_$flag\)/\($val\)/ | ||||
6594 | if set_seen ($val); | ||||||
6595 | } | ||||||
6596 | |||||||
6597 | # If the computed command is the same as the generic command, use | ||||||
6598 | # the command linker variable. | ||||||
6599 | 0 | 0 | return ($lang->linker, $lang->lder) | ||||
6600 | if $link_command eq $orig_command; | ||||||
6601 | |||||||
6602 | 0 | 0 | &define_variable ("${target}_LINK", $link_command, INTERNAL); | ||||
6603 | 0 | 0 | return ("${target}_LINK", $lang->lder); | ||||
6604 | } | ||||||
6605 | |||||||
6606 | ################################################################ | ||||||
6607 | |||||||
6608 | # &check_trailing_slash ($WHERE, $LINE) | ||||||
6609 | # -------------------------------------- | ||||||
6610 | # Return 1 iff $LINE ends with a slash. | ||||||
6611 | # Might modify $LINE. | ||||||
6612 | sub check_trailing_slash ($\$) | ||||||
6613 | { | ||||||
6614 | 0 | 0 | my ($where, $line) = @_; | ||||
6615 | |||||||
6616 | # Ignore `##' lines. | ||||||
6617 | 0 | 0 | return 0 if $$line =~ /$IGNORE_PATTERN/o; | ||||
6618 | |||||||
6619 | # Catch and fix a common error. | ||||||
6620 | 0 | 0 | msg "syntax", $where, "whitespace following trailing backslash" | ||||
6621 | if $$line =~ s/\\\s+\n$/\\\n/; | ||||||
6622 | |||||||
6623 | 0 | 0 | return $$line =~ /\\$/; | ||||
6624 | } | ||||||
6625 | |||||||
6626 | |||||||
6627 | # &read_am_file ($AMFILE, $WHERE) | ||||||
6628 | # ------------------------------- | ||||||
6629 | # Read Makefile.am and set up %contents. Simultaneously copy lines | ||||||
6630 | # from Makefile.am into $output_trailer, or define variables as | ||||||
6631 | # appropriate. NOTE we put rules in the trailer section. We want | ||||||
6632 | # user rules to come after our generated stuff. | ||||||
6633 | sub read_am_file ($$) | ||||||
6634 | { | ||||||
6635 | 0 | 0 | my ($amfile, $where) = @_; | ||||
6636 | |||||||
6637 | 0 | 0 | my $am_file = new Automake::XFile ("< $amfile"); | ||||
6638 | 0 | 0 | verb "reading $amfile"; | ||||
6639 | |||||||
6640 | # Keep track of the youngest output dependency. | ||||||
6641 | 0 | 0 | my $mtime = mtime $amfile; | ||||
6642 | 0 | 0 | $output_deps_greatest_timestamp = $mtime | ||||
6643 | if $mtime > $output_deps_greatest_timestamp; | ||||||
6644 | |||||||
6645 | 0 | 0 | my $spacing = ''; | ||||
6646 | 0 | 0 | my $comment = ''; | ||||
6647 | 0 | 0 | my $blank = 0; | ||||
6648 | 0 | 0 | my $saw_bk = 0; | ||||
6649 | 0 | 0 | my $var_look = VAR_ASIS; | ||||
6650 | |||||||
6651 | 1 1 1 | 9 2 6 | use constant IN_VAR_DEF => 0; | ||||
6652 | 1 1 1 | 4 1 2 | use constant IN_RULE_DEF => 1; | ||||
6653 | 1 1 1 | 5 1 2 | use constant IN_COMMENT => 2; | ||||
6654 | 0 | 0 | my $prev_state = IN_RULE_DEF; | ||||
6655 | |||||||
6656 | 0 | 0 | while ($_ = $am_file->getline) | ||||
6657 | { | ||||||
6658 | 0 | 0 | $where->set ("$amfile:$."); | ||||
6659 | 0 | 0 | if (/$IGNORE_PATTERN/o) | ||||
6660 | { | ||||||
6661 | # Merely delete comments beginning with two hashes. | ||||||
6662 | } | ||||||
6663 | elsif (/$WHITE_PATTERN/o) | ||||||
6664 | { | ||||||
6665 | 0 | 0 | error $where, "blank line following trailing backslash" | ||||
6666 | if $saw_bk; | ||||||
6667 | # Stick a single white line before the incoming macro or rule. | ||||||
6668 | 0 | 0 | $spacing = "\n"; | ||||
6669 | 0 | 0 | $blank = 1; | ||||
6670 | # Flush all comments seen so far. | ||||||
6671 | 0 | 0 | if ($comment ne '') | ||||
6672 | { | ||||||
6673 | 0 | 0 | $output_vars .= $comment; | ||||
6674 | 0 | 0 | $comment = ''; | ||||
6675 | } | ||||||
6676 | } | ||||||
6677 | elsif (/$COMMENT_PATTERN/o) | ||||||
6678 | { | ||||||
6679 | # Stick comments before the incoming macro or rule. Make | ||||||
6680 | # sure a blank line precedes the first block of comments. | ||||||
6681 | 0 | 0 | $spacing = "\n" unless $blank; | ||||
6682 | 0 | 0 | $blank = 1; | ||||
6683 | 0 | 0 | $comment .= $spacing . $_; | ||||
6684 | 0 | 0 | $spacing = ''; | ||||
6685 | 0 | 0 | $prev_state = IN_COMMENT; | ||||
6686 | } | ||||||
6687 | else | ||||||
6688 | { | ||||||
6689 | 0 | 0 | last; | ||||
6690 | } | ||||||
6691 | 0 | 0 | $saw_bk = check_trailing_slash ($where, $_); | ||||
6692 | } | ||||||
6693 | |||||||
6694 | # We save the conditional stack on entry, and then check to make | ||||||
6695 | # sure it is the same on exit. This lets us conditionally include | ||||||
6696 | # other files. | ||||||
6697 | 0 | 0 | my @saved_cond_stack = @cond_stack; | ||||
6698 | 0 | 0 | my $cond = new Automake::Condition (@cond_stack); | ||||
6699 | |||||||
6700 | 0 | 0 | my $last_var_name = ''; | ||||
6701 | 0 | 0 | my $last_var_type = ''; | ||||
6702 | 0 | 0 | my $last_var_value = ''; | ||||
6703 | 0 | 0 | my $last_where; | ||||
6704 | # FIXME: shouldn't use $_ in this loop; it is too big. | ||||||
6705 | 0 | 0 | while ($_) | ||||
6706 | { | ||||||
6707 | 0 | 0 | $where->set ("$amfile:$."); | ||||
6708 | |||||||
6709 | # Make sure the line is \n-terminated. | ||||||
6710 | 0 | 0 | chomp; | ||||
6711 | 0 | 0 | $_ .= "\n"; | ||||
6712 | |||||||
6713 | # Don't look at MAINTAINER_MODE_TRUE here. That shouldn't be | ||||||
6714 | # used by users. @MAINT@ is an anachronism now. | ||||||
6715 | 0 | 0 | $_ =~ s/\@MAINT\@//g | ||||
6716 | unless $seen_maint_mode; | ||||||
6717 | |||||||
6718 | 0 | 0 | my $new_saw_bk = check_trailing_slash ($where, $_); | ||||
6719 | |||||||
6720 | 0 | 0 | if (/$IGNORE_PATTERN/o) | ||||
6721 | { | ||||||
6722 | # Merely delete comments beginning with two hashes. | ||||||
6723 | |||||||
6724 | # Keep any backslash from the previous line. | ||||||
6725 | 0 | 0 | $new_saw_bk = $saw_bk; | ||||
6726 | } | ||||||
6727 | elsif (/$WHITE_PATTERN/o) | ||||||
6728 | { | ||||||
6729 | # Stick a single white line before the incoming macro or rule. | ||||||
6730 | 0 | 0 | $spacing = "\n"; | ||||
6731 | 0 | 0 | error $where, "blank line following trailing backslash" | ||||
6732 | if $saw_bk; | ||||||
6733 | } | ||||||
6734 | elsif (/$COMMENT_PATTERN/o) | ||||||
6735 | { | ||||||
6736 | 0 | 0 | error $where, "comment following trailing backslash" | ||||
6737 | if $saw_bk && $prev_state != IN_COMMENT; | ||||||
6738 | |||||||
6739 | # Stick comments before the incoming macro or rule. | ||||||
6740 | 0 | 0 | $comment .= $spacing . $_; | ||||
6741 | 0 | 0 | $spacing = ''; | ||||
6742 | 0 | 0 | $prev_state = IN_COMMENT; | ||||
6743 | } | ||||||
6744 | elsif ($saw_bk) | ||||||
6745 | { | ||||||
6746 | 0 | 0 | if ($prev_state == IN_RULE_DEF) | ||||
6747 | { | ||||||
6748 | 0 | 0 | my $cond = new Automake::Condition @cond_stack; | ||||
6749 | 0 | 0 | $output_trailer .= $cond->subst_string; | ||||
6750 | 0 | 0 | $output_trailer .= $_; | ||||
6751 | } | ||||||
6752 | elsif ($prev_state == IN_COMMENT) | ||||||
6753 | { | ||||||
6754 | # If the line doesn't start with a `#', add it. | ||||||
6755 | # We do this because a continued comment like | ||||||
6756 | # # A = foo \ | ||||||
6757 | # bar \ | ||||||
6758 | # baz | ||||||
6759 | # is not portable. BSD make doesn't honor | ||||||
6760 | # escaped newlines in comments. | ||||||
6761 | 0 | 0 | s/^#?/#/; | ||||
6762 | 0 | 0 | $comment .= $spacing . $_; | ||||
6763 | } | ||||||
6764 | else # $prev_state == IN_VAR_DEF | ||||||
6765 | { | ||||||
6766 | 0 | 0 | $last_var_value .= ' ' | ||||
6767 | unless $last_var_value =~ /\s$/; | ||||||
6768 | 0 | 0 | $last_var_value .= $_; | ||||
6769 | |||||||
6770 | 0 | 0 | if (!/\\$/) | ||||
6771 | { | ||||||
6772 | 0 | 0 | Automake::Variable::define ($last_var_name, VAR_MAKEFILE, | ||||
6773 | $last_var_type, $cond, | ||||||
6774 | $last_var_value, $comment, | ||||||
6775 | $last_where, VAR_ASIS) | ||||||
6776 | if $cond != FALSE; | ||||||
6777 | 0 | 0 | $comment = $spacing = ''; | ||||
6778 | } | ||||||
6779 | } | ||||||
6780 | } | ||||||
6781 | |||||||
6782 | elsif (/$IF_PATTERN/o) | ||||||
6783 | { | ||||||
6784 | 0 | 0 | $cond = cond_stack_if ($1, $2, $where); | ||||
6785 | } | ||||||
6786 | elsif (/$ELSE_PATTERN/o) | ||||||
6787 | { | ||||||
6788 | 0 | 0 | $cond = cond_stack_else ($1, $2, $where); | ||||
6789 | } | ||||||
6790 | elsif (/$ENDIF_PATTERN/o) | ||||||
6791 | { | ||||||
6792 | 0 | 0 | $cond = cond_stack_endif ($1, $2, $where); | ||||
6793 | } | ||||||
6794 | |||||||
6795 | elsif (/$RULE_PATTERN/o) | ||||||
6796 | { | ||||||
6797 | # Found a rule. | ||||||
6798 | 0 | 0 | $prev_state = IN_RULE_DEF; | ||||
6799 | |||||||
6800 | # For now we have to output all definitions of user rules | ||||||
6801 | # and can't diagnose duplicates (see the comment in | ||||||
6802 | # Automake::Rule::define). So we go on and ignore the return value. | ||||||
6803 | 0 | 0 | Automake::Rule::define ($1, $amfile, RULE_USER, $cond, $where); | ||||
6804 | |||||||
6805 | 0 | 0 | check_variable_expansions ($_, $where); | ||||
6806 | |||||||
6807 | 0 | 0 | $output_trailer .= $comment . $spacing; | ||||
6808 | 0 | 0 | my $cond = new Automake::Condition @cond_stack; | ||||
6809 | 0 | 0 | $output_trailer .= $cond->subst_string; | ||||
6810 | 0 | 0 | $output_trailer .= $_; | ||||
6811 | 0 | 0 | $comment = $spacing = ''; | ||||
6812 | } | ||||||
6813 | elsif (/$ASSIGNMENT_PATTERN/o) | ||||||
6814 | { | ||||||
6815 | # Found a macro definition. | ||||||
6816 | 0 | 0 | $prev_state = IN_VAR_DEF; | ||||
6817 | 0 | 0 | $last_var_name = $1; | ||||
6818 | 0 | 0 | $last_var_type = $2; | ||||
6819 | 0 | 0 | $last_var_value = $3; | ||||
6820 | 0 | 0 | $last_where = $where->clone; | ||||
6821 | 0 | 0 | if ($3 ne '' && substr ($3, -1) eq "\\") | ||||
6822 | { | ||||||
6823 | # We preserve the `\' because otherwise the long lines | ||||||
6824 | # that are generated will be truncated by broken | ||||||
6825 | # `sed's. | ||||||
6826 | 0 | 0 | $last_var_value = $3 . "\n"; | ||||
6827 | } | ||||||
6828 | # Normally we try to output variable definitions in the | ||||||
6829 | # same format they were input. However, POSIX compliant | ||||||
6830 | # systems are not required to support lines longer than | ||||||
6831 | # 2048 bytes (most notably, some sed implementation are | ||||||
6832 | # limited to 4000 bytes, and sed is used by config.status | ||||||
6833 | # to rewrite Makefile.in into Makefile). Moreover nobody | ||||||
6834 | # would really write such long lines by hand since it is | ||||||
6835 | # hardly maintainable. So if a line is longer that 1000 | ||||||
6836 | # bytes (an arbitrary limit), assume it has been | ||||||
6837 | # automatically generated by some tools, and flatten the | ||||||
6838 | # variable definition. Otherwise, keep the variable as it | ||||||
6839 | # as been input. | ||||||
6840 | 0 | 0 | $var_look = VAR_PRETTY if length ($last_var_value) >= 1000; | ||||
6841 | |||||||
6842 | 0 | 0 | if (!/\\$/) | ||||
6843 | { | ||||||
6844 | 0 | 0 | Automake::Variable::define ($last_var_name, VAR_MAKEFILE, | ||||
6845 | $last_var_type, $cond, | ||||||
6846 | $last_var_value, $comment, | ||||||
6847 | $last_where, $var_look) | ||||||
6848 | if $cond != FALSE; | ||||||
6849 | 0 | 0 | $comment = $spacing = ''; | ||||
6850 | 0 | 0 | $var_look = VAR_ASIS; | ||||
6851 | } | ||||||
6852 | } | ||||||
6853 | elsif (/$INCLUDE_PATTERN/o) | ||||||
6854 | { | ||||||
6855 | 0 | 0 | my $path = $1; | ||||
6856 | |||||||
6857 | 0 | 0 | if ($path =~ s/^\$\(top_srcdir\)\///) | ||||
6858 | { | ||||||
6859 | 0 | 0 | push (@include_stack, "\$\(top_srcdir\)/$path"); | ||||
6860 | # Distribute any included file. | ||||||
6861 | |||||||
6862 | # Always use the $(top_srcdir) prefix in DIST_COMMON, | ||||||
6863 | # otherwise OSF make will implicitly copy the included | ||||||
6864 | # file in the build tree during `make distdir' to satisfy | ||||||
6865 | # the dependency. | ||||||
6866 | # (subdircond2.test and subdircond3.test will fail.) | ||||||
6867 | 0 | 0 | push_dist_common ("\$\(top_srcdir\)/$path"); | ||||
6868 | } | ||||||
6869 | else | ||||||
6870 | { | ||||||
6871 | 0 | 0 | $path =~ s/\$\(srcdir\)\///; | ||||
6872 | 0 | 0 | push (@include_stack, "\$\(srcdir\)/$path"); | ||||
6873 | # Always use the $(srcdir) prefix in DIST_COMMON, | ||||||
6874 | # otherwise OSF make will implicitly copy the included | ||||||
6875 | # file in the build tree during `make distdir' to satisfy | ||||||
6876 | # the dependency. | ||||||
6877 | # (subdircond2.test and subdircond3.test will fail.) | ||||||
6878 | 0 | 0 | push_dist_common ("\$\(srcdir\)/$path"); | ||||
6879 | 0 | 0 | $path = $relative_dir . "/" . $path if $relative_dir ne '.'; | ||||
6880 | } | ||||||
6881 | 0 | 0 | $where->push_context ("`$path' included from here"); | ||||
6882 | 0 | 0 | &read_am_file ($path, $where); | ||||
6883 | 0 | 0 | $where->pop_context; | ||||
6884 | } | ||||||
6885 | else | ||||||
6886 | { | ||||||
6887 | # This isn't an error; it is probably a continued rule. | ||||||
6888 | # In fact, this is what we assume. | ||||||
6889 | 0 | 0 | $prev_state = IN_RULE_DEF; | ||||
6890 | 0 | 0 | check_variable_expansions ($_, $where); | ||||
6891 | 0 | 0 | $output_trailer .= $comment . $spacing; | ||||
6892 | 0 | 0 | my $cond = new Automake::Condition @cond_stack; | ||||
6893 | 0 | 0 | $output_trailer .= $cond->subst_string; | ||||
6894 | 0 | 0 | $output_trailer .= $_; | ||||
6895 | 0 | 0 | $comment = $spacing = ''; | ||||
6896 | 0 | 0 | error $where, "`#' comment at start of rule is unportable" | ||||
6897 | if $_ =~ /^\t\s*\#/; | ||||||
6898 | } | ||||||
6899 | |||||||
6900 | 0 | 0 | $saw_bk = $new_saw_bk; | ||||
6901 | 0 | 0 | $_ = $am_file->getline; | ||||
6902 | } | ||||||
6903 | |||||||
6904 | 0 | 0 | $output_trailer .= $comment; | ||||
6905 | |||||||
6906 | 0 | 0 | error ($where, "trailing backslash on last line") | ||||
6907 | if $saw_bk; | ||||||
6908 | |||||||
6909 | 0 | 0 | error ($where, (@cond_stack ? "unterminated conditionals: @cond_stack" | ||||
6910 | : "too many conditionals closed in include file")) | ||||||
6911 | if "@saved_cond_stack" ne "@cond_stack"; | ||||||
6912 | } | ||||||
6913 | |||||||
6914 | |||||||
6915 | # define_standard_variables () | ||||||
6916 | # ---------------------------- | ||||||
6917 | # A helper for read_main_am_file which initializes configure variables | ||||||
6918 | # and variables from header-vars.am. | ||||||
6919 | sub define_standard_variables | ||||||
6920 | { | ||||||
6921 | 0 | 0 | my $saved_output_vars = $output_vars; | ||||
6922 | 0 | 0 | my ($comments, undef, $rules) = | ||||
6923 | file_contents_internal (1, "$libdir/am/header-vars.am", | ||||||
6924 | new Automake::Location); | ||||||
6925 | |||||||
6926 | 0 | 0 | foreach my $var (sort keys %configure_vars) | ||||
6927 | { | ||||||
6928 | 0 | 0 | &define_configure_variable ($var); | ||||
6929 | } | ||||||
6930 | |||||||
6931 | 0 | 0 | $output_vars .= $comments . $rules; | ||||
6932 | } | ||||||
6933 | |||||||
6934 | # Read main am file. | ||||||
6935 | sub read_main_am_file | ||||||
6936 | { | ||||||
6937 | 0 | 0 | my ($amfile) = @_; | ||||
6938 | |||||||
6939 | # This supports the strange variable tricks we are about to play. | ||||||
6940 | 0 | 0 | prog_error (macros_dump () . "variable defined before read_main_am_file") | ||||
6941 | if (scalar (variables) > 0); | ||||||
6942 | |||||||
6943 | # Generate copyright header for generated Makefile.in. | ||||||
6944 | # We do discard the output of predefined variables, handled below. | ||||||
6945 | 0 | 0 | $output_vars = ("# $in_file_name generated by automake " | ||||
6946 | . $VERSION . " from $am_file_name.\n"); | ||||||
6947 | 0 | 0 | $output_vars .= '# ' . subst ('configure_input') . "\n"; | ||||
6948 | 0 | 0 | $output_vars .= $gen_copyright; | ||||
6949 | |||||||
6950 | # We want to predefine as many variables as possible. This lets | ||||||
6951 | # the user set them with `+=' in Makefile.am. | ||||||
6952 | 0 | 0 | &define_standard_variables; | ||||
6953 | |||||||
6954 | # Read user file, which might override some of our values. | ||||||
6955 | 0 | 0 | &read_am_file ($amfile, new Automake::Location); | ||||
6956 | } | ||||||
6957 | |||||||
6958 | |||||||
6959 | |||||||
6960 | ################################################################ | ||||||
6961 | |||||||
6962 | # $FLATTENED | ||||||
6963 | # &flatten ($STRING) | ||||||
6964 | # ------------------ | ||||||
6965 | # Flatten the $STRING and return the result. | ||||||
6966 | sub flatten | ||||||
6967 | { | ||||||
6968 | 0 | 0 | $_ = shift; | ||||
6969 | |||||||
6970 | 0 | 0 | s/\\\n//somg; | ||||
6971 | 0 | 0 | s/\s+/ /g; | ||||
6972 | 0 | 0 | s/^ //; | ||||
6973 | 0 | 0 | s/ $//; | ||||
6974 | |||||||
6975 | 0 | 0 | return $_; | ||||
6976 | } | ||||||
6977 | |||||||
6978 | |||||||
6979 | # transform_token ($TOKEN, \%PAIRS, $KEY) | ||||||
6980 | # ======================================= | ||||||
6981 | # Return the value associated to $KEY in %PAIRS, as used on $TOKEN | ||||||
6982 | # (which should be ?KEY? or any of the special %% requests).. | ||||||
6983 | sub transform_token ($$$) | ||||||
6984 | { | ||||||
6985 | 0 | 0 | my ($token, $transform, $key) = @_; | ||||
6986 | 0 | 0 | my $res = $transform->{$key}; | ||||
6987 | 0 | 0 | prog_error "Unknown key `$key' in `$token'" unless defined $res; | ||||
6988 | 0 | 0 | return $res; | ||||
6989 | } | ||||||
6990 | |||||||
6991 | |||||||
6992 | # transform ($TOKEN, \%PAIRS) | ||||||
6993 | # =========================== | ||||||
6994 | # If ($TOKEN, $VAL) is in %PAIRS: | ||||||
6995 | # - replaces %KEY% with $VAL, | ||||||
6996 | # - enables/disables ?KEY? and ?!KEY?, | ||||||
6997 | # - replaces %?KEY% with TRUE or FALSE. | ||||||
6998 | # - replaces %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE% with | ||||||
6999 | # IFTRUE / IFFALSE, as appropriate. | ||||||
7000 | sub transform ($$) | ||||||
7001 | { | ||||||
7002 | 0 | 0 | my ($token, $transform) = @_; | ||||
7003 | |||||||
7004 | # %KEY%. | ||||||
7005 | # Must be before the following pattern to exclude the case | ||||||
7006 | # when there is neither IFTRUE nor IFFALSE. | ||||||
7007 | 0 | 0 | if ($token =~ /^%([\w\-]+)%$/) | ||||
7008 | { | ||||||
7009 | 0 | 0 | return transform_token ($token, $transform, $1); | ||||
7010 | } | ||||||
7011 | # %KEY?IFTRUE%, %KEY:IFFALSE%, and %KEY?IFTRUE:IFFALSE%. | ||||||
7012 | elsif ($token =~ /^%([\w\-]+)(?:\?([^?:%]+))?(?::([^?:%]+))?%$/) | ||||||
7013 | { | ||||||
7014 | 0 | 0 | return transform_token ($token, $transform, $1) ? ($2 || '') : ($3 || ''); | ||||
7015 | } | ||||||
7016 | # %?KEY%. | ||||||
7017 | elsif ($token =~ /^%\?([\w\-]+)%$/) | ||||||
7018 | { | ||||||
7019 | 0 | 0 | return transform_token ($token, $transform, $1) ? 'TRUE' : 'FALSE'; | ||||
7020 | } | ||||||
7021 | # ?KEY? and ?!KEY?. | ||||||
7022 | elsif ($token =~ /^ \? (!?) ([\w\-]+) \? $/x) | ||||||
7023 | { | ||||||
7024 | 0 | 0 | my $neg = ($1 eq '!') ? 1 : 0; | ||||
7025 | 0 | 0 | my $val = transform_token ($token, $transform, $2); | ||||
7026 | 0 | 0 | return (!!$val == $neg) ? '##%' : ''; | ||||
7027 | } | ||||||
7028 | else | ||||||
7029 | { | ||||||
7030 | 0 | 0 | prog_error "Unknown request format: $token"; | ||||
7031 | } | ||||||
7032 | } | ||||||
7033 | |||||||
7034 | |||||||
7035 | # @PARAGRAPHS | ||||||
7036 | # &make_paragraphs ($MAKEFILE, [%TRANSFORM]) | ||||||
7037 | # ------------------------------------------ | ||||||
7038 | # Load a $MAKEFILE, apply the %TRANSFORM, and return it as a list of | ||||||
7039 | # paragraphs. | ||||||
7040 | sub make_paragraphs ($%) | ||||||
7041 | { | ||||||
7042 | 0 | 0 | my ($file, %transform) = @_; | ||||
7043 | |||||||
7044 | # Complete %transform with global options. | ||||||
7045 | # Note that %transform goes last, so it overrides global options. | ||||||
7046 | 0 | 0 | %transform = ('CYGNUS' => !! option 'cygnus', | ||||
7047 | 'MAINTAINER-MODE' | ||||||
7048 | => $seen_maint_mode ? subst ('MAINTAINER_MODE_TRUE') : '', | ||||||
7049 | |||||||
7050 | 'XZ' => !! option 'dist-xz', | ||||||
7051 | 'LZMA' => !! option 'dist-lzma', | ||||||
7052 | 'BZIP2' => !! option 'dist-bzip2', | ||||||
7053 | 'COMPRESS' => !! option 'dist-tarZ', | ||||||
7054 | 'GZIP' => ! option 'no-dist-gzip', | ||||||
7055 | 'SHAR' => !! option 'dist-shar', | ||||||
7056 | 'ZIP' => !! option 'dist-zip', | ||||||
7057 | |||||||
7058 | 'INSTALL-INFO' => ! option 'no-installinfo', | ||||||
7059 | 'INSTALL-MAN' => ! option 'no-installman', | ||||||
7060 | 'HAVE-MANS' => !! var ('MANS'), | ||||||
7061 | 'CK-NEWS' => !! option 'check-news', | ||||||
7062 | |||||||
7063 | 'SUBDIRS' => !! var ('SUBDIRS'), | ||||||
7064 | 'TOPDIR_P' => $relative_dir eq '.', | ||||||
7065 | |||||||
7066 | 'BUILD' => ($seen_canonical >= AC_CANONICAL_BUILD), | ||||||
7067 | 'HOST' => ($seen_canonical >= AC_CANONICAL_HOST), | ||||||
7068 | 'TARGET' => ($seen_canonical >= AC_CANONICAL_TARGET), | ||||||
7069 | |||||||
7070 | 'LIBTOOL' => !! var ('LIBTOOL'), | ||||||
7071 | 'NONLIBTOOL' => 1, | ||||||
7072 | 'FIRST' => ! $transformed_files{$file}, | ||||||
7073 | %transform); | ||||||
7074 | |||||||
7075 | 0 | 0 | $transformed_files{$file} = 1; | ||||
7076 | 0 | 0 | $_ = $am_file_cache{$file}; | ||||
7077 | |||||||
7078 | 0 | 0 | if (! defined $_) | ||||
7079 | { | ||||||
7080 | 0 | 0 | verb "reading $file"; | ||||
7081 | # Swallow the whole file. | ||||||
7082 | 0 | 0 | my $fc_file = new Automake::XFile "< $file"; | ||||
7083 | 0 | 0 | my $saved_dollar_slash = $/; | ||||
7084 | 0 | 0 | undef $/; | ||||
7085 | 0 | 0 | $_ = $fc_file->getline; | ||||
7086 | 0 | 0 | $/ = $saved_dollar_slash; | ||||
7087 | 0 | 0 | $fc_file->close; | ||||
7088 | |||||||
7089 | # Remove ##-comments. | ||||||
7090 | # Besides we don't need more than two consecutive new-lines. | ||||||
7091 | 0 | 0 | s/(?:$IGNORE_PATTERN|(?<=\n\n)\n+)//gom; | ||||
7092 | |||||||
7093 | 0 | 0 | $am_file_cache{$file} = $_; | ||||
7094 | } | ||||||
7095 | |||||||
7096 | # Substitute Automake template tokens. | ||||||
7097 | 0 0 | 0 0 | s/(?: % \?? [\w\-]+ % | ||||
7098 | | % [\w\-]+ (?:\?[^?:%]+)? (?::[^?:%]+)? % | ||||||
7099 | | \? !? [\w\-]+ \? | ||||||
7100 | )/transform($&, \%transform)/gex; | ||||||
7101 | # transform() may have added some ##%-comments to strip. | ||||||
7102 | # (we use `##%' instead of `##' so we can distinguish ##%##%##% from | ||||||
7103 | # ####### and do not remove the latter.) | ||||||
7104 | 0 | 0 | s/^[ \t]*(?:##%)+.*\n//gm; | ||||
7105 | |||||||
7106 | # Split at unescaped new lines. | ||||||
7107 | 0 | 0 | my @lines = split (/(?<!\\)\n/, $_); | ||||
7108 | 0 | 0 | my @res; | ||||
7109 | |||||||
7110 | 0 | 0 | while (defined ($_ = shift @lines)) | ||||
7111 | { | ||||||
7112 | 0 | 0 | my $paragraph = $_; | ||||
7113 | # If we are a rule, eat as long as we start with a tab. | ||||||
7114 | 0 | 0 | if (/$RULE_PATTERN/smo) | ||||
7115 | { | ||||||
7116 | 0 | 0 | while (defined ($_ = shift @lines) && $_ =~ /^\t/) | ||||
7117 | { | ||||||
7118 | 0 | 0 | $paragraph .= "\n$_"; | ||||
7119 | } | ||||||
7120 | 0 | 0 | unshift (@lines, $_); | ||||
7121 | } | ||||||
7122 | |||||||
7123 | # If we are a comments, eat as much comments as you can. | ||||||
7124 | elsif (/$COMMENT_PATTERN/smo) | ||||||
7125 | { | ||||||
7126 | 0 | 0 | while (defined ($_ = shift @lines) | ||||
7127 | && $_ =~ /$COMMENT_PATTERN/smo) | ||||||
7128 | { | ||||||
7129 | 0 | 0 | $paragraph .= "\n$_"; | ||||
7130 | } | ||||||
7131 | 0 | 0 | unshift (@lines, $_); | ||||
7132 | } | ||||||
7133 | |||||||
7134 | 0 | 0 | push @res, $paragraph; | ||||
7135 | } | ||||||
7136 | |||||||
7137 | 0 | 0 | return @res; | ||||
7138 | } | ||||||
7139 | |||||||
7140 | |||||||
7141 | |||||||
7142 | # ($COMMENT, $VARIABLES, $RULES) | ||||||
7143 | # &file_contents_internal ($IS_AM, $FILE, $WHERE, [%TRANSFORM]) | ||||||
7144 | # ------------------------------------------------------------- | ||||||
7145 | # Return contents of a file from $libdir/am, automatically skipping | ||||||
7146 | # macros or rules which are already known. $IS_AM iff the caller is | ||||||
7147 | # reading an Automake file (as opposed to the user's Makefile.am). | ||||||
7148 | sub file_contents_internal ($$$%) | ||||||
7149 | { | ||||||
7150 | 0 | 0 | my ($is_am, $file, $where, %transform) = @_; | ||||
7151 | |||||||
7152 | 0 | 0 | $where->set ($file); | ||||
7153 | |||||||
7154 | 0 | 0 | my $result_vars = ''; | ||||
7155 | 0 | 0 | my $result_rules = ''; | ||||
7156 | 0 | 0 | my $comment = ''; | ||||
7157 | 0 | 0 | my $spacing = ''; | ||||
7158 | |||||||
7159 | # The following flags are used to track rules spanning across | ||||||
7160 | # multiple paragraphs. | ||||||
7161 | 0 | 0 | my $is_rule = 0; # 1 if we are processing a rule. | ||||
7162 | 0 | 0 | my $discard_rule = 0; # 1 if the current rule should not be output. | ||||
7163 | |||||||
7164 | # We save the conditional stack on entry, and then check to make | ||||||
7165 | # sure it is the same on exit. This lets us conditionally include | ||||||
7166 | # other files. | ||||||
7167 | 0 | 0 | my @saved_cond_stack = @cond_stack; | ||||
7168 | 0 | 0 | my $cond = new Automake::Condition (@cond_stack); | ||||
7169 | |||||||
7170 | 0 | 0 | foreach (make_paragraphs ($file, %transform)) | ||||
7171 | { | ||||||
7172 | # FIXME: no line number available. | ||||||
7173 | 0 | 0 | $where->set ($file); | ||||
7174 | |||||||
7175 | # Sanity checks. | ||||||
7176 | 0 | 0 | error $where, "blank line following trailing backslash:\n$_" | ||||
7177 | if /\\$/; | ||||||
7178 | 0 | 0 | error $where, "comment following trailing backslash:\n$_" | ||||
7179 | if /\\#/; | ||||||
7180 | |||||||
7181 | 0 | 0 | if (/^$/) | ||||
7182 | { | ||||||
7183 | 0 | 0 | $is_rule = 0; | ||||
7184 | # Stick empty line before the incoming macro or rule. | ||||||
7185 | 0 | 0 | $spacing = "\n"; | ||||
7186 | } | ||||||
7187 | elsif (/$COMMENT_PATTERN/mso) | ||||||
7188 | { | ||||||
7189 | 0 | 0 | $is_rule = 0; | ||||
7190 | # Stick comments before the incoming macro or rule. | ||||||
7191 | 0 | 0 | $comment = "$_\n"; | ||||
7192 | } | ||||||
7193 | |||||||
7194 | # Handle inclusion of other files. | ||||||
7195 | elsif (/$INCLUDE_PATTERN/o) | ||||||
7196 | { | ||||||
7197 | 0 | 0 | if ($cond != FALSE) | ||||
7198 | { | ||||||
7199 | 0 | 0 | my $file = ($is_am ? "$libdir/am/" : '') . $1; | ||||
7200 | 0 | 0 | $where->push_context ("`$file' included from here"); | ||||
7201 | # N-ary `.=' fails. | ||||||
7202 | 0 | 0 | my ($com, $vars, $rules) | ||||
7203 | = file_contents_internal ($is_am, $file, $where, %transform); | ||||||
7204 | 0 | 0 | $where->pop_context; | ||||
7205 | 0 | 0 | $comment .= $com; | ||||
7206 | 0 | 0 | $result_vars .= $vars; | ||||
7207 | 0 | 0 | $result_rules .= $rules; | ||||
7208 | } | ||||||
7209 | } | ||||||
7210 | |||||||
7211 | # Handling the conditionals. | ||||||
7212 | elsif (/$IF_PATTERN/o) | ||||||
7213 | { | ||||||
7214 | 0 | 0 | $cond = cond_stack_if ($1, $2, $file); | ||||
7215 | } | ||||||
7216 | elsif (/$ELSE_PATTERN/o) | ||||||
7217 | { | ||||||
7218 | 0 | 0 | $cond = cond_stack_else ($1, $2, $file); | ||||
7219 | } | ||||||
7220 | elsif (/$ENDIF_PATTERN/o) | ||||||
7221 | { | ||||||
7222 | 0 | 0 | $cond = cond_stack_endif ($1, $2, $file); | ||||
7223 | } | ||||||
7224 | |||||||
7225 | # Handling rules. | ||||||
7226 | elsif (/$RULE_PATTERN/mso) | ||||||
7227 | { | ||||||
7228 | 0 | 0 | $is_rule = 1; | ||||
7229 | 0 | 0 | $discard_rule = 0; | ||||
7230 | # Separate relationship from optional actions: the first | ||||||
7231 | # `new-line tab" not preceded by backslash (continuation | ||||||
7232 | # line). | ||||||
7233 | 0 | 0 | my $paragraph = $_; | ||||
7234 | 0 | 0 | /^(.*?)(?:(?<!\\)\n(\t.*))?$/s; | ||||
7235 | 0 | 0 | my ($relationship, $actions) = ($1, $2 || ''); | ||||
7236 | |||||||
7237 | # Separate targets from dependencies: the first colon. | ||||||
7238 | 0 | 0 | $relationship =~ /^([^:]+\S+) *: *(.*)$/som; | ||||
7239 | 0 | 0 | my ($targets, $dependencies) = ($1, $2); | ||||
7240 | # Remove the escaped new lines. | ||||||
7241 | # I don't know why, but I have to use a tmp $flat_deps. | ||||||
7242 | 0 | 0 | my $flat_deps = &flatten ($dependencies); | ||||
7243 | 0 | 0 | my @deps = split (' ', $flat_deps); | ||||
7244 | |||||||
7245 | 0 | 0 | foreach (split (' ', $targets)) | ||||
7246 | { | ||||||
7247 | # FIXME: 1. We are not robust to people defining several targets | ||||||
7248 | # at once, only some of them being in %dependencies. The | ||||||
7249 | # actions from the targets in %dependencies are usually generated | ||||||
7250 | # from the content of %actions, but if some targets in $targets | ||||||
7251 | # are not in %dependencies the ELSE branch will output | ||||||
7252 | # a rule for all $targets (i.e. the targets which are both | ||||||
7253 | # in %dependencies and $targets will have two rules). | ||||||
7254 | |||||||
7255 | # FIXME: 2. The logic here is not able to output a | ||||||
7256 | # multi-paragraph rule several time (e.g. for each condition | ||||||
7257 | # it is defined for) because it only knows the first paragraph. | ||||||
7258 | |||||||
7259 | # FIXME: 3. We are not robust to people defining a subset | ||||||
7260 | # of a previously defined "multiple-target" rule. E.g. | ||||||
7261 | # `foo:' after `foo bar:'. | ||||||
7262 | |||||||
7263 | # Output only if not in FALSE. | ||||||
7264 | 0 | 0 | if (defined $dependencies{$_} && $cond != FALSE) | ||||
7265 | { | ||||||
7266 | 0 | 0 | &depend ($_, @deps); | ||||
7267 | 0 | 0 | register_action ($_, $actions); | ||||
7268 | } | ||||||
7269 | else | ||||||
7270 | { | ||||||
7271 | # Free-lance dependency. Output the rule for all the | ||||||
7272 | # targets instead of one by one. | ||||||
7273 | 0 | 0 | my @undefined_conds = | ||||
7274 | Automake::Rule::define ($targets, $file, | ||||||
7275 | $is_am ? RULE_AUTOMAKE : RULE_USER, | ||||||
7276 | $cond, $where); | ||||||
7277 | 0 | 0 | for my $undefined_cond (@undefined_conds) | ||||
7278 | { | ||||||
7279 | 0 | 0 | my $condparagraph = $paragraph; | ||||
7280 | 0 0 | 0 0 | $condparagraph =~ s/^/$undefined_cond->subst_string/gme; | ||||
7281 | 0 | 0 | $result_rules .= "$spacing$comment$condparagraph\n"; | ||||
7282 | } | ||||||
7283 | 0 | 0 | if (scalar @undefined_conds == 0) | ||||
7284 | { | ||||||
7285 | # Remember to discard next paragraphs | ||||||
7286 | # if they belong to this rule. | ||||||
7287 | # (but see also FIXME: #2 above.) | ||||||
7288 | 0 | 0 | $discard_rule = 1; | ||||
7289 | } | ||||||
7290 | 0 | 0 | $comment = $spacing = ''; | ||||
7291 | 0 | 0 | last; | ||||
7292 | } | ||||||
7293 | } | ||||||
7294 | } | ||||||
7295 | |||||||
7296 | elsif (/$ASSIGNMENT_PATTERN/mso) | ||||||
7297 | { | ||||||
7298 | 0 | 0 | my ($var, $type, $val) = ($1, $2, $3); | ||||
7299 | 0 | 0 | error $where, "variable `$var' with trailing backslash" | ||||
7300 | if /\\$/; | ||||||
7301 | |||||||
7302 | 0 | 0 | $is_rule = 0; | ||||
7303 | |||||||
7304 | 0 | 0 | Automake::Variable::define ($var, | ||||
7305 | $is_am ? VAR_AUTOMAKE : VAR_MAKEFILE, | ||||||
7306 | $type, $cond, $val, $comment, $where, | ||||||
7307 | VAR_ASIS) | ||||||
7308 | if $cond != FALSE; | ||||||
7309 | |||||||
7310 | 0 | 0 | $comment = $spacing = ''; | ||||
7311 | } | ||||||
7312 | else | ||||||
7313 | { | ||||||
7314 | # This isn't an error; it is probably some tokens which | ||||||
7315 | # configure is supposed to replace, such as `@SET-MAKE@', | ||||||
7316 | # or some part of a rule cut by an if/endif. | ||||||
7317 | 0 | 0 | if (! $cond->false && ! ($is_rule && $discard_rule)) | ||||
7318 | { | ||||||
7319 | 0 0 | 0 0 | s/^/$cond->subst_string/gme; | ||||
7320 | 0 | 0 | $result_rules .= "$spacing$comment$_\n"; | ||||
7321 | } | ||||||
7322 | 0 | 0 | $comment = $spacing = ''; | ||||
7323 | } | ||||||
7324 | } | ||||||
7325 | |||||||
7326 | 0 | 0 | error ($where, @cond_stack ? | ||||
7327 | "unterminated conditionals: @cond_stack" : | ||||||
7328 | "too many conditionals closed in include file") | ||||||
7329 | if "@saved_cond_stack" ne "@cond_stack"; | ||||||
7330 | |||||||
7331 | 0 | 0 | return ($comment, $result_vars, $result_rules); | ||||
7332 | } | ||||||
7333 | |||||||
7334 | |||||||
7335 | # $CONTENTS | ||||||
7336 | # &file_contents ($BASENAME, $WHERE, [%TRANSFORM]) | ||||||
7337 | # ------------------------------------------------ | ||||||
7338 | # Return contents of a file from $libdir/am, automatically skipping | ||||||
7339 | # macros or rules which are already known. | ||||||
7340 | sub file_contents ($$%) | ||||||
7341 | { | ||||||
7342 | 0 | 0 | my ($basename, $where, %transform) = @_; | ||||
7343 | 0 | 0 | my ($comments, $variables, $rules) = | ||||
7344 | file_contents_internal (1, "$libdir/am/$basename.am", $where, | ||||||
7345 | %transform); | ||||||
7346 | 0 | 0 | return "$comments$variables$rules"; | ||||
7347 | } | ||||||
7348 | |||||||
7349 | |||||||
7350 | # @PREFIX | ||||||
7351 | # &am_primary_prefixes ($PRIMARY, $CAN_DIST, @PREFIXES) | ||||||
7352 | # ----------------------------------------------------- | ||||||
7353 | # Find all variable prefixes that are used for install directories. A | ||||||
7354 | # prefix `zar' qualifies iff: | ||||||
7355 | # | ||||||
7356 | # * `zardir' is a variable. | ||||||
7357 | # * `zar_PRIMARY' is a variable. | ||||||
7358 | # | ||||||
7359 | # As a side effect, it looks for misspellings. It is an error to have | ||||||
7360 | # a variable ending in a "reserved" suffix whose prefix is unknown, e.g. | ||||||
7361 | # "bni_PROGRAMS". However, unusual prefixes are allowed if a variable | ||||||
7362 | # of the same name (with "dir" appended) exists. For instance, if the | ||||||
7363 | # variable "zardir" is defined, then "zar_PROGRAMS" becomes valid. | ||||||
7364 | # This is to provide a little extra flexibility in those cases which | ||||||
7365 | # need it. | ||||||
7366 | sub am_primary_prefixes ($$@) | ||||||
7367 | { | ||||||
7368 | 0 | 0 | my ($primary, $can_dist, @prefixes) = @_; | ||||
7369 | |||||||
7370 | 0 | 0 | local $_; | ||||
7371 | 0 0 | 0 0 | my %valid = map { $_ => 0 } @prefixes; | ||||
7372 | 0 | 0 | $valid{'EXTRA'} = 0; | ||||
7373 | 0 | 0 | foreach my $var (variables $primary) | ||||
7374 | { | ||||||
7375 | # Automake is allowed to define variables that look like primaries | ||||||
7376 | # but which aren't. E.g. INSTALL_sh_DATA. | ||||||
7377 | # Autoconf can also define variables like INSTALL_DATA, so | ||||||
7378 | # ignore all configure variables (at least those which are not | ||||||
7379 | # redefined in Makefile.am). | ||||||
7380 | # FIXME: We should make sure that these variables are not | ||||||
7381 | # conditionally defined (or else adjust the condition below). | ||||||
7382 | 0 | 0 | my $def = $var->def (TRUE); | ||||
7383 | 0 | 0 | next if $def && $def->owner != VAR_MAKEFILE; | ||||
7384 | |||||||
7385 | 0 | 0 | my $varname = $var->name; | ||||
7386 | |||||||
7387 | 0 | 0 | if ($varname =~ /^(nobase_)?(dist_|nodist_)?(.*)_[[:alnum:]]+$/) | ||||
7388 | { | ||||||
7389 | 0 | 0 | my ($base, $dist, $X) = ($1 || '', $2 || '', $3 || ''); | ||||
7390 | 0 | 0 | if ($dist ne '' && ! $can_dist) | ||||
7391 | { | ||||||
7392 | 0 | 0 | err_var ($var, | ||||
7393 | "invalid variable `$varname': `dist' is forbidden"); | ||||||
7394 | } | ||||||
7395 | # Standard directories must be explicitly allowed. | ||||||
7396 | elsif (! defined $valid{$X} && exists $standard_prefix{$X}) | ||||||
7397 | { | ||||||
7398 | 0 | 0 | err_var ($var, | ||||
7399 | "`${X}dir' is not a legitimate directory " . | ||||||
7400 | "for `$primary'"); | ||||||
7401 | } | ||||||
7402 | # A not explicitly valid directory is allowed if Xdir is defined. | ||||||
7403 | elsif (! defined $valid{$X} && | ||||||
7404 | $var->requires_variables ("`$varname' is used", "${X}dir")) | ||||||
7405 | { | ||||||
7406 | # Nothing to do. Any error message has been output | ||||||
7407 | # by $var->requires_variables. | ||||||
7408 | } | ||||||
7409 | else | ||||||
7410 | { | ||||||
7411 | # Ensure all extended prefixes are actually used. | ||||||
7412 | 0 | 0 | $valid{"$base$dist$X"} = 1; | ||||
7413 | } | ||||||
7414 | } | ||||||
7415 | else | ||||||
7416 | { | ||||||
7417 | 0 | 0 | prog_error "unexpected variable name: $varname"; | ||||
7418 | } | ||||||
7419 | } | ||||||
7420 | |||||||
7421 | # Return only those which are actually defined. | ||||||
7422 | 0 0 | 0 0 | return sort grep { var ($_ . '_' . $primary) } keys %valid; | ||||
7423 | } | ||||||
7424 | |||||||
7425 | |||||||
7426 | # Handle `where_HOW' variable magic. Does all lookups, generates | ||||||
7427 | # install code, and possibly generates code to define the primary | ||||||
7428 | # variable. The first argument is the name of the .am file to munge, | ||||||
7429 | # the second argument is the primary variable (e.g. HEADERS), and all | ||||||
7430 | # subsequent arguments are possible installation locations. | ||||||
7431 | # | ||||||
7432 | # Returns list of [$location, $value] pairs, where | ||||||
7433 | # $value's are the values in all where_HOW variable, and $location | ||||||
7434 | # there associated location (the place here their parent variables were | ||||||
7435 | # defined). | ||||||
7436 | # | ||||||
7437 | # FIXME: this should be rewritten to be cleaner. It should be broken | ||||||
7438 | # up into multiple functions. | ||||||
7439 | # | ||||||
7440 | # Usage is: am_install_var (OPTION..., file, HOW, where...) | ||||||
7441 | sub am_install_var | ||||||
7442 | { | ||||||
7443 | 0 | 0 | my (@args) = @_; | ||||
7444 | |||||||
7445 | 0 | 0 | my $do_require = 1; | ||||
7446 | 0 | 0 | my $can_dist = 0; | ||||
7447 | 0 | 0 | my $default_dist = 0; | ||||
7448 | 0 | 0 | while (@args) | ||||
7449 | { | ||||||
7450 | 0 | 0 | if ($args[0] eq '-noextra') | ||||
7451 | { | ||||||
7452 | 0 | 0 | $do_require = 0; | ||||
7453 | } | ||||||
7454 | elsif ($args[0] eq '-candist') | ||||||
7455 | { | ||||||
7456 | 0 | 0 | $can_dist = 1; | ||||
7457 | } | ||||||
7458 | elsif ($args[0] eq '-defaultdist') | ||||||
7459 | { | ||||||
7460 | 0 | 0 | $default_dist = 1; | ||||
7461 | 0 | 0 | $can_dist = 1; | ||||
7462 | } | ||||||
7463 | elsif ($args[0] !~ /^-/) | ||||||
7464 | { | ||||||
7465 | 0 | 0 | last; | ||||
7466 | } | ||||||
7467 | 0 | 0 | shift (@args); | ||||
7468 | } | ||||||
7469 | |||||||
7470 | 0 | 0 | my ($file, $primary, @prefix) = @args; | ||||
7471 | |||||||
7472 | # Now that configure substitutions are allowed in where_HOW | ||||||
7473 | # variables, it is an error to actually define the primary. We | ||||||
7474 | # allow `JAVA', as it is customarily used to mean the Java | ||||||
7475 | # interpreter. This is but one of several Java hacks. Similarly, | ||||||
7476 | # `PYTHON' is customarily used to mean the Python interpreter. | ||||||
7477 | 0 | 0 | reject_var $primary, "`$primary' is an anachronism" | ||||
7478 | unless $primary eq 'JAVA' || $primary eq 'PYTHON'; | ||||||
7479 | |||||||
7480 | # Get the prefixes which are valid and actually used. | ||||||
7481 | 0 | 0 | @prefix = am_primary_prefixes ($primary, $can_dist, @prefix); | ||||
7482 | |||||||
7483 | # If a primary includes a configure substitution, then the EXTRA_ | ||||||
7484 | # form is required. Otherwise we can't properly do our job. | ||||||
7485 | 0 | 0 | my $require_extra; | ||||
7486 | |||||||
7487 | 0 | 0 | my @used = (); | ||||
7488 | 0 | 0 | my @result = (); | ||||
7489 | |||||||
7490 | 0 | 0 | foreach my $X (@prefix) | ||||
7491 | { | ||||||
7492 | 0 | 0 | my $nodir_name = $X; | ||||
7493 | 0 | 0 | my $one_name = $X . '_' . $primary; | ||||
7494 | 0 | 0 | my $one_var = var $one_name; | ||||
7495 | |||||||
7496 | 0 | 0 | my $strip_subdir = 1; | ||||
7497 | # If subdir prefix should be preserved, do so. | ||||||
7498 | 0 | 0 | if ($nodir_name =~ /^nobase_/) | ||||
7499 | { | ||||||
7500 | 0 | 0 | $strip_subdir = 0; | ||||
7501 | 0 | 0 | $nodir_name =~ s/^nobase_//; | ||||
7502 | } | ||||||
7503 | |||||||
7504 | # If files should be distributed, do so. | ||||||
7505 | 0 | 0 | my $dist_p = 0; | ||||
7506 | 0 | 0 | if ($can_dist) | ||||
7507 | { | ||||||
7508 | 0 | 0 | $dist_p = (($default_dist && $nodir_name !~ /^nodist_/) | ||||
7509 | || (! $default_dist && $nodir_name =~ /^dist_/)); | ||||||
7510 | 0 | 0 | $nodir_name =~ s/^(dist|nodist)_//; | ||||
7511 | } | ||||||
7512 | |||||||
7513 | |||||||
7514 | # Use the location of the currently processed variable. | ||||||
7515 | # We are not processing a particular condition, so pick the first | ||||||
7516 | # available. | ||||||
7517 | 0 | 0 | my $tmpcond = $one_var->conditions->one_cond; | ||||
7518 | 0 | 0 | my $where = $one_var->rdef ($tmpcond)->location->clone; | ||||
7519 | |||||||
7520 | # Append actual contents of where_PRIMARY variable to | ||||||
7521 | # @result, skipping @substitutions@. | ||||||
7522 | 0 | 0 | foreach my $locvals ($one_var->value_as_list_recursive (location => 1)) | ||||
7523 | { | ||||||
7524 | 0 | 0 | my ($loc, $value) = @$locvals; | ||||
7525 | # Skip configure substitutions. | ||||||
7526 | 0 | 0 | if ($value =~ /^\@.*\@$/) | ||||
7527 | { | ||||||
7528 | 0 | 0 | if ($nodir_name eq 'EXTRA') | ||||
7529 | { | ||||||
7530 | 0 | 0 | error ($where, | ||||
7531 | "`$one_name' contains configure substitution, " | ||||||
7532 | . "but shouldn't"); | ||||||
7533 | } | ||||||
7534 | # Check here to make sure variables defined in | ||||||
7535 | # configure.ac do not imply that EXTRA_PRIMARY | ||||||
7536 | # must be defined. | ||||||
7537 | elsif (! defined $configure_vars{$one_name}) | ||||||
7538 | { | ||||||
7539 | 0 | 0 | $require_extra = $one_name | ||||
7540 | if $do_require; | ||||||
7541 | } | ||||||
7542 | } | ||||||
7543 | else | ||||||
7544 | { | ||||||
7545 | # Strip any $(EXEEXT) suffix the user might have added, or this | ||||||
7546 | # will confuse &handle_source_transform and &check_canonical_spelling. | ||||||
7547 | # We'll add $(EXEEXT) back later anyway. | ||||||
7548 | # Do it here rather than in handle_programs so the uniquifying at the | ||||||
7549 | # end of this function works. | ||||||
7550 | 0 0 | 0 0 | ${$locvals}[1] =~ s/\$\(EXEEXT\)$// | ||||
7551 | if $primary eq 'PROGRAMS'; | ||||||
7552 | |||||||
7553 | 0 | 0 | push (@result, $locvals); | ||||
7554 | } | ||||||
7555 | } | ||||||
7556 | # A blatant hack: we rewrite each _PROGRAMS primary to include | ||||||
7557 | # EXEEXT. | ||||||
7558 | 0 0 | 0 0 | append_exeext { 1 } $one_name | ||||
7559 | if $primary eq 'PROGRAMS'; | ||||||
7560 | # "EXTRA" shouldn't be used when generating clean targets, | ||||||
7561 | # all, or install targets. We used to warn if EXTRA_FOO was | ||||||
7562 | # defined uselessly, but this was annoying. | ||||||
7563 | next | ||||||
7564 | 0 | 0 | if $nodir_name eq 'EXTRA'; | ||||
7565 | |||||||
7566 | 0 | 0 | if ($nodir_name eq 'check') | ||||
7567 | { | ||||||
7568 | 0 | 0 | push (@check, '$(' . $one_name . ')'); | ||||
7569 | } | ||||||
7570 | else | ||||||
7571 | { | ||||||
7572 | 0 | 0 | push (@used, '$(' . $one_name . ')'); | ||||
7573 | } | ||||||
7574 | |||||||
7575 | # Is this to be installed? | ||||||
7576 | 0 | 0 | my $install_p = $nodir_name ne 'noinst' && $nodir_name ne 'check'; | ||||
7577 | |||||||
7578 | # If so, with install-exec? (or install-data?). | ||||||
7579 | 0 | 0 | my $exec_p = ($nodir_name =~ /$EXEC_DIR_PATTERN/o); | ||||
7580 | |||||||
7581 | 0 | 0 | my $check_options_p = $install_p && !! option 'std-options'; | ||||
7582 | |||||||
7583 | # Use the location of the currently processed variable as context. | ||||||
7584 | 0 | 0 | $where->push_context ("while processing `$one_name'"); | ||||
7585 | |||||||
7586 | # The variable containing all files to distribute. | ||||||
7587 | 0 | 0 | my $distvar = "\$($one_name)"; | ||||
7588 | 0 | 0 | $distvar = shadow_unconditionally ($one_name, $where) | ||||
7589 | if ($dist_p && $one_var->has_conditional_contents); | ||||||
7590 | |||||||
7591 | # Singular form of $PRIMARY. | ||||||
7592 | 0 | 0 | (my $one_primary = $primary) =~ s/S$//; | ||||
7593 | 0 | 0 | $output_rules .= &file_contents ($file, $where, | ||||
7594 | PRIMARY => $primary, | ||||||
7595 | ONE_PRIMARY => $one_primary, | ||||||
7596 | DIR => $X, | ||||||
7597 | NDIR => $nodir_name, | ||||||
7598 | BASE => $strip_subdir, | ||||||
7599 | |||||||
7600 | EXEC => $exec_p, | ||||||
7601 | INSTALL => $install_p, | ||||||
7602 | DIST => $dist_p, | ||||||
7603 | DISTVAR => $distvar, | ||||||
7604 | 'CK-OPTS' => $check_options_p); | ||||||
7605 | } | ||||||
7606 | |||||||
7607 | # The JAVA variable is used as the name of the Java interpreter. | ||||||
7608 | # The PYTHON variable is used as the name of the Python interpreter. | ||||||
7609 | 0 | 0 | if (@used && $primary ne 'JAVA' && $primary ne 'PYTHON') | ||||
7610 | { | ||||||
7611 | # Define it. | ||||||
7612 | 0 | 0 | define_pretty_variable ($primary, TRUE, INTERNAL, @used); | ||||
7613 | 0 | 0 | $output_vars .= "\n"; | ||||
7614 | } | ||||||
7615 | |||||||
7616 | 0 | 0 | err_var ($require_extra, | ||||
7617 | "`$require_extra' contains configure substitution,\n" | ||||||
7618 | . "but `EXTRA_$primary' not defined") | ||||||
7619 | if ($require_extra && ! var ('EXTRA_' . $primary)); | ||||||
7620 | |||||||
7621 | # Push here because PRIMARY might be configure time determined. | ||||||
7622 | 0 | 0 | push (@all, '$(' . $primary . ')') | ||||
7623 | if @used && $primary ne 'JAVA' && $primary ne 'PYTHON'; | ||||||
7624 | |||||||
7625 | # Make the result unique. This lets the user use conditionals in | ||||||
7626 | # a natural way, but still lets us program lazily -- we don't have | ||||||
7627 | # to worry about handling a particular object more than once. | ||||||
7628 | # We will keep only one location per object. | ||||||
7629 | 0 | 0 | my %result = (); | ||||
7630 | 0 | 0 | for my $pair (@result) | ||||
7631 | { | ||||||
7632 | 0 | 0 | my ($loc, $val) = @$pair; | ||||
7633 | 0 | 0 | $result{$val} = $loc; | ||||
7634 | } | ||||||
7635 | 0 | 0 | my @l = sort keys %result; | ||||
7636 | 0 0 | 0 0 | return map { [$result{$_}->clone, $_] } @l; | ||||
7637 | } | ||||||
7638 | |||||||
7639 | |||||||
7640 | ################################################################ | ||||||
7641 | |||||||
7642 | # Each key in this hash is the name of a directory holding a | ||||||
7643 | # Makefile.in. These variables are local to `is_make_dir'. | ||||||
7644 | 1 | 2 | my %make_dirs = (); | ||||
7645 | 1 | 2 | my $make_dirs_set = 0; | ||||
7646 | |||||||
7647 | sub is_make_dir | ||||||
7648 | { | ||||||
7649 | 0 | 0 | my ($dir) = @_; | ||||
7650 | 0 | 0 | if (! $make_dirs_set) | ||||
7651 | { | ||||||
7652 | 0 | 0 | foreach my $iter (@configure_input_files) | ||||
7653 | { | ||||||
7654 | 0 | 0 | $make_dirs{dirname ($iter)} = 1; | ||||
7655 | } | ||||||
7656 | # We also want to notice Makefile.in's. | ||||||
7657 | 0 | 0 | foreach my $iter (@other_input_files) | ||||
7658 | { | ||||||
7659 | 0 | 0 | if ($iter =~ /Makefile\.in$/) | ||||
7660 | { | ||||||
7661 | 0 | 0 | $make_dirs{dirname ($iter)} = 1; | ||||
7662 | } | ||||||
7663 | } | ||||||
7664 | 0 | 0 | $make_dirs_set = 1; | ||||
7665 | } | ||||||
7666 | 0 | 0 | return defined $make_dirs{$dir}; | ||||
7667 | } | ||||||
7668 | |||||||
7669 | ################################################################ | ||||||
7670 | |||||||
7671 | # Find the aux dir. This should match the algorithm used by | ||||||
7672 | # ./configure. (See the Autoconf documentation for for | ||||||
7673 | # AC_CONFIG_AUX_DIR.) | ||||||
7674 | sub locate_aux_dir () | ||||||
7675 | { | ||||||
7676 | 0 | 0 | if (! $config_aux_dir_set_in_configure_ac) | ||||
7677 | { | ||||||
7678 | # The default auxiliary directory is the first | ||||||
7679 | # of ., .., or ../.. that contains install-sh. | ||||||
7680 | # Assume . if install-sh doesn't exist yet. | ||||||
7681 | 0 | 0 | for my $dir (qw (. .. ../..)) | ||||
7682 | { | ||||||
7683 | 0 | 0 | if (-f "$dir/install-sh") | ||||
7684 | { | ||||||
7685 | 0 | 0 | $config_aux_dir = $dir; | ||||
7686 | 0 | 0 | last; | ||||
7687 | } | ||||||
7688 | } | ||||||
7689 | 0 | 0 | $config_aux_dir = '.' unless $config_aux_dir; | ||||
7690 | } | ||||||
7691 | # Avoid unsightly '/.'s. | ||||||
7692 | $am_config_aux_dir = | ||||||
7693 | 0 | 0 | '$(top_srcdir)' . ($config_aux_dir eq '.' ? "" : "/$config_aux_dir"); | ||||
7694 | 0 | 0 | $am_config_aux_dir =~ s,/*$,,; | ||||
7695 | } | ||||||
7696 | |||||||
7697 | |||||||
7698 | # &maybe_push_required_file ($DIR, $FILE, $FULLFILE) | ||||||
7699 | # -------------------------------------------------- | ||||||
7700 | # See if we want to push this file onto dist_common. This function | ||||||
7701 | # encodes the rules for deciding when to do so. | ||||||
7702 | sub maybe_push_required_file | ||||||
7703 | { | ||||||
7704 | 0 | 0 | my ($dir, $file, $fullfile) = @_; | ||||
7705 | |||||||
7706 | 0 | 0 | if ($dir eq $relative_dir) | ||||
7707 | { | ||||||
7708 | 0 | 0 | push_dist_common ($file); | ||||
7709 | 0 | 0 | return 1; | ||||
7710 | } | ||||||
7711 | elsif ($relative_dir eq '.' && ! &is_make_dir ($dir)) | ||||||
7712 | { | ||||||
7713 | # If we are doing the topmost directory, and the file is in a | ||||||
7714 | # subdir which does not have a Makefile, then we distribute it | ||||||
7715 | # here. | ||||||
7716 | |||||||
7717 | # If a required file is above the source tree, it is important | ||||||
7718 | # to prefix it with `$(srcdir)' so that no VPATH search is | ||||||
7719 | # performed. Otherwise problems occur with Make implementations | ||||||
7720 | # that rewrite and simplify rules whose dependencies are found in a | ||||||
7721 | # VPATH location. Here is an example with OSF1/Tru64 Make. | ||||||
7722 | # | ||||||
7723 | # % cat Makefile | ||||||
7724 | # VPATH = sub | ||||||
7725 | # distdir: ../a | ||||||
7726 | # echo ../a | ||||||
7727 | # % ls | ||||||
7728 | # Makefile a | ||||||
7729 | # % make | ||||||
7730 | # echo a | ||||||
7731 | # a | ||||||
7732 | # | ||||||
7733 | # Dependency `../a' was found in `sub/../a', but this make | ||||||
7734 | # implementation simplified it as `a'. (Note that the sub/ | ||||||
7735 | # directory does not even exist.) | ||||||
7736 | # | ||||||
7737 | # This kind of VPATH rewriting seems hard to cancel. The | ||||||
7738 | # distdir.am hack against VPATH rewriting works only when no | ||||||
7739 | # simplification is done, i.e., for dependencies which are in | ||||||
7740 | # subdirectories, not in enclosing directories. Hence, in | ||||||
7741 | # the latter case we use a full path to make sure no VPATH | ||||||
7742 | # search occurs. | ||||||
7743 | 0 | 0 | $fullfile = '$(srcdir)/' . $fullfile | ||||
7744 | if $dir =~ m,^\.\.(?:$|/),; | ||||||
7745 | |||||||
7746 | 0 | 0 | push_dist_common ($fullfile); | ||||
7747 | 0 | 0 | return 1; | ||||
7748 | } | ||||||
7749 | 0 | 0 | return 0; | ||||
7750 | } | ||||||
7751 | |||||||
7752 | |||||||
7753 | # If a file name appears as a key in this hash, then it has already | ||||||
7754 | # been checked for. This allows us not to report the same error more | ||||||
7755 | # than once. | ||||||
7756 | 1 | 2 | my %required_file_not_found = (); | ||||
7757 | |||||||
7758 | # &require_file_internal ($WHERE, $MYSTRICT, $DIRECTORY, @FILES) | ||||||
7759 | # -------------------------------------------------------------- | ||||||
7760 | # Verify that the file must exist in $DIRECTORY, or install it. | ||||||
7761 | # $MYSTRICT is the strictness level at which this file becomes required. | ||||||
7762 | sub require_file_internal ($$$@) | ||||||
7763 | { | ||||||
7764 | 0 | 0 | my ($where, $mystrict, $dir, @files) = @_; | ||||
7765 | |||||||
7766 | 0 | 0 | foreach my $file (@files) | ||||
7767 | { | ||||||
7768 | 0 | 0 | my $fullfile = "$dir/$file"; | ||||
7769 | 0 | 0 | my $found_it = 0; | ||||
7770 | 0 | 0 | my $dangling_sym = 0; | ||||
7771 | |||||||
7772 | 0 | 0 | if (-l $fullfile && ! -f $fullfile) | ||||
7773 | { | ||||||
7774 | 0 | 0 | $dangling_sym = 1; | ||||
7775 | } | ||||||
7776 | elsif (dir_has_case_matching_file ($dir, $file)) | ||||||
7777 | { | ||||||
7778 | 0 | 0 | $found_it = 1; | ||||
7779 | 0 | 0 | maybe_push_required_file ($dir, $file, $fullfile); | ||||
7780 | } | ||||||
7781 | |||||||
7782 | # `--force-missing' only has an effect if `--add-missing' is | ||||||
7783 | # specified. | ||||||
7784 | 0 | 0 | if ($found_it && (! $add_missing || ! $force_missing)) | ||||
7785 | { | ||||||
7786 | 0 | 0 | next; | ||||
7787 | } | ||||||
7788 | else | ||||||
7789 | { | ||||||
7790 | # If we've already looked for it, we're done. You might | ||||||
7791 | # wonder why we don't do this before searching for the | ||||||
7792 | # file. If we do that, then something like | ||||||
7793 | # AC_OUTPUT(subdir/foo foo) will fail to put foo.in into | ||||||
7794 | # DIST_COMMON. | ||||||
7795 | 0 | 0 | if (! $found_it) | ||||
7796 | { | ||||||
7797 | 0 | 0 | next if defined $required_file_not_found{$fullfile}; | ||||
7798 | 0 | 0 | $required_file_not_found{$fullfile} = 1; | ||||
7799 | } | ||||||
7800 | |||||||
7801 | 0 | 0 | if ($strictness >= $mystrict) | ||||
7802 | { | ||||||
7803 | 0 | 0 | if ($dangling_sym && $add_missing) | ||||
7804 | { | ||||||
7805 | 0 | 0 | unlink ($fullfile); | ||||
7806 | } | ||||||
7807 | |||||||
7808 | 0 | 0 | my $trailer = ''; | ||||
7809 | 0 | 0 | my $trailer2 = ''; | ||||
7810 | 0 | 0 | my $suppress = 0; | ||||
7811 | |||||||
7812 | # Only install missing files according to our desired | ||||||
7813 | # strictness level. | ||||||
7814 | 0 | 0 | my $message = "required file `$fullfile' not found"; | ||||
7815 | 0 | 0 | if ($add_missing) | ||||
7816 | { | ||||||
7817 | 0 | 0 | if (-f "$libdir/$file") | ||||
7818 | { | ||||||
7819 | 0 | 0 | $suppress = 1; | ||||
7820 | |||||||
7821 | # Install the missing file. Symlink if we | ||||||
7822 | # can, copy if we must. Note: delete the file | ||||||
7823 | # first, in case it is a dangling symlink. | ||||||
7824 | 0 | 0 | $message = "installing `$fullfile'"; | ||||
7825 | |||||||
7826 | # The license file should not be volatile. | ||||||
7827 | 0 | 0 | if ($file eq "COPYING") | ||||
7828 | { | ||||||
7829 | 0 | 0 | $message .= " using GNU General Public License v3 file"; | ||||
7830 | 0 | 0 | $trailer2 = "\n Consider adding the COPYING file" | ||||
7831 | . " to the version control system" | ||||||
7832 | . "\n for your code, to avoid questions" | ||||||
7833 | . " about which license your project uses."; | ||||||
7834 | } | ||||||
7835 | |||||||
7836 | # Windows Perl will hang if we try to delete a | ||||||
7837 | # file that doesn't exist. | ||||||
7838 | 0 | 0 | unlink ($fullfile) if -f $fullfile; | ||||
7839 | 0 | 0 | if ($symlink_exists && ! $copy_missing) | ||||
7840 | { | ||||||
7841 | 0 | 0 | if (! symlink ("$libdir/$file", $fullfile) | ||||
7842 | || ! -e $fullfile) | ||||||
7843 | { | ||||||
7844 | 0 | 0 | $suppress = 0; | ||||
7845 | 0 | 0 | $trailer = "; error while making link: $!"; | ||||
7846 | } | ||||||
7847 | } | ||||||
7848 | elsif (system ('cp', "$libdir/$file", $fullfile)) | ||||||
7849 | { | ||||||
7850 | 0 | 0 | $suppress = 0; | ||||
7851 | 0 | 0 | $trailer = "\n error while copying"; | ||||
7852 | } | ||||||
7853 | 0 | 0 | set_dir_cache_file ($dir, $file); | ||||
7854 | } | ||||||
7855 | |||||||
7856 | 0 | 0 | if (! maybe_push_required_file (dirname ($fullfile), | ||||
7857 | $file, $fullfile)) | ||||||
7858 | { | ||||||
7859 | 0 | 0 | if (! $found_it && ! $automake_will_process_aux_dir) | ||||
7860 | { | ||||||
7861 | # We have added the file but could not push it | ||||||
7862 | # into DIST_COMMON, probably because this is | ||||||
7863 | # an auxiliary file and we are not processing | ||||||
7864 | # the top level Makefile. Furthermore Automake | ||||||
7865 | # hasn't been asked to create the Makefile.in | ||||||
7866 | # that distributes the aux dir files. | ||||||
7867 | 0 | 0 | error ($where, 'Please make a full run of automake' | ||||
7868 | . " so $fullfile gets distributed."); | ||||||
7869 | } | ||||||
7870 | } | ||||||
7871 | } | ||||||
7872 | else | ||||||
7873 | { | ||||||
7874 | 0 | 0 | $trailer = "\n `automake --add-missing' can install `$file'" | ||||
7875 | if -f "$libdir/$file"; | ||||||
7876 | } | ||||||
7877 | |||||||
7878 | # If --force-missing was specified, and we have | ||||||
7879 | # actually found the file, then do nothing. | ||||||
7880 | next | ||||||
7881 | 0 | 0 | if $found_it && $force_missing; | ||||
7882 | |||||||
7883 | # If we couldn't install the file, but it is a target in | ||||||
7884 | # the Makefile, don't print anything. This allows files | ||||||
7885 | # like README, AUTHORS, or THANKS to be generated. | ||||||
7886 | next | ||||||
7887 | 0 | 0 | if !$suppress && rule $file; | ||||
7888 | |||||||
7889 | 0 | 0 | msg ($suppress ? 'note' : 'error', $where, "$message$trailer$trailer2"); | ||||
7890 | } | ||||||
7891 | } | ||||||
7892 | } | ||||||
7893 | } | ||||||
7894 | |||||||
7895 | # &require_file ($WHERE, $MYSTRICT, @FILES) | ||||||
7896 | # ----------------------------------------- | ||||||
7897 | sub require_file ($$@) | ||||||
7898 | { | ||||||
7899 | 0 | 0 | my ($where, $mystrict, @files) = @_; | ||||
7900 | 0 | 0 | require_file_internal ($where, $mystrict, $relative_dir, @files); | ||||
7901 | } | ||||||
7902 | |||||||
7903 | # &require_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) | ||||||
7904 | # ----------------------------------------------------------- | ||||||
7905 | sub require_file_with_macro ($$$@) | ||||||
7906 | { | ||||||
7907 | 0 | 0 | my ($cond, $macro, $mystrict, @files) = @_; | ||||
7908 | 0 | 0 | $macro = rvar ($macro) unless ref $macro; | ||||
7909 | 0 | 0 | require_file ($macro->rdef ($cond)->location, $mystrict, @files); | ||||
7910 | } | ||||||
7911 | |||||||
7912 | # &require_libsource_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) | ||||||
7913 | # ---------------------------------------------------------------- | ||||||
7914 | # Require an AC_LIBSOURCEd file. If AC_CONFIG_LIBOBJ_DIR was called, it | ||||||
7915 | # must be in that directory. Otherwise expect it in the current directory. | ||||||
7916 | sub require_libsource_with_macro ($$$@) | ||||||
7917 | { | ||||||
7918 | 0 | 0 | my ($cond, $macro, $mystrict, @files) = @_; | ||||
7919 | 0 | 0 | $macro = rvar ($macro) unless ref $macro; | ||||
7920 | 0 | 0 | if ($config_libobj_dir) | ||||
7921 | { | ||||||
7922 | 0 | 0 | require_file_internal ($macro->rdef ($cond)->location, $mystrict, | ||||
7923 | $config_libobj_dir, @files); | ||||||
7924 | } | ||||||
7925 | else | ||||||
7926 | { | ||||||
7927 | 0 | 0 | require_file ($macro->rdef ($cond)->location, $mystrict, @files); | ||||
7928 | } | ||||||
7929 | } | ||||||
7930 | |||||||
7931 | # Queue to push require_conf_file requirements to. | ||||||
7932 | 1 | 1 | my $required_conf_file_queue; | ||||
7933 | |||||||
7934 | # &queue_required_conf_file ($QUEUE, $KEY, $DIR, $WHERE, $MYSTRICT, @FILES) | ||||||
7935 | # ------------------------------------------------------------------------- | ||||||
7936 | sub queue_required_conf_file ($$$$@) | ||||||
7937 | { | ||||||
7938 | 0 | 0 | my ($queue, $key, $dir, $where, $mystrict, @files) = @_; | ||||
7939 | 0 | 0 | my @serial_loc; | ||||
7940 | 0 | 0 | if (ref $where) | ||||
7941 | { | ||||||
7942 | 0 | 0 | @serial_loc = (QUEUE_LOCATION, $where->serialize ()); | ||||
7943 | } | ||||||
7944 | else | ||||||
7945 | { | ||||||
7946 | 0 | 0 | @serial_loc = (QUEUE_STRING, $where); | ||||
7947 | } | ||||||
7948 | 0 | 0 | $queue->enqueue ($key, $dir, @serial_loc, $mystrict, 0 + @files, @files); | ||||
7949 | } | ||||||
7950 | |||||||
7951 | # &require_queued_conf_file ($QUEUE) | ||||||
7952 | # ---------------------------------- | ||||||
7953 | sub require_queued_conf_file ($) | ||||||
7954 | { | ||||||
7955 | 0 | 0 | my ($queue) = @_; | ||||
7956 | 0 | 0 | my $where; | ||||
7957 | 0 | 0 | my $dir = $queue->dequeue (); | ||||
7958 | 0 | 0 | my $loc_key = $queue->dequeue (); | ||||
7959 | 0 | 0 | if ($loc_key eq QUEUE_LOCATION) | ||||
7960 | { | ||||||
7961 | 0 | 0 | $where = Automake::Location::deserialize ($queue); | ||||
7962 | } | ||||||
7963 | elsif ($loc_key eq QUEUE_STRING) | ||||||
7964 | { | ||||||
7965 | 0 | 0 | $where = $queue->dequeue (); | ||||
7966 | } | ||||||
7967 | else | ||||||
7968 | { | ||||||
7969 | 0 | 0 | prog_error "unexpected key $loc_key"; | ||||
7970 | } | ||||||
7971 | 0 | 0 | my $mystrict = $queue->dequeue (); | ||||
7972 | 0 | 0 | my $nfiles = $queue->dequeue (); | ||||
7973 | 0 | 0 | my @files; | ||||
7974 | push @files, $queue->dequeue () | ||||||
7975 | 0 0 | 0 0 | foreach (1 .. $nfiles); | ||||
7976 | |||||||
7977 | # Dequeuing happens outside of per-makefile context, so we have to | ||||||
7978 | # set the variables used by require_file_internal and the functions | ||||||
7979 | # it calls. Gross! | ||||||
7980 | 0 | 0 | $relative_dir = $dir; | ||||
7981 | 0 | 0 | require_file_internal ($where, $mystrict, $config_aux_dir, @files); | ||||
7982 | } | ||||||
7983 | |||||||
7984 | # &require_conf_file ($WHERE, $MYSTRICT, @FILES) | ||||||
7985 | # ---------------------------------------------- | ||||||
7986 | # Looks in configuration path, as specified by AC_CONFIG_AUX_DIR; | ||||||
7987 | # worker threads may queue up the action to be serialized by the master. | ||||||
7988 | # | ||||||
7989 | # FIXME: this seriously relies on the semantics of require_file_internal | ||||||
7990 | # and maybe_push_required_file, in that we exploit the fact that only the | ||||||
7991 | # contents of the last handled output file may be impacted (which in turn | ||||||
7992 | # is dealt with by the master thread). | ||||||
7993 | sub require_conf_file ($$@) | ||||||
7994 | { | ||||||
7995 | 0 | 0 | my ($where, $mystrict, @files) = @_; | ||||
7996 | 0 | 0 | if (defined $required_conf_file_queue) | ||||
7997 | { | ||||||
7998 | 0 | 0 | queue_required_conf_file ($required_conf_file_queue, QUEUE_CONF_FILE, | ||||
7999 | $relative_dir, $where, $mystrict, @files); | ||||||
8000 | } | ||||||
8001 | else | ||||||
8002 | { | ||||||
8003 | 0 | 0 | require_file_internal ($where, $mystrict, $config_aux_dir, @files); | ||||
8004 | } | ||||||
8005 | } | ||||||
8006 | |||||||
8007 | |||||||
8008 | # &require_conf_file_with_macro ($COND, $MACRO, $MYSTRICT, @FILES) | ||||||
8009 | # ---------------------------------------------------------------- | ||||||
8010 | sub require_conf_file_with_macro ($$$@) | ||||||
8011 | { | ||||||
8012 | 0 | 0 | my ($cond, $macro, $mystrict, @files) = @_; | ||||
8013 | 0 | 0 | require_conf_file (rvar ($macro)->rdef ($cond)->location, | ||||
8014 | $mystrict, @files); | ||||||
8015 | } | ||||||
8016 | |||||||
8017 | ################################################################ | ||||||
8018 | |||||||
8019 | # &require_build_directory ($DIRECTORY) | ||||||
8020 | # ------------------------------------ | ||||||
8021 | # Emit rules to create $DIRECTORY if needed, and return | ||||||
8022 | # the file that any target requiring this directory should be made | ||||||
8023 | # dependent upon. | ||||||
8024 | # We don't want to emit the rule twice, and want to reuse it | ||||||
8025 | # for directories with equivalent names (e.g., `foo/bar' and `./foo//bar'). | ||||||
8026 | sub require_build_directory ($) | ||||||
8027 | { | ||||||
8028 | 0 | 0 | my $directory = shift; | ||||
8029 | |||||||
8030 | 0 | 0 | return $directory_map{$directory} if exists $directory_map{$directory}; | ||||
8031 | |||||||
8032 | 0 | 0 | my $cdir = File::Spec->canonpath ($directory); | ||||
8033 | |||||||
8034 | 0 | 0 | if (exists $directory_map{$cdir}) | ||||
8035 | { | ||||||
8036 | 0 | 0 | my $stamp = $directory_map{$cdir}; | ||||
8037 | 0 | 0 | $directory_map{$directory} = $stamp; | ||||
8038 | 0 | 0 | return $stamp; | ||||
8039 | } | ||||||
8040 | |||||||
8041 | 0 | 0 | my $dirstamp = "$cdir/\$(am__dirstamp)"; | ||||
8042 | |||||||
8043 | 0 | 0 | $directory_map{$directory} = $dirstamp; | ||||
8044 | 0 | 0 | $directory_map{$cdir} = $dirstamp; | ||||
8045 | |||||||
8046 | # Set a variable for the dirstamp basename. | ||||||
8047 | 0 | 0 | define_pretty_variable ('am__dirstamp', TRUE, INTERNAL, | ||||
8048 | '$(am__leading_dot)dirstamp'); | ||||||
8049 | |||||||
8050 | # Directory must be removed by `make distclean'. | ||||||
8051 | 0 | 0 | $clean_files{$dirstamp} = DIST_CLEAN; | ||||
8052 | |||||||
8053 | 0 | 0 | $output_rules .= ("$dirstamp:\n" | ||||
8054 | . "\t\@\$(MKDIR_P) $directory\n" | ||||||
8055 | . "\t\@: > $dirstamp\n"); | ||||||
8056 | |||||||
8057 | 0 | 0 | return $dirstamp; | ||||
8058 | } | ||||||
8059 | |||||||
8060 | # &require_build_directory_maybe ($FILE) | ||||||
8061 | # -------------------------------------- | ||||||
8062 | # If $FILE lies in a subdirectory, emit a rule to create this | ||||||
8063 | # directory and return the file that $FILE should be made | ||||||
8064 | # dependent upon. Otherwise, just return the empty string. | ||||||
8065 | sub require_build_directory_maybe ($) | ||||||
8066 | { | ||||||
8067 | 0 | 0 | my $file = shift; | ||||
8068 | 0 | 0 | my $directory = dirname ($file); | ||||
8069 | |||||||
8070 | 0 | 0 | if ($directory ne '.') | ||||
8071 | { | ||||||
8072 | 0 | 0 | return require_build_directory ($directory); | ||||
8073 | } | ||||||
8074 | else | ||||||
8075 | { | ||||||
8076 | 0 | 0 | return ''; | ||||
8077 | } | ||||||
8078 | } | ||||||
8079 | |||||||
8080 | ################################################################ | ||||||
8081 | |||||||
8082 | # Push a list of files onto dist_common. | ||||||
8083 | sub push_dist_common | ||||||
8084 | { | ||||||
8085 | 0 | 0 | prog_error "push_dist_common run after handle_dist" | ||||
8086 | if $handle_dist_run; | ||||||
8087 | 0 | 0 | Automake::Variable::define ('DIST_COMMON', VAR_AUTOMAKE, '+', TRUE, "@_", | ||||
8088 | '', INTERNAL, VAR_PRETTY); | ||||||
8089 | } | ||||||
8090 | |||||||
8091 | |||||||
8092 | ################################################################ | ||||||
8093 | |||||||
8094 | # generate_makefile ($MAKEFILE_AM, $MAKEFILE_IN) | ||||||
8095 | # ---------------------------------------------- | ||||||
8096 | # Generate a Makefile.in given the name of the corresponding Makefile and | ||||||
8097 | # the name of the file output by config.status. | ||||||
8098 | sub generate_makefile ($$) | ||||||
8099 | { | ||||||
8100 | 0 | 0 | my ($makefile_am, $makefile_in) = @_; | ||||
8101 | |||||||
8102 | # Reset all the Makefile.am related variables. | ||||||
8103 | 0 | 0 | initialize_per_input; | ||||
8104 | |||||||
8105 | # AUTOMAKE_OPTIONS can contains -W flags to disable or enable | ||||||
8106 | # warnings for this file. So hold any warning issued before | ||||||
8107 | # we have processed AUTOMAKE_OPTIONS. | ||||||
8108 | 0 | 0 | buffer_messages ('warning'); | ||||
8109 | |||||||
8110 | # Name of input file ("Makefile.am") and output file | ||||||
8111 | # ("Makefile.in"). These have no directory components. | ||||||
8112 | 0 | 0 | $am_file_name = basename ($makefile_am); | ||||
8113 | 0 | 0 | $in_file_name = basename ($makefile_in); | ||||
8114 | |||||||
8115 | # $OUTPUT is encoded. If it contains a ":" then the first element | ||||||
8116 | # is the real output file, and all remaining elements are input | ||||||
8117 | # files. We don't scan or otherwise deal with these input files, | ||||||
8118 | # other than to mark them as dependencies. See | ||||||
8119 | # &scan_autoconf_files for details. | ||||||
8120 | 0 | 0 | my ($makefile, @inputs) = split (/:/, $output_files{$makefile_in}); | ||||
8121 | |||||||
8122 | 0 | 0 | $relative_dir = dirname ($makefile); | ||||
8123 | 0 | 0 | $am_relative_dir = dirname ($makefile_am); | ||||
8124 | 0 | 0 | $topsrcdir = backname ($relative_dir); | ||||
8125 | |||||||
8126 | 0 | 0 | read_main_am_file ($makefile_am); | ||||
8127 | 0 | 0 | if (handle_options) | ||||
8128 | { | ||||||
8129 | # Process buffered warnings. | ||||||
8130 | 0 | 0 | flush_messages; | ||||
8131 | # Fatal error. Just return, so we can continue with next file. | ||||||
8132 | 0 | 0 | return; | ||||
8133 | } | ||||||
8134 | # Process buffered warnings. | ||||||
8135 | 0 | 0 | flush_messages; | ||||
8136 | |||||||
8137 | # There are a few install-related variables that you should not define. | ||||||
8138 | 0 | 0 | foreach my $var ('PRE_INSTALL', 'POST_INSTALL', 'NORMAL_INSTALL') | ||||
8139 | { | ||||||
8140 | 0 | 0 | my $v = var $var; | ||||
8141 | 0 | 0 | if ($v) | ||||
8142 | { | ||||||
8143 | 0 | 0 | my $def = $v->def (TRUE); | ||||
8144 | 0 | 0 | prog_error "$var not defined in condition TRUE" | ||||
8145 | unless $def; | ||||||
8146 | 0 | 0 | reject_var $var, "`$var' should not be defined" | ||||
8147 | if $def->owner != VAR_AUTOMAKE; | ||||||
8148 | } | ||||||
8149 | } | ||||||
8150 | |||||||
8151 | # Catch some obsolete variables. | ||||||
8152 | 0 | 0 | msg_var ('obsolete', 'INCLUDES', | ||||
8153 | "`INCLUDES' is the old name for `AM_CPPFLAGS' (or `*_CPPFLAGS')") | ||||||
8154 | if var ('INCLUDES'); | ||||||
8155 | |||||||
8156 | # Must do this after reading .am file. | ||||||
8157 | 0 | 0 | define_variable ('subdir', $relative_dir, INTERNAL); | ||||
8158 | |||||||
8159 | # If DIST_SUBDIRS is defined, make sure SUBDIRS is, so that | ||||||
8160 | # recursive rules are enabled. | ||||||
8161 | 0 | 0 | define_pretty_variable ('SUBDIRS', TRUE, INTERNAL, '') | ||||
8162 | if var 'DIST_SUBDIRS' && ! var 'SUBDIRS'; | ||||||
8163 | |||||||
8164 | # Check first, because we might modify some state. | ||||||
8165 | 0 | 0 | check_cygnus; | ||||
8166 | 0 | 0 | check_gnu_standards; | ||||
8167 | 0 | 0 | check_gnits_standards; | ||||
8168 | |||||||
8169 | 0 | 0 | handle_configure ($makefile_am, $makefile_in, $makefile, @inputs); | ||||
8170 | 0 | 0 | handle_gettext; | ||||
8171 | 0 | 0 | handle_libraries; | ||||
8172 | 0 | 0 | handle_ltlibraries; | ||||
8173 | 0 | 0 | handle_programs; | ||||
8174 | 0 | 0 | handle_scripts; | ||||
8175 | |||||||
8176 | # These must be run after all the sources are scanned. They | ||||||
8177 | # use variables defined by &handle_libraries, &handle_ltlibraries, | ||||||
8178 | # or &handle_programs. | ||||||
8179 | 0 | 0 | handle_compile; | ||||
8180 | 0 | 0 | handle_languages; | ||||
8181 | 0 | 0 | handle_libtool; | ||||
8182 | |||||||
8183 | # Variables used by distdir.am and tags.am. | ||||||
8184 | 0 | 0 | define_pretty_variable ('SOURCES', TRUE, INTERNAL, @sources); | ||||
8185 | 0 | 0 | if (! option 'no-dist') | ||||
8186 | { | ||||||
8187 | 0 | 0 | define_pretty_variable ('DIST_SOURCES', TRUE, INTERNAL, @dist_sources); | ||||
8188 | } | ||||||
8189 | |||||||
8190 | 0 | 0 | handle_multilib; | ||||
8191 | 0 | 0 | handle_texinfo; | ||||
8192 | 0 | 0 | handle_emacs_lisp; | ||||
8193 | 0 | 0 | handle_python; | ||||
8194 | 0 | 0 | handle_java; | ||||
8195 | 0 | 0 | handle_man_pages; | ||||
8196 | 0 | 0 | handle_data; | ||||
8197 | 0 | 0 | handle_headers; | ||||
8198 | 0 | 0 | handle_subdirs; | ||||
8199 | 0 | 0 | handle_tags; | ||||
8200 | 0 | 0 | handle_minor_options; | ||||
8201 | # Must come after handle_programs so that %known_programs is up-to-date. | ||||||
8202 | 0 | 0 | handle_tests; | ||||
8203 | |||||||
8204 | # This must come after most other rules. | ||||||
8205 | 0 | 0 | handle_dist; | ||||
8206 | |||||||
8207 | 0 | 0 | handle_footer; | ||||
8208 | 0 | 0 | do_check_merge_target; | ||||
8209 | 0 | 0 | handle_all ($makefile); | ||||
8210 | |||||||
8211 | # FIXME: Gross! | ||||||
8212 | 0 | 0 | if (var ('lib_LTLIBRARIES') && var ('bin_PROGRAMS')) | ||||
8213 | { | ||||||
8214 | 0 | 0 | $output_rules .= "install-binPROGRAMS: install-libLTLIBRARIES\n\n"; | ||||
8215 | } | ||||||
8216 | 0 | 0 | if (var ('nobase_lib_LTLIBRARIES') && var ('bin_PROGRAMS')) | ||||
8217 | { | ||||||
8218 | 0 | 0 | $output_rules .= "install-binPROGRAMS: install-nobase_libLTLIBRARIES\n\n"; | ||||
8219 | } | ||||||
8220 | |||||||
8221 | 0 | 0 | handle_install; | ||||
8222 | 0 | 0 | handle_clean ($makefile); | ||||
8223 | 0 | 0 | handle_factored_dependencies; | ||||
8224 | |||||||
8225 | # Comes last, because all the above procedures may have | ||||||
8226 | # defined or overridden variables. | ||||||
8227 | 0 | 0 | $output_vars .= output_variables; | ||||
8228 | |||||||
8229 | 0 | 0 | check_typos; | ||||
8230 | |||||||
8231 | 0 | 0 | my ($out_file) = $output_directory . '/' . $makefile_in; | ||||
8232 | |||||||
8233 | 0 | 0 | if ($exit_code != 0) | ||||
8234 | { | ||||||
8235 | 0 | 0 | verb "not writing $out_file because of earlier errors"; | ||||
8236 | 0 | 0 | return; | ||||
8237 | } | ||||||
8238 | |||||||
8239 | 0 | 0 | if (! -d ($output_directory . '/' . $am_relative_dir)) | ||||
8240 | { | ||||||
8241 | 0 | 0 | mkdir ($output_directory . '/' . $am_relative_dir, 0755); | ||||
8242 | } | ||||||
8243 | |||||||
8244 | # We make sure that `all:' is the first target. | ||||||
8245 | 0 | 0 | my $output = | ||||
8246 | "$output_vars$output_all$output_header$output_rules$output_trailer"; | ||||||
8247 | |||||||
8248 | # Decide whether we must update the output file or not. | ||||||
8249 | # We have to update in the following situations. | ||||||
8250 | # * $force_generation is set. | ||||||
8251 | # * any of the output dependencies is younger than the output | ||||||
8252 | # * the contents of the output is different (this can happen | ||||||
8253 | # if the project has been populated with a file listed in | ||||||
8254 | # @common_files since the last run). | ||||||
8255 | # Output's dependencies are split in two sets: | ||||||
8256 | # * dependencies which are also configure dependencies | ||||||
8257 | # These do not change between each Makefile.am | ||||||
8258 | # * other dependencies, specific to the Makefile.am being processed | ||||||
8259 | # (such as the Makefile.am itself, or any Makefile fragment | ||||||
8260 | # it includes). | ||||||
8261 | 0 | 0 | my $timestamp = mtime $out_file; | ||||
8262 | 0 | 0 | if (! $force_generation | ||||
8263 | && $configure_deps_greatest_timestamp < $timestamp | ||||||
8264 | && $output_deps_greatest_timestamp < $timestamp | ||||||
8265 | && $output eq contents ($out_file)) | ||||||
8266 | { | ||||||
8267 | 0 | 0 | verb "$out_file unchanged"; | ||||
8268 | # No need to update. | ||||||
8269 | 0 | 0 | return; | ||||
8270 | } | ||||||
8271 | |||||||
8272 | 0 | 0 | if (-e $out_file) | ||||
8273 | { | ||||||
8274 | 0 | 0 | unlink ($out_file) | ||||
8275 | or fatal "cannot remove $out_file: $!\n"; | ||||||
8276 | } | ||||||
8277 | |||||||
8278 | 0 | 0 | my $gm_file = new Automake::XFile "> $out_file"; | ||||
8279 | 0 | 0 | verb "creating $out_file"; | ||||
8280 | 0 | 0 | print $gm_file $output; | ||||
8281 | } | ||||||
8282 | |||||||
8283 | ################################################################ | ||||||
8284 | |||||||
8285 | |||||||
8286 | |||||||
8287 | |||||||
8288 | ################################################################ | ||||||
8289 | |||||||
8290 | # Print usage information. | ||||||
8291 | sub usage () | ||||||
8292 | { | ||||||
8293 | 0 | 0 | print "Usage: $0 [OPTION] ... [Makefile]... | ||||
8294 | |||||||
8295 | Generate Makefile.in for configure from Makefile.am. | ||||||
8296 | |||||||
8297 | Operation modes: | ||||||
8298 | --help print this help, then exit | ||||||
8299 | --version print version number, then exit | ||||||
8300 | -v, --verbose verbosely list files processed | ||||||
8301 | --no-force only update Makefile.in's that are out of date | ||||||
8302 | -W, --warnings=CATEGORY report the warnings falling in CATEGORY | ||||||
8303 | |||||||
8304 | Dependency tracking: | ||||||
8305 | -i, --ignore-deps disable dependency tracking code | ||||||
8306 | --include-deps enable dependency tracking code | ||||||
8307 | |||||||
8308 | Flavors: | ||||||
8309 | --cygnus assume program is part of Cygnus-style tree | ||||||
8310 | --foreign set strictness to foreign | ||||||
8311 | --gnits set strictness to gnits | ||||||
8312 | --gnu set strictness to gnu | ||||||
8313 | |||||||
8314 | Library files: | ||||||
8315 | -a, --add-missing add missing standard files to package | ||||||
8316 | --libdir=DIR directory storing library files | ||||||
8317 | -c, --copy with -a, copy missing files (default is symlink) | ||||||
8318 | -f, --force-missing force update of standard files | ||||||
8319 | |||||||
8320 | "; | ||||||
8321 | 0 | 0 | Automake::ChannelDefs::usage; | ||||
8322 | |||||||
8323 | 0 | 0 | my ($last, @lcomm); | ||||
8324 | 0 | 0 | $last = ''; | ||||
8325 | 0 | 0 | foreach my $iter (sort ((@common_files, @common_sometimes))) | ||||
8326 | { | ||||||
8327 | 0 | 0 | push (@lcomm, $iter) unless $iter eq $last; | ||||
8328 | 0 | 0 | $last = $iter; | ||||
8329 | } | ||||||
8330 | |||||||
8331 | 0 | 0 | my @four; | ||||
8332 | 0 | 0 | print "\nFiles which are automatically distributed, if found:\n"; | ||||
8333 | format USAGE_FORMAT = | ||||||
8334 | @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<< | ||||||
8335 | $four[0], $four[1], $four[2], $four[3] | ||||||
8336 | . | ||||||
8337 | 0 | 0 | $~ = "USAGE_FORMAT"; | ||||
8338 | |||||||
8339 | 0 | 0 | my $cols = 4; | ||||
8340 | 0 | 0 | my $rows = int(@lcomm / $cols); | ||||
8341 | 0 | 0 | my $rest = @lcomm % $cols; | ||||
8342 | |||||||
8343 | 0 | 0 | if ($rest) | ||||
8344 | { | ||||||
8345 | 0 | 0 | $rows++; | ||||
8346 | } | ||||||
8347 | else | ||||||
8348 | { | ||||||
8349 | 0 | 0 | $rest = $cols; | ||||
8350 | } | ||||||
8351 | |||||||
8352 | for (my $y = 0; $y < $rows; $y++) | ||||||
8353 | { | ||||||
8354 | 0 | 0 | @four = ("", "", "", ""); | ||||
8355 | for (my $x = 0; $x < $cols; $x++) | ||||||
8356 | { | ||||||
8357 | 0 | 0 | last if $y + 1 == $rows && $x == $rest; | ||||
8358 | |||||||
8359 | 0 | 0 | my $idx = (($x > $rest) | ||||
8360 | ? ($rows * $rest + ($rows - 1) * ($x - $rest)) | ||||||
8361 | : ($rows * $x)); | ||||||
8362 | |||||||
8363 | 0 | 0 | $idx += $y; | ||||
8364 | 0 | 0 | $four[$x] = $lcomm[$idx]; | ||||
8365 | 0 | 0 | } | ||||
8366 | 0 | 0 | write; | ||||
8367 | 0 | 0 | } | ||||
8368 | |||||||
8369 | 0 | 0 | print "\nReport bugs to <bug-automake\@gnu.org>.\n"; | ||||
8370 | |||||||
8371 | # --help always returns 0 per GNU standards. | ||||||
8372 | 0 | 0 | exit 0; | ||||
8373 | } | ||||||
8374 | |||||||
8375 | |||||||
8376 | # &version () | ||||||
8377 | # ----------- | ||||||
8378 | # Print version information | ||||||
8379 | sub version () | ||||||
8380 | { | ||||||
8381 | 1 | 2136 | print <<EOF; | ||||
8382 | automake (GNU $PACKAGE) $VERSION | ||||||
8383 | Copyright (C) 2009 Free Software Foundation, Inc. | ||||||
8384 | License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html> | ||||||
8385 | This is free software: you are free to change and redistribute it. | ||||||
8386 | There is NO WARRANTY, to the extent permitted by law. | ||||||
8387 | |||||||
8388 | Written by Tom Tromey <tromey\@redhat.com> | ||||||
8389 | and Alexandre Duret-Lutz <adl\@gnu.org>. | ||||||
8390 | EOF | ||||||
8391 | # --version always returns 0 per GNU standards. | ||||||
8392 | 1 | 2 | exit 0; | ||||
8393 | } | ||||||
8394 | |||||||
8395 | ################################################################ | ||||||
8396 | |||||||
8397 | # Parse command line. | ||||||
8398 | sub parse_arguments () | ||||||
8399 | { | ||||||
8400 | # Start off as gnu. | ||||||
8401 | 1 | 4 | set_strictness ('gnu'); | ||||
8402 | |||||||
8403 | 1 | 5 | my $cli_where = new Automake::Location; | ||||
8404 | my %cli_options = | ||||||
8405 | ( | ||||||
8406 | 'libdir=s' => \$libdir, | ||||||
8407 | 0 | 0 | 'gnu' => sub { set_strictness ('gnu'); }, | ||||
8408 | 0 | 0 | 'gnits' => sub { set_strictness ('gnits'); }, | ||||
8409 | 0 | 0 | 'cygnus' => sub { set_global_option ('cygnus', $cli_where); }, | ||||
8410 | 0 | 0 | 'foreign' => sub { set_strictness ('foreign'); }, | ||||
8411 | 0 | 0 | 'include-deps' => sub { unset_global_option ('no-dependencies'); }, | ||||
8412 | 0 | 0 | 'i|ignore-deps' => sub { set_global_option ('no-dependencies', | ||||
8413 | $cli_where); }, | ||||||
8414 | 0 | 0 | 'no-force' => sub { $force_generation = 0; }, | ||||
8415 | 'f|force-missing' => \$force_missing, | ||||||
8416 | 'o|output-dir=s' => \$output_directory, | ||||||
8417 | 'a|add-missing' => \$add_missing, | ||||||
8418 | 'c|copy' => \$copy_missing, | ||||||
8419 | 0 | 0 | 'v|verbose' => sub { setup_channel 'verb', silent => 0; }, | ||||
8420 | 'W|warnings=s' => \&parse_warnings, | ||||||
8421 | # These long options (--Werror and --Wno-error) for backward | ||||||
8422 | # compatibility. Use -Werror and -Wno-error today. | ||||||
8423 | 0 | 0 | 'Werror' => sub { parse_warnings 'W', 'error'; }, | ||||
8424 | 0 | 0 | 'Wno-error' => sub { parse_warnings 'W', 'no-error'; }, | ||||
8425 | 1 | 37 | ); | ||||
8426 | 1 1 1 | 17 2 4 | use Getopt::Long; | ||||
8427 | 1 | 6 | Getopt::Long::config ("bundling", "pass_through"); | ||||
8428 | |||||||
8429 | # See if --version or --help is used. We want to process these before | ||||||
8430 | # anything else because the GNU Coding Standards require us to | ||||||
8431 | # `exit 0' after processing these options, and we can't guarantee this | ||||||
8432 | # if we treat other options first. (Handling other options first | ||||||
8433 | # could produce error diagnostics, and in this condition it is | ||||||
8434 | # confusing if Automake does `exit 0'.) | ||||||
8435 | my %cli_options_1st_pass = | ||||||
8436 | ( | ||||||
8437 | 'version' => \&version, | ||||||
8438 | 'help' => \&usage, | ||||||
8439 | # Recognize all other options (and their arguments) but do nothing. | ||||||
8440 | 1 16 0 | 113 55 0 | map { $_ => sub {} } (keys %cli_options) | ||||
8441 | ); | ||||||
8442 | 1 | 5 | my @ARGV_backup = @ARGV; | ||||
8443 | 1 | 6 | Getopt::Long::GetOptions %cli_options_1st_pass | ||||
8444 | or exit 1; | ||||||
8445 | 0 | @ARGV = @ARGV_backup; | |||||
8446 | |||||||
8447 | # Now *really* process the options. This time we know that --help | ||||||
8448 | # and --version are not present, but we specify them nonetheless so | ||||||
8449 | # that ambiguous abbreviation are diagnosed. | ||||||
8450 | 0 0 | Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {} | |||||
8451 | 0 | or exit 1; | |||||
8452 | |||||||
8453 | 0 | if (defined $output_directory) | |||||
8454 | { | ||||||
8455 | 0 | msg 'obsolete', "`--output-dir' is deprecated\n"; | |||||
8456 | } | ||||||
8457 | else | ||||||
8458 | { | ||||||
8459 | # In the next release we'll remove this entirely. | ||||||
8460 | 0 | $output_directory = '.'; | |||||
8461 | } | ||||||
8462 | |||||||
8463 | 0 | return unless @ARGV; | |||||
8464 | |||||||
8465 | 0 | if ($ARGV[0] =~ /^-./) | |||||
8466 | { | ||||||
8467 | 0 | my %argopts; | |||||
8468 | 0 | for my $k (keys %cli_options) | |||||
8469 | { | ||||||
8470 | 0 | if ($k =~ /(.*)=s$/) | |||||
8471 | { | ||||||
8472 | 0 0 | map { $argopts{(length ($_) == 1) | |||||
8473 | ? "-$_" : "--$_" } = 1; } (split (/\|/, $1)); | ||||||
8474 | } | ||||||
8475 | } | ||||||
8476 | 0 | if ($ARGV[0] eq '--') | |||||
8477 | { | ||||||
8478 | 0 | shift @ARGV; | |||||
8479 | } | ||||||
8480 | elsif (exists $argopts{$ARGV[0]}) | ||||||
8481 | { | ||||||
8482 | 0 | fatal ("option `$ARGV[0]' requires an argument\n" | |||||
8483 | . "Try `$0 --help' for more information."); | ||||||
8484 | } | ||||||
8485 | else | ||||||
8486 | { | ||||||
8487 | 0 | fatal ("unrecognized option `$ARGV[0]'.\n" | |||||
8488 | . "Try `$0 --help' for more information."); | ||||||
8489 | } | ||||||
8490 | } | ||||||
8491 | |||||||
8492 | 0 | my $errspec = 0; | |||||
8493 | 0 | foreach my $arg (@ARGV) | |||||
8494 | { | ||||||
8495 | 0 | fatal ("empty argument\nTry `$0 --help' for more information.") | |||||
8496 | if ($arg eq ''); | ||||||
8497 | |||||||
8498 | # Handle $local:$input syntax. | ||||||
8499 | 0 | my ($local, @rest) = split (/:/, $arg); | |||||
8500 | 0 | @rest = ("$local.in",) unless @rest; | |||||
8501 | 0 | my $input = locate_am @rest; | |||||
8502 | 0 | if ($input) | |||||
8503 | { | ||||||
8504 | 0 | push @input_files, $input; | |||||
8505 | 0 | $output_files{$input} = join (':', ($local, @rest)); | |||||
8506 | } | ||||||
8507 | else | ||||||
8508 | { | ||||||
8509 | 0 | error "no Automake input file found for `$arg'"; | |||||
8510 | 0 | $errspec = 1; | |||||
8511 | } | ||||||
8512 | } | ||||||
8513 | 0 | fatal "no input file found among supplied arguments" | |||||
8514 | if $errspec && ! @input_files; | ||||||
8515 | } | ||||||
8516 | |||||||
8517 | |||||||
8518 | # handle_makefile ($MAKEFILE_IN) | ||||||
8519 | # ------------------------------ | ||||||
8520 | # Deal with $MAKEFILE_IN. | ||||||
8521 | sub handle_makefile ($) | ||||||
8522 | { | ||||||
8523 | 0 | my ($file) = @_; | |||||
8524 | 0 | ($am_file = $file) =~ s/\.in$//; | |||||
8525 | 0 | if (! -f ($am_file . '.am')) | |||||
8526 | { | ||||||
8527 | 0 | error "`$am_file.am' does not exist"; | |||||
8528 | } | ||||||
8529 | else | ||||||
8530 | { | ||||||
8531 | # Any warning setting now local to this Makefile.am. | ||||||
8532 | 0 | dup_channel_setup; | |||||
8533 | |||||||
8534 | 0 | generate_makefile ($am_file . '.am', $file); | |||||
8535 | |||||||
8536 | # Back out any warning setting. | ||||||
8537 | 0 | drop_channel_setup; | |||||
8538 | } | ||||||
8539 | } | ||||||
8540 | |||||||
8541 | # handle_makefiles_serial () | ||||||
8542 | # -------------------------- | ||||||
8543 | # Deal with all makefiles, without threads. | ||||||
8544 | sub handle_makefiles_serial () | ||||||
8545 | { | ||||||
8546 | 0 | foreach my $file (@input_files) | |||||
8547 | { | ||||||
8548 | 0 | handle_makefile ($file); | |||||
8549 | } | ||||||
8550 | } | ||||||
8551 | |||||||
8552 | # get_number_of_threads () | ||||||
8553 | # ------------------------ | ||||||
8554 | # Logic for deciding how many worker threads to use. | ||||||
8555 | sub get_number_of_threads | ||||||
8556 | { | ||||||
8557 | 0 | my $nthreads = $ENV{'AUTOMAKE_JOBS'} || 0; | |||||
8558 | |||||||
8559 | 0 | $nthreads = 0 | |||||
8560 | unless $nthreads =~ /^[0-9]+$/; | ||||||
8561 | |||||||
8562 | # It doesn't make sense to use more threads than makefiles, | ||||||
8563 | 0 | my $max_threads = @input_files; | |||||
8564 | |||||||
8565 | # but a single worker thread is helpful for exposing bugs. | ||||||
8566 | 0 | if ($automake_will_process_aux_dir && $max_threads > 1) | |||||
8567 | { | ||||||
8568 | 0 | $max_threads--; | |||||
8569 | } | ||||||
8570 | 0 | if ($nthreads > $max_threads) | |||||
8571 | { | ||||||
8572 | 0 | $nthreads = $max_threads; | |||||
8573 | } | ||||||
8574 | 0 | return $nthreads; | |||||
8575 | } | ||||||
8576 | |||||||
8577 | # handle_makefiles_threaded ($NTHREADS) | ||||||
8578 | # ------------------------------------- | ||||||
8579 | # Deal with all makefiles, using threads. The general strategy is to | ||||||
8580 | # spawn NTHREADS worker threads, dispatch makefiles to them, and let the | ||||||
8581 | # worker threads push back everything that needs serialization: | ||||||
8582 | # * warning and (normal) error messages, for stable stderr output | ||||||
8583 | # order and content (avoiding duplicates, for example), | ||||||
8584 | # * races when installing aux files (and respective messages), | ||||||
8585 | # * races when collecting aux files for distribution. | ||||||
8586 | # | ||||||
8587 | # The latter requires that the makefile that deals with the aux dir | ||||||
8588 | # files be handled last, done by the master thread. | ||||||
8589 | sub handle_makefiles_threaded ($) | ||||||
8590 | { | ||||||
8591 | 0 | my ($nthreads) = @_; | |||||
8592 | |||||||
8593 | 0 | my @queued_input_files = @input_files; | |||||
8594 | 0 | my $last_input_file = undef; | |||||
8595 | 0 | if ($automake_will_process_aux_dir) | |||||
8596 | { | ||||||
8597 | 0 | $last_input_file = pop @queued_input_files; | |||||
8598 | } | ||||||
8599 | |||||||
8600 | # The file queue distributes all makefiles, the message queues | ||||||
8601 | # collect all serializations needed for respective files. | ||||||
8602 | 0 | my $file_queue = Thread::Queue->new; | |||||
8603 | 0 | my %msg_queues; | |||||
8604 | 0 | foreach my $file (@queued_input_files) | |||||
8605 | { | ||||||
8606 | 0 | $msg_queues{$file} = Thread::Queue->new; | |||||
8607 | } | ||||||
8608 | |||||||
8609 | 0 | verb "spawning $nthreads worker threads"; | |||||
8610 | 0 | my @threads = (1 .. $nthreads); | |||||
8611 | 0 | foreach my $t (@threads) | |||||
8612 | { | ||||||
8613 | $t = threads->new (sub | ||||||
8614 | { | ||||||
8615 | 0 | while (my $file = $file_queue->dequeue) | |||||
8616 | { | ||||||
8617 | 0 | verb "handling $file"; | |||||
8618 | 0 | my $queue = $msg_queues{$file}; | |||||
8619 | 0 | setup_channel_queue ($queue, QUEUE_MESSAGE); | |||||
8620 | 0 | $required_conf_file_queue = $queue; | |||||
8621 | 0 | handle_makefile ($file); | |||||
8622 | 0 | $queue->enqueue (undef); | |||||
8623 | 0 | setup_channel_queue (undef, undef); | |||||
8624 | 0 | $required_conf_file_queue = undef; | |||||
8625 | } | ||||||
8626 | 0 | return $exit_code; | |||||
8627 | 0 | }); | |||||
8628 | } | ||||||
8629 | |||||||
8630 | # Queue all normal makefiles. | ||||||
8631 | 0 | verb "queuing " . @queued_input_files . " input files"; | |||||
8632 | 0 | $file_queue->enqueue (@queued_input_files, (undef) x @threads); | |||||
8633 | |||||||
8634 | # Collect and process serializations. | ||||||
8635 | 0 | foreach my $file (@queued_input_files) | |||||
8636 | { | ||||||
8637 | 0 | verb "dequeuing messages for " . $file; | |||||
8638 | 0 | reset_local_duplicates (); | |||||
8639 | 0 | my $queue = $msg_queues{$file}; | |||||
8640 | 0 | while (my $key = $queue->dequeue) | |||||
8641 | { | ||||||
8642 | 0 | if ($key eq QUEUE_MESSAGE) | |||||
8643 | { | ||||||
8644 | 0 | pop_channel_queue ($queue); | |||||
8645 | } | ||||||
8646 | elsif ($key eq QUEUE_CONF_FILE) | ||||||
8647 | { | ||||||
8648 | 0 | require_queued_conf_file ($queue); | |||||
8649 | } | ||||||
8650 | else | ||||||
8651 | { | ||||||
8652 | 0 | prog_error "unexpected key $key"; | |||||
8653 | } | ||||||
8654 | } | ||||||
8655 | } | ||||||
8656 | |||||||
8657 | 0 | foreach my $t (@threads) | |||||
8658 | { | ||||||
8659 | 0 | my @exit_thread = $t->join; | |||||
8660 | 0 | $exit_code = $exit_thread[0] | |||||
8661 | if ($exit_thread[0] > $exit_code); | ||||||
8662 | } | ||||||
8663 | |||||||
8664 | # The master processes the last file. | ||||||
8665 | 0 | if ($automake_will_process_aux_dir) | |||||
8666 | { | ||||||
8667 | 0 | verb "processing last input file"; | |||||
8668 | 0 | handle_makefile ($last_input_file); | |||||
8669 | } | ||||||
8670 | } | ||||||
8671 | |||||||
8672 | ################################################################ | ||||||
8673 | |||||||
8674 | # Parse the WARNINGS environment variable. | ||||||
8675 | 1 | 4 | parse_WARNINGS; | ||||
8676 | |||||||
8677 | # Parse command line. | ||||||
8678 | 1 | 3 | parse_arguments; | ||||
8679 | |||||||
8680 | 0 | 0 | $configure_ac = require_configure_ac; | ||||
8681 | |||||||
8682 | # Do configure.ac scan only once. | ||||||
8683 | 0 | 0 | scan_autoconf_files; | ||||
8684 | |||||||
8685 | 0 | 0 | if (! @input_files) | ||||
8686 | { | ||||||
8687 | 0 | 0 | my $msg = ''; | ||||
8688 | 0 | 0 | $msg = "\nDid you forget AC_CONFIG_FILES([Makefile]) in $configure_ac?" | ||||
8689 | if -f 'Makefile.am'; | ||||||
8690 | 0 | 0 | fatal ("no `Makefile.am' found for any configure output$msg"); | ||||
8691 | } | ||||||
8692 | |||||||
8693 | 0 | 0 | my $nthreads = get_number_of_threads (); | ||||
8694 | |||||||
8695 | 0 | 0 | if ($perl_threads && $nthreads >= 1) | ||||
8696 | { | ||||||
8697 | 0 | 0 | handle_makefiles_threaded ($nthreads); | ||||
8698 | } | ||||||
8699 | else | ||||||
8700 | { | ||||||
8701 | 0 | 0 | handle_makefiles_serial (); | ||||
8702 | } | ||||||
8703 | |||||||
8704 | 0 | 0 | exit $exit_code; | ||||
8705 | |||||||
8706 | |||||||
8707 | ### Setup "GNU" style for perl-mode and cperl-mode. | ||||||
8708 | ## Local Variables: | ||||||
8709 | ## perl-indent-level: 2 | ||||||
8710 | ## perl-continued-statement-offset: 2 | ||||||
8711 | ## perl-continued-brace-offset: 0 | ||||||
8712 | ## perl-brace-offset: 0 | ||||||
8713 | ## perl-brace-imaginary-offset: 0 | ||||||
8714 | ## perl-label-offset: -2 | ||||||
8715 | ## cperl-indent-level: 2 | ||||||
8716 | ## cperl-brace-offset: 0 | ||||||
8717 | ## cperl-continued-brace-offset: 0 | ||||||
8718 | ## cperl-label-offset: -2 | ||||||
8719 | ## cperl-extra-newline-before-brace: t | ||||||
8720 | ## cperl-merge-trailing-else: nil | ||||||
8721 | ## cperl-continued-statement-offset: 2 | ||||||
8722 | ## End: |