Switch to OptionParser
This commit is contained in:
+101
-103
@@ -41,12 +41,12 @@ There are special strings that are replaced in the template file:
|
||||
# http://www.cs.umd.edu/~nspring/software/style-check-readme.html
|
||||
|
||||
import sys
|
||||
import getopt
|
||||
import re
|
||||
import os
|
||||
import subprocess
|
||||
from os import pathsep
|
||||
import os.path
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
def unique (list):
|
||||
@@ -77,7 +77,7 @@ def file_search (filename, search_path, debug):
|
||||
return None
|
||||
|
||||
|
||||
def hfiles_get (cfile, filedeps, mopts):
|
||||
def hfiles_get (cfile, filedeps, options):
|
||||
|
||||
deps = filedeps[cfile]
|
||||
|
||||
@@ -89,12 +89,12 @@ def hfiles_get (cfile, filedeps, mopts):
|
||||
|
||||
for hfile in filedeps[cfile]:
|
||||
if hfile[-2:] == '.h':
|
||||
if mopts['relpath']:
|
||||
if options.relpath:
|
||||
hfile = os.path.relpath (hfile)
|
||||
hfilelist.append (hfile)
|
||||
|
||||
for hfile in filedeps[cfile]:
|
||||
hfilelist.extend (hfiles_get (hfile, filedeps, mopts))
|
||||
hfilelist.extend (hfiles_get (hfile, filedeps, options))
|
||||
|
||||
return unique (hfilelist)
|
||||
|
||||
@@ -127,17 +127,12 @@ def file_parse (pathname, indent, debug):
|
||||
return hfilelist
|
||||
|
||||
|
||||
def makefile_print (mopts, template, maincfilename, filedeps,
|
||||
search_list, debug):
|
||||
def makefile_print (options, template, maincfilename, filedeps,
|
||||
search_list):
|
||||
|
||||
basecfilelist = []
|
||||
cfilelist = []
|
||||
for target in filedeps:
|
||||
if target[-2:] == '.c':
|
||||
cfilelist.append (target)
|
||||
basecfilelist.append (os.path.basename (target))
|
||||
basecfilelist.sort ()
|
||||
cfilelist = cfiles_get (filedeps)
|
||||
cfilelist.sort ()
|
||||
basecfilelist = [os.path.basename (cfile) for cfile in cfilelist]
|
||||
|
||||
project = os.path.splitext (os.path.basename (maincfilename))
|
||||
project = project[0]
|
||||
@@ -152,13 +147,13 @@ def makefile_print (mopts, template, maincfilename, filedeps,
|
||||
src = ' '.join (basecfilelist)
|
||||
obj = src
|
||||
|
||||
if mopts['builddir'] != '':
|
||||
objfilelist = [os.path.join (mopts['builddir'], obj1) for obj1 in basecfilelist]
|
||||
if options.builddir != '':
|
||||
objfilelist = [os.path.join (options.builddir, obj1) for obj1 in basecfilelist]
|
||||
objfilelist.sort ()
|
||||
obj = ' '.join (objfilelist)
|
||||
project = os.path.join (mopts['builddir'], project)
|
||||
project = os.path.join (options.builddir, project)
|
||||
|
||||
obj = re.sub (r'([a-zA-Z0-9/.-_]*)[.]c', r'\1' + mopts['objext'], obj)
|
||||
obj = re.sub (r'([a-zA-Z0-9/.-_]*)[.]c', r'\1' + options.objext, obj)
|
||||
|
||||
text = re.sub (r'@PROJECT@', project, text)
|
||||
text = re.sub (r'@VPATH@', vpath, text)
|
||||
@@ -175,21 +170,21 @@ def makefile_print (mopts, template, maincfilename, filedeps,
|
||||
for cfile in cfilelist:
|
||||
cfilebase = os.path.basename (cfile)
|
||||
|
||||
if mopts['relpath']:
|
||||
if options.relpath:
|
||||
cfile1 = os.path.relpath (cfile)
|
||||
else:
|
||||
cfile1 = cfilebase
|
||||
|
||||
if mopts['builddir'] != '':
|
||||
rules = rules + os.path.join (mopts['builddir'], '')
|
||||
if options.builddir != '':
|
||||
rules = rules + os.path.join (options.builddir, '')
|
||||
|
||||
rules = rules + re.sub ('([a-zA-Z0-9/.-_]*)[.]c', r'\1' + mopts['objext'], cfilebase) + ': ' + cfile1
|
||||
rules = rules + re.sub ('([a-zA-Z0-9/.-_]*)[.]c', r'\1' + options.objext, cfilebase) + ': ' + cfile1
|
||||
|
||||
|
||||
hfilelist = hfiles_get (cfile, filedeps, mopts)
|
||||
hfilelist = hfiles_get (cfile, filedeps, options)
|
||||
hfilelist.sort ()
|
||||
|
||||
if debug:
|
||||
if options.debug:
|
||||
print >> sys.stderr, 'Need hfiles', hfilelist, 'for', cfile
|
||||
|
||||
for hfile in hfilelist:
|
||||
@@ -308,23 +303,23 @@ def files_find (gcc, filepath, search_path, filedeps, moduledeps, indent, debug)
|
||||
files_find (gcc, file, search_path, filedeps, moduledeps, indent + ' ', debug)
|
||||
|
||||
|
||||
def alldeps_print (depsdir, mopts):
|
||||
def alldeps_print (depsdir, options):
|
||||
|
||||
for target in depsdir.keys ():
|
||||
|
||||
targetbase = os.path.basename (target)
|
||||
if targetbase in mopts['exclude']:
|
||||
if targetbase in options.exclude:
|
||||
continue
|
||||
|
||||
deps = depsdir[target]
|
||||
deps = [dep for dep in deps if os.path.basename (dep) not in mopts['exclude']]
|
||||
if mopts['relpath']:
|
||||
deps = [dep for dep in deps if os.path.basename (dep) not in options.exclude]
|
||||
if options.relpath:
|
||||
deps = [os.path.relpath (dep) for dep in deps]
|
||||
|
||||
print os.path.relpath (target) + ': ' + ' '.join (deps) + '\n'
|
||||
|
||||
|
||||
def deps_print (target, depsdir, mopts, record = {}):
|
||||
def deps_print (target, depsdir, options, record = {}):
|
||||
|
||||
if record.has_key (target):
|
||||
return
|
||||
@@ -332,11 +327,11 @@ def deps_print (target, depsdir, mopts, record = {}):
|
||||
return
|
||||
|
||||
deps = depsdir[target]
|
||||
deps = [dep for dep in deps if os.path.basename (dep) not in mopts['exclude']]
|
||||
deps = [dep for dep in deps if os.path.basename (dep) not in options.exclude]
|
||||
for dep in deps:
|
||||
deps_print (dep, depsdir, mopts, record)
|
||||
deps_print (dep, depsdir, options, record)
|
||||
|
||||
if mopts['relpath']:
|
||||
if options.relpath:
|
||||
deps = [os.path.relpath (dep) for dep in deps]
|
||||
|
||||
record[target] = True
|
||||
@@ -353,62 +348,71 @@ class Usage (Exception):
|
||||
def main(argv = None):
|
||||
if argv is None:
|
||||
argv = sys.argv
|
||||
try:
|
||||
try:
|
||||
opts, args = getopt.gnu_getopt (argv[1:], "?h", \
|
||||
["help", "builddir=", "objext=",
|
||||
"exeext=",
|
||||
"relpath", "debug", "template=",
|
||||
"files", "modules", "exclude=",
|
||||
"calls"])
|
||||
except getopt.error, msg:
|
||||
raise Usage (msg)
|
||||
|
||||
if not opts and not args:
|
||||
print __doc__
|
||||
sys.exit (0)
|
||||
version = __doc__.split ('\n')[0]
|
||||
|
||||
parser = OptionParser (usage = '%prog', version = version,
|
||||
description = __doc__)
|
||||
|
||||
parser.add_option('--showops', action = 'store_true',
|
||||
dest = 'showops', default = False,
|
||||
help = 'show operations')
|
||||
|
||||
parser.add_option('--modules', action = 'store_true',
|
||||
dest = 'modules', default = False,
|
||||
help = 'generate module dependencies')
|
||||
|
||||
parser.add_option('--calls', action = 'store_true',
|
||||
dest = 'calls', default = False,
|
||||
help = 'generate callgraph')
|
||||
|
||||
parser.add_option('--files', action = 'store_true',
|
||||
dest = 'files', default = False,
|
||||
help = 'generate file dependencies')
|
||||
|
||||
parser.add_option('--debug', action = 'store_true',
|
||||
dest = 'debug', default = False,
|
||||
help = 'enable debugging')
|
||||
|
||||
parser.add_option('--exclude', dest = 'exclude',
|
||||
default = '',
|
||||
help = 'files to exclude')
|
||||
|
||||
parser.add_option('--objext', dest = 'objext',
|
||||
default = '.o',
|
||||
help = 'object file extension')
|
||||
|
||||
parser.add_option('--exeext', dest = 'exeext',
|
||||
default = '.out',
|
||||
help = 'executable file extension')
|
||||
|
||||
parser.add_option('--relpath', action = 'store_true',
|
||||
dest = 'relpath', default = False,
|
||||
help = 'use relative paths')
|
||||
|
||||
parser.add_option('--outfile', dest = 'outfilename',
|
||||
default = None,
|
||||
help = 'output filename')
|
||||
|
||||
parser.add_option('--builddir', dest = 'builddir',
|
||||
default = '',
|
||||
help = 'build dirname')
|
||||
|
||||
parser.add_option('--template', dest = 'template',
|
||||
default = None,
|
||||
help = 'template filename')
|
||||
|
||||
(options, args) = parser.parse_args ()
|
||||
|
||||
if len (args) < 1:
|
||||
print __doc__
|
||||
sys.exit (0)
|
||||
|
||||
mopts = {}
|
||||
mopts['builddir'] = ''
|
||||
mopts['objext'] = '.o'
|
||||
mopts['exeext'] = '.out'
|
||||
mopts['relpath'] = False
|
||||
mopts['template'] = None
|
||||
mopts['files'] = False
|
||||
mopts['modules'] = False
|
||||
mopts['calls'] = False
|
||||
mopts['exclude'] = []
|
||||
debug = False
|
||||
|
||||
# Process options
|
||||
for o, a in opts:
|
||||
if o in ("-?", "-h", "--help"):
|
||||
print __doc__
|
||||
sys.exit (0)
|
||||
elif o == "--builddir":
|
||||
mopts['builddir'] = a
|
||||
elif o == "--objext":
|
||||
mopts['objext'] = a
|
||||
elif o == "--exeext":
|
||||
mopts['exeext'] = a
|
||||
elif o == "--relpath":
|
||||
mopts['relpath'] = True
|
||||
elif o == "--debug":
|
||||
debug = True
|
||||
elif o == "--template":
|
||||
mopts['template'] = a
|
||||
elif o == "--files":
|
||||
mopts['files'] = True
|
||||
elif o == "--modules":
|
||||
mopts['modules'] = True
|
||||
elif o == "--calls":
|
||||
mopts['calls'] = True
|
||||
elif o == "--exclude":
|
||||
mopts['exclude'] = a.split (' ')
|
||||
if ',' in options.exclude:
|
||||
options.exclude = options.exclude.split(',')
|
||||
else:
|
||||
options.exclude = options.exclude.split()
|
||||
|
||||
maincfilename = args[0]
|
||||
|
||||
@@ -416,23 +420,23 @@ def main(argv = None):
|
||||
if len (args) > 1:
|
||||
search_list.extend (args[1:len (args)])
|
||||
|
||||
if debug:
|
||||
if options.debug:
|
||||
print >> sys.stderr, search_list
|
||||
search_path = pathsep.join (search_list)
|
||||
if debug:
|
||||
print >> sys.stderr, 'template', mopts['template']
|
||||
if options.debug:
|
||||
print >> sys.stderr, 'template', options.template
|
||||
print >> sys.stderr, 'cfile', maincfilename
|
||||
print >> sys.stderr, 'search_path', search_path
|
||||
print >> sys.stderr, 'CWD = ', os.getcwd()
|
||||
|
||||
if os.path.isdir (maincfilename):
|
||||
if debug:
|
||||
if options.debug:
|
||||
print >> sys.stderr, 'Searching ' + maincfilename
|
||||
maincfilename = maincfilename_find (maincfilename)
|
||||
if not maincfilename:
|
||||
sys.exit (1)
|
||||
|
||||
if debug:
|
||||
if options.debug:
|
||||
print >> sys.stderr, 'Found C file ' + maincfilename
|
||||
|
||||
includes = '-I' + ' -I'.join (search_list)
|
||||
@@ -446,11 +450,11 @@ def main(argv = None):
|
||||
filedeps = {}
|
||||
moduledeps = {}
|
||||
functiondeps = {}
|
||||
files_find (gcc, maincfilename, search_path, filedeps, moduledeps, '', debug)
|
||||
files_find (gcc, maincfilename, search_path, filedeps, moduledeps, '', options.debug)
|
||||
|
||||
cfilelist = cfiles_get (filedeps)
|
||||
ofilelist = [cfile[:-2] + mopts['objext'] for cfile in cfilelist]
|
||||
outfile = maincfilename[:-2] + mopts['exeext']
|
||||
ofilelist = [cfile[:-2] + options.objext for cfile in cfilelist]
|
||||
outfile = maincfilename[:-2] + options.exeext
|
||||
filedeps[outfile] = ofilelist
|
||||
for ofile in ofilelist:
|
||||
deps = []
|
||||
@@ -460,31 +464,25 @@ def main(argv = None):
|
||||
# print >> sys.stderr, moduledeps
|
||||
# print >> sys.stderr, filedeps
|
||||
|
||||
if mopts['calls']:
|
||||
if options.calls:
|
||||
for cfile in cfilelist:
|
||||
functions_find (gcc, cfile, functiondeps)
|
||||
deps_print ('main', functiondeps, mopts)
|
||||
deps_print ('main', functiondeps, options)
|
||||
|
||||
if mopts['files']:
|
||||
deps_print (outfile, filedeps, mopts)
|
||||
if options.files:
|
||||
deps_print (outfile, filedeps, options)
|
||||
|
||||
if mopts['modules']:
|
||||
if options.modules:
|
||||
target, ext = os.path.splitext (os.path.basename (maincfilename))
|
||||
deps_print (target, moduledeps, mopts)
|
||||
deps_print (target, moduledeps, options)
|
||||
|
||||
if mopts['template']:
|
||||
makefile_print (mopts, mopts['template'], maincfilename, filedeps,
|
||||
search_list, debug)
|
||||
if options.template:
|
||||
makefile_print (options, options.template, maincfilename, filedeps,
|
||||
search_list)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
except Usage, err:
|
||||
print >> sys.stderr, err.msg
|
||||
print >> sys.stderr, "for help use --help"
|
||||
return 2
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit (main())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user