README_MAC.txt for PortMidi
Roger Dannenberg
20 nov 2009
revised 20 Sep 2010 for Xcode 4.3.2 and CMake 2.8.8
revised Jan 2022 for the PortMidi/portmidi repo on github.com

This documents how I build PortMidi for macOS. It's not the only way,
and command-line/scripting enthusiasts will say it's not even a good
way. Feel free to contribute your approach if you are willing to
describe it carefully and test it.

Install Xcode and the CMake application, CMake.app. I use the GUI
version of CMake which makes it easy to see/edit variables and
options.

==== USING CMAKE ====

Run CMake.app and select your portmidi repo working directory as the
location for source and build. (Yes, I use so called "in-tree"
builds -- it doesn't hurt, but I don't think it is necessary.)

Default settings should all be fine, but select options under BUILD if
you wish:

BUILD_NATIVE_JAVA_INTERFACE and BUILD_PMDEFAULTS to build a Java-based
GUI for setting default MIDI devices. (Otherwise, calls to 
Pm_DefaultInputDevice() and Pm_DefaultOutputDevice() will not be
useful, but maybe you are not going to use these anyway -- up to you.)

BUILD_PORTMIDI_TESTS to create some test programs. Of particular
interest are test/mm, a handy command-line MIDI Input Monitor, and
test/testio, a simple command-line program to send or receive some
MIDI notes in case you need a quick test: What devices do I have? Does
this input work? Does this output work?

I disable BUILD_SHARED_LIBS and always link statically: Static linking only
adds about 40KB to any application and then you don't have to worry
about versions, instally, copying or finding the dynamic link library,
etc.

To make sure you link statically, I rename the library to
libportmidi_static.a. To do this, set PM_STATIC_LIB_NAME (in CMake,
under the "PM" group) to "portmidi_static", and of course your
application will have to specify portmidi_static as the library to
link to.

If you are building simple command-line applications, you might want
to enable PM_CHECK_ERRORS. If you do, then calls into the PortMidi
library will print error messages and exit in the event of an error
(such as trying to open a device that does not exist). This saves you
from having to check for errors everytime you call a library function
or getting confused when errors are detected but not reported. For
high-quality applications, do NOT enable PM_CHECK_ERRORS -- any
failure could immediately abort your whole application, which is not
very friendly to users.

Click on Configure (maybe a couple of times).

Click on Generate and make an Xcode project.

Open portmidi/portmidi.xcodeproj with Xcode and build what you
need. The simplest thing is to build the ALL_BUILD target. Be careful
to specify a Debug or Release depending on what you want. "ALL_BUILD"
is a misnomer -- it only builds the version you select.

PmDefaults is minimally supported and may be removed in 2023 unless we
hear from users. To run it,
(1) make sure java runs from the command line.
(2) run the following command in an open Terminal:
     cd portmidi/pm_java/pmdefaults
     ./pmdefaults

Feel free to write a short script that cd's to your pmdefaults
directory and runs pmdefaults, and put that script somewhere on your
path so you can type it anywhere.

