summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/lib/mkdep.pl.in
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/lib/mkdep.pl.in')
-rwxr-xr-xlibjava/classpath/lib/mkdep.pl.in336
1 files changed, 336 insertions, 0 deletions
diff --git a/libjava/classpath/lib/mkdep.pl.in b/libjava/classpath/lib/mkdep.pl.in
new file mode 100755
index 00000000000..b30fd7ae974
--- /dev/null
+++ b/libjava/classpath/lib/mkdep.pl.in
@@ -0,0 +1,336 @@
+#!@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);
+ }
+ }
+}
+
OpenPOWER on IntegriCloud