VPATH = ../obj:./
OBJ_DIR = ../obj
BIN_DIR = ../bin
PDEXEC = $(BIN_DIR)/pd
EXT= pd_darwin
GUINAME= libPdTcl.dylib

prefix = /usr/local
exec_prefix = ${prefix}
bindir = ${exec_prefix}/bin
includedir = ${prefix}/include
libdir = ${exec_prefix}/lib
mandir = ${prefix}/man

GFLAGS = -DINSTALL_PREFIX=\"$(prefix)\"

# varibles to match packages/Makefile.buildlayout so that they can be easily
# overridden when building Pd-extended builds. <hans@at.or.at>
libpddir = $(libdir)/pd
pddocdir = $(libpddir)/doc
libpdbindir = $(libpddir)/bin

CPPFLAGS = -DDL_OPEN -DMACOSX -DUNISTD -I/usr/X11R6/include         -I../portaudio/include -I../portaudio/src/common         -I../portaudio/src/os/mac_osx/         -I../portmidi/pm_common -I../portmidi/pm_mac         -I../portmidi/porttime         -DUSEAPI_PORTAUDIO -DPA19 -DPA_USE_COREAUDIO -DNEWBUFFER
MORECFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk             -arch i386 -arch ppc -Wno-error -O2
GINCLUDE = $(CPPFLAGS) -F/Library/Frameworks -framework Tcl -framework Tk         -I/Library/Frameworks/Tk.framework/Versions/Current/Headers         -I/Library/Frameworks/Tcl.framework/Versions/Current/Headers         -I/Library/Frameworks/Tcl.framework/Versions/8.4/PrivateHeaders
GLIB = -ltk8.4 -ltcl8.4 

LDFLAGS = -Wl -framework CoreAudio         -framework AudioUnit -framework AudioToolbox         -framework Carbon -framework CoreMIDI -arch i386 -arch ppc
LIB =   -ldl -lm -lpthread

WARN_CFLAGS = -Wall -W -Wstrict-prototypes \
    -Wno-unused -Wno-parentheses -Wno-switch
ARCH_CFLAGS = -DPD 

CFLAGS = -g -O2 $(ARCH_CFLAGS) $(WARN_CFLAGS) $(CPPFLAGS) $(MORECFLAGS)

# the sources

SYSSRC += s_midi_pm.c s_audio_pa.c         s_audio_pablio.c             s_audio_paring.c             ../portaudio/src/common/pa_allocation.c          ../portaudio/src/common/pa_converters.c          ../portaudio/src/common/pa_cpuload.c             ../portaudio/src/common/pa_dither.c              ../portaudio/src/common/pa_front.c               ../portaudio/src/common/pa_process.c             ../portaudio/src/common/pa_skeleton.c            ../portaudio/src/common/pa_stream.c              ../portaudio/src/common/pa_trace.c               ../portaudio/src/common/pa_debugprint.c               ../portaudio/src/common/pa_ringbuffer.c          ../portaudio/src/os/unix/pa_unix_util.c             ../portaudio/src/os/mac_osx/pa_mac_hostapis.c           ../portaudio/src/hostapi/coreaudio/pa_mac_core.c          ../portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c          ../portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c          ../portmidi/pm_mac/pmmac.c         ../portmidi/pm_mac/pmmacosxcm.c         ../portmidi/pm_common/pmutil.c         ../portmidi/pm_common/portmidi.c         ../portmidi/porttime/ptmacosx_cf.c  d_fft_mayer.c d_fftroutine.c

ASIOSRC = 

ASIOOBJ = $(ASIOSRC:.cpp=.o)

SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \
    g_scalar.c g_traversal.c g_guiconnect.c g_readwrite.c g_editor.c \
    g_all_guis.c g_bang.c g_hdial.c g_hslider.c g_mycanvas.c g_numbox.c \
    g_toggle.c g_vdial.c g_vslider.c g_vumeter.c \
    m_pd.c m_class.c m_obj.c m_atom.c m_memory.c m_binbuf.c \
    m_conf.c m_glob.c m_sched.c \
    s_main.c s_inter.c s_file.c s_print.c \
    s_loader.c s_path.c s_entry.c s_audio.c s_midi.c \
    d_ugen.c d_ctl.c d_arithmetic.c d_osc.c d_filter.c d_dac.c d_misc.c \
    d_math.c d_fft.c d_array.c d_global.c \
    d_delay.c d_resample.c \
    x_arithmetic.c x_connective.c x_interface.c x_midi.c x_misc.c \
    x_time.c x_acoustics.c x_net.c x_qlist.c x_gui.c x_list.c d_soundfile.c \
    $(SYSSRC)

OBJ = $(SRC:.c=.o) 

GSRC =  t_main.c t_tkcmd.c

GOBJ = $(GSRC:.c=.o)

