gcc/libjava/classpath/lib/mkdep.pl.in
Tom Tromey 97b8365caf Merged gcj-eclipse branch to trunk.
From-SVN: r120621
2007-01-09 19:58:05 +00:00

337 lines
8.3 KiB
Perl
Executable File

#!@PERL@
#
# Create a dependency file for use with make that will
# a) not have duplicate entries
# b) not include the source of a file as a dependency to separate file,
# just the class of the file
# c) use jikes .u files
# d) includes classes which need native compilation via simple parsing
# to find native methods requiring use of javah
use strict;
my ( $dir, $dep ) = "";
my @dirs = ( 'java', 'javax', 'gnu' );
my ( $depout ) = "makefile.dep";
my ( $classout ) = "classes.dep";
my ( $headerout ) = "headers.dep";
my ( $javaout ) = "java.dep";
my @deps = ();
my @natives = ();
use vars qw ( $classout $headerout @dirs @deps @natives $dir $dep $depout );
# main
{
if ($#ARGV == 0)
{
if ($ARGV[0] =~ /^-h/)
{
findNativeFiles();
writeNativeFile();
}
elsif ($ARGV[0] =~ /^-d/)
{
foreach $dir (@dirs)
{
# find all .u files recursively and parse'm
findDepFiles($dir);
}
writeDepFile();
}
elsif ($ARGV[0] =~ /^-c/)
{
findClassFiles();
writeClassFile();
}
elsif ($ARGV[0] =~ /^-j/)
{
findJavaFiles();
writeJavaFile();
}
}
else
{
print "Usage:\n";
print "mkdep.pl -h \tfor header files\n";
print "mkdep.pl -c \tfor a list of classes\n";
print "mkdep.pl -j \tfor a list of java files\n";
print "mkdep.pl -d \tfor dependency generation from jikes .u files\n";
}
}
sub writeNativeFile
{
my ($i, $j, $k, $l) = "";
my $top_srcdir = "../";
if (defined $ENV{'top_srcdir'}) {
$top_srcdir = $ENV{'top_srcdir'};
}
my $top_srcdir_regex = $top_srcdir;
if ($top_srcdir_regex !~ /.*\/$/) {
$top_srcdir_regex .= '/';
}
$top_srcdir_regex =~ s/\./\\\./g; # replace . with \.
$top_srcdir_regex =~ s/\//\\\//g; # replace / with \/
# print "regex is $top_srcdir_regex\n";
open(MAKEDEP, ">$headerout") || die "Could not open file ", $headerout;
# the HEADERS = ... stuff
if ($#natives > -1)
{
print MAKEDEP "CP_HEADERS = \\", "\n";
foreach $i (0 .. $#natives-1)
{
$j = $natives[$i];
$j =~ s/^$top_srcdir_regex//; # remove ../ or similar
$j =~ s/^(\.\.\/)+//g; # remove all preceding ../
$j =~ s/^vm\/reference\///; # remove vm/reference/
$j =~ s/\//_/g; # replace / with _
$j =~ s/\.java$/\.h/; # replace .java with .h
print MAKEDEP " \$(top_builddir)/include/", $j, " \\", "\n";
}
$j = $natives[$#natives];
$j =~ s/^$top_srcdir_regex//; # remove ../
$j =~ s/^(\.\.\/)+//g; # remove all preceding ../
$j =~ s/^vm\/reference\///; # remove vm/reference/
$j =~ s/\//_/g; # replace / with _
$j =~ s/\.java/\.h/; # replace .java with .h
print MAKEDEP " \$(top_builddir)/include/", $j, "\n\n";
# print rules to make .h files
# y/x.h : z/x.class
# y/x.h : ../z/x.java
# javah -jni z.x
# mv y_x.h $(top_srcdir)/include
# j = y/x.h
# k = z/x.class
# k = ../z/x.java
# l = z.x
foreach $i (0 .. $#natives-1)
{
$j = $natives[$i];
$j =~ s/^$top_srcdir_regex//; # remove ../
$j =~ s/^(\.\.\/)+//g; # remove all preceding ../
$j =~ s/^vm\/reference\///; # remove vm/reference/
# $k = $l = $j;
$l = $j;
$j =~ s/\//_/g; # replace / with _
$j =~ s/\.java$/\.h/; # replace .java with .h
$k = $natives[$i]; # the original .java file
# $k =~ s/\.java$/\.class/; # replace .java with .class
$l =~ s/\.java$//; # remove .class
$l =~ s/\//\./g; # replace / with .
print MAKEDEP "\$(top_builddir)/include/", $j, " : ", $k, "\n";
print MAKEDEP "\t\$(JAVAH) ", $l, "\n";
print MAKEDEP "\tmv ", $j, " \$(top_builddir)/include\n\n";
}
$j = $natives[$#natives];
$j =~ s/^$top_srcdir_regex//; # remove ../
$j =~ s/^(\.\.\/)+//g; # remove all preceding ../
$j =~ s/^vm\/reference\///; # remove vm/reference/
# $k = $l = $j;
$l = $j;
$j =~ s/\//_/g; # replace / with _
$j =~ s/\.java/\.h/; # replace .java with .h
$k = $natives[$#natives]; # the original .java file
# $k =~ s/\.java$/\.class/; # replace .java with .class
$l =~ s/\.java$//; # remove .class
$l =~ s/\//\./g; # replace / with .
print MAKEDEP "\$(top_builddir)/include/", $j, " : ", $k, "\n";
print MAKEDEP "\t\$(JAVAH) ", $l, "\n";
print MAKEDEP "\tmv ", $j, " \$(top_builddir)/include\n\n";
}
close(MAKEDEP);
}
sub writeJavaFile
{
my ($i, $j, $class, $depend, $source, $depend_source) = "";
open(MAKEDEP, ">$javaout") || die "Could not open file ", $classout;
# the JAVA_SRCS = ... stuff
if ($#natives > -1)
{
print MAKEDEP "JAVA_SRCS = \\", "\n";
foreach $i (0 .. $#natives-1)
{
$j = $natives[$i];
print MAKEDEP " ", $j, " \\", "\n";
}
$j = $natives[$#natives];
print MAKEDEP " ", $j, "\n\n";
}
close(MAKEDEP);
}
sub writeClassFile
{
my ($i, $j, $class, $depend, $source, $depend_source) = "";
open(MAKEDEP, ">$classout") || die "Could not open file ", $classout;
# the CLASSES = ... stuff
if ($#natives > -1)
{
print MAKEDEP "CLASSES = \\", "\n";
foreach $i (0 .. $#natives-1)
{
$j = $natives[$i];
$j =~ s/\.java$/\.class/;
print MAKEDEP " ", $j, " \\", "\n";
}
$j = $natives[$#natives];
$j =~ s/\.java$/\.class/;
print MAKEDEP " ", $j, "\n\n";
}
close(MAKEDEP);
}
sub writeDepFile
{
my ($i, $j, $class, $depend, $source, $depend_source) = "";
open(MAKEDEP, ">$depout") || die "Could not open file ", $depout;
# the class dependencies
foreach $i (@deps)
{
open(FILE, "<$i") || die "Could not open file ", $i, "\n";
while(<FILE>)
{
chop;
($class, $depend) = /(.+) : (.+)$/;
$source = $class;
$source =~ s/\.class$/\.java/;
if (($source eq $depend) || ($depend !~ /\.java$/))
{
if ($depend =~ /^\.\.\/.+\.class$/)
{
$depend =~ s/^\.\.\///;
}
if (($depend =~ /\.java$/) && ($depend !~ /^\.\.\//))
{
$depend = "../" . $depend;
}
print MAKEDEP $class, " : ", $depend, "\n";
}
}
print MAKEDEP "\n";
close(FILE);
}
close(MAKEDEP);
}
sub findJavaFiles
{
my ($file) = "";
open(CLASSES, "<classes") || die "Could not open file classes\n";
while(<CLASSES>)
{
chop;
$file = $_;
push @natives, $file;
}
close(CLASSES);
}
sub findClassFiles
{
my ($file) = "";
open(CLASSES, "<classes") || die "Could not open file classes\n";
while(<CLASSES>)
{
chop;
$file = $_;
$file =~ s/^\.\.\///;
push @natives, $file;
}
close(CLASSES);
}
sub findNativeFiles
{
my ($file) = "";
open(CLASSES, "<classes") || die "Could not open file classes\n";
while(<CLASSES>)
{
chop;
$file = $_;
if (hasNativeMethod($file))
{
push @natives, $file;
}
}
close(CLASSES);
}
sub hasNativeMethod
{
my ($file) = @_;
my ($line, $one, $two) = "";
open(FILE, "<$file") || die "Could not open file ", $file, "\n";
while(<FILE>)
{
chop;
$one = $two;
$two = $_;
$line = $one . " " . $two;
if ( ($line =~ /^\s*public\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*public\s.*native\s+\S+\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*protected\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*protected\s.*native\s+\S+\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*private\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*private\s.*native\s+\S+\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*abstract\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*final\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*synchronized\s.*native\s+\S+\s+\S+\s*\(/) ||
($line =~ /^\s*native\s.*/) )
{
close(FILE);
return 1;
}
}
close(FILE);
return 0;
}
sub findDepFiles
{
my ($dir) = @_;
my (@dirs) = ();
my (@local_deps) = ();
my (@entries) = ();
my ($i, $local_dep) = "";
if (opendir(DIR, $dir))
{
@entries = grep(-d "$dir/$_" && !/^\.\.?$/, readdir(DIR));
foreach $i (@entries)
{
push @dirs, "$dir/$i";
}
rewinddir(DIR);
@entries= grep(/\.u$/, readdir(DIR));
closedir(DIR);
foreach $i (@entries)
{
push @local_deps, "$dir/$i";
}
push @deps, @local_deps;
foreach $i (@dirs)
{
findDepFiles($i);
}
}
}