Version 2.0.8
[lttng-ust.git] / tools / lttng-gen-tp
old mode 100644 (file)
new mode 100755 (executable)
index 9b08275..b560e53
@@ -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())
This page took 0.026166 seconds and 4 git commands to generate.