summaryrefslogtreecommitdiffstats
path: root/webkit/support/setup_third_party.py
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/support/setup_third_party.py')
-rwxr-xr-xwebkit/support/setup_third_party.py101
1 files changed, 42 insertions, 59 deletions
diff --git a/webkit/support/setup_third_party.py b/webkit/support/setup_third_party.py
index 50c7cc2..0f4099d 100755
--- a/webkit/support/setup_third_party.py
+++ b/webkit/support/setup_third_party.py
@@ -11,16 +11,29 @@ import sys
def GetHeaderFilesInDir(dir_path):
- """Return a list of all header files in dir_path."""
+ """Return a list of all header files under dir_path
+ (as absolute native paths)."""
all_files = []
for root, dirs, files in os.walk(dir_path):
- # Backslashes get shell escaped by gyp, so force forward slash for
- # path separators.
- all_files.extend([os.path.join(root, f).replace(os.sep, '/')
- for f in files if f.endswith('.h')])
+ all_files.extend([os.path.join(root, f) for f in files if f.endswith('.h')])
return all_files
+def PathForInclude(path):
+ # We should always use unix-style forward slashes in #includes.
+ return path.replace(os.sep, '/')
+
+
+def NativePath(path):
+ return path.replace('/', os.sep)
+
+
+def PathForGyp(path):
+ # GYP will try to shell-escape backslashes, so we should always
+ # return unix-style paths with forward slashes as the directory separators.
+ return path.replace(os.sep, '/')
+
+
def Inputs(args):
"""List the files in the provided input dir.
@@ -31,7 +44,7 @@ def Inputs(args):
return -1
for filename in GetHeaderFilesInDir(args[0]):
- print filename
+ print PathForGyp(filename)
return 0
@@ -45,37 +58,34 @@ def Outputs(args):
print "'outputs' expects an input directory and an output directory."
return -1
- base_input_dir = args[0]
- output_dir = args[1]
+ base_input_dir = NativePath(args[0])
+ output_dir = NativePath(args[1])
input_files = GetHeaderFilesInDir(base_input_dir)
for filename in input_files:
- rel_path = filename[len(base_input_dir) + 1:]
- # Backslashes get shell escaped by gyp, so force forward slash for
- # path separators.
- print os.path.join(output_dir, rel_path).replace(os.sep, '/')
+ rel_path = os.path.relpath(filename, base_input_dir)
+ print PathForGyp(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.
+ args: A list with 3 values, the input dir, the output dir, and the dir
+ that #include paths will be relative to..
Returns: 0 on success, other value on error."""
- if len(args) != 2 and len(args) != 3:
+ if len(args) != 3:
print ("'setup_headers' expects an input directory, an output directory, ."
- "and an optional directory to make includes relative to.")
+ "and a directory to make includes relative to.")
return -1
- base_input_dir = args[0]
- output_dir = args[1]
- relative_to_dir = None
- if len(args) == 3:
- relative_to_dir = args[2]
+ base_input_dir = NativePath(args[0])
+ output_dir = NativePath(args[1])
+ relative_to_dir = NativePath(args[2])
input_files = GetHeaderFilesInDir(base_input_dir)
for input_filename in input_files:
- rel_path = input_filename[len(base_input_dir) + 1:]
+ rel_path = os.path.relpath(input_filename, base_input_dir)
out_filename = os.path.join(output_dir, rel_path)
TryToMakeDir(os.path.split(out_filename)[0])
- WriteSetupFilename(input_filename, out_filename, relative_to_dir)
+ WriteForwardingHeader(input_filename, out_filename, relative_to_dir)
def TryToMakeDir(dir_name):
@@ -87,47 +97,20 @@ def TryToMakeDir(dir_name):
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, relative_to_dir):
+def WriteForwardingHeader(input_filename, out_filename, relative_to_dir):
"""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]
-
- if sys.platform == 'win32':
- # Windows has a file path limit of 260 characters that we can hit when
- # generating these forwarding headers. Instead of writing the full
- # relative path, just write the path relative to the WebKit/chromium dir,
- # which is in the include path.
- rel_path = input_filename[len(ancestor):]
- if relative_to_dir:
- rel_path = os.path.join(relative_to_dir, rel_path)
- else:
- rel_path = os.path.join('/'.join(['..'] * num_parent_dirs),
- input_filename[len(ancestor):])
-
+ # Windows has a file path limit of 260 characters, which can be hit when
+ # generating these forwarding headers. Instead of using an include
+ # that specifies the path relative to out_filename's dir, we compute a path
+ # relative to relative_to_dir, which must be included in gyp's include_dirs
+ # settings for this to work. Even those this is really only needed on
+ # Windows, we do this on all platforms to be consistent.
+ rel_path = os.path.relpath(input_filename, relative_to_dir)
out_file = open(out_filename, 'w')
out_file.write("""// This file is generated. Do not edit.
+// The include is relative to "%s".
#include "%s"
-""" % rel_path)
+""" % (os.path.abspath(relative_to_dir), PathForInclude(rel_path)))
out_file.close()