Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make rustc-link-search relative to the project location?

I am creating a Rust wrapper around a C library. I've put the C libraries in the lib directory and I am using build.rs to tell the compiler where to find the libraries to link with:

println!("cargo:rustc-link-lib=static=wrapped-lib");
println!(r"cargo:rustc-link-search=lib\");

This works fine when I build the library, but downstream libraries which depend on the wrapper library get compilation failures:

error: could not find native static library `wrapped-lib`, perhaps an -L flag is missing?

The problem seems to be with:

println!(r"cargo:rustc-link-search=lib\");

When compiling a client library, this does not point at repository\checked_out_project\lib but instead seems to be looking locally, because specifying the absolute path in the dependency works:

println!(r"cargo:rustc-link-search=C:\users\id\.cargo\..\lib\");

I also have instructed Cargo to include the lib directory in the wrapper-lib as follows:

include = ["lib/**/*"]

How do I tell the compiler to look relative to the dependency, not the project being built? I thought that this should work:

println!(r"cargo:rustc-link-search=lib\");
like image 986
Aleksander Fular Avatar asked Feb 05 '23 05:02

Aleksander Fular


1 Answers

Manually.

A good example of this is the winapi crate. It has a pair of sub-crates for import libraries, each of which has a build script and a lib directory. The build script for the i686 crate contains the following:

use std::path::Path;
use std::env;

fn main() {
    let dir = env::var("CARGO_MANIFEST_DIR").unwrap();
    println!("cargo:rustc-link-search=native={}", Path::new(&dir).join("lib").display());
}
like image 140
DK. Avatar answered Feb 08 '23 16:02

DK.