summaryrefslogtreecommitdiffstats
path: root/long_gcc.py
diff options
context:
space:
mode:
Diffstat (limited to 'long_gcc.py')
-rw-r--r--long_gcc.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/long_gcc.py b/long_gcc.py
new file mode 100644
index 0000000000..20ca2a7f77
--- /dev/null
+++ b/long_gcc.py
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+"""
+def build(bld):
+ bld.load('long_gcc')
+"""
+
+import os, tempfile
+from waflib import Task
+
+def exec_command(self, cmd, **kw):
+ # workaround for command line length limit:
+ # http://support.microsoft.com/kb/830473
+ tmp = None
+ try:
+ if not isinstance(cmd, str) and len(str(cmd)) > 8192:
+ (fd, tmp) = tempfile.mkstemp(dir=self.generator.bld.bldnode.abspath())
+ flat = ['"%s"' % x.replace('\\', '\\\\').replace('"', '\\"') for x in cmd[1:]]
+ try:
+ os.write(fd, ' '.join(flat).encode())
+ finally:
+ if tmp:
+ os.close(fd)
+ # Line may be very long:
+ # Logs.debug('runner:' + ' '.join(flat))
+ cmd = [cmd[0], '@' + tmp]
+ ret = super(self.__class__, self).exec_command(cmd, **kw)
+ finally:
+ if tmp:
+ os.remove(tmp)
+ return ret
+
+def wrap_class(class_name):
+ cls = Task.classes.get(class_name)
+ if not cls:
+ return None
+ derived_class = type(class_name, (cls,), {})
+ derived_class.exec_command = exec_command
+ if hasattr(cls, 'hcode'):
+ derived_class.hcode = cls.hcode
+ return derived_class
+
+for k in 'c cxx cprogram cxxprogram cshlib cxxshlib cstlib cxxstlib'.split():
+ wrap_class(k)