summaryrefslogtreecommitdiffstats
path: root/webkit/support/setup_third_party.py
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/support/setup_third_party.py')
-rw-r--r--webkit/support/setup_third_party.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/webkit/support/setup_third_party.py b/webkit/support/setup_third_party.py
new file mode 100644
index 0000000..172ece7
--- /dev/null
+++ b/webkit/support/setup_third_party.py
@@ -0,0 +1,128 @@
+#!/usr/bin/python
+# Copyright (c) 2010 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.
+
+"A helper script for setting up forwarding headers."""
+
+import errno
+import os
+import sys
+
+
+def GetHeaderFilesInDir(dir_path):
+ """Return a list of all header files in dir_path."""
+ all_files = []
+ for root, dirs, files in os.walk(dir_path):
+ all_files.extend([os.path.join(root, f) for f in files if f.endswith('.h')])
+ return all_files
+
+
+def Inputs(args):
+ """List the files in the provided input dir.
+
+ args: A list with 1 value, the input dir.
+ Returns: 0 on success, other value on error."""
+ if len(args) != 1:
+ print "'inputs' expects only one input directory."
+ return -1
+
+ for filename in GetHeaderFilesInDir(args[0]):
+ print filename
+ return 0
+
+
+def Outputs(args):
+ """Takes an input dir and an output dir and figures out new output files
+ based on copying from the input dir to the output dir.
+
+ args: A list with 2 values, the input dir and the output dir.
+ Returns: 0 on success, other value on error."""
+ if len(args) != 2:
+ print "'outputs' expects an input directory and an output directory."
+ return -1
+
+ base_input_dir = args[0]
+ output_dir = args[1]
+ input_files = GetHeaderFilesInDir(base_input_dir)
+ for filename in input_files:
+ rel_path = filename[len(base_input_dir) + 1:]
+ print os.path.join(output_dir, rel_path)
+
+
+def SetupHeaders(args):
+ """Takes an input dir and an output dir and sets up forwarding headers
+ from output dir to files in input dir.
+ args: A list with 2 values, the input dir and the output dir.
+ Returns: 0 on success, other value on error."""
+ if len(args) != 2:
+ print "'setup_headers' expects an input directory and an output directory."
+ return -1
+
+ base_input_dir = args[0]
+ output_dir = args[1]
+ input_files = GetHeaderFilesInDir(base_input_dir)
+ for input_filename in input_files:
+ rel_path = input_filename[len(base_input_dir) + 1:]
+ out_filename = os.path.join(output_dir, rel_path)
+ TryToMakeDir(os.path.split(out_filename)[0])
+ WriteSetupFilename(input_filename, out_filename)
+
+
+def TryToMakeDir(dir_name):
+ """Create the directory dir_name if it doesn't exist."""
+ try:
+ os.makedirs(dir_name)
+ except OSError, e:
+ if e.errno != errno.EEXIST:
+ raise e
+
+
+def NormalizePath(path):
+ """Normalize path for use with os.path.commonprefix.
+ On windows, this makes sure that the drive letters are always in the
+ same case."""
+ abs_path = os.path.abspath(path)
+ drive, rest = os.path.splitdrive(abs_path)
+ return os.path.join(drive.lower(), rest)
+
+
+def WriteSetupFilename(input_filename, out_filename):
+ """Create a forwarding header from out_filename to input_filename."""
+ # Figure out the relative path from out_filename to input_filename.
+ # We can't use os.path.relpath since that's a python2.6 feature and we
+ # support python 2.5.
+ input_filename = NormalizePath(input_filename)
+ out_filename = NormalizePath(out_filename)
+ ancestor = os.path.commonprefix([input_filename, out_filename])
+
+ assert os.path.isdir(ancestor)
+ num_parent_dirs = 0
+ out_dir = os.path.split(out_filename)[0]
+ while os.path.normpath(ancestor) != os.path.normpath(out_dir):
+ num_parent_dirs += 1
+ out_dir = os.path.split(out_dir)[0]
+
+ rel_path = os.path.join('/'.join(['..'] * num_parent_dirs),
+ input_filename[len(ancestor):])
+
+ out_file = open(out_filename, 'w')
+ out_file.write("""// This file is generated. Do not edit.
+#include "%s"
+""" % rel_path)
+ out_file.close()
+
+
+def Main(argv):
+ commands = {
+ 'inputs': Inputs,
+ 'outputs': Outputs,
+ 'setup_headers': SetupHeaders,
+ }
+ command = argv[1]
+ args = argv[2:]
+ return commands[command](args)
+
+
+if __name__ == '__main__':
+ sys.exit(Main(sys.argv))