mirror of https://github.com/grpc/grpc.git
parent
0b53cc6bce
commit
9ba7b4462c
3 changed files with 67 additions and 0 deletions
@ -0,0 +1,64 @@ |
||||
# Copyright 2016 gRPC authors. |
||||
# |
||||
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
# you may not use this file except in compliance with the License. |
||||
# You may obtain a copy of the License at |
||||
# |
||||
# http://www.apache.org/licenses/LICENSE-2.0 |
||||
# |
||||
# Unless required by applicable law or agreed to in writing, software |
||||
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
# See the License for the specific language governing permissions and |
||||
# limitations under the License. |
||||
"""Patches the spawn() command for windows compilers. |
||||
|
||||
Windows has an 8191 character command line limit, but some compilers |
||||
support an @command_file directive where command_file is a file |
||||
containing the full command line. |
||||
""" |
||||
|
||||
from distutils import ccompiler |
||||
import os |
||||
import os.path |
||||
import shutil |
||||
import sys |
||||
import tempfile |
||||
|
||||
MAX_COMMAND_LENGTH = 8191 |
||||
|
||||
_classic_spawn = ccompiler.CCompiler.spawn |
||||
|
||||
|
||||
def _commandfile_spawn(self, command, **kwargs): |
||||
command_length = sum([len(arg) for arg in command]) |
||||
if os.name == "nt" and command_length > MAX_COMMAND_LENGTH: |
||||
# Even if this command doesn't support the @command_file, it will |
||||
# fail as is so we try blindly |
||||
print("Command line length exceeded, using command file") |
||||
print(" ".join(command)) |
||||
temporary_directory = tempfile.mkdtemp() |
||||
command_filename = os.path.abspath( |
||||
os.path.join(temporary_directory, "command") |
||||
) |
||||
with open(command_filename, "w") as command_file: |
||||
escaped_args = [ |
||||
'"' + arg.replace("\\", "\\\\") + '"' for arg in command[1:] |
||||
] |
||||
# add each arg on a separate line to avoid hitting the |
||||
# "line in command file contains 131071 or more characters" error |
||||
# (can happen for extra long link commands) |
||||
command_file.write(" \n".join(escaped_args)) |
||||
modified_command = command[:1] + ["@{}".format(command_filename)] |
||||
try: |
||||
_classic_spawn(self, modified_command, **kwargs) |
||||
finally: |
||||
shutil.rmtree(temporary_directory) |
||||
else: |
||||
_classic_spawn(self, command, **kwargs) |
||||
|
||||
|
||||
def monkeypatch_spawn(): |
||||
"""Monkeypatching is dumb, but it's either that or we become maintainers of |
||||
something much, much bigger.""" |
||||
ccompiler.CCompiler.spawn = _commandfile_spawn |
Loading…
Reference in new issue