copyright: Add code for finding all copyright blocks and create a COPYING file
The end of the COPYING file was generated with: % python ./util/find_copyrights.py configs src system tests util Update -C command line option to spit out COPYING file
This commit is contained in:
parent
f656787edb
commit
0c424344fa
6 changed files with 326 additions and 127 deletions
109
AUTHORS
109
AUTHORS
|
@ -1,109 +0,0 @@
|
|||
|
||||
Nathan L. Binkert
|
||||
-----------------------
|
||||
* Alpha full system support
|
||||
* Statistics package
|
||||
* Event queue
|
||||
* Pseudo instructions
|
||||
* Remote GDB facilities
|
||||
* PC sampling
|
||||
* Trace facilities
|
||||
* Tru64 support
|
||||
* Ethernet (Link, NSGIGE, Sinic) device support
|
||||
* PCI device support
|
||||
* Checkpoint framework
|
||||
* Configuration system
|
||||
|
||||
Steven K. Reinhardt
|
||||
-----------------------
|
||||
* Alpha support
|
||||
* ISA parsing
|
||||
* SWIG intergration
|
||||
* New memory system
|
||||
* New Caches
|
||||
* Simple CPU
|
||||
* Instruction tracing
|
||||
* PC sampling
|
||||
* Deprecated detailed CPU
|
||||
* Binary Loading
|
||||
* Configuration system
|
||||
|
||||
Ali G. Saidi
|
||||
-----------------------
|
||||
* SPARC Full System Support
|
||||
* Alpha Linux support
|
||||
* Alpha (Tsunami) platform and devices
|
||||
* I/O <-> memory interface
|
||||
* PCI device interface
|
||||
* Multiple ISA support
|
||||
* Ethernet (Intel NIC) device model
|
||||
* Memory bridge, bus, packet, port interfaces
|
||||
|
||||
Kevin T. Lim
|
||||
-----------------------
|
||||
* New CPU model
|
||||
* CPU checker
|
||||
* CPU class restructuring
|
||||
* Quiecsing/Draining
|
||||
|
||||
Ronald G. Dreslinski Jr
|
||||
-----------------------
|
||||
* Caches/Cache coherence
|
||||
* Prefetching
|
||||
* New memory system (port, request, packet, cache porting)
|
||||
* Tru64 MP support
|
||||
|
||||
Lisa R. Hsu
|
||||
-----------------------
|
||||
* DP83820 NIC device model
|
||||
* Kernel stats
|
||||
* Linux Dist disk image building (current)
|
||||
|
||||
Gabriel Black
|
||||
-----------------------
|
||||
* Multiple ISA support
|
||||
* SPARC ISA support
|
||||
* X86 ISA support
|
||||
* Alpha support reorganization
|
||||
* SPARC SE support
|
||||
* X86 SE support
|
||||
* Remote GDB in SE support
|
||||
* TLB based translation in SE
|
||||
* Statetrace debugging tool
|
||||
* Microcode system
|
||||
|
||||
Korey L. Sewell
|
||||
-----------------------
|
||||
* O3CPU SMT support
|
||||
* MIPS ISA support
|
||||
* Multiple ISA support in O3CPU
|
||||
|
||||
Andrew L. Schultz
|
||||
-----------------------
|
||||
* IDE controller/disk model
|
||||
* PCI devices interface
|
||||
* Linux Dist disk image building (deprecated)
|
||||
|
||||
Erik G. Hallnor
|
||||
-----------------------
|
||||
* Caches
|
||||
* Trace reader support
|
||||
* Checkpoint framework
|
||||
|
||||
Steve E. Raasch
|
||||
-----------------------
|
||||
* Deprecated CPU model
|
||||
* Generic CPU structures
|
||||
|
||||
David Green
|
||||
-----------------------
|
||||
* Deprecated CPU model
|
||||
* Caches
|
||||
|
||||
Benjamin S. Nash
|
||||
-----------------------
|
||||
* Alpha FreeBSD support
|
||||
|
||||
Miguel J. Serrano
|
||||
-----------------------
|
||||
* Alpha FreeBSD support
|
47
COPYING
Normal file
47
COPYING
Normal file
|
@ -0,0 +1,47 @@
|
|||
Please see individual files for details of the license on each file.
|
||||
The preferred license can be found in LICENSE.
|
||||
|
||||
All files in this distribution (other than in the ext directory) have
|
||||
licenses based on the BSD or MIT licenses. Some files in the ext
|
||||
directory are GNU LGPL. No other licenses are found in this
|
||||
distribution.
|
||||
|
||||
Beyond the BSD license, some files include the following clarification
|
||||
of the license as required by the copyright holder:
|
||||
|
||||
The license below extends only to copyright in the software and
|
||||
shall not be construed as granting a license to any other
|
||||
intellectual property including but not limited to intellectual
|
||||
property relating to a hardware implementation of the
|
||||
functionality of the software licensed hereunder. You may use the
|
||||
software subject to the license terms below provided that you
|
||||
ensure that this notice is replicated unmodified and in its
|
||||
entirety in all distributions of the software, modified or
|
||||
unmodified, in source code or in binary form.
|
||||
|
||||
The copyright holders include (not counting the ext directory):
|
||||
|
||||
Copyright (c) 2000-2011 The Regents of The University of Michigan
|
||||
Copyright (c) 1990,1993-1995,2007-2010 The Hewlett-Packard Development Company
|
||||
Copyright (c) 1999-2009,2011 Mark D. Hill and David A. Wood
|
||||
Copyright (c) 2009-2011 ARM Limited
|
||||
Copyright (c) 2008-2009 Princeton University
|
||||
Copyright (c) 2007 MIPS Technologies, Inc.
|
||||
Copyright (c) 2009-2011 Advanced Micro Devices, Inc.
|
||||
Copyright (c) 2009 The University of Edinburgh
|
||||
Copyright (c) 2007-2008 The Florida State University
|
||||
Copyright (c) 2010 Massachusetts Institute of Technology
|
||||
Copyright (c) 1990-1993 The Regents of the University of California
|
||||
Copyright (c) 2006-2009 Nathan Binkert
|
||||
Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
Copyright (c) 2010-2011 Gabe Black
|
||||
Copyright (c) 1994 Adam Glass
|
||||
Copyright (c) 1990-1992 MIPS Computer Systems, Inc.
|
||||
Copyright (c) 2004 Richard J. Wagner
|
||||
Copyright (c) 2000 Computer Engineering and Communication Networks Lab
|
||||
Copyright (c) 2001 Eric Jackson
|
||||
Copyright (c) 1990 Hewlett-Packard Development Company
|
||||
Copyright (c) 1994-1996 Carnegie-Mellon University.
|
||||
Copyright (c) 1993-1994 Christopher G. Demetriou
|
||||
Copyright (c) 1997-2002 Makoto Matsumoto and Takuji Nishimura
|
||||
Copyright (c) 1998,2001 Manuel Bouyer.
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2000-2011 The Regents of The University of Michigan
|
||||
Copyright (c) <date> <copyright holder>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -516,7 +516,7 @@ def makeInfoPyFile(target, source, env):
|
|||
|
||||
# Generate a file that wraps the basic top level files
|
||||
env.Command('python/m5/info.py',
|
||||
[ '#/AUTHORS', '#/LICENSE', '#/README', ],
|
||||
[ '#/COPYING', '#/LICENSE', '#/README', ],
|
||||
MakeAction(makeInfoPyFile, Transform("INFO")))
|
||||
PySource('m5', 'python/m5/info.py')
|
||||
|
||||
|
|
|
@ -36,11 +36,8 @@ __all__ = [ 'options', 'arguments', 'main' ]
|
|||
|
||||
usage="%prog [gem5 options] script.py [script options]"
|
||||
version="%prog 2.0"
|
||||
brief_copyright='''
|
||||
Copyright (c) 2001-2011
|
||||
The Regents of The University of Michigan
|
||||
All Rights Reserved
|
||||
'''
|
||||
brief_copyright=\
|
||||
"gem5 is copyrighted software; use the --copyright option for details."
|
||||
|
||||
def parse_options():
|
||||
import config
|
||||
|
@ -52,8 +49,6 @@ def parse_options():
|
|||
group = options.set_group
|
||||
|
||||
# Help options
|
||||
option('-A', "--authors", action="store_true", default=False,
|
||||
help="Show author information")
|
||||
option('-B', "--build-info", action="store_true", default=False,
|
||||
help="Show build information")
|
||||
option('-C', "--copyright", action="store_true", default=False,
|
||||
|
@ -211,14 +206,7 @@ def main(*args):
|
|||
|
||||
if options.copyright:
|
||||
done = True
|
||||
print info.LICENSE
|
||||
print
|
||||
|
||||
if options.authors:
|
||||
done = True
|
||||
print 'Author information:'
|
||||
print
|
||||
print info.AUTHORS
|
||||
print info.COPYING
|
||||
print
|
||||
|
||||
if options.readme:
|
||||
|
@ -263,7 +251,7 @@ def main(*args):
|
|||
|
||||
verbose = options.verbose - options.quiet
|
||||
if options.verbose >= 0:
|
||||
print "gem5 Simulator System"
|
||||
print "gem5 Simulator System. http://gem5.org"
|
||||
print brief_copyright
|
||||
print
|
||||
|
||||
|
|
273
util/find_copyrights.py
Normal file
273
util/find_copyrights.py
Normal file
|
@ -0,0 +1,273 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
from file_types import lang_type, find_files
|
||||
|
||||
mode_line = re.compile('(-\*- *mode:.* *-\*-)')
|
||||
shell_comment = re.compile(r'^\s*#')
|
||||
lisp_comment = re.compile(r';')
|
||||
cpp_comment = re.compile(r'//')
|
||||
c_comment_start = re.compile(r'/\*')
|
||||
c_comment_end = re.compile(r'\*/')
|
||||
def find_copyright_block(lines, lang_type):
|
||||
start = None
|
||||
if lang_type in ('python', 'make', 'shell', 'perl', 'scons'):
|
||||
for i,line in enumerate(lines):
|
||||
if i == 0 and (line.startswith('#!') or mode_line.search(line)):
|
||||
continue
|
||||
|
||||
if shell_comment.search(line):
|
||||
if start is None:
|
||||
start = i
|
||||
elif start is None:
|
||||
if line.strip():
|
||||
return
|
||||
else:
|
||||
yield start, i-1
|
||||
start = None
|
||||
|
||||
elif lang_type in ('lisp', ):
|
||||
for i,line in enumerate(lines):
|
||||
if i == 0 and mode_line.search(line):
|
||||
continue
|
||||
|
||||
if lisp_comment.search(line):
|
||||
if start is None:
|
||||
start = i
|
||||
elif start is None:
|
||||
if line.strip():
|
||||
return
|
||||
else:
|
||||
yield start, i-1
|
||||
start = None
|
||||
|
||||
elif lang_type in ('C', 'C++', 'swig', 'isa', 'asm', 'slicc',
|
||||
'lex', 'yacc'):
|
||||
mode = None
|
||||
for i,line in enumerate(lines):
|
||||
if i == 0 and mode_line.search(line):
|
||||
continue
|
||||
|
||||
if mode == 'C':
|
||||
assert start is not None, 'on line %d' % (i + 1)
|
||||
match = c_comment_end.search(line)
|
||||
if match:
|
||||
yield start, i
|
||||
mode = None
|
||||
continue
|
||||
|
||||
cpp_match = cpp_comment.search(line)
|
||||
c_match = c_comment_start.search(line)
|
||||
|
||||
if cpp_match:
|
||||
assert not c_match, 'on line %d' % (i + 1)
|
||||
if line[:cpp_match.start()].strip():
|
||||
return
|
||||
if mode is None:
|
||||
mode = 'CPP'
|
||||
start = i
|
||||
else:
|
||||
text = line[cpp_match.end():].lstrip()
|
||||
if text.startswith("Copyright") > 0:
|
||||
yield start, i-1
|
||||
start = i
|
||||
continue
|
||||
elif mode == 'CPP':
|
||||
assert start is not None, 'on line %d' % (i + 1)
|
||||
if not line.strip():
|
||||
continue
|
||||
yield start, i-1
|
||||
mode = None
|
||||
if not c_match:
|
||||
return
|
||||
|
||||
if c_match:
|
||||
assert mode is None, 'on line %d' % (i + 1)
|
||||
mode = 'C'
|
||||
start = i
|
||||
|
||||
if mode is None and line.strip():
|
||||
return
|
||||
|
||||
else:
|
||||
raise AttributeError, "Could not handle language %s" % lang_type
|
||||
|
||||
date_range_re = re.compile(r'([0-9]{4})\s*-\s*([0-9]{4})')
|
||||
def process_dates(dates):
|
||||
dates = [ d.strip() for d in dates.split(',') ]
|
||||
|
||||
output = set()
|
||||
for date in dates:
|
||||
match = date_range_re.match(date)
|
||||
if match:
|
||||
f,l = [ int(d) for d in match.groups() ]
|
||||
for i in xrange(f, l+1):
|
||||
output.add(i)
|
||||
else:
|
||||
try:
|
||||
date = int(date)
|
||||
output.add(date)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
return output
|
||||
|
||||
copyright_re = \
|
||||
re.compile(r'Copyright (\([cC]\)) ([-, 0-9]+)[\s*#/]*([A-z-,. ]+)',
|
||||
re.DOTALL)
|
||||
|
||||
authors_re = re.compile(r'^[\s*#/]*Authors:\s*([A-z .]+)\s*$')
|
||||
more_authors_re = re.compile(r'^[\s*#/]*([A-z .]+)\s*$')
|
||||
|
||||
all_owners = set()
|
||||
def get_data(lang_type, lines):
|
||||
data = []
|
||||
last = None
|
||||
for start,end in find_copyright_block(lines, lang_type):
|
||||
joined = ''.join(lines[start:end+1])
|
||||
match = copyright_re.search(joined)
|
||||
if not match:
|
||||
continue
|
||||
|
||||
c,dates,owner = match.groups()
|
||||
dates = dates.strip()
|
||||
owner = owner.strip()
|
||||
|
||||
all_owners.add(owner)
|
||||
try:
|
||||
dates = process_dates(dates)
|
||||
except Exception:
|
||||
print dates
|
||||
print owner
|
||||
raise
|
||||
|
||||
authors = []
|
||||
for i in xrange(start,end+1):
|
||||
line = lines[i]
|
||||
if not authors:
|
||||
match = authors_re.search(line)
|
||||
if match:
|
||||
authors.append(match.group(1).strip())
|
||||
else:
|
||||
match = more_authors_re.search(line)
|
||||
if not match:
|
||||
for j in xrange(i, end+1):
|
||||
line = lines[j].strip()
|
||||
if not line:
|
||||
end = j
|
||||
break
|
||||
if line.startswith('//'):
|
||||
line = line[2:].lstrip()
|
||||
if line:
|
||||
end = j - 1
|
||||
break
|
||||
break
|
||||
authors.append(match.group(1).strip())
|
||||
|
||||
info = (owner, dates, authors, start, end)
|
||||
data.append(info)
|
||||
|
||||
return data
|
||||
|
||||
def datestr(dates):
|
||||
dates = list(dates)
|
||||
dates.sort()
|
||||
|
||||
output = []
|
||||
def add_output(first, second):
|
||||
if first == second:
|
||||
output.append('%d' % (first))
|
||||
else:
|
||||
output.append('%d-%d' % (first, second))
|
||||
|
||||
first = dates.pop(0)
|
||||
second = first
|
||||
while dates:
|
||||
next = dates.pop(0)
|
||||
if next == second + 1:
|
||||
second = next
|
||||
else:
|
||||
add_output(first, second)
|
||||
first = next
|
||||
second = next
|
||||
|
||||
add_output(first, second)
|
||||
|
||||
return ','.join(output)
|
||||
|
||||
usage_str = """usage:
|
||||
%s [-v] <directory>"""
|
||||
|
||||
def usage(exitcode):
|
||||
print usage_str % sys.argv[0]
|
||||
if exitcode is not None:
|
||||
sys.exit(exitcode)
|
||||
|
||||
if __name__ == '__main__':
|
||||
import getopt
|
||||
|
||||
show_counts = False
|
||||
ignore = set()
|
||||
verbose = False
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "ci:v")
|
||||
except getopt.GetoptError:
|
||||
usage(1)
|
||||
|
||||
for o,a in opts:
|
||||
if o == '-c':
|
||||
show_counts = True
|
||||
if o == '-i':
|
||||
ignore.add(a)
|
||||
if o == '-v':
|
||||
verbose = True
|
||||
|
||||
files = []
|
||||
|
||||
for base in args:
|
||||
if os.path.isfile(base):
|
||||
files += [ (base, lang_type(base)) ]
|
||||
elif os.path.isdir(base):
|
||||
files += find_files(base)
|
||||
else:
|
||||
raise AttributeError, "can't access '%s'" % base
|
||||
|
||||
copyrights = {}
|
||||
counts = {}
|
||||
|
||||
for filename, lang in files:
|
||||
f = file(filename, 'r')
|
||||
lines = f.readlines()
|
||||
if not lines:
|
||||
continue
|
||||
|
||||
lines = [ line.rstrip('\r\n') for line in lines ]
|
||||
|
||||
lt = lang_type(filename, lines[0])
|
||||
try:
|
||||
data = get_data(lt, lines)
|
||||
except Exception, e:
|
||||
if verbose:
|
||||
if len(e.args) == 1:
|
||||
e.args = ('%s (%s))' % (e, filename), )
|
||||
print "could not parse %s: %s" % (filename, e)
|
||||
continue
|
||||
|
||||
for owner, dates, authors, start, end in data:
|
||||
if owner not in copyrights:
|
||||
copyrights[owner] = set()
|
||||
if owner not in counts:
|
||||
counts[owner] = 0
|
||||
|
||||
copyrights[owner] |= dates
|
||||
counts[owner] += 1
|
||||
|
||||
info = [ (counts[o], d, o) for o,d in copyrights.items() ]
|
||||
|
||||
for count,dates,owner in sorted(info, reverse=True):
|
||||
if show_counts:
|
||||
owner = '%s (%s files)' % (owner, count)
|
||||
print 'Copyright (c) %s %s' % (datestr(dates), owner)
|
Loading…
Reference in a new issue