Install rust into a temporary directory for boostrapping a rust-based build backend
Project description
puccinialin
Install rust into a temporary directory to support rust-based builds.
Cargo and rustc are installed into a cache directory, to avoid modifying the host's environment, and activated using a set of environment variables.
The difficulty is mapping one of the various sources python platform information (sys, platform, sysconfig, etc.)
to a rustc target triple (https://doc.rust-lang.org/nightly/rustc/platform-support.html). This project mainly uses
SOABI for detection, but can be extended to use other APIs for other platforms. By using rustup, it is currently
limited to the platforms listed under https://rust-lang.github.io/rustup/installation/other.html#manual-installation.
SOABI, which contains the file extensions of native modules.
Contributing
The platform specific logic is in src/puccinialin/_target.py, specifically get_triple.
Usage: Python
There is a single setup_rust function that takes the installation directory, or uses the user cache directory by
default. It returns a dict of environment variables to be used when calling rust.
import os
from subprocess import check_call
from puccinialin import setup_rust
extra_env = setup_rust("path/to/installation/dir")
check_call(["cargo", "build"], env={**os.environ, **extra_env})
With setuptools-rust:
import os
import shutil
from setuptools import setup
from setuptools_rust import RustBin
if not shutil.which("cargo"):
from puccinialin import setup_rust
print("Rust not found, installing into a temporary directory")
extra_env = setup_rust()
env = {**os.environ, **extra_env}
else:
env = None
setup(
...,
rust_extensions=[RustBin(..., env=env)],
)
You can use it as custom build backend to avoid the dependency when not needed, as e.g. in maturin:
"""Support installing rust before compiling maturin.
Installing a package that uses maturin as build backend on a platform without maturin
binaries, we install rust in a cache directory if the user doesn't have a rust
installation already. Since this bootstrapping requires more dependencies but is only
required if rust is missing, we check if cargo is present before requesting those
dependencies.
https://setuptools.pypa.io/en/stable/build_meta.html#dynamic-build-dependencies-and-other-build-meta-tweaks
"""
from __future__ import annotations
import os
import shutil
from typing import Any
# noinspection PyUnresolvedReferences
from setuptools.build_meta import *
def get_requires_for_build_wheel(_config_settings: dict[str, Any] = None) -> list[str]:
if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"):
return ["puccinialin"]
return []
def get_requires_for_build_sdist(_config_settings: dict[str, Any] = None) -> list[str]:
if not os.environ.get("MATURIN_NO_INSTALL_RUST") and not shutil.which("cargo"):
return ["puccinialin"]
return []
Usage: CLI
$ python -m puccinialin --help
usage: __main__.py [-h] [--location LOCATION] [--program PROGRAM] [--info-json INFO_JSON]
options:
-h, --help show this help message and exit
--location LOCATION The directory for installing rust to
--program PROGRAM The name of the installation directory in the cache, if `--location` was not used. Defaults to 'puccinialin'.
--info-json INFO_JSON
Write the new environment variables as JSON to this file
Implementation
Setting up rust consists of 4 steps:
- Determine the platform in terms of a rust target triple
- Download
rustup-initfor this target triple - Use rustup to install rust and cargo for this target
- Report the environment variables to use this rust installation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file puccinialin-0.1.8.tar.gz.
File metadata
- Download URL: puccinialin-0.1.8.tar.gz
- Upload date:
- Size: 11.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e19f6316967ae100bf3fb92d8af95e3cec11ce0de58acd2f1a0bca835403a394
|
|
| MD5 |
d944f8ee2d5b8ae0f333bb314b68b60c
|
|
| BLAKE2b-256 |
347d88810c578a1526a8a73ac07bf33fb65d68f9b9c82c37950d09159f4d1916
|
File details
Details for the file puccinialin-0.1.8-py3-none-any.whl.
File metadata
- Download URL: puccinialin-0.1.8-py3-none-any.whl
- Upload date:
- Size: 12.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d13b1778d1b776a12c4ea9dfba602e12fa8a460f59fb7ded16da430afd5cb057
|
|
| MD5 |
263f84729827e1b6d72b45c36ce0fd41
|
|
| BLAKE2b-256 |
32e6635483382afcbf6f25cbda0c03c69d1a294a19dc17ad993773adab1ef1f2
|