setup.py
author Martin von Zweigbergk <martinvonz@google.com>
Mon, 15 Apr 2019 16:46:41 -0700
changeset 42207 22c9ffdf8ef6
parent 42075 456c37433c43
child 42150 71d8b4d91616
permissions -rw-r--r--
copies: fix up "fullcopy" with missing entries from "diverge" Similar to the previous patch, but this doesn't even affect tests. It does affect tests if you change them to turn on debug logging. I'm fixing it here so reviewers of the later rewrite patch can hard-code debug logging to be on and more easily compare test results. Differential Revision: https://phab.mercurial-scm.org/D6247
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 429
diff changeset
     1
#
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 429
diff changeset
     2
# This is the mercurial setup script.
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     3
#
4816
c10d3bc05a8d setup.py not executable: change instructions at beginning of file
Christian Ebert <blacktrash@gmx.net>
parents: 4628
diff changeset
     4
# 'python setup.py install', or
c10d3bc05a8d setup.py not executable: change instructions at beginning of file
Christian Ebert <blacktrash@gmx.net>
parents: 4628
diff changeset
     5
# 'python setup.py --help' for more options
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
     6
33591
ee11d18fcd3c setup: fix mistake that prevented Python 3 from being excluded
Augie Fackler <augie@google.com>
parents: 33589
diff changeset
     7
import os
ee11d18fcd3c setup: fix mistake that prevented Python 3 from being excluded
Augie Fackler <augie@google.com>
parents: 33589
diff changeset
     8
33587
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
     9
supportedpy = '~= 2.7'
33591
ee11d18fcd3c setup: fix mistake that prevented Python 3 from being excluded
Augie Fackler <augie@google.com>
parents: 33589
diff changeset
    10
if os.environ.get('HGALLOWPYTHON3', ''):
33587
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    11
    # Mercurial will never work on Python 3 before 3.5 due to a lack
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    12
    # of % formatting on bytestrings, and can't work on 3.6.0 or 3.6.1
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    13
    # due to a bug in % formatting in bytestrings.
39588
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    14
    # We cannot support Python 3.5.0, 3.5.1, 3.5.2 because of bug in
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    15
    # codecs.escape_encode() where it raises SystemError on empty bytestring
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    16
    # bug link: https://bugs.python.org/issue25270
33587
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    17
    #
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    18
    # TODO: when we actually work on Python 3, use this string as the
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    19
    # actual supportedpy string.
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    20
    supportedpy = ','.join([
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    21
        '>=2.7',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    22
        '!=3.0.*',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    23
        '!=3.1.*',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    24
        '!=3.2.*',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    25
        '!=3.3.*',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    26
        '!=3.4.*',
39588
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    27
        '!=3.5.0',
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    28
        '!=3.5.1',
b6b9488aae4c setup: don't support py 3.5.0, 3.5.1, 3.5.2 because of bug in codecs
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39356
diff changeset
    29
        '!=3.5.2',
33587
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    30
        '!=3.6.0',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    31
        '!=3.6.1',
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    32
    ])
e0bbe32d8b55 setup: explicitly declare supported Python versions
Augie Fackler <augie@google.com>
parents: 33131
diff changeset
    33
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
    34
import sys, platform
11532
f3732ab1149f setup.py: Adjustments to make setup.py run in py3k.
Renato Cunha <renatoc@gmail.com>
parents: 11468
diff changeset
    35
if sys.version_info[0] >= 3:
20696
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    36
    printf = eval('print')
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    37
    libdir_escape = 'unicode_escape'
35255
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
    38
    def sysstr(s):
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
    39
        return s.decode('latin-1')
11532
f3732ab1149f setup.py: Adjustments to make setup.py run in py3k.
Renato Cunha <renatoc@gmail.com>
parents: 11468
diff changeset
    40
else:
20696
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    41
    libdir_escape = 'string_escape'
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    42
    def printf(*args, **kwargs):
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    43
        f = kwargs.get('file', sys.stdout)
77ab0abb08a0 setup: handle more invalid python3 syntax
Augie Fackler <raf@durin42.com>
parents: 20687
diff changeset
    44
        end = kwargs.get('end', '\n')
27348
83a8219fb790 setup.py: use bytes literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27269
diff changeset
    45
        f.write(b' '.join(args) + end)
35255
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
    46
    def sysstr(s):
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
    47
        return s
11532
f3732ab1149f setup.py: Adjustments to make setup.py run in py3k.
Renato Cunha <renatoc@gmail.com>
parents: 11468
diff changeset
    48
33588
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    49
# Attempt to guide users to a modern pip - this means that 2.6 users
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    50
# should have a chance of getting a 4.2 release, and when we ratchet
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    51
# the version requirement forward again hopefully everyone will get
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    52
# something that works for them.
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    53
if sys.version_info < (2, 7, 0, 'final'):
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    54
    pip_message = ('This may be due to an out of date pip. '
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    55
                   'Make sure you have pip >= 9.0.1.')
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    56
    try:
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    57
        import pip
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    58
        pip_version = tuple([int(x) for x in pip.__version__.split('.')[:3]])
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    59
        if pip_version < (9, 0, 1) :
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    60
            pip_message = (
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    61
                'Your pip version is out of date, please install '
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    62
                'pip >= 9.0.1. pip {} detected.'.format(pip.__version__))
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    63
        else:
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    64
            # pip is new enough - it must be something else
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    65
            pip_message = ''
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    66
    except Exception:
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    67
        pass
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    68
    error = """
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    69
Mercurial does not support Python older than 2.7.
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    70
Python {py} detected.
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    71
{pip}
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    72
""".format(py=sys.version_info, pip=pip_message)
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    73
    printf(error, file=sys.stderr)
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    74
    sys.exit(1)
025017423e53 setup: add extra logic to try and recommend a new pip on bad Python
Augie Fackler <augie@google.com>
parents: 33587
diff changeset
    75
35830
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    76
# We don't yet officially support Python 3. But we want to allow developers to
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    77
# hack on. Detect and disallow running on Python 3 by default. But provide a
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    78
# backdoor to enable working on Python 3.
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    79
if sys.version_info[0] != 2:
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    80
    badpython = True
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    81
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    82
    # Allow Python 3 from source checkouts.
38721
dbbe45ae5ad1 setup: allow to run setup.py with python 3 without a mercurial checkout
Mike Hommey <mh@glandium.org>
parents: 38219
diff changeset
    83
    if os.path.isdir('.hg') or 'HGPYTHON3' in os.environ:
35830
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    84
        badpython = False
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    85
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    86
    if badpython:
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    87
        error = """
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    88
Mercurial only supports Python 2.7.
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    89
Python {py} detected.
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    90
Please re-run with Python 2.7.
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    91
""".format(py=sys.version_info)
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    92
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    93
        printf(error, file=sys.stderr)
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    94
        sys.exit(1)
fb39f6a8a864 setup: only allow Python 3 from a source checkout (issue5804)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35774
diff changeset
    95
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    96
# Solaris Python packaging brain damage
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    97
try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    98
    import hashlib
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
    99
    sha = hashlib.sha1()
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   100
except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   101
    try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   102
        import sha
22198
77142de48ae4 cleanup: make sure we always access members of imported modules
Mads Kiilerich <madski@unity3d.com>
parents: 21840
diff changeset
   103
        sha.sha # silence unused import warning
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   104
    except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   105
        raise SystemExit(
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   106
            "Couldn't import standard hashlib (incomplete Python install).")
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   107
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   108
try:
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   109
    import zlib
22198
77142de48ae4 cleanup: make sure we always access members of imported modules
Mads Kiilerich <madski@unity3d.com>
parents: 21840
diff changeset
   110
    zlib.compressobj # silence unused import warning
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   111
except ImportError:
7558
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   112
    raise SystemExit(
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   113
        "Couldn't import standard zlib (incomplete Python install).")
dc211ad8d681 setup: warn about missing standard Python components
Matt Mackall <mpm@selenic.com>
parents: 7081
diff changeset
   114
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   115
# The base IronPython distribution (as of 2.7.1) doesn't support bz2
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   116
isironpython = False
10761
16a13fdb4b36 setup: fail if bz2 is not available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10521
diff changeset
   117
try:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16383
diff changeset
   118
    isironpython = (platform.python_implementation()
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16383
diff changeset
   119
                    .lower().find("ironpython") != -1)
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   120
except AttributeError:
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   121
    pass
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   122
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   123
if isironpython:
15492
36f076d03b34 setup: make script executable with python3
Simon Heimberg <simohe@besonet.ch>
parents: 15460
diff changeset
   124
    sys.stderr.write("warning: IronPython detected (no bz2 support)\n")
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   125
else:
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   126
    try:
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   127
        import bz2
22198
77142de48ae4 cleanup: make sure we always access members of imported modules
Mads Kiilerich <madski@unity3d.com>
parents: 21840
diff changeset
   128
        bz2.BZ2Compressor # silence unused import warning
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   129
    except ImportError:
14295
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   130
        raise SystemExit(
bb7e3b3e6e11 setup.py: workaround for missing bz2 module in IronPython
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14243
diff changeset
   131
            "Couldn't import standard bz2 (incomplete Python install).")
10761
16a13fdb4b36 setup: fail if bz2 is not available
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10521
diff changeset
   132
24192
390410a6545d setup.py: do not install c extensions on pypy
Joan Massich <mailsik@gmail.com>
parents: 24191
diff changeset
   133
ispypy = "PyPy" in sys.version
390410a6545d setup.py: do not install c extensions on pypy
Joan Massich <mailsik@gmail.com>
parents: 24191
diff changeset
   134
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   135
hgrustext = os.environ.get('HGWITHRUSTEXT')
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   136
# TODO record it for proper rebuild upon changes
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   137
# (see mercurial/__modulepolicy__.py)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   138
if hgrustext != 'cpython' and hgrustext is not None:
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   139
    hgrustext = 'direct-ffi'
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
   140
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   141
import ctypes
40979
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
   142
import errno
33591
ee11d18fcd3c setup: fix mistake that prevented Python 3 from being excluded
Augie Fackler <augie@google.com>
parents: 33589
diff changeset
   143
import stat, subprocess, time
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
   144
import re
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   145
import shutil
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   146
import tempfile
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   147
from distutils import log
31298
718a57e95a89 setup: use setuptools on Windows (issue5400)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30869
diff changeset
   148
# We have issues with setuptools on some platforms and builders. Until
718a57e95a89 setup: use setuptools on Windows (issue5400)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30869
diff changeset
   149
# those are resolved, setuptools is opt-in except for platforms where
718a57e95a89 setup: use setuptools on Windows (issue5400)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30869
diff changeset
   150
# we don't have issues.
33600
47829b89c8c6 setup: silence warning of unknown option python_requires on distutils
Yuya Nishihara <yuya@tcha.org>
parents: 33599
diff changeset
   151
issetuptools = (os.name == 'nt' or 'FORCE_SETUPTOOLS' in os.environ)
47829b89c8c6 setup: silence warning of unknown option python_requires on distutils
Yuya Nishihara <yuya@tcha.org>
parents: 33599
diff changeset
   152
if issetuptools:
26600
e8497889edab setup: import setup from setuptools if FORCE_SETUPTOOLS is set
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 26421
diff changeset
   153
    from setuptools import setup
e8497889edab setup: import setup from setuptools if FORCE_SETUPTOOLS is set
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 26421
diff changeset
   154
else:
e8497889edab setup: import setup from setuptools if FORCE_SETUPTOOLS is set
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 26421
diff changeset
   155
    from distutils.core import setup
30418
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30356
diff changeset
   156
from distutils.ccompiler import new_compiler
26600
e8497889edab setup: import setup from setuptools if FORCE_SETUPTOOLS is set
Nathan Goldbaum <ngoldbau@ucsc.edu>
parents: 26421
diff changeset
   157
from distutils.core import Command, Extension
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   158
from distutils.dist import Distribution
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   159
from distutils.command.build import build
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   160
from distutils.command.build_ext import build_ext
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   161
from distutils.command.build_py import build_py
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   162
from distutils.command.build_scripts import build_scripts
32670
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   163
from distutils.command.install import install
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   164
from distutils.command.install_lib import install_lib
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   165
from distutils.command.install_scripts import install_scripts
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   166
from distutils.spawn import spawn, find_executable
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
   167
