1#! /usr/bin/env perl
2# -*- perl -*-
3
4eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
5    if 0;
6
7# gnu-configize - install the GNU config.guess / config.sub in a directory tree
8# Based on autoreconf:
9#   Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003
10#   Free Software Foundation, Inc.
11
12# This program is free software; you can redistribute it and/or modify
13# it under the terms of the GNU General Public License as published by
14# the Free Software Foundation; either version 2, or (at your option)
15# any later version.
16
17# This program is distributed in the hope that it will be useful,
18# but WITHOUT ANY WARRANTY; without even the implied warranty of
19# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20# GNU General Public License for more details.
21
22# You should have received a copy of the GNU General Public License
23# along with this program; if not, write to the Free Software
24# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25# 02111-1307, USA.
26
27BEGIN
28{
29  my $datadir = $ENV{'autom4te_perllibdir'} || '@autom4te_perllibdir@';
30#  '/home/kergoth/code/build-arm/tmp/staging/share/autoconf';
31  unshift @INC, $datadir;
32
33  # Override SHELL.  On DJGPP SHELL may not be set to a shell
34  # that can handle redirection and quote arguments correctly,
35  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
36  # has detected.
37  $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos');
38}
39
40use Autom4te::ChannelDefs;
41use Autom4te::Channels;
42use Autom4te::Configure_ac;
43use Autom4te::FileUtils;
44use Autom4te::General;
45use Autom4te::XFile;
46# Do not use Cwd::chdir, since it might hang.
47use Cwd 'cwd';
48use strict;
49
50## ----------- ##
51## Variables.  ##
52## ----------- ##
53
54# $HELP
55# -----
56$help = "Usage: $0 [OPTION] ... [CONFIGURE-AC or DIRECTORY] ...
57
58Install the GNU config.sub and config.guess scripts in the
59DIRECTORIES or the directory trees driven by CONFIGURE-AC
60(defaulting to `.').
61
62Operation modes:
63  -h, --help               print this help, then exit
64  -V, --version            print version number, then exit
65  -v, --verbose            verbosely report processing
66  -f, --force              consider all files obsolete
67  -s, --symlink            install symbolic links instead of copies
68  -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [syntax]
69
70" . Autom4te::ChannelDefs::usage . "
71
72The environment variable \`WARNINGS\' is honored.  Some subtools might
73support other warning types, using \`all' is encouraged.
74";
75
76# $VERSION
77# --------
78$version = "gnu-configize 1.0
79
80Copyright (C) 2004 Chris Larson
81This is free software; see the source for copying conditions.  There is NO
82warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
83";
84
85my $configdir  = '@gnu-configdir@';
86#'/home/kergoth/code/build-arm/tmp/staging/i686-linux/share/gnu-config';
87my $autoconf   = $ENV{'AUTOCONF'}     || 'autoconf';
88
89# use symlinks instead.
90my $symlink = 0;
91
92my $configure_ac;
93
94my $rm = "rm -f";
95my $ln_s = "ln -sf";
96my $cp = "cp -f";
97my $mkdir = "mkdir";
98my $chmod = "chmod";
99
100## ---------- ##
101## Routines.  ##
102## ---------- ##
103
104
105# parse_args ()
106# -------------
107# Process any command line arguments.
108sub parse_args ()
109{
110  my $srcdir;
111
112  getopt ('s|symlink'            => \$symlink);
113
114  # Even if the user specified a configure.ac, trim to get the
115  # directory, and look for configure.ac again.  Because (i) the code
116  # is simpler, and (ii) we are still able to diagnose simultaneous
117  # presence of configure.ac and configure.in.
118  @ARGV = map { /configure\.(ac|in)$/ ? dirname ($_) : $_ } @ARGV;
119  push @ARGV, '.' unless @ARGV;
120}
121
122
123# &gnu_configize_current_directory
124# -----------------------------
125sub gnu_configize_current_directory ()
126{
127  my $configure_ac = require_configure_ac;
128
129  # ---------------------- #
130  # Is it using Autoconf?  #
131  # ---------------------- #
132
133  my $uses_autoconf;
134  my $uses_gettext;
135  my $configure_ac_file = new Autom4te::XFile $configure_ac;
136  while ($_ = $configure_ac_file->getline)
137     {
138       s/#.*//;
139       s/dnl.*//;
140       $uses_autoconf = 1 if /AC_INIT/;
141     }
142
143  if (!$uses_autoconf)
144    {
145      verb "$configure_ac: not using Autoconf";
146      return;
147    }
148
149  my $aux_dir;
150  my @subdir;
151  my $cmd;
152  my $dest;
153
154  verb "$configure_ac: tracing";
155  my $traces = new Autom4te::XFile
156    ("$autoconf"
157     . join (' --trace=', '',
158	     # If you change this list, update the
159	     # `Autoreconf-preselections' section of autom4te.in.
160	     'AC_CONFIG_AUX_DIR:AC_CONFIG_AUX_DIR:\$1',
161	     'AC_CONFIG_SUBDIRS:AC_CONFIG_SUBDIRS:\$1',
162	     'AC_INIT',
163	    )
164     . ' |');
165  while ($_ = $traces->getline)
166    {
167      $aux_dir = $1                 if /AC_CONFIG_AUX_DIR:(.*)/;
168      $uses_autoconf = 1            if /AC_INIT/;
169      push @subdir, split (' ', $1) if /AC_CONFIG_SUBDIRS:(.*)/;
170    }
171
172  # The subdirs are *optional*, they may not exist.
173  foreach (@subdir)
174    {
175      if (-d)
176	{
177	  verb "$configure_ac: subdirectory $_ to gnu-configize";
178	  gnu_configize ($_);
179	}
180      else
181	{
182	  verb "$configure_ac: subdirectory $_ not present";
183	}
184    }
185
186  $dest = ".";
187
188  if (defined $aux_dir)
189    {
190      $dest = $aux_dir;
191      if (! -d $aux_dir)
192        {
193          verb "$configure_ac: creating directory $aux_dir";
194          mkdir $aux_dir
195            or error "cannot create $aux_dir: $!";
196        }
197    }
198
199  if (!$symlink)
200    {
201      $cmd = $cp;
202    }
203  else
204    {
205      $cmd = $ln_s;
206    }
207
208  xsystem ("$cmd $configdir/config.guess $dest/");
209  xsystem ("$chmod u+x $dest/config.guess");
210  xsystem ("$cmd $configdir/config.sub $dest/");
211  xsystem ("$chmod u+x $dest/config.sub");
212}
213
214
215# &gnu_configize ($DIRECTORY)
216# ------------------------
217# Reconf the $DIRECTORY.
218sub gnu_configize ($)
219{
220  my ($directory) = @_;
221  my $cwd = cwd;
222
223  # The format for this message is not free: taken from Emacs, itself
224  # using GNU Make's format.
225  verb "Entering directory `$directory'";
226  chdir $directory
227    or error "cannot chdir to $directory: $!";
228
229  gnu_configize_current_directory;
230
231  # The format is not free: taken from Emacs, itself using GNU Make's
232  # format.
233  verb "Leaving directory `$directory'";
234  chdir $cwd
235    or error "cannot chdir to $cwd: $!";
236}
237
238
239## ------ ##
240## Main.  ##
241## ------ ##
242
243parse_args;
244
245# Autoreconf all the given configure.ac.  A while loop, not a for,
246# since the list can change at runtime because of AC_CONFIG_SUBDIRS.
247for my $directory (@ARGV)
248  {
249    gnu_configize ($directory);
250  }
251
252### Setup "GNU" style for perl-mode and cperl-mode.
253## Local Variables:
254## perl-indent-level: 2
255## perl-continued-statement-offset: 2
256## perl-continued-brace-offset: 0
257## perl-brace-offset: 0
258## perl-brace-imaginary-offset: 0
259## perl-label-offset: -2
260## cperl-indent-level: 2
261## cperl-brace-offset: 0
262## cperl-continued-brace-offset: 0
263## cperl-label-offset: -2
264## cperl-extra-newline-before-brace: t
265## cperl-merge-trailing-else: nil
266## cperl-continued-statement-offset: 2
267## End:
268