kwui_cli/
binary_release.rs1use std::fs::File;
2use std::path::PathBuf;
3use anyhow;
4use flate2::Compression;
5use flate2::write::GzEncoder;
6use tar::Builder;
7use std::io::{BufRead, BufReader};
8use cargo_toml::Manifest;
9use path_absolutize::*;
10use crate::check_source_dir;
11
12const TARGETS: &[&'static str] = &[
13 "x86_64-pc-windows-msvc",
14 "aarch64-linux-android",
15];
16
17pub fn build_and_package(source_dir: &PathBuf) -> anyhow::Result<()> {
18 for tgt in TARGETS.iter() {
19 build_and_package_target(source_dir, *tgt, false)?;
20 if tgt.ends_with("-msvc") {
21 build_and_package_target(source_dir, *tgt, true)?;
22 }
23 }
24 Ok(())
25}
26
27fn build_and_package_target(source_dir: &PathBuf, target: &str, static_crt: bool) -> anyhow::Result<()> {
28 println!("Checking source_dir [{}] ...", source_dir.display());
29 check_source_dir(source_dir)?;
30
31 let staging_dir = prepare_staging_dir(target, static_crt)?;
32 println!("Staging dir: {}", staging_dir.display());
33
34 println!("Building on source_dir [{}], for target '{}'{}' ...", source_dir.display(), target,
35 if static_crt {
36 ", with static CRT"
37 } else {
38 ""
39 });
40 let status = {
41 let mut cmd = std::process::Command::new("cmd");
42 cmd.current_dir(source_dir)
43 .env("BUILD_ARTIFACTSTAGINGDIRECTORY", &staging_dir);
44 if static_crt {
45 cmd.env("RUSTFLAGS", "-Ctarget-feature=+crt-static");
46 };
47 cmd
48 .args(["/c", "cargo", "build", "--release", "--target", target, "-p", "kwui-sys", "-vv"])
49 .status()?
50 };
51 if !status.success() {
52 anyhow::bail!("BUILD TARGET {} failed: {}", target, status);
53 }
54
55 println!("Packaging dir: {}", staging_dir.display());
56 package(&staging_dir)?;
57
58 Ok(())
59}
60
61fn prepare_staging_dir(target: &str, static_crt: bool) -> anyhow::Result<PathBuf> {
62 let staging_dir = if static_crt {
63 PathBuf::from("build").join(format!("{}-static", target))
64 } else {
65 PathBuf::from("build").join(target)
66 };
67 std::fs::create_dir_all(&staging_dir)?;
68 Ok(staging_dir.absolutize().unwrap().into())
69}
70
71const KWUI_BINARIES: &'static str = "kwui-binaries";
72
73fn package(staging_dir: &PathBuf) -> anyhow::Result<()> {
74 let (tag, key) = parse_tag_key(staging_dir)?;
75 let out_filename = format!("{}-{}.tar.gz", KWUI_BINARIES, key);
76 let tar_gz = File::create(&out_filename)?;
77 let enc = GzEncoder::new(tar_gz, Compression::default());
78 let mut tar = Builder::new(enc);
79 tar.append_dir_all(".", staging_dir.join(KWUI_BINARIES))?;
80 tar.finish()?;
81
82 println!("Done, output file [{}]", out_filename);
83
84 Ok(())
85}
86
87fn parse_tag_key(staging_dir: &PathBuf) -> anyhow::Result<(String, String)> {
88 let mut tag_file = BufReader::new(
89 File::open(staging_dir.join(KWUI_BINARIES).join("tag.txt"))?);
90 let mut tag = String::new();
91 tag_file.read_line(&mut tag);
92 drop(tag_file);
93
94 let mut key_file = BufReader::new(
95 File::open(staging_dir.join(KWUI_BINARIES).join("key.txt"))?);
96 let mut key = String::new();
97 key_file.read_line(&mut key);
98 drop(key_file);
99
100 Ok((tag, key))
101}