codeium: 1.24.2 -> 1.30.2 (#363819)
[NixPkgs.git] / pkgs / applications / audio / zynaddsubfx / default.nix
blob77045ea36dfb6eccb1af331158a367c461c0e1b9
2   lib,
3   stdenv,
4   fetchFromGitHub,
5   callPackage,
6   fetchpatch,
8   # Required build tools
9   cmake,
10   makeWrapper,
11   pkg-config,
13   # Required dependencies
14   fftw,
15   liblo,
16   minixml,
17   zlib,
19   # Optional dependencies
20   alsaSupport ? stdenv.hostPlatform.isLinux,
21   alsa-lib,
22   dssiSupport ? false,
23   dssi,
24   ladspaH,
25   jackSupport ? true,
26   libjack2,
27   lashSupport ? false,
28   lash,
29   ossSupport ? true,
30   portaudioSupport ? true,
31   portaudio,
32   sndioSupport ? stdenv.hostPlatform.isOpenBSD,
33   sndio,
35   # Optional GUI dependencies
36   guiModule ? "off",
37   cairo,
38   fltk,
39   libGL,
40   libjpeg,
41   libX11,
42   libXpm,
43   ntk,
45   # Test dependencies
46   cxxtest,
47   ruby,
50 assert builtins.any (g: guiModule == g) [
51   "fltk"
52   "ntk"
53   "zest"
54   "off"
57 let
58   guiName =
59     {
60       "fltk" = "FLTK";
61       "ntk" = "NTK";
62       "zest" = "Zyn-Fusion";
63     }
64     .${guiModule};
66   mruby-zest = callPackage ./mruby-zest { };
68 stdenv.mkDerivation rec {
69   pname = "zynaddsubfx";
70   version = "3.0.6";
72   src = fetchFromGitHub {
73     owner = pname;
74     repo = pname;
75     rev = "refs/tags/${version}";
76     fetchSubmodules = true;
77     hash = "sha256-0siAx141DZx39facXWmKbsi0rHBNpobApTdey07EcXg=";
78   };
80   outputs = [
81     "out"
82     "doc"
83   ];
85   patches = [
86     # Lazily expand ZYN_DATADIR to fix builtin banks across updates
87     (fetchpatch {
88       url = "https://github.com/zynaddsubfx/zynaddsubfx/commit/853aa03f4f92a180b870fa62a04685d12fca55a7.patch";
89       hash = "sha256-4BsRZ9keeqKopr6lCQJznaZ3qWuMgD1/mCrdMiskusg=";
90     })
91   ];
93   postPatch = ''
94     patchShebangs rtosc/test/test-port-checker.rb src/Tests/check-ports.rb
95   '';
97   nativeBuildInputs = [
98     cmake
99     makeWrapper
100     pkg-config
101   ];
103   buildInputs =
104     [
105       fftw
106       liblo
107       minixml
108       zlib
109     ]
110     ++ lib.optionals alsaSupport [ alsa-lib ]
111     ++ lib.optionals dssiSupport [
112       dssi
113       ladspaH
114     ]
115     ++ lib.optionals jackSupport [ libjack2 ]
116     ++ lib.optionals lashSupport [ lash ]
117     ++ lib.optionals portaudioSupport [ portaudio ]
118     ++ lib.optionals sndioSupport [ sndio ]
119     ++ lib.optionals (guiModule == "fltk") [
120       fltk
121       libjpeg
122       libXpm
123     ]
124     ++ lib.optionals (guiModule == "ntk") [
125       ntk
126       cairo
127       libXpm
128     ]
129     ++ lib.optionals (guiModule == "zest") [
130       libGL
131       libX11
132     ];
134   cmakeFlags =
135     [
136       "-DGuiModule=${guiModule}"
137       "-DZYN_DATADIR=${placeholder "out"}/share/zynaddsubfx"
138     ]
139     # OSS library is included in glibc.
140     # Must explicitly disable if support is not wanted.
141     ++ lib.optional (!ossSupport) "-DOssEnable=OFF"
142     # Find FLTK without requiring an OpenGL library in buildInputs
143     ++ lib.optional (guiModule == "fltk") "-DFLTK_SKIP_OPENGL=ON";
145   CXXFLAGS = [
146     # GCC 13: error: 'uint8_t' does not name a type
147     "-include cstdint"
148   ];
150   doCheck = true;
151   nativeCheckInputs = [
152     cxxtest
153     ruby
154   ];
156   # TODO: Update cmake hook to make it simpler to selectively disable cmake tests: #113829
157   checkPhase =
158     let
159       disabledTests =
160         # PortChecker is non-deterministic. It's fixed in the master
161         # branch, but backporting would require an update to rtosc, so
162         # we'll just disable it until the next release.
163         [ "PortChecker" ]
165         # Tests fail on aarch64
166         ++ lib.optionals stdenv.hostPlatform.isAarch64 [
167           "MessageTest"
168           "UnisonTest"
169         ];
170     in
171     ''
172       runHook preCheck
173       ctest --output-on-failure -E '^${lib.concatStringsSep "|" disabledTests}$'
174       runHook postCheck
175     '';
177   # Use Zyn-Fusion logo for zest build
178   # An SVG version of the logo isn't hosted anywhere we can fetch, I
179   # had to manually derive it from the code that draws it in-app:
180   # https://github.com/mruby-zest/mruby-zest-build/blob/3.0.6/src/mruby-zest/example/ZynLogo.qml#L65-L97
181   postInstall = lib.optionalString (guiModule == "zest") ''
182     rm -r "$out/share/pixmaps"
183     mkdir -p "$out/share/icons/hicolor/scalable/apps"
184     cp ${./ZynLogo.svg} "$out/share/icons/hicolor/scalable/apps/zynaddsubfx.svg"
185   '';
187   # When building with zest GUI, patch plugins
188   # and standalone executable to properly locate zest
189   postFixup = lib.optionalString (guiModule == "zest") ''
190     for lib in "$out/lib/lv2/ZynAddSubFX.lv2/ZynAddSubFX_ui.so" "$out/lib/vst/ZynAddSubFX.so"; do
191       patchelf --set-rpath "${mruby-zest}:$(patchelf --print-rpath "$lib")" "$lib"
192     done
194     wrapProgram "$out/bin/zynaddsubfx" \
195       --prefix PATH : ${mruby-zest} \
196       --prefix LD_LIBRARY_PATH : ${mruby-zest}
197   '';
199   meta = with lib; {
200     description = "High quality software synthesizer (${guiName} GUI)";
201     mainProgram = "zynaddsubfx";
202     homepage =
203       if guiModule == "zest" then
204         "https://zynaddsubfx.sourceforge.io/zyn-fusion.html"
205       else
206         "https://zynaddsubfx.sourceforge.io";
208     license = licenses.gpl2Plus;
209     maintainers = with maintainers; [ kira-bruneau ];
210     platforms = platforms.all;
212     # On macOS:
213     # - Tests don't compile (ld: unknown option: --no-as-needed)
214     # - ZynAddSubFX LV2 & VST plugin fail to compile (not setup to use ObjC version of pugl)
215     # - TTL generation crashes (`pointer being freed was not allocated`) for all VST plugins using AbstractFX
216     # - Zest UI fails to start on pulg_setup: Could not open display, aborting.
217     broken = stdenv.hostPlatform.isDarwin;
218   };