1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
import os
from .utils import *
from .pythons import *
class ExtendedConfig:
'''Global configuration that specifies what the entire process will do.
Unlike Config, this class contains also various derived properties
for convenience.
'''
def __init__(self, user_config, **kwargs):
for k in user_config:
self.__dict__[k] = user_config[k]
for k in kwargs:
setattr(self, k, kwargs[k])
# These are defaults, overrides can be specified as vc_paths in Config above
default_vc_paths = {
# where msvc 9 is installed, for python 2.6-3.2
'vc9': [
'c:/program files (x86)/microsoft visual studio 9.0',
'c:/program files/microsoft visual studio 9.0',
],
# where msvc 10 is installed, for python 3.3-3.4
'vc10': [
'c:/program files (x86)/microsoft visual studio 10.0',
'c:/program files/microsoft visual studio 10.0',
],
# where msvc 14 is installed, for python 3.5-3.9
'vc14': [
'c:/program files (x86)/microsoft visual studio 14.0',
'c:/program files/microsoft visual studio 14.0',
],
}
@property
def nasm_path(self):
return select_existing_path(self.__dict__['nasm_path'])
@property
def activestate_perl_path(self):
return select_existing_path(self.__dict__['activestate_perl_path'])
@property
def archives_path(self):
return os.path.join(self.root, 'archives')
@property
def state_path(self):
return os.path.join(self.root, 'state')
@property
def git_bin_path(self):
#git_bin_path = os.path.join(git_root, 'bin')
return ''
@property
def git_path(self):
return os.path.join(self.git_bin_path, 'git')
@property
def rm_path(self):
return find_in_paths('rm', self.msysgit_bin_paths)
@property
def cp_path(self):
return find_in_paths('cp', self.msysgit_bin_paths)
@property
def sed_path(self):
return find_in_paths('sed', self.msysgit_bin_paths)
@property
def tar_path(self):
return find_in_paths('tar', self.msysgit_bin_paths)
@property
def activestate_perl_bin_path(self):
return os.path.join(self.activestate_perl_path, 'bin')
@property
def winbuild_patch_root(self):
return os.path.join(self.winbuild_root, 'winbuild')
@property
def openssl_version_tuple(self):
return tuple(
int(part) if part < 'a' else part
for part in re.sub(r'([a-z])', r'.\1', self.openssl_version).split('.')
)
@property
def libssh2_version_tuple(self):
return tuple(int(part) for part in self.libssh2_version.split('.'))
@property
def cares_version_tuple(self):
return tuple(int(part) for part in self.cares_version.split('.'))
@property
def libcurl_version_tuple(self):
return tuple(int(part) for part in self.libcurl_version.split('.'))
@property
def python_releases(self):
return [PythonRelease('.'.join(version.split('.')[:2]))
for version in self.python_versions]
@property
def extra_bin_paths(self):
paths = {32: {}, 64: {}}
# When using visual studio 2019 community, rc.exe is not in path for whatever reason - handle this manually.
paths[32]['rc_bin'] = os.path.dirname(glob_first('c:/{program files,program files (x86)}/windows kits/*/bin/*/x86/rc.exe'))
paths[64]['rc_bin'] = os.path.dirname(glob_first('c:/{program files,program files (x86)}/windows kits/*/bin/*/x64/rc.exe'))
return paths
BITNESSES = (32, 64)
PYTHON_VC_VERSIONS = {
'2.6': 'vc9',
'2.7': 'vc9',
'3.2': 'vc9',
'3.3': 'vc10',
'3.4': 'vc10',
'3.5': 'vc14',
'3.6': 'vc14',
'3.7': 'vc14',
'3.8': 'vc14',
'3.9': 'vc14',
}
class BuildConfig:
'''Parameters for a particular build configuration.
Unlike ExtendedConfig, this class fixes bitness and Python version.
'''
def __init__(self, ext_config, **kwargs):
for k in dir(ext_config):
if k.startswith('_'):
continue
self.__dict__[k] = getattr(ext_config, k)
for k in kwargs:
setattr(self, k, kwargs[k])
assert self.bitness
assert self.bitness in (32, 64)
assert self.vc_version
@property
def vc_tag(self):
return '%s-%s' % (self.vc_version, self.bitness)
|