-
Notifications
You must be signed in to change notification settings - Fork 804
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
6b95118
commit 1eafc05
Showing
86 changed files
with
1,528 additions
and
1,316 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
[package] | ||
name = "pyo3-ffi" | ||
version = "0.15.1" | ||
description = "Python-API bindings for the PyO3 ecosystem" | ||
authors = ["PyO3 Project and Contributors <https://github.com/PyO3>"] | ||
keywords = ["pyo3", "python", "cpython", "ffi"] | ||
homepage = "https://github.com/pyo3/pyo3" | ||
repository = "https://github.com/pyo3/pyo3" | ||
categories = ["api-bindings", "development-tools::ffi"] | ||
license = "Apache-2.0" | ||
edition = "2018" | ||
|
||
[dependencies] | ||
libc = "0.2.62" | ||
|
||
[features] | ||
|
||
default = [] | ||
|
||
# Use this feature when building an extension module. | ||
# It tells the linker to keep the python symbols unresolved, | ||
# so that the module can also be used with statically linked python interpreters. | ||
extension-module = [] | ||
|
||
# Use the Python limited API. See https://www.python.org/dev/peps/pep-0384/ for more. | ||
abi3 = ["pyo3-build-config/abi3"] | ||
|
||
# With abi3, we can manually set the minimum Python version. | ||
abi3-py37 = ["abi3-py38", "pyo3-build-config/abi3-py37"] | ||
abi3-py38 = ["abi3-py39", "pyo3-build-config/abi3-py38"] | ||
abi3-py39 = ["abi3-py310", "pyo3-build-config/abi3-py39"] | ||
abi3-py310 = ["abi3", "pyo3-build-config/abi3-py310"] | ||
|
||
|
||
|
||
[build-dependencies] | ||
pyo3-build-config = { path = "../pyo3-build-config", version = "0.15.1", features = ["resolve-config"] } | ||
|
||
|
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
use std::env; | ||
|
||
use pyo3_build_config::{ | ||
bail, ensure, | ||
pyo3_build_script_impl::{ | ||
cargo_env_var, env_var, errors::Result, resolve_interpreter_config, InterpreterConfig, | ||
PythonVersion, | ||
}, | ||
}; | ||
|
||
/// Minimum Python version PyO3 supports. | ||
const MINIMUM_SUPPORTED_VERSION: PythonVersion = PythonVersion { major: 3, minor: 6 }; | ||
|
||
fn ensure_python_version(interpreter_config: &InterpreterConfig) -> Result<()> { | ||
ensure!( | ||
interpreter_config.version >= MINIMUM_SUPPORTED_VERSION, | ||
"the configured Python interpreter version ({}) is lower than PyO3's minimum supported version ({})", | ||
interpreter_config.version, | ||
MINIMUM_SUPPORTED_VERSION, | ||
); | ||
|
||
Ok(()) | ||
} | ||
|
||
fn ensure_target_pointer_width(interpreter_config: &InterpreterConfig) -> Result<()> { | ||
if let Some(pointer_width) = interpreter_config.pointer_width { | ||
// Try to check whether the target architecture matches the python library | ||
let rust_target = match cargo_env_var("CARGO_CFG_TARGET_POINTER_WIDTH") | ||
.unwrap() | ||
.as_str() | ||
{ | ||
"64" => 64, | ||
"32" => 32, | ||
x => bail!("unexpected Rust target pointer width: {}", x), | ||
}; | ||
|
||
ensure!( | ||
rust_target == pointer_width, | ||
"your Rust target architecture ({}-bit) does not match your python interpreter ({}-bit)", | ||
rust_target, | ||
pointer_width | ||
); | ||
} | ||
Ok(()) | ||
} | ||
|
||
fn ensure_auto_initialize_ok(interpreter_config: &InterpreterConfig) -> Result<()> { | ||
if cargo_env_var("CARGO_FEATURE_AUTO_INITIALIZE").is_some() { | ||
if !interpreter_config.shared { | ||
bail!( | ||
"The `auto-initialize` feature is enabled, but your python installation only supports \ | ||
embedding the Python interpreter statically. If you are attempting to run tests, or a \ | ||
binary which is okay to link dynamically, install a Python distribution which ships \ | ||
with the Python shared library.\n\ | ||
\n\ | ||
Embedding the Python interpreter statically does not yet have first-class support in \ | ||
PyO3. If you are sure you intend to do this, disable the `auto-initialize` feature.\n\ | ||
\n\ | ||
For more information, see \ | ||
https://pyo3.rs/v{pyo3_version}/\ | ||
building_and_distribution.html#embedding-python-in-rust", | ||
pyo3_version = env::var("CARGO_PKG_VERSION").unwrap() | ||
); | ||
} | ||
|
||
// TODO: PYO3_CI env is a hack to workaround CI with PyPy, where the `dev-dependencies` | ||
// currently cause `auto-initialize` to be enabled in CI. | ||
// Once MSRV is 1.51 or higher, use cargo's `resolver = "2"` instead. | ||
if interpreter_config.implementation.is_pypy() && env::var_os("PYO3_CI").is_none() { | ||
bail!("the `auto-initialize` feature is not supported with PyPy"); | ||
} | ||
} | ||
Ok(()) | ||
} | ||
|
||
fn emit_link_config(interpreter_config: &InterpreterConfig) -> Result<()> { | ||
let target_os = cargo_env_var("CARGO_CFG_TARGET_OS").unwrap(); | ||
let is_extension_module = cargo_env_var("CARGO_FEATURE_EXTENSION_MODULE").is_some(); | ||
if target_os == "windows" || target_os == "android" || !is_extension_module { | ||
// windows and android - always link | ||
// other systems - only link if not extension module | ||
println!( | ||
"cargo:rustc-link-lib={link_model}{alias}{lib_name}", | ||
link_model = if interpreter_config.shared { | ||
"" | ||
} else { | ||
"static=" | ||
}, | ||
alias = if target_os == "windows" { | ||
"pythonXY:" | ||
} else { | ||
"" | ||
}, | ||
lib_name = interpreter_config.lib_name.as_ref().ok_or( | ||
"attempted to link to Python shared library but config does not contain lib_name" | ||
)?, | ||
); | ||
if let Some(lib_dir) = &interpreter_config.lib_dir { | ||
println!("cargo:rustc-link-search=native={}", lib_dir); | ||
} | ||
} | ||
|
||
Ok(()) | ||
} | ||
|
||
/// Prepares the PyO3 crate for compilation. | ||
/// | ||
/// This loads the config from pyo3-build-config and then makes some additional checks to improve UX | ||
/// for users. | ||
/// | ||
/// Emits the cargo configuration based on this config as well as a few checks of the Rust compiler | ||
/// version to enable features which aren't supported on MSRV. | ||
fn configure_pyo3() -> Result<()> { | ||
let interpreter_config = resolve_interpreter_config()?; | ||
|
||
if env_var("PYO3_PRINT_CONFIG").map_or(false, |os_str| os_str == "1") { | ||
print_config_and_exit(&interpreter_config); | ||
} | ||
|
||
ensure_python_version(&interpreter_config)?; | ||
ensure_target_pointer_width(&interpreter_config)?; | ||
ensure_auto_initialize_ok(&interpreter_config)?; | ||
|
||
if !interpreter_config.suppress_build_script_link_lines { | ||
emit_link_config(&interpreter_config)?; | ||
} | ||
|
||
interpreter_config.emit_pyo3_cfgs(); | ||
|
||
// Extra lines come last, to support last write wins. | ||
for line in &interpreter_config.extra_build_script_lines { | ||
println!("{}", line); | ||
} | ||
|
||
Ok(()) | ||
} | ||
|
||
fn print_config_and_exit(config: &InterpreterConfig) { | ||
println!("\n-- PYO3_PRINT_CONFIG=1 is set, printing configuration and halting compile --"); | ||
config | ||
.to_writer(&mut std::io::stdout()) | ||
.expect("failed to print config to stdout"); | ||
std::process::exit(101); | ||
} | ||
|
||
fn main() { | ||
if let Err(e) = configure_pyo3() { | ||
eprintln!("error: {}", e.report()); | ||
std::process::exit(1) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
use crate::ffi::object::PyObject; | ||
use crate::object::PyObject; | ||
use std::os::raw::{c_char, c_int}; | ||
|
||
extern "C" { | ||
|
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
use crate::ffi::object::*; | ||
use crate::object::*; | ||
use std::os::raw::{c_double, c_int}; | ||
|
||
#[repr(C)] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 2 additions & 2 deletions
4
src/ffi/cpython/bytesobject.rs → pyo3-ffi/src/cpython/bytesobject.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.