diff --git a/installer-gui/src-tauri/binaries/.gitignore b/installer-gui/src-tauri/binaries/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/installer-gui/src-tauri/binaries/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/installer-gui/src-tauri/build.rs b/installer-gui/src-tauri/build.rs index d860e1e..3528002 100644 --- a/installer-gui/src-tauri/build.rs +++ b/installer-gui/src-tauri/build.rs @@ -1,3 +1,52 @@ +use std::env::consts::EXE_SUFFIX; +use std::path::PathBuf; + fn main() { + println!("cargo::rerun-if-env-changed=INSTALLER_PATH"); + println!("cargo::rerun-if-env-changed=SKIP_INSTALLER_COPY"); + + let destination = get_installer_destination(); + if std::env::var_os("SKIP_INSTALLER_COPY").is_none() { + let cli_installer = + std::env::var_os("INSTALLER_PATH").map_or_else(default_installer_path, PathBuf::from); + if !cli_installer.exists() { + println!( + "cargo::error=CLI installer binary not present at {}", + cli_installer.display() + ); + std::process::exit(0); + } + std::fs::copy(&cli_installer, &destination).unwrap(); + println!("cargo::rerun-if-changed={}", cli_installer.display()); + println!("cargo::rerun-if-changed={}", destination.display()); + } else if !destination.exists() { + // if SKIP_INSTALLER_COPY is set, make sure something exists at destination so the build succeeds + std::fs::write(&destination, []).unwrap(); + } + tauri_build::build() } + +fn default_installer_path() -> PathBuf { + // the approach used here was taken from https://github.com/rust-lang/cargo/issues/9661#issuecomment-1722358176 + let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); + let profile = std::env::var("PROFILE").unwrap(); + let profile_dir = out_dir + .ancestors() + .find(|&path| path.ends_with(&profile)) + .unwrap(); + + profile_dir.join(format!("installer{EXE_SUFFIX}")) +} + +fn get_installer_destination() -> PathBuf { + // tauri expects included binaries to have the target triple appended to the file name like + // this. see https://tauri.app/develop/sidecar/ + let target_triple = std::env::var("TARGET").unwrap(); + [ + "binaries", + &format!("installer-cli-{target_triple}{EXE_SUFFIX}"), + ] + .iter() + .collect() +} diff --git a/installer-gui/src-tauri/tauri.conf.json b/installer-gui/src-tauri/tauri.conf.json index bcdf8e6..9417199 100644 --- a/installer-gui/src-tauri/tauri.conf.json +++ b/installer-gui/src-tauri/tauri.conf.json @@ -23,6 +23,7 @@ "bundle": { "active": true, "targets": ["app", "appimage", "deb", "msi", "nsis", "rpm"], + "externalBin": ["binaries/installer-cli"], "icon": [ "icons/32x32.png", "icons/128x128.png",