jackett 0.22.1382
[Homebrew/homebrew-core.git] / Formula / c / csound.rb
blob994a1988db4dbca97f3be16db4711165227c443a
1 class Csound < Formula
2   desc "Sound and music computing system"
3   homepage "https://csound.com"
4   license "LGPL-2.1-or-later"
5   revision 11
6   head "https://github.com/csound/csound.git", branch: "master"
8   # Remove `stable` block when patches are no longer needed
9   stable do
10     url "https://github.com/csound/csound.git",
11         tag:      "6.18.1",
12         revision: "a1580f9cdf331c35dceb486f4231871ce0b00266"
14     # Fix build failure due to mismatched pointer types on macOS 14+
15     patch do
16       url "https://github.com/csound/csound/commit/596667daba1ed99eda048e491ff8f36200f09429.patch?full_index=1"
17       sha256 "ab6d09d1a2cede584e151b514fc4cff56b88f79008e725c3a76df64b59caf866"
18     end
20     patch do
21       url "https://github.com/csound/csound/commit/2a071ae8ca89bc21b5c80037f8c95a01bb670ac9.patch?full_index=1"
22       sha256 "c7026330b5c89ab399e74aff17019067705011b7e35b9c75f9ed1a5878f53b4b"
23     end
24   end
26   livecheck do
27     url :stable
28     strategy :github_latest
29   end
31   bottle do
32     sha256 arm64_sequoia: "61be90827875be2da1ff759baea46c74e0c0ccd7344bc8ab949efe3b05260106"
33     sha256 arm64_sonoma:  "71adfde634382610bffb31c3fbf3aeacf25773de90e06b5158e09b18e4d205e9"
34     sha256 arm64_ventura: "e3b0dfd98b61b7b2d1e575fd3719d915982f0da0232368137412d71d03c0dbea"
35     sha256 sonoma:        "9431a7350d67b3e144136416cdca5162aba4a31ac7149c64c412be297c660c00"
36     sha256 ventura:       "334cd0b0985e049534ab67125b7c173146dff78a7ddd66be4d1b14a8a12d357e"
37   end
39   depends_on "asio" => :build
40   depends_on "cmake" => :build
41   depends_on "eigen" => :build
42   depends_on "swig" => :build
43   depends_on "faust"
44   depends_on "fltk"
45   depends_on "fluid-synth"
46   depends_on "gettext"
47   depends_on "hdf5"
48   depends_on "jack"
49   depends_on "lame"
50   depends_on "liblo"
51   depends_on "libpng"
52   depends_on "libsamplerate"
53   depends_on "libsndfile"
54   depends_on "libwebsockets"
55   depends_on "numpy"
56   depends_on "openjdk"
57   depends_on "openssl@3"
58   depends_on "portaudio"
59   depends_on "portmidi"
60   depends_on "python@3.13"
61   depends_on "stk"
62   depends_on "wiiuse"
64   uses_from_macos "bison" => :build
65   uses_from_macos "flex" => :build
66   uses_from_macos "curl"
67   uses_from_macos "zlib"
69   on_linux do
70     depends_on "alsa-lib"
71     depends_on "libx11"
72   end
74   conflicts_with "libextractor", because: "both install `extract` binaries"
76   resource "ableton-link" do
77     url "https://github.com/Ableton/link/archive/refs/tags/Link-3.1.2.tar.gz"
78     sha256 "2673dfad75b1484e8388deb8393673c3304b3ab5662dd5828e08e029ca8797aa"
79   end
81   resource "csound-plugins" do
82     url "https://github.com/csound/plugins/archive/refs/tags/1.0.2.tar.gz"
83     sha256 "8c2f0625ad1d38400030f414b92d82cfdec5c04b7dc178852f3e1935abf75d30"
85     # Fix build on macOS 12.3+ by replacing old system Python/Python.h with Homebrew's Python.h
86     patch do
87       url "https://github.com/csound/plugins/commit/13800c4dd58e3c214e5d7207180ad7115b4e2f27.patch?full_index=1"
88       sha256 "e088cc300845408f3956f070fa34a900b700c7860678bc6d37f7506d615787a6"
89     end
90   end
92   resource "getfem" do
93     url "https://download.savannah.gnu.org/releases/getfem/stable/getfem-5.4.2.tar.gz"
94     sha256 "80b625d5892fe9959c3b316340f326e3ece4e98325eb0a81dd5b9ddae563b1d1"
95   end
97   def python3
98     which("python3.13")
99   end
101   def install
102     ENV["JAVA_HOME"] = Language::Java.java_home
103     site_packages = prefix/Language::Python.site_packages(python3)
104     rpaths = [rpath]
105     rpaths << rpath(target: frameworks) if OS.mac?
107     system "cmake", "-S", ".", "-B", "build",
108                     "-DCMAKE_INSTALL_RPATH=#{rpaths.join(";")}",
109                     "-DBUILD_JAVA_INTERFACE=ON",
110                     "-DBUILD_LUA_INTERFACE=OFF",
111                     "-DBUILD_TESTS=OFF",
112                     "-DCS_FRAMEWORK_DEST=#{frameworks}",
113                     "-DJAVA_MODULE_INSTALL_DIR=#{libexec}",
114                     "-DPYTHON3_MODULE_INSTALL_DIR=#{site_packages}",
115                     *std_cmake_args
116     system "cmake", "--build", "build"
117     system "cmake", "--install", "build"
119     if OS.mac?
120       include.install_symlink frameworks/"CsoundLib64.framework/Headers" => "csound"
121       site_packages.install buildpath/"interfaces/ctcsound.py"
122     else
123       # On Linux, csound depends on binutils, but both formulae install `srconv` binaries
124       (bin/"srconv").unlink
125     end
127     resource("csound-plugins").stage do
128       resource("ableton-link").stage buildpath/"ableton-link"
129       resource("getfem").stage { cp_r "src/gmm", buildpath }
131       args = %W[
132         -DABLETON_LINK_HOME=#{buildpath}/ableton-link
133         -DBUILD_ABLETON_LINK_OPCODES=ON
134         -DBUILD_CHUA_OPCODES=ON
135         -DBUILD_CUDA_OPCODES=OFF
136         -DBUILD_FAUST_OPCODES=ON
137         -DBUILD_FLUID_OPCODES=ON
138         -DBUILD_HDF5_OPCODES=ON
139         -DBUILD_IMAGE_OPCODES=ON
140         -DBUILD_JACK_OPCODES=ON
141         -DBUILD_LINEAR_ALGEBRA_OPCODES=ON
142         -DBUILD_MP3OUT_OPCODE=ON
143         -DBUILD_OPENCL_OPCODES=OFF
144         -DBUILD_PYTHON_OPCODES=ON
145         -DBUILD_STK_OPCODES=ON
146         -DBUILD_WEBSOCKET_OPCODE=ON
147         -DBUILD_WIIMOTE_OPCODES=ON
148         -DGMM_INCLUDE_DIR=#{buildpath}
149         -DPython3_EXECUTABLE=#{python3}
150         -DUSE_FLTK=ON
151       ]
152       args += if OS.mac?
153         %W[
154           -DBUILD_P5GLOVE_OPCODES=ON
155           -DCSOUND_FRAMEWORK=#{frameworks}/CsoundLib64.framework
156           -DCSOUND_INCLUDE_DIR=#{frameworks}/CsoundLib64.framework/Headers
157           -DPLUGIN_INSTALL_DIR=#{frameworks}/CsoundLib64.framework/Resources/Opcodes64
158         ]
159       else
160         %w[
161           -DBUILD_P5GLOVE_OPCODES=OFF
162         ]
163       end
165       system "cmake", "-S", ".", "-B", "build", *args, *std_cmake_args
166       system "cmake", "--build", "build"
167       system "cmake", "--install", "build"
168     end
169   end
171   def caveats
172     caveats = <<~EOS
173       To use the Java bindings, you may need to add to your shell profile
174       e.g. ~/.profile or ~/.zshrc:
175         export CLASSPATH="#{opt_libexec}/csnd6.jar:."
176       and link the native shared library into your Java Extensions folder:
177     EOS
179     on_macos do
180       caveats = <<~EOS
181         #{caveats}\
182           mkdir -p ~/Library/Java/Extensions
183           ln -s "#{opt_libexec}/lib_jcsound6.jnilib" ~/Library/Java/Extensions
184       EOS
185     end
187     on_linux do
188       caveats = <<~EOS
189         srconv is not installed because it conflicts with binutils. To run srconv:
190           csound --utility=srconv
192         #{caveats}\
193           sudo mkdir -p /usr/java/packages/lib
194           sudo ln -s "#{opt_libexec}/lib_jcsound6.jnilib" /usr/java/packages/lib
195       EOS
196     end
198     caveats
199   end
201   test do
202     (testpath/"test.orc").write <<~ORC
203       0dbfs = 1
204       gi_peer link_create
205       FLrun
206       gi_fluidEngineNumber fluidEngine
207       gi_realVector la_i_vr_create 1
208       pyinit
209       instr 1
210           a_, a_, a_ chuap 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
211           a_signal STKPlucked 440, 1
212           a_, a_ hrtfstat a_signal, 0, 0, sprintf("hrtf-%d-left.dat", sr), sprintf("hrtf-%d-right.dat", sr), 9, sr
213           hdf5write "test.h5", a_signal
214           mp3out a_signal, a_signal, "test.mp3"
215           out a_signal
216       endin
217     ORC
219     (testpath/"test.sco").write <<~SCO
220       i 1 0 1
221       e
222     SCO
224     if OS.mac?
225       ENV["OPCODE6DIR64"] = frameworks/"CsoundLib64.framework/Resources/Opcodes64"
226       ENV["SADIR"] = frameworks/"CsoundLib64.framework/Versions/Current/samples"
227     else
228       ENV["OPCODE6DIR64"] = lib/"csound/plugins64-6.0"
229       ENV["SADIR"] = share/"samples"
230     end
231     ENV["RAWWAVE_PATH"] = Formula["stk"].pkgshare/"rawwaves"
233     system bin/"csound", "test.orc", "test.sco"
235     assert_predicate testpath/"test.#{OS.mac? ? "aif" : "wav"}", :exist?
236     assert_predicate testpath/"test.h5", :exist?
237     assert_predicate testpath/"test.mp3", :exist?
239     (testpath/"opcode-existence.orc").write <<~ORC
240       JackoInfo
241       instr 1
242           i_ websocket 8888, 0
243           i_ wiiconnect 1, 1
244       endin
245     ORC
246     system bin/"csound", "--orc", "--syntax-check-only", "opcode-existence.orc"
248     if OS.mac?
249       (testpath/"mac-opcode-existence.orc").write <<~ORC
250         instr 1
251             p5gconnect
252         endin
253       ORC
254       system bin/"csound", "--orc", "--syntax-check-only", "mac-opcode-existence.orc"
255     end
257     system python3, "-c", "import ctcsound"
259     (testpath/"test.java").write <<~JAVA
260       import csnd6.*;
261       public class test {
262           public static void main(String args[]) {
263               csnd6.csoundInitialize(csnd6.CSOUNDINIT_NO_ATEXIT | csnd6.CSOUNDINIT_NO_SIGNAL_HANDLER);
264           }
265       }
266     JAVA
267     system Formula["openjdk"].bin/"javac", "-classpath", "#{libexec}/csnd6.jar", "test.java"
268     system Formula["openjdk"].bin/"java", "-classpath", "#{libexec}/csnd6.jar:.",
269                                           "-Djava.library.path=#{libexec}", "test"
270   end