OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [libjava/] [classpath/] [lib/] [mkdep.pl.in] - Rev 14

Compare with Previous | Blame | View Log

#!@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);
      }
    }
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.