5 # aclocal - create aclocal.m4 by scanning configure.in
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.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.
63 # Map from obsolete macros to hints for new macros.
64 # If you change this, change the corresponding list in automake.in.
65 # FIXME: should just put this into a single file.
68 'AC_FEATURE_CTYPE', "use \`AC_HEADER_STDC'",
69 'AC_FEATURE_ERRNO', "add \`strerror' to \`AC_REPLACE_FUNCS(...)'",
70 'AC_FEATURE_EXIT', '',
71 'AC_SYSTEM_HEADER', '',
73 # Note that we do not handle this one, because it is still run
74 # from AM_CONFIG_HEADER. So we deal with it specially in
76 # 'AC_CONFIG_HEADER', "use \`AM_CONFIG_HEADER'",
78 'fp_C_PROTOTYPES', "use \`AM_C_PROTOTYPES'",
79 'fp_PROG_CC_STDC', "use \`AM_PROG_CC_STDC'",
80 'fp_PROG_INSTALL', "use \`AC_PROG_INSTALL'",
81 'fp_WITH_DMALLOC', "use \`AM_WITH_DMALLOC'",
82 'fp_WITH_REGEX', "use \`AM_WITH_REGEX'",
83 'gm_PROG_LIBTOOL', "use \`AM_PROG_LIBTOOL'",
84 'jm_MAINTAINER_MODE', "use \`AM_MAINTAINER_MODE'",
85 'md_TYPE_PTRDIFF_T', "use \`AM_TYPE_PTRDIFF_T'",
86 'ud_PATH_LISPDIR', "use \`AM_PATH_LISPDIR'",
88 # Now part of autoconf proper, under a different name.
89 'AM_FUNC_FNMATCH', "use \`AC_FUNC_FNMATCH'",
90 'fp_FUNC_FNMATCH', "use \`AC_FUNC_FNMATCH'",
91 'AM_SANITY_CHECK_CC', "automatically done by \`AC_PROG_CC'",
92 'AM_PROG_INSTALL', "use \`AC_PROG_INSTALL'",
93 'AM_EXEEXT', "use \`AC_EXEEXT'",
94 'AM_CYGWIN32', "use \`AC_CYGWIN32'",
95 'AM_MINGW32', "use \`AC_MINGW32'",
97 # These aren't quite obsolete.
101 $obsolete_rx = '(' . join ('|', keys %obsolete_macros) . ')';
103 # Matches a macro definition.
104 $ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
106 # Matches an AC_REQUIRE line.
107 $ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
111 local (@dirlist) = &parse_arguments (@ARGV);
112 &scan_m4_files ($acdir, @dirlist);
122 ################################################################
124 # Print usage and exit.
127 local ($status) = @_;
129 print "Usage: aclocal [OPTIONS] ...\n\n";
130 print "Generate aclocal.m4 by scanning configure.in\n
131 --acdir=DIR directory holding config files
132 --help print this help, then exit
133 -I DIR add directory to search list for .m4 files
134 --output=FILE put output in FILE (default aclocal.m4)
135 --print-ac-dir print name of directory holding m4 files
136 --verbose don't be silent
137 --version print version number, then exit
139 Report bugs to <bug-automake\@gnu.org>.\n";
144 # Parse command line.
147 local (@arglist) = @_;
149 local ($print_and_exit) = 0;
153 if ($arglist[0] =~ /^--acdir=(.+)$/)
157 elsif ($arglist[0] =~/^--output=(.+)$/)
161 elsif ($arglist[0] eq '-I')
164 push (@dirlist, $arglist[0]);
166 elsif ($arglist[0] eq '--print-ac-dir')
170 elsif ($arglist[0] eq '--verbose')
174 elsif ($arglist[0] eq '--version')
176 print "aclocal (GNU $PACKAGE) $VERSION\n\n";
177 print "Copyright (C) 1999 Free Software Foundation, Inc.\n";
178 print "This is free software; see the source for copying conditions. There is NO\n";
179 print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n";
180 print "Written by Tom Tromey <tromey\@cygnus.com>\n";
183 elsif ($arglist[0] eq '--help')
189 die "aclocal: unrecognized option -- \`$arglist[0]'\nTry \`aclocal --help' for more information.\n";
204 ################################################################
208 open (CONFIGURE, "configure.in")
209 || die "aclocal: couldn't open \`configure.in': $!\n";
211 # Make sure we include acinclude.m4 if it exists.
212 if (-f 'acinclude.m4')
214 &add_file ('acinclude.m4');
219 # Remove comments from current line.
226 if ($obsolete_macros{$1} ne '')
228 $hint = '; ' . $obsolete_macros{$1};
230 warn "aclocal: configure.in: $.: \`$1' is obsolete$hint\n";
235 # Search for things we know about. The "search" sub is
236 # constructed dynamically by scan_m4_files.
237 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
239 # Macro not found, but AM_ prefix found.
240 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
248 ################################################################
250 # Check macros in acinclude.m4. If one is not used, warn.
255 foreach $key (keys %map)
257 next unless $map{$key} eq 'acinclude.m4';
258 if (! $macro_seen{$key})
260 # FIXME: should print line number of acinclude.m4.
261 warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
266 ################################################################
268 # Scan all the installed m4 files and construct a map.
271 local (@dirlist) = @_;
273 # First, scan acinclude.m4 if it exists.
274 if (-f 'acinclude.m4')
276 $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4');
280 foreach $m4dir (@dirlist)
282 opendir (DIR, $m4dir)
283 || die "aclocal: couldn't open directory \`$m4dir': $!\n";
284 local ($file, $fullfile, $expr);
285 foreach $file (sort grep (! /^\./, readdir (DIR)))
287 # Only examine .m4 files.
288 next unless $file =~ /\.m4$/;
290 # Skip some files when running out of srcdir.
291 next if $file eq 'aclocal.m4';
293 $fullfile = $m4dir . '/' . $file;
294 $file_contents{$fullfile} = &scan_file ($fullfile);
299 # Construct a new function that does the searching. We use a
300 # function (instead of just evalling $search in the loop) so that
301 # "die" is correctly and easily propagated if run.
302 local ($search, $expr, $key) = '';
303 foreach $key (reverse sort keys %map)
305 # EXPR is a regexp matching the name of the macro.
306 ($expr = $key) =~ s/(\W)/\\$1/g;
307 $search .= ("if (/" . $expr . "/) { & add_macro (" . $key
308 . "); return 1; }\n");
310 $search .= "return 0;\n";
311 eval 'sub search { ' . $search . '};';
312 die "internal error: $@\n search is $search " if $@;
315 ################################################################
317 # Add a macro to the output.
322 # We want to ignore AC_ macros. However, if an AC_ macro is
323 # defined in (eg) acinclude.m4, then we want to make sure we mark
325 return if $macro =~ /^AC_/ && ! defined $map{$macro};
327 if (! defined $map{$macro})
329 warn "aclocal: macro \`$macro' required but not defined\n";
334 print STDERR "saw macro $macro\n" if $verbosity;
335 $macro_seen{$macro} = 1;
336 &add_file ($map{$macro});
339 # Add a file to output.
344 # Only add a file once.
345 return if ($file_seen{$file});
346 $file_seen{$file} = 1;
348 $output .= $file_contents{$file} . "\n";
350 foreach (split ("\n", $file_contents{$file}))
352 # This is a hack for Perl 4.
354 if ($a =~ /$ac_require_rx/g)
359 # This function constructed dynamically.
360 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
362 # Macro not found, but AM_ prefix found.
363 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
369 foreach $macro (@rlist)
375 # Scan a single M4 file. Return contents.
381 || die "aclocal: couldn't open \`$file': $!\n";
382 local ($contents) = '';
392 if (!defined $map{$1})
396 # Allow acinclude.m4 to override other macro files.
397 elsif ($map{$1} ne 'acinclude.m4' || $file eq 'acinclude.m4')
399 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
402 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
410 ################################################################
415 return if ! length ($output);
417 print STDERR "Writing $output_file\n" if $verbosity;
419 open (ACLOCAL, "> " . $output_file)
420 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
421 print ACLOCAL "dnl $output_file generated automatically by aclocal $VERSION\n";
423 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
424 dnl This file is free software; the Free Software Foundation
425 dnl gives unlimited permission to copy and/or distribute it,
426 dnl with or without modifications, as long as this notice is preserved.
428 dnl This program is distributed in the hope that it will be useful,
429 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
430 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
431 dnl PARTICULAR PURPOSE.
434 print ACLOCAL $output;