Index: webkit/build/rule_bison.py |
=================================================================== |
--- webkit/build/rule_bison.py (revision 0) |
+++ webkit/build/rule_bison.py (revision 0) |
@@ -0,0 +1,75 @@ |
+#!/usr/bin/python |
+ |
+# 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. |
+ |
+# usage: rule_bison.py INPUT_FILE OUTPUT_DIR |
+# INPUT_FILE is a path to either CSSGrammar.y or XPathGrammar.y. |
+# OUTPUT_DIR is where the bison-generated .cpp and .h files should be placed. |
+ |
+import errno |
+import os |
+import os.path |
+import subprocess |
+import sys |
+ |
+assert len(sys.argv) == 3 |
+ |
+input_file = sys.argv[1] |
+output_dir = sys.argv[2] |
+ |
+input_name = os.path.basename(input_file) |
+assert input_name == 'CSSGrammar.y' or input_name == 'XPathGrammar.y' |
+prefix = {'CSSGrammar.y': 'cssyy', 'XPathGrammar.y': 'xpathyy'}[input_name] |
+ |
+(input_root, input_ext) = os.path.splitext(input_name) |
+ |
+# The generated .h will be in a different location depending on the bison |
+# version. |
+output_h_tries = [ |
+ os.path.join(output_dir, input_root + '.cpp.h'), |
+ os.path.join(output_dir, input_root + '.hpp'), |
+] |
+ |
+for output_h_try in output_h_tries: |
+ try: |
+ os.unlink(output_h_try) |
+ except OSError, e: |
+ if e.errno != errno.ENOENT: |
+ raise |
+ |
+output_cpp = os.path.join(output_dir, input_root + '.cpp') |
+ |
+return_code = subprocess.call(['bison', '-d', '-p', prefix, input_file, |
+ '-o', output_cpp]) |
+assert return_code == 0 |
+ |
+# Find the name that bison used for the generated header file. |
+output_h_tmp = None |
+for output_h_try in output_h_tries: |
+ try: |
+ os.stat(output_h_try) |
+ output_h_tmp = output_h_try |
+ break |
+ except OSError, e: |
+ if e.errno != errno.ENOENT: |
+ raise |
+ |
+assert output_h_tmp != None |
+ |
+# Read the header file in under the generated name and remove it. |
+output_h_file = open(output_h_tmp) |
+output_h_contents = output_h_file.read() |
+output_h_file.close() |
+os.unlink(output_h_tmp) |
+ |
+# Rewrite the generated header with #include guards. |
+output_h = os.path.join(output_dir, input_root + '.h') |
+ |
+output_h_file = open(output_h, 'w') |
+print >>output_h_file, '#ifndef %s_h' % input_root |
+print >>output_h_file, '#define %s_h' % input_root |
+print >>output_h_file, output_h_contents |
+print >>output_h_file, '#endif' |
+output_h_file.close() |
Property changes on: webkit/build/rule_bison.py |
___________________________________________________________________ |
Added: svn:executable |
+ * |
Added: svn:eol-style |
+ LF |