diff --git a/src/builders/build_libsurvive.rs b/src/builders/build_libsurvive.rs index 1aa81e7..a988408 100644 --- a/src/builders/build_libsurvive.rs +++ b/src/builders/build_libsurvive.rs @@ -4,9 +4,9 @@ use crate::{ profile::Profile, runner::Runner, }; -use std::collections::HashMap; +use std::{collections::HashMap, path::Path}; -pub fn get_build_libsurvive_runners(profile: &Profile) -> Vec { +pub fn get_build_libsurvive_runners(profile: &Profile, clean_build: bool) -> Vec { let mut runners: Vec = vec![]; let git = Git { repo: match profile.features.libsurvive.repo.as_ref() { @@ -24,7 +24,6 @@ pub fn get_build_libsurvive_runners(profile: &Profile) -> Vec { "{}/build", profile.features.libsurvive.path.as_ref().unwrap() ); - rm_rf(&build_dir); let mut cmake_vars: HashMap = HashMap::new(); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); cmake_vars.insert("ENABLE_api_example".into(), "OFF".into()); @@ -39,9 +38,12 @@ pub fn get_build_libsurvive_runners(profile: &Profile) -> Vec { env: None, vars: Some(cmake_vars), source_dir: profile.features.libsurvive.path.as_ref().unwrap().clone(), - build_dir, + build_dir: build_dir.clone(), }; - runners.push(cmake.get_prepare_runner()); + if !Path::new(&build_dir).is_dir() || clean_build { + rm_rf(&build_dir); + runners.push(cmake.get_prepare_runner()); + } runners.push(cmake.get_build_runner()); runners.push(cmake.get_install_runner()); diff --git a/src/builders/build_monado.rs b/src/builders/build_monado.rs index e2fb787..ff14907 100644 --- a/src/builders/build_monado.rs +++ b/src/builders/build_monado.rs @@ -4,9 +4,9 @@ use crate::{ profile::Profile, runner::Runner, }; -use std::collections::HashMap; +use std::{collections::HashMap, path::Path}; -pub fn get_build_monado_runners(profile: &Profile) -> Vec { +pub fn get_build_monado_runners(profile: &Profile, clean_build: bool) -> Vec { let mut runners: Vec = vec![]; let git = Git { repo: match profile.xrservice_repo.as_ref() { @@ -21,7 +21,6 @@ pub fn get_build_monado_runners(profile: &Profile) -> Vec { }; let build_dir = format!("{}/build", profile.xrservice_path); - rm_rf(&build_dir); let mut env: HashMap = HashMap::new(); env.insert( "PKG_CONFIG_PATH".into(), @@ -45,9 +44,12 @@ pub fn get_build_monado_runners(profile: &Profile) -> Vec { env: Some(env), vars: Some(cmake_vars), source_dir: profile.xrservice_path.clone(), - build_dir, + build_dir: build_dir.clone(), }; - runners.push(cmake.get_prepare_runner()); + if !Path::new(&build_dir).is_dir() || clean_build { + rm_rf(&build_dir); + runners.push(cmake.get_prepare_runner()); + } runners.push(cmake.get_build_runner()); runners.push(cmake.get_install_runner()); diff --git a/src/builders/build_opencomposite.rs b/src/builders/build_opencomposite.rs index cda7605..52e7844 100644 --- a/src/builders/build_opencomposite.rs +++ b/src/builders/build_opencomposite.rs @@ -4,9 +4,9 @@ use crate::{ profile::Profile, runner::Runner, }; -use std::collections::HashMap; +use std::{collections::HashMap, path::Path}; -pub fn get_build_opencomposite_runners(profile: &Profile) -> Vec { +pub fn get_build_opencomposite_runners(profile: &Profile, clean_build: bool) -> Vec { let mut runners: Vec = vec![]; let git = Git { repo: match profile.opencomposite_repo.as_ref() { @@ -21,16 +21,18 @@ pub fn get_build_opencomposite_runners(profile: &Profile) -> Vec { }; let build_dir = format!("{}/build", profile.opencomposite_path); - rm_rf(&build_dir); let mut cmake_vars: HashMap = HashMap::new(); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); let cmake = Cmake { env: None, vars: Some(cmake_vars), source_dir: profile.opencomposite_path.clone(), - build_dir, + build_dir: build_dir.clone(), }; - runners.push(cmake.get_prepare_runner()); + if !Path::new(&build_dir).is_dir() || clean_build { + rm_rf(&build_dir); + runners.push(cmake.get_prepare_runner()); + } runners.push(cmake.get_build_runner()); runners diff --git a/src/builders/build_wivrn.rs b/src/builders/build_wivrn.rs index 0d38e8c..af8f398 100644 --- a/src/builders/build_wivrn.rs +++ b/src/builders/build_wivrn.rs @@ -4,9 +4,9 @@ use crate::{ profile::Profile, runner::Runner, }; -use std::collections::HashMap; +use std::{collections::HashMap, path::Path}; -pub fn get_build_wivrn_runners(profile: &Profile) -> Vec { +pub fn get_build_wivrn_runners(profile: &Profile, clean_build: bool) -> Vec { let mut runners: Vec = vec![]; let git = Git { repo: match profile.xrservice_repo.as_ref() { @@ -21,7 +21,6 @@ pub fn get_build_wivrn_runners(profile: &Profile) -> Vec { }; let build_dir = format!("{}/build", profile.xrservice_path); - rm_rf(&build_dir); let mut cmake_vars: HashMap = HashMap::new(); cmake_vars.insert("CMAKE_BUILD_TYPE".into(), "Release".into()); cmake_vars.insert("XRT_HAVE_SYSTEM_CJSON".into(), "NO".into()); @@ -32,9 +31,12 @@ pub fn get_build_wivrn_runners(profile: &Profile) -> Vec { env: None, vars: Some(cmake_vars), source_dir: profile.xrservice_path.clone(), - build_dir, + build_dir: build_dir.clone(), }; - runners.push(cmake.get_prepare_runner()); + if !Path::new(&build_dir).is_dir() || clean_build { + rm_rf(&build_dir); + runners.push(cmake.get_prepare_runner()); + } runners.push(cmake.get_build_runner()); runners.push(cmake.get_install_runner()); diff --git a/src/ui/app.rs b/src/ui/app.rs index 760ad96..f2882a1 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -89,7 +89,7 @@ pub struct App { #[derive(Debug)] pub enum Msg { ClockTicking, - BuildProfile, + BuildProfile(bool), EnableDebugViewChanged(bool), DoStartStopXRService, RestartXRService, @@ -357,7 +357,7 @@ impl SimpleComponent for App { } self.start_xrservice(); } - Msg::BuildProfile => { + Msg::BuildProfile(clean_build) => { let profile = self.get_selected_profile(); let mut missing_deps = vec![]; let mut runners: Vec = vec![]; @@ -369,7 +369,7 @@ impl SimpleComponent for App { }); if profile.features.libsurvive.enabled { missing_deps.extend(get_missing_libsurvive_deps()); - runners.extend(get_build_libsurvive_runners(&profile)); + runners.extend(get_build_libsurvive_runners(&profile, clean_build)); } if profile.features.basalt.enabled { missing_deps.extend(get_missing_basalt_deps()); @@ -380,12 +380,12 @@ impl SimpleComponent for App { runners.push(get_build_mercury_runner(&profile)); } runners.extend(match profile.xrservice_type { - XRServiceType::Monado => get_build_monado_runners(&profile), - XRServiceType::Wivrn => get_build_wivrn_runners(&profile), + XRServiceType::Monado => get_build_monado_runners(&profile, clean_build), + XRServiceType::Wivrn => get_build_wivrn_runners(&profile, clean_build), }); // no listed deps for opencomp } - runners.extend(get_build_opencomposite_runners(&profile)); + runners.extend(get_build_opencomposite_runners(&profile, clean_build)); if !missing_deps.is_empty() { missing_deps.sort_unstable(); missing_deps.dedup(); // dedup only works if sorted, hence the above @@ -598,7 +598,14 @@ impl SimpleComponent for App { let buildprofile_action = { let this_sender = sender.clone(); RelmAction::::new_stateless(move |_| { - this_sender.input_sender().emit(Msg::BuildProfile); + this_sender.input_sender().emit(Msg::BuildProfile(false)); + }) + }; + + let buildprofileclean_action = { + let this_sender = sender.clone(); + RelmAction::::new_stateless(move |_| { + this_sender.input_sender().emit(Msg::BuildProfile(true)); }) }; @@ -638,6 +645,7 @@ impl SimpleComponent for App { actions.add_action(about_action); actions.add_action(quit_action); actions.add_action(buildprofile_action); + actions.add_action(buildprofileclean_action); actions.add_action(debug_view_toggle_action); actions.add_action(libsurvive_setup_action); @@ -665,6 +673,7 @@ impl SimpleComponent for App { new_action_group!(pub AppActionGroup, "win"); new_stateless_action!(pub AboutAction, AppActionGroup, "about"); new_stateless_action!(pub BuildProfileAction, AppActionGroup, "buildprofile"); +new_stateless_action!(pub BuildProfileCleanAction, AppActionGroup, "buildprofileclean"); new_stateless_action!(pub LibsurviveSetupAction, AppActionGroup, "libsurvivesetup"); new_stateless_action!(pub QuitAction, AppActionGroup, "quit"); new_stateful_action!(pub DebugViewToggleAction, AppActionGroup, "debugviewtoggle", (), bool); diff --git a/src/ui/main_view.rs b/src/ui/main_view.rs index 24635dc..415cd7c 100644 --- a/src/ui/main_view.rs +++ b/src/ui/main_view.rs @@ -6,7 +6,7 @@ use crate::config::Config; use crate::constants::APP_NAME; use crate::profile::{Profile, XRServiceType}; use crate::ui::app::{ - AboutAction, BuildProfileAction, DebugViewToggleAction, LibsurviveSetupAction, + AboutAction, BuildProfileAction, DebugViewToggleAction, LibsurviveSetupAction, BuildProfileCleanAction, }; use crate::ui::profile_editor::ProfileEditorInit; use crate::xr_devices::XRDevices; @@ -87,6 +87,7 @@ impl SimpleComponent for MainView { // value inside action is ignored "_Debug View" => DebugViewToggleAction, "_Build Profile" => BuildProfileAction, + "C_lean Build Profile" => BuildProfileCleanAction, "_Calibrate Lighthouses" => LibsurviveSetupAction, }, section! {