5 # aclocal - create aclocal.m4 by scanning configure.in
6 # Copyright (C) 1996, 1997, 1998 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.in 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.
81 # Now part of autoconf proper, under a different name.
85 # These aren't quite obsolete.
91 $obsolete_rx = '(' . join ('|', @obsolete_macros) . ')';
93 # Matches a macro definition.
94 $ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
96 # Matches an AC_REQUIRE line.
97 $ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
101 local (@dirlist) = &parse_arguments (@ARGV);
102 &scan_m4_files ($acdir, @dirlist);
112 ################################################################
114 # Print usage and exit.
117 local ($status) = @_;
119 print "Usage: aclocal [OPTIONS] ...\n\n";
120 print "Generate aclocal.m4 by scanning configure.in\n
121 --acdir=DIR directory holding config files
122 --help print this help, then exit
123 -I DIR add directory to search list for .m4 files
124 --output=FILE put output in FILE (default aclocal.m4)
125 --verbose don't be silent
126 --version print version number, then exit
128 Report bugs to <automake-bugs\@prep.ai.mit.edu>.\n";
133 # Parse command line.
136 local (@arglist) = @_;
141 if ($arglist[0] =~ /^--acdir=(.+)$/)
145 elsif ($arglist[0] =~/^--output=(.+)$/)
149 elsif ($arglist[0] eq '-I')
152 push (@dirlist, $arglist[0]);
154 elsif ($arglist[0] eq '--verbose')
158 elsif ($arglist[0] eq '--version')
160 print "aclocal (GNU $PACKAGE) $VERSION\n\n";
161 print "Copyright (C) 1996, 1997 Free Software Foundation, Inc.\n";
162 print "This is free software; see the source for copying conditions. There is NO\n";
163 print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n";
164 print "Written by Tom Tromey <tromey\@cygnus.com>\n";
167 elsif ($arglist[0] eq '--help')
173 die "aclocal: unrecognized option -- \`$arglist[0]'\nTry \`aclocal --help' for more information.\n";
182 ################################################################
186 open (CONFIGURE, "configure.in")
187 || die "aclocal: couldn't open \`configure.in': $!\n";
189 # Make sure we include acinclude.m4 if it exists.
190 if (-f 'acinclude.m4')
192 &add_file ('acinclude.m4');
197 # Remove comments from current line.
204 warn "aclocal: configure.in: $.: obsolete macro \`$_'\n";
209 # Search for things we know about. The "search" sub is
210 # constructed dynamically by scan_m4_files.
211 if (! &search && /(AM_[A-Z_]+)/)
213 # Macro not found, but AM_ prefix found.
214 warn "aclocal: configure.in: $.: macro \`$1' not found in library\n";
222 ################################################################
224 # Check macros in acinclude.m4. If one is not used, warn.
229 foreach $key (keys %map)
231 next unless $map{$key} eq 'acinclude.m4';
232 if (! $macro_seen{$key})
234 # FIXME: should print line number of acinclude.m4.
235 warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
240 ################################################################
242 # Scan all the installed m4 files and construct a map.
245 local (@dirlist) = @_;
247 # First, scan acinclude.m4 if it exists.
248 if (-f 'acinclude.m4')
250 $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4');
254 foreach $m4dir (@dirlist)
256 opendir (DIR, $m4dir)
257 || die "aclocal: couldn't open directory \`$m4dir': $!\n";
258 local ($file, $fullfile, $expr);
259 foreach $file (sort grep (! /^\./, readdir (DIR)))
261 # Only examine .m4 files.
262 next unless $file =~ /\.m4$/;
264 # Skip some files when running out of srcdir.
265 next if $file eq 'aclocal.m4';
267 $fullfile = $m4dir . '/' . $file;
268 $file_contents{$fullfile} = &scan_file ($fullfile);
273 # Construct a new function that does the searching. We use a
274 # function (instead of just evalling $search in the loop) so that
275 # "die" is correctly and easily propagated if run.
276 local ($search, $expr, $key) = '';
277 foreach $key (keys %map)
279 # EXPR is a regexp matching the name of the macro.
280 ($expr = $key) =~ s/(\W)/\\$1/g;
281 $search .= ("if (/" . $expr . "/) { & add_macro (" . $key
282 . "); return 1; }\n");
284 $search .= "return 0;\n";
285 eval 'sub search { ' . $search . '};';
286 die "internal error: $@\n search is $search " if $@;
289 ################################################################
291 # Add a macro to the output.
296 # We want to ignore AC_ macros. However, if an AC_ macro is
297 # defined in (eg) acinclude.m4, then we want to make sure we mark
299 return if $macro =~ /^AC_/ && ! defined $map{$macro};
301 if (! defined $map{$macro})
303 warn "aclocal: macro \`$macro' required but not defined\n";
308 print STDERR "saw macro $macro\n" if $verbosity;
309 $macro_seen{$macro} = 1;
310 &add_file ($map{$macro});
313 # Add a file to output.
318 # Only add a file once.
319 return if ($file_seen{$file});
320 $file_seen{$file} = 1;
322 $output .= $file_contents{$file} . "\n";
324 foreach (split ("\n", $file_contents{$file}))
326 # This is a hack for Perl 4.
328 if ($a =~ /$ac_require_rx/g)
333 # This function constructed dynamically.
338 foreach $macro (@rlist)
344 # Scan a single M4 file. Return contents.
350 || die "aclocal: couldn't open \`$file': $!\n";
351 local ($contents) = '';
361 if (!defined $map{$1})
365 # Allow acinclude.m4 to override other macro files.
366 elsif ($map{$1} ne 'acinclude.m4' || $file eq 'acinclude.m4')
368 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
371 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
379 ################################################################
384 return if ! length ($output);
386 print STDERR "Writing aclocal.m4\n" if $verbosity;
388 open (ACLOCAL, "> " . $output_file)
389 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
390 print ACLOCAL "dnl aclocal.m4 generated automatically by aclocal $VERSION\n";
392 dnl Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
393 dnl This Makefile.in is free software; the Free Software Foundation
394 dnl gives unlimited permission to copy and/or distribute it,
395 dnl with or without modifications, as long as this notice is preserved.
397 dnl This program is distributed in the hope that it will be useful,
398 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
399 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
400 dnl PARTICULAR PURPOSE.
403 print ACLOCAL $output;