X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=tools%2Flttng-gen-tp;h=6aa1bba15d05012cf75e8d3aa0af69d4efa67bdf;hb=b171442307a02a52e41f2f262ed83c360049724e;hp=3f28534858b318ae326ffeac67beb5f2febc104b;hpb=bacd78c02130be2d5f5c0eb31bd0fa843c8cd561;p=lttng-ust.git diff --git a/tools/lttng-gen-tp b/tools/lttng-gen-tp index 3f285348..6aa1bba1 100755 --- a/tools/lttng-gen-tp +++ b/tools/lttng-gen-tp @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python # # Copyright (c) 2012 Yannick Brosseau # @@ -16,6 +16,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +from __future__ import print_function import sys import getopt import re @@ -31,13 +32,8 @@ class HeaderFile: #undef TRACEPOINT_PROVIDER #define TRACEPOINT_PROVIDER {providerName} -#undef TRACEPOINT_INCLUDE_FILE -#define TRACEPOINT_INCLUDE_FILE ./{headerFilename} - -#ifdef __cplusplus -#extern "C"{{ -#endif /*__cplusplus */ - +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./{headerFilename}" #if !defined({includeGuard}) || defined(TRACEPOINT_HEADER_MULTI_READ) #define {includeGuard} @@ -49,11 +45,6 @@ class HeaderFile: #endif /* {includeGuard} */ #include - -#ifdef __cplusplus -}} -#endif /*__cplusplus */ - """ def __init__(self, filename, template): self.outputFilename = filename @@ -61,7 +52,9 @@ class HeaderFile: def write(self): outputFile = open(self.outputFilename,"w") - includeGuard = "_"+self.outputFilename.upper().replace(".","_") + # Include guard macro will be created by uppercasing the filename and + # replacing all non alphanumeric characters with '_' + includeGuard = re.sub('[^0-9a-zA-Z]', '_', self.outputFilename.upper()) outputFile.write(HeaderFile.HEADER_TPL.format(providerName=self.template.domain, includeGuard = includeGuard, @@ -86,7 +79,9 @@ class CFile: def write(self): outputFile = open(self.outputFilename,"w") - headerFilename = self.outputFilename.replace(".c",".h") + headerFilename = self.outputFilename + if headerFilename.endswith(".c"): + headerFilename = headerFilename[:-2] + ".h" outputFile.write(CFile.FILE_TPL.format( headerFilename = headerFilename)) @@ -98,14 +93,14 @@ class ObjFile: self.template = template def _detectCC(self): cc = "" - if os.environ.has_key('CC'): + if 'CC' in os.environ: cc = os.environ['CC'] try: - subprocess.call(cc, + subprocess.call(cc.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) - except OSError, msg: - print "Invalid CC environment variable" + except OSError as msg: + print("Invalid CC environment variable") cc = "" else: @@ -115,7 +110,7 @@ class ObjFile: subprocess.call("cc", stdout=subprocess.PIPE, stderr=subprocess.PIPE) - except OSError, msg: + except OSError as msg: useCC = False if useCC: cc = "cc" @@ -126,23 +121,36 @@ class ObjFile: subprocess.call("gcc", stdout=subprocess.PIPE, stderr=subprocess.PIPE) - except OSError, msg: + except OSError as msg: useGCC = False if useGCC: cc = "gcc" return cc def write(self): - cFilename = self.outputFilename.replace(".o",".c") + cFilename = self.outputFilename + if cFilename.endswith(".o"): + cFilename = cFilename[:-2] + ".c" + cc = self._detectCC() if cc == "": raise RuntimeError("No C Compiler detected") - if os.environ.has_key('CFLAGS'): - cflags = os.environ['CFLAGS'] + if 'CPPFLAGS' in os.environ: + cppflags = " " + os.environ['CPPFLAGS'] + else: + cppflags = "" + if 'CFLAGS' in os.environ: + cflags = " " + os.environ['CFLAGS'] else: cflags = "" + if 'LDFLAGS' in os.environ: + ldflags = " " + os.environ['LDFLAGS'] + else: + ldflags = "" - command = cc + " -c " + cflags + " -I. -llttng-ust" + " -o " + self.outputFilename + " " + cFilename + command = cc + " -c" + cppflags + cflags + ldflags + " -I. -llttng-ust" + " -o " + self.outputFilename + " " + cFilename + if verbose: + print("Compile command: " + command) subprocess.call(command.split()) class TemplateFile: @@ -157,10 +165,16 @@ class TemplateFile: self.text = f.read() - #Remove # comments (from input and output file - self.text = re.sub("#.*$","",self.text,flags=re.MULTILINE) + #Remove # comments (from input and output file) but keep + # #include in the output file + removeComments = re.compile("#[^include].*$",flags=re.MULTILINE) + self.text = removeComments.sub("",self.text) + # Remove #include directive from the parsed text + removePreprocess = re.compile("#.*$",flags=re.MULTILINE) + noPreprocess = removePreprocess.sub("", self.text) #Remove // comments - nolinecomment = re.sub("\/\/.*$","",self.text,flags=re.MULTILINE) + removeLineComment = re.compile("\/\/.*$",flags=re.MULTILINE) + nolinecomment = removeLineComment.sub("", noPreprocess) #Remove all spaces and lines cleantext = re.sub("\s*","",nolinecomment) #Remove multine C style comments @@ -178,7 +192,9 @@ class TemplateFile: self.domain = domain else: if self.domain != domain: - print "Warning: different domain provided (%s,%s)" % (self.domain, domain) + print("Warning: different domain provided (%s,%s)" % (self.domain, domain)) + +verbose=False usage=""" lttng-gen-tp - Generate the LTTng-UST header and source based on a simple template @@ -202,24 +218,35 @@ def main(argv=None): try: try: - opts, args = getopt.gnu_getopt(argv[1:], "ho:a", ["help"]) - except getopt.error, msg: + opts, args = getopt.gnu_getopt(argv[1:], "ho:av", ["help","verbose"]) + except getopt.error as msg: raise Usage(msg) - except Usage, err: - print >>sys.stderr, err.msg - print >>sys.stderr, "for help use --help" + except Usage as err: + print(err.msg, file=sys.stderr) + print("for help use --help", file=sys.stderr) return 2 outputNames = [] for o, a in opts: if o in ("-h", "--help"): - print usage + print(usage) return(0) if o in ("-o",""): outputNames.append(a) if o in ("-a",""): all = True + if o in ("-v", "--verbose"): + global verbose + verbose = True + try: + if len(args) == 0: + raise Usage("No template file given") + + except Usage as err: + print(err.msg, file=sys.stderr) + print("for help use --help", file=sys.stderr) + return 2 doCFile = None doHeader = None @@ -230,7 +257,7 @@ def main(argv=None): if len(outputNames) > 0: if len(args) > 1: - print "Cannot process more than one input if you specify an output" + print("Cannot process more than one input if you specify an output") return(3) for outputName in outputNames: @@ -244,7 +271,7 @@ def main(argv=None): doObj = True objFilename = outputName else: - print "output file type unsupported" + print("output file type unsupported") return(4) else: doHeader = True @@ -253,29 +280,41 @@ def main(argv=None): # process arguments for arg in args: + if arg[-3:] != ".tp": + print(arg + " does not end in .tp. Skipping.") + continue - tpl = TemplateFile(arg) - if doHeader: - if headerFilename: - curFilename = headerFilename - else: - curFilename = re.sub("\.tp$",".h",arg) - doth = HeaderFile(curFilename, tpl) - doth.write() - if doCFile: - if cFilename: - curFilename = cFilename - else: - curFilename = re.sub("\.tp$",".c",arg) - dotc = CFile(curFilename, tpl) - dotc.write() - if doObj: - if objFilename: - curFilename = objFilename - else: - curFilename = re.sub("\.tp$",".o",arg) - dotobj = ObjFile(curFilename, tpl) - dotobj.write() + tpl = None + try: + tpl = TemplateFile(arg) + except IOError as args: + print("Cannot read input file " + args.filename + " " + args.strerror) + return -1 + try: + if doHeader: + if headerFilename: + curFilename = headerFilename + else: + curFilename = re.sub("\.tp$",".h",arg) + doth = HeaderFile(curFilename, tpl) + doth.write() + if doCFile: + if cFilename: + curFilename = cFilename + else: + curFilename = re.sub("\.tp$",".c",arg) + dotc = CFile(curFilename, tpl) + dotc.write() + if doObj: + if objFilename: + curFilename = objFilename + else: + curFilename = re.sub("\.tp$",".o",arg) + dotobj = ObjFile(curFilename, tpl) + dotobj.write() + except IOError as args: + print("Cannot write output file " + args.filename + " " + args.strerror) + return -1 if __name__ == "__main__": sys.exit(main())