changed dependency generation.

bug fix in package location determination.


git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1162 379699f6-c40d-0410-875b-85095c16579e
branch_1_1
jochen 25 years ago
parent 8eab046f28
commit 6a7b61f3c4
  1. 5
      jode/acinclude.m4
  2. 197
      jode/javaDependencies.pl.in

@ -26,12 +26,13 @@ AC_DEFUN(JODE_CHECK_CLASS,
if (IFS=":"
clazz=`echo $1 | sed -e 's/\./\//g' -e 's/\(.*\)/\1.class/'`
jode_found=0
for path in $2; do
myclasspath=$2;
for path in $myclasspath; do
if test -d $path; then
if test -e $path/$clazz; then
exit 0
fi
elif $UNZIP -v -C $path $clazz &>/dev/null ; then
elif $UNZIP -v -C `$SUBSTCP $path` $clazz &>/dev/null ; then
exit 0
fi
done;

@ -28,7 +28,8 @@
#
# Usage:
# javaDependencies.pl -classpath <cp> [-dependdir <depdir> [-subdir <subdir>]]
# <classfile>
# [-depfile <depfile>]
# <classfiles>
#
# cp: colon separated paths to the java files we should depend on.
# depdir: if set, use this path as path to the java files when printing
@ -36,7 +37,8 @@
# useful, if you want to make use of VPATH settings in Makefile.
# subdir: if set, this is the path from depdir to the current directory.
# Use it to remove unneccessary ../../$subdir/
# class: The class file (not an inner class) for which the dependencies
# depfile: the name of the dependency file, default is "Makefile.dep".
# class: The class files (not inner classes) for which the dependencies
# should be generated. We will also look for inner and anon
# classes.
@ -62,112 +64,121 @@ sub readUTF () {
unpack("a$ulength", $buff);
}
$clazz = pop;
$clazz =~ /(.*)\.class/ or die "not a class file";
$base = $1;
my ($filename, %done);
%done=();
for $filename ($clazz, glob("$base\\\$*.class")) {
open FILE, $filename;
binmode FILE;
$depfile = "Makefile.dep" if (!defined($depfile));
open DEPFILE, ">$depfile";
print DEPFILE <<EOF;
# This dependency file is automatically created by $0 from class files.
# Do not edit.
readInBuff 8 or die "Can't read header";
my ($magic, $minor, $major) = unpack("Nnn", $buff);
EOF
foreach $clazz (@ARGV) {
next if $clazz =~ (/^.*\$.*\.class/);
$clazz =~ /([^\$]*)(\$.*)?\.class/ or die "not a class file";
$base = $1;
my ($filename, %done);
%done=();
for $filename ($clazz, glob("$base\\\$*.class")) {
open FILE, $filename;
binmode FILE;
die "Wrong magic $magic" if $magic != 0xcafebabe;
die "Wrong minor $minor" if $minor > 3;
die "Wrong minor $major" if $major != 45;
readInBuff 2 or die "Can't read cpool length";
my ($length) = unpack("n", $buff) & 0xffff;
readInBuff 8 or die "Can't read header";
my ($magic, $minor, $major) = unpack("Nnn", $buff);
my $number;
my @strings = ();
my @clazzes;
for ($number = 1; $number < $length; $number++) {
die "Wrong magic $magic" if $magic != 0xcafebabe;
die "Wrong minor $minor" if $minor > 3;
die "Wrong minor $major" if $major != 45;
readInBuff 1 or die "Can't read constant tag";
my ($tag) = unpack("C", $buff);
readInBuff 2 or die "Can't read cpool length";
my ($length) = unpack("n", $buff) & 0xffff;
#print STDERR "$number/$length: $tag";
tags:
for ($tag) {
/^1$/ && do {
# UTF 8
$strings[$number] = &readUTF();
#print STDERR ": $strings[$number]";
last tags;
};
/^(3|4|9|10|11|12)$/ && do {
# INTEGER, FLOAT, FIELDREF, METHODREF, IFACEREF, NAMEANDTYPE
readInBuff 4;
last tags;
};
my $number;
my @strings = ();
my @clazzes;
for ($number = 1; $number < $length; $number++) {
/^(5|6)$/ && do {
# LONG, DOUBLE
readInBuff 8;
$number++;
last tags;
};
/^7$/ && do {
# CLASS
readInBuff 2;
push @clazzes, (unpack("n", $buff) & 0xffff);
last tags;
};
/^8$/ && do {
# STRING
readInBuff 2;
last tags;
};
die "Unknown tag: $tag, $number/$length, $filename";
readInBuff 1 or die "Can't read constant tag";
my ($tag) = unpack("C", $buff);
#print STDERR "$number/$length: $tag";
tags:
for ($tag) {
/^1$/ && do {
# UTF 8
$strings[$number] = &readUTF();
#print STDERR ": $strings[$number]";
last tags;
};
/^(3|4|9|10|11|12)$/ && do {
# INTEGER, FLOAT, FIELDREF, METHODREF, IFACEREF, NAMEANDTYPE
readInBuff 4;
last tags;
};
/^(5|6)$/ && do {
# LONG, DOUBLE
readInBuff 8;
$number++;
last tags;
};
/^7$/ && do {
# CLASS
readInBuff 2;
push @clazzes, (unpack("n", $buff) & 0xffff);
last tags;
};
/^8$/ && do {
# STRING
readInBuff 2;
last tags;
};
die "Unknown tag: $tag, $number/$length, $filename";
}
#print STDERR "\n";
}
#print STDERR "\n";
}
my @deplist = ();
clazz:
for $c (@clazzes) {
$clzz = $strings[$c];
next if $clzz =~ /^\[/;
next if defined $done{"$clzz"};
$done{$clzz} = 1;
my @deplist = ();
clazz:
for $c (@clazzes) {
$clzz = $strings[$c];
next if $clzz =~ /^\[/;
next if defined $done{"$clzz"};
$done{$clzz} = 1;
my $p;
for $p (split ':', $classpath) {
if (-e "$p/$clzz.java") {
my $path="$p/";
if (defined $dependdir) {
$path = "$dependdir/";
if (defined $subdir) {
my $currsubdir = "$subdir/";
while ($currsubdir =~ m<^([A-Za-z0-9]+)/+(.*)>) {
$currsubdir = $2;
my $firstcomp = $1;
if ($clzz =~ m<$firstcomp/(.*)>) {
my $remain = $1;
if ($path =~ m<^(|.*/)\.\./+$>) {
$path = $1;
$clzz = $remain;
my $p;
for $p (split ':', $classpath) {
if (-e "$p/$clzz.java") {
my $path="$p/";
if (defined $dependdir) {
$path = "$dependdir/";
if (defined $subdir) {
my $currsubdir = "$subdir/";
while ($currsubdir =~ m<^([A-Za-z0-9]+)/+(.*)>) {
$currsubdir = $2;
my $firstcomp = $1;
if ($clzz =~ m<$firstcomp/(.*)>) {
my $remain = $1;
if ($path =~ m<^(|.*/)\.\./+$>) {
$path = $1;
$clzz = $remain;
}
}
}
}
}
push @deplist, "$path$clzz.java";
next clazz;
}
push @deplist, "$path$clzz.java";
next clazz;
}
}
}
if (@deplist) {
print "# Dependencies of $filename\n";
print "$clazz: " . join (" ", @deplist) . "\n";
if (@deplist) {
print DEPFILE "$clazz: " . join (" ", @deplist) . "\n";
}
}
}
close DEPFILE;

Loading…
Cancel
Save