|  | @@ -31,6 +31,8 @@
 | 
	
		
			
				|  |  |  """Definition of targets to build artifacts."""
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import os.path
 | 
	
		
			
				|  |  | +import random
 | 
	
		
			
				|  |  | +import string
 | 
	
		
			
				|  |  |  import sys
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import jobset
 | 
	
	
		
			
				|  | @@ -79,27 +81,16 @@ _ARCH_FLAG_MAP = {
 | 
	
		
			
				|  |  |    'x64': '-m64'
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -python_windows_version_arch_map = {
 | 
	
		
			
				|  |  | -  ('x86', '2.7'): 'Python27_32bits',
 | 
	
		
			
				|  |  | -  ('x64', '2.7'): 'Python27',
 | 
	
		
			
				|  |  | -  ('x86', '3.4'): 'Python34_32bits',
 | 
	
		
			
				|  |  | -  ('x64', '3.4'): 'Python34',
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class PythonArtifact:
 | 
	
		
			
				|  |  |    """Builds Python artifacts."""
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  def __init__(self, platform, arch, python_version, manylinux_build=None):
 | 
	
		
			
				|  |  | -    if manylinux_build:
 | 
	
		
			
				|  |  | -      self.name = 'python%s_%s_%s_%s' % (python_version, platform, arch, manylinux_build)
 | 
	
		
			
				|  |  | -    else:
 | 
	
		
			
				|  |  | -      self.name = 'python%s_%s_%s' % (python_version, platform, arch)
 | 
	
		
			
				|  |  | +  def __init__(self, platform, arch, py_version):
 | 
	
		
			
				|  |  | +    self.name = 'python_%s_%s_%s' % (platform, arch, py_version)
 | 
	
		
			
				|  |  |      self.platform = platform
 | 
	
		
			
				|  |  |      self.arch = arch
 | 
	
		
			
				|  |  | -    self.labels = ['artifact', 'python', python_version, platform, arch]
 | 
	
		
			
				|  |  | -    self.python_version = python_version
 | 
	
		
			
				|  |  | -    self.python_windows_prefix = python_windows_version_arch_map[arch, python_version]
 | 
	
		
			
				|  |  | -    self.manylinux_build = manylinux_build
 | 
	
		
			
				|  |  | +    self.labels = ['artifact', 'python', platform, arch, py_version]
 | 
	
		
			
				|  |  | +    self.py_version = py_version
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def pre_build_jobspecs(self):
 | 
	
		
			
				|  |  |      return []
 | 
	
	
		
			
				|  | @@ -111,8 +102,8 @@ class PythonArtifact:
 | 
	
		
			
				|  |  |          environ['SETARCH_CMD'] = 'linux32'
 | 
	
		
			
				|  |  |        # Inside the manylinux container, the python installations are located in
 | 
	
		
			
				|  |  |        # special places...
 | 
	
		
			
				|  |  | -      environ['PYTHON'] = '/opt/python/{}/bin/python'.format(self.manylinux_build)
 | 
	
		
			
				|  |  | -      environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.manylinux_build)
 | 
	
		
			
				|  |  | +      environ['PYTHON'] = '/opt/python/{}/bin/python'.format(self.py_version)
 | 
	
		
			
				|  |  | +      environ['PIP'] = '/opt/python/{}/bin/pip'.format(self.py_version)
 | 
	
		
			
				|  |  |        # Platform autodetection for the manylinux1 image breaks so we set the
 | 
	
		
			
				|  |  |        # defines ourselves.
 | 
	
		
			
				|  |  |        # TODO(atash) get better platform-detection support in core so we don't
 | 
	
	
		
			
				|  | @@ -126,14 +117,24 @@ class PythonArtifact:
 | 
	
		
			
				|  |  |            environ=environ,
 | 
	
		
			
				|  |  |            timeout_seconds=60*60)
 | 
	
		
			
				|  |  |      elif self.platform == 'windows':
 | 
	
		
			
				|  |  | +      if 'Python27' in self.py_version or 'Python34' in self.py_version:
 | 
	
		
			
				|  |  | +        environ['EXT_COMPILER'] = 'mingw32'
 | 
	
		
			
				|  |  | +      else:
 | 
	
		
			
				|  |  | +        environ['EXT_COMPILER'] = 'msvc'
 | 
	
		
			
				|  |  | +      # For some reason, the batch script %random% always runs with the same
 | 
	
		
			
				|  |  | +      # seed.  We create a random temp-dir here
 | 
	
		
			
				|  |  | +      dir = ''.join(random.choice(string.ascii_uppercase) for _ in range(10))
 | 
	
		
			
				|  |  |        return create_jobspec(self.name,
 | 
	
		
			
				|  |  |                              ['tools\\run_tests\\build_artifact_python.bat',
 | 
	
		
			
				|  |  | -                             self.python_windows_prefix,
 | 
	
		
			
				|  |  | -                             '32' if self.arch == 'x86' else '64'
 | 
	
		
			
				|  |  | +                             self.py_version,
 | 
	
		
			
				|  |  | +                             '32' if self.arch == 'x86' else '64',
 | 
	
		
			
				|  |  | +                             dir
 | 
	
		
			
				|  |  |                              ],
 | 
	
		
			
				|  |  | +                            environ=environ,
 | 
	
		
			
				|  |  |                              shell=True)
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  | -      environ['PYTHON'] = 'python{}'.format(self.python_version)
 | 
	
		
			
				|  |  | +      environ['PYTHON'] = self.py_version
 | 
	
		
			
				|  |  | +      environ['SKIP_PIP_INSTALL'] = 'TRUE'
 | 
	
		
			
				|  |  |        return create_jobspec(self.name,
 | 
	
		
			
				|  |  |                              ['tools/run_tests/build_artifact_python.sh'],
 | 
	
		
			
				|  |  |                              environ=environ)
 | 
	
	
		
			
				|  | @@ -330,18 +331,23 @@ def targets():
 | 
	
		
			
				|  |  |             for Cls in (CSharpExtArtifact, NodeExtArtifact, ProtocArtifact)
 | 
	
		
			
				|  |  |             for platform in ('linux', 'macos', 'windows')
 | 
	
		
			
				|  |  |             for arch in ('x86', 'x64')] +
 | 
	
		
			
				|  |  | -          [PythonArtifact('linux', 'x86', '2.7', 'cp27-cp27m'),
 | 
	
		
			
				|  |  | -           PythonArtifact('linux', 'x86', '2.7', 'cp27-cp27mu'),
 | 
	
		
			
				|  |  | -           PythonArtifact('linux', 'x64', '2.7', 'cp27-cp27m'),
 | 
	
		
			
				|  |  | -           PythonArtifact('linux', 'x64', '2.7', 'cp27-cp27mu'),
 | 
	
		
			
				|  |  | -           PythonArtifact('macos', 'x64', '2.7'),
 | 
	
		
			
				|  |  | -           PythonArtifact('windows', 'x86', '2.7'),
 | 
	
		
			
				|  |  | -           PythonArtifact('windows', 'x64', '2.7'),
 | 
	
		
			
				|  |  | -           PythonArtifact('linux', 'x86', '3.4', 'cp34-cp34m'),
 | 
	
		
			
				|  |  | -           PythonArtifact('linux', 'x64', '3.4', 'cp34-cp34m'),
 | 
	
		
			
				|  |  | -           PythonArtifact('macos', 'x64', '3.4'),
 | 
	
		
			
				|  |  | -           PythonArtifact('windows', 'x86', '3.4'),
 | 
	
		
			
				|  |  | -           PythonArtifact('windows', 'x64', '3.4'),
 | 
	
		
			
				|  |  | +          [PythonArtifact('linux', 'x86', 'cp27-cp27m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x86', 'cp27-cp27mu'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x86', 'cp34-cp34m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x86', 'cp35-cp35m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x64', 'cp27-cp27m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x64', 'cp27-cp27mu'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x64', 'cp34-cp34m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('linux', 'x64', 'cp35-cp35m'),
 | 
	
		
			
				|  |  | +           PythonArtifact('macos', 'x64', 'python2.7'),
 | 
	
		
			
				|  |  | +           PythonArtifact('macos', 'x64', 'python3.4'),
 | 
	
		
			
				|  |  | +           PythonArtifact('macos', 'x64', 'python3.5'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x86', 'Python27_32bits'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x86', 'Python34_32bits'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x86', 'Python35_32bits'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x64', 'Python27'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x64', 'Python34'),
 | 
	
		
			
				|  |  | +           PythonArtifact('windows', 'x64', 'Python35'),
 | 
	
		
			
				|  |  |             RubyArtifact('linux', 'x86'),
 | 
	
		
			
				|  |  |             RubyArtifact('linux', 'x64'),
 | 
	
		
			
				|  |  |             RubyArtifact('macos', 'x64'),
 |