| #!/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) |