diff --git a/rust/hg-cpython/src/lib.rs b/rust/hg-cpython/src/lib.rs --- a/rust/hg-cpython/src/lib.rs +++ b/rust/hg-cpython/src/lib.rs @@ -23,7 +23,6 @@ extern crate cpython; extern crate hg; extern crate libc; -extern crate python27_sys; pub mod ancestors; mod cindex; diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -32,6 +32,7 @@ ]) import sys, platform +import sysconfig if sys.version_info[0] >= 3: printf = eval('print') libdir_escape = 'unicode_escape' @@ -104,6 +105,12 @@ printf(error, file=sys.stderr) sys.exit(1) +if sys.version_info[0] >= 3: + DYLIB_SUFFIX = sysconfig.get_config_vars()['EXT_SUFFIX'] +else: + # deprecated in Python 3 + DYLIB_SUFFIX = sysconfig.get_config_vars()['SO'] + # Solaris Python packaging brain damage try: import hashlib @@ -1147,6 +1154,19 @@ for fname in fnames if os.path.splitext(fname)[1] == '.rs') + @staticmethod + def rust_dylib_suffix(): + """Return the suffix for shared libraries produced by rustc. + + See also: https://doc.rust-lang.org/reference/linkage.html + """ + if sys.platform == 'darwin': + return '.dylib' + elif os.name == 'nt': + return '.dll' + else: + return '.so' + def rustbuild(self): if hgrustext is None: return @@ -1168,6 +1188,9 @@ if sys.version_info[0] == 3 and self.py3_features is not None: cargocmd.extend(('--features', self.py3_features, '--no-default-features')) + if sys.platform == 'darwin': + env['RUSTFLAGS'] = ("-C link-arg=-undefined " + "-C link-arg=dynamic_lookup") try: subprocess.check_call(cargocmd, env=env, cwd=self.rustsrcdir) except OSError as exc: @@ -1212,9 +1235,9 @@ self.rustbuild() target = [target_dir] target.extend(self.name.split('.')) - ext = '.so' # TODO Unix only - target[-1] += ext - shutil.copy2(os.path.join(self.rusttargetdir, self.dylibname + ext), + target[-1] += DYLIB_SUFFIX + shutil.copy2(os.path.join(self.rusttargetdir, + self.dylibname + self.rust_dylib_suffix()), os.path.join(*target))