]> xenbits.xensource.com Git - libvirt.git/commitdiff
Quieten build & ensure API build scripts exit with non-zero status
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 12 May 2011 10:19:42 +0000 (11:19 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 19 Jul 2011 12:58:06 +0000 (13:58 +0100)
The current API build scripts will continue and exit with a zero
status even if they find problems. This has been the cause of many
build problems, or hidden build errors, in the past. Change the
scripts so they always exit with a non-zero status for any problems
they do not understand. Also turn off all debug output by default
so they respect $(AM_V_GEN)

* docs/Makefile.am: Use $(AM_V_GEN) for API/HTML scripts
* docs/apibuild.py, python/generator.py: Exit with non-zero status
  if problems are found. Also be silent, not outputting any debug
  messages.
* src/Makefile.am: Use $(AM_V_GEN) for ESX generator
* python/Makefile.am: Tweak rule

docs/Makefile.am
docs/apibuild.py
python/Makefile.am
python/generator.py
src/Makefile.am

index 7ff94a04a8623ec8d1d66318d0d2dc7166ef2c06..4ba6b9d59d39c2412f7935fa7984326b54c9e40f 100644 (file)
@@ -153,21 +153,18 @@ internals/%.html.tmp: internals/%.html.in subsite.xsl page.xsl sitemap.html.in
 
 
 html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
-       -@if [ -x $(XSLTPROC) ] ; then \
-         echo "Rebuilding the HTML pages from the XML API" ; \
+       $(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
          $(XSLTPROC) --nonet -o $(srcdir)/ \
-         $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi
-       -@if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
+         $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi ; \
+       if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
          if $(XMLCATALOG) '$(XML_CATALOG_FILE)' "-//W3C//DTD XHTML 1.0 Strict//EN" \
            > /dev/null ; then \
-         echo "Validating the resulting XHTML pages" ; \
          SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
          $(XMLLINT) --catalogs --nonet --valid --noout $(srcdir)/html/*.html ; \
          else echo "missing XHTML1 DTD" ; fi ; fi
 
 $(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
-       -@echo Rebuilding devhelp files
-       -@if [ -x $(XSLTPROC) ] ; then \
+       $(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
          $(XSLTPROC) --nonet -o $(srcdir)/devhelp/ \
          $(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml ; fi
 
index f31a85361aa6ccdd208664999fb8a8ec710d5544..6e35cfbc16ce8772761dbb56d245e8a35895d813 100755 (executable)
@@ -11,7 +11,9 @@ import os, sys
 import string
 import glob
 
-debug=0
+quiet=True
+warnings=0
+debug=False
 debugsym=None
 
 #
@@ -95,7 +97,7 @@ class identifier:
             self.conditionals = None
         else:
             self.conditionals = conditionals[:]
-        if self.name == debugsym:
+        if self.name == debugsym and not quiet:
             print "=> define %s : %s" % (debugsym, (module, type, info,
                                          extra, conditionals))
 
@@ -155,7 +157,7 @@ class identifier:
 
     def update(self, header, module, type = None, info = None, extra=None,
                conditionals=None):
-        if self.name == debugsym:
+        if self.name == debugsym and not quiet:
             print "=> update %s : %s" % (debugsym, (module, type, info,
                                          extra, conditionals))
         if header != None and self.header == None:
@@ -203,7 +205,7 @@ class index:
         if d != None and name != None and type != None:
             self.references[name] = d
 
-        if name == debugsym:
+        if name == debugsym and not quiet:
             print "New ref: %s" % (d)
 
         return d
@@ -244,9 +246,9 @@ class index:
             elif type == "macro":
                 self.macros[name] = d
             else:
-                print "Unable to register type ", type
+                self.warning("Unable to register type ", type)
 
-        if name == debugsym:
+        if name == debugsym and not quiet:
             print "New symbol: %s" % (d)
 
         return d
@@ -260,8 +262,8 @@ class index:
              if self.macros.has_key(id):
                  del self.macros[id]
              if self.functions.has_key(id):
-                 print "function %s from %s redeclared in %s" % (
-                    id, self.functions[id].header, idx.functions[id].header)
+                 self.warning("function %s from %s redeclared in %s" % (
+                    id, self.functions[id].header, idx.functions[id].header))
              else:
                  self.functions[id] = idx.functions[id]
                  self.identifiers[id] = idx.functions[id]
@@ -273,15 +275,15 @@ class index:
              if self.macros.has_key(id):
                  del self.macros[id]
              if self.variables.has_key(id):
-                 print "variable %s from %s redeclared in %s" % (
-                    id, self.variables[id].header, idx.variables[id].header)
+                 self.warning("variable %s from %s redeclared in %s" % (
+                    id, self.variables[id].header, idx.variables[id].header))
              else:
                  self.variables[id] = idx.variables[id]
                  self.identifiers[id] = idx.variables[id]
         for id in idx.structs.keys():
              if self.structs.has_key(id):
-                 print "struct %s from %s redeclared in %s" % (
-                    id, self.structs[id].header, idx.structs[id].header)
+                 self.warning("struct %s from %s redeclared in %s" % (
+                    id, self.structs[id].header, idx.structs[id].header))
              else:
                  self.structs[id] = idx.structs[id]
                  self.identifiers[id] = idx.structs[id]
@@ -294,8 +296,8 @@ class index:
                  self.identifiers[id] = idx.unions[id]
         for id in idx.typedefs.keys():
              if self.typedefs.has_key(id):
-                 print "typedef %s from %s redeclared in %s" % (
-                    id, self.typedefs[id].header, idx.typedefs[id].header)
+                 self.warning("typedef %s from %s redeclared in %s" % (
+                    id, self.typedefs[id].header, idx.typedefs[id].header))
              else:
                  self.typedefs[id] = idx.typedefs[id]
                  self.identifiers[id] = idx.typedefs[id]
@@ -311,15 +313,15 @@ class index:
              if self.enums.has_key(id):
                  continue
              if self.macros.has_key(id):
-                 print "macro %s from %s redeclared in %s" % (
-                    id, self.macros[id].header, idx.macros[id].header)
+                 self.warning("macro %s from %s redeclared in %s" % (
+                    id, self.macros[id].header, idx.macros[id].header))
              else:
                  self.macros[id] = idx.macros[id]
                  self.identifiers[id] = idx.macros[id]
         for id in idx.enums.keys():
              if self.enums.has_key(id):
-                 print "enum %s from %s redeclared in %s" % (
-                    id, self.enums[id].header, idx.enums[id].header)
+                 self.warning("enum %s from %s redeclared in %s" % (
+                    id, self.enums[id].header, idx.enums[id].header))
              else:
                  self.enums[id] = idx.enums[id]
                  self.identifiers[id] = idx.enums[id]
@@ -330,10 +332,10 @@ class index:
                  # check that function condition agrees with header
                  if idx.functions[id].conditionals != \
                     self.functions[id].conditionals:
-                     print "Header condition differs from Function for %s:" \
-                        % id
-                     print "  H: %s" % self.functions[id].conditionals
-                     print "  C: %s" % idx.functions[id].conditionals
+                     self.warning("Header condition differs from Function for %s:" \
+                                      % id)
+                     self.warning("  H: %s" % self.functions[id].conditionals)
+                     self.warning("  C: %s" % idx.functions[id].conditionals)
                  up = idx.functions[id]
                  self.functions[id].update(None, up.module, up.type, up.info, up.extra)
          #     else:
@@ -356,12 +358,13 @@ class index:
 
 
     def analyze(self):
-        self.analyze_dict("functions", self.functions)
-        self.analyze_dict("variables", self.variables)
-        self.analyze_dict("structs", self.structs)
-        self.analyze_dict("unions", self.unions)
-        self.analyze_dict("typedefs", self.typedefs)
-        self.analyze_dict("macros", self.macros)
+        if not quiet:
+            self.analyze_dict("functions", self.functions)
+            self.analyze_dict("variables", self.variables)
+            self.analyze_dict("structs", self.structs)
+            self.analyze_dict("unions", self.unions)
+            self.analyze_dict("typedefs", self.typedefs)
+            self.analyze_dict("macros", self.macros)
 
 class CLexer:
     """A lexer for the C language, tokenize the input by reading and
@@ -621,6 +624,8 @@ class CParser:
                                info, extra, self.conditionals)
 
     def warning(self, msg):
+        global warnings
+        warnings = warnings + 1
         if self.no_error:
             return
         print msg
@@ -1802,7 +1807,8 @@ class CParser:
         return token
 
     def parse(self):
-        self.warning("Parsing %s" % (self.filename))
+        if not quiet:
+            print "Parsing %s" % (self.filename)
         token = self.token()
         while token != None:
             if token[0] == 'name':
@@ -1869,7 +1875,8 @@ class docBuilder:
                 pass
 
     def analyze(self):
-        print "Project %s : %d headers, %d modules" % (self.name, len(self.headers.keys()), len(self.modules.keys()))
+        if not quiet:
+            print "Project %s : %d headers, %d modules" % (self.name, len(self.headers.keys()), len(self.modules.keys()))
         self.idx.analyze()
 
     def scanHeaders(self):
@@ -1995,7 +2002,7 @@ class docBuilder:
                         else:
                             output.write("      <field name='%s' type='%s' info='%s'/>\n" % (field[1] , field[0], desc))
                 except:
-                    print "Failed to serialize struct %s" % (name)
+                    self.warning("Failed to serialize struct %s" % (name))
                 output.write("    </struct>\n")
             else:
                 output.write("/>\n");
@@ -2023,7 +2030,7 @@ class docBuilder:
 
     def serialize_function(self, output, name):
         id = self.idx.functions[name]
-        if name == debugsym:
+        if name == debugsym and not quiet:
             print "=>", id
 
         output.write("    <%s name='%s' file='%s' module='%s'>\n" % (id.type,
@@ -2059,7 +2066,7 @@ class docBuilder:
                     output.write("      <arg name='%s' type='%s' info='%s'/>\n" % (param[1], param[0], escape(param[2])))
                     self.indexString(name, param[2])
         except:
-            print "Failed to save function %s info: " % name, `id.info`
+            self.warning("Failed to save function %s info: " % name, `id.info`)
         output.write("    </%s>\n" % (id.type))
 
     def serialize_exports(self, output, file):
@@ -2074,7 +2081,7 @@ class docBuilder:
                                  escape(dict.info[data]),
                                  string.lower(data)))
                 except:
-                    print "Header %s lacks a %s description" % (module, data)
+                    self.warning("Header %s lacks a %s description" % (module, data))
             if dict.info.has_key('Description'):
                 desc = dict.info['Description']
                 if string.find(desc, "DEPRECATED") != -1:
@@ -2287,7 +2294,8 @@ class docBuilder:
 
     def serialize(self):
         filename = "%s/%s-api.xml" % (self.path, self.name)
-        print "Saving XML description %s" % (filename)
+        if not quiet:
+            print "Saving XML description %s" % (filename)
         output = open(filename, "w")
         output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n')
         output.write("<api name='%s'>\n" % self.name)
@@ -2323,7 +2331,8 @@ class docBuilder:
         output.close()
 
         filename = "%s/%s-refs.xml" % (self.path, self.name)
-        print "Saving XML Cross References %s" % (filename)
+        if not quiet:
+            print "Saving XML Cross References %s" % (filename)
         output = open(filename, "w")
         output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n')
         output.write("<apirefs name='%s'>\n" % self.name)
@@ -2336,7 +2345,8 @@ def rebuild():
     builder = None
     srcdir = os.environ["srcdir"]
     if glob.glob(srcdir + "/../src/libvirt.c") != [] :
-        print "Rebuilding API description for libvirt"
+        if not quiet:
+            print "Rebuilding API description for libvirt"
         dirs = [srcdir + "/../src",
                 srcdir + "/../src/util",
                 srcdir + "/../include/libvirt"]
@@ -2344,12 +2354,13 @@ def rebuild():
             dirs.append("../include/libvirt")
         builder = docBuilder("libvirt", srcdir, dirs, [])
     elif glob.glob("src/libvirt.c") != [] :
-        print "Rebuilding API description for libvirt"
+        if not quiet:
+            print "Rebuilding API description for libvirt"
         builder = docBuilder("libvirt", srcdir,
                              ["src", "src/util", "include/libvirt"],
                              [])
     else:
-        print "rebuild() failed, unable to guess the module"
+        self.warning("rebuild() failed, unable to guess the module")
         return None
     builder.scan()
     builder.analyze()
@@ -2370,3 +2381,7 @@ if __name__ == "__main__":
         parse(sys.argv[1])
     else:
         rebuild()
+    if warnings > 0:
+        sys.exit(2)
+    else:
+        sys.exit(0)
index 0edb3e4cb33b4df6c4cc595bf532703c7712fef0..a4c9a6b2c0038efd6ca08ca5ecf1b16f598437b1 100644 (file)
@@ -53,11 +53,11 @@ GENERATED= libvirt-export.c \
           libvirt.h \
           libvirt.py
 
-generated.stamp: $(srcdir)/$(GENERATE) $(API_DESC)
-       $(PYTHON) $(srcdir)/$(GENERATE) $(PYTHON)
+$(GENERATE).stamp: $(srcdir)/$(GENERATE) $(API_DESC)
+       $(AM_V_GEN)$(PYTHON) $(srcdir)/$(GENERATE) $(PYTHON) && \
        touch $@
 
-$(GENERATED): generated.stamp
+$(GENERATED): $(GENERATE).stamp
 
 $(libvirtmod_la_OBJECTS): $(GENERATED)
 
index c27ff739a47db0f8981ef19456fb0b1594f32721..1cb82f5cea6578af4a7298278eae029e2bcecf3b 100755 (executable)
@@ -11,6 +11,8 @@ import sys
 import string
 import re
 
+quiet=True
+
 if __name__ == "__main__":
     # launched as a script
     srcPref = os.path.dirname(sys.argv[0])
@@ -617,7 +619,8 @@ def buildStubs():
             sys.exit(1)
 
     n = len(functions.keys())
-    print "Found %d functions in libvirt-api.xml" % (n)
+    if not quiet:
+        print "Found %d functions in libvirt-api.xml" % (n)
 
     py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject")
     try:
@@ -629,8 +632,8 @@ def buildStubs():
     except IOError, msg:
         print file, ":", msg
 
-
-    print "Found %d functions in libvirt-override-api.xml" % (
+    if not quiet:
+        print "Found %d functions in libvirt-override-api.xml" % (
           len(functions.keys()) - n)
     nb_wrap = 0
     failed = 0
@@ -662,20 +665,21 @@ def buildStubs():
     export.close()
     wrapper.close()
 
-    print "Generated %d wrapper functions" % nb_wrap
+    if not quiet:
+        print "Generated %d wrapper functions" % nb_wrap
 
     if unknown_types:
         print "Missing type converters: "
         for type in unknown_types.keys():
             print "%s:%d " % (type, len(unknown_types[type])),
 
-    print
-
     for f in functions_failed:
         print "ERROR: failed %s" % f
 
     if failed > 0:
         return -1
+    if len(unknown_types) > 0:
+        return -1
     return 0
 
 #######################################################################
index 94a9a430cb1fe208dcc57ea7a34a004a22d07f0e..f4ff489a763a516eabec657d67eb8ec3472ba035 100644 (file)
@@ -796,7 +796,7 @@ endif
 BUILT_SOURCES += $(ESX_DRIVER_GENERATED)
 
 $(ESX_DRIVER_GENERATED): $(srcdir)/esx/esx_vi_generator.input $(srcdir)/esx/esx_vi_generator.py
-       -srcdir=$(srcdir) $(srcdir)/esx/esx_vi_generator.py
+       $(AM_V_GEN)srcdir=$(srcdir) $(srcdir)/esx/esx_vi_generator.py
 
 if WITH_ESX
 if WITH_DRIVER_MODULES