# Pick your favorite C and C++ compilers
CXX = /usr/local/bin/g++
CC = /usr/local/bin/gcc

# Remove the USE_MPU401 define if you haven't installed the mpu401
# driver I've supplied.  You won't be able to play or record, but
# you'll still be able to maninpulate the songs.
# Here is a list of the possible defines
#   -DUSE_MPU401        Include support for the MPU401 MIDI card
#   -DUSE_MPU401THREAD	Threaded device interface.  Incomplete, not tested.
#   -DUSE_PTHREADS	Define if you want pthread support.  Incomplete.
#   -DSVR4              You are running a SVR4 system 
#   -Dlinux             You are running a LINUX system
#   -DBSD		You are running a BSD system
#   -Dosf1              You are running a DEC Alpha
#
# One of the SVR4, LINUX or BSD flags must be defined if you are
# also defining USE_MPU401 or USE_MPU401THREAD.
#
# Feel free to add any other flags you like.  Such as -O, -g
#
# Don McKillican dmckilli@qc.bell.ca says the CFLAGS for the Dec Alpha
# using cxx should be
#       CFLAGS = -I/usr/include/cxx -O -Dosf1 -D__STDC__


CFLAGS = -Wall -O -DBSD -DUSE_MPU401
#CFLAGS = -Wall -O -Dlinux -DUSE_MPU401

# where to put the executables
BINDIR = /usr/local/bin

# where to put the libraries
LIBDIR = /usr/local/lib

# where to put the header file
INCDIR = /usr/local/include

# where to put the man pages
MANPATH = /usr/local/man

# where the TCL library resides
TCLLIBDIR = /usr/local/lib

# where the TCL header file resides
TCLHDRDIR = /usr/local/include

# any extra libraries you might need
# BSD/386 1.1 wants gnulib to resolve ___eprintf if compiled with
# stock tcl/tk and gcc-2.5.8
#EXTRALIB = -lgnulib
EXTRALIB =


# SVR4 doesn't need ranlib, set it to true
#RANLIB = true
RANLIB = ranlib

# if you want to build a version of tclmidi that works with tk,
# set the following and "make tkmidi"
XINCDIR = /usr/X11/include
XLIBDIR = /usr/X11/lib

#
# You shouldn't need to change anything else
#

LFLAGS = -L. -Lrb -ltclmidi -L$(TCLLIBDIR) -ltcl -lmidi++ -lrb -lm $(EXTRALIB)
TKLFLAGS = -L. -Lrb -ltclmidi -L$(TCLLIBDIR) -ltk -ltcl -lmidi++ -lrb -lm \
    -L$(XLIBDIR) -lX11 $(EXTRALIB)
INCDIRS = -Ievents -Isong -Ismf -Idevice -Irb -I$(TCLHDRDIR)

TCLMFILES = tclmCmd.o tclmUtil.o tclmEvnt.o tclmPlay.o TclmIntp.o
APPINIT = tclmApIn.o
TKAPPINIT = tkmApIn.o

.SUFFIXES: .cc $(SUFFIXES)

.cc.o:
	$(CXX) $(CFLAGS) $(INCDIRS) -c -o $@ $<

all: tclmidi

events/objs: FORCE
	cd events; make objs CXX=$(CXX) CFLAGS="$(CFLAGS)" RANLIB="$(RANLIB)"

smf/objs: FORCE
	cd smf; make objs CXX=$(CXX) CFLAGS="$(CFLAGS)" RANLIB="$(RANLIB)"

song/objs: FORCE
	cd song; make objs CXX=$(CXX) CFLAGS="$(CFLAGS)" RANLIB="$(RANLIB)"

device/objs: FORCE
	cd device; make objs CXX=$(CXX) CFLAGS="$(CFLAGS)" RANLIB="$(RANLIB)"

rb/librb.a: FORCE
	cd rb; make librb.a CC=$(CC) CFLAGS="$(CFLAGS)" RANLIB="$(RANLIB)"

