contrib/packaging/hgpackaging/inno.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 06 Dec 2021 10:23:51 +0100
branchstable
changeset 48434 d4c084160434
parent 47208 df1767fa822d
child 48848 17d5e25b8e78
permissions -rw-r--r--
test-upgrade: narrow the `debugformat` call when upgrading to dirstate-v2 This will make the test less noisy when new requirement are added. Differential Revision: https://phab.mercurial-scm.org/D11864
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
     1
# inno.py - Inno Setup functionality.
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
# no-check-code because Python 3 native.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    10
import os
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    11
import pathlib
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
import shutil
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    13
import subprocess
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
    15
import jinja2
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
    16
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    17
from .py2exe import (
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    18
    build_py2exe,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    19
    stage_install,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    20
)
47208
df1767fa822d packaging: rename run_pyoxidizer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 46364
diff changeset
    21
from .pyoxidizer import create_pyoxidizer_install_layout
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    22
from .util import (
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
    23
    find_legacy_vc_runtime_files,
44221
f37971c31067 packaging: set the FileVersion field in the Inno installer executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 43518
diff changeset
    24
    normalize_windows_version,
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    25
    process_install_rules,
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    26
    read_version_py,
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
    27
)
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    28
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    29
EXTRA_PACKAGES = {
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    30
    'dulwich',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    31
    'keyring',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    32
    'pygments',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    33
    'win32ctypes',
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    34
}
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    35
46364
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    36
EXTRA_INCLUDES = {
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    37
    '_curses',
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    38
    '_curses_panel',
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    39
}
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    40
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    41
EXTRA_INSTALL_RULES = [
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    42
    ('contrib/win32/mercurial.ini', 'defaultrc/mercurial.rc'),
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    43
]
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    44
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    45
PACKAGE_FILES_METADATA = {
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    46
    'ReadMe.html': 'Flags: isreadme',
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    47
}
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    48
41916
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41915
diff changeset
    49
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
    50
def build_with_py2exe(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    51
    source_dir: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    52
    build_dir: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    53
    python_exe: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    54
    iscc_exe: pathlib.Path,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    55
    version=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    56
):
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
    57
    """Build the Inno installer using py2exe.
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    58
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    59
    Build files will be placed in ``build_dir``.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    60
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    61
    py2exe's setup.py doesn't use setuptools. It doesn't have modern logic
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    62
    for finding the Python 2.7 toolchain. So, we require the environment
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    63
    to already be configured with an active toolchain.
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    64
    """
41911
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    65
    if not iscc_exe.exists():
dc7827a9ba64 packaging: move Inno Setup core logic into a module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41910
diff changeset
    66
        raise Exception('%s does not exist' % iscc_exe)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    67
