##// END OF EJS Templates
automation: support building Python 3 Inno installers...
Gregory Szorc -
r45278:802ee93c stable
parent child Browse files
Show More
@@ -63,7 +63,13 b' def bootstrap_windows_dev(hga: HGAutomat'
63 63
64 64
65 65 def build_inno(
66 hga: HGAutomation, aws_region, arch, revision, version, base_image_name
66 hga: HGAutomation,
67 aws_region,
68 python_version,
69 arch,
70 revision,
71 version,
72 base_image_name,
67 73 ):
68 74 c = hga.aws_connection(aws_region)
69 75 image = aws.ensure_windows_dev_ami(c, base_image_name=base_image_name)
@@ -74,10 +80,15 b' def build_inno('
74 80
75 81 windows.synchronize_hg(SOURCE_ROOT, revision, instance)
76 82
77 for a in arch:
78 windows.build_inno_installer(
79 instance.winrm_client, a, DIST_PATH, version=version
80 )
83 for py_version in python_version:
84 for a in arch:
85 windows.build_inno_installer(
86 instance.winrm_client,
87 py_version,
88 a,
89 DIST_PATH,
90 version=version,
91 )
81 92
82 93
83 94 def build_wix(
@@ -146,12 +157,15 b' def build_all_windows_packages('
146 157 dest_path=DIST_PATH,
147 158 )
148 159
160 for py_version in (2, 3):
161 for arch in ('x86', 'x64'):
162 windows.purge_hg(winrm_client)
163 windows.build_inno_installer(
164 winrm_client, py_version, arch, DIST_PATH, version=version
165 )
166
149 167 for arch in ('x86', 'x64'):
150 168 windows.purge_hg(winrm_client)
151 windows.build_inno_installer(
152 winrm_client, arch, DIST_PATH, version=version
153 )
154 windows.purge_hg(winrm_client)
155 169 windows.build_wix_installer(
156 170 winrm_client, arch, DIST_PATH, version=version
157 171 )
@@ -309,6 +323,14 b' def get_parser():'
309 323 'build-inno', help='Build Inno Setup installer(s)',
310 324 )
311 325 sp.add_argument(
326 '--python-version',
327 help='Which version of Python to target',
328 choices={2, 3},
329 type=int,
330 nargs='*',
331 default=[3],
332 )
333 sp.add_argument(
312 334 '--arch',
313 335 help='Architecture to build for',
314 336 choices={'x86', 'x64'},
@@ -68,7 +68,17 b' hg.exe log -r .'
68 68 Write-Output "updated Mercurial working directory to {revision}"
69 69 '''.lstrip()
70 70
71 BUILD_INNO = r'''
71 BUILD_INNO_PYTHON3 = r'''
72 $Env:RUSTUP_HOME = "C:\hgdev\rustup"
73 $Env:CARGO_HOME = "C:\hgdev\cargo"
74 Set-Location C:\hgdev\src
75 C:\hgdev\python37-x64\python.exe contrib\packaging\packaging.py inno --pyoxidizer-target {pyoxidizer_target} --version {version}
76 if ($LASTEXITCODE -ne 0) {{
77 throw "process exited non-0: $LASTEXITCODE"
78 }}
79 '''
80
81 BUILD_INNO_PYTHON2 = r'''
72 82 Set-Location C:\hgdev\src
73 83 $python = "C:\hgdev\python27-{arch}\python.exe"
74 84 C:\hgdev\python37-x64\python.exe contrib\packaging\packaging.py inno --python $python {extra_args}
@@ -108,8 +118,10 b" WHEEL_FILENAME_PYTHON37_X64 = 'mercurial"
108 118 WHEEL_FILENAME_PYTHON38_X86 = 'mercurial-{version}-cp38-cp38-win32.whl'
109 119 WHEEL_FILENAME_PYTHON38_X64 = 'mercurial-{version}-cp38-cp38-win_amd64.whl'
110 120
111 X86_EXE_FILENAME = 'Mercurial-{version}-x86-python2.exe'
112 X64_EXE_FILENAME = 'Mercurial-{version}-x64-python2.exe'
121 EXE_FILENAME_PYTHON2_X86 = 'Mercurial-{version}-x86-python2.exe'
122 EXE_FILENAME_PYTHON2_X64 = 'Mercurial-{version}-x64-python2.exe'
123 EXE_FILENAME_PYTHON3_X86 = 'Mercurial-{version}-x86.exe'
124 EXE_FILENAME_PYTHON3_X64 = 'Mercurial-{version}-x64.exe'
113 125 X86_MSI_FILENAME = 'mercurial-{version}-x86-python2.msi'
114 126 X64_MSI_FILENAME = 'mercurial-{version}-x64-python2.msi'
115 127
@@ -118,12 +130,21 b" MERCURIAL_SCM_BASE_URL = 'https://mercur"
118 130 X86_USER_AGENT_PATTERN = '.*Windows.*'
119 131 X64_USER_AGENT_PATTERN = '.*Windows.*(WOW|x)64.*'
120 132
121 X86_EXE_DESCRIPTION = (
122 'Mercurial {version} Inno Setup installer - x86 Windows '
133 EXE_PYTHON2_X86_DESCRIPTION = (
134 'Mercurial {version} Inno Setup installer - x86 Windows (Python 2) '
135 '- does not require admin rights'
136 )
137 EXE_PYTHON2_X64_DESCRIPTION = (
138 'Mercurial {version} Inno Setup installer - x64 Windows (Python 2) '
123 139 '- does not require admin rights'
124 140 )
125 X64_EXE_DESCRIPTION = (
126 'Mercurial {version} Inno Setup installer - x64 Windows '
141 # TODO remove Python version once Python 2 is dropped.
142 EXE_PYTHON3_X86_DESCRIPTION = (
143 'Mercurial {version} Inno Setup installer - x86 Windows (Python 3) '
144 '- does not require admin rights'
145 )
146 EXE_PYTHON3_X64_DESCRIPTION = (
147 'Mercurial {version} Inno Setup installer - x64 Windows (Python 3) '
127 148 '- does not require admin rights'
128 149 )
129 150 X86_MSI_DESCRIPTION = (
@@ -285,22 +306,48 b' def copy_latest_dist(winrm_client, patte'
285 306
286 307
287 308 def build_inno_installer(
288 winrm_client, arch: str, dest_path: pathlib.Path, version=None
309 winrm_client,
310 python_version: int,
311 arch: str,
312 dest_path: pathlib.Path,
313 version=None,
289 314 ):
290 315 """Build the Inno Setup installer on a remote machine.
291 316
292 317 Using a WinRM client, remote commands are executed to build
293 318 a Mercurial Inno Setup installer.
294 319 """
295 print('building Inno Setup installer for %s' % arch)
320 print(
321 'building Inno Setup installer for Python %d %s'
322 % (python_version, arch)
323 )
324
325 if python_version == 3:
326 # TODO fix this limitation in packaging code
327 if not version:
328 raise Exception(
329 "version string is required when building for Python 3"
330 )
296 331
297 extra_args = []
298 if version:
299 extra_args.extend(['--version', version])
332 if arch == "x86":
333 target_triple = "i686-pc-windows-msvc"
334 elif arch == "x64":
335 target_triple = "x86_64-pc-windows-msvc"
336 else:
337 raise Exception("unhandled arch: %s" % arch)
300 338
301 ps = get_vc_prefix(arch) + BUILD_INNO.format(
302 arch=arch, extra_args=' '.join(extra_args)
303 )
339 ps = BUILD_INNO_PYTHON3.format(
340 pyoxidizer_target=target_triple, version=version,
341 )
342 else:
343 extra_args = []
344 if version:
345 extra_args.extend(['--version', version])
346
347 ps = get_vc_prefix(arch) + BUILD_INNO_PYTHON2.format(
348 arch=arch, extra_args=' '.join(extra_args)
349 )
350
304 351 run_powershell(winrm_client, ps)
305 352 copy_latest_dist(winrm_client, '*.exe', dest_path)
306 353
@@ -388,16 +435,20 b' def resolve_all_artifacts(dist_path: pat'
388 435 dist_path / WHEEL_FILENAME_PYTHON37_X64.format(version=version),
389 436 dist_path / WHEEL_FILENAME_PYTHON38_X86.format(version=version),
390 437 dist_path / WHEEL_FILENAME_PYTHON38_X64.format(version=version),
391 dist_path / X86_EXE_FILENAME.format(version=version),
392 dist_path / X64_EXE_FILENAME.format(version=version),
438 dist_path / EXE_FILENAME_PYTHON2_X86.format(version=version),
439 dist_path / EXE_FILENAME_PYTHON2_X64.format(version=version),
440 dist_path / EXE_FILENAME_PYTHON3_X86.format(version=version),
441 dist_path / EXE_FILENAME_PYTHON3_X64.format(version=version),
393 442 dist_path / X86_MSI_FILENAME.format(version=version),
394 443 dist_path / X64_MSI_FILENAME.format(version=version),
395 444 )
396 445
397 446
398 447 def generate_latest_dat(version: str):
399 x86_exe_filename = X86_EXE_FILENAME.format(version=version)
400 x64_exe_filename = X64_EXE_FILENAME.format(version=version)
448 python2_x86_exe_filename = EXE_FILENAME_PYTHON2_X86.format(version=version)
449 python2_x64_exe_filename = EXE_FILENAME_PYTHON2_X64.format(version=version)
450 python3_x86_exe_filename = EXE_FILENAME_PYTHON3_X86.format(version=version)
451 python3_x64_exe_filename = EXE_FILENAME_PYTHON3_X64.format(version=version)
401 452 x86_msi_filename = X86_MSI_FILENAME.format(version=version)
402 453 x64_msi_filename = X64_MSI_FILENAME.format(version=version)
403 454
@@ -406,15 +457,29 b' def generate_latest_dat(version: str):'
406 457 '10',
407 458 version,
408 459 X86_USER_AGENT_PATTERN,
409 '%s/%s' % (MERCURIAL_SCM_BASE_URL, x86_exe_filename),
410 X86_EXE_DESCRIPTION.format(version=version),
460 '%s/%s' % (MERCURIAL_SCM_BASE_URL, python3_x86_exe_filename),
461 EXE_PYTHON3_X86_DESCRIPTION.format(version=version),
411 462 ),
412 463 (
413 464 '10',
414 465 version,
415 466 X64_USER_AGENT_PATTERN,
416 '%s/%s' % (MERCURIAL_SCM_BASE_URL, x64_exe_filename),
417 X64_EXE_DESCRIPTION.format(version=version),
467 '%s/%s' % (MERCURIAL_SCM_BASE_URL, python3_x64_exe_filename),
468 EXE_PYTHON3_X64_DESCRIPTION.format(version=version),
469 ),
470 (
471 '9',
472 version,
473 X86_USER_AGENT_PATTERN,
474 '%s/%s' % (MERCURIAL_SCM_BASE_URL, python2_x86_exe_filename),
475 EXE_PYTHON2_X86_DESCRIPTION.format(version=version),
476 ),
477 (
478 '9',
479 version,
480 X64_USER_AGENT_PATTERN,
481 '%s/%s' % (MERCURIAL_SCM_BASE_URL, python2_x64_exe_filename),
482 EXE_PYTHON2_X64_DESCRIPTION.format(version=version),
418 483 ),
419 484 (
420 485 '10',
General Comments 0
You need to be logged in to leave comments. Login now