5 # aclocal - create aclocal.m4 by scanning configure.in
6 # Copyright 1996, 1997, 1998, 1999, 2000 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'",
87 'ud_GNU_GETTEXT', "use \`AM_GNU_GETTEXT'",
89 # Now part of autoconf proper, under a different name.
90 'AM_FUNC_FNMATCH', "use \`AC_FUNC_FNMATCH'",
91 'fp_FUNC_FNMATCH', "use \`AC_FUNC_FNMATCH'",
92 'AM_SANITY_CHECK_CC', "automatically done by \`AC_PROG_CC'",
93 'AM_PROG_INSTALL', "use \`AC_PROG_INSTALL'",
94 'AM_EXEEXT', "use \`AC_EXEEXT'",
95 'AM_CYGWIN32', "use \`AC_CYGWIN'",
96 'AM_MINGW32', "use \`AC_MINGW32'",
97 'AM_FUNC_MKTIME', "use \`AC_FUNC_MKTIME'",
99 # These aren't quite obsolete.
103 # Regexp to match the above macros.
104 $obsolete_rx = '(' . join ('|', keys %obsolete_macros) . ')';
106 # Matches a macro definition.
107 $ac_defun_rx = "AC_DEFUN\\(\\[?([^],)\n]+)\\]?";
109 # Matches an AC_REQUIRE line.
110 $ac_require_rx = "AC_REQUIRE\\(\\[?([^])]*)\\]?\\)";
114 local (@dirlist) = &parse_arguments (@ARGV);
115 &scan_m4_files (@dirlist);
125 ################################################################
127 # Print usage and exit.
130 local ($status) = @_;
132 print "Usage: aclocal [OPTIONS] ...\n\n";
133 print "Generate aclocal.m4 by scanning configure.in\n
134 --acdir=DIR directory holding config files
135 --help print this help, then exit
136 -I DIR add directory to search list for .m4 files
137 --output=FILE put output in FILE (default aclocal.m4)
138 --print-ac-dir print name of directory holding m4 files
139 --verbose don't be silent
140 --version print version number, then exit
142 Report bugs to <bug-automake\@gnu.org>.\n";
147 # Parse command line.
150 local (@arglist) = @_;
152 local ($print_and_exit) = 0;
156 if ($arglist[0] =~ /^--acdir=(.+)$/)
160 elsif ($arglist[0] =~/^--output=(.+)$/)
164 elsif ($arglist[0] eq '-I')
167 push (@dirlist, $arglist[0]);
169 elsif ($arglist[0] eq '--print-ac-dir')
173 elsif ($arglist[0] eq '--verbose')
177 elsif ($arglist[0] eq '--version')
179 print "aclocal (GNU $PACKAGE) $VERSION\n\n";
180 print "Copyright 2000 Free Software Foundation, Inc.\n";
181 print "This is free software; see the source for copying conditions. There is NO\n";
182 print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n";
183 print "Written by Tom Tromey <tromey\@cygnus.com>\n";
186 elsif ($arglist[0] eq '--help')
192 die "aclocal: unrecognized option -- \`$arglist[0]'\nTry \`aclocal --help' for more information.\n";
204 # Search our install directory last.
205 push (@dirlist, $acdir);
210 ################################################################
214 open (CONFIGURE, "configure.in")
215 || die "aclocal: couldn't open \`configure.in': $!\n";
217 # Make sure we include acinclude.m4 if it exists.
218 if (-f 'acinclude.m4')
220 &add_file ('acinclude.m4');
225 # Remove comments from current line.
232 if ($obsolete_macros{$1} ne '')
234 $hint = '; ' . $obsolete_macros{$1};
236 warn "aclocal: configure.in: $.: \`$1' is obsolete$hint\n";
241 # Search for things we know about. The "search" sub is
242 # constructed dynamically by scan_m4_files.
243 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
245 # Macro not found, but AM_ prefix found.
246 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
254 ################################################################
256 # Check macros in acinclude.m4. If one is not used, warn.
261 foreach $key (keys %map)
263 next unless $map{$key} eq 'acinclude.m4';
264 if (! $macro_seen{$key})
266 # FIXME: should print line number of acinclude.m4.
267 warn "aclocal: macro \`$key' defined in acinclude.m4 but never used\n";
272 ################################################################
274 # Scan all the installed m4 files and construct a map.
277 local (@dirlist) = @_;
279 # First, scan acinclude.m4 if it exists.
280 if (-f 'acinclude.m4')
282 $file_contents{'acinclude.m4'} = &scan_file ('acinclude.m4');
286 foreach $m4dir (@dirlist)
288 opendir (DIR, $m4dir)
289 || die "aclocal: couldn't open directory \`$m4dir': $!\n";
290 local ($file, $fullfile, $expr);
291 foreach $file (sort grep (! /^\./, readdir (DIR)))
293 # Only examine .m4 files.
294 next unless $file =~ /\.m4$/;
296 # Skip some files when running out of srcdir.
297 next if $file eq 'aclocal.m4';
299 $fullfile = $m4dir . '/' . $file;
300 $file_contents{$fullfile} = &scan_file ($fullfile);
305 # Construct a new function that does the searching. We use a
306 # function (instead of just evalling $search in the loop) so that
307 # "die" is correctly and easily propagated if run.
308 local ($search, $expr, $key) = '';
309 foreach $key (reverse sort keys %map)
311 # EXPR is a regexp matching the name of the macro.
312 ($expr = $key) =~ s/(\W)/\\$1/g;
313 $search .= ("if (/" . $expr . "/) { & add_macro (" . $key
314 . "); return 1; }\n");
316 $search .= "return 0;\n";
317 eval 'sub search { ' . $search . '};';
318 die "internal error: $@\n search is $search " if $@;
321 ################################################################
323 # Add a macro to the output.
328 # We want to ignore AC_ macros. However, if an AC_ macro is
329 # defined in (eg) acinclude.m4, then we want to make sure we mark
331 return if $macro =~ /^AC_/ && ! defined $map{$macro};
333 if (! defined $map{$macro})
335 warn "aclocal: macro \`$macro' required but not defined\n";
340 print STDERR "saw macro $macro\n" if $verbosity;
341 $macro_seen{$macro} = 1;
342 &add_file ($map{$macro});
345 # Add a file to output.
350 # Only add a file once.
351 return if ($file_seen{$file});
352 $file_seen{$file} = 1;
354 $output .= $file_contents{$file} . "\n";
356 foreach (split ("\n", $file_contents{$file}))
358 # This is a hack for Perl 4.
360 if ($a =~ /$ac_require_rx/g)
365 # Remove comments from current line.
369 # The search function is constructed dynamically by scan_m4_files.
370 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
372 # Macro not found, but AM_ prefix found.
373 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
379 foreach $macro (@rlist)
385 # Scan a single M4 file. Return contents.
391 || die "aclocal: couldn't open \`$file': $!\n";
392 local ($contents) = '';
402 if (! defined $map{$1})
406 elsif ($map{$1} eq $file)
408 # You basically never want a macro in the same .m4
410 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
413 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
421 ################################################################
426 return if ! length ($output);
428 print STDERR "Writing $output_file\n" if $verbosity;
430 open (ACLOCAL, "> " . $output_file)
431 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
433 # In case we're running under MSWindows, don't write with CRLF.
434 # (This circumvents a bug in at least Cygwin bash where the shell
435 # parsing fails on lines ending with the continuation character '\'
439 print ACLOCAL "# $output_file generated automatically by aclocal $VERSION\n";
441 # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000
442 # Free Software Foundation, Inc.
443 # This file is free software; the Free Software Foundation
444 # gives unlimited permission to copy and/or distribute it,
445 # with or without modifications, as long as this notice is preserved.
447 # This program is distributed in the hope that it will be useful,
448 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
449 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
450 # PARTICULAR PURPOSE.
453 print ACLOCAL $output;