multiprocessing_bootstrap.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # Copyright (c) 2011 Google Inc. All rights reserved.
  2. # Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
  3. #
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions are
  6. # met:
  7. #
  8. # * Redistributions of source code must retain the above copyright
  9. # notice, this list of conditions and the following disclaimer.
  10. # * Redistributions in binary form must reproduce the above
  11. # copyright notice, this list of conditions and the following disclaimer
  12. # in the documentation and/or other materials provided with the
  13. # distribution.
  14. # * Neither the name of Google Inc. nor the names of its
  15. # contributors may be used to endorse or promote products derived from
  16. # this software without specific prior written permission.
  17. #
  18. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. """In order for the multiprocessing module to spawn children correctly on
  30. Windows, we need to be running a Python module that can be imported
  31. (which means a file in sys.path that ends in .py). In addition, we need to
  32. ensure that sys.path / PYTHONPATH is set and propagating correctly.
  33. This module enforces that."""
  34. import os
  35. import subprocess
  36. import sys
  37. from webkitpy.common import version_check # 'unused import' pylint: disable=W0611
  38. def run(*parts):
  39. up = os.path.dirname
  40. script_dir = up(up(up(os.path.abspath(__file__))))
  41. env = os.environ
  42. if 'PYTHONPATH' in env:
  43. if script_dir not in env['PYTHONPATH']:
  44. env['PYTHONPATH'] = env['PYTHONPATH'] + os.pathsep + script_dir
  45. else:
  46. env['PYTHONPATH'] = script_dir
  47. module_path = os.path.join(script_dir, *parts)
  48. cmd = [sys.executable, module_path] + sys.argv[1:]
  49. # Wrap processes in the jhbuild environment so DRT or WKTR
  50. # doesn't need to do it and their process id as reported by
  51. # subprocess.Popen is not jhbuild's.
  52. if '--gtk' in sys.argv[1:] and os.path.exists(os.path.join(script_dir, '..', '..', 'WebKitBuild', 'Dependencies')):
  53. prefix = [os.path.join(script_dir, '..', 'jhbuild', 'jhbuild-wrapper'), '--gtk', 'run']
  54. cmd = prefix + cmd
  55. proc = subprocess.Popen(cmd, env=env)
  56. try:
  57. proc.wait()
  58. except KeyboardInterrupt:
  59. # We need a second wait in order to make sure the subprocess exits fully.
  60. # FIXME: It would be nice if we could put a timeout on this.
  61. proc.wait()
  62. sys.exit(proc.returncode)