macos: automatically provide required linker arguments
This commit is contained in:
parent
3663d3f37e
commit
b213f06df4
|
@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
||||||
- The `auto-initialize` feature is no longer enabled by default. [#1443](https://github.com/PyO3/pyo3/pull/1443)
|
- The `auto-initialize` feature is no longer enabled by default. [#1443](https://github.com/PyO3/pyo3/pull/1443)
|
||||||
- Change `PyCFunction::new()` and `PyCFunction::new_with_keywords()` to take `&'static str` arguments rather than implicitly copying (and leaking) them. [#1450](https://github.com/PyO3/pyo3/pull/1450)
|
- Change `PyCFunction::new()` and `PyCFunction::new_with_keywords()` to take `&'static str` arguments rather than implicitly copying (and leaking) them. [#1450](https://github.com/PyO3/pyo3/pull/1450)
|
||||||
- Deprecate `PyModule` methods `call`, `call0`, `call1` and `get`. [#1492](https://github.com/PyO3/pyo3/pull/1492)
|
- Deprecate `PyModule` methods `call`, `call0`, `call1` and `get`. [#1492](https://github.com/PyO3/pyo3/pull/1492)
|
||||||
|
- Automatically provide `-undefined` and `dynamic_lookup` linker arguments on macOS with `extension-module` feature. [#1539](https://github.com/PyO3/pyo3/pull/1539)
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- Remove deprecated exception names `BaseException` etc. [#1426](https://github.com/PyO3/pyo3/pull/1426)
|
- Remove deprecated exception names `BaseException` etc. [#1426](https://github.com/PyO3/pyo3/pull/1426)
|
||||||
|
|
16
README.md
16
README.md
|
@ -80,22 +80,6 @@ fn string_sum(py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
On Windows and Linux, you can build normally with `cargo build --release`. On macOS, you need to set additional linker arguments. One option is to compile with `cargo rustc --release -- -C link-arg=-undefined -C link-arg=dynamic_lookup`, the other is to create a `.cargo/config` with the following content:
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[target.x86_64-apple-darwin]
|
|
||||||
rustflags = [
|
|
||||||
"-C", "link-arg=-undefined",
|
|
||||||
"-C", "link-arg=dynamic_lookup",
|
|
||||||
]
|
|
||||||
|
|
||||||
[target.aarch64-apple-darwin]
|
|
||||||
rustflags = [
|
|
||||||
"-C", "link-arg=-undefined",
|
|
||||||
"-C", "link-arg=dynamic_lookup",
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
While developing, you can symlink (or copy) and rename the shared library from the target folder: On MacOS, rename `libstring_sum.dylib` to `string_sum.so`, on Windows `libstring_sum.dll` to `string_sum.pyd`, and on Linux `libstring_sum.so` to `string_sum.so`. Then open a Python shell in the same folder and you'll be able to `import string_sum`.
|
While developing, you can symlink (or copy) and rename the shared library from the target folder: On MacOS, rename `libstring_sum.dylib` to `string_sum.so`, on Windows `libstring_sum.dll` to `string_sum.pyd`, and on Linux `libstring_sum.so` to `string_sum.so`. Then open a Python shell in the same folder and you'll be able to `import string_sum`.
|
||||||
|
|
||||||
To build, test and publish your crate as a Python module, you can use [maturin](https://github.com/PyO3/maturin) or [setuptools-rust](https://github.com/PyO3/setuptools-rust). You can find an example for setuptools-rust in [examples/word-count](https://github.com/PyO3/pyo3/tree/main/examples/word-count), while maturin should work on your crate without any configuration.
|
To build, test and publish your crate as a Python module, you can use [maturin](https://github.com/PyO3/maturin) or [setuptools-rust](https://github.com/PyO3/setuptools-rust). You can find an example for setuptools-rust in [examples/word-count](https://github.com/PyO3/pyo3/tree/main/examples/word-count), while maturin should work on your crate without any configuration.
|
||||||
|
|
29
build.rs
29
build.rs
|
@ -729,19 +729,32 @@ fn configure(interpreter_config: &InterpreterConfig) -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
check_target_architecture(interpreter_config)?;
|
check_target_architecture(interpreter_config)?;
|
||||||
let target_os = env::var_os("CARGO_CFG_TARGET_OS").unwrap();
|
|
||||||
|
|
||||||
|
let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
|
||||||
let is_extension_module = env::var_os("CARGO_FEATURE_EXTENSION_MODULE").is_some();
|
let is_extension_module = env::var_os("CARGO_FEATURE_EXTENSION_MODULE").is_some();
|
||||||
if !is_extension_module || target_os == "windows" || target_os == "android" {
|
match (is_extension_module, target_os.as_str()) {
|
||||||
println!("{}", get_rustc_link_lib(&interpreter_config));
|
(_, "windows") => {
|
||||||
if let Some(libdir) = &interpreter_config.libdir {
|
// always link on windows, even with extension module
|
||||||
println!("cargo:rustc-link-search=native={}", libdir);
|
println!("{}", get_rustc_link_lib(&interpreter_config));
|
||||||
} else if target_os == "windows" {
|
|
||||||
println!(
|
println!(
|
||||||
"cargo:rustc-link-search=native={}\\libs",
|
"cargo:rustc-link-search=native={}\\libs",
|
||||||
interpreter_config.base_prefix
|
interpreter_config.base_prefix
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
(true, "macos") => {
|
||||||
|
// with extension module on macos some extra linker arguments are needed
|
||||||
|
println!("cargo:rustc-cdylib-link-arg=-undefined");
|
||||||
|
println!("cargo:rustc-cdylib-link-arg=dynamic_lookup");
|
||||||
|
}
|
||||||
|
(false, _) | (_, "android") => {
|
||||||
|
// other systems, only link libs if not extension module
|
||||||
|
// android always link.
|
||||||
|
println!("{}", get_rustc_link_lib(&interpreter_config));
|
||||||
|
if let Some(libdir) = &interpreter_config.libdir {
|
||||||
|
println!("cargo:rustc-link-search=native={}", libdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if interpreter_config.shared {
|
if interpreter_config.shared {
|
||||||
|
@ -885,10 +898,6 @@ fn main_impl() -> Result<()> {
|
||||||
println!("cargo:rustc-cfg={}=\"{}\"", CFG_KEY, flag)
|
println!("cargo:rustc-cfg={}=\"{}\"", CFG_KEY, flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
if env::var_os("TARGET") == Some("x86_64-apple-darwin".into()) {
|
|
||||||
// TODO: Find out how we can set -undefined dynamic_lookup here (if this is possible)
|
|
||||||
}
|
|
||||||
|
|
||||||
for var in &[
|
for var in &[
|
||||||
"LIB",
|
"LIB",
|
||||||
"LD_LIBRARY_PATH",
|
"LD_LIBRARY_PATH",
|
||||||
|
|
20
src/lib.rs
20
src/lib.rs
|
@ -82,26 +82,6 @@
|
||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! On Windows and linux, you can build normally with `cargo build
|
|
||||||
//! --release`. On macOS, you need to set additional linker arguments. One
|
|
||||||
//! option is to compile with `cargo rustc --release -- -C link-arg=-undefined
|
|
||||||
//! -C link-arg=dynamic_lookup`, the other is to create a `.cargo/config` with
|
|
||||||
//! the following content:
|
|
||||||
//!
|
|
||||||
//! ```toml
|
|
||||||
//! [target.x86_64-apple-darwin]
|
|
||||||
//! rustflags = [
|
|
||||||
//! "-C", "link-arg=-undefined",
|
|
||||||
//! "-C", "link-arg=dynamic_lookup",
|
|
||||||
//! ]
|
|
||||||
//!
|
|
||||||
//! [target.aarch64-apple-darwin]
|
|
||||||
//! rustflags = [
|
|
||||||
//! "-C", "link-arg=-undefined",
|
|
||||||
//! "-C", "link-arg=dynamic_lookup",
|
|
||||||
//! ]
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! While developing, you symlink (or copy) and rename the shared library from
|
//! While developing, you symlink (or copy) and rename the shared library from
|
||||||
//! the target folder: On macOS, rename `libstring_sum.dylib` to
|
//! the target folder: On macOS, rename `libstring_sum.dylib` to
|
||||||
//! `string_sum.so`, on Windows `libstring_sum.dll` to `string_sum.pyd` and on
|
//! `string_sum.so`, on Windows `libstring_sum.dll` to `string_sum.pyd` and on
|
||||||
|
|
Loading…
Reference in New Issue