webengine/osswebengine/Bakefiles/update-file-lists.py
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/Bakefiles/update-file-lists.py	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,180 @@
+#!/usr/bin/python
+
+# Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1.  Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer. 
+# 2.  Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution. 
+# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+#     its contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission. 
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# A script to make sure the source file list for the Bakefiles is up-to-date
+# with the MSVC project files. 
+
+import sys, os
+from xml.dom import minidom
+
+WebKitRoot = ".."
+
+
+class MSVS8Compiler:
+    def __init__(self):
+        self.precomp_headers = True
+        self.warning_level = "default"
+        self.defines = []
+        self.includes = []
+
+    def fromXML(self, tool):
+        if tool.attributes.has_key("AdditionalIncludeDirectories"):
+            includes_string = tool.attributes["AdditionalIncludeDirectories"].value
+            includes_string = includes_string.replace(""", '"')
+            includes_string = includes_string.replace("$", "$(DOLLAR)")
+            self.includes = includes_string.split(";")
+
+        if tool.attributes.has_key("PreprocessorDefinitions"):
+            self.defines = tool.attributes["PreprocessorDefinitions"].value.split(";")
+
+class MSVS8Config:
+    def __init__(self):
+        self.target_type="exe"
+        self.target_name="Release"
+        self.output_dir = ""
+        self.build_dir = ""
+        self.pre_build_step = ""
+        self.compiler = MSVS8Compiler()
+
+    def fromXML(self, config):
+        if config.attributes.has_key("Name"):
+            self.target_name = config.attributes["Name"].value
+
+        config_type = config.attributes["ConfigurationType"].value
+        if config_type == "1":
+            self.target_type = "exe"
+        elif config_type == "2":
+            self.target_type = "dll"
+        elif config_type == "4":
+            self.target_type = "lib"
+        else:
+            print "Unknown project type %s. Exiting..." % (config_type)
+            sys.exit(1)
+
+        tools = config.getElementsByTagName("Tool")
+        
+        for tool in tools: 
+           if tool.attributes.has_key("Name") and tool.attributes["Name"].value == "VCPreBuildEventTool" and tool.attributes.has_key("VCPreBuildEventTool"):
+               self.pre_build_step = tool.attributes["VCPreBuildEventTool"].value
+               continue
+
+           if tool.attributes.has_key("Name") and tool.attributes["Name"].value == "VCCLCompilerTool":
+               self.compiler.fromXML(tool)
+                                
+    def asBkl(self, doc):
+        target = doc.createElement(self.target_type)
+        target.setAttribute("id", self.target_name)
+
+        return target
+
+class MSVS8Filter:
+    def __init__(self):
+        self.files = []
+        self.name = ""
+        self.varname = ""
+        self.prefix = "WEBCORE_"
+
+    def fromXML(self, filter):
+        if filter.attributes.has_key("Name"):
+            self.name = filter.attributes["Name"].value
+            self.varname = self.prefix + "SOURCES_" + self.name.upper()
+
+        for node in filter.childNodes:
+            if node.nodeName == "File" and node.attributes.has_key("RelativePath"):
+                filename = node.attributes["RelativePath"].value.replace("$", "$(DOLLAR)")
+                filename = filename.replace("\\", "/")
+                filename = "\t\t" + filename.replace("../../", "")
+                if os.path.splitext(filename)[1] in [".c", ".cpp"]:
+                    self.files.append(filename)
+
+    def asBkl(self, doc):
+        sources = doc.createElement("set")
+        if self.name != "":
+            sources.setAttribute("var", self.varname)
+            # currently we 'flatten' the MSVC sources hierarchy to a simple list
+            # so we may end up with duplicates for self.varname when the root
+            # and subfolders share the same name. For now, just make sure the 
+            # sources are added together as part of the target
+            sources.setAttribute("append", "1")
+
+        sources_text = "\n"
+        for afile in self.files:
+            sources_text += afile + "\n"
+
+        sources.appendChild(doc.createTextNode(sources_text))
+        return sources
+
+class MSVS8Project:
+    def __init__(self):
+        self.configs = []
+        self.file_list = []
+        self.prefix = "WEBCORE_"
+
+    def loadFromXML(self, filename):
+        doc = minidom.parse(filename)
+        configs = doc.getElementsByTagName("Configuration")
+        for config in configs:
+            config_obj = MSVS8Config()
+            config_obj.fromXML(config)
+            self.configs.append(config_obj)
+
+        if filename.find("JavaScriptCore") != -1:
+            self.prefix = "JSCORE_"
+
+        files = doc.getElementsByTagName("Filter")
+        for node in files:
+            files = MSVS8Filter()
+            files.prefix = self.prefix
+            files.fromXML(node)
+            self.file_list.append(files)
+
+    def saveAsBkl(self, filename):
+        doc = minidom.Document()
+        makefile = doc.createElement("makefile")
+        source_tags = []
+        for files in self.file_list:
+            makefile.appendChild(files.asBkl(doc))
+
+        doc.appendChild(makefile)
+
+        outfile = open(filename, "w")
+        outfile.write(doc.toprettyxml())
+        outfile.close()
+        
+jsdir = os.path.join(WebKitRoot, "JavaScriptCore")
+wcdir = os.path.join(WebKitRoot, "WebCore")
+
+files = { jsdir: os.path.join(jsdir, "JavaScriptCore.vcproj", "JavaScriptCore", "JavaScriptCore.vcproj"),
+          wcdir: os.path.join(wcdir, "WebCore.vcproj", "WebCore", "WebCore.vcproj")
+        }
+
+for adir in files:
+    project = MSVS8Project()
+    project.loadFromXML(files[adir])
+    outputfile = os.path.join(adir, os.path.splitext(os.path.basename(files[adir]))[0] + "Sources.bkl")
+    project.saveAsBkl(outputfile)