5 # aclocal - create aclocal.m4 by scanning configure.ac
6 # Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2, or (at your option)
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23 # Written by Tom Tromey <tromey@cygnus.com>.
25 eval 'exec @PERL@ -S $0 ${1+"$@"}'
28 # aclocal - scan configure.ac and generate aclocal.m4.
31 $VERSION = "@VERSION@";
32 $PACKAGE = "@PACKAGE@";
34 # Note that this isn't pkgdatadir, but a separate directory.
35 $acdir = "@datadir@/aclocal";
46 $output_file = 'aclocal.m4';
48 # Which macros have been seen.
51 # Which files have been seen.
54 # Map macro names to file names.
57 # Map file names to file contents.
63 # Name of the top autoconf input: `configure.ac' or `configure.in'
84 # Now part of autoconf proper, under a different name.
92 # These aren't quite obsolete.
98 $obsolete_rx = '(' . join ('|', @obsolete_macros) . ')';
100 # Matches a macro definition.
101 $ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
103 # Matches an AC_REQUIRE line.
104 $ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
108 local (@dirlist) = &parse_arguments (@ARGV);
109 &scan_m4_files ($acdir, @dirlist);
119 ################################################################
121 # Print usage and exit.
124 local ($status) = @_;
126 print "Usage: aclocal [OPTIONS] ...\n\n";
127 print "Generate aclocal.m4 by scanning configure.ac\n
128 --acdir=DIR directory holding config files
129 --help print this help, then exit
130 -I DIR add directory to search list for .m4 files
131 --output=FILE put output in FILE (default aclocal.m4)
132 --print-ac-dir print name of directory holding m4 files
133 --verbose don't be silent
134 --version print version number, then exit
136 Report bugs to <bug-automake\@gnu.org>.\n";
141 # Parse command line.
144 local (@arglist) = @_;
146 local ($print_and_exit) = 0;
150 if ($arglist[0] =~ /^--acdir=(.+)$/)
154 elsif ($arglist[0] =~/^--output=(.+)$/)
158 elsif ($arglist[0] eq '-I')
161 push (@dirlist, $arglist[0]);
163 elsif ($arglist[0] eq '--print-ac-dir')
167 elsif ($arglist[0] eq '--verbose')
171 elsif ($arglist[0] eq '--version')
173 print "aclocal (GNU $PACKAGE) $VERSION\n\n";
174 print "Copyright (C) 1999 Free Software Foundation, Inc.\n";
175 print "This is free software; see the source for copying conditions. There is NO\n";
176 print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n";
177 print "Written by Tom Tromey <tromey\@cygnus.com>\n";
180 elsif ($arglist[0] eq '--help')
186 die "aclocal: unrecognized option -- \`$arglist[0]'\nTry \`aclocal --help' for more information.\n";
201 ################################################################
205 warn "aclocal: both `configure.ac' and `configure.in' present:"
206 . " ignoring `configure.in'\n"
207 if -f 'configure.ac' && -f 'configure.in';
208 $configure_ac = 'configure.in'
209 if -f 'configure.in';
210 $configure_ac = 'configure.ac'
211 if -f 'configure.ac';
212 die "aclocal: `configure.ac' or `configure.in' is required\n"
215 open (CONFIGURE, $configure_ac)
216 || die "aclocal: couldn't open \`$configure_ac': $!\n";
218 # Make sure we include acinclude.m4 if it exists.
219 if (-f 'acinclude.m4')
221 &add_file ('acinclude.m4');
226 # Remove comments from current line.
233 warn "aclocal: $configure_ac: $.: obsolete macro \`$_'\n";
238 # Search for things we know about. The "search" sub is
239 # constructed dynamically by scan_m4_files.
240 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
242 # Macro not found, but AM_ prefix found.
243 warn "aclocal: $configure_ac: $.: macro \`$2' not found in library\n";
251 ################################################################
253 # Check macros in acinclude.m4. If one is not used, warn.
258 foreach $key (keys %map)
260 next unless $map{$key} eq 'acinclude.m4';
261 if (! $macro_seen{$key})
263 # FIXME: should print line number of acinclude.m4.
264 warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
269 ################################################################
271 # Scan all the installed m4 files and construct a map.
274 local (@dirlist) = @_;
276 # First, scan acinclude.m4 if it exists.
277 if (-f 'acinclude.m4')
279 $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4');
283 foreach $m4dir (@dirlist)
285 opendir (DIR, $m4dir)
286 || die "aclocal: couldn't open directory \`$m4dir': $!\n";
287 local ($file, $fullfile, $expr);
288 foreach $file (sort grep (! /^\./, readdir (DIR)))
290 # Only examine .m4 files.
291 next unless $file =~ /\.m4$/;
293 # Skip some files when running out of srcdir.
294 next if $file eq 'aclocal.m4';
296 $fullfile = $m4dir . '/' . $file;
297 $file_contents{$fullfile} = &scan_file ($fullfile);
302 # Construct a new function that does the searching. We use a
303 # function (instead of just evalling $search in the loop) so that
304 # "die" is correctly and easily propagated if run.
305 local ($search, $expr, $key) = '';
306 foreach $key (reverse sort keys %map)
308 # EXPR is a regexp matching the name of the macro.
309 ($expr = $key) =~ s/(\W)/\\$1/g;
310 $search .= ("if (/" . $expr . "/) { & add_macro (" . $key
311 . "); return 1; }\n");
313 $search .= "return 0;\n";
314 eval 'sub search { ' . $search . '};';
315 die "internal error: $@\n search is $search " if $@;
318 ################################################################
320 # Add a macro to the output.
325 # We want to ignore AC_ macros. However, if an AC_ macro is
326 # defined in (eg) acinclude.m4, then we want to make sure we mark
328 return if $macro =~ /^AC_/ && ! defined $map{$macro};
330 if (! defined $map{$macro})
332 warn "aclocal: macro \`$macro' required but not defined\n";
337 print STDERR "saw macro $macro\n" if $verbosity;
338 $macro_seen{$macro} = 1;
339 &add_file ($map{$macro});
342 # Add a file to output.
347 # Only add a file once.
348 return if ($file_seen{$file});
349 $file_seen{$file} = 1;
351 $output .= $file_contents{$file} . "\n";
353 foreach (split ("\n", $file_contents{$file}))
355 # This is a hack for Perl 4.
357 if ($a =~ /$ac_require_rx/g)
362 # This function constructed dynamically.
363 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
365 # Macro not found, but AM_ prefix found.
366 warn "aclocal: $configure_ac: $.: macro \`$2' not found in library\n";
372 foreach $macro (@rlist)
378 # Scan a single M4 file. Return contents.
384 || die "aclocal: couldn't open \`$file': $!\n";
385 local ($contents) = '';
395 if (!defined $map{$1})
399 # Allow acinclude.m4 to override other macro files.
400 elsif ($map{$1} ne 'acinclude.m4' || $file eq 'acinclude.m4')
402 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
405 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
413 ################################################################
418 return if ! length ($output);
420 print STDERR "Writing $output_file\n" if $verbosity;
422 open (ACLOCAL, "> " . $output_file)
423 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
424 print ACLOCAL "dnl $output_file generated automatically by aclocal $VERSION\n";
426 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
427 dnl This file is free software; the Free Software Foundation
428 dnl gives unlimited permission to copy and/or distribute it,
429 dnl with or without modifications, as long as this notice is preserved.
431 dnl This program is distributed in the hope that it will be useful,
432 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
433 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
434 dnl PARTICULAR PURPOSE.
437 print ACLOCAL $output;