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