smap: init at 0.1.12 (#371402)
[NixPkgs.git] / pkgs / applications / audio / sonic-pi / default.nix
blob9a45ba77ca6a4916ee001ea53fb0750dfbf30571
2   stdenv,
3   lib,
4   fetchFromGitHub,
5   wrapQtAppsHook,
6   makeDesktopItem,
7   copyDesktopItems,
8   cmake,
9   pkg-config,
10   catch2_3,
11   qtbase,
12   qtsvg,
13   qttools,
14   qwt,
15   qscintilla,
16   kissfftFloat,
17   crossguid,
18   reproc,
19   platform-folders,
20   ruby,
21   erlang,
22   elixir,
23   beamPackages,
24   alsa-lib,
25   rtmidi,
26   boost,
27   aubio,
28   jack2,
29   jack-example-tools,
30   pipewire,
31   supercollider-with-sc3-plugins,
32   parallel,
34   withTauWidget ? false,
35   qtwebengine,
37   withImGui ? false,
38   gl3w,
39   SDL2,
40   fmt,
43 stdenv.mkDerivation rec {
44   pname = "sonic-pi";
45   version = "4.5.1";
47   src = fetchFromGitHub {
48     owner = "sonic-pi-net";
49     repo = pname;
50     rev = "v${version}";
51     hash = "sha256-JMextQY0jLShWmqRQoVAbqIzDhA1mOzI7vfsG7+jjX0=";
52   };
54   mixFodDeps = beamPackages.fetchMixDeps {
55     inherit version;
56     pname = "mix-deps-${pname}";
57     mixEnv = "test";
58     src = "${src}/app/server/beam/tau";
59     hash = "sha256-7wqFI3f0CRVrXK2IUguqHNANwKMmTak/Xh9nr624TXc=";
60   };
62   strictDeps = true;
64   nativeBuildInputs = [
65     wrapQtAppsHook
66     copyDesktopItems
67     cmake
68     pkg-config
69     ruby
70     erlang
71     elixir
72     beamPackages.hex
73   ];
75   buildInputs =
76     [
77       qtbase
78       qtsvg
79       qttools
80       qwt
81       qscintilla
82       kissfftFloat
83       catch2_3
84       crossguid
85       reproc
86       platform-folders
87       ruby
88       alsa-lib
89       rtmidi
90       boost
91       aubio
92     ]
93     ++ lib.optionals withTauWidget [
94       qtwebengine
95     ]
96     ++ lib.optionals withImGui [
97       gl3w
98       SDL2
99       fmt
100     ];
102   nativeCheckInputs = [
103     parallel
104     supercollider-with-sc3-plugins
105     jack2
106   ];
108   cmakeFlags = [
109     "-DUSE_SYSTEM_LIBS=ON"
110     "-DBUILD_IMGUI_INTERFACE=${if withImGui then "ON" else "OFF"}"
111     "-DWITH_QT_GUI_WEBENGINE=${if withTauWidget then "ON" else "OFF"}"
112     "-DAPP_INSTALL_ROOT=${placeholder "out"}/app"
113   ];
115   doCheck = true;
117   postPatch = ''
118     # Fix shebangs on files in app and bin scripts
119     patchShebangs app bin
120   '';
122   preConfigure = ''
123     # Set build environment
124     export SONIC_PI_HOME="$TMPDIR/spi"
126     export HEX_HOME="$TEMPDIR/hex"
127     export HEX_OFFLINE=1
128     export MIX_REBAR3='${beamPackages.rebar3}/bin/rebar3'
129     export REBAR_GLOBAL_CONFIG_DIR="$TEMPDIR/rebar3"
130     export REBAR_CACHE_DIR="$TEMPDIR/rebar3.cache"
131     export MIX_HOME="$TEMPDIR/mix"
132     export MIX_DEPS_PATH="$TEMPDIR/deps"
133     export MIX_ENV=prod
135     # Copy Mix dependency sources
136     echo 'Copying ${mixFodDeps} to Mix deps'
137     cp --no-preserve=mode -R '${mixFodDeps}' "$MIX_DEPS_PATH"
139     # Change to project base directory
140     cd app
142     # Prebuild Ruby vendored dependencies and Qt docs
143     ./linux-prebuild.sh -o
144   '';
146   postBuild = ''
147     # Build BEAM server
148     ../linux-post-tau-prod-release.sh -o
149   '';
151   checkPhase = ''
152     runHook preCheck
154     # BEAM tests
155     pushd ../server/beam/tau
156       MIX_ENV=test TAU_ENV=test mix test
157     popd
159     # Ruby tests
160     pushd ../server/ruby
161       rake test
162     popd
164     # API tests
165     pushd api-tests
166       # run JACK parallel to tests and quit both when one exits
167       SONIC_PI_ENV=test parallel --no-notice -j2 --halt now,done=1 ::: 'jackd -rd dummy' 'ctest --verbose'
168     popd
170     runHook postCheck
171   '';
173   installPhase = ''
174     runHook preInstall
176     # Run Linux release script
177     ../linux-release.sh
179     # Copy dist directory to output
180     mkdir $out
181     cp -r linux_dist/* $out/
183     # Copy icon
184     install -Dm644 ../gui/qt/images/icon-smaller.png $out/share/icons/hicolor/256x256/apps/sonic-pi.png
186     runHook postInstall
187   '';
189   # $out/bin/sonic-pi is a shell script, and wrapQtAppsHook doesn't wrap them.
190   dontWrapQtApps = true;
191   preFixup = ''
192     # Wrap Qt GUI (distributed binary)
193     wrapQtApp $out/bin/sonic-pi \
194       --prefix PATH : ${
195         lib.makeBinPath [
196           ruby
197           supercollider-with-sc3-plugins
198           jack2
199           jack-example-tools
200           pipewire.jack
201         ]
202       }
204     # If ImGui was built
205     if [ -e $out/app/build/gui/imgui/sonic-pi-imgui ]; then
206       # Wrap ImGui into bin
207       makeWrapper $out/app/build/gui/imgui/sonic-pi-imgui $out/bin/sonic-pi-imgui \
208         --inherit-argv0 \
209         --prefix PATH : ${
210           lib.makeBinPath [
211             ruby
212             supercollider-with-sc3-plugins
213             jack2
214             jack-example-tools
215             pipewire.jack
216           ]
217         }
218     fi
220     # Remove runtime Erlang references
221     for file in $(grep -FrIl '${erlang}/lib/erlang' $out/app/server/beam/tau); do
222       substituteInPlace "$file" --replace '${erlang}/lib/erlang' $out/app/server/beam/tau/_build/prod/rel/tau
223     done
224   '';
226   stripDebugList = [
227     "app"
228     "bin"
229   ];
231   desktopItems = [
232     (makeDesktopItem {
233       name = "sonic-pi";
234       exec = "sonic-pi";
235       icon = "sonic-pi";
236       desktopName = "Sonic Pi";
237       comment = meta.description;
238       categories = [
239         "Audio"
240         "AudioVideo"
241         "Education"
242       ];
243     })
244   ];
246   passthru.updateScript = ./update.sh;
248   meta = with lib; {
249     homepage = "https://sonic-pi.net/";
250     description = "Free live coding synth for everyone originally designed to support computing and music lessons within schools";
251     license = licenses.mit;
252     maintainers = with maintainers; [
253       Phlogistique
254       kamilchm
255       c0deaddict
256       sohalt
257     ];
258     platforms = platforms.linux;
259   };