from distutils import file_util
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   168
from distutils.errors import (
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   169
    CCompilerError,
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   170
    DistutilsError,
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   171
    DistutilsExecError,
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   172
)
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
   173
from distutils.sysconfig import get_python_inc, get_config_var
13594
64a458707fd4 setup.py: use StrictVersion instead of manual comparison
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 13583
diff changeset
   174
from distutils.version import StrictVersion
157
2653740d8118 Install the templates where they can be found by hgweb.py
mpm@selenic.com
parents: 155
diff changeset
   175
40420
b6bc2293cdf3 setup: explain to distutils how we write rc versions
"Paul Morelle <paul.morelle@octobus.net"
parents: 40397
diff changeset
   176
# Explain to distutils.StrictVersion how our release candidates are versionned
b6bc2293cdf3 setup: explain to distutils how we write rc versions
"Paul Morelle <paul.morelle@octobus.net"
parents: 40397
diff changeset
   177
StrictVersion.version_re = re.compile(r'^(\d+)\.(\d+)(\.(\d+))?-?(rc(\d+))?$')
b6bc2293cdf3 setup: explain to distutils how we write rc versions
"Paul Morelle <paul.morelle@octobus.net"
parents: 40397
diff changeset
   178
35238
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   179
def write_if_changed(path, content):
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   180
    """Write content to a file iff the content hasn't changed."""
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   181
    if os.path.exists(path):
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   182
        with open(path, 'rb') as fh:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   183
            current = fh.read()
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   184
    else:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   185
        current = b''
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   186
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   187
    if current != content:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   188
        with open(path, 'wb') as fh:
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   189
            fh.write(content)
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   190
6513
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   191
scripts = ['hg']
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   192
if os.name == 'nt':
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   193
    # We remove hg.bat if we are able to build hg.exe.
6513
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
   194
    scripts.append('contrib/win32/hg.bat')
3893
070628929e1f Fix setup.py warning
Matt Mackall <mpm@selenic.com>
parents: 3892
diff changeset
   195
31565
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   196
def cancompile(cc, code):
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   197
    tmpdir = tempfile.mkdtemp(prefix='hg-install-')
6373
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   198
    devnull = oldstderr = None
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   199
    try:
31565
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   200
        fname = os.path.join(tmpdir, 'testcomp.c')
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   201
        f = open(fname, 'w')
31565
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   202
        f.write(code)
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   203
        f.close()
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   204
        # Redirect stderr to /dev/null to hide any error messages
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   205
        # from the compiler.
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   206
        # This will have to be changed if we ever have to check
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   207
        # for a function on Windows.
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   208
        devnull = open('/dev/null', 'w')
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   209
        oldstderr = os.dup(sys.stderr.fileno())
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   210
        os.dup2(devnull.fileno(), sys.stderr.fileno())
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   211
        objects = cc.compile([fname], output_dir=tmpdir)
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   212
        cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   213
        return True
25089
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   214
    except Exception:
c6427cd45760 setup: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 25074
diff changeset
   215
        return False
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   216
    finally:
6373
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   217
        if oldstderr is not None:
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   218
            os.dup2(oldstderr, sys.stderr.fileno())
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   219
        if devnull is not None:
7010e4557963 setup.py: hide compiler error messages while searching for inotify
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6251
diff changeset
   220
            devnull.close()
6251
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   221
        shutil.rmtree(tmpdir)
87053f0b0fad setup.py: use a simplified custom version of CCompiler.has_function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 6245
diff changeset
   222
31565
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   223
# simplified version of distutils.ccompiler.CCompiler.has_function
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   224
# that actually removes its temporary files.
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   225
def hasfunction(cc, funcname):
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   226
    code = 'int main(void) { %s(); }\n' % funcname
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   227
    return cancompile(cc, code)
9639ff4a93ae setup: split "hasfunction" to test arbitrary code
Jun Wu <quark@fb.com>
parents: 31325
diff changeset
   228
31566
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31565
diff changeset
   229
def hasheader(cc, headername):
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31565
diff changeset
   230
    code = '#include <%s>\nint main(void) { return 0; }\n' % headername
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31565
diff changeset
   231
    return cancompile(cc, code)
5a0460219649 setup: add a function to test header files
Jun Wu <quark@fb.com>
parents: 31565
diff changeset
   232
1283
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   233
# py2exe needs to be installed to work
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   234
try:
1294
372971e1c40d Clean up whitespace damage.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1284
diff changeset
   235
    import py2exe
22198
77142de48ae4 cleanup: make sure we always access members of imported modules
Mads Kiilerich <madski@unity3d.com>
parents: 21840
diff changeset
   236
    py2exe.Distribution # silence unused import warning
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
   237
    py2exeloaded = True
15527
9926aab3d0b5 setup: fix py2exe generation broken by c3a6ec304055 (issue3116)
Pascal Quantin <pascal.quantin@gmail.com>
parents: 15523
diff changeset
   238
    # import py2exe's patched Distribution class
9926aab3d0b5 setup: fix py2exe generation broken by c3a6ec304055 (issue3116)
Pascal Quantin <pascal.quantin@gmail.com>
parents: 15523
diff changeset
   239
    from distutils.core import Distribution
1284
59d07a6bd513 Fix Volker's modifications to setup.py for non-Windows systems.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1283
diff changeset
   240
except ImportError:
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
   241
    py2exeloaded = False
1283
f5faab34f32e Support for the distutils extention 'py2exe' added.
Volker.Kleinfeld@gmx.de
parents: 575
diff changeset
   242
41855
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   243
def runcmd(cmd, env, cwd=None):
32904
19b0fd4b5570 plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents: 32802
diff changeset
   244
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
41855
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   245
                         stderr=subprocess.PIPE, env=env, cwd=cwd)
32904
19b0fd4b5570 plan9: drop py26 hacks
Matt Harbison <matt_harbison@yahoo.com>
parents: 32802
diff changeset
   246
    out, err = p.communicate()
33123
87ee783f7299 setup: update runcmd() to also return the exit status
Adam Simpkins <simpkins@fb.com>
parents: 33122
diff changeset
   247
    return p.returncode, out, err
13636
4bfff063aed6 setup: fix mac build broken by e42d18538e1d
Jon M. Dugan <jdugan@x1024.net>
parents: 13594
diff changeset
   248
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   249
class hgcommand(object):
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   250
    def __init__(self, cmd, env):
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   251
        self.cmd = cmd
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   252
        self.env = env
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   253
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   254
    def run(self, args):
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   255
        cmd = self.cmd + args
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   256
        returncode, out, err = runcmd(cmd, self.env)
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   257
        err = filterhgerr(err)
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   258
        if err or returncode != 0:
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   259
            printf("stderr from '%s':" % (' '.join(cmd)), file=sys.stderr)
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   260
            printf(err, file=sys.stderr)
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   261
            return ''
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   262
        return out
8548
3ccbe42ff72f setup: read .hg_archival.txt for version info (issue1670)
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8547
diff changeset
   263
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   264
def filterhgerr(err):
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   265
    # If root is executing setup.py, but the repository is owned by
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   266
    # another user (as in "sudo python setup.py install") we will get
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   267
    # trust warnings since the .hg/hgrc file is untrusted. That is
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   268
    # fine, we don't want to load it anyway.  Python may warn about
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   269
    # a missing __init__.py in mercurial/locale, we also ignore that.
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   270
    err = [e for e in err.splitlines()
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   271
           if (not e.startswith(b'not trusting file')
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   272
               and not e.startswith(b'warning: Not importing')
34923
a6a322193a02 setup: filter out devel-warn messages from system hg
Kevin Bullock <kbullock+mercurial@ringworld.org>
parents: 34922
diff changeset
   273
               and not e.startswith(b'obsolete feature not enabled')
36713
5f41e3418407 setup: ignore extension load failures when finding working hg
Ryan McElroy <rmcelroy@fb.com>
parents: 36704
diff changeset
   274
               and not e.startswith(b'*** failed to import extension')
39987
138e2d6d3b53 setup: ignore message about disabling 3rd party extensions because of version
Matt Harbison <matt_harbison@yahoo.com>
parents: 39788
diff changeset
   275
               and not e.startswith(b'devel-warn:')
138e2d6d3b53 setup: ignore message about disabling 3rd party extensions because of version
Matt Harbison <matt_harbison@yahoo.com>
parents: 39788
diff changeset
   276
               and not (e.startswith(b'(third party extension')
138e2d6d3b53 setup: ignore message about disabling 3rd party extensions because of version
Matt Harbison <matt_harbison@yahoo.com>
parents: 39788
diff changeset
   277
                        and e.endswith(b'or newer of Mercurial; disabling)')))]
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   278
    return b'\n'.join(b'  ' + e for e in err)
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   279
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   280
def findhg():
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   281
    """Try to figure out how we should invoke hg for examining the local
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   282
    repository contents.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   283
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   284
    Returns an hgcommand object."""
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   285
    # By default, prefer the "hg" command in the user's path.  This was
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   286
    # presumably the hg command that the user used to create this repository.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   287
    #
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   288
    # This repository may require extensions or other settings that would not
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   289
    # be enabled by running the hg script directly from this local repository.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   290
    hgenv = os.environ.copy()
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   291
    # Use HGPLAIN to disable hgrc settings that would change output formatting,
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   292
    # and disable localization for the same reasons.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   293
    hgenv['HGPLAIN'] = '1'
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   294
    hgenv['LANGUAGE'] = 'C'
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   295
    hgcmd = ['hg']
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   296
    # Run a simple "hg log" command just to see if using hg from the user's
40993
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   297
    # path works and can successfully interact with this repository.  Windows
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   298
    # gives precedence to hg.exe in the current directory, so fall back to the
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   299
    # python invocation of local hg, where pythonXY.dll can always be found.
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   300
    check_cmd = ['log', '-r.', '-Ttest']
40993
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   301
    if os.name != 'nt':
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   302
        try:
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   303
            retcode, out, err = runcmd(hgcmd + check_cmd, hgenv)
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   304
        except EnvironmentError:
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   305
            retcode = -1
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   306
        if retcode == 0 and not filterhgerr(err):
f6987f654356 setup: avoid attempting to invoke the system-wide hg.exe on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40980
diff changeset
   307
            return hgcommand(hgcmd, hgenv)
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   308
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   309
    # Fall back to trying the local hg installation.
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   310
    hgenv = localhgenv()
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   311
    hgcmd = [sys.executable, 'hg']
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   312
    try:
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   313
        retcode, out, err = runcmd(hgcmd + check_cmd, hgenv)
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   314
    except EnvironmentError:
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   315
        retcode = -1
33598
f30714a55523 setup: do not select hg executable that prints unexpected warnings
Yuya Nishihara <yuya@tcha.org>
parents: 33591
diff changeset
   316
    if retcode == 0 and not filterhgerr(err):
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   317
        return hgcommand(hgcmd, hgenv)
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   318
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   319
    raise SystemExit('Unable to find a working hg binary to extract the '
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   320
                     'version from the repository tags')
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   321
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   322
def localhgenv():
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   323
    """Get an environment dictionary to use for invoking or importing
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   324
    mercurial from the local repository."""
33124
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   325
    # Execute hg out of this directory with a custom environment which takes
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   326
    # care to not use any hgrc files and do no localization.
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   327
    env = {'HGMODULEPOLICY': 'py',
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   328
           'HGRCPATH': '',
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   329
           'LANGUAGE': 'C',
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   330
           'PATH': ''} # make pypi modules that use os.environ['PATH'] happy
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   331
    if 'LD_LIBRARY_PATH' in os.environ:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   332
        env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   333
    if 'SystemRoot' in os.environ:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   334
        # SystemRoot is required by Windows to load various DLLs.  See:
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   335
        # https://bugs.python.org/issue13524#msg148850
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   336
        env['SystemRoot'] = os.environ['SystemRoot']
33129
6ef5f0c95d64 setup: fix localhgenv
Jun Wu <quark@fb.com>
parents: 33126
diff changeset
   337
    return env
