diff --git a/Wrapping/Tools/vtkParseJava.c b/Wrapping/Tools/vtkParseJava.c
index 10dffd264dec077a769a89d237fdd575ec14cae9..1acbb48924dade56e3856a9245bc21ec3680ee4f 100644
--- a/Wrapping/Tools/vtkParseJava.c
+++ b/Wrapping/Tools/vtkParseJava.c
@@ -982,8 +982,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   if (!fp)
   {
     fprintf(stderr, "Error opening output file %s\n", options->OutputFileName);
-    vtkParse_Finalize();
-    return 1;
+    return vtkParse_FinalizeMain(1);
   }
 
   /* get the main class */
@@ -993,11 +992,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     WriteDummyClass(fp, data, options->OutputFileName);
     fclose(fp);
     vtkWrap_WarnEmpty(options);
-    if (vtkParse_Finalize())
-    {
-      return 1;
-    }
-    return 0;
+    return vtkParse_FinalizeMain(0);
   }
 
   if (data->Template)
@@ -1005,11 +1000,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     WriteDummyClass(fp, data, options->OutputFileName);
     fclose(fp);
     vtkWrap_WarnEmpty(options);
-    if (vtkParse_Finalize())
-    {
-      return 1;
-    }
-    return 0;
+    return vtkParse_FinalizeMain(0);
   }
 
   for (i = 0; i < data->NumberOfSuperClasses; ++i)
@@ -1019,11 +1010,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
       WriteDummyClass(fp, data, options->OutputFileName);
       fclose(fp);
       vtkWrap_WarnEmpty(options);
-      if (vtkParse_Finalize())
-      {
-        return 1;
-      }
-      return 0;
+      return vtkParse_FinalizeMain(0);
     }
   }
 
@@ -1034,11 +1021,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
       WriteDummyClass(fp, data, options->OutputFileName);
       fclose(fp);
       vtkWrap_WarnEmpty(options);
-      if (vtkParse_Finalize())
-      {
-        return 1;
-      }
-      return 0;
+      return vtkParse_FinalizeMain(0);
     }
 
     /* resolve using declarations within the header files */
@@ -1200,10 +1183,6 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   }
 
   vtkParse_Free(file_info);
-  if (vtkParse_Finalize())
-  {
-    return 1;
-  }
 
-  return 0;
+  return vtkParse_FinalizeMain(0);
 }
diff --git a/Wrapping/Tools/vtkParseMain.c b/Wrapping/Tools/vtkParseMain.c
index 6170321a914053a85b9681539a30199b1975a980..35fd5fdc4b44f4392952f59f8ca705cb349b5a86 100644
--- a/Wrapping/Tools/vtkParseMain.c
+++ b/Wrapping/Tools/vtkParseMain.c
@@ -188,7 +188,7 @@ static int read_option_file(StringCache* strings, const char* filename, int* arg
         if (option_file_stack_size == option_file_stack_max)
         {
           fprintf(stderr, "%s: @file recursion is too deep.\n", (*args)[0]);
-          exit(1);
+          exit(vtkParse_FinalizeMain(1));
         }
         /* avoid reading the same file recursively */
         option_file_stack[option_file_stack_size++] = filename;
@@ -423,13 +423,11 @@ const OptionInfo* vtkParse_GetCommandLineOptions(void)
   return &options;
 }
 
-int vtkParse_Finalize(void)
+int vtkParse_FinalizeMain(int ret)
 {
-  int ret = 0;
-
-  if (options.DependencyFileName && vtkParse_WriteDependencyFile(options.DependencyFileName))
+  if (ret == 0 && options.DependencyFileName)
   {
-    ret = 1;
+    ret = vtkParse_WriteDependencyFile(options.DependencyFileName);
   }
   vtkParse_FinalizeDependencyTracking();
 
@@ -470,12 +468,12 @@ FileInfo* vtkParse_Main(int argc, char* argv[])
   if (argi == 0)
   {
     free(args);
-    exit(0);
+    exit(vtkParse_FinalizeMain(0));
   }
   else if (argi < 0 || options.NumberOfFiles != 1)
   {
     parse_print_help(stderr, args[0], 0);
-    exit(1);
+    exit(vtkParse_FinalizeMain(1));
   }
 
   /* open the input file */
@@ -484,7 +482,7 @@ FileInfo* vtkParse_Main(int argc, char* argv[])
   if (!(ifile = vtkParse_FileOpen(options.InputFileName, "r")))
   {
     fprintf(stderr, "Error opening input file %s\n", options.InputFileName);
-    exit(1);
+    exit(vtkParse_FinalizeMain(1));
   }
 
   /* free the expanded args */
@@ -500,7 +498,7 @@ FileInfo* vtkParse_Main(int argc, char* argv[])
   {
     fprintf(stderr, "No output file was specified\n");
     fclose(ifile);
-    exit(1);
+    exit(vtkParse_FinalizeMain(1));
   }
 
   if (options.DependencyFileName && options.OutputFileName)
@@ -525,7 +523,7 @@ FileInfo* vtkParse_Main(int argc, char* argv[])
   if (options.DumpMacros)
   {
     /* do nothing (the dump occurred in ParseFile above) */
-    exit(0);
+    exit(vtkParse_FinalizeMain(0));
   }
 
   /* open and parse each hint file, if given on the command line */
@@ -540,7 +538,7 @@ FileInfo* vtkParse_Main(int argc, char* argv[])
         fprintf(stderr, "Error opening hint file %s\n", hfilename);
         fclose(ifile);
         vtkParse_FreeFile(data);
-        exit(1);
+        exit(vtkParse_FinalizeMain(1));
       }
 
       /* fill in some blanks by using the hints file */
