diff --git a/pkgs/tools/audio/yabridgectl/default.nix b/pkgs/tools/audio/yabridgectl/default.nix index 4b90525e56e..6fa85cd89e8 100644 --- a/pkgs/tools/audio/yabridgectl/default.nix +++ b/pkgs/tools/audio/yabridgectl/default.nix @@ -6,7 +6,7 @@ rustPlatform.buildRustPackage rec { src = yabridge.src; sourceRoot = "source/tools/yabridgectl"; - cargoSha256 = "08j865n9vjnkc1g33lnzlj2nr3raj3av9cnvdqbkh65kr4zs4r9h"; + cargoSha256 = "1sjhani8h7ap42yqlnj05sx59jyz2h12qlm1ibv8ldxcpwps0bwy"; patches = [ ./libyabridge-from-nix-profiles.patch diff --git a/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch b/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch index 0b8fb4eacb3..e17cda6ada3 100644 --- a/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch +++ b/pkgs/tools/audio/yabridgectl/libyabridge-from-nix-profiles.patch @@ -1,64 +1,70 @@ diff --git a/tools/yabridgectl/src/config.rs b/tools/yabridgectl/src/config.rs -index fbb6b97..5499b6c 100644 +index c1c89cf..d7bd822 100644 --- a/tools/yabridgectl/src/config.rs +++ b/tools/yabridgectl/src/config.rs -@@ -20,8 +20,10 @@ use anyhow::{anyhow, Context, Result}; - use rayon::prelude::*; - use serde_derive::{Deserialize, Serialize}; - use std::collections::{BTreeMap, BTreeSet}; -+use std::env; +@@ -23,6 +23,7 @@ use std::collections::{BTreeMap, BTreeSet}; + use std::env; use std::fmt::Display; use std::fs; +use std::iter; use std::path::{Path, PathBuf}; use which::which; use xdg::BaseDirectories; -@@ -176,14 +178,15 @@ impl Config { +@@ -216,34 +217,24 @@ impl Config { } } None => { -- // Search in the two common installation locations if no path was set explicitely. -- // We'll also search through `/usr/local/lib` just in case but since we advocate -- // against isntalling yabridge there we won't list this path in the error message -- // when `libyabridge.so` can't be found. +- // Search in the system library locations and in `~/.local/share/yabridge` if no +- // path was set explicitely. We'll also search through `/usr/local/lib` just in case +- // but since we advocate against installing yabridge there we won't list this path +- // in the error message when `libyabridge-vst2.so` can't be found. - let system_path = Path::new("/usr/lib"); -- let system_path_alt = Path::new("/usr/local/lib"); + // Search through NIX_PROFILES & data home directory if no path was set explicitly. + let nix_profiles = env::var("NIX_PROFILES"); - let user_path = yabridge_directories()?.get_data_home(); -- for directory in &[system_path, system_path_alt, &user_path] { + let user_path = xdg_dirs.get_data_home(); +- let lib_directories = [ +- system_path, +- // Used on Debian based distros +- Path::new("/usr/lib/x86_64-linux-gnu"), +- // Used on Fedora +- Path::new("/usr/lib64"), +- Path::new("/usr/local/lib"), +- Path::new("/usr/local/lib/x86_64-linux-gnu"), +- Path::new("/usr/local/lib64"), +- &user_path, +- ]; + let lib_directories = nix_profiles.iter() + .flat_map(|profiles| profiles.split(' ') + .map(|profile| Path::new(profile).join("lib"))) + .chain(iter::once(user_path.clone())); + -+ for directory in lib_directories { - let candidate = directory.join(LIBYABRIDGE_NAME); - if candidate.exists() { - return Ok(candidate); -@@ -191,10 +194,9 @@ impl Config { - } - - Err(anyhow!( -- "Could not find '{}' in either '{}' or '{}'. You can override the default \ -- search path using 'yabridgectl set --path='.", -+ "Could not find '{}' through 'NIX_PROFILES' or '{}'. You can override the \ -+ default search path using 'yabridgectl set --path='.", - LIBYABRIDGE_NAME, -- system_path.display(), - user_path.display() - )) - } + let mut candidates = lib_directories +- .iter() + .map(|directory| directory.join(LIBYABRIDGE_VST2_NAME)); ++ + match candidates.find(|directory| directory.exists()) { + Some(candidate) => candidate, + _ => { + return Err(anyhow!( +- "Could not find '{}' in either '{}' or '{}'. You can override the \ +- default search path using 'yabridgectl set --path='.", ++ "Could not find '{}' through 'NIX_PROFILES' or '{}'. You can override the \ ++ default search path using 'yabridgectl set --path='.", + LIBYABRIDGE_VST2_NAME, +- system_path.display(), + user_path.display() + )); + } diff --git a/tools/yabridgectl/src/main.rs b/tools/yabridgectl/src/main.rs -index 649ce4e..0f1f0e7 100644 +index 0db1bd4..221cdd0 100644 --- a/tools/yabridgectl/src/main.rs +++ b/tools/yabridgectl/src/main.rs @@ -102,7 +102,7 @@ fn main() -> Result<()> { - .about("Path to the directory containing 'libyabridge.so'") + .about("Path to the directory containing 'libyabridge-{vst2,vst3}.so'") .long_about( - "Path to the directory containing 'libyabridge.so'. If this is \ -- not set, then yabridgectl will look in both '/usr/lib' and \ -+ not set, then yabridgectl will look through 'NIX_PROFILES' and \ + "Path to the directory containing 'libyabridge-{vst2,vst3}.so'. If this \ +- is not set, then yabridgectl will look in both '/usr/lib' and \ ++ is not set, then yabridgectl will look through 'NIX_PROFILES' and \ '~/.local/share/yabridge' by default.", ) .validator(validate_path)