41915
a2e191a937a9 packaging: extract py2exe functionality to own module
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41914
diff changeset
    68
    vc_x64 = r'\x64' in os.environ.get('LIB', '')
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    69
    arch = 'x64' if vc_x64 else 'x86'
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
    70
    inno_build_dir = build_dir / ('inno-py2exe-%s' % arch)
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    71
    staging_dir = inno_build_dir / 'stage'
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    72
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    73
    requirements_txt = (
45752
d270b9b797a7 contrib: split Windows requirements into multiple files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44769
diff changeset
    74
        source_dir / 'contrib' / 'packaging' / 'requirements-windows-py2.txt'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    75
    )
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    76
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    77
    inno_build_dir.mkdir(parents=True, exist_ok=True)
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
    78
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    79
    build_py2exe(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    80
        source_dir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    81
        build_dir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    82
        python_exe,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    83
        'inno',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    84
        requirements_txt,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    85
        extra_packages=EXTRA_PACKAGES,
46364
5b747aa1b2be packaging: include `windows_curses` when building py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents: 45942
diff changeset
    86
        extra_includes=EXTRA_INCLUDES,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41916
diff changeset
    87
    )
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    88
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    89
    # Purge the staging directory for every build so packaging is
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    90
    # pristine.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    91
    if staging_dir.exists():
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    92
        print('purging %s' % staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    93
        shutil.rmtree(staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    94
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    95
    # Now assemble all the packaged files into the staging directory.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    96
    stage_install(source_dir, staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
    97
44222
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    98
    # We also install some extra files.
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
    99
    process_install_rules(EXTRA_INSTALL_RULES, source_dir, staging_dir)
a8786727e478 packaging: bundle the default mercurial.ini template with Inno also
Matt Harbison <matt_harbison@yahoo.com>
parents: 44221
diff changeset
   100
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   101
    # hg.exe depends on VC9 runtime DLLs. Copy those into place.
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   102
    for f in find_legacy_vc_runtime_files(vc_x64):
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   103
        if f.name.endswith('.manifest'):
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   104
            basename = 'Microsoft.VC90.CRT.manifest'
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   105
        else:
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   106
            basename = f.name
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   107
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   108
        dest_path = staging_dir / basename
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   109
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   110
        print('copying %s to %s' % (f, dest_path))
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   111
        shutil.copyfile(f, dest_path)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   112
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   113
    build_installer(
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   114
        source_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   115
        inno_build_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   116
        staging_dir,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   117
        iscc_exe,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   118
        version,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   119
        arch="x64" if vc_x64 else None,
44769
9ade217b550d packaging: add -python2 to Windows installer filenames
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
   120
        suffix="-python2",
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   121
    )
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   122
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   123
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   124
def build_with_pyoxidizer(
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   125
    source_dir: pathlib.Path,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   126
    build_dir: pathlib.Path,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   127
    target_triple: str,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   128
    iscc_exe: pathlib.Path,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   129
    version=None,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   130
):
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   131
    """Build the Inno installer using PyOxidizer."""
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   132
    if not iscc_exe.exists():
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   133
        raise Exception("%s does not exist" % iscc_exe)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   134
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   135
    inno_build_dir = build_dir / ("inno-pyoxidizer-%s" % target_triple)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   136
    staging_dir = inno_build_dir / "stage"
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   137
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   138
    inno_build_dir.mkdir(parents=True, exist_ok=True)
47208
df1767fa822d packaging: rename run_pyoxidizer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 46364
diff changeset
   139
    create_pyoxidizer_install_layout(
df1767fa822d packaging: rename run_pyoxidizer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 46364
diff changeset
   140
        source_dir, inno_build_dir, staging_dir, target_triple
df1767fa822d packaging: rename run_pyoxidizer()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 46364
diff changeset
   141
    )
44763
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   142
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   143
    process_install_rules(EXTRA_INSTALL_RULES, source_dir, staging_dir)
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   144
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   145
    build_installer(
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   146
        source_dir,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   147
        inno_build_dir,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   148
        staging_dir,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   149
        iscc_exe,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   150
        version,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   151
        arch="x64" if "x86_64" in target_triple else None,
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   152
    )
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   153
94f4f2ec7dee packaging: support building Inno installer with PyOxidizer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44762
diff changeset
   154
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   155
def build_installer(
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   156
    source_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   157
    inno_build_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   158
    staging_dir: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   159
    iscc_exe: pathlib.Path,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   160
    version,
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   161
    arch=None,
44769
9ade217b550d packaging: add -python2 to Windows installer filenames
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
   162
    suffix="",
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   163
):
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   164
    """Build an Inno installer from staged Mercurial files.
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   165
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   166
    This function is agnostic about how to build Mercurial. It just
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   167
    cares that Mercurial files are in ``staging_dir``.
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   168
    """
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   169
    inno_source_dir = source_dir / "contrib" / "packaging" / "inno"
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   170
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   171
    # The final package layout is simply a mirror of the staging directory.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   172
    package_files = []
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   173
    for root, dirs, files in os.walk(staging_dir):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   174
        dirs.sort()
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   175
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   176
        root = pathlib.Path(root)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   177
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   178
        for f in sorted(files):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   179
            full = root / f
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   180
            rel = full.relative_to(staging_dir)
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   181
            if str(rel.parent) == '.':
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   182
                dest_dir = '{app}'
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   183
            else:
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   184
                dest_dir = '{app}\\%s' % rel.parent
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   185
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   186
            package_files.append(
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   187
                {
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   188
                    'source': rel,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   189
                    'dest_dir': dest_dir,
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   190
                    'metadata': PACKAGE_FILES_METADATA.get(str(rel), None),
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   191
                }
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   192
            )
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   193
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   194
    print('creating installer')
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   195
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   196
    # Install Inno files by rendering a template.
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   197
    jinja_env = jinja2.Environment(
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   198
        loader=jinja2.FileSystemLoader(str(inno_source_dir)),
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   199
        # Need to change these to prevent conflict with Inno Setup.
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   200
        comment_start_string='{##',
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   201
        comment_end_string='##}',
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   202
    )
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   203
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   204
    try:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   205
        template = jinja_env.get_template('mercurial.iss')
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   206
    except jinja2.TemplateSyntaxError as e:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   207
        raise Exception(
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   208
            'template syntax error at %s:%d: %s'
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45752
diff changeset
   209
            % (
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45752
diff changeset
   210
                e.name,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45752
diff changeset
   211
                e.lineno,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45752
diff changeset
   212
                e.message,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45752
diff changeset
   213
            )
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   214
        )
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   215
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   216
    content = template.render(package_files=package_files)
43515
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   217
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   218
    with (inno_build_dir / 'mercurial.iss').open('w', encoding='utf-8') as fh:
7bd88d0d6a82 packaging: process Inno Setup files with Jinja2
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43514
diff changeset
   219
        fh.write(content)
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
   220
43516
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   221
    # Copy additional files used by Inno.
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   222
    for p in ('mercurial.ico', 'postinstall.txt'):
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   223
        shutil.copyfile(
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   224
            source_dir / 'contrib' / 'win32' / p, inno_build_dir / p
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   225
        )
d053d3f10b6a packaging: stage installed files for Inno
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43515
diff changeset
   226
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   227
    args = [str(iscc_exe)]
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   228
44762
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   229
    if arch:
eec66d9c9e50 packaging: split Inno installer building from Mercurial building
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44224
diff changeset
   230
        args.append('/dARCH=%s' % arch)
44769
9ade217b550d packaging: add -python2 to Windows installer filenames
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
   231
        args.append('/dSUFFIX=-%s%s' % (arch, suffix))
9ade217b550d packaging: add -python2 to Windows installer filenames
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
   232
    else:
9ade217b550d packaging: add -python2 to Windows installer filenames
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44763
diff changeset
   233
        args.append('/dSUFFIX=-x86%s' % suffix)
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   234
43518
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   235
    if not version:
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   236
        version = read_version_py(source_dir)
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   237
7c9f63a5cb14 packaging: always pass VERSION into Inno invocation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43517
diff changeset
   238
    args.append('/dVERSION=%s' % version)
44221
f37971c31067 packaging: set the FileVersion field in the Inno installer executable
Matt Harbison <matt_harbison@yahoo.com>
parents: 43518
diff changeset
   239
    args.append('/dQUAD_VERSION=%s' % normalize_windows_version(version))
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   240
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   241
    args.append('/Odist')
43514
10454e788111 packaging: install and run Inno files in a build directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43076
diff changeset
   242
    args.append(str(inno_build_dir / 'mercurial.iss'))
41853
d7dc4ac1ff84 inno: script to automate building Inno installer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
   243
41913
5e923355c595 packaging: don't use temporary directory
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41912
diff changeset
   244
    subprocess.run(args, cwd=str(source_dir), check=True)