#pyo3 #python #cpython #built

pyo3-built

Expose build variables obtained with built as a PyDict

11 releases

Uses old Rust 2015

0.4.7 May 2, 2022
0.4.6 Aug 19, 2021
0.4.5 Feb 19, 2021
0.4.4 Sep 26, 2020
0.2.0 May 28, 2019

#53 in FFI

Download history 2221/week @ 2023-02-04 2755/week @ 2023-02-11 2652/week @ 2023-02-18 2960/week @ 2023-02-25 2857/week @ 2023-03-04 3008/week @ 2023-03-11 2811/week @ 2023-03-18 2387/week @ 2023-03-25 2607/week @ 2023-04-01 2506/week @ 2023-04-08 2308/week @ 2023-04-15 1908/week @ 2023-04-22 2340/week @ 2023-04-29 1865/week @ 2023-05-06 1751/week @ 2023-05-13 1741/week @ 2023-05-20

7,997 downloads per month
Used in nanoset-py

Apache-2.0

9KB
90 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 = { version = "0.4", features = ["chrono"] }
[dependencies]
pyo3-built = "0.4"

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, std::path::Path::new(&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"
   }
}

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 (they mirror built categories):

  • "build"
  • "time"
  • "deps"
  • "features"
  • "host"
  • "target"
  • "git"

The corresponding options must be enabled in the built crate and the build.rs for this to work. By default everything except "git" is enabled.

No runtime deps