[lttng-dev] [PATCH] Implement the .o file generation in lttng-gen-tp

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu Feb 16 18:36:47 EST 2012


* Yannick Brosseau (yannick.brosseau at gmail.com) wrote:
> (refs #40)

Merged, thanks!

Mathieu

> 
> Signed-off-by: Yannick Brosseau <yannick.brosseau at gmail.com>
> ---
>  doc/examples/gen-tp/Makefile |   19 +++++++++--
>  doc/man/lttng-gen-tp.1       |   24 +++++++++++---
>  tools/lttng-gen-tp           |   72 ++++++++++++++++++++++++++++++++++++++++--
>  3 files changed, 104 insertions(+), 11 deletions(-)
>  mode change 100644 => 100755 tools/lttng-gen-tp
> 
> diff --git a/doc/examples/gen-tp/Makefile b/doc/examples/gen-tp/Makefile
> index 664372f..c78fc67 100644
> --- a/doc/examples/gen-tp/Makefile
> +++ b/doc/examples/gen-tp/Makefile
> @@ -20,17 +20,30 @@ LIBS = -ldl -llttng-ust
>  
>  all: sample
>  
> -sample: sample.o sample-tp.o
> +sample: sample.o sample_tracepoint.o
>  	$(CC) $(LIBS) -o $@ $^
>  
>  sample.o: sample.c sample_tracepoint.h
>  	$(CC) $(CFLAGS) -c -o $@ $<
>  
> -sample-tp.o: sample_tracepoint.c sample_tracepoint.h
> -	$(CC) $(CFLAGS) -I. -c -o $@ $<
> +# Use this command to compile the .c manually
> +#sample_tracepoint.o: sample_tracepoint.c sample_tracepoint.h
> +#	$(CC) $(CFLAGS) -I. -c -o $@ $<
> +
> +# This rule generate .o only and depends on rules for generating
> +# the .h and .c
> +%.o: %.tp %.c %.h
> +	tools/lttng-gen-tp -o $@ $<
> +
> +# The following rule can be used to generate all files instead of having one
> +# for each file type. Note that the sample.o has a dependency on the
> +# .h, so you need to change that if you remove the %.h rule.
> +#%.o: %.tp
> +#	lttng-gen-tp $<
>  
>  %.h: %.tp
>  	lttng-gen-tp -o $@ $<
> +
>  %.c: %.tp
>  	lttng-gen-tp -o $@ $<
>  
> diff --git a/doc/man/lttng-gen-tp.1 b/doc/man/lttng-gen-tp.1
> index 3c7034c..551f003 100644
> --- a/doc/man/lttng-gen-tp.1
> +++ b/doc/man/lttng-gen-tp.1
> @@ -21,10 +21,12 @@ The \fBlttng\-gen\-tp\fP tool simplify the generation of the UST tracepoint
>  files. It takes a simple template file and generate the necessary code to use the defined tracepoints in your application.
>  The section TEMPLATE FILE FORMAT describe the content of the template file.
>  
> -Currently, the tool can generate the .h and .c associated to your
> +Currently, the tool can generate the .h, .c and .o associated to your
>  tracepoint. The generated .h can be directly included in your application.
> -You need to compile the .c into a .o, .a or .so at your choice and
> -link it with your application. Refer to the UST documentation for the
> +You can let the tool generate the .o or compile the .c yourself.
> +You can compile the .c into a .o, .a or .so at your choice and
> +link it with your application.
> +Refer to the UST documentation for the
>  advantages and disadvantage of each form.
>  To compile the resulting .c file, you need to add the options
>  "-llttng-ust -I."
> @@ -45,11 +47,11 @@ Increase verbosity.
>  .TP
>  .BR "\-o, \-\-output"
>  Specify the generated file. The type of the generated file depend on the file
> -extension (.h, .c).
> +extension (.h, .c, .o).
>  This option can be specfied multiple times to generate different file type.
>  
>  .PP
> -When no output is specified de default files are generated with the same base filename as the template file. The default files are: .h, .c.
> +When no output is specified de default files are generated with the same base filename as the template file. The default files are: .h, .c, .o.
>  
>  .SH "TEMPLATE FILE FORMAT"
>  
> @@ -77,7 +79,19 @@ TRACEPOINT_EVENT(
>          ctf_string(message, text)
>      )
>  )
> +.SH "ENVIRONMENT VARIABLES"
>  
> +.PP
> +When the tool generate an .o file, it will look for the following environment variables
> +.PP
> +
> +.PP
> +.IP "CC"
> +Specifer which C compiler to use. If the variable is not specified, the
> +tool will try "cc" and "gcc"
> +
> +.IP "CFLAGS"
> +Flags directly passed to the compiler
>  .SH "SEE ALSO"
>  
>  .PP
> diff --git a/tools/lttng-gen-tp b/tools/lttng-gen-tp
> old mode 100644
> new mode 100755
> index 9b08275..3f28534
> --- 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):
> @@ -90,6 +92,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 = ""
> @@ -132,9 +187,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
> @@ -168,8 +223,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,13 +241,15 @@ 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:
> @@ -210,6 +269,13 @@ def main(argv=None):
>                  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()
>  
>  if __name__ == "__main__":
>      sys.exit(main())
> -- 
> 1.7.9
> 
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list