5 # aclocal - create aclocal.m4 by scanning configure.in
6 # Copyright (C) 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 (C) 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 # This function constructed dynamically.
366 if (! &search && /(^|\s+)(AM_[A-Z_]+)/)
368 # Macro not found, but AM_ prefix found.
369 warn "aclocal: configure.in: $.: macro \`$2' not found in library\n";
375 foreach $macro (@rlist)
381 # Scan a single M4 file. Return contents.
387 || die "aclocal: couldn't open \`$file': $!\n";
388 local ($contents) = '';
398 if (! defined $map{$1})
402 elsif ($map{$1} eq $file)
404 # You basically never want a macro in the same .m4
406 warn "aclocal: $file: $.: duplicated macro \`$1'\n";
409 print STDERR "Found macro $1 in $file: $.\n" if $verbosity;
417 ################################################################
422 return if ! length ($output);
424 print STDERR "Writing $output_file\n" if $verbosity;
426 open (ACLOCAL, "> " . $output_file)
427 || die "aclocal: couldn't open \`$output_file' for writing: $!\n";
428 print ACLOCAL "dnl $output_file generated automatically by aclocal $VERSION\n";
430 dnl Copyright (C) 1994, 1995-9, 2000 Free Software Foundation, Inc.
431 dnl This file is free software; the Free Software Foundation
432 dnl gives unlimited permission to copy and/or distribute it,
433 dnl with or without modifications, as long as this notice is preserved.
435 dnl This program is distributed in the hope that it will be useful,
436 dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
437 dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
438 dnl PARTICULAR PURPOSE.
441 print ACLOCAL $output;