Как я могу передать флаги rustc из скрипта сборки, если они содержат пробел? - PullRequest
0 голосов
/ 15 сентября 2018

Я пишу программу на Rust с некоторой интеграцией C, поэтому я использую собственный скрипт сборки. В этом сценарии я передаю -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, потому что в сообщении об ошибке пробел был заменен этим, но затем я получаю ошибку компоновки, потому что путь неверен.

1 Ответ

0 голосов
/ 15 сентября 2018

Похоже, вы не можете с Rust 1.29.Исходный код для текущего мастера Cargo :

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

Это наивно разделяет аргумент на любой пробел, независимо от того, где он возникает.Похоже, что это ошибка или ограничение Cargo, и вы должны искать уже поданную проблему или подать ее самостоятельно.


Как говорится, если вы используете более подходящую цель rustc-link-lib и rustc-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'`
...