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.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
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
|
# Generate a file that wraps the basic top level files
|
||||||
env.Command('python/m5/info.py',
|
env.Command('python/m5/info.py',
|
||||||
[ '#/AUTHORS', '#/LICENSE', '#/README', ],
|
[ '#/COPYING', '#/LICENSE', '#/README', ],
|
||||||
MakeAction(makeInfoPyFile, Transform("INFO")))
|
MakeAction(makeInfoPyFile, Transform("INFO")))
|
||||||
PySource('m5', 'python/m5/info.py')
|
PySource('m5', 'python/m5/info.py')
|
||||||
|
|
||||||
|
|
|
@ -36,11 +36,8 @@ __all__ = [ 'options', 'arguments', 'main' ]
|
||||||
|
|
||||||
usage="%prog [gem5 options] script.py [script options]"
|
usage="%prog [gem5 options] script.py [script options]"
|
||||||
version="%prog 2.0"
|
version="%prog 2.0"
|
||||||
brief_copyright='''
|
brief_copyright=\
|
||||||
Copyright (c) 2001-2011
|
"gem5 is copyrighted software; use the --copyright option for details."
|
||||||
The Regents of The University of Michigan
|
|
||||||
All Rights Reserved
|
|
||||||
'''
|
|
||||||
|
|
||||||
def parse_options():
|
def parse_options():
|
||||||
import config
|
import config
|
||||||
|
@ -52,8 +49,6 @@ def parse_options():
|
||||||
group = options.set_group
|
group = options.set_group
|
||||||
|
|
||||||
# Help options
|
# Help options
|
||||||
option('-A', "--authors", action="store_true", default=False,
|
|
||||||
help="Show author information")
|
|
||||||
option('-B', "--build-info", action="store_true", default=False,
|
option('-B', "--build-info", action="store_true", default=False,
|
||||||
help="Show build information")
|
help="Show build information")
|
||||||
option('-C', "--copyright", action="store_true", default=False,
|
option('-C', "--copyright", action="store_true", default=False,
|
||||||
|
@ -211,14 +206,7 @@ def main(*args):
|
||||||
|
|
||||||
if options.copyright:
|
if options.copyright:
|
||||||
done = True
|
done = True
|
||||||
print info.LICENSE
|
print info.COPYING
|
||||||
print
|
|
||||||
|
|
||||||
if options.authors:
|
|
||||||
done = True
|
|
||||||
print 'Author information:'
|
|
||||||
print
|
|
||||||
print info.AUTHORS
|
|
||||||
print
|
print
|
||||||
|
|
||||||
if options.readme:
|
if options.readme:
|
||||||
|
@ -263,7 +251,7 @@ def main(*args):
|
||||||
|
|
||||||
verbose = options.verbose - options.quiet
|
verbose = options.verbose - options.quiet
|
||||||
if options.verbose >= 0:
|
if options.verbose >= 0:
|
||||||
print "gem5 Simulator System"
|
print "gem5 Simulator System. http://gem5.org"
|
||||||
print brief_copyright
|
print brief_copyright
|
||||||
print
|
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