How I Built Csound on Mac OS X 10.5 "Leopard"

Version 5.09.0

What follows here are my notes from the first time that I compiled Csound 5.09 on Mac OS X "Leopard". Normally, most users should install one of the pre-built binary packages from Sourceforge. But there are some good reasons for building Csound yourself, and in particular on Leopard at the current time (Nov. 2008) because the pre-built binaries are built on 10.4 "Tiger" (which mostly work but see below). My reasons were threefold:

  1. I wanted to try Chuckk Hubbard's new Rationale front end and it requires a working Python to Csound interface. The Python interface that comes with the 10.4 Csound packages does not work on 10.5.
  2. I wanted a Csound with all the "bells and whistles".
  3. I am preparing to help build Csound packages for 10.5 Leopard in the future.

I am posting this information in the event that it is useful to anyone else using Mac OS X Leopard. It is not in the form of a tutorial. It is more like a journal of my efforts and the problems that I encountered and how I solved them. I've edited them enough so that you will not have to repeat all of my mistakes. However, not everything below will necessarily be self-explanatory. I should hope that anyone who is considering compiling Csound for themselves is resourceful enough to fill-in the blanks. That said, I am happy to answer questions if you run into trouble. Email me at web-feedback-1003@anthonykozar.net if you need some help. I have not compiled Csound since 2009 so I can no longer offer help on this subject. Thanks for your understanding.

Tuesday October 21, 2008

0. Install latest version of Apple's XCode development tools (3.1.1)

Make sure to check the UNIX development option and any other optional installs that you want. Disk space required: 2.15 GB.

Update: A newer version of XCode may be out by now. You can download the latest XCode by signing up for a free Apple Developer Connection membership.

1. Downloaded "Csound5.09.0.tar.gz" from Csound's Sourceforge site.

2. Downloaded the following Csound dependencies in source form:

The Building Csound page of the Csound manual has links to some of these packages but not all.

Note that at the time I downloaded these packages, I retrieved the latest versions that I could find except for the Loris library. I believe that newer versions of Loris don't work for building the Csound Loris opcodes. (Also note that the license of Loris is the GPL instead of Csound's LGPL).

3. Unpacked everything in a new directory (~/Developer/libraries/).

Size of downloads was 62.5MB; size of expanded archives (on disk) was 412.8MB with 42,286 files! (Most of this is boost and gettext).

4. Install SCons:

Open Terminal and navigate to Scons directory (~/Developer/libraries/scons-1.1.0/). Run 'sudo python setup.py install --symlink-scons'

5. Build and install libsndfile:

	cd ~/Developer/libraries/libsndfile-1.0.18pre24e/
	./configure
	make
	sudo make install

6. Build and install FLTK libraries:

	cd ~/Developer/libraries/fltk-1.1.9/
	./configure --enable-shared --enable-threads
	make
	sudo make install

7. Build PortAudio:

	cd ~/Developer/libraries/portaudio/
	./configure
	make

PortAudio docs recommend not doing 'make install'. See this URL for more information, especially for disabling the quad-architecture build and using the 10.4 SDK: http://www.portaudio.com/trac/wiki/TutorialDir/Compile/MacintoshCoreAudio

Update: I think not installing probably turned out to be a mistake as it caused more trouble later (see below).

Note: The shared libraries are in the portaudio/lib/.libs/ directory. I did 'ln -s .libs libs' there to make life easier.

8. Build PortMidi:

	cd ~/Developer/libraries/portmidi/
	make -f pm_mac/Makefile.osx help		[explains targets]
	make -f pm_mac/Makefile.osx install-with-xcode

These commands build a Universal dynamic library and install it to /usr/local/lib/.

Update: I went back and did these commands when I encountered the porttime.h error (see below) but I don't think that I should have:

	make -f pm_mac/Makefile.osx cleanest		[if you built anything previously]
	make -f pm_mac/Makefile.osx dylib
	[sudo make -f pm_mac/Makefile.osx install]	[did not execute?]

[Time so far: about 5 hours @ 3am Wed]

Wednesday October 22, 2008

I resumed working on building Csound's dependencies the next afternoon.

9. Build and install Lua:

	cd ~/Developer/libraries/lua-5.1.4/
	make macosx
	make test
	sudo make install
	lua test/life.lua	(for a good time ;)

10. Build and install SWIG:

	cd ~/Developer/libraries/swig-1.3.36/
	./configure
	make
	sudo make install

11. Build and install fluidsynth:

	cd ~/Developer/libraries/fluidsynth-1.0.8/
	./configure --enable-shared			[add --enable-double for Csound doubles build?]
	make
	sudo make install

