Index: webkit/support/setup_third_party.py |
diff --git a/webkit/support/setup_third_party.py b/webkit/support/setup_third_party.py |
index 50c7cc22b83ba31cde6f2fb7f74169557128eddd..0f4099d7a4905e9465b8de9157c6d30a3999e293 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() |