#pyo3 #python #cpython #built

pyo3-built

Expose build variables obtained with built as a PyDict

3 releases (breaking)

0.3.0 Sep 9, 2019
0.2.0 May 28, 2019
0.1.0 Apr 29, 2019

#34 in FFI

Download history 46/week @ 2019-05-27 14/week @ 2019-06-03 9/week @ 2019-06-10 5/week @ 2019-06-17 12/week @ 2019-06-24 8/week @ 2019-07-01 7/week @ 2019-07-08 35/week @ 2019-07-29 47/week @ 2019-08-05 1/week @ 2019-08-19 114/week @ 2019-08-26 96/week @ 2019-09-02

117 downloads per month
Used in 1 crate

Apache-2.0

10KB
103 lines

pyo3-built

Simple macro to expose metadata obtained with the built crate as a PyDict

TravisCI License Source Crate GitHub issues

Usage

Add the following to your Cargo.toml manifest:

[build-dependencies]
built = "^0.3"
[dependencies]
pyo3-built = "^0.1"

Create your build.rs as you normally would with built, but activate dependencies metadata as well:

//! build.rs
extern crate built;

fn main() {
    let src = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let dst = std::path::Path::new(&std::env::var("OUT_DIR").unwrap()).join("built.rs");
    let mut opts = built::Options::default();
    opts.set_dependencies(true)
        .set_compiler(true)
        .set_env(true);
    built::write_built_file_with_opts(&opts, src, dst)
        .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"
   }
}

Dependencies

~3MB
~64K SLoC