diff options
author | Lily Foster <lily@lily.flowers> | 2022-02-25 10:49:16 -0500 |
---|---|---|
committer | Lily Foster <lily@lily.flowers> | 2022-04-18 06:00:04 -0400 |
commit | 089f8b107ba9b3810905e54a6efaffbed0e4e38f (patch) | |
tree | 128f6ce11ddde08d8044cf4aca7e966c6526f136 /pkgs/development/interpreters | |
parent | 09f63fb46c65db37881d32afeb2913a6ce41b9b6 (diff) |
supercollider: add plugin support
Diffstat (limited to 'pkgs/development/interpreters')
3 files changed, 97 insertions, 13 deletions
diff --git a/pkgs/development/interpreters/supercollider/default.nix b/pkgs/development/interpreters/supercollider/default.nix index b3eaf5839b153..59c035dd135c0 100644 --- a/pkgs/development/interpreters/supercollider/default.nix +++ b/pkgs/development/interpreters/supercollider/default.nix @@ -1,12 +1,9 @@ -{ lib, stdenv, mkDerivation, fetchurl, cmake, pkg-config, alsa-lib -, libjack2, libsndfile, fftw, curl, gcc -, libXt, qtbase, qttools, qtwebengine +{ lib, stdenv, mkDerivation, fetchurl, cmake +, pkg-config, alsa-lib, libjack2, libsndfile, fftw +, curl, gcc, libXt, qtbase, qttools, qtwebengine , readline, qtwebsockets, useSCEL ? false, emacs }: -let - inherit (lib) optional; -in mkDerivation rec { pname = "supercollider"; version = "3.12.2"; @@ -16,6 +13,17 @@ mkDerivation rec { sha256 = "sha256-1QYorCgSwBK+SVAm4k7HZirr1j+znPmVicFmJdvO3g4="; }; + patches = [ + # add support for SC_DATA_DIR and SC_PLUGIN_DIR env vars to override compile-time values + ./supercollider-3.12.0-env-dirs.patch + ]; + + nativeBuildInputs = [ cmake pkg-config qttools ]; + + buildInputs = [ gcc libjack2 libsndfile fftw curl libXt qtbase qtwebengine qtwebsockets readline ] + ++ lib.optional (!stdenv.isDarwin) alsa-lib + ++ lib.optional useSCEL emacs; + hardeningDisable = [ "stackprotector" ]; cmakeFlags = [ @@ -23,13 +31,6 @@ mkDerivation rec { "-DSC_EL=${if useSCEL then "ON" else "OFF"}" ]; - nativeBuildInputs = [ cmake pkg-config qttools ]; - - buildInputs = [ - gcc libjack2 libsndfile fftw curl libXt qtbase qtwebengine qtwebsockets readline ] - ++ optional (!stdenv.isDarwin) alsa-lib - ++ optional useSCEL emacs; - meta = with lib; { description = "Programming language for real time audio synthesis"; homepage = "https://supercollider.github.io"; diff --git a/pkgs/development/interpreters/supercollider/supercollider-3.12.0-env-dirs.patch b/pkgs/development/interpreters/supercollider/supercollider-3.12.0-env-dirs.patch new file mode 100644 index 0000000000000..dd92028b52256 --- /dev/null +++ b/pkgs/development/interpreters/supercollider/supercollider-3.12.0-env-dirs.patch @@ -0,0 +1,65 @@ +diff --git a/common/SC_Filesystem_unix.cpp b/common/SC_Filesystem_unix.cpp +index 52dc1fd2d..aae09ed9c 100644 +--- a/common/SC_Filesystem_unix.cpp ++++ b/common/SC_Filesystem_unix.cpp +@@ -94,6 +94,10 @@ bool SC_Filesystem::isNonHostPlatformDirectoryName(const std::string& s) { + } + + Path SC_Filesystem::defaultSystemAppSupportDirectory() { ++ const char* sc_data_dir = getenv("SC_DATA_DIR"); ++ if (sc_data_dir) ++ return Path(sc_data_dir); ++ + # ifdef SC_DATA_DIR + return Path(SC_DATA_DIR); + # else +@@ -125,6 +129,10 @@ Path SC_Filesystem::defaultUserConfigDirectory() { + } + + Path SC_Filesystem::defaultResourceDirectory() { ++ const char* sc_data_dir = getenv("SC_DATA_DIR"); ++ if (sc_data_dir) ++ return Path(sc_data_dir); ++ + # ifdef SC_DATA_DIR + return Path(SC_DATA_DIR); + # else +diff --git a/server/scsynth/SC_Lib_Cintf.cpp b/server/scsynth/SC_Lib_Cintf.cpp +index f6219307e..28e13eb98 100644 +--- a/server/scsynth/SC_Lib_Cintf.cpp ++++ b/server/scsynth/SC_Lib_Cintf.cpp +@@ -178,9 +178,13 @@ void initialize_library(const char* uGensPluginPath) { + using DirName = SC_Filesystem::DirName; + + if (loadUGensExtDirs) { ++ const char* sc_plugin_dir = getenv("SC_PLUGIN_DIR"); ++ if (sc_plugin_dir) { ++ PlugIn_LoadDir(sc_plugin_dir, true); ++ } + #ifdef SC_PLUGIN_DIR + // load globally installed plugins +- if (bfs::is_directory(SC_PLUGIN_DIR)) { ++ else if (bfs::is_directory(SC_PLUGIN_DIR)) { + PlugIn_LoadDir(SC_PLUGIN_DIR, true); + } + #endif // SC_PLUGIN_DIR +diff --git a/server/supernova/server/main.cpp b/server/supernova/server/main.cpp +index b2b5adf4e..6cb8c411c 100644 +--- a/server/supernova/server/main.cpp ++++ b/server/supernova/server/main.cpp +@@ -224,8 +224,14 @@ void set_plugin_paths(server_arguments const& args, nova::sc_ugen_factory* facto + } + } + } else { ++ const char* sc_plugin_dir = getenv("SC_PLUGIN_DIR"); ++ if (sc_plugin_dir) { ++ factory->load_plugin_folder(sc_plugin_dir); ++ } + #ifdef SC_PLUGIN_DIR +- factory->load_plugin_folder(SC_PLUGIN_DIR); ++ else { ++ factory->load_plugin_folder(SC_PLUGIN_DIR); ++ } + #endif + factory->load_plugin_folder(SC_Filesystem::instance().getDirectory(DirName::Resource) / SC_PLUGIN_DIR_NAME); + factory->load_plugin_folder(SC_Filesystem::instance().getDirectory(DirName::SystemExtension)); diff --git a/pkgs/development/interpreters/supercollider/wrapper.nix b/pkgs/development/interpreters/supercollider/wrapper.nix new file mode 100644 index 0000000000000..e9e97f2b98de9 --- /dev/null +++ b/pkgs/development/interpreters/supercollider/wrapper.nix @@ -0,0 +1,18 @@ +{ symlinkJoin, makeWrapper, supercollider, plugins }: + +symlinkJoin { + name = "supercollider-with-plugins-${supercollider.version}"; + paths = [ supercollider ] ++ plugins; + + nativeBuildInputs = [ makeWrapper ]; + + postBuild = '' + for exe in $out/bin/*; do + wrapProgram $exe \ + --set SC_PLUGIN_DIR "$out/lib/SuperCollider/plugins" \ + --set SC_DATA_DIR "$out/share/SuperCollider" + done + ''; + + inherit (supercollider) pname version meta; +} |