changeset 40985:4277e20cfec4

rust-cpython: build and support for Python3 Defined Cargo features for Python3, making them overall simpler to use, hooked them in build and made mercurial.rustext importable. This is tested with Python 3.6.7. Differential Revision: https://phab.mercurial-scm.org/D5446
author Georges Racinet <gracinet@anybox.fr>
date Mon, 17 Dec 2018 15:05:52 +0100
parents 6a372f943e49
children e10adebf8176
files mercurial/__init__.py rust/Cargo.lock rust/hg-cpython/Cargo.toml setup.py
diffstat 4 files changed, 20 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/__init__.py	Tue Dec 18 00:54:32 2018 -0500
+++ b/mercurial/__init__.py	Mon Dec 17 15:05:52 2018 +0100
@@ -40,6 +40,10 @@
             # zstd is already dual-version clean, don't try and mangle it
             if fullname.startswith('mercurial.zstd'):
                 return None
+            # rustext is built for the right python version,
+            # don't try and mangle it
+            if fullname.startswith('mercurial.rustext'):
+                return None
             # pywatchman is already dual-version clean, don't try and mangle it
             if fullname.startswith('hgext.fsmonitor.pywatchman'):
                 return None
--- a/rust/Cargo.lock	Tue Dec 18 00:54:32 2018 -0500
+++ b/rust/Cargo.lock	Mon Dec 17 15:05:52 2018 +0100
@@ -19,6 +19,7 @@
  "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "python27-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "python3-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
--- a/rust/hg-cpython/Cargo.toml	Tue Dec 18 00:54:32 2018 -0500
+++ b/rust/hg-cpython/Cargo.toml	Mon Dec 17 15:05:52 2018 +0100
@@ -8,9 +8,14 @@
 crate-type = ["cdylib"]
 
 [features]
-default = ["python27", "python27-sys"]
+default = ["python27"]
 
-python27 = ["cpython/python27-sys", "cpython/extension-module-2-7"]
+python27 = ["cpython/python27-sys",
+            "cpython/extension-module-2-7",
+            "python27-sys",
+            ]
+
+python3 = ["python3-sys", "cpython/python3-sys", "cpython/extension-module"]
 
 [dependencies]
 hg-core = { path = "../hg-core" }
--- a/setup.py	Tue Dec 18 00:54:32 2018 -0500
+++ b/setup.py	Mon Dec 17 15:05:52 2018 +0100
@@ -922,11 +922,13 @@
 
     rusttargetdir = os.path.join('rust', 'target', 'release')
 
-    def __init__(self, mpath, sources, rustlibname, subcrate, **kw):
+    def __init__(self, mpath, sources, rustlibname, subcrate,
+                 py3_features=None, **kw):
         Extension.__init__(self, mpath, sources, **kw)
         if hgrustext is None:
             return
         srcdir = self.rustsrcdir = os.path.join('rust', subcrate)
+        self.py3_features = py3_features
 
         # adding Rust source and control files to depends so that the extension
         # gets rebuilt if they've changed
@@ -957,6 +959,9 @@
             env['HOME'] = pwd.getpwuid(os.getuid()).pw_dir
 
         cargocmd = ['cargo', 'build', '-vv', '--release']
+        if sys.version_info[0] == 3 and self.py3_features is not None:
+            cargocmd.extend(('--features', self.py3_features,
+                             '--no-default-features'))
         try:
             subprocess.check_call(cargocmd, env=env, cwd=self.rustsrcdir)
         except OSError as exc:
@@ -1047,7 +1052,8 @@
 
 if hgrustext == 'cpython':
     extmodules.append(
-        RustStandaloneExtension('mercurial.rustext', 'hg-cpython', 'librusthg')
+        RustStandaloneExtension('mercurial.rustext', 'hg-cpython', 'librusthg',
+                                py3_features='python3')
     )