-#!/usr/bin/python
+#!/usr/bin/env python
#
-# Copyright (c) 2012 Yannick Brosseau <yannick.brosseau@gmail.com>
+# SPDX-License-Identifier: GPL-2.0-only
#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; only version 2
-# of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# Copyright (C) 2012 Yannick Brosseau <yannick.brosseau@gmail.com>
from __future__ import print_function
import sys
import os
import subprocess
+
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
+
class HeaderFile:
- HEADER_TPL="""
-#undef TRACEPOINT_PROVIDER
-#define TRACEPOINT_PROVIDER {providerName}
+ HEADER_TPL = """
+#undef LTTNG_UST_TRACEPOINT_PROVIDER
+#define LTTNG_UST_TRACEPOINT_PROVIDER {providerName}
-#undef TRACEPOINT_INCLUDE
-#define TRACEPOINT_INCLUDE "./{headerFilename}"
+#undef LTTNG_UST_TRACEPOINT_INCLUDE
+#define LTTNG_UST_TRACEPOINT_INCLUDE "./{headerFilename}"
-#if !defined({includeGuard}) || defined(TRACEPOINT_HEADER_MULTI_READ)
+#if !defined({includeGuard}) || defined(LTTNG_UST_TRACEPOINT_HEADER_MULTI_READ)
#define {includeGuard}
#include <lttng/tracepoint.h>
"""
- FOOTER_TPL="""
+ FOOTER_TPL = """
#endif /* {includeGuard} */
#include <lttng/tracepoint-event.h>
"""
+
def __init__(self, filename, template):
self.outputFilename = filename
self.template = template
def write(self):
- outputFile = open(self.outputFilename,"w")
+ outputFile = open(self.outputFilename, "w")
# 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,
- headerFilename = self.outputFilename))
+ includeGuard=includeGuard,
+ headerFilename=self.outputFilename))
outputFile.write(self.template.text)
- outputFile.write(HeaderFile.FOOTER_TPL.format(includeGuard = includeGuard))
+ outputFile.write(HeaderFile.FOOTER_TPL.format(includeGuard=includeGuard))
outputFile.close()
+
class CFile:
- FILE_TPL="""
-#define TRACEPOINT_CREATE_PROBES
+ FILE_TPL = """
+#define LTTNG_UST_TRACEPOINT_CREATE_PROBES
/*
- * The header containing our TRACEPOINT_EVENTs.
+ * The header containing our LTTNG_UST_TRACEPOINT_EVENTs.
*/
-#define TRACEPOINT_DEFINE
+#define LTTNG_UST_TRACEPOINT_DEFINE
#include "{headerFilename}"
"""
+
def __init__(self, filename, template):
self.outputFilename = filename
self.template = template
def write(self):
- outputFile = open(self.outputFilename,"w")
+ 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))
+ headerFilename=headerFilename))
outputFile.close()
+
class ObjFile:
def __init__(self, filename, template):
self.outputFilename = filename
self.template = template
+
def _detectCC(self):
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 as msg:
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 'CPPFLAGS' in os.environ:
- cppflags = os.environ['CPPFLAGS'] + " "
+ cppflags = " " + os.environ['CPPFLAGS']
else:
cppflags = ""
if 'CFLAGS' in os.environ:
- cflags = os.environ['CFLAGS'] + " "
+ cflags = " " + os.environ['CFLAGS']
else:
cflags = ""
- if 'LDFLAGS' in os.environ:
- ldflags = os.environ['LDFLAGS'] + " "
- else:
- ldflags = ""
- command = cc + " -c " + cppflags + cflags + ldflags + " -I. -llttng-ust" + " -o " + self.outputFilename + " " + cFilename
+ command = cc + " -c" + cppflags + cflags + " -I. -o " + self.outputFilename + " " + cFilename
if verbose:
print("Compile command: " + command)
subprocess.call(command.split())
+
class TemplateFile:
def __init__(self, filename):
self.domain = ""
self.inputFilename = filename
self.parseTemplate()
-
def parseTemplate(self):
- f = open(self.inputFilename,"r")
+ f = open(self.inputFilename, "r")
self.text = f.read()
- #Remove # comments (from input and output file) but keep
+ # 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)
+ 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)
+ removePreprocess = re.compile("#.*$", flags=re.MULTILINE)
noPreprocess = removePreprocess.sub("", self.text)
- #Remove // comments
- removeLineComment = re.compile("\/\/.*$",flags=re.MULTILINE)
+ # Remove // comments
+ 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
- nocomment = re.sub("/\*.*?\*/","",cleantext)
- entries = re.split("TRACEPOINT_.*?",nocomment)
+ # Remove all spaces and lines
+ cleantext = re.sub("\s*", "", nolinecomment)
+ # Remove multine C style comments
+ nocomment = re.sub("/\*.*?\*/", "", cleantext)
+ entries = re.split("^LTTNG_UST_TRACEPOINT_.*?", nocomment)
for entry in entries:
if entry != '':
if self.domain != domain:
print("Warning: different domain provided (%s,%s)" % (self.domain, domain))
-verbose=False
-usage="""
+verbose = False
+
+usage = """
lttng-gen-tp - Generate the LTTng-UST header and source based on a simple template
usage: lttng-gen-tp TEMPLATE_FILE [-o OUTPUT_FILE][-o OUTPUT_FILE]
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
+ The template file must contains LTTNG_UST_TRACEPOINT_EVENT and LTTNG_UST_TRACEPOINT_LOGLEVEL
as per defined in the lttng/tracepoint.h file.
See the lttng-ust(3) man page for more details on the format.
"""
+
+
def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
- opts, args = getopt.gnu_getopt(argv[1:], "ho:av", ["help","verbose"])
+ opts, args = getopt.gnu_getopt(argv[1:], "ho:av", ["help", "verbose"])
except getopt.error as msg:
- raise Usage(msg)
+ raise Usage(msg)
except Usage as err:
print(err.msg, file=sys.stderr)
if o in ("-h", "--help"):
print(usage)
return(0)
- if o in ("-o",""):
+ if o in ("-o", ""):
outputNames.append(a)
- if o in ("-a",""):
+ if o in ("-a", ""):
all = True
if o in ("-v", "--verbose"):
global verbose
if headerFilename:
curFilename = headerFilename
else:
- curFilename = re.sub("\.tp$",".h",arg)
+ 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)
+ 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)
+ 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())