Note: I did not follow the instructions in 'README-OSX' because I did not want to install Fink, MidiShare, or Jack at this time. They don't seem to be necessary for use with Csound.

12. Build and install liblo for OSC support:

	cd ~/Developer/libraries/liblo-0.25/
	./configure
	make
	sudo make install

13. Build and install FFTW 3 (only needed for Loris):

	cd ~/Developer/libraries/fftw-3.1.3/
	./configure --enable-shared --enable-portable-binary  
	make
	sudo make install

14. Copy STK and Loris sources into Csound tree:

	cd ~/Developer/libraries/stk-4.3.1/
	cp -ipR include rawwaves src ~/Developer/libraries/csound-5.09.0/Opcodes/stk/
	
	cd ~/Developer/libraries/loris-1.3.0/
	cp -ipR scripting src ~/Developer/libraries/csound-5.09.0/Opcodes/Loris/

You can copy these folders with the Finder, of course. The folders 'include', 'rawwaves', etc. are copied — not their contents.

15. Build and install Gmm++ for linear algebra opcodes: (You do not need to perform this step unless you are building with useDouble=1)

	cd ~/Developer/libraries/gmm-3.1/
	./configure
	make
	sudo make install

Steps 16 & 17 were added after running into trouble building Csound (see below).

16. Build and install libpng:

	cd ~/Developer/libraries/libpng-1.2.32/
	./configure
	make
	sudo make install

17. Build and install gettext:

	cd ~/Developer/libraries/gettext-0.17/
	./configure --without-emacs
	make
	sudo make install

Note: gettext installs all sorts of extras that you probably won't need but I did not see a way to control this in the configure script. The only option that I disabled was Emacs support since I had no idea what that was.

18. Check Csound options and custom.py:

	cd ~/Developer/libraries/csound-5.09.0/
	scons -h

Modify custom.py as needed. These are the lines for Mac OS X that I arrived at after some experimentation:

	elif sys.platform == 'darwin':
		platform = 'darwin'
		customCPPPATH.append('/usr/include/malloc')
		customCPPPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/boost_1_36_0')
		customCPPPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/portaudio/include')
		customLIBPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/portaudio/lib/.libs')
		customCPPPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/portmidi/pm_common')
		customCPPPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/portmidi/porttime')
		customCPPPATH.append('/System/Library/Frameworks/Python.Framework/Headers')
		customLIBS.append('intl')
		customCXXFLAGS.append('-fabi-version=0')

Also tried running scons -h with all of the options listed below to confirm that it found everything before I started building.

[Time so far: about 10.5 hours]

19. NOW EXECUTE SCONS TO COMPILE CSOUND:

scons dynamicCsoundLibrary=1 buildUtilities=1 buildRelease=1 gcc4opt=7450 usePortAudio=1 usePortMIDI=1 useFLTK=1 buildCsoundVST=0 buildCsoundAC=1 buildCsound5GUI=1 buildLoris=1 useOSC=1 useUDP=1 buildPythonOpcodes=1 buildStkOpcodes=1 useCoreAudio=1 buildTclcsound=1 buildWinsound=1 buildVirtual=1 buildInterfaces=1 buildJavaWrapper=1 buildOSXGUI=1 buildCSEditor=1 buildNewParser=0 useGettext=1 buildImageOpcodes=1

IMPORTANT: Add a 'sudo' in front of this command or else Csound.framework cannot be created in /Library/Frameworks. Obviously, this command will overwrite any existing Csound framework in that location. (You can remove buildRelease=1 instead if not installing and then you do not need 'sudo').

NOTE: The gcc4opt=7450 option optimizes Csound for a PowerPC G4 processor. You should adjust this option or remove it if your computer has a different processor.

NOTE: I experienced the following error at first:

	Checking for C header file stdio.h... no
	 *** Failed to compile a simple test program. The compiler is
	 *** possibly not set up correctly, or is used with invalid flags.
	 *** Check config.log to find out more about the error.

It turned out to be a result of the following erroneous custom path setting:

    customCPPPATH.append('/System/Library/Frameworks/Python.Framework/Headers/Python.h')

Appended paths cannot be a file, they must be a directory. (I did not intend to specify the file instead of the directory, but it got in there somehow).

THEN, this error while compiling:

	H/text.h:111:21: error: libintl.h: No such file or directory

because GNU GetText was not installed yet. (Downloaded and added step 17).

NEXT, this error while linking CsoundLib:

	Undefined symbols:
	  "_libintl_dgettext", referenced from:
		  _csoundLocalizeString in getstring.os
	ld: symbol(s) not found

