Installation Notes for Serpent on
macOS
Roger B. Dannenberg
There are two versions of serpent; one is a command line program and
the other is a graphical interface program:
- serpent64 -- command line version
- wxserpent64 -- serpent with wxWidgets linked in to provide a
graphical interface
Serpent is currently released as an SVN repository and in three zip
files (the "nnn" is
the corresponding SVN version number):
- serpent64-mac-nnn.zip
- macOS (64 bit) executable and bundle: serpent64 and
wxserpent64.app
- serpent-src-nnn.zip -
Source code for any platform (Linux, Win32, macOS), both 32bit
and 64bit
- (serpent64-win-nnn.zip
- Win 64-bit executables: serpent64.exe and
wxs\wxserpent64.exe)
The "win" and "mac" zip files contain compiled executables. The
"src" zip file contains sources for all platforms. The SVN
repository is described below in "Building
From Sources."
Installing Compiled Programs
You should be able to simply download serpent64-mac-nnn.zip for your 64-bit macOS machine, extract the executable and application bundle and run
them without getting and compiling the sources, but you need to
follow these instructions and run from the command line...
The executable and application bundle are serpent64 and
wxserpent64.app.
Instructions:
- When you unzip the download, you will have a directory named
serpent. Put this directory in your home directory. If it is on
the desktop, move it to your home directory. (If you really want
it on your desktop, that is OK, but you will have to adjust
these instructions accordingly.)
- Your system must be able to find the executables. Move the
executables to a personal directory of executables named ~/bin.
The following commands can be used:
mkdir ~/bin
cd ~/serpent
mv serpent64 wxserpent64.app ~/bin
- You also need a short script to execute wxserpent64 from
within the application bundle, so create the file
~/bin/wxserpent64 with the following content; be sure to use
your userid rather than "rbd":
#!/bin/sh
echo "running wxserpent64 with arguments $*"
/Users/rbd/bin/wxserpent64.app/Contents/MacOS/wxserpent64 $*
- Make ~/bin/wxserpent64 executable as follows:
chmod +x ~/bin/wxserpent64
- You then need to modify your ~/.profile to set your PATH and
SERPENTPATH variables. Edit ~/.profile and append the following
lines; be sure to use your userid rather than "rbd":
export PATH=$PATH:/Users/rbd/bin
export SERPENTPATH="/Users/rbd/serpent/lib:/Users/rbd/serpent/programs:/Users/rbd/serpent/wxslib"
- Close and reopen the terminal window to start a new shell.
Testing: Try these
commands:
cd
serpent64
> print "hello world"
hello world
> exit()
Try
wxserpent64 wxs_test.srp
to test wxserpent64 and see a variety of input controls. The screen
will look something like this:
Building From Sources
If you want to build macOS versions from sources, get the "src" zip
file. You can also get the very latest sources from SourceForge
using SVN (subversion, a configuration management tool). The shell
command to create a serpent directory (in the current directory)
with the latest sources is:
svn checkout svn://svn.code.sf.net/p/serpent/code/trunk serpent
or, if you are a developer and plan to commit changes back to
SourceForge,
svn checkout svn+ssh://rbd@svn.code.sf.net/p/serpent/code/trunk serpent
Important: If your serpent directory contains trunk,
tags, and branches, check the code above and try
again. For these instructions to work, all the repository
files in trunk must be copied to the local working copy
named serpent. E.g. you should have serpent/README.txt,
serpent/32bit, and serpent/64bit. After you
install liblo, you should have serpent/../liblo.
The source files can be built as follows, which was tested on MacBook Air
M2. Earlier installation instructions using wxWidgets 2.9 on
Intel MacBook Pro are here.
macOS (Version 12.4, clang 13.1.6, wxWidgets 3.2.1, Xcode
13.4.1, CMake 3.24.0, MacOS 12.3 SDK)
- You must have the latest version of Xcode, which is available
free at the Apple App Store.
- You must also have installed "command line tools" from https://developer.apple.com/xcode/
- If you have more than one version of Xcode, you can
check which version will be run from the command line using:
sudo /usr/bin/xcode-select -print-path
and if it is not the newest version, you can change it by typing:
sudo /usr/bin/xcode-select -switch
/Applications/Xcode.app/Contents/Developer
- I assume you use the bash shell. If not, either switch to
bash, start a bash shell just for serpent, or adjust the syntax
of the commands given below to work with your shell.
- CMake. You must install CMake.
For macOS, this will be an ordinary application you run by
double-clicking on the CMake-2.8-11 icon in the Applications
folder.
- wxWidgets. For wxserpent64 (the 32-bit version is no longer supported),
you need to build wxWidgets, the GUI library.
- Download wxWindows
3.2.
- Ignore the directions in the INSTALL-MAC.txt file that comes
with wxWindow 3.2, and use this instead:
cd wxWidgets-3.2.1
- This is the directory of wxWindows sources. The full
path will be the value of WX_BASE_PATH (see below). This
example is obviously for wxWidgets-3.2.1, but use the actual
directory name for your wxWidgets sources if it differs.
mkdir wx-build
cd wx-build
arch_flags="-arch i386"
../configure --with-osx_cocoa --with-macosx-version-min=10.10 --prefix="$(pwd)" --with-opengl --enable-monolithic --disable-shared
make
- To make configure work, assuming you are using autoconf
installed as part of Xcode's installation, you might have to do
this:
cd /usr/share
sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/share/autoconf
But there's no need for such a crufty hack unless you see
automake errors about not finding files.
- You might also have to add /Applications/Xcode.app/Contents/Developer/usr/bin
to your PATH in order to run configure or automake.Note also that all libraries and applications must be built
with the same SDK version. This assumes you are using
/Developer/SDKs/MacOSX10.6.sdk as the Base SDK, but for earlier
systems or compatibility with earlier systems, you might have to
adjust this. If you later get errors when linking Serpent such
as Undefined symbols: "_popen$UNIX2003", referenced from:...,
this means you are trying to link a library that was compiled
against an earlier SDK and Serpent is linking against a later
SDK.
- For Xcode 6, you might have to patch wxWidgets in order to
compile wxSerpent. The patch is to insert the following lines
after #include "wx/unichar.h" in wxWidgets-3.2.1/include/wx/strvararg.h:
#include // detect std::lib
#ifdef _LIBCPP_VERSION
// using libc++
#define HAVE_TYPE_TRAITS
#else
// using libstdc++
#define HAVE_TR1_TYPE_TRAITS
#endif
- Also, if you get an error message about "wcsstr ambiguous," try
defining the macro _WCHAR_H_CPLUSPLUS_98_CONFORMANCE_ in your
wxSerpent project properties.
- Open Sound Control is
supported by 2 version sas well as
O2, which is an upwards-compatible extension. I recommend O2,
but if you want the old OSC interface in Serpent, I recommend
the built-in version. (One advantage is it has a way to get
UDP through NAT -- but if you want that, you should ask
Dannenberg to put it into O2; it's not that hard now that we
have example code. But maybe even better is use O2
directly. It uses MQTT to get around NAT and has many other
features.) If you really want the liblo version of OSC, you
need liblo, as follows:
- (Not recommended) Download liblo
at the same level as serpent, e.g. /home/rbd/liblo,
/home/rbd/serpent. Notice the directory should be named
liblo, not
liblo-0.26 or some other name. Within liblo, you should
find a file named configure along with many other
files, not a directory named liblo-0.26.
- Build liblo
cd liblo
arch_flags="-arch x86_64"
./configure CFLAGS="$arch_flags" CXXFLAGS="$arch_flags" CPPFLAGS="$arch_flags" LDFLAGS="$arch_flags" OBJCFLAGS="$arch_flags" OBJCXXFLAGS="$arch_flags" --enable-static
make
mkdir Release
cp src/.libs/liblo.a Release/liblo_s64.a
- O2. The recommended O2 API requires O2, which is on github:
- Get O2 into a directory named o2 at the same level as the
serpent directory using
git clone https://github.com/rbdannenberg/o2.git
or you can just get and unzip a zip file from https://github.com/rbdannenberg/o2
(look for the "Clone or Download" button and click on
"Download ZIP".) Check that from the parent of serpent,
you see o2/src and serpent/64bit. For
example, if you use a zip file from github, it will probably
create o2-master, so rename it to o2. If you do not see o2/src,
adjust directories (and note that you can't move a cloned git
repository - instead, you have to clone again to the correct
location.)
- Use ccmake and make to make O2:
cd o2 - change to the o2 directory
- ccmake .
- run ccmake. In the ccmake interface, set
BUILD_MIDI_INTERFACE to OFF, set BUILD_TESTS to ON, set
BUILD_TESTS_WITH_LIBLO to OFF, set CMAKE_BUILD_TYPE to
Release, and set CMAKE_INSTALL_PREFIX to /usr/local (but we're
not really going to install this library into the system).
- Type c twice to configure, and g to
generate a make file.
- You should be back at the shell. Type make and you
should see a couple of pages of output as the O2 library is
built along with some test programs.
- If there are no errors, the O2 library is built and ready
for Serpent.
- PortMidi
- Download
PortMidi
in portmedia at the same level as serpent, e.g.
/home/rbd/portmidi, /home/rbd/serpent,
/home/rbd/o2.
- Build PortMidi static library with
ccmake .
-
(turn off BUILD_SHARED_LIBS). It should be sufficient to
build only the Release version. If the library is named
libportmidi.a, rename or copy it in the same directory
(e.g., /home/rbd/portmidi) to
libportmidi_static.a
- ZeroMQ. (Not recommended).
ZeroMQ is a legacy option for networking, but currently,
Serpent is developed and tested using O2. To use ZeroMQ functions
you can need to build the zmq library from sources:
- the Serpent code assumes the portmidi, o2, and serpent
directories all share the same parent, e.g. your home directory
- libpng. You need libpng.a. I installed this with macports, which puts
it in /opt/local/lib/ along with libpng*.dylib, which you do not
want. I used
mkdir -p libpng
sudo cp libpng*.dylib libpng
to "hide" the dylibs from the linker, forcing it to use the static
version. Note that the linker command -lpng could be more
specific, but the flag is generated automatically by wxWidgets, so
it is hard to change.
- libraries.txt. To find all these libraries, CMake uses libraries.txt, a
file you must author. (My attempts to automatically locate
libraries in a cross-platform way never panned out. Directly
listing your libraries is much simpler in the end.)
- Copy
this file to
serpent/64bit/libraries.txt.
- Edit the file, following directions in the file. This file
will tell CMake where to find all the libraries you have
installed.
- use CMake to create serpent.xcodeproj from
serpent/CMakeLists.txt as follows:
- For "Where is the source code:" and "Where to build the
binaries:", use the serpent directory, e.g.
/Users/rbd/serpent or
/Users/rbd/serpent64
- Be sure to check USE_GLCANVAS, which may be a sub-menu item
under "USE". (Alternatively, you can probably build wxWindows
without the --with-opengl
flag, in which case you should uncheck USE_GLCANVAS, and
wxserpent will be built without OpenGL canvas and functions).
- There are other options:
- HAVE_WX_PACKAGE -- if your system has wxWidgets
installed, CMake should be able to automatically find the
libraries and link to them, avoiding the need to build your
own version of wxWidgets. To do this, check
HAVE_WX_PACKAGE. This will probably use dynamic libraries for
wxWidgets, so if you move the application to another system,
it might fail unless you install the same version of wxWidgets
libraries there.
- USE_MIDI -- include functions that access PortMidi library
(see "Serpent and PortMidi").
- USE_NETWORK should probably be ON to include functions
that access network functions (see "Network
Interface and Functions").
- USE_O2 -- include functions that access O2 (see "O2").
- USE_OSC should probably be OFF to exclude
functions that access Open Sound Control (see "Open
Sound Control"). Now, O2 provides OSC functions,
so you do not need the OSC functions to send OSC messages since
you can do that with O2 functions.
- USE_LIBLO -- only matters if USE_OSC is checked. Not
recommended unless you need to parse incoming messages with
timestamps and/or bundles.
- USE_STATIC_LIBS says to use static linking. This should
probably be ON so you do not have to set up library search
paths.
- USE_THREAD includes functions that support a second
real-time thread (see "Thread
Interface and Functions"), and should probably be OFF.
- USE_ZMQ should probably be OFF to omit zmq support and
if ON, you must have the zeromq library - use
O2 instead (for the ZMQ functions that this enables in Serpent, see "ZeroMQ").
- change WX_VERSION to 3.2
- Press configure (button)
- After the configure button (the first time), a window
prompts for: "Specify the generator for this project." Select
"Xcode" from a drop-down box.
- Click the Done button.
- Press configure (button) again.
- One possible error will complain "There is no SDK with the
name or path '/Developer/SDKs/MacOSX10.6.sdk'". I found the SDK
on my machine in:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk.
Wherever MacOSX10.6.sdk resides, you should define
CMAKE_OSX_SYSROOT to have that path. Alternatively, you can
make a symbolic link from /Developer/SDKs/MacOSX10.6.sdk to
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk.
You should see CMAKE_OSX_SYSROOT in the large upper panel of
the CMake interface.
- Press Generate.
- Do not change the AURA_DEF value from FALSE.
- Find WX_BASE_PATH. Set the value to your wxWidgets folder
where you installed wxWindows. E.g. my Value string is
"/Users/rbd/wxmac" (without the quotes).
- Find WX_VERSION. This should be 3.2 if you are using
wxWidgets 2.89.xx.
- This generates serpent/64bit.xcodeproject
- open serpent.xcodeproj and build ALL_BUILD using the
"Product:Build For:Archiving" menu item. (Editorial note: Isn't
this an odd command name for building the release version of a
program? Note that the Build menu and the Archive menu are not
equivalent.) If you are not building wxwindows, you can just
build serpent.
- To make your installation look like the downloaded binaries,
move wxserpent64.app to serpent:
mv ~/serpent/64bit/wxsbuild/Release/wxserpent64.app ~/serpent
(Otherwise, you can set things up to run directly from
serpent/64bit/wxsbuild/Release/.)
- Now that you have compiled executables, you can follow the instructions above for installing them.