X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tools%2Flttng-gen-tp;h=e49083ba4dae4b8f2a82455cd5f6df9b6f4776f0;hb=HEAD;hp=ed0c48fa549973f844e4001cb99adbc2b8325959;hpb=170423b056ecdef441820a54be350605e4dc8951;p=lttng-ust.git diff --git a/tools/lttng-gen-tp b/tools/lttng-gen-tp index ed0c48fa..e49083ba 100755 --- a/tools/lttng-gen-tp +++ b/tools/lttng-gen-tp @@ -1,20 +1,8 @@ -#!/usr/bin/python +#!/usr/bin/env python # -# Copyright (c) 2012 Yannick Brosseau +# 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 from __future__ import print_function import sys @@ -23,78 +11,87 @@ import re 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 """ - FOOTER_TPL=""" + FOOTER_TPL = """ #endif /* {includeGuard} */ #include """ + 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: @@ -126,55 +123,54 @@ class ObjFile: 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 != '': @@ -189,9 +185,10 @@ class TemplateFile: 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] @@ -203,19 +200,21 @@ usage=""" 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) @@ -227,9 +226,9 @@ def main(argv=None): 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 @@ -290,26 +289,27 @@ def main(argv=None): 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())