Adding customLIBS.append('intl') to custom.py fixes this.

	g++ -o Opcodes/chua/ChuaOscillator.os -c -fno-rtti -fexceptions -fabi-version=0 -O3 -mcpu=7450 -mtune=7450 -ftree-vectorize -ffast-math -DGNU_GETTEXT -g -fomit-frame-pointer -DMACOSX -DPIPES -fPIC -DHAVE_LIBSNDFILE=1016 -DHAVE_FLTK -DSDFT -DHAVE_FCNTL_H -DHAVE_UNISTD_H -DHAVE_STDINT_H -DHAVE_SYS_TIME_H -DHAVE_SYS_TYPES_H -DHAVE_TERMIOS_H -DHAVE_SOCKETS -DHAVE_DIRENT_H -I. -IH -I/usr/include/malloc -I/Volumes/Data/Users/anthony/Developer/libraries/boost_1_36_0 -I/Volumes/Data/Users/anthony/Developer/libraries/portaudio/include -I/Volumes/Data/Users/anthony/Developer/libraries/portmidi/pm_common -I/System/Library/Frameworks/Python.Framework/Headers -I/usr/local/include Opcodes/chua/ChuaOscillator.cpp
	/Volumes/Data/Users/anthony/Developer/libraries/boost_1_36_0/boost/exception/exception.hpp: In member function 'const char* boost::exception::_diagnostic_information(const char*) const':
	/Volumes/Data/Users/anthony/Developer/libraries/boost_1_36_0/boost/exception/exception.hpp:74: error: cannot use typeid with -fno-rtti
	/Volumes/Data/Users/anthony/Developer/libraries/boost_1_36_0/boost/exception/exception.hpp:81: error: cannot use typeid with -fno-rtti

Problem is on line 1161 of SConstruct:

	if getPlatform() == 'darwin':
		pluginEnvironment.Append(LINKFLAGS = Split('''
			-framework CoreMidi -framework CoreFoundation -framework CoreAudio
		'''))
		# pluginEnvironment.Append(LINKFLAGS = ['-dynamiclib'])
		pluginEnvironment['SHLIBSUFFIX'] = '.dylib'
		pluginEnvironment.Prepend(CXXFLAGS = "-fno-rtti")

HACK: Commented out that last line to get it to compile for now.

Followed by template problems (?) in linear_algebra.cpp:

	Opcodes/linear_algebra.cpp: In member function 'int la_i_qr_eigen_mr_t::init(CSOUND*)':
	Opcodes/linear_algebra.cpp:4117: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
	/usr/local/include/gmm/gmm_dense_qr.h:552: note: candidate 1: void gmm::implicit_qr_algorithm(const MAT1&, const VECT&, const MAT2&, typename gmm::number_traits::value_type>::magnitude_type, bool) [with MAT1 = gmm::dense_matrix, VECT = std::vector >, MAT2 = double]
	/usr/local/include/gmm/gmm_dense_qr.h:586: note: candidate 2: void gmm::implicit_qr_algorithm(const MAT1&, VECT&, typename gmm::number_traits::value_type>::magnitude_type) [with MAT1 = gmm::dense_matrix, VECT = std::vector >]
	Opcodes/linear_algebra.cpp: In member function 'int la_k_qr_eigen_mr_t::kontrol(CSOUND*)':
etc.

HACK: Commented out this target in SConstruct for now.

Update: Michael Gogins has informed me that the linear algebra opcodes only work when compiling Csound to use double-precision floating-point numbers. SConstruct should be fixed to reflect this.

	InOut/pmidi.c:32:22: error: porttime.h: No such file or directory
	InOut/pmidi.c: In function 'start_portmidi':
	InOut/pmidi.c:169: error: 'ptNoError' undeclared (first use in this function)
	InOut/pmidi.c:169: error: (Each undeclared identifier is reported only once
	InOut/pmidi.c:169: error: for each function it appears in.)
	scons: *** [InOut/pmidi.os] Error 1

Needed to add location of porttime.h to custom.py:

	    customCPPPATH.append('/Volumes/Data/Users/anthony/Developer/libraries/portmidi/porttime')
	ld: library not found for -lcsnd
	collect2: ld returned 1 exit status
	scons: *** [counterpoint] Error 1

HACK: Do 'ln -s lib_csnd.dylib libcsnd.dylib' then continue.

	Thu Oct 23 2008 2:28 AM:
	scons: done building targets.
	
	^_^

Testing Csound