@@ -595,12 +593,12 @@ StringCache* vtkParse_MainMulti(int argc, char* argv[])
 
   if (argi == 0)
   {
-    exit(0);
+    exit(vtkParse_FinalizeMain(0));
   }
   else if (argi < 0 || options.NumberOfFiles == 0)
   {
     parse_print_help(stderr, argv[0], 1);
-    exit(1);
+    exit(vtkParse_FinalizeMain(1));
   }
 
   if (options.DependencyFileName && options.OutputFileName)
diff --git a/Wrapping/Tools/vtkParseMain.h b/Wrapping/Tools/vtkParseMain.h
index b3f6fe8ef3ea84bb967a200e9eefefd0c324a3c4..7a508408b242bf74e54adf23b902cec5050262a2 100644
--- a/Wrapping/Tools/vtkParseMain.h
+++ b/Wrapping/Tools/vtkParseMain.h
@@ -82,10 +82,12 @@ extern "C"
    * Perform any finalization required.
    *
    * This includes writing the dependency tracker information and cleaning up
-   * memory.
+   * memory.  Call this at the end of any program that calls vtkParse_Main().
+   * The return value is zero if finalization was successful and nonzero
+   * if finalization encountered an error.
    */
   VTKWRAPPINGTOOLS_EXPORT
-  int vtkParse_Finalize(void);
+  int vtkParse_FinalizeMain(int ret);
 
   /**
    * The main function, which parses the input file and returns the result.
diff --git a/Wrapping/Tools/vtkWrapHierarchy.c b/Wrapping/Tools/vtkWrapHierarchy.c
index 308e1b61794dd6478fbea3e09f1cd24d895aae86..02966819c6f1470bafba6d5ac116c4482ccb24fb 100644
--- a/Wrapping/Tools/vtkWrapHierarchy.c
+++ b/Wrapping/Tools/vtkWrapHierarchy.c
@@ -899,8 +899,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   if (options->OutputFileName == NULL)
   {
     fprintf(stderr, "No output file was specified\n");
-    vtkParse_Finalize();
-    return 1;
+    return vtkParse_FinalizeMain(1);
   }
 
   /* read the data file */
@@ -966,9 +965,6 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   free(string_cache);
   free(files);
   free(lines);
-  if (vtkParse_Finalize())
-  {
-    return 1;
-  }
-  return retValue;
+
+  return vtkParse_FinalizeMain(retValue);
 }
diff --git a/Wrapping/Tools/vtkWrapJava.c b/Wrapping/Tools/vtkWrapJava.c
index 05d251c0d164552ac65c2d8a68aecea068a784e4..e315795bc9ea76e12f274028231ed5390f0d18b8 100644
--- a/Wrapping/Tools/vtkWrapJava.c
+++ b/Wrapping/Tools/vtkWrapJava.c
@@ -1350,8 +1350,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   if (!fp)
   {
     fprintf(stderr, "Error opening output file %s\n", options->OutputFileName);
-    vtkParse_Finalize();
-    return 1;
+    return vtkParse_FinalizeMain(1);
   }
 
   /* get the main class */
@@ -1359,22 +1358,14 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   if (data == NULL || data->IsExcluded)
   {
     fclose(fp);
-    if (vtkParse_Finalize())
-    {
-      return 1;
-    }
-    return 0;
+    return vtkParse_FinalizeMain(0);
   }
 
   if (data->Template)
   {
     fclose(fp);
     vtkWrap_WarnEmpty(options);
-    if (vtkParse_Finalize())
-    {
-      return 1;
-    }
-    return 0;
+    return vtkParse_FinalizeMain(0);
   }
 
   for (i = 0; i < data->NumberOfSuperClasses; ++i)
@@ -1383,11 +1374,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     {
       fclose(fp);
       vtkWrap_WarnEmpty(options);
-      if (vtkParse_Finalize())
-      {
-        return 1;
-      }
-      return 0;
+      return vtkParse_FinalizeMain(0);
     }
   }
 
@@ -1397,11 +1384,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     {
       fclose(fp);
       vtkWrap_WarnEmpty(options);
-      if (vtkParse_Finalize())
-      {
-        return 1;
-      }
-      return 0;
+      return vtkParse_FinalizeMain(0);
     }
 
     /* resolve using declarations within the header files */
@@ -1581,10 +1564,6 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
   vtkParse_Free(file_info);
 
   fclose(fp);
-  if (vtkParse_Finalize())
-  {
-    return 1;
-  }
 
-  return 0;
+  return vtkParse_FinalizeMain(0);
 }
diff --git a/Wrapping/Tools/vtkWrapPython.c b/Wrapping/Tools/vtkWrapPython.c
index ce630863cc1dfba57d396b9ec8cb179b59096bec..784247a48dc0bb8b2117963ca8cef852445ec946 100644
--- a/Wrapping/Tools/vtkWrapPython.c
+++ b/Wrapping/Tools/vtkWrapPython.c
@@ -299,8 +299,7 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     char* etext = strerror(e);
     etext = (etext ? etext : "Unknown error");
     fprintf(stderr, "Error %d opening output file %s: %s\n", e, options->OutputFileName, etext);
-    vtkParse_Finalize();
-    return 1;
+    return vtkParse_FinalizeMain(1);
   }
 
   /* get the filename without the extension */
@@ -597,10 +596,5 @@ int VTK_PARSE_MAIN(int argc, char* argv[])
     vtkWrap_WarnEmpty(options);
   }
 
-  if (vtkParse_Finalize())
-  {
-    return 1;
-  }
-
-  return 0;
+  return vtkParse_FinalizeMain(0);
 }