Show More
@@ -12,6 +12,7 b' import pathlib' | |||||
12 | import shutil |
|
12 | import shutil | |
13 | import subprocess |
|
13 | import subprocess | |
14 | import sys |
|
14 | import sys | |
|
15 | import typing | |||
15 |
|
16 | |||
16 | from .downloads import download_entry |
|
17 | from .downloads import download_entry | |
17 | from .util import ( |
|
18 | from .util import ( | |
@@ -69,7 +70,11 b' def build_docs_html(source_dir: pathlib.' | |||||
69 |
|
70 | |||
70 |
|
71 | |||
71 | def run_pyoxidizer( |
|
72 | def run_pyoxidizer( | |
72 | source_dir: pathlib.Path, build_dir: pathlib.Path, target_triple: str, |
|
73 | source_dir: pathlib.Path, | |
|
74 | build_dir: pathlib.Path, | |||
|
75 | target_triple: str, | |||
|
76 | build_vars: typing.Optional[typing.Dict[str, str]] = None, | |||
|
77 | target: typing.Optional[str] = None, | |||
73 | ) -> pathlib.Path: |
|
78 | ) -> pathlib.Path: | |
74 | """Run `pyoxidizer` in an environment with access to build dependencies. |
|
79 | """Run `pyoxidizer` in an environment with access to build dependencies. | |
75 |
|
80 | |||
@@ -77,6 +82,8 b' def run_pyoxidizer(' | |||||
77 | artifacts. Actual build artifacts are likely in a sub-directory with the |
|
82 | artifacts. Actual build artifacts are likely in a sub-directory with the | |
78 | name of the pyoxidizer build target that was built. |
|
83 | name of the pyoxidizer build target that was built. | |
79 | """ |
|
84 | """ | |
|
85 | build_vars = build_vars or {} | |||
|
86 | ||||
80 | # We need to make gettext binaries available for compiling i18n files. |
|
87 | # We need to make gettext binaries available for compiling i18n files. | |
81 | gettext_pkg, gettext_entry = download_entry('gettext', build_dir) |
|
88 | gettext_pkg, gettext_entry = download_entry('gettext', build_dir) | |
82 | gettext_dep_pkg = download_entry('gettext-dep', build_dir)[0] |
|
89 | gettext_dep_pkg = download_entry('gettext-dep', build_dir)[0] | |
@@ -104,6 +111,12 b' def run_pyoxidizer(' | |||||
104 | target_triple, |
|
111 | target_triple, | |
105 | ] |
|
112 | ] | |
106 |
|
113 | |||
|
114 | for k, v in sorted(build_vars.items()): | |||
|
115 | args.extend(["--var", k, v]) | |||
|
116 | ||||
|
117 | if target: | |||
|
118 | args.append(target) | |||
|
119 | ||||
107 | subprocess.run(args, env=env, check=True) |
|
120 | subprocess.run(args, env=env, check=True) | |
108 |
|
121 | |||
109 | return source_dir / "build" / "pyoxidizer" / target_triple / "release" |
|
122 | return source_dir / "build" / "pyoxidizer" / target_triple / "release" |
@@ -22,7 +22,11 b' from .py2exe import (' | |||||
22 | build_py2exe, |
|
22 | build_py2exe, | |
23 | stage_install, |
|
23 | stage_install, | |
24 | ) |
|
24 | ) | |
25 | from .pyoxidizer import create_pyoxidizer_install_layout |
|
25 | from .pyoxidizer import ( | |
|
26 | build_docs_html, | |||
|
27 | create_pyoxidizer_install_layout, | |||
|
28 | run_pyoxidizer, | |||
|
29 | ) | |||
26 | from .util import ( |
|
30 | from .util import ( | |
27 | extract_zip_to_directory, |
|
31 | extract_zip_to_directory, | |
28 | normalize_windows_version, |
|
32 | normalize_windows_version, | |
@@ -386,37 +390,65 b' def build_installer_pyoxidizer(' | |||||
386 | """Build a WiX MSI installer using PyOxidizer.""" |
|
390 | """Build a WiX MSI installer using PyOxidizer.""" | |
387 | hg_build_dir = source_dir / "build" |
|
391 | hg_build_dir = source_dir / "build" | |
388 | build_dir = hg_build_dir / ("wix-%s" % target_triple) |
|
392 | build_dir = hg_build_dir / ("wix-%s" % target_triple) | |
389 | staging_dir = build_dir / "stage" |
|
|||
390 |
|
||||
391 | arch = "x64" if "x86_64" in target_triple else "x86" |
|
|||
392 |
|
393 | |||
393 | build_dir.mkdir(parents=True, exist_ok=True) |
|
394 | build_dir.mkdir(parents=True, exist_ok=True) | |
394 | create_pyoxidizer_install_layout( |
|
395 | ||
395 | source_dir, build_dir, staging_dir, target_triple |
|
396 | # Need to ensure docs HTML is built because this isn't done as part of | |
|
397 | # `pip install Mercurial`. | |||
|
398 | build_docs_html(source_dir) | |||
|
399 | ||||
|
400 | build_vars = {} | |||
|
401 | ||||
|
402 | if msi_name: | |||
|
403 | build_vars["MSI_NAME"] = msi_name | |||
|
404 | ||||
|
405 | if version: | |||
|
406 | build_vars["VERSION"] = version | |||
|
407 | ||||
|
408 | if extra_features: | |||
|
409 | build_vars["EXTRA_MSI_FEATURES"] = ";".join(extra_features) | |||
|
410 | ||||
|
411 | if signing_info: | |||
|
412 | if signing_info["cert_path"]: | |||
|
413 | build_vars["SIGNING_PFX_PATH"] = signing_info["cert_path"] | |||
|
414 | if signing_info["cert_password"]: | |||
|
415 | build_vars["SIGNING_PFX_PASSWORD"] = signing_info["cert_password"] | |||
|
416 | if signing_info["subject_name"]: | |||
|
417 | build_vars["SIGNING_SUBJECT_NAME"] = signing_info["subject_name"] | |||
|
418 | if signing_info["timestamp_url"]: | |||
|
419 | build_vars["TIME_STAMP_SERVER_URL"] = signing_info["timestamp_url"] | |||
|
420 | ||||
|
421 | if extra_wxs: | |||
|
422 | raise Exception( | |||
|
423 | "support for extra .wxs files has been temporarily dropped" | |||
|
424 | ) | |||
|
425 | ||||
|
426 | out_dir = run_pyoxidizer( | |||
|
427 | source_dir, | |||
|
428 | build_dir, | |||
|
429 | target_triple, | |||
|
430 | build_vars=build_vars, | |||
|
431 | target="msi", | |||
396 | ) |
|
432 | ) | |
397 |
|
433 | |||
398 | # We also install some extra files. |
|
434 | msi_dir = out_dir / "msi" | |
399 | process_install_rules(EXTRA_INSTALL_RULES, source_dir, staging_dir) |
|
435 | msi_files = [f for f in os.listdir(msi_dir) if f.endswith(".msi")] | |
400 |
|
436 | |||
401 | # And remove some files we don't want. |
|
437 | if len(msi_files) != 1: | |
402 | for f in STAGING_REMOVE_FILES: |
|
438 | raise Exception("expected exactly 1 .msi file; got %d" % len(msi_files)) | |
403 | p = staging_dir / f |
|
439 | ||
404 | if p.exists(): |
|
440 | msi_filename = msi_files[0] | |
405 | print('removing %s' % p) |
|
|||
406 | p.unlink() |
|
|||
407 |
|
441 | |||
408 | return run_wix_packaging( |
|
442 | msi_path = msi_dir / msi_filename | |
409 | source_dir, |
|
443 | dist_path = source_dir / "dist" / msi_filename | |
410 | build_dir, |
|
444 | ||
411 | staging_dir, |
|
445 | dist_path.parent.mkdir(parents=True, exist_ok=True) | |
412 | arch, |
|
446 | ||
413 | version, |
|
447 | shutil.copyfile(msi_path, dist_path) | |
414 | python2=False, |
|
448 | ||
415 | msi_name=msi_name, |
|
449 | return { | |
416 | extra_wxs=extra_wxs, |
|
450 | "msi_path": dist_path, | |
417 | extra_features=extra_features, |
|
451 | } | |
418 | signing_info=signing_info, |
|
|||
419 | ) |
|
|||
420 |
|
452 | |||
421 |
|
453 | |||
422 | def run_wix_packaging( |
|
454 | def run_wix_packaging( |
General Comments 0
You need to be logged in to leave comments.
Login now