X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=tools%2Flttng-gen-tp;h=b560e535385e35105f0379bd5697bb78f17c10f2;hb=refs%2Fheads%2Fstable-2.0;hp=9b08275514cc86b58431f1a5e97dc037b057eb17;hpb=b25c5b37ef536d7b09fe901d97e678220ec69c9a;p=lttng-ust.git diff --git a/tools/lttng-gen-tp b/tools/lttng-gen-tp old mode 100644 new mode 100755 index 9b082755..b560e535 --- a/tools/lttng-gen-tp +++ b/tools/lttng-gen-tp @@ -19,6 +19,8 @@ import sys import getopt import re +import os +import subprocess class Usage(Exception): def __init__(self, msg): @@ -33,8 +35,8 @@ class HeaderFile: #define TRACEPOINT_INCLUDE_FILE ./{headerFilename} #ifdef __cplusplus -#extern "C"{{ -#endif /*__cplusplus */ +extern "C"{{ +#endif /* __cplusplus */ #if !defined({includeGuard}) || defined(TRACEPOINT_HEADER_MULTI_READ) @@ -50,7 +52,7 @@ class HeaderFile: #ifdef __cplusplus }} -#endif /*__cplusplus */ +#endif /* __cplusplus */ """ def __init__(self, filename, template): @@ -59,7 +61,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, @@ -90,6 +94,59 @@ class CFile: headerFilename = headerFilename)) outputFile.close() +class ObjFile: + def __init__(self, filename, template): + self.outputFilename = filename + self.template = template + def _detectCC(self): + cc = "" + if os.environ.has_key('CC'): + cc = os.environ['CC'] + try: + subprocess.call(cc, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError, msg: + print "Invalid CC environment variable" + cc = "" + + else: + # Try c first, if that fails try gcc + try: + useCC = True + subprocess.call("cc", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError, msg: + useCC = False + if useCC: + cc = "cc" + + else: + try: + useGCC = True + subprocess.call("gcc", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError, msg: + useGCC = False + if useGCC: + cc = "gcc" + return cc + + def write(self): + cFilename = self.outputFilename.replace(".o",".c") + cc = self._detectCC() + if cc == "": + raise RuntimeError("No C Compiler detected") + if os.environ.has_key('CFLAGS'): + cflags = os.environ['CFLAGS'] + else: + cflags = "" + + command = cc + " -c " + cflags + " -I. -llttng-ust" + " -o " + self.outputFilename + " " + cFilename + subprocess.call(command.split()) + class TemplateFile: def __init__(self, filename): self.domain = "" @@ -103,9 +160,11 @@ class TemplateFile: self.text = f.read() #Remove # comments (from input and output file - self.text = re.sub("#.*$","",self.text,flags=re.MULTILINE) + removeComments = re.compile("#.*$",flags=re.MULTILINE) + self.text = removeComments.sub("",self.text) #Remove // comments - nolinecomment = re.sub("\/\/.*$","",self.text,flags=re.MULTILINE) + removeLineComment = re.compile("\/\/.*$",flags=re.MULTILINE) + nolinecomment = removeLineComment.sub("",self.text) #Remove all spaces and lines cleantext = re.sub("\s*","",nolinecomment) #Remove multine C style comments @@ -132,9 +191,9 @@ usage=""" If no OUTPUT_FILE is given, the .h and .c file will be generated. (The basename of the template file with be used for the generated file. - for example sample.tp will generate sample.h and sample.c) + for example sample.tp will generate sample.h, sample.c and sample.o) - When using the -o option, the OUTPUT_FILE must end with either .h or .c + When using the -o option, the OUTPUT_FILE must end with either .h, .c or .o The -o option can be repeated multiple times. The template file must contains TRACEPOINT_EVENT and TRACEPOINT_LOGLEVEL @@ -150,6 +209,8 @@ def main(argv=None): opts, args = getopt.gnu_getopt(argv[1:], "ho:a", ["help"]) except getopt.error, msg: raise Usage(msg) + if len(args) == 0: + raise Usage("No template file given") except Usage, err: print >>sys.stderr, err.msg @@ -168,8 +229,10 @@ def main(argv=None): doCFile = None doHeader = None + doObj = None headerFilename = None cFilename = None + objFilename = None if len(outputNames) > 0: if len(args) > 1: @@ -184,32 +247,50 @@ def main(argv=None): doCFile = True cFilename = outputName elif outputName[-2:] == ".o": - print "Not yet implemented, sorry" + doObj = True + objFilename = outputName else: print "output file type unsupported" return(4) else: doHeader = True doCFile = True + doObj = True # process arguments for arg in args: - 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() - + 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())