diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c585357..5b358e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - uses: cachix/install-nix-action@v16 with: nix_path: nixpkgs=channel:nixos-unstable - - run: nix flake check --no-update-lock-file + - run: nix flake check --no-update-lock-file --all-systems # Checks the nix formatting. template-fmt-check: diff --git a/flake.lock b/flake.lock index 1735d42..28d0463 100644 --- a/flake.lock +++ b/flake.lock @@ -3,31 +3,30 @@ "dirt-samples-src": { "flake": false, "locked": { - "lastModified": 1667426233, - "narHash": "sha256-Zl2bi9QofcrhU63eMtg+R6lhV9ExQS/0XNTJ+oq65Uo=", + "lastModified": 1698439458, + "narHash": "sha256-Mp8qBpsOvW9Zguv95Kv7EU6S3ICaF2aO02Wz6xGURtE=", "owner": "tidalcycles", "repo": "dirt-samples", - "rev": "92f2145e661b397e62ca0ff3965819e7c7db0dad", + "rev": "9a6dff8f9ec3cd55b287290cf04e01afa6b8f532", "type": "github" }, "original": { "owner": "tidalcycles", - "ref": "master", "repo": "dirt-samples", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1693844670, - "narHash": "sha256-t69F2nBB8DNQUWHD809oJZJVE+23XBrth4QZuVd6IE0=", - "owner": "NixOS", + "lastModified": 1722813957, + "narHash": "sha256-IAoYyYnED7P8zrBFMnmp7ydaJfwTnwcnqxUElC1I26Y=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "3c15feef7770eb5500a4b8792623e2d6f598c9c1", + "rev": "cb9a96f23c491c081b38eab96d22fa958043c9fa", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -39,7 +38,6 @@ "nixpkgs": "nixpkgs", "superdirt-src": "superdirt-src", "tidal-src": "tidal-src", - "utils": "utils", "vim-tidal-src": "vim-tidal-src", "vowel-src": "vowel-src" } @@ -47,83 +45,48 @@ "superdirt-src": { "flake": false, "locked": { - "lastModified": 1611740180, - "narHash": "sha256-GtnqZeMFqFkVhgx2Exu0wY687cHa7mNnVCgjQd6fiIA=", + "lastModified": 1697377840, + "narHash": "sha256-9qU9CHYAXbN1IE3xXDqGipuroifVaSVXj3c/cDfwM80=", "owner": "musikinformatik", "repo": "superdirt", - "rev": "7abb62e89649daa1232b9cbd6427241868abd30e", + "rev": "c7f32998572984705d340e7c1b9ed9ad998a39b6", "type": "github" }, "original": { "owner": "musikinformatik", - "ref": "master", "repo": "superdirt", "type": "github" } }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "tidal-src": { "flake": false, "locked": { - "lastModified": 1654350756, - "narHash": "sha256-tONM5SYYBca0orTLH1EUOilSC1FCluWrFt8AetUx+YQ=", + "lastModified": 1712519522, + "narHash": "sha256-LbvxQmVxHElidCgvt+w0g1k+QQbNLebK46vtRCgsLeQ=", "owner": "tidalcycles", "repo": "tidal", - "rev": "fda9c1ecb3722698935245e5409ef8ccdfca16c8", + "rev": "88f09edf6bef2228d5f530dea872b08a9d803066", "type": "github" }, "original": { "owner": "tidalcycles", - "ref": "main", + "ref": "v1.9.5", "repo": "tidal", "type": "github" } }, - "utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1692799911, - "narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "vim-tidal-src": { "flake": false, "locked": { - "lastModified": 1664252474, - "narHash": "sha256-hleiK2Q7xYndpB+tIbyyXIM2sk4NunUh9DPgMqmf/Wc=", + "lastModified": 1685703852, + "narHash": "sha256-8gyk17YLeKpLpz3LRtxiwbpsIbZka9bb63nK5/9IUoA=", "owner": "tidalcycles", "repo": "vim-tidal", - "rev": "b07f5c12986fb837e055d7fcf0acf3b7e248148f", + "rev": "e440fe5bdfe07f805e21e6872099685d38e8b761", "type": "github" }, "original": { "owner": "tidalcycles", - "ref": "master", "repo": "vim-tidal", "type": "github" } @@ -140,7 +103,6 @@ }, "original": { "owner": "supercollider-quarks", - "ref": "master", "repo": "vowel", "type": "github" } diff --git a/flake.nix b/flake.nix index d861428..8e1d39a 100644 --- a/flake.nix +++ b/flake.nix @@ -4,207 +4,93 @@ ''; inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + + # Non-flake source. dirt-samples-src = { - url = "github:tidalcycles/dirt-samples/master"; + url = "github:tidalcycles/dirt-samples"; flake = false; }; - utils = { - url = "github:numtide/flake-utils"; - }; - nixpkgs = { - url = "github:NixOS/nixpkgs/nixos-unstable"; - }; superdirt-src = { - url = "github:musikinformatik/superdirt/master"; # use `develop` branch as its default? + url = "github:musikinformatik/superdirt"; flake = false; }; tidal-src = { - url = "github:tidalcycles/tidal/main"; + url = "github:tidalcycles/tidal/v1.9.5"; flake = false; }; vim-tidal-src = { - url = "github:tidalcycles/vim-tidal/master"; + url = "github:tidalcycles/vim-tidal"; flake = false; }; vowel-src = { - url = "github:supercollider-quarks/vowel/master"; + url = "github:supercollider-quarks/vowel"; flake = false; }; }; - outputs = inputs: let - # TODO: We should support darwin (macOS) here, supercollider package - # currently lacks support. - utils.supportedSystems = [ - "aarch64-linux" - "i686-linux" - "x86_64-linux" - # "aarch64-darwin" - # "x86_64-darwin" - ]; - utils.eachSupportedSystem = - inputs.utils.lib.eachSystem utils.supportedSystems; - - mkPackages = pkgs: let - quarklib = pkgs.callPackage ./quark/lib.nix {}; - ghcWithTidal = pkgs.haskellPackages.ghcWithPackages (p: [p.tidal]); - in rec { - # SuperCollider quarks that are necessary for Tidal. - dirt-samples = quarklib.mkQuark { - name = "Dirt-Samples"; - src = inputs.dirt-samples-src; - }; - vowel = quarklib.mkQuark { - name = "Vowel"; - src = inputs.vowel-src; - }; - superdirt = quarklib.mkQuark { - name = "SuperDirt"; - src = inputs.superdirt-src; - dependencies = [dirt-samples vowel]; - }; - - # Supercollider with the SC3 plugins used by tidal. - supercollider = pkgs.supercollider-with-plugins.override { - plugins = [pkgs.supercolliderPlugins.sc3-plugins]; - }; - - # A sclang command with superdirt included via conf yaml. - sclang-with-superdirt = pkgs.writeShellApplication { - name = "sclang-with-superdirt"; - runtimeInputs = [supercollider]; - text = '' - ${supercollider}/bin/sclang -l "${superdirt}/sclang_conf.yaml" "$@" - ''; - }; - - # A very simple default superdirt start file. - superdirt-start-sc = pkgs.writeText "superdirt-start.sc" "SuperDirt.start;"; - - # Run `SuperDirt.start` in supercollider, ready for tidal. - superdirt-start = pkgs.writeShellApplication { - name = "superdirt-start"; - runtimeInputs = [supercollider]; - text = '' - start_script="''${1:-${superdirt-start-sc}}" - - if [ "$start_script" == "-h" ] || [ "$start_script" == "--help" ]; then - echo "Usage: superdirt-start [script]" - echo - echo "Start superdirt, optionally running a custom start script." - echo - echo "Options:" - echo " -h --help Show this screen." - exit - fi - - if [ ! -e "$start_script" ]; then - echo "The script \"$start_script\" does not exist, aborting." - exit 1 - fi - - ${sclang-with-superdirt}/bin/sclang-with-superdirt "$start_script" - ''; + outputs = + inputs: + let + # TODO: We should support darwin (macOS) here, supercollider package + # currently lacks support. + systems = [ + "aarch64-linux" + "i686-linux" + "x86_64-linux" + # "aarch64-darwin" + # "x86_64-darwin" + ]; + + overlays = [ inputs.self.overlays.default ]; + + perSystemPkgs = + f: + inputs.nixpkgs.lib.genAttrs systems ( + system: f (import inputs.nixpkgs { inherit overlays system; }) + ); + in + { + overlays = { + tidal = import ./overlay.nix { + inherit (inputs) + dirt-samples-src + superdirt-src + tidal-src + vim-tidal-src + vowel-src + ; + }; + default = inputs.self.overlays.tidal; }; - # Installs SuperDirt under your user's supercollider quarks. - superdirt-install = pkgs.writeShellScriptBin "superdirt-install" '' - ${supercollider}/bin/sclang ${superdirt}/install.scd - ''; - - # Run the tidal interpreter (ghci running BootTidal.hs). - tidal = pkgs.writeShellScriptBin "tidal" '' - ${ghcWithTidal}/bin/ghci -ghci-script ${inputs.tidal-src}/BootTidal.hs - ''; - - # Vim plugin for tidalcycles. - vim-tidal = pkgs.vimUtils.buildVimPluginFrom2Nix { - pname = "vim-tidal"; - version = "master"; - src = inputs.vim-tidal-src; - postInstall = let - # A vimscript file to set Nix defaults for ghci and `BootTidal.hs`. - defaults-file = pkgs.writeText "vim-tidal-defaults.vim" '' - " Prepend defaults provided by Nix packages. - if !exists("g:tidal_ghci") - let g:tidal_ghci = "${ghcWithTidal}/bin/ghci" - endif - if !exists("g:tidal_sclang") - let g:tidal_sclang = "${sclang-with-superdirt}/bin/sclang-with-superdirt" - endif - if !exists("g:tidal_boot_fallback") - let g:tidal_boot_fallback = "${inputs.tidal-src}/BootTidal.hs" - endif - if !exists("g:tidal_sc_boot_fallback") - let g:tidal_sc_boot_fallback = "${superdirt-start-sc}" - endif + packages = perSystemPkgs (pkgs: { + ghcWithTidal = pkgs.ghcWithTidal; + supercollider = pkgs.supercollider-with-sc3-plugins; + sclang-with-superdirt = pkgs.sclang-with-superdirt; + superdirt-start-sc = pkgs.superdirt-start-sc; + superdirt-start = pkgs.superdirt-start; + superdirt-install = pkgs.superdirt-install; + tidal = pkgs.tidal; + vim-tidal = pkgs.vimPlugins.vim-tidal; + default = inputs.self.packages.${pkgs.system}.tidal; + }); + + devShells = perSystemPkgs (pkgs: { + tidal = pkgs.callPackage ./shell.nix { }; + default = inputs.self.devShells.${pkgs.system}.tidal; + }); + + templates = { + tidal-project = { + path = ./template; + description = '' + A standard nix flake template for a Tidal Cycles project. ''; - in '' - # Prepend a line to `plugin/tidal.vim` to source the defaults. - mv $out/plugin/tidal.vim $out/plugin/tidal.vim.old - cat ${defaults-file} $out/plugin/tidal.vim.old > $out/plugin/tidal.vim - rm $out/plugin/tidal.vim.old - - # Remove unnecessary files. - rm -r $out/bin - rm $out/Makefile - rm $out/Tidal.ghci - ''; - meta = { - homepage = "https://github.com/tidalcycles/vim-tidal.vim"; - license = pkgs.lib.licenses.mit; }; + default = inputs.self.templates.tidal-project; }; - }; - overlays = rec { - tidal = final: prev: let - tidalpkgs = mkPackages prev; - in { - inherit (tidalpkgs) superdirt-start superdirt-install tidal sclang-with-superdirt; - vimPlugins = prev.vimPlugins // {inherit (tidalpkgs) vim-tidal;}; - }; - default = tidal; + formatter = perSystemPkgs (pkgs: pkgs.nixfmt-rfc-style); }; - - mkDevShells = pkgs: tidalpkgs: rec { - # A shell that provides a set of commonly useful packages for tidal. - tidal = pkgs.mkShell { - name = "tidal"; - buildInputs = [ - tidalpkgs.supercollider - tidalpkgs.superdirt-start - tidalpkgs.superdirt-install - tidalpkgs.tidal - tidalpkgs.sclang-with-superdirt - ]; - # Convenient access to a config providing all quarks required for Tidal. - SUPERDIRT_SCLANG_CONF = "${tidalpkgs.superdirt}/sclang_conf.yaml"; - }; - default = tidal; - }; - - templates = rec { - tidal-project = { - path = ./template; - description = '' - A standard nix flake template for a Tidal Cycles project. - ''; - }; - default = tidal-project; - }; - - mkOutput = system: let - pkgs = inputs.nixpkgs.legacyPackages.${system}; - in rec { - packages = mkPackages pkgs; - devShells = mkDevShells pkgs packages; - formatter = pkgs.alejandra; - }; - - # The output for each system. - systemOutputs = utils.eachSupportedSystem mkOutput; - in - # Merge the outputs and overlays. - systemOutputs // {inherit overlays templates utils;}; } diff --git a/overlay.nix b/overlay.nix new file mode 100644 index 0000000..1390570 --- /dev/null +++ b/overlay.nix @@ -0,0 +1,49 @@ +{ + dirt-samples-src, + superdirt-src, + tidal-src, + vim-tidal-src, + vowel-src, +}: +final: prev: { + # Short-hand for GHC with the tidal pkg. + ghcWithTidal = prev.haskellPackages.ghcWithPackages (p: [ p.tidal ]); + # A fn to create a supercollider quark derivation. + mkQuark = prev.callPackage ./pkgs/mkQuark.nix { }; + # The set of required supercollider quarks. + supercolliderQuarks = { + dirt-samples = final.mkQuark { + name = "Dirt-Samples"; + src = dirt-samples-src; + }; + vowel = final.mkQuark { + name = "Vowel"; + src = vowel-src; + }; + superdirt = final.mkQuark { + name = "SuperDirt"; + src = superdirt-src; + dependencies = with final.supercolliderQuarks; [ + dirt-samples + vowel + ]; + }; + }; + # A sclang command with superdirt included via conf yaml. + sclang-with-superdirt = final.callPackage ./pkgs/sclang-with-superdirt.nix { }; + # A very simple default superdirt start file. + superdirt-start-sc = prev.writeText "superdirt-start.sc" "SuperDirt.start;"; + # Run `SuperDirt.start` in supercollider, ready for tidal. + superdirt-start = final.callPackage ./pkgs/superdirt-start.nix { }; + # Installs SuperDirt under your user's supercollider quarks. + superdirt-install = final.callPackage ./pkgs/superdirt-install.nix { }; + # Run the tidal interpreter (ghci running BootTidal.hs). + tidal = final.callPackage ./pkgs/tidal.nix { src = tidal-src; }; + # The vim tidal plugin tweaked for nix. + vimPlugins = prev.vimPlugins // { + vim-tidal = final.callPackage ./pkgs/vim-tidal.nix { + inherit tidal-src; + src = vim-tidal-src; + }; + }; +} diff --git a/patch/vim-tidal-ghci.patch b/patch/vim-tidal-ghci.patch deleted file mode 100644 index c31013b..0000000 --- a/patch/vim-tidal-ghci.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/plugin/tidal.vim b/plugin/tidal.vim -index 51c7e4e..d4b6461 100644 ---- a/plugin/tidal.vim -+++ b/plugin/tidal.vim -@@ -33,7 +33,7 @@ if !exists("g:tidal_flash_duration") - endif - - if !exists("g:tidal_ghci") -- let g:tidal_ghci = "ghci" -+ let g:tidal_ghci = "tidal" - endif - - if filereadable(s:parent_path . "/.dirt-samples") diff --git a/pkgs/mkQuark.nix b/pkgs/mkQuark.nix new file mode 100644 index 0000000..7245c9b --- /dev/null +++ b/pkgs/mkQuark.nix @@ -0,0 +1,57 @@ +# Collection of functions to assist with packaging of supercollider quarks. +{ lib, stdenv }: +# A function that, given a Quark source location and its name, creates a +# derivation for the quark installed in an expected location. +# +# The resulting quark contains: +# - `quark` subdirectory, containing the quark itself along with symbolic +# links to each of its dependencies. +# - a `install.scd` file that can be used to install the Quark imperatively. +# - a `sclang_conf.yaml` that can be used to provide the quark and its +# dependencies directly to an interpreter. +# +# TODO: Currently, we assume that the dependency graph is a "tree". The +# reality is that it might be a directed, acyclic graph. We should treat it +# as such and work out if dependencies we require already exist in the link +# tree. Use `lib.lists.listDfs` or `lib.lists.toposort`. +{ + src, + name, + dependencies ? [ ], +}: +stdenv.mkDerivation rec { + inherit name src; + installPhase = + let + # A function for creating links to depenencies in $out/quark. + ln-dep = dep: '' + ln -s ${dep}/quark/* $out/quark/ + ''; + ln-deps = lib.concatStrings (map ln-dep dependencies); + + # Write a `sc` file that can be used to install the quark imperatively. + # TODO: Don't clear all quarks - only remove any with matching ${name}. + install-scd = '' + Quarks.clear; + Quarks.install(\"$out\"); + thisProcess.recompile(); + ''; + + # Write a yaml config file with an entry for this quark. + sclang-conf-yaml = '' + includePaths: + - $out/quark + excludePaths: + [] + postInlineWarnings: false + excludeDefaultPaths: false\ + ''; + in + '' + mkdir -p $out/quark/${name} + cp -r ./* $out/quark/${name} + ${ln-deps} + echo "${install-scd}" >> $out/install.scd + echo "${sclang-conf-yaml}" >> $out/sclang_conf.yaml + ''; +} diff --git a/pkgs/sclang-with-superdirt.nix b/pkgs/sclang-with-superdirt.nix new file mode 100644 index 0000000..55e87d9 --- /dev/null +++ b/pkgs/sclang-with-superdirt.nix @@ -0,0 +1,17 @@ +# A sclang command with superdirt included via conf yaml. +{ + supercollider-with-sc3-plugins, + supercolliderQuarks, + writeShellApplication, +}: +let + supercollider = supercollider-with-sc3-plugins; + superdirt = supercolliderQuarks.superdirt; +in +writeShellApplication { + name = "sclang-with-superdirt"; + runtimeInputs = [ supercollider-with-sc3-plugins ]; + text = '' + ${supercollider}/bin/sclang -l "${superdirt}/sclang_conf.yaml" "$@" + ''; +} diff --git a/pkgs/superdirt-install.nix b/pkgs/superdirt-install.nix new file mode 100644 index 0000000..56508fd --- /dev/null +++ b/pkgs/superdirt-install.nix @@ -0,0 +1,9 @@ +# Installs SuperDirt under your user's supercollider quarks. +{ + supercolliderQuarks, + supercollider-with-sc3-plugins, + writeShellScriptBin, +}: +writeShellScriptBin "superdirt-install" '' + ${supercollider-with-sc3-plugins}/bin/sclang ${supercolliderQuarks.superdirt}/install.scd +'' diff --git a/pkgs/superdirt-start.nix b/pkgs/superdirt-start.nix new file mode 100644 index 0000000..fc20e0c --- /dev/null +++ b/pkgs/superdirt-start.nix @@ -0,0 +1,31 @@ +# Run `SuperDirt.start` in supercollider, ready for tidal. +{ + sclang-with-superdirt, + supercollider-with-sc3-plugins, + superdirt-start-sc, + writeShellApplication, +}: +writeShellApplication { + name = "superdirt-start"; + runtimeInputs = [ supercollider-with-sc3-plugins ]; + text = '' + start_script="''${1:-${superdirt-start-sc}}" + + if [ "$start_script" == "-h" ] || [ "$start_script" == "--help" ]; then + echo "Usage: superdirt-start [script]" + echo + echo "Start superdirt, optionally running a custom start script." + echo + echo "Options:" + echo " -h --help Show this screen." + exit + fi + + if [ ! -e "$start_script" ]; then + echo "The script \"$start_script\" does not exist, aborting." + exit 1 + fi + + ${sclang-with-superdirt}/bin/sclang-with-superdirt "$start_script" + ''; +} diff --git a/pkgs/tidal.nix b/pkgs/tidal.nix new file mode 100644 index 0000000..7788e8e --- /dev/null +++ b/pkgs/tidal.nix @@ -0,0 +1,9 @@ +# Run the tidal interpreter (ghci running BootTidal.hs). +{ + ghcWithTidal, + src, + writeShellScriptBin, +}: +writeShellScriptBin "tidal" '' + ${ghcWithTidal}/bin/ghci -ghci-script ${src}/BootTidal.hs +'' diff --git a/pkgs/vim-tidal.nix b/pkgs/vim-tidal.nix new file mode 100644 index 0000000..99c3153 --- /dev/null +++ b/pkgs/vim-tidal.nix @@ -0,0 +1,49 @@ +{ + ghcWithTidal, + lib, + sclang-with-superdirt, + src, + superdirt-start-sc, + tidal-src, + vimUtils, + writeText, +}: +vimUtils.buildVimPlugin { + inherit src; + pname = "vim-tidal"; + version = "master"; + postInstall = + let + # A vimscript file to set Nix defaults for ghci and `BootTidal.hs`. + defaults-file = writeText "vim-tidal-defaults.vim" '' + " Prepend defaults provided by Nix packages. + if !exists("g:tidal_ghci") + let g:tidal_ghci = "${ghcWithTidal}/bin/ghci" + endif + if !exists("g:tidal_sclang") + let g:tidal_sclang = "${sclang-with-superdirt}/bin/sclang-with-superdirt" + endif + if !exists("g:tidal_boot_fallback") + let g:tidal_boot_fallback = "${tidal-src}/BootTidal.hs" + endif + if !exists("g:tidal_sc_boot_fallback") + let g:tidal_sc_boot_fallback = "${superdirt-start-sc}" + endif + ''; + in + '' + # Prepend a line to `plugin/tidal.vim` to source the defaults. + mv $out/plugin/tidal.vim $out/plugin/tidal.vim.old + cat ${defaults-file} $out/plugin/tidal.vim.old > $out/plugin/tidal.vim + rm $out/plugin/tidal.vim.old + + # Remove unnecessary files. + rm -r $out/bin + rm $out/Makefile + rm $out/Tidal.ghci + ''; + meta = { + homepage = "https://github.com/tidalcycles/vim-tidal"; + license = lib.licenses.mit; + }; +} diff --git a/quark/lib.nix b/quark/lib.nix deleted file mode 100644 index ba571be..0000000 --- a/quark/lib.nix +++ /dev/null @@ -1,59 +0,0 @@ -# Collection of functions to assist with packaging of supercollider quarks. -{ - lib, - stdenv, -}: { - # A function that, given a Quark source location and its name, creates a - # derivation for the quark installed in an expected location. - # - # The resulting quark contains: - # - `quark` subdirectory, containing the quark itself along with symbolic - # links to each of its dependencies. - # - a `install.scd` file that can be used to install the Quark imperatively. - # - a `sclang_conf.yaml` that can be used to provide the quark and its - # dependencies directly to an interpreter. - # - # TODO: Currently, we assume that the dependency graph is a "tree". The - # reality is that it might be a directed, acyclic graph. We should treat it - # as such and work out if dependencies we require already exist in the link - # tree. Use `lib.lists.listDfs` or `lib.lists.toposort`. - mkQuark = { - src, - name, - dependencies ? [], - }: - stdenv.mkDerivation rec { - inherit name src; - installPhase = let - # A function for creating links to depenencies in $out/quark. - ln-dep = dep: '' - ln -s ${dep}/quark/* $out/quark/ - ''; - ln-deps = lib.concatStrings (map ln-dep dependencies); - - # Write a `sc` file that can be used to install the quark imperatively. - # TODO: Don't clear all quarks - only remove any with matching ${name}. - install-scd = '' - Quarks.clear; - Quarks.install(\"$out\"); - thisProcess.recompile(); - ''; - - # Write a yaml config file with an entry for this quark. - sclang-conf-yaml = '' - includePaths: - - $out/quark - excludePaths: - [] - postInlineWarnings: false - excludeDefaultPaths: false\ - ''; - in '' - mkdir -p $out/quark/${name} - cp -r ./* $out/quark/${name} - ${ln-deps} - echo "${install-scd}" >> $out/install.scd - echo "${sclang-conf-yaml}" >> $out/sclang_conf.yaml - ''; - }; -} diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..c4166b2 --- /dev/null +++ b/shell.nix @@ -0,0 +1,21 @@ +{ + mkShell, + sclang-with-superdirt, + supercollider-with-sc3-plugins, + supercolliderQuarks, + superdirt-start, + superdirt-install, + tidal, +}: +mkShell { + name = "tidal"; + buildInputs = [ + sclang-with-superdirt + supercollider-with-sc3-plugins + superdirt-start + superdirt-install + tidal + ]; + # Convenient access to a config providing all quarks required for Tidal. + SUPERDIRT_SCLANG_CONF = "${supercolliderQuarks.superdirt}/sclang_conf.yaml"; +} diff --git a/template/flake.nix b/template/flake.nix index dd1c88c..3974d13 100644 --- a/template/flake.nix +++ b/template/flake.nix @@ -3,7 +3,8 @@ inputs.tidal.url = "github:mitchmindtree/tidalcycles.nix"; - outputs = inputs: + outputs = + inputs: inputs.tidal.utils.eachSupportedSystem (system: { devShells = inputs.tidal.devShells.${system}; formatter = inputs.tidal.formatter.${system};