diff --git a/waflib/Context.py b/waflib/Context.py index 2fadde09..5148dd74 100644 --- a/waflib/Context.py +++ b/waflib/Context.py @@ -334,9 +334,8 @@ class Context(ctx): cargs = {} if 'timeout' in kw: cargs['timeout'] = kw['timeout'] - if kw['timeout'] is not None: - if kw['shell']: - Logs.warn('Shell commands cannot timeout %r', cmd) + if not 'start_new_session' in kw: + kw['start_new_session'] = True del kw['timeout'] if 'input' in kw: if kw['input']: @@ -420,9 +419,8 @@ class Context(ctx): cargs = {} if 'timeout' in kw: cargs['timeout'] = kw['timeout'] - if kw['timeout'] is not None: - if kw['shell']: - Logs.warn('Shell commands cannot timeout %r', cmd) + if not 'start_new_session' in kw: + kw['start_new_session'] = True del kw['timeout'] if 'input' in kw: if kw['input']: diff --git a/waflib/Utils.py b/waflib/Utils.py index 9e84109d..bbab2c80 100644 --- a/waflib/Utils.py +++ b/waflib/Utils.py @@ -9,7 +9,7 @@ The portability fixes try to provide a consistent behavior of the Waf API through Python versions 2.5 to 3.X and across different platforms (win32, linux, etc) """ -import os, sys, errno, traceback, inspect, re, datetime, platform, base64 +import os, sys, errno, traceback, inspect, re, datetime, platform, base64, signal try: import cPickle except ImportError: @@ -865,7 +865,10 @@ def run_regular_process(cmd, kwargs, cargs={}): try: out, err = proc.communicate(**cargs) except TimeoutExpired: - proc.kill() + try: + os.killpg(proc.pid, signal.SIGKILL) + except AttributeError: + proc.kill() out, err = proc.communicate() raise TimeoutExpired(proc.args, timeout=cargs['timeout'], output=out, stderr=err) status = proc.returncode @@ -874,7 +877,10 @@ def run_regular_process(cmd, kwargs, cargs={}): try: status = proc.wait(**cargs) except TimeoutExpired as e: - proc.kill() + try: + os.killpg(proc.pid, signal.SIGKILL) + except AttributeError: + proc.kill() proc.wait() raise e return status, out, err diff --git a/waflib/processor.py b/waflib/processor.py index b1ce9ac6..96e93cfa 100755 --- a/waflib/processor.py +++ b/waflib/processor.py @@ -2,7 +2,7 @@ # encoding: utf-8 # Thomas Nagy, 2016 (ita) -import sys, traceback, base64 +import os, sys, traceback, base64, signal try: import cPickle except ImportError: @@ -34,7 +34,10 @@ def run(): try: out, err = proc.communicate(**cargs) except TimeoutExpired: - proc.kill() + try: + os.killpg(proc.pid, signal.SIGKILL) + except AttributeError: + proc.kill() out, err = proc.communicate() raise TimeoutExpired(proc.args, timeout=cargs['timeout'], output=out, stderr=err) ret = proc.returncode