www.pudn.com > raine.rar > makedep
#!/usr/bin/perl -w
# A faster version than the bash thing...
# it shouldn't be to hard to do !!!
# See the makefile for how to call it
use IO::File;
use strict;
my %hash = ();
my %processed = ();
my @incdir =
qw(source source/mame source/68000 source/68020 source/z80 source/6502
source/m68705 source/sound source/games source/video source/gui
source/video/i386);
sub myopen($) {
my $name = shift;
my $f = new IO::File;
if ($name =~ /^object/) { # passed an object
my $objname = $name; # We want to return this when we get an object
$objname =~ s/object/\$\(OBJDIR\)/;
$name =~ s/^object\/(.+)\..+/source\/$1\.c/;
if ($f->open($name)) {
return ($f,$objname);
} else {
# This is the only case where we are not sure about extension...
my $name2 = $name;
$name2 =~ s/\.c/\.s/;
return ($f,$objname) if ($f->open($name2)); # Try asm .s
$name2 =~ s/\.s/\.asm/;
return ($f,$objname) if ($f->open($name2)); # Try asm .asm
}
}
$name =~ s/.+\/(.+)/$1/; # Without dir
for (my $n=0; $n<=$#incdir; $n++) {
my $name2 = $incdir[$n]."/$name";
if ($f->open($name2)) {
return ($f,$name2);
}
}
return undef;
}
sub process_file {
my $fich0 = shift;
my $f;
my $fich = $fich0;
my %newfiles = ();
my $fich2;
return "source/games/driver.c" if ($fich eq "driver.c");
($f,$fich) = myopen("$fich");
if (!$f) {
print STDERR "File not found : $fich0\n";
return "";
}
return $fich if ($hash{$fich}); # Already done ?
if ($processed{$fich}) { # means that we loop in recursion !
return $fich;
} else {
$processed{$fich} = 1;
}
while (<$f>) {
if (/\#include[ \t]*\"(.+?)\"/) {
my $res = $1;
my $newincs = process_file($res);
# $newincs = $res if (!$newincs); # as a minimum...
$newfiles{$newincs} = 1; # No recursion, just add 1st level...
}
}
$f->close();
$hash{$fich} = join(" ",keys %newfiles);
return $fich;
}
while ((my $name = shift)) {
process_file($name);
}
my $name;
# Pre-process include files...
# We are forced to do it because clearly make does not make recursion...
print "# Included files\n\n";
foreach $name (sort { $b cmp $a } keys %hash) {
if ($name =~ /^source/) { # This file is included -> change it !
my ($name2) = ($name =~ /.+\/(.+)/); # Only filename
$name2 =~ s/\./_/g;
my $namer = $name; # Suitable form for replace
$namer =~ s/\//\\\//g;
foreach my $key (keys %hash) { # Replace in the hash with our new name
while ($hash{$key} =~ s/$namer/\$\($name2\)/g) {};
}
print "$name2 = $name $hash{$name}\n";
delete $hash{$name};
}
}
print "\n# Object files\n\n";
foreach $name (sort { $b cmp $a } keys %hash) {
if (!($hash{$name} =~ /^ *$/)) {
print "$name: ",$hash{$name},"\n";
}
}