/etc/alternatives
NameSizeModeActions
mecab-dictionary/-0755rm
mpi-x86_64-linux-gnu/-0755rm
ABORT.7.gz10540644editdlrm
aclocal360200755editdlrm
aclocal.1.gz13770644editdlrm
ALTER_AGGREGATE.7.gz16750644editdlrm
ALTER_COLLATION.7.gz23230644editdlrm
ALTER_CONVERSION.7.gz11180644editdlrm
ALTER_DATABASE.7.gz21100644editdlrm
ALTER_DEFAULT_PRIVILEGES.7.gz26060644editdlrm
ALTER_DOMAIN.7.gz26690644editdlrm
ALTER_EVENT_TRIGGER.7.gz9620644editdlrm
ALTER_EXTENSION.7.gz23490644editdlrm
ALTER_FOREIGN_DATA_WRAPPER.7.gz15930644editdlrm
ALTER_FOREIGN_TABLE.7.gz39300644editdlrm
ALTER_FUNCTION.7.gz29260644editdlrm
ALTER_GROUP.7.gz12760644editdlrm
ALTER_INDEX.7.gz27840644editdlrm
ALTER_LANGUAGE.7.gz8450644editdlrm
ALTER_LARGE_OBJECT.7.gz8950644editdlrm
ALTER_MATERIALIZED_VIEW.7.gz16680644editdlrm
ALTER_OPERATOR.7.gz13170644editdlrm
ALTER_OPERATOR_CLASS.7.gz10850644editdlrm
ALTER_OPERATOR_FAMILY.7.gz29110644editdlrm
ALTER_POLICY.7.gz12300644editdlrm
ALTER_PROCEDURE.7.gz24360644editdlrm
ALTER_PUBLICATION.7.gz16660644editdlrm
ALTER_ROLE.7.gz30430644editdlrm
ALTER_ROUTINE.7.gz13500644editdlrm
ALTER_RULE.7.gz9170644editdlrm
ALTER_SCHEMA.7.gz9510644editdlrm
ALTER_SEQUENCE.7.gz29520644editdlrm
ALTER_SERVER.7.gz13520644editdlrm
ALTER_STATISTICS.7.gz13130644editdlrm
ALTER_SUBSCRIPTION.7.gz21990644editdlrm
ALTER_SYSTEM.7.gz16390644editdlrm
ALTER_TABLE.7.gz143830644editdlrm
ALTER_TABLESPACE.7.gz13640644editdlrm
ALTER_TEXT_SEARCH_CONFIGURATION.7.gz14950644editdlrm
ALTER_TEXT_SEARCH_DICTIONARY.7.gz14430644editdlrm
ALTER_TEXT_SEARCH_PARSER.7.gz8450644editdlrm
ALTER_TEXT_SEARCH_TEMPLATE.7.gz8530644editdlrm
ALTER_TRIGGER.7.gz11930644editdlrm
ALTER_TYPE.7.gz35150644editdlrm
ALTER_USER.7.gz10210644editdlrm
ALTER_USER_MAPPING.7.gz13760644editdlrm
ALTER_VIEW.7.gz18870644editdlrm
ANALYZE.7.gz39950644editdlrm
arptables2242960755editdlrm
arptables-restore2242960755editdlrm
arptables-save2242960755editdlrm
automake2620550755editdlrm
automake.1.gz16770644editdlrm
awk7049840755editdlrm
awk.1.gz308810644editdlrm
BEGIN.7.gz17350644editdlrm
builtins.7.gz5080644editdlrm
c++9326800755editdlrm
c++.1.gz3687060644editdlrm
c894280755editdlrm
c89.1.gz13650644editdlrm
c994540755editdlrm
c99.1.gz14210644editdlrm
caf140010755editdlrm
caf-openmpi140010755editdlrm
cafrun103220755editdlrm
cafrun-openmpi103220755editdlrm
CALL.7.gz13330644editdlrm
cc9285840755editdlrm
cc.1.gz3687060644editdlrm
CHECKPOINT.7.gz9110644editdlrm
CLOSE.7.gz11590644editdlrm
CLUSTER.7.gz27290644editdlrm
clusterdb.1.gz23010644editdlrm
COMMENT.7.gz36970644editdlrm
COMMIT.7.gz10460644editdlrm
COMMIT_PREPARED.7.gz10610644editdlrm
COPY.7.gz102270644editdlrm
cpp9285840755editdlrm
createdb.1.gz26140644editdlrm
createuser.1.gz33400644editdlrm
CREATE_ACCESS_METHOD.7.gz11530644editdlrm
CREATE_AGGREGATE.7.gz76080644editdlrm
CREATE_CAST.7.gz47890644editdlrm
CREATE_COLLATION.7.gz22670644editdlrm
CREATE_CONVERSION.7.gz16740644editdlrm
CREATE_DATABASE.7.gz35130644editdlrm
CREATE_DOMAIN.7.gz30050644editdlrm
CREATE_EVENT_TRIGGER.7.gz16510644editdlrm
CREATE_EXTENSION.7.gz28050644editdlrm
CREATE_FOREIGN_DATA_WRAPPER.7.gz18030644editdlrm
CREATE_FOREIGN_TABLE.7.gz43650644editdlrm
CREATE_FUNCTION.7.gz90350644editdlrm
CREATE_GROUP.7.gz8830644editdlrm
CREATE_INDEX.7.gz95870644editdlrm
CREATE_LANGUAGE.7.gz25350644editdlrm
CREATE_MATERIALIZED_VIEW.7.gz17460644editdlrm
CREATE_OPERATOR.7.gz26120644editdlrm
CREATE_OPERATOR_CLASS.7.gz29920644editdlrm
CREATE_OPERATOR_FAMILY.7.gz13780644editdlrm
CREATE_POLICY.7.gz59730644editdlrm
CREATE_PROCEDURE.7.gz38720644editdlrm
CREATE_PUBLICATION.7.gz24290644editdlrm
CREATE_ROLE.7.gz47420644editdlrm
CREATE_RULE.7.gz34490644editdlrm
CREATE_SCHEMA.7.gz22870644editdlrm
CREATE_SEQUENCE.7.gz35980644editdlrm
CREATE_SERVER.7.gz15830644editdlrm
CREATE_STATISTICS.7.gz33360644editdlrm
CREATE_SUBSCRIPTION.7.gz27430644editdlrm
CREATE_TABLE.7.gz179060644editdlrm
CREATE_TABLESPACE.7.gz19550644editdlrm
CREATE_TABLE_AS.7.gz28110644editdlrm
CREATE_TEXT_SEARCH_CONFIGURATION.7.gz11980644editdlrm
CREATE_TEXT_SEARCH_DICTIONARY.7.gz13110644editdlrm
CREATE_TEXT_SEARCH_PARSER.7.gz13400644editdlrm
CREATE_TEXT_SEARCH_TEMPLATE.7.gz13070644editdlrm
CREATE_TRANSFORM.7.gz20840644editdlrm
CREATE_TRIGGER.7.gz72200644editdlrm
CREATE_TYPE.7.gz97350644editdlrm
CREATE_USER.7.gz9860644editdlrm
CREATE_USER_MAPPING.7.gz14390644editdlrm
CREATE_VIEW.7.gz47810644editdlrm
DEALLOCATE.7.gz8130644editdlrm
DECLARE.7.gz39610644editdlrm
DELETE.7.gz28130644editdlrm
DISCARD.7.gz12470644editdlrm
DO.7.gz14250644editdlrm
dotlock155042755editdlrm
dotlock.1.gz14390644editdlrm
dropdb.1.gz22120644editdlrm
dropuser.1.gz21000644editdlrm
DROP_ACCESS_METHOD.7.gz9480644editdlrm
DROP_AGGREGATE.7.gz14770644editdlrm
DROP_CAST.7.gz9790644editdlrm
DROP_COLLATION.7.gz9910644editdlrm
DROP_CONVERSION.7.gz9760644editdlrm
DROP_DATABASE.7.gz12790644editdlrm
DROP_DOMAIN.7.gz9900644editdlrm
DROP_EVENT_TRIGGER.7.gz9640644editdlrm
DROP_EXTENSION.7.gz11980644editdlrm
DROP_FOREIGN_DATA_WRAPPER.7.gz10300644editdlrm
DROP_FOREIGN_TABLE.7.gz10820644editdlrm
DROP_FUNCTION.7.gz16480644editdlrm
DROP_GROUP.7.gz6510644editdlrm
DROP_INDEX.7.gz14400644editdlrm
DROP_LANGUAGE.7.gz11600644editdlrm
DROP_MATERIALIZED_VIEW.7.gz10290644editdlrm
DROP_OPERATOR.7.gz11620644editdlrm
DROP_OPERATOR_CLASS.7.gz13670644editdlrm
DROP_OPERATOR_FAMILY.7.gz12380644editdlrm
DROP_OWNED.7.gz12390644editdlrm
DROP_POLICY.7.gz10830644editdlrm
DROP_PROCEDURE.7.gz21850644editdlrm
DROP_PUBLICATION.7.gz9070644editdlrm
DROP_ROLE.7.gz13100644editdlrm
DROP_ROUTINE.7.gz15340644editdlrm
DROP_RULE.7.gz9730644editdlrm
DROP_SCHEMA.7.gz11750644editdlrm
DROP_SEQUENCE.7.gz10320644editdlrm
DROP_SERVER.7.gz10080644editdlrm
DROP_STATISTICS.7.gz10320644editdlrm
DROP_SUBSCRIPTION.7.gz14890644editdlrm
DROP_TABLE.7.gz12790644editdlrm
DROP_TABLESPACE.7.gz10270644editdlrm
DROP_TEXT_SEARCH_CONFIGURATION.7.gz10790644editdlrm
DROP_TEXT_SEARCH_DICTIONARY.7.gz10510644editdlrm
DROP_TEXT_SEARCH_PARSER.7.gz10410644editdlrm
DROP_TEXT_SEARCH_TEMPLATE.7.gz10460644editdlrm
DROP_TRANSFORM.7.gz10470644editdlrm
DROP_TRIGGER.7.gz10790644editdlrm
DROP_TYPE.7.gz10820644editdlrm
DROP_USER.7.gz6940644editdlrm
DROP_USER_MAPPING.7.gz10730644editdlrm
DROP_VIEW.7.gz10430644editdlrm
ebtables2242960755editdlrm
ebtables-restore2242960755editdlrm
ebtables-save2242960755editdlrm
editor2831600755editdlrm
editor.1.gz75670644editdlrm
END.7.gz10650644editdlrm
ex37879520755editdlrm
ex.1.gz55070644editdlrm
ex.da.1.gz56460644editdlrm
ex.de.1.gz68800644editdlrm
ex.fr.1.gz65240644editdlrm
ex.it.1.gz61010644editdlrm
ex.ja.1.gz58650644editdlrm
ex.pl.1.gz62960644editdlrm
ex.ru.1.gz71290644editdlrm
EXECUTE.7.gz11730644editdlrm
EXPLAIN.7.gz50170644editdlrm
f779285840755editdlrm
f77.1.gz252330644editdlrm
f959285840755editdlrm
f95.1.gz252330644editdlrm
faked.1.gz11900644editdlrm
faked.es.1.gz14610644editdlrm
faked.fr.1.gz15220644editdlrm
faked.sv.1.gz14380644editdlrm
fakeroot39950755editdlrm
fakeroot.1.gz40060644editdlrm
fakeroot.es.1.gz45050644editdlrm
fakeroot.fr.1.gz47010644editdlrm
fakeroot.sv.1.gz42920644editdlrm
FETCH.7.gz30710644editdlrm
frm279440755editdlrm
frm.1.gz14190644editdlrm
from274640755editdlrm
from.1.gz12740644editdlrm
ftp1831920755editdlrm
ftp.1.gz172470644editdlrm
GRANT.7.gz46000644editdlrm
IMPORT_FOREIGN_SCHEMA.7.gz14750644editdlrm
infobrowser3089840755editdlrm
infobrowser.1.gz14130644editdlrm
INSERT.7.gz71770644editdlrm
ip6tables2242960755editdlrm
ip6tables-restore2242960755editdlrm
ip6tables-save2242960755editdlrm
iptables2242960755editdlrm
iptables-restore2242960755editdlrm
iptables-save2242960755editdlrm
js-0editdlrm
js.1.gz-0editdlrm
jsondiff10040755editdlrm
libmpi++.so-x86_64-linux-gnu1022720644editdlrm
libmpi.so-x86_64-linux-gnu11986000644editdlrm
libpsm_infinipath.so.13530240644editdlrm
LISTEN.7.gz17980644editdlrm
LOAD.7.gz11410644editdlrm
LOCK.7.gz32250644editdlrm
lua-compiler1090480755editdlrm
lua-compiler-manual14220644editdlrm
lua-interpreter2441840755editdlrm
lua-manual10820644editdlrm
lzcat845040755editdlrm
lzcat.1.gz206580644editdlrm
lzcmp70230755editdlrm
lzcmp.1.gz6640644editdlrm
lzdiff70230755editdlrm
lzdiff.1.gz6640644editdlrm
lzegrep60150755editdlrm
lzegrep.1.gz7060644editdlrm
lzfgrep60150755editdlrm
lzfgrep.1.gz7060644editdlrm
lzgrep60150755editdlrm
lzgrep.1.gz7060644editdlrm
lzless17990755editdlrm
lzless.1.gz7430644editdlrm
lzma845040755editdlrm
lzma.1.gz206580644editdlrm
lzmore21620755editdlrm
lzmore.1.gz6360644editdlrm
mail2348880755editdlrm
mail.1.gz18420644editdlrm
mailx2348880755editdlrm
mailx.1.gz18420644editdlrm
messages150240755editdlrm
messages.1.gz12050644editdlrm
MOVE.7.gz12540644editdlrm
movemail412240755editdlrm
movemail.1.gz15140644editdlrm
mpi269440755editdlrm
mpi-c.pc-x86_64-linux-gnu7880644editdlrm
mpi-cxx.pc-x86_64-linux-gnu7980644editdlrm
mpi-fort.pc-x86_64-linux-gnu9960644editdlrm
mpi.pc-x86_64-linux-gnu7660644editdlrm
mpic++269440755editdlrm
mpic++.1.gz31320644editdlrm
mpiCC269440755editdlrm
mpiCC.1.gz31320644editdlrm
mpicc.1.gz31300644editdlrm
mpicxx269440755editdlrm
mpicxx.1.gz31330644editdlrm
mpiexec146480755editdlrm
mpiexec.1.gz194730644editdlrm
mpif77269440755editdlrm
mpif77.1.gz4840644editdlrm
mpif90269440755editdlrm
mpif90.1.gz4840644editdlrm
mpifort269440755editdlrm
mpifort.1.gz31300644editdlrm
mpirun146480755editdlrm
mpirun.1.gz194730644editdlrm
mt683360755editdlrm
mt.1.gz20310644editdlrm
my.cnf6820644editdlrm
nawk7049840755editdlrm
nawk.1.gz308810644editdlrm
nc395600755editdlrm
nc.1.gz63060644editdlrm
netcat395600755editdlrm
netcat.1.gz63060644editdlrm
newt-palette1600644editdlrm
NOTIFY.7.gz31570644editdlrm
open184910755editdlrm
open.1.gz15340644editdlrm
pager1990480755editdlrm
pager.1.gz229470644editdlrm
pg_amcheck.1.gz41960644editdlrm
pg_basebackup.1.gz80170644editdlrm
pg_dump.1.gz124920644editdlrm
pg_dumpall.1.gz70250644editdlrm
pg_isready.1.gz17480644editdlrm
pg_receivewal.1.gz42210644editdlrm
pg_recvlogical.1.gz32780644editdlrm
pg_restore.1.gz83810644editdlrm
pg_verifybackup.1.gz30360644editdlrm
phar152520755editdlrm
phar.1.gz28140644editdlrm
phar.phar152520755editdlrm
phar.phar.1.gz360644editdlrm
php103005440755editdlrm
php-fpm.sock-0660editdlrm
php.1.gz37780644editdlrm
phpdbg124096080755editdlrm
phpdbg.1.gz13740644editdlrm
pico2831600755editdlrm
pico.1.gz75670644editdlrm
pinentry600560755editdlrm
pinentry.1.gz14140644editdlrm
PREPARE.7.gz32760644editdlrm
PREPARE_TRANSACTION.7.gz22530644editdlrm
psql.1.gz356050644editdlrm
pybabel9530755editdlrm
rcp1337200755editdlrm
rcp.1.gz31600644editdlrm
README1000644editdlrm
readmsg367760755editdlrm
readmsg.1.gz14560644editdlrm
REASSIGN_OWNED.7.gz12130644editdlrm
REFRESH_MATERIALIZED_VIEW.7.gz15040644editdlrm
REINDEX.7.gz58220644editdlrm
reindexdb.1.gz27600644editdlrm
RELEASE_SAVEPOINT.7.gz12590644editdlrm
RESET.7.gz11630644editdlrm
REVOKE.7.gz32900644editdlrm
rlogin8509840755editdlrm
rlogin.1.gz152790644editdlrm
rmt599760755editdlrm
rmt.8.gz23930644editdlrm
ROLLBACK.7.gz10390644editdlrm
ROLLBACK_PREPARED.7.gz10730644editdlrm
ROLLBACK_TO_SAVEPOINT.7.gz16130644editdlrm
rsh8509840755editdlrm
rsh.1.gz152790644editdlrm
rview37879520755editdlrm
rvim37879520755editdlrm
SAVEPOINT.7.gz14420644editdlrm
SECURITY_LABEL.7.gz22200644editdlrm
SELECT.7.gz202530644editdlrm
SELECT_INTO.7.gz19410644editdlrm
SET.7.gz29030644editdlrm
SET_CONSTRAINTS.7.gz17910644editdlrm
SET_ROLE.7.gz17230644editdlrm
SET_SESSION_AUTHORIZATION.7.gz14710644editdlrm
SET_TRANSACTION.7.gz30390644editdlrm
shimx64.efi.signed9666640644editdlrm
SHOW.7.gz15250644editdlrm
START_TRANSACTION.7.gz12320644editdlrm
TABLE.7.gz380644editdlrm
telnet1101440755editdlrm
telnet.1.gz90140644editdlrm
text.plymouth2050644editdlrm
TRUNCATE.7.gz25540644editdlrm
UNLISTEN.7.gz11390644editdlrm
unlzma845040755editdlrm
unlzma.1.gz206580644editdlrm
UPDATE.7.gz49560644editdlrm
VACUUM.7.gz51490644editdlrm
vacuumdb.1.gz37890644editdlrm
VALUES.7.gz27780644editdlrm
vi37879520755editdlrm
vi.1.gz55070644editdlrm
vi.da.1.gz56460644editdlrm
vi.de.1.gz68800644editdlrm
vi.fr.1.gz65240644editdlrm
vi.it.1.gz61010644editdlrm
vi.ja.1.gz58650644editdlrm
vi.pl.1.gz62960644editdlrm
vi.ru.1.gz71290644editdlrm
view37879520755editdlrm
view.1.gz55070644editdlrm
view.da.1.gz56460644editdlrm
view.de.1.gz68800644editdlrm
view.fr.1.gz65240644editdlrm
view.it.1.gz61010644editdlrm
view.ja.1.gz58650644editdlrm
view.pl.1.gz62960644editdlrm
view.ru.1.gz71290644editdlrm
vim37879520755editdlrm
vimdiff37879520755editdlrm
vtrgb1580644editdlrm
which9460755editdlrm
which.1.gz4310644editdlrm
which.de1.gz7970644editdlrm
which.es1.gz5560644editdlrm
which.fr1.gz8640644editdlrm
which.it1.gz5530644editdlrm
which.ja1.gz6850644editdlrm
which.pl1.gz7510644editdlrm
which.sl1.gz6160644editdlrm
WITH.7.gz380644editdlrm
write229200755editdlrm
write.1.gz14110644editdlrm
Edit: /usr/bin/aclocal-1.16 (36020B)
#!/usr/bin/perl # aclocal - create aclocal.m4 by scanning configure.ac -*- perl -*- # Generated from bin/aclocal.in; do not edit by hand. # Copyright (C) 1996-2021 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Written by Tom Tromey , and # Alexandre Duret-Lutz . use 5.006; use strict; use warnings FATAL => 'all'; BEGIN { unshift (@INC, '/usr/share/automake-1.16') unless $ENV{AUTOMAKE_UNINSTALLED}; } use File::Basename; use File::Path (); use Automake::Config; use Automake::General; use Automake::Configure_ac; use Automake::Channels; use Automake::ChannelDefs; use Automake::XFile; use Automake::FileUtils; # Some globals. # Support AC_CONFIG_MACRO_DIRS also with older autoconf. # FIXME: To be removed in Automake 2.0, once we can assume autoconf # 2.70 or later. # FIXME: keep in sync with 'internal/ac-config-macro-dirs.m4'. my $ac_config_macro_dirs_fallback = 'm4_ifndef([AC_CONFIG_MACRO_DIRS], [' . 'm4_defun([_AM_CONFIG_MACRO_DIRS], [])' . 'm4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])' . '])'; # We do not operate in threaded mode. $perl_threads = 0; # Include paths for searching macros. We search macros in this order: # user-supplied directories first, then the directory containing the # automake macros, and finally the system-wide directories for # third-party macros. # @user_includes can be augmented with -I or AC_CONFIG_MACRO_DIRS. # @automake_includes can be reset with the '--automake-acdir' option. # @system_includes can be augmented with the 'dirlist' file or the # ACLOCAL_PATH environment variable, and reset with the '--system-acdir' # option. my @user_includes = (); my @automake_includes = ('/usr/share/aclocal-' . $APIVERSION); my @system_includes = ('/usr/share/aclocal'); # Whether we should copy M4 file in $user_includes[0]. my $install = 0; # --diff my @diff_command; # --dry-run my $dry_run = 0; # configure.ac or configure.in. my $configure_ac; # Output file name. my $output_file = 'aclocal.m4'; # Option --force. my $force_output = 0; # Modification time of the youngest dependency. my $greatest_mtime = 0; # Which macros have been seen. my %macro_seen = (); # Remember the order into which we scanned the files. # It's important to output the contents of aclocal.m4 in the opposite order. # (Definitions in first files we have scanned should override those from # later files. So they must appear last in the output.) my @file_order = (); # Map macro names to file names. my %map = (); # Ditto, but records the last definition of each macro as returned by --trace. my %map_traced_defs = (); # Map basenames to macro names. my %invmap = (); # Map file names to file contents. my %file_contents = (); # Map file names to file types. my %file_type = (); use constant FT_USER => 1; use constant FT_AUTOMAKE => 2; use constant FT_SYSTEM => 3; # Map file names to included files (transitively closed). my %file_includes = (); # Files which have already been added. my %file_added = (); # Files that have already been scanned. my %scanned_configure_dep = (); # Serial numbers, for files that have one. # The key is the basename of the file, # the value is the serial number represented as a list. my %serial = (); # Matches a macro definition. # AC_DEFUN([macroname], ...) # or # AC_DEFUN(macroname, ...) # When macroname is '['-quoted , we accept any character in the name, # except ']'. Otherwise macroname stops on the first ']', ',', ')', # or '\n' encountered. my $ac_defun_rx = "(?:AU_ALIAS|A[CU]_DEFUN|AC_DEFUN_ONCE)\\((?:\\[([^]]+)\\]|([^],)\n]+))"; # Matches an AC_REQUIRE line. my $ac_require_rx = "AC_REQUIRE\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; # Matches an m4_include line. my $m4_include_rx = "(m4_|m4_s|s)include\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; # Match a serial number. my $serial_line_rx = '^#\s*serial\s+(\S*)'; my $serial_number_rx = '^\d+(?:\.\d+)*$'; # Autoconf version. This variable is set by 'trace_used_macros'. my $ac_version; # User directory containing extra m4 files for macros definition, # as extracted from calls to the macro AC_CONFIG_MACRO_DIRS. # This variable is updated by 'trace_used_macros'. my @ac_config_macro_dirs; # If set, names a temporary file that must be erased on abnormal exit. my $erase_me; # Constants for the $ERR_LEVEL parameter of the 'scan_m4_dirs' function. use constant SCAN_M4_DIRS_SILENT => 0; use constant SCAN_M4_DIRS_WARN => 1; use constant SCAN_M4_DIRS_ERROR => 2; ################################################################ # Prototypes for all subroutines. sub add_file ($); sub add_macro ($); sub check_acinclude (); sub install_file ($$); sub list_compare (\@\@); sub parse_ACLOCAL_PATH (); sub parse_arguments (); sub reset_maps (); sub scan_configure (); sub scan_configure_dep ($); sub scan_file ($$$); sub scan_m4_dirs ($$@); sub scan_m4_files (); sub strip_redundant_includes (%); sub trace_used_macros (); sub unlink_tmp (;$); sub usage ($); sub version (); sub write_aclocal ($@); sub xmkdir_p ($); ################################################################ # Erase temporary file ERASE_ME. Handle signals. sub unlink_tmp (;$) { my ($sig) = @_; if ($sig) { verb "caught SIG$sig, bailing out"; } if (defined $erase_me && -e $erase_me && !unlink ($erase_me)) { fatal "could not remove '$erase_me': $!"; } undef $erase_me; # reraise default handler. if ($sig) { $SIG{$sig} = 'DEFAULT'; kill $sig => $$; } } $SIG{'INT'} = $SIG{'TERM'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'unlink_tmp'; END { unlink_tmp } sub xmkdir_p ($) { my $dir = shift; local $@ = undef; return if -d $dir or eval { File::Path::mkpath $dir }; chomp $@; $@ =~ s/\s+at\s.*\bline\s\d+.*$//; fatal "could not create directory '$dir': $@"; } # Check macros in acinclude.m4. If one is not used, warn. sub check_acinclude () { foreach my $key (keys %map) { # FIXME: should print line number of acinclude.m4. msg ('syntax', "macro '$key' defined in acinclude.m4 but never used") if $map{$key} eq 'acinclude.m4' && ! exists $macro_seen{$key}; } } sub reset_maps () { $greatest_mtime = 0; %macro_seen = (); @file_order = (); %map = (); %map_traced_defs = (); %file_contents = (); %file_type = (); %file_includes = (); %file_added = (); %scanned_configure_dep = (); %invmap = (); %serial = (); undef &search; } # install_file ($SRC, $DESTDIR) sub install_file ($$) { my ($src, $destdir) = @_; my $dest = $destdir . "/" . basename ($src); my $diff_dest; verb "installing $src to $dest"; if ($force_output || !exists $file_contents{$dest} || $file_contents{$src} ne $file_contents{$dest}) { if (-e $dest) { msg 'note', "overwriting '$dest' with '$src'"; $diff_dest = $dest; } else { msg 'note', "installing '$dest' from '$src'"; } if (@diff_command) { if (! defined $diff_dest) { # $dest does not exist. We create an empty one just to # run diff, and we erase it afterward. Using the real # destination file (rather than a temporary file) is # good when diff is run with options that display the # file name. # # If creating $dest fails, fall back to /dev/null. At # least one diff implementation (Tru64's) cannot deal # with /dev/null. However working around this is not # worth the trouble since nobody run aclocal on a # read-only tree anyway. $erase_me = $dest; my $f = new IO::File "> $dest"; if (! defined $f) { undef $erase_me; $diff_dest = '/dev/null'; } else { $diff_dest = $dest; $f->close; } } my @cmd = (@diff_command, $diff_dest, $src); $! = 0; verb "running: @cmd"; my $res = system (@cmd); Automake::FileUtils::handle_exec_errors "@cmd", 1 if $res; unlink_tmp; } elsif (!$dry_run) { xmkdir_p ($destdir); xsystem ('cp', $src, $dest); } } } # Compare two lists of numbers. sub list_compare (\@\@) { my @l = @{$_[0]}; my @r = @{$_[1]}; while (1) { if (0 == @l) { return (0 == @r) ? 0 : -1; } elsif (0 == @r) { return 1; } elsif ($l[0] < $r[0]) { return -1; } elsif ($l[0] > $r[0]) { return 1; } shift @l; shift @r; } } ################################################################ # scan_m4_dirs($TYPE, $ERR_LEVEL, @DIRS) # ----------------------------------------------- # Scan all M4 files installed in @DIRS for new macro definitions. # Register each file as of type $TYPE (one of the FT_* constants). # If a directory in @DIRS cannot be read: # - fail hard if $ERR_LEVEL == SCAN_M4_DIRS_ERROR # - just print a warning if $ERR_LEVEL == SCAN_M4_DIRS_WA # - continue silently if $ERR_LEVEL == SCAN_M4_DIRS_SILENT sub scan_m4_dirs ($$@) { my ($type, $err_level, @dirlist) = @_; foreach my $m4dir (@dirlist) { if (! opendir (DIR, $m4dir)) { # TODO: maybe avoid complaining only if errno == ENONENT? my $message = "couldn't open directory '$m4dir': $!"; if ($err_level == SCAN_M4_DIRS_ERROR) { fatal $message; } elsif ($err_level == SCAN_M4_DIRS_WARN) { msg ('unsupported', $message); next; } elsif ($err_level == SCAN_M4_DIRS_SILENT) { next; # Silently ignore. } else { prog_error "invalid \$err_level value '$err_level'"; } } # We reverse the directory contents so that foo2.m4 gets # used in preference to foo1.m4. foreach my $file (reverse sort grep (! /^\./, readdir (DIR))) { # Only examine .m4 files. next unless $file =~ /\.m4$/; # Skip some files when running out of srcdir. next if $file eq 'aclocal.m4'; my $fullfile = File::Spec->canonpath ("$m4dir/$file"); scan_file ($type, $fullfile, 'aclocal'); } closedir (DIR); } } # Scan all the installed m4 files and construct a map. sub scan_m4_files () { # First, scan configure.ac. It may contain macro definitions, # or may include other files that define macros. scan_file (FT_USER, $configure_ac, 'aclocal'); # Then, scan acinclude.m4 if it exists. if (-f 'acinclude.m4') { scan_file (FT_USER, 'acinclude.m4', 'aclocal'); } # Finally, scan all files in our search paths. if (@user_includes) { # Don't explore the same directory multiple times. This is here not # only for speedup purposes. We need this when the user has e.g. # specified 'ACLOCAL_AMFLAGS = -I m4' and has also set # AC_CONFIG_MACRO_DIR[S]([m4]) in configure.ac. This makes the 'm4' # directory to occur twice here and fail on the second call to # scan_m4_dirs([m4]) when the 'm4' directory doesn't exist. # TODO: Shouldn't there be rather a check in scan_m4_dirs for # @user_includes[0]? @user_includes = uniq @user_includes; # Don't complain if the first user directory doesn't exist, in case # we need to create it later (can happen if '--install' was given). scan_m4_dirs (FT_USER, $install ? SCAN_M4_DIRS_SILENT : SCAN_M4_DIRS_WARN, $user_includes[0]); scan_m4_dirs (FT_USER, SCAN_M4_DIRS_ERROR, @user_includes[1..$#user_includes]); } scan_m4_dirs (FT_AUTOMAKE, SCAN_M4_DIRS_ERROR, @automake_includes); scan_m4_dirs (FT_SYSTEM, SCAN_M4_DIRS_ERROR, @system_includes); # Construct a new function that does the searching. We use a # function (instead of just evaluating $search in the loop) so that # "die" is correctly and easily propagated if run. my $search = "sub search {\nmy \$found = 0;\n"; foreach my $key (reverse sort keys %map) { $search .= ('if (/\b\Q' . $key . '\E(?!\w)/) { add_macro ("' . $key . '"); $found = 1; }' . "\n"); } $search .= "return \$found;\n};\n"; eval $search; prog_error "$@\n search is $search" if $@; } ################################################################ # Add a macro to the output. sub add_macro ($) { my ($macro) = @_; # Ignore unknown required macros. Either they are not really # needed (e.g., a conditional AC_REQUIRE), in which case aclocal # should be quiet, or they are needed and Autoconf itself will # complain when we trace for macro usage later. return unless defined $map{$macro}; verb "saw macro $macro"; $macro_seen{$macro} = 1; add_file ($map{$macro}); } # scan_configure_dep ($file) # -------------------------- # Scan a configure dependency (configure.ac, or separate m4 files) # for uses of known macros and AC_REQUIREs of possibly unknown macros. # Recursively scan m4_included files. sub scan_configure_dep ($) { my ($file) = @_; # Do not scan a file twice. return () if exists $scanned_configure_dep{$file}; $scanned_configure_dep{$file} = 1; my $mtime = mtime $file; $greatest_mtime = $mtime if $greatest_mtime < $mtime; my $contents = exists $file_contents{$file} ? $file_contents{$file} : contents $file; my $line = 0; my @rlist = (); my @ilist = (); foreach (split ("\n", $contents)) { ++$line; # Remove comments from current line. s/\bdnl\b.*$//; s/\#.*$//; # Avoid running all the following regexes on white lines. next if /^\s*$/; while (/$m4_include_rx/go) { my $ifile = $2 || $3; # Skip missing 'sinclude'd files. next if $1 ne 'm4_' && ! -f $ifile; push @ilist, $ifile; } while (/$ac_require_rx/go) { push (@rlist, $1 || $2); } # The search function is constructed dynamically by # scan_m4_files. The last parenthetical match makes sure we # don't match things that look like macro assignments or # AC_SUBSTs. if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) { # Macro not found, but AM_ prefix found. # Make this just a warning, because we do not know whether # the macro is actually used (it could be called conditionally). msg ('unsupported', "$file:$line", "macro '$2' not found in library"); } } add_macro ($_) foreach (@rlist); scan_configure_dep ($_) foreach @ilist; } # add_file ($FILE) # ---------------- # Add $FILE to output. sub add_file ($) { my ($file) = @_; # Only add a file once. return if ($file_added{$file}); $file_added{$file} = 1; scan_configure_dep $file; } # Point to the documentation for underquoted AC_DEFUN only once. my $underquoted_manual_once = 0; # scan_file ($TYPE, $FILE, $WHERE) # -------------------------------- # Scan a single M4 file ($FILE), and all files it includes. # Return the list of included files. # $TYPE is one of FT_USER, FT_AUTOMAKE, or FT_SYSTEM, depending # on where the file comes from. # $WHERE is the location to use in the diagnostic if the file # does not exist. sub scan_file ($$$) { my ($type, $file, $where) = @_; my $basename = basename $file; # Do not scan the same file twice. return @{$file_includes{$file}} if exists $file_includes{$file}; # Prevent potential infinite recursion (if two files include each other). return () if exists $file_contents{$file}; unshift @file_order, $file; $file_type{$file} = $type; fatal "$where: file '$file' does not exist" if ! -e $file; my $fh = new Automake::XFile $file; my $contents = ''; my @inc_files = (); my %inc_lines = (); my $defun_seen = 0; my $serial_seen = 0; my $serial_older = 0; while ($_ = $fh->getline) { # Ignore '##' lines. next if /^##/; $contents .= $_; my $line = $_; if ($line =~ /$serial_line_rx/go) { my $number = $1; if ($number !~ /$serial_number_rx/go) { msg ('syntax', "$file:$.", "ill-formed serial number '$number', " . "expecting a version string with only digits and dots"); } elsif ($defun_seen) { # aclocal removes all definitions from M4 file with the # same basename if a greater serial number is found. # Encountering a serial after some macros will undefine # these macros... msg ('syntax', "$file:$.", 'the serial number must appear before any macro definition'); } # We really care about serials only for non-automake macros # and when --install is used. But the above diagnostics are # made regardless of this, because not using --install is # not a reason not the fix macro files. elsif ($install && $type != FT_AUTOMAKE) { $serial_seen = 1; my @new = split (/\./, $number); verb "$file:$.: serial $number"; if (!exists $serial{$basename} || list_compare (@new, @{$serial{$basename}}) > 0) { # Delete any definition we knew from the old macro. foreach my $def (@{$invmap{$basename}}) { verb "$file:$.: ignoring previous definition of $def"; delete $map{$def}; } $invmap{$basename} = []; $serial{$basename} = \@new; } else { $serial_older = 1; } } } # Remove comments from current line. # Do not do it earlier, because the serial line is a comment. $line =~ s/\bdnl\b.*$//; $line =~ s/\#.*$//; while ($line =~ /$ac_defun_rx/go) { $defun_seen = 1; if (! defined $1) { msg ('syntax', "$file:$.", "underquoted definition of $2" . "\n run info Automake 'Extending aclocal'\n" . " or see https://www.gnu.org/software/automake/manual/" . "automake.html#Extending-aclocal") unless $underquoted_manual_once; $underquoted_manual_once = 1; } # If this macro does not have a serial and we have already # seen a macro with the same basename earlier, we should # ignore the macro (don't exit immediately so we can still # diagnose later #serial numbers and underquoted macros). $serial_older ||= ($type != FT_AUTOMAKE && !$serial_seen && exists $serial{$basename}); my $macro = $1 || $2; if (!$serial_older && !defined $map{$macro}) { verb "found macro $macro in $file: $."; $map{$macro} = $file; push @{$invmap{$basename}}, $macro; } else { # Note: we used to give an error here if we saw a # duplicated macro. However, this turns out to be # extremely unpopular. It causes actual problems which # are hard to work around, especially when you must # mix-and-match tool versions. verb "ignoring macro $macro in $file: $."; } } while ($line =~ /$m4_include_rx/go) { my $ifile = $2 || $3; # Skip missing 'sinclude'd files. next if $1 ne 'm4_' && ! -f $ifile; push (@inc_files, $ifile); $inc_lines{$ifile} = $.; } } # Ignore any file that has an old serial (or no serial if we know # another one with a serial). return () if ($serial_older || ($type != FT_AUTOMAKE && !$serial_seen && exists $serial{$basename})); $file_contents{$file} = $contents; # For some reason I don't understand, it does not work # to do "map { scan_file ($_, ...) } @inc_files" below. # With Perl 5.8.2 it undefines @inc_files. my @copy = @inc_files; my @all_inc_files = (@inc_files, map { scan_file ($type, $_, "$file:$inc_lines{$_}") } @copy); $file_includes{$file} = \@all_inc_files; return @all_inc_files; } # strip_redundant_includes (%FILES) # --------------------------------- # Each key in %FILES is a file that must be present in the output. # However some of these files might already include other files in %FILES, # so there is no point in including them another time. # This removes items of %FILES which are already included by another file. sub strip_redundant_includes (%) { my %files = @_; # Always include acinclude.m4, even if it does not appear to be used. $files{'acinclude.m4'} = 1 if -f 'acinclude.m4'; # File included by $configure_ac are redundant. $files{$configure_ac} = 1; # Files at the end of @file_order should override those at the beginning, # so it is important to preserve these trailing files. We can remove # a file A if it is going to be output before a file B that includes # file A, not the converse. foreach my $file (reverse @file_order) { next unless exists $files{$file}; foreach my $ifile (@{$file_includes{$file}}) { next unless exists $files{$ifile}; delete $files{$ifile}; verb "$ifile is already included by $file"; } } # configure.ac is implicitly included. delete $files{$configure_ac}; return %files; } sub trace_used_macros () { my %files = map { $map{$_} => 1 } keys %macro_seen; %files = strip_redundant_includes %files; # Suppress all warnings from this invocation of autom4te. # In particular we want to avoid spurious warnings about # macros being "m4_require'd but not m4_defun'd" because # aclocal.m4 is not yet available. local $ENV{WARNINGS} = 'none'; my $traces = ($ENV{AUTOM4TE} || 'autom4te'); $traces .= " --language Autoconf-without-aclocal-m4 "; # Support AC_CONFIG_MACRO_DIRS also with older autoconf. # Note that we can't use '$ac_config_macro_dirs_fallback' here, because # a bug in option parsing code of autom4te 2.68 and earlier would cause # it to read standard input last, even if the "-" argument was specified # early. # FIXME: To be removed in Automake 2.0, once we can assume autoconf # 2.70 or later. $traces .= "$automake_includes[0]/internal/ac-config-macro-dirs.m4 "; # All candidate files. $traces .= join (' ', (map { "'$_'" } (grep { exists $files{$_} } @file_order))) . " "; # All candidate macros. $traces .= join (' ', (map { "--trace='$_:\$f::\$n::\${::}%'" } ('AC_DEFUN', 'AC_DEFUN_ONCE', 'AU_DEFUN', '_AM_AUTOCONF_VERSION', 'AC_CONFIG_MACRO_DIR_TRACE', # FIXME: Tracing the next two macros is a hack for # compatibility with older autoconf. Remove this in # Automake 2.0, when we can assume Autoconf 2.70 or # later. 'AC_CONFIG_MACRO_DIR', '_AM_CONFIG_MACRO_DIRS')), # Do not trace $1 for all other macros as we do # not need it and it might contains harmful # characters (like newlines). (map { "--trace='$_:\$f::\$n'" } (keys %macro_seen))); verb "running WARNINGS=$ENV{WARNINGS} $traces $configure_ac"; my $tracefh = new Automake::XFile ("$traces $configure_ac |"); @ac_config_macro_dirs = (); my %traced = (); while ($_ = $tracefh->getline) { chomp; my ($file, $macro, $arg1) = split (/::/); $traced{$macro} = 1 if exists $macro_seen{$macro}; if ($macro eq 'AC_DEFUN' || $macro eq 'AC_DEFUN_ONCE' || $macro eq 'AU_DEFUN') { $map_traced_defs{$arg1} = $file; } elsif ($macro eq '_AM_AUTOCONF_VERSION') { $ac_version = $arg1; } elsif ($macro eq 'AC_CONFIG_MACRO_DIR_TRACE') { push @ac_config_macro_dirs, $arg1; } # FIXME: We still need to trace AC_CONFIG_MACRO_DIR # for compatibility with older autoconf. Remove this # once we can assume Autoconf 2.70 or later. elsif ($macro eq 'AC_CONFIG_MACRO_DIR') { @ac_config_macro_dirs = ($arg1); } # FIXME:This is an hack for compatibility with older autoconf. # Remove this once we can assume Autoconf 2.70 or later. elsif ($macro eq '_AM_CONFIG_MACRO_DIRS') { # Empty leading/trailing fields might be produced by split, # hence the grep is really needed. push @ac_config_macro_dirs, grep (/./, (split /\s+/, $arg1)); } } # FIXME: in Autoconf >= 2.70, AC_CONFIG_MACRO_DIR calls # AC_CONFIG_MACRO_DIR_TRACE behind the scenes, which could # leave unwanted duplicates in @ac_config_macro_dirs. # Remove this in Automake 2.0, when we'll stop tracing # AC_CONFIG_MACRO_DIR explicitly. @ac_config_macro_dirs = uniq @ac_config_macro_dirs; $tracefh->close; return %traced; } sub scan_configure () { # Make sure we include acinclude.m4 if it exists. if (-f 'acinclude.m4') { add_file ('acinclude.m4'); } scan_configure_dep ($configure_ac); } ################################################################ # Write output. # Return 0 iff some files were installed locally. sub write_aclocal ($@) { my ($output_file, @macros) = @_; my $output = ''; my %files = (); # Get the list of files containing definitions for the macros used. # (Filter out unused macro definitions with $map_traced_defs. This # can happen when an Autoconf macro is conditionally defined: # aclocal sees the potential definition, but this definition is # actually never processed and the Autoconf implementation is used # instead.) for my $m (@macros) { $files{$map{$m}} = 1 if (exists $map_traced_defs{$m} && $map{$m} eq $map_traced_defs{$m}); } # Do not explicitly include a file that is already indirectly included. %files = strip_redundant_includes %files; my $installed = 0; for my $file (grep { exists $files{$_} } @file_order) { # Check the time stamp of this file, and of all files it includes. for my $ifile ($file, @{$file_includes{$file}}) { my $mtime = mtime $ifile; $greatest_mtime = $mtime if $greatest_mtime < $mtime; } # If the file to add looks like outside the project, copy it # to the output. The regex catches filenames starting with # things like '/', '\', or 'c:\'. if ($file_type{$file} != FT_USER || $file =~ m,^(?:\w:)?[\\/],) { if (!$install || $file_type{$file} != FT_SYSTEM) { # Copy the file into aclocal.m4. $output .= $file_contents{$file} . "\n"; } else { # Install the file (and any file it includes). my $dest; for my $ifile (@{$file_includes{$file}}, $file) { install_file ($ifile, $user_includes[0]); } $installed = 1; } } else { # Otherwise, simply include the file. $output .= "m4_include([$file])\n"; } } if ($installed) { verb "running aclocal anew, because some files were installed locally"; return 0; } # Nothing to output?! # FIXME: Shouldn't we diagnose this? return 1 if ! length ($output); if ($ac_version) { # Do not use "$output_file" here for the same reason we do not # use it in the header below. autom4te will output the name of # the file in the diagnostic anyway. $output = "m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [$ac_version],, [m4_warning([this file was generated for autoconf $ac_version. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) $output"; } # We used to print "# $output_file generated automatically etc." But # this creates spurious differences when using autoreconf. Autoreconf # creates aclocal.m4t and then rename it to aclocal.m4, but the # rebuild rules generated by Automake create aclocal.m4 directly -- # this would gives two ways to get the same file, with a different # name in the header. $output = "# generated automatically by aclocal $VERSION -*- Autoconf -*- # Copyright (C) 1996-$RELEASE_YEAR Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. $ac_config_macro_dirs_fallback $output"; # We try not to update $output_file unless necessary, because # doing so invalidate Autom4te's cache and therefore slows down # tools called after aclocal. # # We need to overwrite $output_file in the following situations. # * The --force option is in use. # * One of the dependencies is younger. # (Not updating $output_file in this situation would cause # make to call aclocal in loop.) # * The contents of the current file are different from what # we have computed. if (!$force_output && $greatest_mtime < mtime ($output_file) && $output eq contents ($output_file)) { verb "$output_file unchanged"; return 1; } verb "writing $output_file"; if (!$dry_run) { if (-e $output_file && !unlink $output_file) { fatal "could not remove '$output_file': $!"; } my $out = new Automake::XFile "> $output_file"; print $out $output; } return 1; } ################################################################ # Print usage and exit. sub usage ($) { my ($status) = @_; print <<'EOF'; Usage: aclocal [OPTION]... Generate 'aclocal.m4' by scanning 'configure.ac' or 'configure.in' Options: --automake-acdir=DIR directory holding automake-provided m4 files --system-acdir=DIR directory holding third-party system-wide files --diff[=COMMAND] run COMMAND [diff -u] on M4 files that would be changed (implies --install and --dry-run) --dry-run pretend to, but do not actually update any file --force always update output file --help print this help, then exit -I DIR add directory to search list for .m4 files --install copy third-party files to the first -I directory --output=FILE put output in FILE (default aclocal.m4) --print-ac-dir print name of directory holding system-wide third-party m4 files, then exit --verbose don't be silent --version print version number, then exit -W, --warnings=CATEGORY report the warnings falling in CATEGORY EOF print Automake::ChannelDefs::usage (), "\n"; print <<'EOF'; Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $status; } # Print version and exit. sub version () { print < This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Tom Tromey and Alexandre Duret-Lutz . EOF exit 0; } # Parse command line. sub parse_arguments () { my $print_and_exit = 0; my $diff_command; my @warnings = (); my %cli_options = ( 'help' => sub { usage(0); }, 'version' => \&version, 'system-acdir=s' => sub { shift; @system_includes = @_; }, 'automake-acdir=s' => sub { shift; @automake_includes = @_; }, 'diff:s' => \$diff_command, 'dry-run' => \$dry_run, 'force' => \$force_output, 'I=s' => \@user_includes, 'install' => \$install, 'output=s' => \$output_file, 'print-ac-dir' => \$print_and_exit, 'verbose' => sub { setup_channel 'verb', silent => 0; }, 'W|warnings=s' => \@warnings, ); use Automake::Getopt (); Automake::Getopt::parse_options %cli_options; parse_warnings @warnings; if (@ARGV > 0) { fatal ("non-option arguments are not accepted: '$ARGV[0]'.\n" . "Try '$0 --help' for more information."); } if ($print_and_exit) { print "@system_includes\n"; exit 0; } if (defined $diff_command) { $diff_command = 'diff -u' if $diff_command eq ''; @diff_command = split (' ', $diff_command); $install = 1; $dry_run = 1; } # Finally, adds any directory listed in the 'dirlist' file. if (@system_includes && open (DIRLIST, "$system_includes[0]/dirlist")) { while () { # Ignore '#' lines. next if /^#/; # strip off newlines and end-of-line comments s/\s*\#.*$//; chomp; foreach my $dir (glob) { push (@system_includes, $dir) if -d $dir; } } close (DIRLIST); } } # Add any directory listed in the 'ACLOCAL_PATH' environment variable # to the list of system include directories. sub parse_ACLOCAL_PATH () { return if not defined $ENV{"ACLOCAL_PATH"}; # Directories in ACLOCAL_PATH should take precedence over system # directories, so we use unshift. However, directories that # come first in ACLOCAL_PATH take precedence over directories # coming later, which is why the result of split is reversed. foreach my $dir (reverse split /:/, $ENV{"ACLOCAL_PATH"}) { unshift (@system_includes, $dir) if $dir ne '' && -d $dir; } } ################################################################ # Don't refer to installation directories from the build environment if (exists $ENV{"AUTOMAKE_UNINSTALLED"}) { @automake_includes = (); @system_includes = (); } @automake_includes = ($ENV{"ACLOCAL_AUTOMAKE_DIR"}) if (exists $ENV{"ACLOCAL_AUTOMAKE_DIR"}); parse_WARNINGS; # Parse the WARNINGS environment variable. parse_arguments; parse_ACLOCAL_PATH; $configure_ac = require_configure_ac; # We may have to rerun aclocal if some file have been installed, but # it should not happen more than once. The reason we must run again # is that once the file has been moved from /usr/share/aclocal/ to the # local m4/ directory it appears at a new place in the search path, # hence it should be output at a different position in aclocal.m4. If # we did not rerun aclocal, the next run of aclocal would produce a # different aclocal.m4. my $loop = 0; my $rerun_due_to_macrodir = 0; while (1) { ++$loop; prog_error "too many loops" if $loop > 2 + $rerun_due_to_macrodir; reset_maps; scan_m4_files; scan_configure; last if $exit_code; my %macro_traced = trace_used_macros; if (!$rerun_due_to_macrodir && @ac_config_macro_dirs) { # The directory specified in calls to the AC_CONFIG_MACRO_DIRS # m4 macro (if any) must go after the user includes specified # explicitly with the '-I' option. push @user_includes, @ac_config_macro_dirs; # We might have to scan some new directory of .m4 files. $rerun_due_to_macrodir++; next; } if ($install && !@user_includes) { fatal "installation of third-party macros impossible without " . "-I options nor AC_CONFIG_MACRO_DIR{,S} m4 macro(s)"; } last if write_aclocal ($output_file, keys %macro_traced); last if $dry_run; } check_acinclude; exit $exit_code;