97b8365caf
From-SVN: r120621
337 lines
8.3 KiB
Perl
Executable File
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);
|
|
}
|
|
}
|
|
}
|
|
|