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'",
96 'AM_FUNC_MKTIME', "use \`AC_FUNC_MKTIME'",
98 # These aren't quite obsolete.
102 $obsolete_rx = '(' . join ('|', keys %obsolete_macros) . ')';
104 # Matches a macro definition.
105 $ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
107 # Matches an AC_REQUIRE line.
108 $ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
112 local (@dirlist) = &parse_arguments (@ARGV);
113 &scan_m4_files ($acdir, @dirlist);
123 ################################################################
125 # Print usage and exit.
128 local ($status) = @_;
130 print "Usage: aclocal [OPTIONS] ...\n\n";
131 print "Generate aclocal.m4 by scanning configure.in\n
132 --acdir=DIR directory holding config files
133 --help print this help, then exit
134 -I DIR add directory to search list for .m4 files
135 --output=FILE put output in FILE (default aclocal.m4)
136 --print-ac-dir print name of directory holding m4 files
137 --verbose don't be silent
138 --version print version number, then exit
140 Report bugs to <bug-automake\@gnu.org>.\n";
145 # Parse command line.
148 local (@arglist) = @_;
150 local ($print_and_exit) = 0;
154 if ($arglist[0] =~ /^--acdir=(.+)$/)
158 elsif ($arglist[0] =~/^--output=(.+)$/)
162 elsif ($arglist[0] eq '-I')
165 push (@dirlist, $arglist[0]);
167 elsif ($arglist[0] eq '--print-ac-dir')
171 elsif ($arglist[0] eq '--verbose')
175 elsif ($arglist[0] eq '--version')
177 print "aclocal (GNU $PACKAGE) $VERSION\n\n";
178 print "Copyright (C) 1999 Free Software Foundation, Inc.\n";
179 print "This is free software; see the source for copying conditions. There is NO\n";
180 print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n";
181 print "Written by Tom Tromey <tromey\@cygnus.com>\n";
184 elsif ($arglist[0] eq '--help')
190 die "aclocal: unrecognized option -- \`$arglist[0]'\nTry \`aclocal --help' for more information.\n";
205 ################################################################
209 open (CONFIGURE, "configure.in")
210 || die "aclocal: couldn't open \`configure.in': $!\n";
212 # Make sure we include acinclude.m4 if it exists.
213 if (-f 'acinclude.m4')
215 &add_file ('acinclude.m4');
220 # Remove comments from current line.
227 if ($obsolete_macros{$1} ne '')
229 $hint = '; ' . $obsolete_macros{$1};
231 warn "aclocal: configure.in: $.: \`$1' is obsolete$hint\n";
236 # Search for things we know about. The "search" sub is
237 # constructed dynamically by scan_m4_files.
238 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
240 # Macro not found, but AM_ prefix found.
241 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
249 ################################################################
251 # Check macros in acinclude.m4. If one is not used, warn.
256 foreach $key (keys %map)
258 next unless $map{$key} eq 'acinclude.m4';
259 if (! $macro_seen{$key})
261 # FIXME: should print line number of acinclude.m4.
262 warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
267 ################################################################
269 # Scan all the installed m4 files and construct a map.
272 local (@dirlist) = @_;
274 # First, scan acinclude.m4 if it exists.
275 if (-f 'acinclude.m4')
277 $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4');
281 foreach $m4dir (@dirlist)
283 opendir (DIR, $m4dir)
284 || die "aclocal: couldn't open directory \`$m4dir': $!\n";
285 local ($file, $fullfile, $expr);
286 foreach $file (sort grep (! /^\./, readdir (DIR)))
288 # Only examine .m4 files.
289 next unless $file =~ /\.m4$/;
291 # Skip some files when running out of srcdir.
292 next if $file eq 'aclocal.m4';
294 $fullfile = $m4dir . '/' . $file;
295 $file_contents{$fullfile} = &scan_file ($fullfile);
300 # Construct a new function that does the searching. We use a
301 # function (instead of just evalling $search in the loop) so that
302 # "die" is correctly and easily propagated if run.
303 local ($search, $expr, $key) = '';
304 foreach $key (reverse sort keys %map)
306 # EXPR is a regexp matching the name of the macro.
307 ($expr = $key) =~ s/(\W)/\\$1/g;
308 $search .= ("if (/" . $expr . "/) { & add_macro (" . $key
309 . "); return 1; }\n");
311 $search .= "return 0;\n";
312 eval 'sub search { ' . $search . '};';
313 die "internal error: $@\n search is $search " if $@;
316 ################################################################
318 # Add a macro to the output.
323 # We want to ignore AC_ macros. However, if an AC_ macro is
324 # defined in (eg) acinclude.m4, then we want to make sure we mark
326 return if $macro =~ /^AC_/ && ! defined $map{$macro};
328 if (! defined $map{$macro})
330 warn "aclocal: macro \`$macro' required but not defined\n";
335 print STDERR "saw macro $macro\n" if $verbosity;
336 $macro_seen{$macro} = 1;
337 &add_file ($map{$macro});
340 # Add a file to output.
345 # Only add a file once.
346 return if ($file_seen{$file});
347 $file_seen{$file} = 1;
349 $output .= $file_contents{$file} . "\n";
351 foreach (split ("\n", $file_contents{$file}))
353 # This is a hack for Perl 4.
355 if ($a =~ /$ac_require_rx/g)
360 # This function constructed dynamically.
361 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
363 # Macro not found, but AM_ prefix found.
364 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
370 foreach $macro (@rlist)
376 # Scan a single M4 file. Return contents.
382 || die "aclocal: couldn't open \`$file': $!\n";
383 local ($contents) = '';
393 if (!defined $map{$1})
397 # Allow acinclude.m4 to override other macro files.
398 elsif ($map{$1} ne 'acinclude.m4' || $file eq 'acinclude.m4')
400 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
403 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
411 ################################################################
416 return if ! length ($output);
418 print STDERR "Writing $output_file\n" if $verbosity;
420 open (ACLOCAL, "> " . $output_file)
421 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
422 print ACLOCAL "dnl $output_file generated automatically by aclocal $VERSION\n";
424 dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
425 dnl This file is free software; the Free Software Foundation
426 dnl gives unlimited permission to copy and/or distribute it,
427 dnl with or without modifications, as long as this notice is preserved.
429 dnl This program is distributed in the hope that it will be useful,
430 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
431 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
432 dnl PARTICULAR PURPOSE.
435 print ACLOCAL $output;