diff --git a/scripts/build_libsurvive.sh b/scripts/build_libsurvive.sh deleted file mode 100755 index f800d8e..0000000 --- a/scripts/build_libsurvive.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -set -ev - -REPO_DIR=$1 - -PREFIX=$2 - -DO_PULL=$3 - -REPO_URL=$4 - -if [[ -z $REPO_DIR ]] || [[ -z $PREFIX ]] || [[ -z $DO_PULL ]]; then - echo "Usage: $0 REPO_DIR PREFIX DO_PULL [REPO_URL]" - exit 1 -fi - -if [[ -z $REPO_URL ]]; then - REPO_URL="https://github.com/cntools/libsurvive" -fi - -"$(dirname -- "$0")/_clone_or_pull.sh" "$REPO_URL" "$REPO_DIR" "$DO_PULL" - -cd "$REPO_DIR" -rm -rf build -mkdir -p build -cd build -cmake -DCMAKE_BUILD_TYPE=Release \ - -DENABLE_api_example=OFF \ - -DCMAKE_SKIP_INSTALL_RPATH=YES \ - -Wno-dev \ - -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ - -DCMAKE_INSTALL_LIBDIR="${PREFIX}/lib" \ - .. -G Ninja -cmake --build . -cmake --install . diff --git a/scripts/build_monado.sh b/scripts/build_monado.sh deleted file mode 100755 index 5a635ab..0000000 --- a/scripts/build_monado.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# exit on error -# echo commands -set -ev - -REPO_DIR=$1 - -PREFIX=$2 - -DO_PULL=$3 - -REPO_URL=$4 - -if [[ -z $REPO_DIR ]] || [[ -z $PREFIX ]] || [[ -z $DO_PULL ]]; then - echo "Usage: $0 REPO_DIR PREFIX DO_PULL [REPO_URL]" - exit 1 -fi - -if [[ -z $REPO_URL ]]; then - REPO_URL="https://gitlab.freedesktop.org/monado/monado" -fi - -"$(dirname -- "$0")/_clone_or_pull.sh" "$REPO_URL" "$REPO_DIR" "$DO_PULL" - -cd "$REPO_DIR" -rm -rf build -mkdir -p build -cd build -export PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig" -cmake -DCMAKE_BUILD_TYPE=Release \ - -DXRT_HAVE_SYSTEM_CJSON=NO \ - -DCMAKE_LIBDIR="${PREFIX}/lib" \ - -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ - -DCMAKE_C_FLAGS="-Wl,-rpath ${PREFIX}/lib" \ - -DCMAKE_CXX_FLAGS="-Wl,-rpath ${PREFIX}/lib" \ - .. -G Ninja -cmake --build . -cmake --install . diff --git a/scripts/build_opencomposite.sh b/scripts/build_opencomposite.sh deleted file mode 100755 index d071d09..0000000 --- a/scripts/build_opencomposite.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# exit on error -# echo commands -set -ev - -REPO_DIR=$1 - -DO_PULL=$2 - -REPO_URL=$3 - -if [[ -z $REPO_DIR ]] || [[ -z $DO_PULL ]]; then - echo "Usage: $0 REPO_DIR DO_PULL [REPO_URL]" - exit 1 -fi - -if [[ -z $REPO_URL ]]; then - REPO_URL="https://gitlab.com/znixian/OpenOVR.git" -fi - -"$(dirname -- "$0")/_clone_or_pull.sh" "$REPO_URL" "$REPO_DIR" "$DO_PULL" - -cd "$REPO_DIR" -rm -rf build -mkdir -p build -cd build -cmake -DCMAKE_BUILD_TYPE=Release .. -G Ninja -cmake --build . diff --git a/scripts/build_wivrn.sh b/scripts/build_wivrn.sh deleted file mode 100755 index 8b8ef52..0000000 --- a/scripts/build_wivrn.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# exit on error -# echo commands -set -ev - -REPO_DIR=$1 - -PREFIX=$2 - -DO_PULL=$3 - -REPO_URL=$4 - -if [[ -z $REPO_DIR ]] || [[ -z $PREFIX ]] || [[ -z $DO_PULL ]]; then - echo "Usage: $0 REPO_DIR PREFIX DO_PULL [REPO_URL]" - exit 1 -fi - -if [[ -z $REPO_URL ]]; then - REPO_URL="https://github.com/Meumeu/WiVRn" -fi - -"$(dirname -- "$0")/_clone_or_pull.sh" "$REPO_URL" "$REPO_DIR" "$DO_PULL" - -cd "$REPO_DIR" -rm -rf build -mkdir -p build -cd build -cmake -B build-server -DCMAKE_BUILD_TYPE=Release \ - -DXRT_HAVE_SYSTEM_CJSON=NO \ - -DWIVRN_BUILD_CLIENT=OFF \ - -DCMAKE_INSTALL_PREFIX="${PREFIX}" \ - .. -GNinja -cmake --build build-server -ninja -C build-server install diff --git a/scripts/meson.build b/scripts/meson.build index 2d45e46..f10ce78 100644 --- a/scripts/meson.build +++ b/scripts/meson.build @@ -1,7 +1,3 @@ install_data('_clone_or_pull.sh', install_dir: pkgdatadir / 'scripts') install_data('build_basalt.sh', install_dir: pkgdatadir / 'scripts') -install_data('build_libsurvive.sh', install_dir: pkgdatadir / 'scripts') -install_data('build_monado.sh', install_dir: pkgdatadir / 'scripts') install_data('build_mercury.sh', install_dir: pkgdatadir / 'scripts') -install_data('build_opencomposite.sh', install_dir: pkgdatadir / 'scripts') -install_data('build_wivrn.sh', install_dir: pkgdatadir / 'scripts') diff --git a/src/build_tools/cmake.rs b/src/build_tools/cmake.rs index ad2ce19..c693873 100644 --- a/src/build_tools/cmake.rs +++ b/src/build_tools/cmake.rs @@ -20,7 +20,12 @@ impl Cmake { if k.contains(" ") { panic!("Cmake vars cannot contain spaces!"); } - args.push(format!("-D{k}=\"{v}\"", k=k, v=v)); + if v.contains(" ") { + args.push(format!("-D{k}=\"{v}\"", k=k, v=v)); + } + else { + args.push(format!("-D{k}={v}", k=k, v=v)); + } } } args.push(self.source_dir.clone()); @@ -32,4 +37,10 @@ impl Cmake { "--build".into(), self.build_dir.clone() ]) } + + pub fn get_install_runner(&self) -> Runner { + Runner::new(self.env.clone(), "cmake".into(), vec![ + "--install".into(), self.build_dir.clone() + ]) + } } diff --git a/src/build_tools/git.rs b/src/build_tools/git.rs new file mode 100644 index 0000000..c311e79 --- /dev/null +++ b/src/build_tools/git.rs @@ -0,0 +1,59 @@ +use std::path::Path; + +use crate::{profile::Profile, runner::Runner}; + +#[derive(Debug, Clone)] +pub struct Git { + pub repo: String, + pub dir: String, +} + +impl Git { + pub fn get_reset_runner(&self) -> Runner { + Runner::new( + None, + "git".into(), + vec![ + "-C".into(), + self.dir.clone(), + "reset".into(), + "--hard".into(), + ], + ) + } + + pub fn get_pull_runner(&self) -> Runner { + Runner::new( + None, + "git".into(), + vec!["-C".into(), self.dir.clone(), "pull".into()], + ) + } + + pub fn get_clone_runner(&self) -> Runner { + Runner::new( + None, + "git".into(), + vec!["clone".into(), self.repo.clone(), self.dir.clone()], + ) + } + + pub fn get_clone_or_not_runner(&self) -> Option { + let path_s = format!("{}/.git", self.dir.clone()); + let path = Path::new(&path_s); + if path.is_dir() { + return None; + } + Some(self.get_clone_runner()) + } + + pub fn clone_or_pull(&self, profile: &Profile) -> Option { + match self.get_clone_or_not_runner() { + Some(r) => Some(r), + None => match profile.pull_on_build { + true => Some(self.get_pull_runner()), + false => None, + }, + } + } +} diff --git a/src/build_tools/mod.rs b/src/build_tools/mod.rs index 933d74c..85aaba2 100644 --- a/src/build_tools/mod.rs +++ b/src/build_tools/mod.rs @@ -1 +1,2 @@ pub mod cmake; +pub mod git; diff --git a/src/builders/build_basalt.rs b/src/builders/build_basalt.rs index 73a8008..5aa0df4 100644 --- a/src/builders/build_basalt.rs +++ b/src/builders/build_basalt.rs @@ -1,18 +1,18 @@ use crate::{constants::pkg_data_dir, profile::Profile, runner::Runner}; -pub fn get_build_basalt_runner(profile: Profile) -> Runner { +pub fn get_build_basalt_runner(profile: &Profile) -> Runner { let mut args = vec![ profile - .features.basalt.path + .features.basalt.path.clone() .expect("Missing basalt path for given profile"), - profile.prefix, + profile.prefix.clone(), match profile.pull_on_build { true => "1".into(), false => "0".into(), }, ]; if profile.features.basalt.repo.is_some() { - args.push(profile.features.basalt.repo.unwrap()); + args.push(profile.features.basalt.repo.as_ref().unwrap().clone()); } let runner = Runner::new( None, diff --git a/src/builders/build_libsurvive.rs b/src/builders/build_libsurvive.rs index 03a177c..1aa81e7 100644 --- a/src/builders/build_libsurvive.rs +++ b/src/builders/build_libsurvive.rs @@ -1,26 +1,49 @@ -use crate::{constants::pkg_data_dir, profile::Profile, runner::Runner}; +use crate::{ + build_tools::{cmake::Cmake, git::Git}, + file_utils::rm_rf, + profile::Profile, + runner::Runner, +}; +use std::collections::HashMap; -pub fn get_build_libsurvive_runner(profile: Profile) -> Runner { - let mut args = vec![ - profile - .features.libsurvive.path - .expect("Missing libsurvive path for given profile"), - profile.prefix, - match profile.pull_on_build { - true => "1".into(), - false => "0".into(), +pub fn get_build_libsurvive_runners(profile: &Profile) -> Vec { + let mut runners: Vec = vec![]; + let git = Git { + repo: match profile.features.libsurvive.repo.as_ref() { + Some(r) => r.clone(), + None => "https://github.com/cntools/libsurvive".into(), }, - ]; - if profile.features.libsurvive.repo.is_some() { - args.push(profile.features.libsurvive.repo.unwrap()); - } - let runner = Runner::new( - None, - format!( - "{sysdata}/scripts/build_libsurvive.sh", - sysdata = pkg_data_dir() - ), - args, + dir: profile.features.libsurvive.path.as_ref().unwrap().clone(), + }; + match git.clone_or_pull(profile) { + Some(r) => runners.push(r), + None => {} + }; + + let build_dir = format!( + "{}/build", + profile.features.libsurvive.path.as_ref().unwrap() ); - runner + 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()); + cmake_vars.insert("CMAKE_SKIP_INSTALL_RPATH".into(), "YES".into()); + cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); + cmake_vars.insert( + "CMAKE_INSTALL_LIBDIR".into(), + format!("{}/lib", profile.prefix), + ); + + let cmake = Cmake { + env: None, + vars: Some(cmake_vars), + source_dir: profile.features.libsurvive.path.as_ref().unwrap().clone(), + build_dir, + }; + runners.push(cmake.get_prepare_runner()); + runners.push(cmake.get_build_runner()); + runners.push(cmake.get_install_runner()); + + runners } diff --git a/src/builders/build_mercury.rs b/src/builders/build_mercury.rs index 801e8a1..65ba0c8 100644 --- a/src/builders/build_mercury.rs +++ b/src/builders/build_mercury.rs @@ -1,7 +1,7 @@ use crate::{constants::pkg_data_dir, paths::get_cache_dir, profile::Profile, runner::Runner}; -pub fn get_build_mercury_runner(profile: Profile) -> Runner { - let args = vec![profile.prefix, get_cache_dir()]; +pub fn get_build_mercury_runner(profile: &Profile) -> Runner { + let args = vec![profile.prefix.clone(), get_cache_dir()]; let runner = Runner::new( None, format!( diff --git a/src/builders/build_monado.rs b/src/builders/build_monado.rs index 5c95771..e2fb787 100644 --- a/src/builders/build_monado.rs +++ b/src/builders/build_monado.rs @@ -1,21 +1,55 @@ -use crate::{constants::pkg_data_dir, profile::Profile, runner::Runner}; +use crate::{ + build_tools::{cmake::Cmake, git::Git}, + file_utils::rm_rf, + profile::Profile, + runner::Runner, +}; +use std::collections::HashMap; -pub fn get_build_monado_runner(profile: Profile) -> Runner { - let mut args = vec![ - profile.xrservice_path, - profile.prefix, - match profile.pull_on_build { - true => "1".into(), - false => "0".into(), +pub fn get_build_monado_runners(profile: &Profile) -> Vec { + let mut runners: Vec = vec![]; + let git = Git { + repo: match profile.xrservice_repo.as_ref() { + Some(r) => r.clone(), + None => "https://gitlab.freedesktop.org/monado/monado".into(), }, - ]; - if profile.xrservice_repo.is_some() { - args.push(profile.xrservice_repo.unwrap()); - } - let runner = Runner::new( - None, - format!("{sysdata}/scripts/build_monado.sh", sysdata = pkg_data_dir()), - args, + dir: profile.xrservice_path.clone(), + }; + match git.clone_or_pull(profile) { + Some(r) => runners.push(r), + None => {} + }; + + let build_dir = format!("{}/build", profile.xrservice_path); + rm_rf(&build_dir); + let mut env: HashMap = HashMap::new(); + env.insert( + "PKG_CONFIG_PATH".into(), + format!("{}/lib/pkgconfig", profile.prefix), ); - runner + 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()); + cmake_vars.insert("CMAKE_LIBDIR".into(), format!("{}/lib", profile.prefix)); + cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); + cmake_vars.insert( + "CMAKE_C_FLAGS".into(), + format!("-Wl,-rpath='{}/lib'", profile.prefix), + ); + cmake_vars.insert( + "CMAKE_CXX_FLAGS".into(), + format!("-Wl,-rpath='{}/lib'", profile.prefix), + ); + + let cmake = Cmake { + env: Some(env), + vars: Some(cmake_vars), + source_dir: profile.xrservice_path.clone(), + build_dir, + }; + runners.push(cmake.get_prepare_runner()); + runners.push(cmake.get_build_runner()); + runners.push(cmake.get_install_runner()); + + runners } diff --git a/src/builders/build_opencomposite.rs b/src/builders/build_opencomposite.rs index 069ac22..cda7605 100644 --- a/src/builders/build_opencomposite.rs +++ b/src/builders/build_opencomposite.rs @@ -1,23 +1,37 @@ -use crate::{constants::pkg_data_dir, profile::Profile, runner::Runner}; +use crate::{ + build_tools::{cmake::Cmake, git::Git}, + file_utils::rm_rf, + profile::Profile, + runner::Runner, +}; +use std::collections::HashMap; -pub fn get_build_opencomposite_runner(profile: Profile) -> Runner { - let mut args = vec![ - profile.opencomposite_path, - match profile.pull_on_build { - true => "1".into(), - false => "0".into(), +pub fn get_build_opencomposite_runners(profile: &Profile) -> Vec { + let mut runners: Vec = vec![]; + let git = Git { + repo: match profile.opencomposite_repo.as_ref() { + Some(r) => r.clone(), + None => "https://gitlab.com/znixian/OpenOVR.git".into(), }, - ]; - if profile.opencomposite_repo.is_some() { - args.push(profile.opencomposite_repo.unwrap()); - } - let runner = Runner::new( - None, - format!( - "{sysdata}/scripts/build_opencomposite.sh", - sysdata = pkg_data_dir() - ), - args, - ); - runner + dir: profile.opencomposite_path.clone(), + }; + match git.clone_or_pull(profile) { + Some(r) => runners.push(r), + None => {} + }; + + 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, + }; + 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 8f3ee8a..0d38e8c 100644 --- a/src/builders/build_wivrn.rs +++ b/src/builders/build_wivrn.rs @@ -1,21 +1,42 @@ -use crate::{constants::pkg_data_dir, profile::Profile, runner::Runner}; +use crate::{ + build_tools::{cmake::Cmake, git::Git}, + file_utils::rm_rf, + profile::Profile, + runner::Runner, +}; +use std::collections::HashMap; -pub fn get_build_wivrn_runner(profile: Profile) -> Runner { - let mut args = vec![ - profile.xrservice_path, - profile.prefix, - match profile.pull_on_build { - true => "1".into(), - false => "0".into(), +pub fn get_build_wivrn_runners(profile: &Profile) -> Vec { + let mut runners: Vec = vec![]; + let git = Git { + repo: match profile.xrservice_repo.as_ref() { + Some(r) => r.clone(), + None => "https://github.com/Meumeu/WiVRn".into(), }, - ]; - if profile.xrservice_repo.is_some() { - args.push(profile.xrservice_repo.unwrap()); - } - let runner = Runner::new( - None, - format!("{sysdata}/scripts/build_wivrn.sh", sysdata = pkg_data_dir()), - args, - ); - runner + dir: profile.xrservice_path.clone(), + }; + match git.clone_or_pull(profile) { + Some(r) => runners.push(r), + None => {} + }; + + 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()); + cmake_vars.insert("WIVRN_BUILD_CLIENT".into(), "OFF".into()); + cmake_vars.insert("CMAKE_INSTALL_PREFIX".into(), profile.prefix.clone()); + + let cmake = Cmake { + env: None, + vars: Some(cmake_vars), + source_dir: profile.xrservice_path.clone(), + build_dir, + }; + runners.push(cmake.get_prepare_runner()); + runners.push(cmake.get_build_runner()); + runners.push(cmake.get_install_runner()); + + runners } diff --git a/src/ui/app.rs b/src/ui/app.rs index dc5d3b6..760ad96 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -4,11 +4,11 @@ use super::debug_view::{DebugView, DebugViewMsg}; use super::libsurvive_setup_window::LibsurviveSetupWindow; use super::main_view::MainViewMsg; use crate::builders::build_basalt::get_build_basalt_runner; -use crate::builders::build_libsurvive::get_build_libsurvive_runner; +use crate::builders::build_libsurvive::get_build_libsurvive_runners; use crate::builders::build_mercury::get_build_mercury_runner; -use crate::builders::build_monado::get_build_monado_runner; -use crate::builders::build_opencomposite::get_build_opencomposite_runner; -use crate::builders::build_wivrn::get_build_wivrn_runner; +use crate::builders::build_monado::get_build_monado_runners; +use crate::builders::build_opencomposite::get_build_opencomposite_runners; +use crate::builders::build_wivrn::get_build_wivrn_runners; use crate::config::Config; use crate::constants::APP_NAME; use crate::depcheck::check_dependency; @@ -346,11 +346,13 @@ impl SimpleComponent for App { RunnerStatus::Stopped(_) => {} RunnerStatus::Running => { if self.xrservice_runner.is_some() { - if self.xrservice_runner.as_mut().unwrap().status() == RunnerStatus::Running { + if self.xrservice_runner.as_mut().unwrap().status() + == RunnerStatus::Running + { self.xrservice_runner.as_mut().unwrap().terminate(); } } - }, + } }, } self.start_xrservice(); @@ -367,23 +369,23 @@ impl SimpleComponent for App { }); if profile.features.libsurvive.enabled { missing_deps.extend(get_missing_libsurvive_deps()); - runners.push(get_build_libsurvive_runner(profile.clone())); + runners.extend(get_build_libsurvive_runners(&profile)); } if profile.features.basalt.enabled { missing_deps.extend(get_missing_basalt_deps()); - runners.push(get_build_basalt_runner(profile.clone())); + runners.push(get_build_basalt_runner(&profile)); } if profile.features.mercury_enabled { missing_deps.extend(get_missing_mercury_deps()); - runners.push(get_build_mercury_runner(profile.clone())); + runners.push(get_build_mercury_runner(&profile)); } - runners.push(match profile.xrservice_type { - XRServiceType::Monado => get_build_monado_runner(profile.clone()), - XRServiceType::Wivrn => get_build_wivrn_runner(profile.clone()), + runners.extend(match profile.xrservice_type { + XRServiceType::Monado => get_build_monado_runners(&profile), + XRServiceType::Wivrn => get_build_wivrn_runners(&profile), }); // no listed deps for opencomp } - runners.push(get_build_opencomposite_runner(profile.clone())); + runners.extend(get_build_opencomposite_runners(&profile)); if !missing_deps.is_empty() { missing_deps.sort_unstable(); missing_deps.dedup(); // dedup only works if sorted, hence the above