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=":" if (IFS=":"
clazz=`echo $1 | sed -e 's/\./\//g' -e 's/\(.*\)/\1.class/'` clazz=`echo $1 | sed -e 's/\./\//g' -e 's/\(.*\)/\1.class/'`
jode_found=0 jode_found=0
for path in $2; do myclasspath=$2;
for path in $myclasspath; do
if test -d $path; then if test -d $path; then
if test -e $path/$clazz; then if test -e $path/$clazz; then
exit 0 exit 0
fi fi
elif $UNZIP -v -C $path $clazz &>/dev/null ; then elif $UNZIP -v -C `$SUBSTCP $path` $clazz &>/dev/null ; then
exit 0 exit 0
fi fi
done; done;

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

Loading…
Cancel
Save