Is it possible to depend on special files from another crate, which can then be used during the build process?
For instance, let's say that crate A builds a file containing information for the linker, and crate B depends on crate A. How should crate B get that file from crate A, and then pass it to the linker?
Crates can cooperate in a complicated two-step process.
Assuming A depends on B.
B gets built first:
B must have links attribute set to globally unique string.
B copies files to path from OUT_DIR env var.
B prints cargo::my_out_dir_is= with value of OUT_DIR.
A gets built second:
A reads env var DEP_<name from B's links attr>_MY_OUT_DIR_IS
That's where the files are.
…but Cargo crates can't specify linker options beyond -l, and you should never set -l for another crate. Every crate links its own thing: Using C libraries in Rust: make a sys crate
Basically, I have a crate designed to help writing Postgres extensions in rust. A postgres extension is intended to be loaded into postgres, and call various C APIs. So at the time the postgres extension is linked, many symbols are intentionally unresolved. This works on linux but fails on Mac and windows with default linker flags.
I was looking into how to solve this on windows. It appears that a Module Definition File might help with this, but I wouldn't expect each extension to try to maintain this file. So, one idea was to include this in my crate (postgres-extension.rs), and have the postgres extensions pass this file to the linker. But I'm not sure if that's really possible with the cargo build system.
That sounds like a good workaround for me to try, thanks!
I'm hoping that there's some way that rust can support cdylibs where it's expected that there are some unresolved symbols (i.e. a plugin-style shared library).