kwui_cli/
binary_release.rs

1use 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}