Awesome
pyo3-built
Simple macro to expose metadata obtained with the built
crate as a PyDict
Usage
Add the following to your Cargo.toml
manifest:
[build-dependencies]
built = { version = "0.7", features = ["chrono"] }
[dependencies]
pyo3-built = "0.5"
Create your build.rs
as you normally would with built
, but activate
dependencies metadata as well:
//! build.rs
extern crate built;
fn main() {
built::write_built_file().expect("Failed to acquire build-time information");
}
Then, include the generated file anywhere in a dedicated module in your Python
extension, and use the pyo3_built!
macro to generate the PyDict
:
//! lib.rs
#[macro_use]
extern crate pyo3_built;
extern crate pyo3;
use pyo3::prelude::*;
#[allow(dead_code)]
mod build {
include!(concat!(env!("OUT_DIR"), "/built.rs"));
}
/// Module documentation string
#[modinit("mymodule")]
fn init(py: Python, m: &PyModule) -> PyResult<()> {
// ... //
m.add("__build__", pyo3_built!(py, build))?;
Ok(())
}
That's it ! After compiling your extension module, the __build__
attribute
will contain the following metadata:
>>> import mymodule
>>> mymodule.__build__
{
"build-time": datetime.datetime(2018, 5, 11, 16, 43, 28),
"debug": true,
"dependencies": {
...
"pyo3": "0.6.0",
"pyo3-built": "0.1.0",
"pyo3cls": "0.6.0",
...
},
"features": [
"PYO3"
],
"host": {
"triple": "x86_64-unknown-linux-gnu"
},
"opt-level": "0",
"rustc": "rustc",
"rustc-version": "rustc 1.27.0-nightly (acd3871ba 2018-05-10)",
"target": {
"arch": "x86_64",
"endianness": "little",
"env": "gnu",
"family": "unix",
"os": "linux",
"pointer-width": "64",
"profile": "debug",
"triple": "x86_64-unknown-linux-gnu"
}
}
Customization
When invoking the macro, one can control what will be added to the build dictionary by postfixing the list of the parameters we want in the dictionary. See the following example:
m.add("__build__", pyo3_built!(py, build, "time", "git", "target"))?;
The following parameters are available, mirroring built categories:
"build"
"time"
(requires thechrono
feature ofbuilt
)"deps"
"features"
(requires thecargo-lock
feature ofbuilt
)"host"
"target"
"git"
(requires thegit2
feature ofbuilt
)
By default everything except "git"
is enabled.