# get version from m_pd.h to use in doc/1.manual/1.introduction.txt
PD_MAJOR_VERSION := $(shell grep PD_MAJOR_VERSION m_pd.h | \
	sed 's|^.define *PD_MAJOR_VERSION *\([0-9]*\).*|\1|' )
PD_MINOR_VERSION := $(shell grep PD_MINOR_VERSION m_pd.h | \
	sed 's|^.define *PD_MINOR_VERSION *\([0-9]*\).*|\1|' )
PD_BUGFIX_VERSION := $(shell grep PD_BUGFIX_VERSION m_pd.h | \
	sed 's|^.define *PD_BUGFIX_VERSION *\([0-9]*\).*|\1|' )
PD_TEST_VERSION := $(shell grep PD_TEST_VERSION m_pd.h | \
	sed 's|^.define *PD_TEST_VERSION *"\(.*\)".*|\1|' )
PD_VERSION := $(PD_MAJOR_VERSION).$(PD_MINOR_VERSION).$(PD_BUGFIX_VERSION)
ifneq ($(PD_TEST_VERSION),)
	PD_VERSION := $(PD_VERSION)-$(PD_TEST_VERSION)
endif

#
#  ------------------ targets ------------------------------------
#

.PHONY: pd gui externs all

all: pd $(BIN_DIR)/pd-watchdog gui $(BIN_DIR)/pdsend \
    $(BIN_DIR)/pdreceive  $(BIN_DIR)/pd.tk externs

bin: pd $(BIN_DIR)/pd-watchdog gui $(BIN_DIR)/pdsend \
    $(BIN_DIR)/pdreceive  $(BIN_DIR)/pd.tk