libmidi++.a: events/objs smf/objs song/objs device/objs
	-rm libmidi++.a
	ar ru libmidi++.a events/*.o smf/*.o song/*.o device/*.o
	$(RANLIB) libmidi++.a

libtclmidi.a: $(TCLMFILES)
	-rm libtclmidi.a
	ar ru libtclmidi.a $(TCLMFILES)
	$(RANLIB) libtclmidi.a

tclmidi: libmidi++.a rb/librb.a libtclmidi.a $(APPINIT)
	$(CXX) -o tclmidi $(APPINIT) $(LFLAGS)

tkmidi: libmidi++.a rb/librb.a libtclmidi.a $(TKAPPINIT)
	$(CXX) -o tkmidi $(TKAPPINIT) $(TKLFLAGS)

tkmApIn.o: tkmApIn.cc
	$(CXX) $(CFLAGS) $(INCDIRS) -I$(XINCDIR) -c -o $@ $<

install: tclmidi
	cp tclmidi $(BINDIR)/tclmidi
	chmod 755 $(BINDIR)/tclmidi
	for script in mplay mrec minfo midtotcl ; do \
		sed "s,#!./tclmidi,#!$(BINDIR)/tclmidi," < $$script \
		    > $(BINDIR)/$$script ; \
		chmod 755 $(BINDIR)/$$script ; \
	done
	cp libtclmidi.a $(LIBDIR)/libtclmidi.a
	cp libmidi++.a $(LIBDIR)/libmidi++.a
	cp tclmidi.h $(INCDIR)/tclmidi.h
	$(RANLIB) $(LIBDIR)/libtclmidi.a
	$(RANLIB) $(LIBDIR)/libmidi++.a

install-tkmidi: tkmidi
	cp tkmidi $(BINDIR)

install-man-cooked:
	cd man; make install-cooked MANPATH="$(MANPATH)"

install-man-raw:
	cd man; make install-raw MANPATH="$(MANPATH)"

clean:
	-rm *.o *.a tclmidi tkmidi
	cd events; make clean
	cd smf; make clean
	cd song; make clean
	cd device; make clean
	cd rb; make clean
	cd man; make clean

FORCE:

tclmCmd.o: tclmidi.h TclmIntp.h song/Song.h song/EvntTree.h \
    song/EvTrDefs.h events/Event.h \
    smf/SMFTrack.h device/MidiDev.h device/SMPTE.h tclmEvnt.h \
    events/AllEvent.h events/NormEvnt.h events/Note.h events/NoteOff.h \
    events/NoteOn.h events/KeyPres.h events/Param.h events/Program.h \
    events/ChanPres.h events/PitchWhl.h events/SysEx.h \
    events/MEvent.h events/MSeqNum.h events/MText.h \
    events/MCopy.h events/MSeqNam.h events/MInstNam.h \
    events/MLyric.h events/MMarker.h events/MCue.h \
    events/MChanPrf.h events/MPortNum.h events/MEOT.h \
    events/MTempo.h events/MSMPTE.h events/MTime.h events/MKey.h \
    events/MSeqSpec.h events/MUnknown.h \
    patchlvl.h
tclmEvnt.o: tclmidi.h TclmIntp.h song/Song.h song/EvntTree.h \
    song/EvTrDefs.h \
    events/Event.h smf/SMFTrack.h device/MidiDev.h device/SMPTE.h tclmEvnt.h \
    events/AllEvent.h events/NormEvnt.h events/Note.h events/NoteOff.h \
    events/NoteOn.h events/KeyPres.h events/Param.h events/Program.h \
    events/ChanPres.h events/PitchWhl.h events/SysEx.h \
    events/MEvent.h events/MSeqNum.h events/MText.h \
    events/MCopy.h events/MSeqNam.h events/MInstNam.h \
    events/MLyric.h events/MMarker.h events/MCue.h \
    events/MChanPrf.h events/MPortNum.h events/MEOT.h \
    events/MTempo.h events/MSMPTE.h events/MTime.h events/MKey.h \
    events/MSeqSpec.h events/MUnknown.h
tclmPlay.o: tclmidi.h TclmIntp.h song/Song.h song/EvntTree.h events/Event.h \
    song/EvTrDefs.h \
    smf/SMFTrack.h device/MidiDev.h device/SMPTE.h tclmEvnt.h \
    events/AllEvent.h events/NormEvnt.h events/Note.h events/NoteOff.h \
    events/NoteOn.h events/KeyPres.h events/Param.h events/Program.h \
    events/ChanPres.h events/PitchWhl.h events/SysEx.h \
    events/MEvent.h events/MSeqNum.h events/MText.h \
    events/MCopy.h events/MSeqNam.h events/MInstNam.h \
    events/MLyric.h events/MMarker.h events/MCue.h \
    events/MChanPrf.h events/MPortNum.h events/MEOT.h \
    events/MTempo.h events/MSMPTE.h events/MTime.h events/MKey.h \
    events/MSeqSpec.h events/MUnknown.h \
    device/MPU401.h device/401Thrd.h
TclmIntp.o: TclmIntp.h song/Song.h song/EvntTree.h song/EvTrDefs.h \
    events/Event.h smf/SMFTrack.h device/MidiDev.h device/SMPTE.h
tclmApIn.o: tclmidi.h TclmIntp.h song/Song.h song/EvntTree.h \
    song/EvTrDefs.h events/Event.h smf/SMFTrack.h device/MidiDev.h \
    device/SMPTE.h
tkmApIn.o: tclmidi.h TclmIntp.h song/Song.h song/EvntTree.h \
    song/EvTrDefs.h events/Event.h smf/SMFTrack.h device/MidiDev.h \
    device/SMPTE.h
