git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@1078 379699f6-c40d-0410-875b-85095c16579ebranch_1_1
parent
12ca9d7b09
commit
ec599fb69b
@ -0,0 +1,140 @@ |
|||||||
|
#!@PERL@ -s -w |
||||||
|
# |
||||||
|
# javaDependencies Copyright (C) 1999 Jochen Hoenicke. |
||||||
|
# |
||||||
|
# This program is free software; you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation; either version 2, or (at your option) |
||||||
|
# any later version. |
||||||
|
# |
||||||
|
# This program is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with this program; see the file COPYING. If not, write to |
||||||
|
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
||||||
|
# |
||||||
|
# $Id$ |
||||||
|
|
||||||
|
# This scripts create Makefile dependencies out of class files. It |
||||||
|
# simply scans the constant pool of the class files, finding all |
||||||
|
# references to other classes and adding a dependency to that class. |
||||||
|
# |
||||||
|
# It doesn't do a perfect job, since it can't handle dependencies to |
||||||
|
# constant values in different classes: The compiler inlines the |
||||||
|
# constant and thus doesn't include a reference to the class. |
||||||
|
# |
||||||
|
# Usage: |
||||||
|
# javaDependencies.pl -classpath <cp> [-dependdir <depdir>] <classfile> |
||||||
|
# |
||||||
|
# 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 |
||||||
|
# dependencies, not the path where the java files were found. |
||||||
|
# useful, if you want to make use of VPATH settings in Makefile. |
||||||
|
# class: The class file (not an inner class) for which the dependencies |
||||||
|
# should be generated. We will also look for inner and anon |
||||||
|
# classes. |
||||||
|
|
||||||
|
my $buff; |
||||||
|
|
||||||
|
sub readUTF { |
||||||
|
read FILE, $buff, 2 or die "Can't read UTF8 length"; |
||||||
|
my $ulength = unpack("n", $buff) & 0xffff; |
||||||
|
return "" if $ulength == 0; |
||||||
|
read FILE, $buff, $ulength or die "Can't read UTF8 string $ulength"; |
||||||
|
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; |
||||||
|
|
||||||
|
read FILE, $buff, 8 or die "Can't read header"; |
||||||
|
my ($magic, $minor, $major) = unpack("Nnn", $buff); |
||||||
|
|
||||||
|
die "Wrong magic $magic" if $magic != 0xcafebabe; |
||||||
|
die "Wrong minor $minor" if $minor > 3; |
||||||
|
die "Wrong minor $major" if $major != 45; |
||||||
|
|
||||||
|
read FILE, $buff, 2 or die "Can't read cpool length"; |
||||||
|
|
||||||
|
|
||||||
|
my ($length) = unpack("n", $buff) & 0xffff; |
||||||
|
|
||||||
|
my $number; |
||||||
|
my @strings = (); |
||||||
|
my @clazzes; |
||||||
|
for ($number = 1; $number < $length; $number++) { |
||||||
|
|
||||||
|
read FILE, $buff, 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 |
||||||
|
read FILE, $buff, 4; |
||||||
|
last tags; |
||||||
|
}; |
||||||
|
|
||||||
|
/^(5|6)$/ && do { |
||||||
|
# LONG, DOUBLE |
||||||
|
read FILE, $buff, 8; |
||||||
|
$number++; |
||||||
|
last tags; |
||||||
|
}; |
||||||
|
|
||||||
|
/^7$/ && do { |
||||||
|
# CLASS |
||||||
|
read FILE, $buff, 2; |
||||||
|
push @clazzes, (unpack("n", $buff) & 0xffff); |
||||||
|
last tags; |
||||||
|
}; |
||||||
|
|
||||||
|
/^8$/ && do { |
||||||
|
# STRING |
||||||
|
read FILE, $buff, 2; |
||||||
|
last tags; |
||||||
|
}; |
||||||
|
die "Unknown tag: $tag, $number/$length, $filename"; |
||||||
|
} |
||||||
|
#print STDERR "\n"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
my @deplist = (); |
||||||
|
clazz: |
||||||
|
for $c (@clazzes) { |
||||||
|
$clzz = $strings[$c]; |
||||||
|
next if $clzz =~ /^\[/; |
||||||
|
next if defined $done{"$clzz"}; |
||||||
|
$done{$clzz} = 1; |
||||||
|
|
||||||
|
for $p (split ':', $classpath) { |
||||||
|
if (-e "$p/$clzz.java") { |
||||||
|
push @deplist, (defined $dependdir |
||||||
|
? "$dependdir/$clzz.java" |
||||||
|
: "$p/$clzz.java"); |
||||||
|
next clazz; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
if (@deplist) { |
||||||
|
print "# Dependencies of $filename\n"; |
||||||
|
print "$clazz: ". join (" ", @deplist) . "\n"; |
||||||
|
} |
||||||
|
} |
@ -1,15 +0,0 @@ |
|||||||
#!/bin/sh |
|
||||||
JAVAC=@JAVAC@ |
|
||||||
JIKES=@JIKES@ |
|
||||||
PERL=@PERL@ |
|
||||||
|
|
||||||
abs_top_builddir=`cd $top_builddir; pwd` |
|
||||||
abs_top_srcdir=`cd $top_srcdir; pwd` |
|
||||||
if [ "$JAVAC" = "$JIKES" -a -n "$PERL" ]; then |
|
||||||
TEMPDEPS=`mktemp "deps.XXXXXX"` |
|
||||||
trap "rm $TEMPDEPS" EXIT |
|
||||||
$JAVAC +M=$TEMPDEPS $* |
|
||||||
sort $TEMPDEPS | $PERL -ne 's"^(\Q'$top_srcdir'\E|\Q'$top_builddir'\E)"'$abs_top_builddir'"; s": \Q'$top_srcdir'\E": '$abs_top_srcdir'"; s": \Q'$top_builddir'\E": '$abs_top_builddir'"; m"(\Q'$abs_top_builddir'\E[^\.:]+)\.class: [^\.]*.java$" or next; if ($1 ne $last) { $last = $1; open DEP, ">$1.u" }; print DEP $_' |
|
||||||
else |
|
||||||
$JAVAC $* |
|
||||||
fi |
|
Loading…
Reference in new issue