Reputation: 4898
I'm trying to do almost the same as How to create a static string at compile time.
use std::{env};
use std::path::Path;
use std::io::{Write, BufWriter};
use std::fs::File;
fn main() {
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("file_path.txt");
let mut f = BufWriter::new(File::create(&dest_path).unwrap());
let long_string = dest_path.display();
write!(f, "{}", long_string).unwrap();
}
fn main() {
static LONG_STRING: &'static str = include_str!("file_path.txt");
println!("{}", LONG_STRING);
}
Upon cargo build
I'm getting the error:
error: couldn't read src\file_path.txt: The system cannot find the file specified. (os error 2)
--> src\main.rs:3:40
|
3 | static LONG_STRING: &'static str = include_str!("file_path.txt");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I can see that the file is generated at
X:\source\github\rust-build-script-example\target\debug\build\rust-build-script-example-f2a03ef7abfd6b23\out\file_path.txt
file_path.txt
to be output to the src
directory?include_str!
the generated file in the above directory without hardcoding it in code (since the path seems to have a randomly generated partial rust-build-script-example-f2a03ef7abfd6b23
in it)Upvotes: 7
Views: 3484
Reputation: 4898
The trick was
concat!(env!("OUT_DIR"), "/file_path.txt")
I changed my main.rs as follows and it worked.
fn main() {
static LONG_STRING: &'static str = include_str!(concat!(env!("OUT_DIR"), "/file_path.txt"));
println!("{}", LONG_STRING);
}
The following crates.io documentation helped
http://doc.crates.io/build-script.html
https://doc.rust-lang.org/cargo/reference/environment-variables.html
Upvotes: 12
Reputation: 4898
If anyone is interested in a more convenient way to achieve the same, I also created the build_script_file_gen crate which can be used as follows
extern crate build_script_file_gen;
use build_script_file_gen::gen_file_str;
fn main() {
let file_content = "Hello World!";
gen_file_str("hello.txt", &file_content);
}
#[macro_use]
extern crate build_script_file_gen;
fn main() {
println!(include_file_str!("hello.txt"));
}
Upvotes: 2