summaryrefslogtreecommitdiff
path: root/mcon/pl/wanted.pl
diff options
context:
space:
mode:
authorrmanfredi <rmanfredi@190e5f8e-a817-0410-acf6-e9863daed9af>2006-08-24 12:32:52 +0000
committerrmanfredi <rmanfredi@190e5f8e-a817-0410-acf6-e9863daed9af>2006-08-24 12:32:52 +0000
commit8bfc5756fb68e0b13d7e7c0073ad5b9a4790d1b6 (patch)
treedee05e98bc53766d609ef2a3a07a5672627d812c /mcon/pl/wanted.pl
Moving project to sourceforge.
git-svn-id: https://dist.svn.sourceforge.net/svnroot/dist/trunk/dist@1 190e5f8e-a817-0410-acf6-e9863daed9af
Diffstat (limited to 'mcon/pl/wanted.pl')
-rw-r--r--mcon/pl/wanted.pl263
1 files changed, 263 insertions, 0 deletions
diff --git a/mcon/pl/wanted.pl b/mcon/pl/wanted.pl
new file mode 100644
index 0000000..20d218c
--- /dev/null
+++ b/mcon/pl/wanted.pl
@@ -0,0 +1,263 @@
+;# $Id$
+;#
+;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
+;#
+;# You may redistribute only under the terms of the Artistic Licence,
+;# as specified in the README file that comes with the distribution.
+;# You may reuse parts of this distribution only within the terms of
+;# that same Artistic Licence; a copy of which may be found at the root
+;# of the source tree for dist 4.0.
+;#
+;# $Log: wanted.pl,v $
+;# Revision 3.0.1.2 1995/01/11 15:42:37 ram
+;# patch45: added % in front of hash table names for perl5's each() (ADO)
+;# patch45: tell users about possible extra file-extension lookups
+;#
+;# Revision 3.0.1.1 1993/10/16 13:56:05 ram
+;# patch12: modified to handle ?M: lines
+;# patch12: added warning when magic symbols used without proper config
+;#
+;# Revision 3.0 1993/08/18 12:10:29 ram
+;# Baseline for dist 3.0 netwide release.
+;#
+;#
+;# These two arrays record the file names of the files which may (or may not)
+;# contain shell or C symbols known by metaconfig.
+;# @SHlist records the .SH files
+;# @clist records the C-like files (i.e. .[chyl])
+;#
+;# These files are scanned in turn to see how many symbols known by metaconfig
+;# they have. Those symbols are gathered in a Wanted file. As C symbols are
+;# not true targets for the forthcoming Makefile, a ">" sign is prepended.
+;# Finally, the obsolete symbols are preceded by a "!".
+;#
+;# When obsolete symbols are found, they are dumped in file 'Obsolete'. Two
+;# files are created anyway in the .MT directory. Obsol_h.U and Obsol_sh.U which
+;# respectively list the obsoleted symbols (C and shell ones).
+;# Obsol_h.U records obsolete C symbols
+;# Obsol_sh.U records obsolete shell symbols
+;#
+;# The manifake() routine has to be provided externally.
+;#
+# Build a wanted file from the files held in @SHlist and @clist arrays
+sub build_wanted {
+ # If wanted file is already there, parse it to map obsolete if -o option
+ # was used. Otherwise, build a new one.
+ if (-f 'Wanted') {
+ &map_obsolete if $opt_o; # Build Obsol*.U files
+ &dump_obsolete; # Dump obsolete symbols if any
+ return;
+ }
+ &parse_files;
+}
+
+sub parse_files {
+ print "Building a Wanted file...\n" unless $opt_s;
+ open(WANTED,"| sort | uniq >Wanted") || die "Can't create Wanted.\n";
+ unless (-f $NEWMANI) {
+ &manifake;
+ die "No $NEWMANI--can't build a Wanted file.\n" unless -f $NEWMANI;
+ }
+
+ local($search); # Where to-be-evaled script is held
+ local($_) = ' ' x 50000 if $opt_m; # Pre-extend pattern search space
+ local(%visited); # Records visited files
+ local(%lastfound); # Where last occurence of key was
+
+ # Now we are a little clever, and build a loop to eval so that we don't
+ # have to recompile our patterns on every file. We also use "study" since
+ # we are searching the same string for many different things. Hauls!
+
+ if (@clist) {
+ local($others) = $cext ? " $cext" : '';
+ print " Scanning .[chyl]$others files for symbols...\n"
+ unless $opt_s;
+ $search = ' ' x (40 * (@cmaster + @ocmaster)); # Pre-extend
+ $search = "while (<>) {study;\n"; # Init loop over ARGV
+ foreach $key (keys(%cmaster)) {
+ $search .= "&cmaster('$key') if /\\b$key\\b/;\n";
+ }
+ foreach $key (grep(!/^\$/, keys %Obsolete)) {
+ $search .= "&ofound('$key') if /\\b$key\\b/;\n";
+ }
+ $search .= "}\n"; # terminate loop
+ print $search if $opt_d;
+ @ARGV = @clist;
+ # Swallow each file as a whole, if memory is available
+ undef $/ if $opt_m;
+ eval $search;
+ eval '';
+ $/ = "\n";
+ while (($key,$value) = each(%cmaster)) {
+ print WANTED $cwanted{$key}, "\n", ">$key", "\n" if $value;
+ }
+ }
+
+ # If they don't use magic but use magically guarded symbols without
+ # their corresponding C symbol dependency, warn them, since they might
+ # not know about that portability issue.
+
+ if (@clist && !$opt_M) {
+ local($nused); # list of non-used symbols
+ local($warning) = 0; # true when one warning issued
+ foreach $cmag (keys %mwanted) { # loop over all used magic symbols
+ next unless $cmaster{$cmag};
+ $nused = '';
+ foreach $cdep (split(' ', $mwanted{$cmag})) {
+ $nused .= " $cdep" unless $cmaster{$cdep};
+ }
+ $nused =~ s/^ //;
+ $nused = "one of " . $nused if $nused =~ s/ /, /g;
+ if ($nused ne '') {
+ print " Warning: $cmag is used without $nused.\n";
+ $warning++;
+ }
+ }
+ if ($warning) {
+ local($those) = $warning == 1 ? 'that' : 'those';
+ local($s) = $warning == 1 ? '' : 's';
+ print "Note: $those previous warning$s may be suppressed by -M.\n";
+ }
+ }
+
+ # Cannot remove $cmaster as it is used later on when building Configure
+ undef @clist;
+ undef %cwanted;
+ undef %mwanted;
+ %visited = ();
+ %lastfound = ();
+
+ if (@SHlist) {
+ local($others) = $shext ? " $shext" : '';
+ print " Scanning .SH$others files for symbols...\n" unless $opt_s;
+ $search = ' ' x (40 * (@shmaster + @oshmaster)); # Pre-extend
+ $search = "while (<>) {study;\n";
+ # All the keys already have a leading '$'
+ foreach $key (keys(%shmaster)) {
+ $search .= "&shmaster('$key') if /\\$key\\b/;\n";
+ }
+ foreach $key (grep (/^\$/, keys %Obsolete)) {
+ $search .= "&ofound('$key') if /\\$key\\b/;\n";
+ }
+ $search .= "}\n";
+ print $search if $opt_d;
+ @ARGV = @SHlist;
+ # Swallow each file as a whole, if memory is available
+ undef $/ if $opt_m;
+ eval $search;
+ eval '';
+ $/ = "\n";
+ while (($key,$value) = each(%shmaster)) {
+ if ($value) {
+ $key =~ s/^\$//;
+ print WANTED $key, "\n";
+ }
+ }
+ }
+
+ # Obsolete symbols, if any, are written in the Wanted file preceded by a
+ # '!' character. In case -w is used, we'll thus be able to correctly build
+ # the Obsol_h.U and Obsol_sh.U files.
+
+ &add_obsolete; # Add obsolete symbols in Wanted file
+
+ close WANTED;
+
+ # If obsolete symbols where found, write an Obsolete file which lists where
+ # each of them appear and the new symbol to be used. Also write Obsol_h.U
+ # and Obsol_sh.U in .MT for later perusal.
+
+ &dump_obsolete; # Dump obsolete symbols if any
+
+ die "No desirable symbols found--aborting.\n" unless -s 'Wanted';
+
+ # Clean-up memory by freeing useless data structures
+ undef @SHlist;
+ undef %shmaster;
+}
+
+# This routine records matches of C master keys
+sub cmaster {
+ local($key) = @_;
+ $cmaster{$key}++; # This symbol is wanted
+ return unless $opt_t || $opt_M; # Return if neither -t nor -M
+ if ($opt_t &&
+ $lastfound{$key} ne $ARGV # Never mentionned for this file ?
+ ) {
+ $visited{$ARGV}++ || print $ARGV,":\n";
+ print "\t$key\n";
+ $lastfound{$key} = $ARGV;
+ }
+ if ($opt_M &&
+ defined($mwanted{$key}) # Found a ?M: symbol
+ ) {
+ foreach $csym (split(' ', $mwanted{$key})) {
+ $cmaster{$csym}++; # Activate C symbol dependencies
+ }
+ }
+}
+
+# This routine records matches of obsolete keys (C or shell)
+sub ofound {
+ local($key) = @_;
+ local($_) = $Obsolete{$key}; # Value of new symbol
+ $ofound{"$ARGV $key $_"}++; # Record obsolete match
+ $cmaster{$_}++ unless /^\$/; # A C hit
+ $shmaster{$_}++ if /^\$/; # Or a shell one
+ return unless $opt_t; # Continue if trace option on
+ if ($lastfound{$key} ne $ARGV) { # Never mentionned for this file ?
+ $visited{$ARGV}++ || print $ARGV,":\n";
+ print "\t$key (obsolete, use $_)\n";
+ $lastfound{$key} = $ARGV;
+ }
+}
+
+# This routine records matches of shell master keys
+sub shmaster {
+ local($key) = @_;
+ $shmaster{$key}++; # This symbol is wanted
+ return unless $opt_t; # Continue if trace option on
+ if ($lastfound{$key} ne $ARGV) { # Never mentionned for this file ?
+ $visited{$ARGV}++ || print $ARGV,":\n";
+ print "\t$key\n";
+ $lastfound{$key} = $ARGV;
+ }
+}
+
+# Write obsolete symbols into the Wanted file for later perusal by -w.
+sub add_obsolete {
+ local($file); # File where obsolete symbol was found
+ local($old); # Name of this old symbol
+ local($new); # Value of the new symbol to be used
+ foreach $key (sort keys %ofound) {
+ ($file, $old, $new) = ($key =~ /^(\S+)\s+(\S+)\s+(\S+)/);
+ if ($new =~ s/^\$//) { # We found an obsolete shell symbol
+ print WANTED "!$old\n";
+ } else { # We found an obsolete C symbol
+ print WANTED "!>$old\n";
+ }
+ }
+}
+
+# Map obsolete symbols from Wanted file into %Obsolete and call dump_obsolete
+# to actually build the Obsol_sh.U and Obsol_h.U files. Those will be needed
+# during the Configure building phase to actually do the remaping.
+# The obsolete symbols found are entered in the %ofound array, tagged as from
+# file 'XXX', which is specially recognized by dump_obsolete.
+sub map_obsolete {
+ open(WANTED, 'Wanted') || die "Can't open Wanted file.\n";
+ local($new); # New symbol to be used instead of obsolete one
+ while (<WANTED>) {
+ chop;
+ next unless s/^!//; # Skip non-obsolete symbols
+ if (s/^>//) { # C symbol
+ $new = $Obsolete{$_}; # Fetch new symbol
+ $ofound{"XXX $_ $new"}++; # Record obsolete match (XXX = no file)
+ } else { # Shell symbol
+ $new = $Obsolete{"\$$_"}; # Fetch new symbol
+ $ofound{"XXX \$$_ $new"}++; # Record obsolete match (XXX = no file)
+ }
+ }
+ close WANTED;
+}
+