From fcb9e2ef516cff0b6d5168bc6465e4615d2aa96e Mon Sep 17 00:00:00 2001 From: _ov4 Date: Wed, 21 Oct 2026 11:22:38 +0000 Subject: ci(bundle): publish portable Windows and macOS desktop packages Build and check Bundle alongside each native compiler. Publish a single Windows exe with an embedded compiler extracted into the startup directory, and a macOS tar.xz containing the app and compiler. Check Linux without publishing a desktop package and require all six nightly attachments. Include licenses in embedded assets and app resources. Verify local builds, package smoke checks and release replacement with a simulated GitHub API. Co-Authored-By: Claude Opus 5.5 --- bundle/src-tauri/src/compiler.rs | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 bundle/src-tauri/src/compiler.rs (limited to 'bundle/src-tauri/src/compiler.rs') diff --git a/bundle/src-tauri/src/compiler.rs b/bundle/src-tauri/src/compiler.rs new file mode 100644 index 0000000..275a707 --- /dev/null +++ b/bundle/src-tauri/src/compiler.rs @@ -0,0 +1,41 @@ +use std::path::PathBuf; + +// Keep startup failures available to the UI, including an unwritable working directory. +pub struct Compiler(pub Result); + +impl Compiler { + pub fn load() -> Self { + Self(executable().map_err(|error| format!("Cannot load compiler: {error}"))) + } +} + +#[cfg(not(windows))] +fn executable() -> std::io::Result { + Ok(std::env::current_exe()?.with_file_name("cpsc")) +} + +#[cfg(windows)] +fn executable() -> std::io::Result { + use std::{ + fs::{self, File}, + io, + }; + + let directory = std::env::current_dir()?; + let destination = directory.join("cpsc.exe"); + let staged = directory.join(format!(".cpsc-{}.tmp", std::process::id())); + let result = (|| { + let mut compressed = flate2::read::GzDecoder::new( + &include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/binaries/cpsc.exe.gz"))[..], + ); + let mut file = File::create(&staged)?; + io::copy(&mut compressed, &mut file)?; + drop(file); + fs::rename(&staged, &destination)?; + Ok(destination) + })(); + if result.is_err() { + let _ = fs::remove_file(staged); + } + result +} -- cgit v1.3.1-4-g156e