1#! @PERL@ -w 2# -*- perl -*- 3# @configure_input@ 4 5eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac' 6 if 0; 7 8# autoreconf - install the GNU Build System in a directory tree 9# Copyright (C) 1994, 1999-2012 Free Software Foundation, Inc. 10 11# This program is free software: you can redistribute it and/or modify 12# it under the terms of the GNU General Public License as published by 13# the Free Software Foundation, either version 3 of the License, or 14# (at your option) any later version. 15 16# This program is distributed in the hope that it will be useful, 17# but WITHOUT ANY WARRANTY; without even the implied warranty of 18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19# GNU General Public License for more details. 20 21# You should have received a copy of the GNU General Public License 22# along with this program. If not, see <http://www.gnu.org/licenses/>. 23 24# Written by David J. MacKenzie. 25# Extended and rewritten in Perl by Akim Demaille. 26 27BEGIN 28{ 29 my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@'; 30 unshift @INC, $pkgdatadir; 31 32 # Override SHELL. On DJGPP SHELL may not be set to a shell 33 # that can handle redirection and quote arguments correctly, 34 # e.g.: COMMAND.COM. For DJGPP always use the shell that configure 35 # has detected. 36 $ENV{'SHELL'} = '@SHELL@' if ($^O eq 'dos'); 37} 38 39use Autom4te::ChannelDefs; 40use Autom4te::Channels; 41use Autom4te::Configure_ac; 42use Autom4te::FileUtils; 43use Autom4te::General; 44use Autom4te::XFile; 45# Do not use Cwd::chdir, since it might hang. 46use Cwd 'cwd'; 47use strict; 48 49## ----------- ## 50## Variables. ## 51## ----------- ## 52 53# $HELP 54# ----- 55$help = "Usage: $0 [OPTION]... [DIRECTORY]... 56 57Run `autoconf' (and `autoheader', `aclocal', `automake', `autopoint' 58(formerly `gettextize'), and `libtoolize' where appropriate) 59repeatedly to remake the GNU Build System files in specified 60DIRECTORIES and their subdirectories (defaulting to `.'). 61 62By default, it only remakes those files that are older than their 63sources. If you install new versions of the GNU Build System, 64you can make `autoreconf' remake all of the files by giving it the 65`--force' option. 66 67Operation modes: 68 -h, --help print this help, then exit 69 -V, --version print version number, then exit 70 -v, --verbose verbosely report processing 71 -d, --debug don't remove temporary files 72 -f, --force consider all files obsolete 73 -i, --install copy missing auxiliary files 74 --no-recursive don't rebuild sub-packages 75 -s, --symlink with -i, install symbolic links instead of copies 76 -m, --make when applicable, re-run ./configure && make 77 -W, --warnings=CATEGORY report the warnings falling in CATEGORY [syntax] 78 79" . Autom4te::ChannelDefs::usage . " 80 81The environment variable \`WARNINGS\' is honored. Some subtools might 82support other warning types, using \`all' is encouraged. 83 84Library directories: 85 -B, --prepend-include=DIR prepend directory DIR to search path 86 -I, --include=DIR append directory DIR to search path 87 88The environment variables AUTOM4TE, AUTOCONF, AUTOHEADER, AUTOMAKE, 89ACLOCAL, AUTOPOINT, LIBTOOLIZE, M4, and MAKE are honored. 90 91Report bugs to <bug-autoconf\@gnu.org>. 92GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>. 93General help using GNU software: <http://www.gnu.org/gethelp/>. 94"; 95 96# $VERSION 97# -------- 98$version = "autoreconf (@PACKAGE_NAME@) @VERSION@ 99Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc. 100License GPLv3+/Autoconf: GNU GPL version 3 or later 101<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html> 102This is free software: you are free to change and redistribute it. 103There is NO WARRANTY, to the extent permitted by law. 104 105Written by David J. MacKenzie and Akim Demaille. 106"; 107 108# Lib files. 109my $autoconf = $ENV{'AUTOCONF'} || '@bindir@/@autoconf-name@'; 110my $autoheader = $ENV{'AUTOHEADER'} || '@bindir@/@autoheader-name@'; 111my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@'; 112my $automake = $ENV{'AUTOMAKE'} || 'automake'; 113my $aclocal = $ENV{'ACLOCAL'} || 'aclocal'; 114my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize'; 115my $autopoint = $ENV{'AUTOPOINT'} || 'autopoint'; 116my $make = $ENV{'MAKE'} || 'make'; 117 118# --install -- as --add-missing in other tools. 119my $install = 0; 120# symlink -- when --install, use symlinks instead. 121my $symlink = 0; 122# Does aclocal support --force? 123my $aclocal_supports_force = 0; 124# Does aclocal support -Wfoo? 125my $aclocal_supports_warnings = 0; 126# Does automake support --force-missing? 127my $automake_supports_force_missing = 0; 128# Does automake support -Wfoo? 129my $automake_supports_warnings = 0; 130 131my @prepend_include; 132my @include; 133 134# List of command line warning requests. 135my @warning; 136 137# Rerun `./configure && make'? 138my $run_make = 0; 139 140# Recurse into subpackages 141my $recursive = 1; 142 143## ---------- ## 144## Routines. ## 145## ---------- ## 146 147 148# parse_args () 149# ------------- 150# Process any command line arguments. 151sub parse_args () 152{ 153 my $srcdir; 154 155 getopt ("W|warnings=s" => \@warning, 156 'I|include=s' => \@include, 157 'B|prepend-include=s' => \@prepend_include, 158 'i|install' => \$install, 159 's|symlink' => \$symlink, 160 'm|make' => \$run_make, 161 'recursive!' => \$recursive); 162 163 # Split the warnings as a list of elements instead of a list of 164 # lists. 165 @warning = map { split /,/ } @warning; 166 parse_WARNINGS; 167 parse_warnings '--warnings', @warning; 168 169 # Even if the user specified a configure.ac, trim to get the 170 # directory, and look for configure.ac again. Because (i) the code 171 # is simpler, and (ii) we are still able to diagnose simultaneous 172 # presence of configure.ac and configure.in. 173 @ARGV = map { /configure\.(ac|in)$/ ? dirname ($_) : $_ } @ARGV; 174 push @ARGV, '.' unless @ARGV; 175 176 if ($verbose && $debug) 177 { 178 for my $prog ($autoconf, $autoheader, 179 $automake, $aclocal, 180 $autopoint, 181 $libtoolize) 182 { 183 xsystem ("$prog --version | sed 1q >&2"); 184 print STDERR "\n"; 185 } 186 } 187 188 my $aclocal_help = `$aclocal --help 2>/dev/null`; 189 my $automake_help = `$automake --help 2>/dev/null`; 190 $aclocal_supports_force = $aclocal_help =~ /--force/; 191 $aclocal_supports_warnings = $aclocal_help =~ /--warnings/; 192 $automake_supports_force_missing = $automake_help =~ /--force-missing/; 193 $automake_supports_warnings = $automake_help =~ /--warnings/; 194 195 # Dispatch autoreconf's option to the tools. 196 # --include; 197 $aclocal .= join (' -I ', '', map { shell_quote ($_) } @include); 198 $autoconf .= join (' --include=', '', map { shell_quote ($_) } @include); 199 $autoconf .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include); 200 $autoheader .= join (' --include=', '', map { shell_quote ($_) } @include); 201 $autoheader .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include); 202 203 # --install and --symlink; 204 if ($install) 205 { 206 $automake .= ' --add-missing'; 207 $automake .= ' --copy' unless $symlink; 208 $libtoolize .= ' --copy' unless $symlink; 209 } 210 # --force; 211 if ($force) 212 { 213 $aclocal .= ' --force' 214 if $aclocal_supports_force; 215 $autoconf .= ' --force'; 216 $autoheader .= ' --force'; 217 $automake .= ' --force-missing' 218 if $automake_supports_force_missing; 219 $autopoint .= ' --force'; 220 $libtoolize .= ' --force'; 221 } 222 else 223 { 224 # The implementation of --no-force is bogus in all implementations 225 # of Automake up to 1.8, so we avoid it in these cases. (Automake 226 # 1.8 is the first version where aclocal supports force, hence 227 # the condition.) 228 $automake .= ' --no-force' 229 if $aclocal_supports_force; 230 } 231 # --verbose --verbose or --debug; 232 if ($verbose > 1 || $debug) 233 { 234 $autoconf .= ' --verbose'; 235 $autoheader .= ' --verbose'; 236 $automake .= ' --verbose'; 237 $aclocal .= ' --verbose'; 238 } 239 if ($debug) 240 { 241 $autoconf .= ' --debug'; 242 $autoheader .= ' --debug'; 243 $libtoolize .= ' --debug'; 244 } 245 # --warnings; 246 if (@warning) 247 { 248 my $warn = ' --warnings=' . join (',', @warning); 249 $autoconf .= $warn; 250 $autoheader .= $warn; 251 $automake .= $warn 252 if $automake_supports_warnings; 253 $aclocal .= $warn 254 if $aclocal_supports_warnings; 255 } 256} 257 258 259# &run_aclocal ($ACLOCAL, $FLAGS) 260# ------------------------------- 261# Update aclocal.m4 as lazily as possible, as aclocal pre-1.8 always 262# overwrites aclocal.m4, hence triggers autoconf, autoheader, automake 263# etc. uselessly. aclocal 1.8+ does not need this. 264sub run_aclocal ($$) 265{ 266 my ($aclocal, $flags) = @_; 267 268 # aclocal 1.8+ does all this for free. It can be recognized by its 269 # --force support. 270 if ($aclocal_supports_force) 271 { 272 xsystem ("$aclocal $flags"); 273 } 274 else 275 { 276 xsystem ("$aclocal $flags --output=aclocal.m4t"); 277 # aclocal may produce no output. 278 if (-f 'aclocal.m4t') 279 { 280 update_file ('aclocal.m4t', 'aclocal.m4'); 281 # Make sure that the local m4 files are older than 282 # aclocal.m4. 283 # 284 # Why is not always the case? Because we already run 285 # aclocal at first (before tracing), which, for instance, 286 # can find Gettext's macros in .../share/aclocal, so we may 287 # have had the right aclocal.m4 already. Then autopoint is 288 # run, and installs locally these M4 files. Then 289 # autoreconf, via update_file, sees it is the _same_ 290 # aclocal.m4, and doesn't change its timestamp. But later, 291 # Automake's Makefile expresses that aclocal.m4 depends on 292 # these local files, which are newer, so it triggers aclocal 293 # again. 294 # 295 # To make sure aclocal.m4 is no older, we change the 296 # modification times of the local M4 files to be not newer 297 # than it. 298 # 299 # First, where are the local files? 300 my $aclocal_local_dir = '.'; 301 if ($flags =~ /-I\s+(\S+)/) 302 { 303 $aclocal_local_dir = $1; 304 } 305 # All the local files newer than aclocal.m4 are to be 306 # made not newer than it. 307 my $aclocal_m4_mtime = mtime ('aclocal.m4'); 308 for my $file (glob ("$aclocal_local_dir/*.m4"), 'acinclude.m4') 309 { 310 if ($aclocal_m4_mtime < mtime ($file)) 311 { 312 debug "aging $file to be not newer than aclocal.m4"; 313 utime $aclocal_m4_mtime, $aclocal_m4_mtime, $file; 314 } 315 } 316 } 317 } 318} 319 320# &autoreconf_current_directory 321# ----------------------------- 322sub autoreconf_current_directory () 323{ 324 my $configure_ac = find_configure_ac; 325 326 # ---------------------- # 327 # Is it using Autoconf? # 328 # ---------------------- # 329 330 my $uses_autoconf; 331 my $uses_gettext; 332 if (-f $configure_ac) 333 { 334 my $configure_ac_file = new Autom4te::XFile "< $configure_ac"; 335 while ($_ = $configure_ac_file->getline) 336 { 337 s/#.*//; 338 s/dnl.*//; 339 $uses_autoconf = 1 if /AC_INIT/; 340 # See below for why we look for gettext here. 341 $uses_gettext = 1 if /^AM_GNU_GETTEXT_VERSION/; 342 } 343 } 344 if (!$uses_autoconf) 345 { 346 verb "$configure_ac: not using Autoconf"; 347 return; 348 } 349 350 351 # ------------------- # 352 # Running autopoint. # 353 # ------------------- # 354 355 # Gettext is a bit of a problem: its macros are not necessarily 356 # visible to aclocal, so if we start with a completely striped down 357 # package (think of a fresh CVS checkout), running `aclocal' first 358 # will fail: the Gettext macros are missing. 359 # 360 # Therefore, we can't use the traces to decide if we use Gettext or 361 # not. I guess that once Gettext move to 2.5x we will be able to, 362 # but in the meanwhile forget it. 363 # 364 # We can only grep for AM_GNU_GETTEXT_VERSION in configure.ac. You 365 # might think this approach is naive, and indeed it is, as it 366 # prevents one to embed AM_GNU_GETTEXT_VERSION in another *.m4, but 367 # anyway we don't limit the generality, since... that's what 368 # autopoint does. Actually, it is even more restrictive, as it 369 # greps for `^AM_GNU_GETTEXT_VERSION('. We did this above, while 370 # scanning configure.ac. 371 if (!$uses_gettext) 372 { 373 verb "$configure_ac: not using Gettext"; 374 } 375 elsif (!$install) 376 { 377 verb "$configure_ac: not running autopoint: --install not given"; 378 } 379 else 380 { 381 xsystem_hint ("autopoint is needed because this package uses Gettext", "$autopoint"); 382 } 383 384 385 # ----------------- # 386 # Running aclocal. # 387 # ----------------- # 388 389 # Run it first: it might discover new macros to add, e.g., 390 # AC_PROG_LIBTOOL, which we will trace later to see if Libtool is 391 # used. 392 # 393 # Always run it. Tracking its sources for up-to-dateness is too 394 # complex and too error prone. The best we can do is avoiding 395 # nuking the time stamp. 396 my $uses_aclocal = 1; 397 398 # Nevertheless, if aclocal.m4 exists and is not made by aclocal, 399 # don't run aclocal. 400 401 if (-f 'aclocal.m4') 402 { 403 my $aclocal_m4 = new Autom4te::XFile 'aclocal.m4'; 404 $_ = $aclocal_m4->getline; 405 $uses_aclocal = 0 406 unless defined ($_) && /generated.*by aclocal/; 407 } 408 409 # If there are flags for aclocal in Makefile.am, use them. 410 my $aclocal_flags = ''; 411 if ($uses_aclocal && -f 'Makefile.am') 412 { 413 my $makefile = new Autom4te::XFile 'Makefile.am'; 414 while ($_ = $makefile->getline) 415 { 416 if (/^ACLOCAL_[A-Z_]*FLAGS\s*=\s*(.*)/) 417 { 418 $aclocal_flags = $1; 419 last; 420 } 421 } 422 } 423 424 if (!$uses_aclocal) 425 { 426 verb "$configure_ac: not using aclocal"; 427 } 428 else 429 { 430 # Some file systems have sub-second time stamps, and if so we may 431 # run into trouble later, after we rerun autoconf and set the 432 # time stamps of input files to be no greater than aclocal.m4, 433 # because the time-stamp-setting operation (utime) has a 434 # resolution of only 1 second. Work around the problem by 435 # ensuring that there is at least a one-second window before the 436 # time stamp of aclocal.m4t in which no file time stamps can 437 # fall. 438 sleep 1; 439 440 run_aclocal ($aclocal, $aclocal_flags); 441 } 442 443 # We might have to rerun aclocal if Libtool (or others) imports new 444 # macros. 445 my $rerun_aclocal = 0; 446 447 448 449 # ------------------------------- # 450 # See what tools will be needed. # 451 # ------------------------------- # 452 453 # Perform a single trace reading to avoid --force forcing a rerun 454 # between two --trace, that's useless. If there is no AC_INIT, then 455 # we are not interested: it looks like a Cygnus thingy. 456 my $aux_dir; 457 my $uses_gettext_via_traces; 458 my $uses_libtool; 459 my $uses_libltdl; 460 my $uses_autoheader; 461 my $uses_automake; 462 my @subdir; 463 verb "$configure_ac: tracing"; 464 my $traces = new Autom4te::XFile 465 ("$autoconf" 466 . join (' ', 467 map { ' --trace=' . $_ . ':\$n::\${::}%' } 468 # If you change this list, update the 469 # `Autoreconf-preselections' section of autom4te.in. 470 'AC_CONFIG_AUX_DIR', 471 'AC_CONFIG_HEADERS', 472 'AC_CONFIG_SUBDIRS', 473 'AC_INIT', 474 'AC_PROG_LIBTOOL', 475 'LT_INIT', 476 'LT_CONFIG_LTDL_DIR', 477 'AM_GNU_GETTEXT', 478 'AM_INIT_AUTOMAKE', 479 ) 480 . ' |'); 481 while ($_ = $traces->getline) 482 { 483 chomp; 484 my ($macro, @args) = split (/::/); 485 $aux_dir = $args[0] if $macro eq "AC_CONFIG_AUX_DIR"; 486 $uses_autoconf = 1 if $macro eq "AC_INIT"; 487 $uses_gettext_via_traces = 1 if $macro eq "AM_GNU_GETTEXT"; 488 $uses_libtool = 1 if $macro eq "AC_PROG_LIBTOOL" 489 || $macro eq "LT_INIT"; 490 $uses_libltdl = 1 if $macro eq "LT_CONFIG_LTDL_DIR"; 491 $uses_autoheader = 1 if $macro eq "AC_CONFIG_HEADERS"; 492 $uses_automake = 1 if $macro eq "AM_INIT_AUTOMAKE"; 493 push @subdir, split (' ', $args[0]) 494 if $macro eq "AC_CONFIG_SUBDIRS" && $recursive; 495 } 496 497 # The subdirs are *optional*, they may not exist. 498 foreach (@subdir) 499 { 500 if (-d) 501 { 502 verb "$configure_ac: adding subdirectory $_ to autoreconf"; 503 autoreconf ($_); 504 } 505 else 506 { 507 verb "$configure_ac: subdirectory $_ not present"; 508 } 509 } 510 511 # Gettext consistency checks... 512 error "$configure_ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION" 513 if $uses_gettext_via_traces && ! $uses_gettext; 514 error "$configure_ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT" 515 if $uses_gettext && ! $uses_gettext_via_traces; 516 517 518 # ---------------------------- # 519 # Setting up the source tree. # 520 # ---------------------------- # 521 522 # libtoolize, automake --add-missing etc. will drop files in the 523 # $AUX_DIR. But these tools fail to install these files if the 524 # directory itself does not exist, which valid: just imagine a CVS 525 # repository with hand written code only (there is not even a need 526 # for a Makefile.am!). 527 528 if (defined $aux_dir && ! -d $aux_dir) 529 { 530 verb "$configure_ac: creating directory $aux_dir"; 531 mkdir $aux_dir, 0755 532 or error "cannot create $aux_dir: $!"; 533 } 534 535 536 # -------------------- # 537 # Running libtoolize. # 538 # -------------------- # 539 540 if (!$uses_libtool) 541 { 542 verb "$configure_ac: not using Libtool"; 543 } 544 elsif ($install) 545 { 546 if ($uses_libltdl) 547 { 548 $libtoolize .= " --ltdl"; 549 } 550 xsystem_hint ("libtoolize is needed because this package uses Libtool", $libtoolize); 551 $rerun_aclocal = 1; 552 } 553 else 554 { 555 verb "$configure_ac: not running libtoolize: --install not given"; 556 } 557 558 559 560 # ------------------- # 561 # Rerunning aclocal. # 562 # ------------------- # 563 564 # If we re-installed Libtool or Gettext, the macros might have changed. 565 # Automake also needs an up-to-date aclocal.m4. 566 if ($rerun_aclocal) 567 { 568 if (!$uses_aclocal) 569 { 570 verb "$configure_ac: not using aclocal"; 571 } 572 else 573 { 574 run_aclocal ($aclocal, $aclocal_flags); 575 } 576 } 577 578 579 # ------------------ # 580 # Running autoconf. # 581 # ------------------ # 582 583 # Don't try to be smarter than `autoconf', which does its own up to 584 # date checks. 585 # 586 # We prefer running autoconf before autoheader, because (i) the 587 # latter runs the former, and (ii) autoconf is stricter than 588 # autoheader. So all in all, autoconf should give better error 589 # messages. 590 xsystem ($autoconf); 591 592 593 # -------------------- # 594 # Running autoheader. # 595 # -------------------- # 596 597 # We now consider that if AC_CONFIG_HEADERS is used, then autoheader 598 # is used too. 599 # 600 # Just as for autoconf, up to date ness is performed by the tool 601 # itself. 602 # 603 # Run it before automake, since the latter checks the presence of 604 # config.h.in when it sees an AC_CONFIG_HEADERS. 605 if (!$uses_autoheader) 606 { 607 verb "$configure_ac: not using Autoheader"; 608 } 609 else 610 { 611 xsystem ($autoheader); 612 } 613 614 615 # ------------------ # 616 # Running automake. # 617 # ------------------ # 618 619 if (!$uses_automake) 620 { 621 verb "$configure_ac: not using Automake"; 622 } 623 else 624 { 625 # We should always run automake, and let it decide whether it shall 626 # update the file or not. In fact, the effect of `$force' is already 627 # included in `$automake' via `--no-force'. 628 xsystem ($automake); 629 } 630 631 632 # -------------- # 633 # Running make. # 634 # -------------- # 635 636 if ($run_make) 637 { 638 if (!-f "config.status") 639 { 640 verb "no config.status: cannot re-make"; 641 } 642 else 643 { 644 xsystem ("./config.status --recheck"); 645 xsystem ("./config.status"); 646 if (!-f "Makefile") 647 { 648 verb "no Makefile: cannot re-make"; 649 } 650 else 651 { 652 xsystem ("$make"); 653 } 654 } 655 } 656} 657 658 659# &autoreconf ($DIRECTORY) 660# ------------------------ 661# Reconf the $DIRECTORY. 662sub autoreconf ($) 663{ 664 my ($directory) = @_; 665 my $cwd = cwd; 666 667 # The format for this message is not free: taken from Emacs, itself 668 # using GNU Make's format. 669 verb "Entering directory `$directory'"; 670 chdir $directory 671 or error "cannot chdir to $directory: $!"; 672 673 autoreconf_current_directory; 674 675 # The format is not free: taken from Emacs, itself using GNU Make's 676 # format. 677 verb "Leaving directory `$directory'"; 678 chdir $cwd 679 or error "cannot chdir to $cwd: $!"; 680} 681 682 683## ------ ## 684## Main. ## 685## ------ ## 686 687# When debugging, it is convenient that all the related temporary 688# files be at the same place. 689mktmpdir ('ar'); 690$ENV{'TMPDIR'} = $tmp; 691parse_args; 692 693# Autoreconf all the given configure.ac. Unless `--no-recursive' is passed, 694# AC_CONFIG_SUBDIRS will be traversed in &autoreconf_current_directory. 695$ENV{'AUTOM4TE'} = $autom4te; 696for my $directory (@ARGV) 697 { 698 require_configure_ac ($directory); 699 autoreconf ($directory); 700 } 701 702### Setup "GNU" style for perl-mode and cperl-mode. 703## Local Variables: 704## perl-indent-level: 2 705## perl-continued-statement-offset: 2 706## perl-continued-brace-offset: 0 707## perl-brace-offset: 0 708## perl-brace-imaginary-offset: 0 709## perl-label-offset: -2 710## cperl-indent-level: 2 711## cperl-brace-offset: 0 712## cperl-continued-brace-offset: 0 713## cperl-label-offset: -2 714## cperl-extra-newline-before-brace: t 715## cperl-merge-trailing-else: nil 716## cperl-continued-statement-offset: 2 717## End: 718