OSDN Git Service

Add new script that verifies if a .h file is missing any #include directives or forwa...
authorMarcel Gosselin <marcelgosselin@users.sourceforge.net>
Sat, 6 Sep 2008 02:42:19 +0000 (02:42 +0000)
committerMarcel Gosselin <marcelgosselin@users.sourceforge.net>
Sat, 6 Sep 2008 02:42:19 +0000 (02:42 +0000)
Tools/Scripts/HeaderFileAutonomyVerificator.py [new file with mode: 0644]
Tools/Scripts/ReadMe.txt

diff --git a/Tools/Scripts/HeaderFileAutonomyVerificator.py b/Tools/Scripts/HeaderFileAutonomyVerificator.py
new file mode 100644 (file)
index 0000000..4938b31
--- /dev/null
@@ -0,0 +1,115 @@
+import getopt
+import os.path
+import re
+import subprocess
+import sys
+import tempfile
+
+class TemporarySourceFile:
+    def __init__(self, headerFile):
+        self._headerFile = headerFile
+        fd, self._tempFileName = tempfile.mkstemp( '.cpp', os.path.basename(headerFile), os.path.dirname(headerFile), True)
+        tempFile = os.fdopen(fd,'w')
+        tempFile.write('#include "')
+        tempFile.write(headerFile)
+        tempFile.write('"')
+        tempFile.close()
+
+    def Compile(self, commandLine):
+        command = commandLine + "\"" + self._tempFileName + "\""
+        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+
+        process.wait()
+        if process.returncode == 0:
+            print "Compilation successful"
+        else:
+            print "Compilation failed!"
+            for line in process.stdout.readlines():
+                print line
+            print "Compilation failed!"
+    
+    def __del__(self):
+        if self._tempFileName is not None:
+            os.remove(self._tempFileName)
+
+
+def ExtractCommandLineFromFile(fileName):
+    file = open(fileName)
+    try:
+        return " ".join(file.readlines())
+    finally:
+        file.close()
+
+def RemovePrecompiledHeadersFromCompileCommand(compileCommand):
+    #TODO
+    #remove: /Yu"stdafx.h" /Fp"./../BuildTmp/MergeUnicodeDebug/Merge.pch"
+    return compileCommand
+
+def FixPathSeparatorsFromCompileCommand(compileCommand):
+    #TODO
+    return compileCommand
+
+def FixRelativePathsFromCompileCommand(compileCommand):
+    #TODO
+    return compileCommand
+
+
+def PrintUsage():
+    print """
+This script verifies if a C++ header file is self-contained by compiling
+a temporary file containing only the following line:
+#include "yourfile.h"
+
+The temporary file is compiled with the following command-line unless you
+override it with the -c argument:
+cl.exe /Od /I "." /I "./CompareEngines" /I "./Common" /I "./editlib" /I "./diffutils" /I "./diffutils/lib" /I "./diffutils/src" /I "../Externals/expat/lib" /I "../Externals/expat/xmlwf" /I "../Externals/scew" /I "../Externals/pcre/Win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_STDLIB_H" /D "STDC_HEADERS" /D "HAVE_STRING_H=1" /D "PR_FILE_NAME=\"pr\"" /D "DIFF_PROGRAM=\\"diff\\"" /D "REGEX_MALLOC" /D "__MSC__" /D "__NT__" /D "USG=1" /D "EDITPADC_CLASS=" /D "COMPILE_MULTIMON_STUBS" /D "UNICODE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_AFXDLL" /D "_UNICODE" /FD /EHsc /MDd /GS /GR /Yu"stdafx.h" /Fp"./../BuildTmp/MergeUnicodeDebug/Merge.pch" /Fo"./../BuildTmp/MergeUnicodeDebug/" /Fd"./../BuildTmp/MergeUnicodeDebug/" /FR"./../BuildTmp/MergeUnicodeDebug/" /W3 /nologo /c /Zi
+
+Note: Before you run this script, you must have set up the Visual Studio
+      environment variables through the following script (or similar)
+       "c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"
+
+Usage: HeaderFileAutonomyVerificator.py [-h] [-c commandfile] <headerfile>
+  where:
+    -h, --help              print this help
+    -c, --commandfile <ARG> override the default compilation command with the one
+                            defined in the file <ARG>
+    <headerfile>            header file to test
+                            
+"""
+
+def main(argv):
+
+    commandFile = None
+    
+    opts, args = getopt.getopt(argv, "hc:", [ "help", "commandfile=" ])
+    for opt, arg in opts:
+        if opt in ("-h", "--help"):
+            PrintUsage()
+            sys.exit()
+        if opt in ("-c", "--commandfile"):
+            commandFile = arg
+
+    if len(args) != 1:
+        PrintUsage()
+        sys.exit()
+
+    headerFile = args[0]
+
+    #compileCommand = r'cl.exe /Od /I "." /I "./CompareEngines" /I "./Common" /I "./editlib" /I "./diffutils" /I "./diffutils/lib" /I "./diffutils/src" /I "../Externals/expat/lib" /I "../Externals/expat/xmlwf" /I "../Externals/scew" /I "../Externals/pcre/Win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_STDLIB_H" /D "STDC_HEADERS" /D "HAVE_STRING_H=1" /D "PR_FILE_NAME=\"pr\"" /D "DIFF_PROGRAM=\\"diff\\"" /D "REGEX_MALLOC" /D "__MSC__" /D "__NT__" /D "USG=1" /D "EDITPADC_CLASS=" /D "COMPILE_MULTIMON_STUBS" /D "UNICODE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_AFXDLL" /D "_UNICODE" /FD /EHsc /MDd /GS /GR /Yu"stdafx.h" /Fp"./../BuildTmp/MergeUnicodeDebug/Merge.pch" /Fo"./../BuildTmp/MergeUnicodeDebug/" /Fd"./../BuildTmp/MergeUnicodeDebug/" /FR"./../BuildTmp/MergeUnicodeDebug/" /W3 /nologo /c /Zi '
+    compileCommand = r'cl.exe /Od /I "." /I "./CompareEngines" /I "./Common" /I "./editlib" /I "./diffutils" /I "./diffutils/lib" /I "./diffutils/src" /I "../Externals/expat/lib" /I "../Externals/expat/xmlwf" /I "../Externals/scew" /I "../Externals/pcre/Win32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_STDLIB_H" /D "STDC_HEADERS" /D "HAVE_STRING_H=1" /D "PR_FILE_NAME=\"pr\"" /D "DIFF_PROGRAM=\\"diff\\"" /D "REGEX_MALLOC" /D "__MSC__" /D "__NT__" /D "USG=1" /D "EDITPADC_CLASS=" /D "COMPILE_MULTIMON_STUBS" /D "UNICODE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_AFXDLL" /D "_UNICODE" /FD /EHsc /MDd /GS /GR /Fo"./../BuildTmp/MergeUnicodeDebug/" /Fd"./../BuildTmp/MergeUnicodeDebug/" /FR"./../BuildTmp/MergeUnicodeDebug/" /W3 /nologo /c /Zi '
+    if commandFile is not None:
+        compileCommand = ExtractCommandLineFromFile(commandFile)
+
+    compileCommand = RemovePrecompiledHeadersFromCompileCommand(compileCommand)
+    compileCommand = FixPathSeparatorsFromCompileCommand(compileCommand)
+    compileCommand = FixRelativePathsFromCompileCommand(compileCommand)
+
+    tempFile = TemporarySourceFile(headerFile)
+
+    #compile and print results
+    tempFile.Compile(compileCommand)
+    # problems with include paths being relative to vcproj while we compile from other folder???
+    
+### MAIN ###
+if __name__ == "__main__":
+    main(sys.argv[1:])
index f0da925..c672c8c 100644 (file)
@@ -1,5 +1,6 @@
 Some useful scripts:
 
