aboutsummaryrefslogtreecommitdiff
path: root/winpty/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'winpty/build.rs')
-rw-r--r--winpty/build.rs71
1 files changed, 62 insertions, 9 deletions
diff --git a/winpty/build.rs b/winpty/build.rs
index a0742a11..2f4c4565 100644
--- a/winpty/build.rs
+++ b/winpty/build.rs
@@ -1,14 +1,67 @@
-use std::fs::copy;
+#[cfg(windows)]
+use std::fs::OpenOptions;
+#[cfg(windows)]
+use std::io;
+
+#[cfg(windows)]
+use std::env;
+#[cfg(windows)]
+use std::fs::{copy, File};
+#[cfg(windows)]
use std::path::Path;
+#[cfg(windows)]
+use embed_resource;
+#[cfg(windows)]
+use reqwest;
+#[cfg(windows)]
+use tempfile;
+#[cfg(windows)]
+use zip;
+
+#[cfg(windows)]
+const WINPTY_PACKAGE_URL: &str =
+ "https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip";
+
fn main() {
- // The working directory for `cargo test` is in the deps folder, not the debug/release root
- if cfg!(test) && Path::new("target").exists() {
- #[cfg(debug_assertions)]
- copy("../extra/windows/x86_64/winpty-agent.exe", "target/debug/deps/winpty-agent.exe")
- .unwrap();
- #[cfg(not(debug_assertions))]
- copy("../extra/windows/x86_64/winpty-agent.exe", "target/release/deps/winpty-agent.exe")
- .unwrap();
+ #[cfg(windows)]
+ {
+ embed_resource::compile("../extra/windows/windows.rc");
+
+ // Path is relative to target/{profile}/build/alacritty-HASH/out
+ let file = Path::new(&env::var("OUT_DIR").unwrap()).join("../../../winpty-agent.exe");
+ if !file.exists() {
+ aquire_winpty_agent(&file);
+ }
+
+ // The working directory for `cargo test` is in the deps folder, not the debug/release root
+ copy(&file, file.parent().unwrap().join("deps/winpty-agent.exe")).unwrap();
}
}
+
+#[cfg(windows)]
+fn aquire_winpty_agent(out_path: &Path) {
+ let tmp_dir = tempfile::Builder::new().prefix("alacritty_build").tempdir().unwrap();
+
+ let mut response = reqwest::get(WINPTY_PACKAGE_URL).unwrap();
+ let mut file = OpenOptions::new()
+ .read(true)
+ .write(true)
+ .create(true)
+ .open(tmp_dir.path().join("winpty_package.zip"))
+ .unwrap();
+
+ io::copy(&mut response, &mut file).unwrap();
+
+ let mut archive = zip::ZipArchive::new(file).unwrap();
+
+ let target = match env::var("TARGET").unwrap().split("-").next().unwrap() {
+ "x86_64" => "x64",
+ "i386" => "ia32",
+ _ => panic!("architecture has no winpty binary"),
+ };
+
+ let mut winpty_agent = archive.by_name(&format!("{}/bin/winpty-agent.exe", target)).unwrap();
+
+ io::copy(&mut winpty_agent, &mut File::create(out_path).unwrap()).unwrap();
+}