Description
Build scripts place their output in a folder created by Cargo. The path to it is passed in the environment variable OUT_DIR
both to the build script and the main code. Since the file is placed in the directory, we need to add the path separator and then the name of the file. There seems to be no way to call include_bytes!
with a platform-agnostic path separator, inserting /
or \
depending on the host OS.
This works but is not portable: include_bytes!(concat!(env!("OUT_DIR"), "/myfile"));
This doesn't work: include_bytes!(concat!(env!("OUT_DIR"), std::path::MAIN_SEPARATOR, "myfile"));
because MAIN_SEPARATOR
is not a literal, and concat!
only eats literals.
I've tried to to assemble a String
in const fn
, but that doesn't work either because String::push()
requires a mutable borrow which are unsable in const fn
.
#[cfg(unix)]
and #[cfg(windows)]
sort of work, but break on cross-compilation because these cfg
attributes look at the target OS, and we need to add a separator that works on the host OS.
It's weird that this is either impossible to accomplish or the way to do so is very obscure. I'd expect this to be a relatively common operation.
rustc --version --verbose
:
rustc 1.46.0-beta.2 (6f959902b 2020-07-23)
binary: rustc
commit-hash: 6f959902b3103c49ca981fbc01871589c3498489
commit-date: 2020-07-23
host: x86_64-unknown-linux-gnu
release: 1.46.0-beta.2
LLVM version: 10.0