$(OBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(GOBJ) : %.o : %.c
	$(CC) $(CFLAGS) $(GFLAGS) $(GINCLUDE) -c -o $(OBJ_DIR)/$*.o $*.c 

$(ASIOOBJ): %.o : %.cpp
	$(CXX) $(CFLAGS) $(INCLUDE) -c -o $(OBJ_DIR)/$*.o $*.cpp

pd: $(PDEXEC)

ifneq ($(GSRC),)
gui: $(BIN_DIR)/$(GUINAME)
else
gui:
endif

pd-watchdog: $(BIN_DIR)/pd-watchdog

$(BIN_DIR):
	test -d $(BIN_DIR) || mkdir -p $(BIN_DIR)

$(BIN_DIR)/pd-watchdog: s_watchdog.c $(BIN_DIR)
	$(CC) $(CFLAGS) $(STRIPFLAG) -o $(BIN_DIR)/pd-watchdog s_watchdog.c

$(BIN_DIR)/pdsend: u_pdsend.c $(BIN_DIR)
	$(CC) $(CFLAGS)  $(STRIPFLAG) -o $(BIN_DIR)/pdsend u_pdsend.c

$(BIN_DIR)/pdreceive: u_pdreceive.c $(BIN_DIR)
	$(CC) $(CFLAGS)  $(STRIPFLAG) -o $(BIN_DIR)/pdreceive u_pdreceive.c

$(PDEXEC): $(OBJ) $(BIN_DIR)
	cd ../obj;  $(CC) $(LDFLAGS) $(DBG_CFLAGS) -o $(PDEXEC) $(OBJ) $(LIB)

$(BIN_DIR)/pd-gui: $(GOBJ) $(GSRC)
	cd ../obj; $(CC) $(INCLUDE) -o $(BIN_DIR)/$(GUINAME) $(GOBJ) $(GLIB)

$(BIN_DIR)/pd.tk: u_main.tk $(BIN_DIR)
	cp u_main.tk $(BIN_DIR)/pd.tk
	touch -r makefile.dependencies $(BIN_DIR)

#this is for Max OSX only...
$(BIN_DIR)/libPdTcl.dylib: $(GOBJ) $(GSRC)
	cd ../obj && $(CC) $(CFLAGS) -dynamiclib -read_only_relocs warning  \
		-o $(BIN_DIR)/libPdTcl.dylib $(GOBJ)  \
		-F/Library/Frameworks \
		-framework Tcl  -framework Tk  -framework System  \
		-Wl,-install_name,@executable_path/../Resources/bin/libPdTcl.dylib
	install_name_tool -change /Library/Frameworks/Tcl.framework/Versions/8.4/Tcl\
		 @executable_path/../Frameworks/Tcl.framework/Versions/8.4/Tcl \
		 -change /Library/Frameworks/Tk.framework/Versions/8.4/Tk \
		 @executable_path/../Frameworks/Tk.framework/Versions/8.4/Tk \
		../bin/libPdTcl.dylib

# this is for Windows/MinGW (only?)
$(BIN_DIR)/pdtcl.dll: $(GOBJ)
	cd $(BIN_DIR); dllwrap --export-all-symbols --output-def pdtcl.def \
	--output-lib=pdtcl.a --dllname=$(GUINAME) $(OBJ_DIR)/t_tkcmd.o $(LIB) $(GLIB)
	strip --strip-unneeded $(BIN_DIR)/pdtcl.dll

externs: 
	make -C ../extra/bonk~    d_fat
	make -C ../extra/choice   d_fat
	make -C ../extra/expr~    d_fat
	make -C ../extra/fiddle~  d_fat
	make -C ../extra/loop~    d_fat
	make -C ../extra/lrshift~ d_fat
	make -C ../extra/pique    d_fat
	make -C ../extra/sigmund~ d_fat

BINARYMODE=-m755

ABOUT_FILE=$(pddocdir)/1.manual/1.introduction.txt
install:  all
	install -d $(libpdbindir)
	install $(BIN_DIR)/$(GUINAME) $(libpdbindir)/$(GUINAME)
	install $(BIN_DIR)/pd-watchdog $(libpdbindir)/pd-watchdog
	install -m644 $(BIN_DIR)/pd.tk $(libpdbindir)/pd.tk
	install -d $(DESTDIR)$(bindir)
	install $(BINARYMODE) $(PDEXEC) $(DESTDIR)$(bindir)/pd
	install -m755 $(BIN_DIR)/pdsend $(DESTDIR)$(bindir)/pdsend
	install -m755 $(BIN_DIR)/pdreceive $(DESTDIR)$(bindir)/pdreceive 
	for dir in $(shell ls -1 ../doc | grep -v CVS); do \
		echo "installing $$dir"; \
		install -d $(pddocdir)/$$dir ; \
		install -m644 -p ../doc/$$dir/*.* $(pddocdir)/$$dir ; \
	done
	for dir in $(shell ls -1 ../doc/7.stuff | grep -v CVS); do \
		echo "installing 7.stuff/$$dir"; \
		install -d $(pddocdir)/7.stuff/$$dir ; \
		install -m644 -p ../doc/7.stuff/$$dir/*.* $(pddocdir)/7.stuff/$$dir ; \
	done
	mv $(ABOUT_FILE) $(ABOUT_FILE).tmp
	cat $(ABOUT_FILE).tmp | sed 's|PD_VERSION|Pd version $(PD_VERSION)|' \
		> $(ABOUT_FILE)
	rm $(ABOUT_FILE).tmp
	cp -pr ../extra $(libpddir)/
	rm -f $(libpddir)/extra/*/*.o
	install -d $(DESTDIR)$(includedir)
	install -m644 m_pd.h $(DESTDIR)$(includedir)/m_pd.h
	install -d $(DESTDIR)$(mandir)/man1
	gzip < ../man/pd.1 >  $(DESTDIR)$(mandir)/man1/pd.1.gz
	chmod 644 $(DESTDIR)$(mandir)/man1/pd.1.gz
	gzip < ../man/pdsend.1 >  $(DESTDIR)$(mandir)/man1/pdsend.1.gz
	chmod 644 $(DESTDIR)$(mandir)/man1/pdsend.1.gz
	gzip < ../man/pdreceive.1 >  $(DESTDIR)$(mandir)/man1/pdreceive.1.gz
	chmod 644 $(DESTDIR)$(mandir)/man1/pdreceive.1.gz
	@echo "Pd install succeeded."

local-clean:
	-rm -f ../obj/* $(BIN_DIR)/pd $(BIN_DIR)/$(GUINAME) $(BIN_DIR)/pdsend \
	    $(BIN_DIR)/pdreceive $(BIN_DIR)/pd-watchdog m_stamp.c
	-rm -f `find ../portaudio -name "*.o"` 
	-rm -f *~
	-(cd ../doc/6.externs; rm -f *.pd_linux)
	-rm -f makefile.dependencies
	touch makefile.dependencies
	chmod 666 makefile.dependencies

extra-clean:
	-rm -f `find ../extra/ -name "*.pd_*"`
	-rm -f tags

clean: extra-clean local-clean

distclean: clean
	-rm -f config.cache config.log config.status makefile tags \
		autom4te.cache/output.* autom4te.cache/traces.* autom4te.cache/requests
	-rmdir autom4te.cache
	-rm -rf autom4te-*.cache

tags: $(SRC) $(GSRC); ctags *.[ch]

depend: makefile.dependencies

makefile.dependencies: makefile
	$(CC) $(CPPFLAGS) -M $(SRC) > makefile.dependencies

uninstall:
	rm -f -r $(libpddir)
	rm -f $(DESTDIR)$(bindir)/pd
	rm -f $(DESTDIR)$(bindir)/pdsend
	rm -f $(DESTDIR)$(bindir)/pdreceive
	rm -f $(DESTDIR)$(includedir)/m_pd.h
	rm -f $(DESTDIR)$(mandir)/man1/pd.1.gz
	rm -f $(DESTDIR)$(mandir)/man1/pdsend.1.gz
	rm -f $(DESTDIR)$(mandir)/man1/pdreceive.1.gz

include makefile.dependencies







