1
1
openmpi/contrib/code_counter.pl
2015-06-23 20:59:57 -07:00

191 строка
4.8 KiB
Perl
Исполняемый файл

#!/usr/bin/env perl
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
# of Tennessee Research Foundation. All rights
# reserved.
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2006 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# Primitive script to give approximate code counts in the Open MPI tree
#
use strict;
use File::Find;
use File::stat;
use Cwd;
# Setup some directories
my $verbose = 0;
my @skip_dirs;
my @code_dirs = ( "ompi", "orte", "opal", "test" );
my @doc_dirs = ( );
my @meta_dirs = ( ".svn", ".deps", ".libs", "libltdl" );
my @skip_files = ( "Makefile.in", "Makefile", ".ompi_built" , "config.cache",
"libtool", "depcomp", "aclocal.m4", "install-sh",
"missing", "mkinstalldirs", "compile", "config.sub",
"config.guess", "config.log", "config.status",
"TAGS", ".", "configure", "ltmain.sh",
"ChangeLog");
my @skip_patterns = ( ".o\$", ".lo\$", ".out\$", "autom4te", ".in\$",
".bak\$", "~\$", ".gz\$", "^stamp-", "^.#", "^#.+#\$",
"dynamic-mca" );
my $loc = 0;
# Primitive check to find the top OMPI dir
my @tlds = @code_dirs;
for (my $i = 0; $i <= $#doc_dirs; ++$i) {
$tlds[$#tlds + 1] = $doc_dirs[$i];
}
my $good = 0;
do {
$good = 1;
for (my $i = 0; $i <= $#tlds; ++$i) {
if (! -d $tlds[$i]) {
$good = 0;
last;
}
}
if (!$good) {
chdir("..");
my $dir = getcwd();
if ($dir eq "/") {
print("Unable to find Open MPI top dir; aborting\n");
exit(1);
}
}
} while ($good != 1);
# Found top dir
print("Found top Open MPI directory: " . getcwd() . "\n");
# Now count up code
my %files_found;
my %dirs_found;
sub wanted {
# Setup
my $file = $_;
my @dirnames = split('/', $File::Find::dir);
my $dir = $dirnames[$#dirnames];
# Is the file a dir?
my $is_dir = (-d $file);
# Do we want this dir?
for (my $i = 0; $i <= $#skip_dirs; ++$i) {
if ($skip_dirs[$i] eq $dir ||
($is_dir && $skip_dirs[$i] eq $file)) {
print("Skipping dir: $File::Find::dir / $file\n")
if ($verbose);
$File::Find::prune = 1;
return 0;
}
}
# Do we want this file?
for (my $i = 0; $i <= $#skip_files; ++$i) {
if ($skip_files[$i] eq $file) {
return 0;
}
}
for (my $i = 0; $i <= $#skip_patterns; ++$i) {
$file;
if (/$skip_patterns[$i]/) {
print("Skipping file pattern: $File::Find::dir/$file\n")
if ($verbose);
$File::Find::prune = 1
if ($is_dir);
return 0;
}
}
if ($is_dir) {
print ("Found dir: $File::Find::dir/$file\n")
if ($verbose);
} else {
$files_found{$File::Find::name} = 1;
print ("Found file: $File::Find::name\n")
if ($verbose);
# Count the \n's
my $sb = stat($file) || die "Can't stat $File::Find::name -- $!";
open FILE, $file || die "Can't open $File::Find::name";
my $data;
my $size = $sb->size;
sysread(FILE, $data, $size);
close FILE;
# Cool. :-)
my $local_loc = 0;
$data =~ s/(\n)/$local_loc++;$1/eg;
$loc += $local_loc;
print "Loc: $File::Find::name / $size / $local_loc / $loc\n"
if ($verbose);
}
$dirs_found{$File::Find::dir} = 1;
1;
}
# Look for code
$loc = 0;
%files_found = ();
%dirs_found = ();
@skip_dirs = @meta_dirs;
if ($#doc_dirs >= 0) {
for (my $i = 0; $i <= $#doc_dirs; ++$i) {
$skip_dirs[$#skip_dirs + 1] = $doc_dirs[$i];
}
print("Searching for code files...\n");
find(\&wanted, ".");
my @files = keys(%files_found);
my @dirs = keys(%dirs_found);
print ("Found files $#files\n");
print ("Found dirs $#dirs\n");
print ("Lines of code: $loc\n");
}
# Total files
%files_found = ();
%dirs_found = ();
$loc = 0;
@skip_dirs = @meta_dirs;
print("Searching for all files...\n");
find(\&wanted, ".");
my @files = keys(%files_found);
my @dirs = keys(%dirs_found);
print ("Found files $#files\n");
print ("Found dirs $#dirs\n");
print ("Lines of code: $loc\n");