summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-09-05 17:26:50 +0200
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2015-06-23 14:37:23 +0000
commit13e265168bea1c64fcff3e4f9756b10d830893fe (patch)
tree82c464694bb448e1d6b7ace76cf392335aa3de1d
parent27815a532dc143d47348ab1a11b871dc1ed29afa (diff)
downloadqtwebengine-chromium-13e265168bea1c64fcff3e4f9756b10d830893fe.tar.gz
<third_party/WebKit> Prevent a python IOError on Windows due to MAX_PATH
Running python down into the WebKit directory structure and referring a file relatively to the build directory can easily spill over the 260 char limit on Windows. Resolve the absolute path using join and normpath to work around the issue. The script for aggregating the generated bindings suffered from the same error on Windows as the other generator python scripts. The bison script for compiling grammars suffers from the MAX_PATH IOError issue on Windows. This occurs when doing a shadow build that results in large relative paths in the generated GYP actions. The scripts for generating and aggregating the v8 bindings all suffer from an IOError on Windows when doing a shadow build that results in very large relative paths being used in the generated GYP actions. Change-Id: I86f57fc94e8ff633e2499a08b8cafa7df9b39210 Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com> Reviewed-by: Jocelyn Turcotte (Woboq GmbH) <jturcotte@woboq.com>
-rwxr-xr-xchromium/third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py6
-rw-r--r--chromium/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py4
-rwxr-xr-xchromium/third_party/WebKit/Source/bindings/scripts/idl_compiler.py6
-rw-r--r--chromium/third_party/WebKit/Source/bindings/scripts/utilities.py12
-rwxr-xr-xchromium/third_party/WebKit/Source/build/scripts/rule_bison.py5
-rw-r--r--chromium/third_party/WebKit/Source/build/scripts/utilities.py10
-rw-r--r--chromium/third_party/jinja2/bccache.py4
7 files changed, 35 insertions, 12 deletions
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py b/chromium/third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py
index 05e9ffd8906..79ec4331b02 100755
--- a/chromium/third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/aggregate_generated_bindings.py
@@ -53,7 +53,7 @@ import os
import re
import sys
-from utilities import should_generate_impl_file_from_idl, get_file_contents, idl_filename_to_component, idl_filename_to_interface_name, read_idl_files_list_from_file
+from utilities import should_generate_impl_file_from_idl, get_file_contents, idl_filename_to_component, idl_filename_to_interface_name, read_idl_files_list_from_file, abs
# A regexp for finding Conditional attributes in interface definitions.
CONDITIONAL_PATTERN = re.compile(
@@ -181,7 +181,7 @@ def main(args):
if len(args) <= 4:
raise Exception('Expected at least 5 arguments.')
component_dir = args[1]
- input_file_name = args[2]
+ input_file_name = abs(args[2])
in_out_break_index = args.index('--')
output_file_names = args[in_out_break_index + 1:]
@@ -201,7 +201,7 @@ def main(args):
file_contents = generate_content(component_dir,
aggregate_partial_interfaces,
files_meta_data_this_partition)
- write_content(file_contents, file_name)
+ write_content(file_contents, abs(file_name))
if __name__ == '__main__':
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py b/chromium/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
index 90efcc7f03f..fb19e6e6196 100644
--- a/chromium/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/code_generator_v8.py
@@ -80,7 +80,7 @@ import v8_interface
import v8_types
import v8_union
from v8_utilities import capitalize, cpp_name, conditional_string, v8_class_name
-from utilities import KNOWN_COMPONENTS, idl_filename_to_component, is_valid_component_dependency, is_testing_target
+from utilities import KNOWN_COMPONENTS, idl_filename_to_component, is_valid_component_dependency, is_testing_target, abs
def render_template(include_paths, header_template, cpp_template,
@@ -429,7 +429,7 @@ def runtime_enabled_if(code, runtime_enabled_function_name):
def main(argv):
# If file itself executed, cache templates
try:
- cache_dir = argv[1]
+ cache_dir = abs(argv[1])
dummy_filename = argv[2]
except IndexError as err:
print 'Usage: %s CACHE_DIR DUMMY_FILENAME' % argv[0]
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/idl_compiler.py b/chromium/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
index 7734def8dbe..8c9fc08f557 100755
--- a/chromium/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/idl_compiler.py
@@ -40,7 +40,7 @@ import sys
from code_generator_v8 import CodeGeneratorDictionaryImpl, CodeGeneratorV8, CodeGeneratorUnionType
from idl_reader import IdlReader
-from utilities import create_component_info_provider, read_idl_files_list_from_file, write_file, idl_filename_to_component
+from utilities import create_component_info_provider, read_idl_files_list_from_file, write_file, idl_filename_to_component, abs
def parse_options():
@@ -148,8 +148,8 @@ def generate_bindings(options, input_filename):
info_provider = create_component_info_provider(
options.info_dir, options.target_component)
idl_compiler = IdlCompilerV8(
- options.output_directory,
- cache_directory=options.cache_directory,
+ abs(options.output_directory),
+ cache_directory=abs(options.cache_directory),
info_provider=info_provider,
only_if_changed=options.write_file_only_if_changed,
target_component=options.target_component)
diff --git a/chromium/third_party/WebKit/Source/bindings/scripts/utilities.py b/chromium/third_party/WebKit/Source/bindings/scripts/utilities.py
index 8bd855514bd..c94bcdf1c9d 100644
--- a/chromium/third_party/WebKit/Source/bindings/scripts/utilities.py
+++ b/chromium/third_party/WebKit/Source/bindings/scripts/utilities.py
@@ -212,13 +212,20 @@ def create_component_info_provider(info_dir, component):
# Basic file reading/writing
################################################################################
+def abs(filename):
+ # open, abspath, etc. are all limited to the 260 char MAX_PATH and this causes
+ # problems when we try to resolve long relative paths in the WebKit directory structure.
+ return os.path.normpath(os.path.join(os.getcwd(), filename))
+
def get_file_contents(filename):
+ filename = abs(filename)
with open(filename) as f:
return f.read()
def read_file_to_list(filename):
"""Returns a list of (stripped) lines for a given filename."""
+ filename = abs(filename)
with open(filename) as f:
return [line.rstrip('\n') for line in f]
@@ -240,7 +247,7 @@ def resolve_cygpath(cygdrive_names):
def read_idl_files_list_from_file(filename):
"""Similar to read_file_to_list, but also resolves cygpath."""
- with open(filename) as input_file:
+ with open(abs(filename)) as input_file:
file_names = sorted([os.path.realpath(line.rstrip('\n'))
for line in input_file])
idl_file_names = [file_name for file_name in file_names
@@ -253,11 +260,13 @@ def read_idl_files_list_from_file(filename):
def read_pickle_files(pickle_filenames):
for pickle_filename in pickle_filenames:
+ pickle_filename = abs(pickle_filename)
with open(pickle_filename) as pickle_file:
yield pickle.load(pickle_file)
def write_file(new_text, destination_filename, only_if_changed):
+ destination_filename = abs(destination_filename)
if only_if_changed and os.path.isfile(destination_filename):
with open(destination_filename) as destination_file:
if destination_file.read() == new_text:
@@ -270,6 +279,7 @@ def write_file(new_text, destination_filename, only_if_changed):
def write_pickle_file(pickle_filename, data, only_if_changed):
+ pickle_filename = abs(pickle_filename)
if only_if_changed and os.path.isfile(pickle_filename):
with open(pickle_filename) as pickle_file:
try:
diff --git a/chromium/third_party/WebKit/Source/build/scripts/rule_bison.py b/chromium/third_party/WebKit/Source/build/scripts/rule_bison.py
index 870f3b56f28..e72e87e56fe 100755
--- a/chromium/third_party/WebKit/Source/build/scripts/rule_bison.py
+++ b/chromium/third_party/WebKit/Source/build/scripts/rule_bison.py
@@ -41,11 +41,12 @@ import os
import os.path
import subprocess
import sys
+from utilities import abs
assert len(sys.argv) == 3 or len(sys.argv) == 4
-inputFile = sys.argv[1]
-outputDir = sys.argv[2]
+inputFile = abs(sys.argv[1])
+outputDir = abs(sys.argv[2])
bisonExe = 'bison'
if len(sys.argv) > 3:
bisonExe = sys.argv[3]
diff --git a/chromium/third_party/WebKit/Source/build/scripts/utilities.py b/chromium/third_party/WebKit/Source/build/scripts/utilities.py
new file mode 100644
index 00000000000..f236b04cc77
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/build/scripts/utilities.py
@@ -0,0 +1,10 @@
+# Copyright 2014 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.
+
+import os
+
+def abs(filename):
+ # open, abspath, etc. are all limited to the 260 char MAX_PATH and this causes
+ # problems when we try to resolve long relative paths in the WebKit directory structure.
+ return os.path.normpath(os.path.join(os.getcwd(), filename))
diff --git a/chromium/third_party/jinja2/bccache.py b/chromium/third_party/jinja2/bccache.py
index f2f9db61b31..332220a2238 100644
--- a/chromium/third_party/jinja2/bccache.py
+++ b/chromium/third_party/jinja2/bccache.py
@@ -207,7 +207,9 @@ class FileSystemBytecodeCache(BytecodeCache):
self.pattern = pattern
def _get_cache_filename(self, bucket):
- return path.join(self.directory, self.pattern % bucket.key)
+ # Relative path might be longer than 260 characters (MAX_PATH) especially when
+ # shadow building on Windows. To avoid errors use potentially shorter absolute paths.
+ return path.join(path.abspath(self.directory), self.pattern % bucket.key)
def load_bytecode(self, bucket):
f = open_if_exists(self._get_cache_filename(bucket), 'rb')