取决于-sys包装库?

时间:2015-02-19 02:32:31

标签: rust

我有一个Rust库,它基本上是一些C源代码,并且是一个bindgen包装器。它有一个build.rs脚本进入C源目录,运行make,并将.a静态库复制到$OUT_DIR。当我运行cargo build时,一切正常。

但是,当我将该库作为依赖项添加到另一个项目foo-rs中时,似乎make永远不会运行。我最终得到的错误是

   Compiling foo-sys v0.1.6
     Running `rustc <LOTS OF STUFF> -L /home/paul/projects/foo-rs/target/build/foo-sys-936b7a25940b4bf0/out -l foo:static`
error: could not find native static library `foo`, perhaps an -L flag is missing?
Could not compile `foo-sys`.

以下是build.rs包中的foo-sys

use std::old_io::{fs, Command};
use std::os;
use std::old_io::process::InheritFd;

fn main() {
    let manifest_dir = Path::new(os::getenv("PWD").unwrap());
    let out_dir = Path::new(os::getenv("OUT_DIR").unwrap());
    let src_dir = manifest_dir.join("src");
    let foo_dir = src_dir.join("foo");
    let foo_lib = foo_dir.join("libfoo.a");

    let mut make = Command::new("make");

    assert!(make.cwd(&foo_dir)
                .arg("release")
                .stdout(InheritFd(1))
                .stderr(InheritFd(2))
                .status()
                .unwrap()
                .success());

    if let Err(_) = fs::copy(&foo_lib, &out_dir.join("libfoo.a")) {
        println!("ERROR COPYING libfoo.a");
    }

    println!("cargo:rustc-flags=-L {} -l foo:static", out_dir.display());
}

让我感到困惑的是,如果您查看上面的rustc行,它会在-L的末尾有-l foo:staticbuild.rs行,但{{{ 1}}无处可寻。

所以不知何故,libfoo.a命令没有运行,但make脚本仍在运行?

1 个答案:

答案 0 :(得分:-1)

不要使用PWD,请尝试CARGO_MANIFEST_DIR。文档说:

  

CARGO_MANIFEST_DIR - 包含正在构建的包的清单的目录(包含构建脚本的包)。另请注意,这是构建脚本启动时当前工作目录的值。

我认为这里有一个很好的区别 - 程序可能在正确的目录中运行,但PWD变量未更新以匹配它。这可能是一个货物错误,如果它是真的。

但是,没有理由复制libfoo.a。相反,请将foo_dir与-L而不是out_dir一起使用,只需链接到库所在的位置即可。