Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
As part of developing PyOxidizer, I needed to force python3-sys to statically link against a Python library on Windows in a downstream crate of python3-sys. This requires the unstable `static-nobundle` link type so Cargo leaves symbols as unresolved when python3-sys is built. (Currently, the `static` linkage type verifies referenced symbols are present at crate build time.) See rust-lang/rust#37403 for more. Look for comments by me (@indygreg) to describe the issue in more detail. This commit teaches python3-sys a pair of new build features which enable more explicit control over the linker directives emitted by its build script. If no directive is specified, `link-mode-default` is used and the existing logic for linker directive emission is used. If `link-mode-unresolved-static` is used and we're on Windows, we emit a `static-nobundle=pythonXY` linker directive and omit the location of the library. This effectively says "I depend on a static `pythonXY` library but don't resolve the symbols when you build me and require someone else to specify the location to that library." What PyOxidizer does is emit its own linker directive that defines the location of a static `pythonXY` library, satisfying the linker constraint and enabling the build to work. If a downstream crate doesn't do this, the build should fail due to a missing library or symbols. I have purposefully designed the crate features to be extensible. If we want to add additional, mutually exclusive features in the future, we could do that. e.g. we could add a `link-mode-static` that force emits a `rustc-link-lib=static=pythonXY` directive to force static linking, even if a shared library is detected. But I have no need for this today and don't want to complicate the code, so I haven't added it. To round out the new feature, features have been added to the cpython crate to toggle the new features. Because Python 2.7 is end of life, I have not implemented the new feature for Python 2.7. I suspect very few people will use this feature anyway and I'm pretty confident that nobody will request this feature on Python 2.7. I concede that adding this feature to the crate to support PyOxidizer's esoteric use case is a bit unfortunate. I really wish Cargo allowed a crate to wholesale replace the build script output of a dependency, as PyOxidizer could statically resolve the Python settings for python3-sys since it brings its own Python library. But Cargo doesn't have this feature. So I'm stuck having to land this feature in the upstream crate to avoid having to maintain a permanent fork of `rust-cpython`. Sorry :/
- Loading branch information