Fiona:csound-5.09.0 anthony$ ./csound -z
dyld: Library not loaded: /usr/local/lib/libportaudio.2.dylib
  Referenced from: /Volumes/Data/Users/anthony/Developer/libraries/csound-5.09.0/./csound
  Reason: image not found
Trace/BPT trap

DOH!: libportaudio.2.dylib is not in /usr/local/lib because we didn't install.

So ...

	cd ~/Developer/libraries/portaudio/
	sudo make install

Now ...

Fiona:csound-5.09.0 anthony$ ./csound -z
PortMIDI real time MIDI plugin for Csound
PortAudio real-time audio module for Csound
virtual_keyboard real time MIDI plugin for Csound
0dBFS level = 32768.0
Csound version 5.09 (float samples) Oct 23 2008
libsndfile-1.0.18pre24e
Error: define environment variable RAWWAVE_PATH
(points to rawwaves directory) to use STK opcodes.
rtaudio: PortAudio module enabled ... using callback interface
rtmidi: PortMIDI module enabled
1380 opcodes

ATSadd              ATSaddnz            ATSbufread          ATScross
ATSinfo             ATSinterpread       ATSpartialtap       ATSread
ATSreadnz           ATSsinnoi           FLbox               FLbutBank

...

And, finally ...

Fiona:csound-5.09.0 anthony$ ./csound examples/trappedrt.csd

... IT WORKS! (about 3:20 AM Thu)


Summary of Build Effort

Total Time: about 13 hours

Disk Usage:

	libraries/csound-5.09.0/        127.0 MB     2,256 files
	
	libraries/                      635.9 MB    46,673 files
	/Library/Frameworks/Csound...     4.0 MB        85 files
	/usr/local/                      39.8 MB     3,315 files
	/Developer                     2201.6 MB    47,706 files
	                              ----------
	Total Disk Space Used:         2881.3 MB

Products built:

	CsoundAC.py             CsoundLib               CsoundLib.framework    
	_CsoundAC.so            _csnd.so                _loris.so              
	atsa                    counterpoint            cs                     
	csb64enc                cseditor                csladspa.so            
	csnd.jar                csnd.py                 csound                 
	csound5gui              cstclsh                 cswish                 
	cvanal                  dnoise                  envext                 
	extract                 extractor               het_export             
	het_import              hetro                   libCsoundAC.a          
	lib_csnd.dylib          lib_jcsound.jnilib      libambicode1.dylib     
	libampmidid.dylib       libbabo.dylib           libbarmodel.dylib      
	libchua.dylib           libcompress.dylib       libcontrol.dylib       
	libcs_date.dylib        libcs_pan2.dylib        libcs_pvs_ops.dylib    
	libcsnd.dylib           libeqfil.dylib          libfluidOpcodes.dylib  
	libftest.dylib          libgabnew.dylib         libgrain4.dylib        
	libharmon.dylib         libhrtferX.dylib        libhrtfnew.dylib       
	libimage.dylib          libloris.dylib          liblorisbase.a         
	libloscilx.dylib        libminmax.dylib         libmixer.dylib         
	libmodal4.dylib         libmutexops.dylib       libosc.dylib           
	libpartikkel.dylib      libphisem.dylib         libphysmod.dylib       
	libpitch.dylib          libpmidi.dylib          libptrack.dylib        
	libpvoc.dylib           libpvsbuffer.dylib      libpy.dylib            
	librtcoreaudio.dylib    librtpa.dylib           libscansyn.dylib       
	libscoreline.dylib      libsfont.dylib          libshape.dylib         
	libstackops.dylib       libstdopcod.dylib       libstdutil.dylib       
	libstk.dylib            libstk_base.a           libsystem_call.dylib   
	libudprecv.dylib        libudpsend.dylib        libugakbari.dylib      
	libvaops.dylib          libvbap.dylib           libvirtual.dylib       
	libvosim.dylib          libwidgets.dylib        loris.py               
	lpanal                  lpc_export              lpc_import             
	makecsd                 mixer                   pv_export              
	pv_import               pvanal                  pvlook                 
	scale                   scot                    scsort                 
	sdif2ad                 sndinfo                 srconv                 
	tclcsound.dylib         winsound                
	
	frontends/winsound/Winsound.app
	frontends/OSX/build/Deployment/Csound 5.app
	frontends/fltk_gui/Csound5GUI.app

Installing the Rest of the Binaries
Thursday, Oct 23 2008, Afternoon

The Csound build script did not install anything except the basic Csound.framework and plugin libraries. Command-line exectuables, Mac OS X applications, language wrappers, and extras such as CsoundAC and TclCsound remain in the build directory only.

