diff options
author | Steve Block <steveblock@google.com> | 2010-04-27 16:31:00 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-05-11 14:42:12 +0100 |
commit | dcc8cf2e65d1aa555cce12431a16547e66b469ee (patch) | |
tree | 92a8d65cd5383bca9749f5327fb5e440563926e6 /WebCore/WebCore.gyp/scripts | |
parent | ccac38a6b48843126402088a309597e682f40fe6 (diff) | |
download | external_webkit-dcc8cf2e65d1aa555cce12431a16547e66b469ee.zip external_webkit-dcc8cf2e65d1aa555cce12431a16547e66b469ee.tar.gz external_webkit-dcc8cf2e65d1aa555cce12431a16547e66b469ee.tar.bz2 |
Merge webkit.org at r58033 : Initial merge by git
Change-Id: If006c38561af287c50cd578d251629b51e4d8cd1
Diffstat (limited to 'WebCore/WebCore.gyp/scripts')
-rw-r--r-- | WebCore/WebCore.gyp/scripts/action_derivedsourcesallinone.py | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/WebCore/WebCore.gyp/scripts/action_derivedsourcesallinone.py b/WebCore/WebCore.gyp/scripts/action_derivedsourcesallinone.py new file mode 100644 index 0000000..6a11414 --- /dev/null +++ b/WebCore/WebCore.gyp/scripts/action_derivedsourcesallinone.py @@ -0,0 +1,201 @@ +#!/usr/bin/python +# +# Copyright (C) 2009 Google 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: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * 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. +# * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT +# OWNER OR 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. +# +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# action_derivedsourceslist.py generates a single cpp file that includes +# all v8 bindings cpp files generated from idls. Files can be assigned into +# multiple output files, to reduce maximum compilation unit size and allow +# parallel compilation. +# +# usage: action_derivedsourceslist.py IDL_FILES_LIST -- OUTPUT_FILE1 OUTPUT_FILE2 ... +# +# Note that IDL_FILES_LIST is a text file containing the IDL file paths. + +import errno +import os +import os.path +import re +import subprocess +import sys + +# A regexp for finding Conditional attributes in interface definitions. +conditionalPattern = re.compile('interface[\s]*\[[^\]]*Conditional=([\_0-9a-zA-Z&]*)') + +copyrightTemplate = """/* + * THIS FILE WAS AUTOMATICALLY GENERATED, DO NOT EDIT. + * + * This file was generated by the make_jni_lists.py script. + * + * Copyright (C) 2009 Google 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``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 COMPUTER, INC. OR + * 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. + */ +""" + + +# Wraps conditional with ENABLE() and && if more than one conditional is specified. +def formatConditional(conditional): + def wrapWithEnable(s): + return 'ENABLE(' + s + ')' + return ' && '.join(map(wrapWithEnable, conditional)) + + +# Find the conditional interface attribute. +def extractConditional(idlFilePath): + conditional = None + + # Read file and look for "interface [ Conditional=XXX ]". + idlFile = open(idlFilePath) + idlContents = idlFile.read().replace('\n', '') + idlFile.close() + + match = conditionalPattern.search(idlContents) + if match: + conditional = match.group(1) + conditional = conditional.split('&') + + return conditional + +# Extracts conditional and interface name from each IDL file. +def extractMetaData(filePaths): + metaDataList = [] + + for f in filePaths: + metaData = {} + if len(f) == 0: + continue + if not os.path.exists(f): + print 'WARNING: file not found: "%s"' % f + continue + + # Extract type name from file name + (parentPath, fileName) = os.path.split(f) + (interfaceName, ext) = os.path.splitext(fileName) + + if not ext == '.idl': + continue + + metaData = { + 'conditional': extractConditional(f), + 'name': interfaceName, + } + + metaDataList.append(metaData) + + return metaDataList + + +def generateContent(filesMetaData, partition, totalPartitions): + # Sort files by conditionals. + filesMetaData.sort() + + output = [] + + # Add fixed content. + output.append(copyrightTemplate) + output.append('#define NO_IMPLICIT_ATOMICSTRING\n\n') + + # List all includes segmented by if and endif. + prevConditional = None + for metaData in filesMetaData: + name = metaData['name'] + if (hash(name) % totalPartitions) != partition: + continue + conditional = metaData['conditional'] + + if prevConditional and prevConditional != conditional: + output.append('#endif\n') + if conditional and prevConditional != conditional: + output.append('\n#if %s\n' % formatConditional(conditional)) + + output.append('#include "bindings/V8%s.cpp"\n' % name) + + prevConditional = conditional + + if prevConditional: + output.append('#endif\n') + + return ''.join(output) + + +def writeContent(content, outputFileName): + (parentPath, fileName) = os.path.split(outputFileName) + if not os.path.exists(parentPath): + print parentPath + os.mkdir(parentPath) + f = open(outputFileName, 'w') + f.write(content) + f.close() + + +def main(args): + assert(len(args) > 3) + inOutBreakIndex = args.index('--') + inputFileName = args[1] + outputFileNames = args[inOutBreakIndex+1:] + + inputFile = open(inputFileName, 'r') + idlFileNames = inputFile.read().split('\n') + inputFile.close() + + filesMetaData = extractMetaData(idlFileNames) + for fileName in outputFileNames: + print 'Generating derived sources list into %s...' % fileName + partition = outputFileNames.index(fileName) + fileContents = generateContent(filesMetaData, partition, len(outputFileNames)) + writeContent(fileContents, fileName) + + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) |