+
 BuildManualChm.bat
 ------------------
 Batch file for creating HTML help (.chm) manual.
@@ -35,6 +36,7 @@ CheckVCProj.vbs
 ---------------
 Script for checking the file "Merge.vcproj".
 
+
 CompareProjectFiles.py
 ----------------------
 
@@ -51,6 +53,7 @@ CompareProjectFiles.py
                              2003: VisualStudio 2003 project file
                              2008: VisualStudio 2008 project file
 
+
 create_release.py
 -----------------
  Script for creating a release. Builds WinMerge components, exports sources,
@@ -66,6 +69,20 @@ create_release.py
    create_release -v 2.7.7.1
 
 
+HeaderFileAutonomyVerificator.py
+--------------------------------
+
+ Script that verifies if a C++ header file is missing #include directives or
+ forward declarations.
+
+ Usage: HeaderFileAutonomyVerificator.py [-h] [-c commandfile] <headerfile>
+  where:
+    -h, --help              print this help
+    -c, --commandfile <ARG> override the default compilation command with the one
+                            defined in the file <ARG>
+    <headerfile>            header file to test
+
+
 IncludeFileDependencyAnalyzer.py
 --------------------------------
  Script for finding all the files included (directly or indirectly) by
@@ -77,6 +94,7 @@ IncludeFileDependencyAnalyzer.py
                         Look at http://c2.com/cgi/wiki?CppDependencyAnalysis to learn how to
                         generate it.
 
+
 tsvn_patch.py
 -------------
  Script for cleaning up TortoiseSVN created patch files to use with GNU patch.