I modified the install.py script (which is for Linux) to have some control over what is installed, making it more usable for OS X (though not ideal).

I also created a symlink for python2.5 site packages to mirror the one that existed for Python 2.3 so that the install script would place those files in the correct place.

sudo ln -s /Library/Python/2.5/site-packages /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages

NOTE: I would not try running the install.py script that comes with Csound on OS X without modifying it.

Here is my modified install.py. Rename the file after you download it.

Fiona:csound-5.09.0 anthony$ sudo ./install.py
Password:
Csound5 Linux installer by Istvan Varga

 === Installing executables ===
  /usr/local/bin/csound
  /usr/local/bin/csound5gui
  /usr/local/bin/winsound
  /usr/local/bin/cstclsh
  /usr/local/bin/cswish
  /usr/local/bin/cseditor
  /usr/local/bin/cvanal
  /usr/local/bin/dnoise
  /usr/local/bin/envext
  /usr/local/bin/extractor
  /usr/local/bin/het_export
  /usr/local/bin/het_import
  /usr/local/bin/hetro
  /usr/local/bin/lpanal
  /usr/local/bin/lpc_export
  /usr/local/bin/lpc_import
  /usr/local/bin/mixer
  /usr/local/bin/pvanal
  /usr/local/bin/pv_export
  /usr/local/bin/pv_import
  /usr/local/bin/pvlook
  /usr/local/bin/scale
  /usr/local/bin/sndinfo
  /usr/local/bin/srconv
  /usr/local/bin/scsort
  /usr/local/bin/extract
  /usr/local/bin/cs
  /usr/local/bin/csb64enc
  /usr/local/bin/makecsd
  /usr/local/bin/scot
  /usr/local/bin/brkpt
  /usr/local/bin/linseg
  /usr/local/bin/tabdes
 === Installing libraries ===
 === Installing language interfaces ===
  /usr/lib/python2.5/site-packages/csnd.py
  /usr/lib/python2.5/site-packages/loris.py
  /usr/lib/python2.5/site-packages/CsoundAC.py
  /usr/lib/python2.5/site-packages/_csnd.so
  /usr/lib/python2.5/site-packages/_loris.so
  /usr/lib/python2.5/site-packages/_CsoundAC.so
  /usr/local/lib/csound/java/csnd.jar
 === Installing uninstall script ===
  /usr/local/bin/uninstall-csound5
 === Installing MD5 checksums ===
  /usr/local/csound5-2008-10-23.md5sums

Csound installation has been successfully completed.
Before running Csound, make sure that the following environment
variables are set:
  OPCODEDIR=/usr/local/lib/csound/plugins
  CSSTRNGS=/usr/local/share/locale
Csound can be uninstalled by running /usr/local/bin/uninstall-csound5

This still did not properly install everything and I had to do some more copies by hand later (see below).

Also, I dragged these apps to the /Applications folder:

All of these applications launch and the latter two work pretty well. Winsound had problems when playing a CSD ("No such directory"). Csound 5 CSDPlayer (the java jar) crashed when I tried to play a CSD.


Getting Rationale to Run

Finally to the goal of this entire exercise — to be able to load the Python interface library 'csnd' and run 'rationale' by Chuckk Hubbard. A simple 'import csnd' still fails in Python:

Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import csnd
Traceback (most recent call last):
  File "", line 1, in 
  File "/Library/Python/2.5/site-packages/csnd.py", line 7, in 
	import _csnd
ImportError: dlopen(/Library/Python/2.5/site-packages/_csnd.so, 2): Library not loaded: /Library/Frameworks/CsoundLib.framework/Versions/5.1/lib_csnd.dylib
  Referenced from: /Library/Python/2.5/site-packages/_csnd.so
  Reason: image not found

So I copied these files to CsoundLib.framework/Versions/5.1/:

	tclcsound.dylib
	lib_jcsound.jnilib
	lib_csnd.dylib 

'import csnd' now succeeds, so ...

Fiona:rationale anthony$ python rationale.py 
Traceback (most recent call last):
  File "rationale.py", line 2502, in 
	root = tk.Tk()
  File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk/Tix.py", line 210, in __init__
	self.tk.eval('package require Tix')
_tkinter.TclError: can't find package Tix

Curses! /System/Library/Tcl seems to have no Tix package.

Downloading and installing TclTkAquaBI-8.4.10.0.dmg from the Tcl/Tk Aqua project on Sourceforge provides a usable Tix library for Python.

Finally, Rationale runs!! Yay!