33124
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   338
155d760da7b2 setup: move environment computation into a helper function
Adam Simpkins <simpkins@fb.com>
parents: 33123
diff changeset
   339
version = ''
15367
b357a972d6cd setup: set env global earlier (3073)
Matt Mackall <mpm@selenic.com>
parents: 15215
diff changeset
   340
8547
548fd7a05373 setup.py: subprocess instead of os.popen, sys.stderr.write instead of print
Christian Ebert <blacktrash@gmx.net>
parents: 8494
diff changeset
   341
if os.path.isdir('.hg'):
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   342
    hg = findhg()
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   343
    cmd = ['log', '-r', '.', '--template', '{tags}\n']
35255
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
   344
    numerictags = [t for t in sysstr(hg.run(cmd)).split() if t[0:1].isdigit()]
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
   345
    hgid = sysstr(hg.run(['id', '-i'])).strip()
33122
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   346
    if not hgid:
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   347
        # Bail out if hg is having problems interacting with this repository,
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   348
        # rather than falling through and producing a bogus version number.
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   349
        # Continuing with an invalid version number will break extensions
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   350
        # that define minimumhgversion.
6fdc1518983e setup: fail if we cannot determine the version number
Adam Simpkins <simpkins@fb.com>
parents: 33115
diff changeset
   351
        raise SystemExit('Unable to determine hg version from local repository')
17709
b7fff47bb128 setup: calculate version more correctly
Bryan O'Sullivan <bryano@fb.com>
parents: 17606
diff changeset
   352
    if numerictags: # tag(s) found
b7fff47bb128 setup: calculate version more correctly
Bryan O'Sullivan <bryano@fb.com>
parents: 17606
diff changeset
   353
        version = numerictags[-1]
b7fff47bb128 setup: calculate version more correctly
Bryan O'Sullivan <bryano@fb.com>
parents: 17606
diff changeset
   354
        if hgid.endswith('+'): # propagate the dirty status to the tag
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   355
            version += '+'
17709
b7fff47bb128 setup: calculate version more correctly
Bryan O'Sullivan <bryano@fb.com>
parents: 17606
diff changeset
   356
    else: # no tag found
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   357
        ltagcmd = ['parents', '--template', '{latesttag}']
35255
d73ccc63b8f9 setup: convert version strings to unicode on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 35238
diff changeset
   358
        ltag = sysstr(hg.run(ltagcmd))
33125
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   359
        changessincecmd = ['log', '-T', 'x\n', '-r', "only(.,'%s')" % ltag]
fc290a39590d setup: replace runhg() with an hgcommand helper class
Adam Simpkins <simpkins@fb.com>
parents: 33124
diff changeset
   360
        changessince = len(hg.run(changessincecmd).splitlines())
23647
eb55e09202c8 setup: use changes since latest tag instead of just distance
Siddharth Agarwal <sid0@fb.com>
parents: 23646
diff changeset
   361
        version = '%s+%s-%s' % (ltag, changessince, hgid)
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   362
    if version.endswith('+'):
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   363
        version += time.strftime('%Y%m%d')
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   364
elif os.path.exists('.hg_archival.txt'):
10124
08384d8777a4 setup.py: keep Python 2.3 compatibility
Martin Geisler <mg@lazybytes.net>
parents: 10120
diff changeset
   365
    kw = dict([[t.strip() for t in l.split(':', 1)]
08384d8777a4 setup.py: keep Python 2.3 compatibility
Martin Geisler <mg@lazybytes.net>
parents: 10120
diff changeset
   366
               for l in open('.hg_archival.txt')])
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   367
    if 'tag' in kw:
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27374
diff changeset
   368
        version = kw['tag']
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   369
    elif 'latesttag' in kw:
23646
9641643fac71 setup: use changessincelatesttag from archive if present
Siddharth Agarwal <sid0@fb.com>
parents: 23392
diff changeset
   370
        if 'changessincelatesttag' in kw:
9641643fac71 setup: use changessincelatesttag from archive if present
Siddharth Agarwal <sid0@fb.com>
parents: 23392
diff changeset
   371
            version = '%(latesttag)s+%(changessincelatesttag)s-%(node).12s' % kw
9641643fac71 setup: use changessincelatesttag from archive if present
Siddharth Agarwal <sid0@fb.com>
parents: 23392
diff changeset
   372
        else:
9641643fac71 setup: use changessincelatesttag from archive if present
Siddharth Agarwal <sid0@fb.com>
parents: 23392
diff changeset
   373
            version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
8547
548fd7a05373 setup.py: subprocess instead of os.popen, sys.stderr.write instead of print
Christian Ebert <blacktrash@gmx.net>
parents: 8494
diff changeset
   374
    else:
9615
f51d1822d6fd setup: refactor the version string to a subset of tag+tagdist-hash+date
Gilles Moris <gilles.moris@free.fr>
parents: 9539
diff changeset
   375
        version = kw.get('node', '')[:12]
7632
9626819b2e3d refactor version code
Matt Mackall <mpm@selenic.com>
parents: 7558
diff changeset
   376
8548
3ccbe42ff72f setup: read .hg_archival.txt for version info (issue1670)
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8547
diff changeset
   377
if version:
35238
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   378
    versionb = version
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   379
    if not isinstance(versionb, bytes):
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   380
        versionb = versionb.encode('ascii')
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   381
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   382
    write_if_changed('mercurial/__version__.py', b''.join([
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   383
        b'# this file is autogenerated by setup.py\n'
38219
db9d1dd01bf0 setup: write version constant as bytes literal
Yuya Nishihara <yuya@tcha.org>
parents: 38054
diff changeset
   384
        b'version = b"%s"\n' % versionb,
35238
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   385
    ]))
8493
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   386
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   387
try:
28431
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   388
    oldpolicy = os.environ.get('HGMODULEPOLICY', None)
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   389
    os.environ['HGMODULEPOLICY'] = 'py'
8493
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   390
    from mercurial import __version__
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   391
    version = __version__.version
4c030ada58d2 Fix how setup.py identifies the Mercurial version.
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 7826
diff changeset
   392
except ImportError:
38721
dbbe45ae5ad1 setup: allow to run setup.py with python 3 without a mercurial checkout
Mike Hommey <mh@glandium.org>
parents: 38219
diff changeset
   393
    version = b'unknown'
28431
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   394
finally:
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   395
    if oldpolicy is None:
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   396
        del os.environ['HGMODULEPOLICY']
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   397
    else:
a7e3b72cf756 setup: show how to set the module policy for imports
timeless <timeless@mozdev.org>
parents: 28430
diff changeset
   398
        os.environ['HGMODULEPOLICY'] = oldpolicy
7632
9626819b2e3d refactor version code
Matt Mackall <mpm@selenic.com>
parents: 7558
diff changeset
   399
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   400
class hgbuild(build):
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   401
    # Insert hgbuildmo first so that files in mercurial/locale/ are found
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   402
    # when build_py is run next.
28398
712298942c82 setup: remove support for 2to3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28041
diff changeset
   403
    sub_commands = [('build_mo', None)] + build.sub_commands
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   404
15523
f9da84a950d0 setup: backout 8504699d1aa6
Matt Mackall <mpm@selenic.com>
parents: 15500
diff changeset
   405
class hgbuildmo(build):
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   406
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   407
    description = "build translations (.mo files)"
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   408
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   409
    def run(self):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   410
        if not find_executable('msgfmt'):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   411
            self.warn("could not find msgfmt executable, no translations "
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   412
                     "will be built")
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   413
            return
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   414
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   415
        podir = 'i18n'
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   416
        if not os.path.isdir(podir):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   417
            self.warn("could not find %s/ directory" % podir)
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   418
            return
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   419
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   420
        join = os.path.join
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   421
        for po in os.listdir(podir):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   422
            if not po.endswith('.po'):
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   423
                continue
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   424
            pofile = join(podir, po)
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   425
            modir = join('locale', po[:-3], 'LC_MESSAGES')
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   426
            mofile = join(modir, 'hg.mo')
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   427
            mobuildfile = join('mercurial', mofile)
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   428
            cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
7720
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   429
            if sys.platform != 'sunos5':
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   430
                # msgfmt on Solaris does not know about -c
b6c2cb40e664 setup: do not use -c with msgfmt on Solaris (issue1489)
Martin Geisler <mg@daimi.au.dk>
parents: 7712
diff changeset
   431
                cmd.append('-c')
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   432
            self.mkpath(join('mercurial', modir))
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
   433
            self.make_file([pofile], mobuildfile, spawn, (cmd,))
7649
a489e3a94443 i18n: new build_mo command for setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7648
diff changeset
   434
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   435
15458
c3a6ec304055 setup: subclass distribution instead of overwriting original
Simon Heimberg <simohe@besonet.ch>
parents: 15388
diff changeset
   436
class hgdist(Distribution):
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   437
    pure = False
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   438
    cffi = ispypy
15458
c3a6ec304055 setup: subclass distribution instead of overwriting original
Simon Heimberg <simohe@besonet.ch>
parents: 15388
diff changeset
   439
41768
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41547
diff changeset
   440
    global_options = Distribution.global_options + [
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41547
diff changeset
   441
        ('pure', None, "use pure (slow) Python code instead of C extensions"),
aaad36b88298 cleanup: use () to wrap long lines instead of \
Augie Fackler <augie@google.com>
parents: 41547
diff changeset
   442
    ]
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   443
15459
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   444
    def has_ext_modules(self):
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   445
        # self.ext_modules is emptied in hgbuildpy.finalize_options which is
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   446
        # too late for some cases
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   447
        return not self.pure and Distribution.has_ext_modules(self)
434c48e981b8 setup: has_ext_modules always returns false when pure is specified
Simon Heimberg <simohe@besonet.ch>
parents: 15458
diff changeset
   448
30459
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   449
# This is ugly as a one-liner. So use a variable.
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   450
buildextnegops = dict(getattr(build_ext, 'negative_options', {}))
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   451
buildextnegops['no-zstd'] = 'zstd'
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   452
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   453
class hgbuildext(build_ext):
30459
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   454
    user_options = build_ext.user_options + [
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   455
        ('zstd', None, 'compile zstd bindings [default]'),
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   456
        ('no-zstd', None, 'do not compile zstd bindings'),
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   457
    ]
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   458
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   459
    boolean_options = build_ext.boolean_options + ['zstd']
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   460
    negative_opt = buildextnegops
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   461
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   462
    def initialize_options(self):
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   463
        self.zstd = True
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   464
        return build_ext.initialize_options(self)
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   465
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   466
    def build_extensions(self):
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   467
        ruststandalones = [e for e in self.extensions
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   468
                           if isinstance(e, RustStandaloneExtension)]
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   469
        self.extensions = [e for e in self.extensions
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   470
                           if e not in ruststandalones]
30459
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   471
        # Filter out zstd if disabled via argument.
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   472
        if not self.zstd:
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   473
            self.extensions = [e for e in self.extensions
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   474
                               if e.name != 'mercurial.zstd']
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   475
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   476
        for rustext in ruststandalones:
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   477
            rustext.build('' if self.inplace else self.build_lib)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
   478
30459
0acf3fd718f1 setup: add flag to build_ext to control building zstd
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30445
diff changeset
   479
        return build_ext.build_extensions(self)
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   480
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   481
    def build_extension(self, ext):
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
   482
        if isinstance(ext, RustExtension):
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
   483
            ext.rustbuild()
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   484
        try:
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   485
            build_ext.build_extension(self, ext)
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   486
        except CCompilerError:
12501
98f21e4d9633 setup: slight simplification
Martin Geisler <mg@lazybytes.net>
parents: 11533
diff changeset
   487
            if not getattr(ext, 'optional', False):
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   488
                raise
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   489
            log.warn("Failed to build optional extension '%s' (skipping)",
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   490
                     ext.name)
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   491
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   492
class hgbuildscripts(build_scripts):
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   493
    def run(self):
