2019-04-24 14:34:41 +00:00
|
|
|
import os
|
2018-04-03 13:33:05 +00:00
|
|
|
import sys
|
2019-04-23 11:18:42 +00:00
|
|
|
import platform
|
2018-04-03 13:33:05 +00:00
|
|
|
|
|
|
|
from setuptools import setup
|
|
|
|
from setuptools.command.test import test as TestCommand
|
2019-04-24 14:34:41 +00:00
|
|
|
from setuptools.command.sdist import sdist as SdistCommand
|
2018-08-08 13:31:41 +00:00
|
|
|
from setuptools_rust import RustExtension
|
2018-04-03 13:33:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
class PyTest(TestCommand):
|
|
|
|
user_options = []
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.run_command("test_rust")
|
|
|
|
|
|
|
|
import subprocess
|
2018-11-11 11:25:53 +00:00
|
|
|
|
|
|
|
errno = subprocess.call(["pytest", "tests"])
|
2018-04-03 13:33:05 +00:00
|
|
|
raise SystemExit(errno)
|
|
|
|
|
|
|
|
|
2019-04-24 14:34:41 +00:00
|
|
|
class CargoModifiedSdist(SdistCommand):
|
|
|
|
"""Modifies Cargo.toml to use an absolute rather than a relative path
|
|
|
|
|
|
|
|
The current implementation of PEP 517 in pip always does builds in an
|
|
|
|
isolated temporary directory. This causes problems with the build, because
|
|
|
|
Cargo.toml necessarily refers to the current version of pyo3 by a relative
|
|
|
|
path.
|
|
|
|
|
|
|
|
Since these sdists are never meant to be used for anything other than
|
|
|
|
tox / pip installs, at sdist build time, we will modify the Cargo.toml
|
|
|
|
in the sdist archive to include an *absolute* path to pyo3.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def make_release_tree(self, base_dir, files):
|
|
|
|
"""Stages the files to be included in archives"""
|
|
|
|
super().make_release_tree(base_dir, files)
|
|
|
|
|
|
|
|
import toml
|
2019-09-05 11:13:06 +00:00
|
|
|
|
2019-04-24 14:34:41 +00:00
|
|
|
# Cargo.toml is now staged and ready to be modified
|
2019-09-05 11:13:06 +00:00
|
|
|
cargo_loc = os.path.join(base_dir, "Cargo.toml")
|
2019-04-24 14:34:41 +00:00
|
|
|
assert os.path.exists(cargo_loc)
|
|
|
|
|
2019-09-05 11:13:06 +00:00
|
|
|
with open(cargo_loc, "r") as f:
|
2019-04-24 14:34:41 +00:00
|
|
|
cargo_toml = toml.load(f)
|
|
|
|
|
2019-09-05 11:13:06 +00:00
|
|
|
rel_pyo3_path = cargo_toml["dependencies"]["pyo3"]["path"]
|
2019-04-24 14:34:41 +00:00
|
|
|
base_path = os.path.dirname(__file__)
|
|
|
|
abs_pyo3_path = os.path.abspath(os.path.join(base_path, rel_pyo3_path))
|
|
|
|
|
2019-09-05 11:13:06 +00:00
|
|
|
cargo_toml["dependencies"]["pyo3"]["path"] = abs_pyo3_path
|
2019-04-24 14:34:41 +00:00
|
|
|
|
2019-09-05 11:13:06 +00:00
|
|
|
with open(cargo_loc, "w") as f:
|
2019-04-24 14:34:41 +00:00
|
|
|
toml.dump(cargo_toml, f)
|
|
|
|
|
|
|
|
|
2018-08-08 13:31:41 +00:00
|
|
|
def get_py_version_cfgs():
|
|
|
|
# For now each Cfg Py_3_X flag is interpreted as "at least 3.X"
|
|
|
|
version = sys.version_info[0:2]
|
|
|
|
py3_min = 5
|
|
|
|
out_cfg = []
|
2018-11-11 11:24:24 +00:00
|
|
|
for minor in range(py3_min, version[1] + 1):
|
2018-11-11 11:25:53 +00:00
|
|
|
out_cfg.append("--cfg=Py_3_%d" % minor)
|
2018-08-08 13:31:41 +00:00
|
|
|
|
2019-04-23 11:18:42 +00:00
|
|
|
if platform.python_implementation() == "PyPy":
|
|
|
|
out_cfg.append("--cfg=PyPy")
|
|
|
|
|
2018-08-08 13:31:41 +00:00
|
|
|
return out_cfg
|
|
|
|
|
2018-11-11 11:24:24 +00:00
|
|
|
|
2019-09-05 11:13:06 +00:00
|
|
|
def make_rust_extension(module_name):
|
|
|
|
return RustExtension(
|
|
|
|
module_name, "Cargo.toml", rustc_flags=get_py_version_cfgs(), debug=True
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-04-03 13:33:05 +00:00
|
|
|
install_requires = []
|
2018-11-11 11:25:53 +00:00
|
|
|
tests_require = install_requires + ["pytest", "pytest-benchmark"]
|
2018-04-03 13:33:05 +00:00
|
|
|
|
|
|
|
setup(
|
2018-11-11 11:25:53 +00:00
|
|
|
name="rustapi-module",
|
|
|
|
version="0.1.0",
|
2018-04-03 13:33:05 +00:00
|
|
|
classifiers=[
|
2018-11-11 11:25:53 +00:00
|
|
|
"License :: OSI Approved :: MIT License",
|
|
|
|
"Development Status :: 3 - Alpha",
|
|
|
|
"Intended Audience :: Developers",
|
|
|
|
"Programming Language :: Python",
|
|
|
|
"Programming Language :: Rust",
|
|
|
|
"Operating System :: POSIX",
|
|
|
|
"Operating System :: MacOS :: MacOS X",
|
|
|
|
],
|
|
|
|
packages=["rustapi_module"],
|
|
|
|
rust_extensions=[
|
2019-09-05 11:13:06 +00:00
|
|
|
make_rust_extension("rustapi_module.othermod"),
|
|
|
|
make_rust_extension("rustapi_module.datetime"),
|
|
|
|
make_rust_extension("rustapi_module.subclassing"),
|
|
|
|
make_rust_extension("rustapi_module.test_dict"),
|
2018-04-03 13:33:05 +00:00
|
|
|
],
|
|
|
|
install_requires=install_requires,
|
|
|
|
tests_require=tests_require,
|
|
|
|
include_package_data=True,
|
|
|
|
zip_safe=False,
|
2019-09-05 11:13:06 +00:00
|
|
|
cmdclass={"test": PyTest, "sdist": CargoModifiedSdist},
|
2018-04-03 13:33:05 +00:00
|
|
|
)
|