diff options
Diffstat (limited to 'crates/shirabe/build.rs')
| -rw-r--r-- | crates/shirabe/build.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/crates/shirabe/build.rs b/crates/shirabe/build.rs new file mode 100644 index 0000000..d98b07e --- /dev/null +++ b/crates/shirabe/build.rs @@ -0,0 +1,37 @@ +use std::path::PathBuf; + +// Composer ships its JSON schemas in res/ and JsonFile resolves them via __DIR__. +// We copy those schema files next to the built executable so they can be located +// at runtime through std::env::current_exe(). +fn main() { + let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); + let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); + + // OUT_DIR is target/<profile>/build/<pkg>-<hash>/out; its 3rd ancestor is target/<profile>. + let target_profile_dir = out_dir + .ancestors() + .nth(3) + .expect("OUT_DIR has an unexpected layout"); + + let composer_res = manifest_dir.join("../../composer/res"); + let files = ["composer-schema.json", "composer-lock-schema.json"]; + + // Binaries live in target/<profile>, test/example binaries in target/<profile>/deps; + // populate a res/ directory next to both so current_exe()/../res resolves either way. + for dest_dir in [ + target_profile_dir.join("res"), + target_profile_dir.join("deps").join("res"), + ] { + std::fs::create_dir_all(&dest_dir).unwrap(); + for file in files { + std::fs::copy(composer_res.join(file), dest_dir.join(file)).unwrap(); + } + } + + for file in files { + println!( + "cargo:rerun-if-changed={}", + composer_res.join(file).display() + ); + } +} |