28041
8da94662afe5 setup: avoid procedure related to hg.exe at setup.py --pure
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27925
diff changeset
   494
        if os.name != 'nt' or self.distribution.pure:
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   495
            return build_scripts.run(self)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   496
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   497
        exebuilt = False
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   498
        try:
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   499
            self.run_command('build_hgexe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   500
            exebuilt = True
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   501
        except (DistutilsError, CCompilerError):
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   502
            log.warn('failed to build optional hg.exe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   503
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   504
        if exebuilt:
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   505
            # Copying hg.exe to the scripts build directory ensures it is
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   506
            # installed by the install_scripts command.
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   507
            hgexecommand = self.get_finalized_command('build_hgexe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   508
            dest = os.path.join(self.build_dir, 'hg.exe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   509
            self.mkpath(self.build_dir)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   510
            self.copy_file(hgexecommand.hgexepath, dest)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   511
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   512
            # Remove hg.bat because it is redundant with hg.exe.
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   513
            self.scripts.remove('contrib/win32/hg.bat')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   514
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   515
        return build_scripts.run(self)
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   516
10000
16f49d671c7f setup: cleanup coding style
Martin Geisler <mg@lazybytes.net>
parents: 9999
diff changeset
   517
class hgbuildpy(build_py):
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   518
    def finalize_options(self):
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   519
        build_py.finalize_options(self)
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   520
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   521
        if self.distribution.pure:
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   522
            self.distribution.ext_modules = []
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   523
        elif self.distribution.cffi:
30356
9cc438bf7d9a setup: move cffi stuff to mercurial/cffi
Jun Wu <quark@fb.com>
parents: 29844
diff changeset
   524
            from mercurial.cffi import (
32538
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   525
                bdiffbuild,
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   526
                mpatchbuild,
30356
9cc438bf7d9a setup: move cffi stuff to mercurial/cffi
Jun Wu <quark@fb.com>
parents: 29844
diff changeset
   527
            )
32538
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   528
            exts = [mpatchbuild.ffi.distutils_extension(),
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   529
                    bdiffbuild.ffi.distutils_extension()]
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   530
            # cffi modules go here
29600
7a157639b8f2 osutil: add darwin-only version of os.listdir using cffi
Maciej Fijalkowski <fijall@gmail.com>
parents: 29541
diff changeset
   531
            if sys.platform == 'darwin':
32538
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   532
                from mercurial.cffi import osutilbuild
05a16c19967e cffi: rename build scripts
Yuya Nishihara <yuya@tcha.org>
parents: 32458
diff changeset
   533
                exts.append(osutilbuild.ffi.distutils_extension())
29505
2dce3f96ad7b setup: prepare for future cffi modules by adding placeholder in setup
Maciej Fijalkowski <fijall@gmail.com>
parents: 29444
diff changeset
   534
            self.distribution.ext_modules = exts
12649
6c0e1aee1b19 setup: user-friendly error message if Python headers are missing
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12501
diff changeset
   535
        else:
18905
012780620d4f setup: make error message for missing Python headers more helpful
Mads Kiilerich <mads@kiilerich.com>
parents: 18900
diff changeset
   536
            h = os.path.join(get_python_inc(), 'Python.h')
012780620d4f setup: make error message for missing Python headers more helpful
Mads Kiilerich <mads@kiilerich.com>
parents: 18900
diff changeset
   537
            if not os.path.exists(h):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16383
diff changeset
   538
                raise SystemExit('Python headers are required to build '
18905
012780620d4f setup: make error message for missing Python headers more helpful
Mads Kiilerich <mads@kiilerich.com>
parents: 18900
diff changeset
   539
                                 'Mercurial but weren\'t found in %s' % h)
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   540
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   541
    def run(self):
32675
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32670
diff changeset
   542
        basepath = os.path.join(self.build_lib, 'mercurial')
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32670
diff changeset
   543
        self.mkpath(basepath)
7dab4c0cdb41 setup: do not overwrite local __modulepolicy__.py on out-of-source build
Yuya Nishihara <yuya@tcha.org>
parents: 32670
diff changeset
   544
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   545
        if self.distribution.pure:
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   546
            modulepolicy = 'py'
32291
a04f5c651e52 policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents: 32273
diff changeset
   547
        elif self.build_lib == '.':
a04f5c651e52 policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents: 32273
diff changeset
   548
            # in-place build should run without rebuilding C extensions
a04f5c651e52 policy: relax the default for in-place build
Yuya Nishihara <yuya@tcha.org>
parents: 32273
diff changeset
   549
            modulepolicy = 'allow'
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   550
        else:
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   551
            modulepolicy = 'c'
35238
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   552
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   553
        content = b''.join([
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   554
            b'# this file is autogenerated by setup.py\n',
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   555
            b'modulepolicy = b"%s"\n' % modulepolicy.encode('ascii'),
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   556
        ])
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   557
        write_if_changed(os.path.join(basepath, '__modulepolicy__.py'),
61ff0d7d56fd setup: only write some autogenerated files if they change
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35126
diff changeset
   558
                         content)
27222
511a4384b033 setup: refactor handling of modules with C/Python implementations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27220
diff changeset
   559
28430
17b85d739b62 setup: create a module for the modulepolicy
timeless <timeless@mozdev.org>
parents: 28418
diff changeset
   560
        build_py.run(self)
7722
103127a8cbdb add --pure flag to setup.py
Martin Geisler <mg@daimi.au.dk>
parents: 7721
diff changeset
   561
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   562
class buildhgextindex(Command):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   563
    description = 'generate prebuilt index of hgext (for frozen package)'
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   564
    user_options = []
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   565
    _indexfilename = 'hgext/__index__.py'
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   566
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   567
    def initialize_options(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   568
        pass
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   569
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   570
    def finalize_options(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   571
        pass
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   572
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   573
    def run(self):
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   574
        if os.path.exists(self._indexfilename):
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   575
            with open(self._indexfilename, 'w') as f:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   576
                f.write('# empty\n')
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   577
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   578
        # here no extension enabled, disabled() lists up everything
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   579
        code = ('import pprint; from mercurial import extensions; '
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   580
                'pprint.pprint(extensions.disabled())')
33126
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   581
        returncode, out, err = runcmd([sys.executable, '-c', code],
8b20338b989e setup: prefer using the system hg to interact with the local repository
Adam Simpkins <simpkins@fb.com>
parents: 33125
diff changeset
   582
                                      localhgenv())
33123
87ee783f7299 setup: update runcmd() to also return the exit status
Adam Simpkins <simpkins@fb.com>
parents: 33122
diff changeset
   583
        if err or returncode != 0:
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   584
            raise DistutilsExecError(err)
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   585
42075
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   586
        with open(self._indexfilename, 'wb') as f:
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   587
            f.write(b'# this file is autogenerated by setup.py\n')
456c37433c43 py3: write out hgextindex as bytes in setup.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 42074
diff changeset
   588
            f.write(b'docs = ')
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   589
            f.write(out)
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   590
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   591
class buildhgexe(build_ext):
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   592
    description = 'compile hg.exe from mercurial/exewrapper.c'
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   593
    user_options = build_ext.user_options + [
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   594
        ('long-paths-support', None, 'enable support for long paths on '
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   595
                                     'Windows (off by default and '
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   596
                                     'experimental)'),
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   597
    ]
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   598
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   599
    LONG_PATHS_MANIFEST = """
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   600
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   601
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   602
        <application>
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   603
            <windowsSettings
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   604
            xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   605
                <ws2:longPathAware>true</ws2:longPathAware>
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   606
            </windowsSettings>
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   607
        </application>
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   608
    </assembly>"""
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   609
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   610
    def initialize_options(self):
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   611
        build_ext.initialize_options(self)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   612
        self.long_paths_support = False
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   613
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   614
    def build_extensions(self):
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   615
        if os.name != 'nt':
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   616
            return
17246
bf5bb38bcc7c setup: fix build_hgexe for mingw32 compiler
Adrian Buehlmann <adrian@cadifra.com>
parents: 17121
diff changeset
   617
        if isinstance(self.compiler, HackedMingw32CCompiler):
bf5bb38bcc7c setup: fix build_hgexe for mingw32 compiler
Adrian Buehlmann <adrian@cadifra.com>
parents: 17121
diff changeset
   618
            self.compiler.compiler_so = self.compiler.compiler # no -mdll
bf5bb38bcc7c setup: fix build_hgexe for mingw32 compiler
Adrian Buehlmann <adrian@cadifra.com>
parents: 17121
diff changeset
   619
            self.compiler.dll_libraries = [] # no -lmsrvc90
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   620
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   621
        # Different Python installs can have different Python library
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   622
        # names. e.g. the official CPython distribution uses pythonXY.dll
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   623
        # and MinGW uses libpythonX.Y.dll.
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   624
        _kernel32 = ctypes.windll.kernel32
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   625
        _kernel32.GetModuleFileNameA.argtypes = [ctypes.c_void_p,
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   626
                                                 ctypes.c_void_p,
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   627
                                                 ctypes.c_ulong]
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   628
        _kernel32.GetModuleFileNameA.restype = ctypes.c_ulong
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   629
        size = 1000
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   630
        buf = ctypes.create_string_buffer(size + 1)
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   631
        filelen = _kernel32.GetModuleFileNameA(sys.dllhandle, ctypes.byref(buf),
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   632
                                               size)
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   633
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   634
        if filelen > 0 and filelen != size:
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   635
            dllbasename = os.path.basename(buf.value)
39624
ec68135a8935 py3: add b'' to some setup.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39588
diff changeset
   636
            if not dllbasename.lower().endswith(b'.dll'):
29020
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   637
                raise SystemExit('Python DLL does not end with .dll: %s' %
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   638
                                 dllbasename)
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   639
            pythonlib = dllbasename[:-4]
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   640
        else:
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   641
            log.warn('could not determine Python DLL filename; '
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   642
                     'assuming pythonXY')
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   643
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   644
            hv = sys.hexversion
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   645
            pythonlib = 'python%d%d' % (hv >> 24, (hv >> 16) & 0xff)
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   646
ee2e4a2c3690 setup: detect Python DLL filename from loaded DLL
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28625
diff changeset
   647
        log.info('using %s as Python library name' % pythonlib)
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   648
        with open('mercurial/hgpythonlib.h', 'wb') as f:
39624
ec68135a8935 py3: add b'' to some setup.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39588
diff changeset
   649
            f.write(b'/* this file is autogenerated by setup.py */\n')
ec68135a8935 py3: add b'' to some setup.py strings for Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39588
diff changeset
   650
            f.write(b'#define HGPYTHONLIB "%s"\n' % pythonlib)
40397
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   651
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   652
        macros = None
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   653
        if sys.version_info[0] >= 3:
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   654
            macros = [('_UNICODE', None), ('UNICODE', None)]
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   655
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   656
        objects = self.compiler.compile(['mercurial/exewrapper.c'],
40397
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   657
                                         output_dir=self.build_temp,
36b134c436b8 setup: build exewrapper with Unicode support on py3
Matt Harbison <matt_harbison@yahoo.com>
parents: 40383
diff changeset
   658
                                         macros=macros)
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   659
        dir = os.path.dirname(self.get_ext_fullpath('dummy'))
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   660
        self.hgtarget = os.path.join(dir, 'hg')
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   661
        self.compiler.link_executable(objects, self.hgtarget,
17732
93d97a212559 exewrapper: adapt for legacy HackableMercurial
Adrian Buehlmann <adrian@cadifra.com>
parents: 17709
diff changeset
   662
                                      libraries=[],
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   663
                                      output_dir=self.build_temp)
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   664
        if self.long_paths_support:
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   665
            self.addlongpathsmanifest()
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   666
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   667
    def addlongpathsmanifest(self):
41547
0f64091cc851 global: make some docstrings raw strings
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41313
diff changeset
   668
        r"""Add manifest pieces so that hg.exe understands long paths
34530
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   669
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   670
        This is an EXPERIMENTAL feature, use with care.
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   671
        To enable long paths support, one needs to do two things:
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   672
        - build Mercurial with --long-paths-support option
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   673
        - change HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   674
                 LongPathsEnabled to have value 1.
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   675
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   676
        Please ignore 'warning 81010002: Unrecognized Element "longPathAware"';
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   677
        it happens because Mercurial uses mt.exe circa 2008, which is not
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   678
        yet aware of long paths support in the manifest (I think so at least).
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   679
        This does not stop mt.exe from embedding/merging the XML properly.
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   680
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   681
        Why resource #1 should be used for .exe manifests? I don't know and
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   682
        wasn't able to find an explanation for mortals. But it seems to work.
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   683
        """
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   684
        exefname = self.compiler.executable_filename(self.hgtarget)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   685
        fdauto, manfname = tempfile.mkstemp(suffix='.hg.exe.manifest')
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   686
        os.close(fdauto)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   687
        with open(manfname, 'w') as f:
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   688
            f.write(self.LONG_PATHS_MANIFEST)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   689
        log.info("long paths manifest is written to '%s'" % manfname)
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   690
        inputresource = '-inputresource:%s;#1' % exefname
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   691
        outputresource = '-outputresource:%s;#1' % exefname
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   692
        log.info("running mt.exe to update hg.exe's manifest in-place")
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   693
        # supplying both -manifest and -inputresource to mt.exe makes
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   694
        # it merge the embedded and supplied manifests in the -outputresource
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   695
        self.spawn(['mt.exe', '-nologo', '-manifest', manfname,
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   696
                    inputresource, outputresource])
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   697
        log.info("done updating hg.exe's manifest")
ed5acd3fd7e1 windows: add an experimental option for long paths support
Kostia Balytskyi <ikostia@fb.com>
parents: 34398
diff changeset
   698
        os.remove(manfname)
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   699
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   700
    @property
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   701
    def hgexepath(self):
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   702
        dir = os.path.dirname(self.get_ext_fullpath('dummy'))
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   703
        return os.path.join(self.build_temp, dir, 'hg.exe')
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   704
41855
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   705
class hgbuilddoc(Command):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   706
    description = 'build documentation'
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   707
    user_options = [
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   708
        ('man', None, 'generate man pages'),
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   709
        ('html', None, 'generate html pages'),
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   710
    ]
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   711
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   712
    def initialize_options(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   713
        self.man = None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   714
        self.html = None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   715
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   716
    def finalize_options(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   717
        # If --man or --html are set, only generate what we're told to.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   718
        # Otherwise generate everything.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   719
        have_subset = self.man is not None or self.html is not None
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   720
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   721
        if have_subset:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   722
            self.man = True if self.man else False
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   723
            self.html = True if self.html else False
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   724
        else:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   725
            self.man = True
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   726
            self.html = True
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   727
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   728
    def run(self):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   729
        def normalizecrlf(p):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   730
            with open(p, 'rb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   731
                orig = fh.read()
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   732
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   733
            if b'\r\n' not in orig:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   734
                return
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   735
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   736
            log.info('normalizing %s to LF line endings' % p)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   737
            with open(p, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   738
                fh.write(orig.replace(b'\r\n', b'\n'))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   739
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   740
        def gentxt(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   741
            txt = 'doc/%s.txt' % root
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   742
            log.info('generating %s' % txt)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   743
            res, out, err = runcmd(
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   744
                [sys.executable, 'gendoc.py', root],
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   745
                os.environ,
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   746
                cwd='doc')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   747
            if res:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   748
                raise SystemExit('error running gendoc.py: %s' %
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   749
                                 '\n'.join([out, err]))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   750
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   751
            with open(txt, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   752
                fh.write(out)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   753
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   754
        def gengendoc(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   755
            gendoc = 'doc/%s.gendoc.txt' % root
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   756
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   757
            log.info('generating %s' % gendoc)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   758
            res, out, err = runcmd(
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   759
                [sys.executable, 'gendoc.py', '%s.gendoc' % root],
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   760
                os.environ,
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   761
                cwd='doc')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   762
            if res:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   763
                raise SystemExit('error running gendoc: %s' %
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   764
                                 '\n'.join([out, err]))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   765
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   766
            with open(gendoc, 'wb') as fh:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   767
                fh.write(out)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   768
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   769
        def genman(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   770
            log.info('generating doc/%s' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   771
            res, out, err = runcmd(
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   772
                [sys.executable, 'runrst', 'hgmanpage', '--halt', 'warning',
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   773
                 '--strip-elements-with-class', 'htmlonly',
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   774
                 '%s.txt' % root, root],
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   775
                os.environ,
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   776
                cwd='doc')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   777
            if res:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   778
                raise SystemExit('error running runrst: %s' %
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   779
                                 '\n'.join([out, err]))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   780
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   781
            normalizecrlf('doc/%s' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   782
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   783
        def genhtml(root):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   784
            log.info('generating doc/%s.html' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   785
            res, out, err = runcmd(
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   786
                [sys.executable, 'runrst', 'html', '--halt', 'warning',
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   787
                 '--link-stylesheet', '--stylesheet-path', 'style.css',
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   788
                 '%s.txt' % root, '%s.html' % root],
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   789
                os.environ,
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   790
                cwd='doc')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   791
            if res:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   792
                raise SystemExit('error running runrst: %s' %
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   793
                                 '\n'.join([out, err]))
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   794
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   795
            normalizecrlf('doc/%s.html' % root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   796
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   797
        # This logic is duplicated in doc/Makefile.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   798
        sources = {f for f in os.listdir('mercurial/help')
42065
fecbd93a5f08 setup: use raw string for regular expression
Gregory Szorc <gregory.szorc@gmail.com>
parents: 42054
diff changeset
   799
                   if re.search(r'[0-9]\.txt$', f)}
41855
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   800
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   801
        # common.txt is a one-off.
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   802
        gentxt('common')
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   803
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   804
        for source in sorted(sources):
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   805
            assert source[-4:] == '.txt'
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   806
            root = source[:-4]
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   807
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   808
            gentxt(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   809
            gengendoc(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   810
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   811
            if self.man:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   812
                genman(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   813
            if self.html:
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   814
                genhtml(root)
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   815
32670
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   816
class hginstall(install):
32745
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   817
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   818
    user_options = install.user_options + [
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   819
        ('old-and-unmanageable', None,
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   820
         'noop, present for eggless setuptools compat'),
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   821
        ('single-version-externally-managed', None,
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   822
         'noop, present for eggless setuptools compat'),
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   823
    ]
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   824
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   825
    # Also helps setuptools not be sad while we refuse to create eggs.
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   826
    single_version_externally_managed = True
6c4b58422974 setup: introduce dummy copies of setuptools flags
Augie Fackler <augie@google.com>
parents: 32675
diff changeset
   827
32670
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   828
    def get_sub_commands(self):
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   829
        # Screen out egg related commands to prevent egg generation.  But allow
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   830
        # mercurial.egg-info generation, since that is part of modern
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   831
        # packaging.
33589
a0bfcd08f5fe setup: drop use of set literal so parsable on Python 2.6
Yuya Nishihara <yuya@tcha.org>
parents: 33588
diff changeset
   832
        excl = set(['bdist_egg'])
32670
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   833
        return filter(lambda x: x not in excl, install.get_sub_commands(self))
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   834
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   835
class hginstalllib(install_lib):
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   836
    '''
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   837
    This is a specialization of install_lib that replaces the copy_file used
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   838
    there so that it supports setting the mode of files after copying them,
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   839
    instead of just preserving the mode that the files originally had.  If your
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   840
    system has a umask of something like 027, preserving the permissions when
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   841
    copying will lead to a broken install.
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   842
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   843
    Note that just passing keep_permissions=False to copy_file would be
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   844
    insufficient, as it might still be applying a umask.
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   845
    '''
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   846
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   847
    def run(self):
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   848
        realcopyfile = file_util.copy_file
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   849
        def copyfileandsetmode(*args, **kwargs):
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   850
            src, dst = args[0], args[1]
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   851
            dst, copied = realcopyfile(*args, **kwargs)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   852
            if copied:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   853
                st = os.stat(src)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   854
                # Persist executable bit (apply it to group and other if user
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   855
                # has it)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   856
                if st[stat.ST_MODE] & stat.S_IXUSR:
24941
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   857
                    setmode = int('0755', 8)
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   858
                else:
24941
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   859
                    setmode = int('0644', 8)
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   860
                m = stat.S_IMODE(st[stat.ST_MODE])
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   861
                m = (m & ~int('0777', 8)) | setmode
9c1942635c1f setup: hide octal literals inside strings so they're portable (issue4554)
Augie Fackler <augie@google.com>
parents: 24214
diff changeset
   862
                os.chmod(dst, m)
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   863
        file_util.copy_file = copyfileandsetmode
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   864
        try:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   865
            install_lib.run(self)
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   866
        finally:
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   867
            file_util.copy_file = realcopyfile
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   868
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   869
class hginstallscripts(install_scripts):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   870
    '''
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   871
    This is a specialization of install_scripts that replaces the @LIBDIR@ with
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   872
    the configured directory for modules. If possible, the path is made relative
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   873
    to the directory for scripts.
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   874
    '''
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   875
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   876
    def initialize_options(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   877
        install_scripts.initialize_options(self)
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   878
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   879
        self.install_lib = None
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   880
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   881
    def finalize_options(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   882
        install_scripts.finalize_options(self)
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   883
        self.set_undefined_options('install',
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   884
                                   ('install_lib', 'install_lib'))
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   885
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   886
    def run(self):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   887
        install_scripts.run(self)
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   888
27269
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   889
        # It only makes sense to replace @LIBDIR@ with the install path if
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   890
        # the install path is known. For wheels, the logic below calculates
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   891
        # the libdir to be "../..". This is because the internal layout of a
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   892
        # wheel archive looks like:
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   893
        #
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   894
        #   mercurial-3.6.1.data/scripts/hg
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   895
        #   mercurial/__init__.py
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   896
        #
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   897
        # When installing wheels, the subdirectories of the "<pkg>.data"
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   898
        # directory are translated to system local paths and files therein
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   899
        # are copied in place. The mercurial/* files are installed into the
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   900
        # site-packages directory. However, the site-packages directory
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   901
        # isn't known until wheel install time. This means we have no clue
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   902
        # at wheel generation time what the installed site-packages directory
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   903
        # will be. And, wheels don't appear to provide the ability to register
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   904
        # custom code to run during wheel installation. This all means that
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   905
        # we can't reliably set the libdir in wheels: the default behavior
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   906
        # of looking in sys.path must do.
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   907
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   908
        if (os.path.splitdrive(self.install_dir)[0] !=
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   909
            os.path.splitdrive(self.install_lib)[0]):
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   910
            # can't make relative paths from one drive to another, so use an
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   911
            # absolute path instead
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   912
            libdir = self.install_lib
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   913
        else:
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   914
            common = os.path.commonprefix((self.install_dir, self.install_lib))
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   915
            rest = self.install_dir[len(common):]
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   916
            uplevel = len([n for n in os.path.split(rest) if n])
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   917
27637
b502138f5faa cleanup: remove superfluous space after space after equals (python)
timeless <timeless@mozdev.org>
parents: 27374
diff changeset
   918
            libdir = uplevel * ('..' + os.sep) + self.install_lib[len(common):]
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   919
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   920
        for outfile in self.outfiles:
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   921
            with open(outfile, 'rb') as fp:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   922
                data = fp.read()
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   923
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   924
            # skip binary files
27348
83a8219fb790 setup.py: use bytes literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27269
diff changeset
   925
            if b'\0' in data:
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   926
                continue
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   927
27269
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   928
            # During local installs, the shebang will be rewritten to the final
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   929
            # install path. During wheel packaging, the shebang has a special
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   930
            # value.
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   931
            if data.startswith(b'#!python'):
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   932
                log.info('not rewriting @LIBDIR@ in %s because install path '
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   933
                         'not known' % outfile)
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   934
                continue
bdcbec65750b setup.py: don't rewrite @LIBDIR@ when creating wheels
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27268
diff changeset
   935
27348
83a8219fb790 setup.py: use bytes literals
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27269
diff changeset
   936
            data = data.replace(b'@LIBDIR@', libdir.encode(libdir_escape))
28418
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   937
            with open(outfile, 'wb') as fp:
121d25719e92 setup: switch to with open as
timeless <timeless@mozdev.org>
parents: 28398
diff changeset
   938
                fp.write(data)
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   939
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   940
cmdclass = {'build': hgbuild,
41855
d80d48928eb1 setup: define build_doc command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41768
diff changeset
   941
            'build_doc': hgbuilddoc,
15460
f9f0731dbc56 setup: subclass build command
Simon Heimberg <simohe@besonet.ch>
parents: 15459
diff changeset
   942
            'build_mo': hgbuildmo,
11468
1c1126b1d919 setup: ignore failures to build optional inotify extension
Christian Boos <cboos@neuf.fr>
parents: 10905
diff changeset
   943
            'build_ext': hgbuildext,
12661
10da5a1f25dd setup/hg: always load Mercurial from where it was installed.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 12649
diff changeset
   944
            'build_py': hgbuildpy,
27268
ed1660ce99d9 setup.py: attempt to build and install hg.exe on Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27222
diff changeset
   945
            'build_scripts': hgbuildscripts,
14538
3818c67a501e setup: add command to generate index of extensions
Yuya Nishihara <yuya@tcha.org>
parents: 14324
diff changeset
   946
            'build_hgextindex': buildhgextindex,
32670
331dcf199039 setup: prevent setuptools from laying an egg
Matt Harbison <matt_harbison@yahoo.com>
parents: 32539
diff changeset
   947
            'install': hginstall,
22640
e88a634e0195 setup: set mode 644 or 755 on installed files
Kyle Lippincott <spectral@google.com>
parents: 22575
diff changeset
   948
            'install_lib': hginstalllib,
17061
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   949
            'install_scripts': hginstallscripts,
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   950
            'build_hgexe': buildhgexe,
f20e4d76b711 setup: compile hg.exe
Adrian Buehlmann <adrian@cadifra.com>
parents: 16775
diff changeset
   951
            }
3238
3dba9ec89164 Applied coding style to setup.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2402
diff changeset
   952
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
   953
packages = ['mercurial',
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
   954
            'mercurial.cext',
32539
2dcb3d52ef41 cffi: put compiled modules into mercurial.cffi package
Yuya Nishihara <yuya@tcha.org>
parents: 32538
diff changeset
   955
            'mercurial.cffi',
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
   956
            'mercurial.hgweb',
27222
511a4384b033 setup: refactor handling of modules with C/Python implementations
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27220
diff changeset
   957
            'mercurial.pure',
34398
765eb17a7eb8 thirdparty: vendor attrs
Siddharth Agarwal <sid0@fb.com>
parents: 33884
diff changeset
   958
            'mercurial.thirdparty',
765eb17a7eb8 thirdparty: vendor attrs
Siddharth Agarwal <sid0@fb.com>
parents: 33884
diff changeset
   959
            'mercurial.thirdparty.attr',
37182
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
   960
            'mercurial.thirdparty.zope',
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
   961
            'mercurial.thirdparty.zope.interface',
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36456
diff changeset
   962
            'mercurial.utils',
39356
729082bb9938 revlog: split constants into a new `revlogutils.constants` module
Boris Feld <boris.feld@octobus.net>
parents: 39238
diff changeset
   963
            'mercurial.revlogutils',
39788
ae531f5e583c testing: add interface unit tests for file storage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39629
diff changeset
   964
            'mercurial.testing',
28625
776fd2e2cf5a setup: add missing hgext.fsmonitor
Sean Farley <sean@farley.io>
parents: 28609
diff changeset
   965
            'hgext', 'hgext.convert', 'hgext.fsmonitor',
39238
1ddb296e0dee fastannotate: initial import from Facebook's hg-experimental
Augie Fackler <augie@google.com>
parents: 38721
diff changeset
   966
            'hgext.fastannotate',
37305
611e466662af setup: add overlooked hgext.infinitepush package declaration
Augie Fackler <augie@google.com>
parents: 37182
diff changeset
   967
            'hgext.fsmonitor.pywatchman',
611e466662af setup: add overlooked hgext.infinitepush package declaration
Augie Fackler <augie@google.com>
parents: 37182
diff changeset
   968
            'hgext.infinitepush',
611e466662af setup: add overlooked hgext.infinitepush package declaration
Augie Fackler <augie@google.com>
parents: 37182
diff changeset
   969
            'hgext.highlight',
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents: 35774
diff changeset
   970
            'hgext.largefiles', 'hgext.lfs', 'hgext.narrow',
40545
3a333a582d7b remotefilelog: import pruned-down remotefilelog extension from hg-experimental
Augie Fackler <augie@google.com>
parents: 40420
diff changeset
   971
            'hgext.remotefilelog',
36117
a2a6e724d61a narrow: import experimental extension from narrowhg revision cb51d673e9c5
Augie Fackler <augie@google.com>
parents: 35774
diff changeset
   972
            'hgext.zeroconf', 'hgext3rd',
32458
0906b85bf222 demandimport: move to separate package
Siddharth Agarwal <sid0@fb.com>
parents: 32423
diff changeset
   973
            'hgdemandimport']
39629
96bffce40f5b setup: exclude vendored futures package on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
   974
if sys.version_info[0] == 2:
96bffce40f5b setup: exclude vendored futures package on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
   975
    packages.extend(['mercurial.thirdparty.concurrent',
96bffce40f5b setup: exclude vendored futures package on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 39624
diff changeset
   976
                     'mercurial.thirdparty.concurrent.futures'])
10521
bde1bb250fc2 Do not use osutil.c with python 2.4 and Windows (issue1364)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10400
diff changeset
   977
42054
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   978
if 'HG_PY2EXE_EXTRA_INSTALL_PACKAGES' in os.environ:
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   979
    # py2exe can't cope with namespace packages very well, so we have to
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   980
    # install any hgext3rd.* extensions that we want in the final py2exe
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   981
    # image here. This is gross, but you gotta do what you gotta do.
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   982
    packages.extend(os.environ['HG_PY2EXE_EXTRA_INSTALL_PACKAGES'].split(' '))
399ed3e86a49 py2exe: add workaround to allow bundling of hgext3rd.* extensions
Augie Fackler <augie@google.com>
parents: 41959
diff changeset
   983
29444
284d742e5611 internals: move the bitmanipulation routines into its own file
Maciej Fijalkowski <fijall@gmail.com>
parents: 29020
diff changeset
   984
common_depends = ['mercurial/bitmanipulation.h',
284d742e5611 internals: move the bitmanipulation routines into its own file
Maciej Fijalkowski <fijall@gmail.com>
parents: 29020
diff changeset
   985
                  'mercurial/compat.h',
32423
34bd3cd28dcb cext: move util.h to cext tree
Yuya Nishihara <yuya@tcha.org>
parents: 32417
diff changeset
   986
                  'mercurial/cext/util.h']
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
   987
common_include_dirs = ['mercurial']
19724
2b2a2e858fb7 setup: check if mercurial/util.h has been modified
Wei, Elson <elson.wei@gmail.com>
parents: 18905
diff changeset
   988
30418
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30356
diff changeset
   989
osutil_cflags = []
25073
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
   990
osutil_ldflags = []
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
   991
31567
312e62640798 setup: detect statfs
Jun Wu <quark@fb.com>
parents: 31566
diff changeset
   992
# platform specific macros
31627
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
   993
for plat, func in [('bsd', 'setproctitle')]:
31567
312e62640798 setup: detect statfs
Jun Wu <quark@fb.com>
parents: 31566
diff changeset
   994
    if re.search(plat, sys.platform) and hasfunction(new_compiler(), func):
30418
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30356
diff changeset
   995
        osutil_cflags.append('-DHAVE_%s' % func.upper())
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30356
diff changeset
   996
31601
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
   997
for plat, macro, code in [
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
   998
    ('bsd|darwin', 'BSD_STATFS', '''
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
   999
     #include <sys/param.h>
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1000
     #include <sys/mount.h>
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1001
     int main() { struct statfs s; return sizeof(s.f_fstypename); }
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1002
     '''),
31627
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
  1003
    ('linux', 'LINUX_STATFS', '''
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
  1004
     #include <linux/magic.h>
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
  1005
     #include <sys/vfs.h>
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
  1006
     int main() { struct statfs s; return sizeof(s.f_type); }
2243ba216f66 statfs: change Linux feature detection
Jun Wu <quark@fb.com>
parents: 31601
diff changeset
  1007
     '''),
31601
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1008
]:
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1009
    if re.search(plat, sys.platform) and cancompile(new_compiler(), code):
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1010
        osutil_cflags.append('-DHAVE_%s' % macro)
ab51a2b18f87 setup: use a more strict way to test BSD or OSX's statfs
Jun Wu <quark@fb.com>
parents: 31568
diff changeset
  1011
25073
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1012
if sys.platform == 'darwin':
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1013
    osutil_ldflags += ['-framework', 'ApplicationServices']
c1a9e31bec0f setup: move osutil_ldflags logic to before extmodules definition
Adrian Buehlmann <adrian@cadifra.com>
parents: 25072
diff changeset
  1014
36704
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1015
xdiff_srcs = [
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1016
    'mercurial/thirdparty/xdiff/xdiffi.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1017
    'mercurial/thirdparty/xdiff/xprepare.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1018
    'mercurial/thirdparty/xdiff/xutils.c',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1019
]
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1020
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1021
xdiff_headers = [
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1022
    'mercurial/thirdparty/xdiff/xdiff.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1023
    'mercurial/thirdparty/xdiff/xdiffi.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1024
    'mercurial/thirdparty/xdiff/xinclude.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1025
    'mercurial/thirdparty/xdiff/xmacros.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1026
    'mercurial/thirdparty/xdiff/xprepare.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1027
    'mercurial/thirdparty/xdiff/xtypes.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1028
    'mercurial/thirdparty/xdiff/xutils.h',
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1029
]
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1030
40979
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1031
class RustCompilationError(CCompilerError):
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1032
    """Exception class for Rust compilation errors."""
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1033
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1034
class RustExtension(Extension):
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1035
    """Base classes for concrete Rust Extension classes.
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1036
    """
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1037
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1038
    rusttargetdir = os.path.join('rust', 'target', 'release')
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1039
40998
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1040
    def __init__(self, mpath, sources, rustlibname, subcrate,
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1041
                 py3_features=None, **kw):
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1042
        Extension.__init__(self, mpath, sources, **kw)
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1043
        if hgrustext is None:
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1044
            return
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1045
        srcdir = self.rustsrcdir = os.path.join('rust', subcrate)
40998
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1046
        self.py3_features = py3_features
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1047
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1048
        # adding Rust source and control files to depends so that the extension
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1049
        # gets rebuilt if they've changed
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1050
        self.depends.append(os.path.join(srcdir, 'Cargo.toml'))
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1051
        cargo_lock = os.path.join(srcdir, 'Cargo.lock')
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1052
        if os.path.exists(cargo_lock):
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1053
            self.depends.append(cargo_lock)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1054
        for dirpath, subdir, fnames in os.walk(os.path.join(srcdir, 'src')):
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1055
            self.depends.extend(os.path.join(dirpath, fname)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1056
                                for fname in fnames
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1057
                                if os.path.splitext(fname)[1] == '.rs')
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1058
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1059
    def rustbuild(self):
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1060
        if hgrustext is None:
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1061
            return
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1062
        env = os.environ.copy()
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1063
        if 'HGTEST_RESTOREENV' in env:
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1064
            # Mercurial tests change HOME to a temporary directory,
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1065
            # but, if installed with rustup, the Rust toolchain needs
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1066
            # HOME to be correct (otherwise the 'no default toolchain'
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1067
            # error message is issued and the build fails).
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1068
            # This happens currently with test-hghave.t, which does
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1069
            # invoke this build.
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1070
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1071
            # Unix only fix (os.path.expanduser not really reliable if
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1072
            # HOME is shadowed like this)
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1073
            import pwd
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1074
            env['HOME'] = pwd.getpwuid(os.getuid()).pw_dir
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1075
40979
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1076
        cargocmd = ['cargo', 'build', '-vv', '--release']
40998
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1077
        if sys.version_info[0] == 3 and self.py3_features is not None:
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1078
            cargocmd.extend(('--features', self.py3_features,
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1079
                             '--no-default-features'))
40979
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1080
        try:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1081
            subprocess.check_call(cargocmd, env=env, cwd=self.rustsrcdir)
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1082
        except OSError as exc:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1083
            if exc.errno == errno.ENOENT:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1084
                raise RustCompilationError("Cargo not found")
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1085
            elif exc.errno == errno.EACCES:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1086
                raise RustCompilationError(
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1087
                    "Cargo found, but permisssion to execute it is denied")
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1088
            else:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1089
                raise
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1090
        except subprocess.CalledProcessError:
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1091
            raise RustCompilationError(
1eaf62a67c1a rust: better treatment of cargo/rustc errors
Georges Racinet <gracinet@anybox.fr>
parents: 40877
diff changeset
  1092
                "Cargo failed. Working directory: %r, "
42074
59b1bdf85b1a setup: fix a possible NameError on rust build
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 42065
diff changeset
  1093
                "command: %r, environment: %r"
59b1bdf85b1a setup: fix a possible NameError on rust build
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 42065
diff changeset
  1094
                % (self.rustsrcdir, cargocmd, env))
40273
3b275f549777 rust: exposing in parsers module
Georges Racinet <gracinet@anybox.fr>
parents: 40122
diff changeset
  1095
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1096
class RustEnhancedExtension(RustExtension):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1097
    """A C Extension, conditionally enhanced with Rust code.
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1098
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1099
    If the HGRUSTEXT environment variable is set to something else
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1100
    than 'cpython', the Rust sources get compiled and linked within the
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1101
    C target shared library object.
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1102
    """
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1103
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1104
    def __init__(self, mpath, sources, rustlibname, subcrate, **kw):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1105
        RustExtension.__init__(self, mpath, sources, rustlibname, subcrate,
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1106
                               **kw)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1107
        if hgrustext != 'direct-ffi':
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1108
            return
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1109
        self.extra_compile_args.append('-DWITH_RUST')
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1110
        self.libraries.append(rustlibname)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1111
        self.library_dirs.append(self.rusttargetdir)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1112
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1113
class RustStandaloneExtension(RustExtension):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1114
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1115
    def __init__(self, pydottedname, rustcrate, dylibname, **kw):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1116
        RustExtension.__init__(self, pydottedname, [], dylibname, rustcrate,
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1117
                               **kw)
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1118
        self.dylibname = dylibname
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1119
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1120
    def build(self, target_dir):
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1121
        self.rustbuild()
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1122
        target = [target_dir]
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1123
        target.extend(self.name.split('.'))
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1124
        ext = '.so'  # TODO Unix only
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1125
        target[-1] += ext
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1126
        shutil.copy2(os.path.join(self.rusttargetdir, self.dylibname + ext),
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1127
                     os.path.join(*target))
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1128
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1129
10000
16f49d671c7f setup: cleanup coding style
Martin Geisler <mg@lazybytes.net>
parents: 9999
diff changeset
  1130
extmodules = [
32407
008d37c4d783 base85: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32406
diff changeset
  1131
    Extension('mercurial.cext.base85', ['mercurial/cext/base85.c'],
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
  1132
              include_dirs=common_include_dirs,
19724
2b2a2e858fb7 setup: check if mercurial/util.h has been modified
Wei, Elson <elson.wei@gmail.com>
parents: 18905
diff changeset
  1133
              depends=common_depends),
32408
3b88a7fa97d8 bdiff: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32407
diff changeset
  1134
    Extension('mercurial.cext.bdiff', ['mercurial/bdiff.c',
36704
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1135
                                       'mercurial/cext/bdiff.c'] + xdiff_srcs,
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
  1136
              include_dirs=common_include_dirs,
36704
430fdb717549 bdiff: add a xdiffblocks method
Jun Wu <quark@fb.com>
parents: 36636
diff changeset
  1137
              depends=common_depends + ['mercurial/bdiff.h'] + xdiff_headers),
32410
151cc3b3d799 mpatch: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32409
diff changeset
  1138
    Extension('mercurial.cext.mpatch', ['mercurial/mpatch.c',
151cc3b3d799 mpatch: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32409
diff changeset
  1139
                                        'mercurial/cext/mpatch.c'],
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
  1140
              include_dirs=common_include_dirs,
19724
2b2a2e858fb7 setup: check if mercurial/util.h has been modified
Wei, Elson <elson.wei@gmail.com>
parents: 18905
diff changeset
  1141
              depends=common_depends),
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1142
    RustEnhancedExtension(
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1143
        'mercurial.cext.parsers', ['mercurial/cext/charencode.c',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1144
                                   'mercurial/cext/dirs.c',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1145
                                   'mercurial/cext/manifest.c',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1146
                                   'mercurial/cext/parsers.c',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1147
                                   'mercurial/cext/pathencode.c',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1148
                                   'mercurial/cext/revlog.c'],
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1149
        'hgdirectffi',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1150
        'hg-direct-ffi',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1151
        include_dirs=common_include_dirs,
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1152
        depends=common_depends + ['mercurial/cext/charencode.h',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1153
                                  'mercurial/cext/revlog.h',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1154
                                  'rust/hg-core/src/ancestors.rs',
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1155
                                  'rust/hg-core/src/lib.rs']),
32406
a9c71d578a1c osutil: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
  1156
    Extension('mercurial.cext.osutil', ['mercurial/cext/osutil.c'],
32251
c48583859e04 policy: add "cext" package which will host CPython extension modules
Yuya Nishihara <yuya@tcha.org>
parents: 32178
diff changeset
  1157
              include_dirs=common_include_dirs,
30418
ce9a3033c118 setup: test setproctitle before building osutil
Jun Wu <quark@fb.com>
parents: 30356
diff changeset
  1158
              extra_compile_args=osutil_cflags,
25074
0021ad4c2309 setup: integrate osutil C extension into extmodules initialization
Adrian Buehlmann <adrian@cadifra.com>
parents: 25073
diff changeset
  1159
              extra_link_args=osutil_ldflags,
0021ad4c2309 setup: integrate osutil C extension into extmodules initialization
Adrian Buehlmann <adrian@cadifra.com>
parents: 25073
diff changeset
  1160
              depends=common_depends),
37182
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
  1161
    Extension(
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
  1162
        'mercurial.thirdparty.zope.interface._zope_interface_coptimizations', [
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
  1163
        'mercurial/thirdparty/zope/interface/_zope_interface_coptimizations.c',
922b3fae9c7d setup: register zope.interface packages and compile C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37133
diff changeset
  1164
        ]),
28432
2377c4ac4eec fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents: 28431
diff changeset
  1165
    Extension('hgext.fsmonitor.pywatchman.bser',
2377c4ac4eec fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents: 28431
diff changeset
  1166
              ['hgext/fsmonitor/pywatchman/bser.c']),
5396
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5197
diff changeset
  1167
    ]
5105b119edd2 Add osutil module, containing a listdir function.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5197
diff changeset
  1168
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1169
if hgrustext == 'cpython':
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1170
    extmodules.append(
40998
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1171
        RustStandaloneExtension('mercurial.rustext', 'hg-cpython', 'librusthg',
4277e20cfec4 rust-cpython: build and support for Python3
Georges Racinet <gracinet@anybox.fr>
parents: 40993
diff changeset
  1172
                                py3_features='python3')
40980
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1173
    )
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1174
462a26756f70 rust-cpython: build via HGWITHRUSTEXT=cpython
Georges Racinet <gracinet@anybox.fr>
parents: 40979
diff changeset
  1175
30445
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30418
diff changeset
  1176
sys.path.insert(0, 'contrib/python-zstandard')
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30418
diff changeset
  1177
import setup_zstd
40122
73fef626dae3 zstandard: vendor python-zstandard 0.10.1
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39987
diff changeset
  1178
extmodules.append(setup_zstd.get_c_extension(
73fef626dae3 zstandard: vendor python-zstandard 0.10.1
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39987
diff changeset
  1179
    name='mercurial.zstd',
73fef626dae3 zstandard: vendor python-zstandard 0.10.1
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39987
diff changeset
  1180
    root=os.path.abspath(os.path.dirname(__file__))))
30445
788ea4ac4388 setup: compile zstd C extension
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30418
diff changeset
  1181
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1182
try:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1183
    from distutils import cygwinccompiler
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1184
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1185
    # the -mno-cygwin option has been deprecated for years
33663
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1186
    mingw32compilerclass = cygwinccompiler.Mingw32CCompiler
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1187
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1188
    class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler):
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1189
        def __init__(self, *args, **kwargs):
33663
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1190
            mingw32compilerclass.__init__(self, *args, **kwargs)
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1191
            for i in 'compiler compiler_so linker_exe linker_so'.split():
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1192
                try:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1193
                    getattr(self, i).remove('-mno-cygwin')
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1194
                except ValueError:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1195
                    pass
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1196
23677
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1197
    cygwinccompiler.Mingw32CCompiler = HackedMingw32CCompiler
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1198
except ImportError:
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1199
    # the cygwinccompiler package is not available on some Python
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1200
    # distributions like the ones from the optware project for Synology
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1201
    # DiskStation boxes
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1202
    class HackedMingw32CCompiler(object):
6bc1702e7333 setup: don't fail when Python doesn't have the cygwinccompiler package
Ludovic Chabant <ludovic@chabant.com>
parents: 23647
diff changeset
  1203
        pass
17121
d13f47c800fd setup: disable -mno-cygwin if building under mingw32
Bryan O'Sullivan <bryano@fb.com>
parents: 17061
diff changeset
  1204
32802
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1205
if os.name == 'nt':
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1206
    # Allow compiler/linker flags to be added to Visual Studio builds.  Passing
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1207
    # extra_link_args to distutils.extensions.Extension() doesn't have any
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1208
    # effect.
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1209
    from distutils import msvccompiler
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1210
33663
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1211
    msvccompilerclass = msvccompiler.MSVCCompiler
32802
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1212
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1213
    class HackedMSVCCompiler(msvccompiler.MSVCCompiler):
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1214
        def initialize(self):
33663
7686cbb0ba41 setup: fix installing in a mingw environment
Mike Hommey <mh@glandium.org>
parents: 33600
diff changeset
  1215
            msvccompilerclass.initialize(self)
32802
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1216
            # "warning LNK4197: export 'func' specified multiple times"
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1217
            self.ldflags_shared.append('/ignore:4197')
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1218
            self.ldflags_shared_debug.append('/ignore:4197')
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1219
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1220
    msvccompiler.MSVCCompiler = HackedMSVCCompiler
9a4adc76c88a setup: avoid linker warnings on Windows about multiple export specifications
Matt Harbison <matt_harbison@yahoo.com>
parents: 32745
diff changeset
  1221
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1222
packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
22575
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22358
diff changeset
  1223
                             'help/*.txt',
27374
7a70ae647e54 setup.py: package internals help files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27348
diff changeset
  1224
                             'help/internals/*.txt',
23142
c4ce077588d0 config: introduce "built-in" default configuration settings in default.d
Mads Kiilerich <madski@unity3d.com>
parents: 22640
diff changeset
  1225
                             'default.d/*.rc',
22575
d7f7f1860f00 ssl: on OS X, use a dummy cert to trick Python/OpenSSL to use system CA certs
Mads Kiilerich <madski@unity3d.com>
parents: 22358
diff changeset
  1226
                             'dummycert.pem']}
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1227
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1228
def ordinarypath(p):
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1229
    return p and p[0] != '.' and p[-1] != '~'
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1230
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1231
for root in ('templates',):
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1232
    for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1233
        curdir = curdir.split(os.sep, 1)[1]
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1234
        dirs[:] = filter(ordinarypath, dirs)
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1235
        for f in filter(ordinarypath, files):
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1236
            f = os.path.join(curdir, f)
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1237
            packagedata['mercurial'].append(f)
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1238
7648
02e358a3a8a7 i18n: let Makefile generate i18n/hg.pot
Martin Geisler <mg@daimi.au.dk>
parents: 7647
diff changeset
  1239
datafiles = []
31325
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1240
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1241
# distutils expects version to be str/unicode. Converting it to
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1242
# unicode on Python 2 still works because it won't contain any
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1243
# non-ascii bytes and will be implicitly converted back to bytes
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1244
# when operated on.
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1245
assert isinstance(version, bytes)
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1246
setupversion = version.decode('ascii')
70bc35df3e54 setup: convert setupversion to unicode
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31317
diff changeset
  1247
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1248
extra = {}
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1249
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1250
py2exepackages = [
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1251
    'hgdemandimport',
41923
5d9fdc9b0178 setup: include hgext3rd package in py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41922
diff changeset
  1252
    'hgext3rd',
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1253
    'hgext',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1254
    'email',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1255
    # implicitly imported per module policy
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1256
    # (cffi wouldn't be used as a frozen exe)
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1257
    'mercurial.cext',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1258
    #'mercurial.cffi',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1259
    'mercurial.pure',
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1260
]
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1261
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1262
py2exeexcludes = []
41959
e5ac701e5b7c setup: exclude crypt32.dll in py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41958
diff changeset
  1263
py2exedllexcludes = ['crypt32.dll']
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1264
33600
47829b89c8c6 setup: silence warning of unknown option python_requires on distutils
Yuya Nishihara <yuya@tcha.org>
parents: 33599
diff changeset
  1265
if issetuptools:
47829b89c8c6 setup: silence warning of unknown option python_requires on distutils
Yuya Nishihara <yuya@tcha.org>
parents: 33599
diff changeset
  1266
    extra['python_requires'] = supportedpy
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1267
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1268
if py2exeloaded:
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1269
    extra['console'] = [
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1270
        {'script':'hg',
41313
8427fea04017 copyright: update to 2019
Anton Shestakov <av6@dwimlabs.net>
parents: 41161
diff changeset
  1271
         'copyright':'Copyright (C) 2005-2019 Matt Mackall and others',
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1272
         'product_version':version}]
41922
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41921
diff changeset
  1273
    # Sub command of 'build' because 'py2exe' does not handle sub_commands.
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41921
diff changeset
  1274
    # Need to override hgbuild because it has a private copy of
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41921
diff changeset
  1275
    # build.sub_commands.
ac32e04e887f setup: properly install build_hgextindex for py2exe builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41921
diff changeset
  1276
    hgbuild.sub_commands.insert(0, ('build_hgextindex', None))
25409
95e042d77a5f wix: move library.zip and all *.pyd into a lib/ folder
Steve Borho <steve@borho.org>
parents: 25089
diff changeset
  1277
    # put dlls in sub directory so that they won't pollute PATH
95e042d77a5f wix: move library.zip and all *.pyd into a lib/ folder
Steve Borho <steve@borho.org>
parents: 25089
diff changeset
  1278
    extra['zipfile'] = 'lib/library.zip'
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1279
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1280
    # We allow some configuration to be supplemented via environment
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1281
    # variables. This is better than setup.cfg files because it allows
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1282
    # supplementing configs instead of replacing them.
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1283
    extrapackages = os.environ.get('HG_PY2EXE_EXTRA_PACKAGES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1284
    if extrapackages:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1285
        py2exepackages.extend(extrapackages.split(' '))
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1286
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1287
    excludes = os.environ.get('HG_PY2EXE_EXTRA_EXCLUDES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1288
    if excludes:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1289
        py2exeexcludes.extend(excludes.split(' '))
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1290
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1291
    dllexcludes = os.environ.get('HG_PY2EXE_EXTRA_DLL_EXCLUDES')
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1292
    if dllexcludes:
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1293
        py2exedllexcludes.extend(dllexcludes.split(' '))
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1294
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1295
if os.name == 'nt':
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1296
    # Windows binary file versions for exe/dll files must have the
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1297
    # form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535
40383
a9e303dcd1e1 py3: stringify setupversion on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40273
diff changeset
  1298
    setupversion = setupversion.split(r'+', 1)[0]
7648
02e358a3a8a7 i18n: let Makefile generate i18n/hg.pot
Martin Geisler <mg@daimi.au.dk>
parents: 7647
diff changeset
  1299
13583
e42d18538e1d fix compiling of extensions for OS X and XCode 4.0
Alexander Solovyov <alexander@solovyov.net>
parents: 13400
diff changeset
  1300
if sys.platform == 'darwin' and os.path.exists('/usr/bin/xcodebuild'):
33131
176030f695ca setup: fix runcmd() usage on darwin
Adam Simpkins <simpkins@fb.com>
parents: 33129
diff changeset
  1301
    version = runcmd(['/usr/bin/xcodebuild', '-version'], {})[1].splitlines()
16187
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1302
    if version:
16209
5536770b3c88 setup.py: don't call splitlines twice on the output of xcodebuild (issue3277)
Brendan Cully <brendan@kublai.com>
parents: 16187
diff changeset
  1303
        version = version[0]
25043
facaceeb85ac setup: decode xcode version number on python3
Augie Fackler <augie@google.com>
parents: 25009
diff changeset
  1304
        if sys.version_info[0] == 3:
facaceeb85ac setup: decode xcode version number on python3
Augie Fackler <augie@google.com>
parents: 25009
diff changeset
  1305
            version = version.decode('utf-8')
16187
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1306
        xcode4 = (version.startswith('Xcode') and
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1307
                  StrictVersion(version.split()[1]) >= StrictVersion('4.0'))
21558
8b482d49563b setup: make Xcode 5.1 check less specific
Matt Mackall <mpm@selenic.com>
parents: 21229
diff changeset
  1308
        xcode51 = re.match(r'^Xcode\s+5\.1', version) is not None
16187
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1309
    else:
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1310
        # xcodebuild returns empty on OS X Lion with XCode 4.3 not
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1311
        # installed, but instead with only command-line tools. Assume
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1312
        # that only happens on >= Lion, thus no PPC support.
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1313
        xcode4 = True
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1314
        xcode51 = False
16187
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1315
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1316
    # XCode 4.0 dropped support for ppc architecture, which is hardcoded in
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1317
    # distutils.sysconfig
16187
82ce91a9fd94 setup: handle output from Apple's Xcode 4.3 better (issue3277)
Greg Ward <greg@gerg.ca>
parents: 15527
diff changeset
  1318
    if xcode4:
14324
d3a49a52f117 Hardcoding ARCHFLAGS breaks the build against fink's python
Brendan Cully <brendan@kublai.com>
parents: 14295
diff changeset
  1319
        os.environ['ARCHFLAGS'] = ''
13583
e42d18538e1d fix compiling of extensions for OS X and XCode 4.0
Alexander Solovyov <alexander@solovyov.net>
parents: 13400
diff changeset
  1320
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1321
    # XCode 5.1 changes clang such that it now fails to compile if the
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1322
    # -mno-fused-madd flag is passed, but the version of Python shipped with
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1323
    # OS X 10.9 Mavericks includes this flag. This causes problems in all
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1324
    # C extension modules, and a bug has been filed upstream at
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1325
    # http://bugs.python.org/issue21244. We also need to patch this here
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1326
    # so Mercurial can continue to compile in the meantime.
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1327
    if xcode51:
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1328
        cflags = get_config_var('CFLAGS')
21839
f266be73f764 setup: fixed for Pythons which don't have a CFLAGS
Alex Gaynor <alex.gaynor@gmail.com>
parents: 21229
diff changeset
  1329
        if cflags and re.search(r'-mno-fused-madd\b', cflags) is not None:
21038
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1330
            os.environ['CFLAGS'] = (
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1331
                os.environ.get('CFLAGS', '') + ' -Qunused-arguments')
440fbe52b4a8 setup.py: fix C extension compilation issue with OS X 10.9 and Xcode 5.1
Kent Frazier <kentfrazier@gmail.com>
parents: 20697
diff changeset
  1332
1977
7eb694a1c1af Don't forget version at the end of setup.py, write it only if changed.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1873
diff changeset
  1333
setup(name='mercurial',
10400
fb203201ce30 setup.py: fixing version info for Windows hg.exe (py2exe)
Adrian Buehlmann <adrian@cadifra.com>
parents: 10282
diff changeset
  1334
      version=setupversion,
18753
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1335
      author='Matt Mackall and many others',
30866
561a019c0268 misc: replace domain of mercurial ML address by mercurial-scm.org
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 30698
diff changeset
  1336
      author_email='mercurial@mercurial-scm.org',
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 25409
diff changeset
  1337
      url='https://mercurial-scm.org/',
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 25409
diff changeset
  1338
      download_url='https://mercurial-scm.org/release/',
18753
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1339
      description=('Fast scalable distributed SCM (revision control, version '
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1340
                   'control) system'),
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1341
      long_description=('Mercurial is a distributed SCM tool written in Python.'
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1342
                        ' It is used by a number of large projects that require'
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1343
                        ' fast, reliable distributed revision control, such as '
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1344
                        'Mozilla.'),
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1345
      license='GNU GPLv2 or any later version',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1346
      classifiers=[
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1347
          'Development Status :: 6 - Mature',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1348
          'Environment :: Console',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1349
          'Intended Audience :: Developers',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1350
          'Intended Audience :: System Administrators',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1351
          'License :: OSI Approved :: GNU General Public License (GPL)',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1352
          'Natural Language :: Danish',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1353
          'Natural Language :: English',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1354
          'Natural Language :: German',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1355
          'Natural Language :: Italian',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1356
          'Natural Language :: Japanese',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1357
          'Natural Language :: Portuguese (Brazilian)',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1358
          'Operating System :: Microsoft :: Windows',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1359
          'Operating System :: OS Independent',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1360
          'Operating System :: POSIX',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1361
          'Programming Language :: C',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1362
          'Programming Language :: Python',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1363
          'Topic :: Software Development :: Version Control',
3f59cb1ccc73 setup.py: add metadata to register package to PyPI
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 17926
diff changeset
  1364
      ],
6513
66e87c11447d Add a batch file driver for Windows
Paul Moore <p.f.moore@gmail.com>
parents: 6389
diff changeset
  1365
      scripts=scripts,
6239
39cfcef4f463 Add inotify extension
Bryan O'Sullivan <bos@serpentine.com>
parents: 6009
diff changeset
  1366
      packages=packages,
10000
16f49d671c7f setup: cleanup coding style
Martin Geisler <mg@lazybytes.net>
parents: 9999
diff changeset
  1367
      ext_modules=extmodules,
7648
02e358a3a8a7 i18n: let Makefile generate i18n/hg.pot
Martin Geisler <mg@daimi.au.dk>
parents: 7647
diff changeset
  1368
      data_files=datafiles,
9999
f91e5630ce7e setup: install translation files as package data
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 9998
diff changeset
  1369
      package_data=packagedata,
3238
3dba9ec89164 Applied coding style to setup.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2402
diff changeset
  1370
      cmdclass=cmdclass,
15458
c3a6ec304055 setup: subclass distribution instead of overwriting original
Simon Heimberg <simohe@besonet.ch>
parents: 15388
diff changeset
  1371
      distclass=hgdist,
38044
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1372
      options={
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1373
          'py2exe': {
41958
d6e3c16d48ab packaging: don't bundle DLLs in py2exe library.zip for x86 builds
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41923
diff changeset
  1374
              'bundle_files': 3,
41921
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1375
              'dll_excludes': py2exedllexcludes,
260305e8ddbd setup: configure py2exe config via environment variables
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41859
diff changeset
  1376
              'excludes': py2exeexcludes,
41856
ed35057421ae setup: include additional packages in py2exe distribution
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41855
diff changeset
  1377
              'packages': py2exepackages,
38044
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1378
          },
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1379
          'bdist_mpkg': {
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1380
              'zipdist': False,
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1381
              'license': 'COPYING',
38054
e5d2248dcc39 packaging: move contrib/macosx to contrib/packaging/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38044
diff changeset
  1382
              'readme': 'contrib/packaging/macosx/Readme.html',
e5d2248dcc39 packaging: move contrib/macosx to contrib/packaging/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38044
diff changeset
  1383
              'welcome': 'contrib/packaging/macosx/Welcome.html',
38044
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1384
          },
cd4959c33d1a setup: reformat options argument
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37627
diff changeset
  1385
      },
3893
070628929e1f Fix setup.py warning
Matt Mackall <mpm@selenic.com>
parents: 3892
diff changeset
  1386
      **extra)