如果构建脚本包含空格,我如何将标志传递给rustc?

问题描述 投票:0回答:1

我正在编写一个带有一些C集成的Rust程序,所以我使用的是自定义构建脚本。在这个脚本中,我将-L <path to library>传递给rustc,但这只有在<path to library>不包含空格时才有效。 build.rs中的确切行:

println!(r"cargo:rustc-flags= -L {}/target/sdsl/sdsl_install/lib -l sdsl -l divsufsort -l divsufsort64 -l stdc++", current_dir);

如果current_dir包含空格,我会收到此错误

error: Only `-l` and `-L` flags are allowed in build script of `top_tree_compression v0.1.0 (file:///home/jan/Uni/Bachelorarbeit/Programme/Top_Tree%20Compression)`: `-L /home/jan/Uni/Bachelorarbeit/Programme/Top_Tree Compression/target/sdsl/sdsl_install/lib -l sdsl -l divsufsort -l divsufsort64 -l stdc++`

我试图在空间之前写一个\来逃避它,但它给了我同样的错误。然后我尝试用%20替换空间,因为在错误消息中空格被替换为此,但后来我得到链接错误,因为路径不正确。

rust rust-cargo
1个回答
2
投票

看起来你不能像Rust 1.29那样。 source code for the current master of Cargo

let mut flags_iter = value
    .split(|c: char| c.is_whitespace())
    .filter(|w| w.chars().any(|c| !c.is_whitespace()));

这天真地在任何空格上分割参数,无论它出现在何处。这似乎是货物的一个错误或限制,你应该寻找一个已经提交的问题或自己提交一个文件。


话虽如此,如果您使用更适合用途的rustc-link-librustc-link-search参数,空间可以正常工作:

println!(r#"cargo:rustc-link-search={}/target/sdsl/sdsl_install/lib"#, "some thing");
$ cargo run --verbose
   Compiling xx v0.1.0 (file:///private/tmp/xx)
     [...snip...]
     Running `rustc [...snip...] -L 'some thing/target/sdsl/sdsl_install/lib'`
© www.soinside.com 2019 - 2024. All rights reserved.