#==============================================================================#
#
# Centralized build system for "externals".  
#
# see README for instructions  <hans@at.or.at>
#
#==============================================================================#

# TODO: maybe this should be moved to the root like all the others

CWD := $(shell pwd)

# these are setup to be overridden by the packages/Makefile
SRC_ROOT_DIR = $(CWD)/..
INSTALL_PREFIX = $(CWD)/build
BUILDLAYOUT_DIR = $(CWD)

# default target
default: all

.SUFFIXES: .$(EXTENSION)


include $(BUILDLAYOUT_DIR)/Makefile.buildlayout


# these are sent to all of the various Makefiles so that they all copy their
# output to the same directory tree
DEST_PATHS = BUILDLAYOUT_DIR=$(BUILDLAYOUT_DIR) \
				SRC_ROOT_DIR=$(SRC_ROOT_DIR) \
				INSTALL_PREFIX=$(INSTALL_PREFIX)

#==============================================================================#
#
# COMPILE TARGETS
#
#==============================================================================#

#------------------------------------------------------------------------------#
# BUILD
all: pre_all_$(OS_NAME) creb cyclone iemabs iemlib iemmatrix pddp pdp pmpd \
		toxy vbap zexy
	@echo "Compiling objects for $(OS_NAME) aka $(UNAME)"
# try it this way so that it'll recognize files that have already been built
	cd $(EXTERNALS_SRC)/build/$(OS_NAME) && make -k 

# these targets are for platform-specific needs that run before objects:
pre_all_darwin:

pre_all_linux:

pre_all_win:

pre_all_unknown:
# this target is for "everything else"


#------------------------------------------------------------------------------#
# INSTALL
install: $(OBJECTS_DEST) help_install objects_install unfiltered_install \
 creb_install cyclone_install iemabs_install iemabs_install iemmatrix_install \
 pddp_install pdp_install pmpd_install toxy_install vbap_install zexy_install
	@echo " "
	@echo "externals install succeeded!"

objects_install: 
	install -p $(EXTERNALS_SRC)/build/$(OS_NAME)/*.$(EXTENSION) $(OBJECTS_DEST)

#==============================================================================#
#
# INSTALL TARGETS
#
#==============================================================================#


help_install: $(HELP_DEST)
#------------------------------------------------------------------------------#
# all standard objs' help files
#    it had to be broken up because the list is soo long
	install -p \
			$(EXTERNALS_SRC)/OSCx/doc/*.pd \
			$(EXTERNALS_SRC)/aenv~/*.pd \
			$(EXTERNALS_SRC)/arraysize/*.pd \
			$(EXTERNALS_SRC)/beatpipe/*.pd \
			$(EXTERNALS_SRC)/control/*/*.pd \
			$(EXTERNALS_SRC)/bbogart/chaos/tools/*.pd \
			$(EXTERNALS_SRC)/bbogart/*/*.pd \
			$(EXTERNALS_SRC)/creb/doc/*.pd \
				$(HELP_DEST)
	install -p \
			$(EXTERNALS_SRC)/creb/doc/examples/*.pd \
			$(EXTERNALS_SRC)/cxc/reference/*.pd \
			$(EXTERNALS_SRC)/dfx/*/*.pd \
			$(EXTERNALS_SRC)/ext13/doc/*.pd \
			$(EXTERNALS_SRC)/ggee/*/*-help.pd \
			$(EXTERNALS_SRC)/gem2pdp/*.pd \
			$(EXTERNALS_SRC)/ff/*.pd \
			$(EXTERNALS_SRC)/freeverb~/*.pd \
			$(EXTERNALS_SRC)/hcs/*-help.pd \
				$(HELP_DEST)
	install -p \
			$(EXTERNALS_SRC)/hcs/*/doc/*.pd \
			$(EXTERNALS_SRC)/hcs/hid/examples/*.pd \
			$(EXTERNALS_SRC)/hcs/pan/*-help.pd \
			$(EXTERNALS_SRC)/iem/*/*/*-help.pd \
			$(EXTERNALS_SRC)/markex/*.pd \
			$(EXTERNALS_SRC)/motex/*.pd \
			$(EXTERNALS_SRC)/nusmuk/line3/*.pd\
				$(HELP_DEST)
	install -p \
			$(EXTERNALS_SRC)/pdogg/*/*.pd \
			$(EXTERNALS_SRC)/plugin~/*.pd \
			$(EXTERNALS_SRC)/rhythm_estimator/*.p? \
			$(EXTERNALS_SRC)/signal/*/*.pd \
			$(EXTERNALS_SRC)/sprinkler/sprinkler-help.pd \
			$(EXTERNALS_SRC)/susloop~/*.pd \
			$(EXTERNALS_SRC)/svf~/*.pd \
			$(EXTERNALS_SRC)/vbap/*.pd \
			$(EXTERNALS_SRC)/vst/*.pd \
			$(EXTERNALS_SRC)/zhzxh~/*.pd \
				$(HELP_DEST)
#------------------------------------------------------------------------------#
#  mjlib [prob] conflicts with cyclone's [prob] so filter it
	install -p $(shell ls -1 $(EXTERNALS_SRC)/mjlib/doc/*.* | \
		grep -v 'prob') $(HELP_DEST)
#------------------------------------------------------------------------------#
#  maxlib [split] conflicts with cyclone so filter it
	install -p $(shell ls -1 $(EXTERNALS_SRC)/maxlib/help/*.* | \
		grep -v 'split') $(HELP_DEST)



#==============================================================================#
#
# PROJECT TARGETS
#
#==============================================================================#


#------------------------------------------------------------------------------#
# TEMPLATE
TEMPLATE_NAME=template
template:


template_install: template
	install -d $(OBJECTS_DEST)/$(TEMPLATE_NAME)
	install -d $(HELP_DEST)/$(TEMPLATE_NAME)
	install -d $(MANUALS_DEST)/$(TEMPLATE_NAME)
	install -d $(APPLICATIONS_DEST)/$(TEMPLATE_NAME)


#------------------------------------------------------------------------------#
# CREB
CREB_NAME=creb
creb:


creb_install: creb
	install -d $(OBJECTS_DEST)/$(CREB_NAME)
	install -p $(EXTERNALS_SRC)/creb/abs/*.pd $(OBJECTS_DEST)/$(CREB_NAME)
	install -d $(HELP_DEST)/$(CREB_NAME)
	install -p -m0644	$(EXTERNALS_SRC)/creb/doc/examples/*.* \
		$(HELP_DEST)/$(CREB_NAME)
#	install -d $(MANUALS_DEST)/$(CREB_NAME)
#	install -d $(APPLICATIONS_DEST)/$(CREB_NAME)



#------------------------------------------------------------------------------#
# CYCLONE
CYCLONE_NAME=cyclone
# cyclone is compiled straight into $(OUT_DIR)
CYCLONE_OUT_DIR=$(OBJECTS_DEST)/$(CYCLONE_NAME)
cyclone:


cyclone_install: cyclone
	install -d $(OBJECTS_DEST)/$(CYCLONE_NAME)
	$(SCRIPTS_SRC)/generate-libdir-metafile.sh $(OBJECTS_DEST) $(CYCLONE_NAME) \
		--author "Kzrysztof Czaja" \
		--license "BSD" \
		--description "a library for porting and running Max/MSP patches in Pd"
	cd $(EXTERNALS_SRC)/miXed/cyclone && $(MAKE) OUT_DIR=$(CYCLONE_OUT_DIR)
# install "cyclist" command line app with pd
	install -d $(BIN_DEST)
# this doesn't build in the right place yet
#	install -p -m0755 $(CYCLONE_OUT_DIR)/cyclist $(BIN_DEST) && \
#		rm $(CYCLONE_OUT_DIR)/cyclist
# rename cyclone lib since it will pre-empt libdir functionality
	mv $(CYCLONE_OUT_DIR)/cyclone.$(EXTENSION) \
		$(CYCLONE_OUT_DIR)/cyclonelib.$(EXTENSION)
	install -d $(HELP_DEST)/$(CYCLONE_NAME)
	install -p $(EXTERNALS_SRC)/miXed/doc/help/cyclone/*.*  \
		$(HELP_DEST)/$(CYCLONE_NAME)
#	install -d $(MANUALS_DEST)/$(CYCLONE_NAME)
	install -d $(APPLICATIONS_DEST)/$(CYCLONE_NAME)
	install -p $(EXTERNALS_SRC)/miXed/test/cyclone/*.*  \
		$(APPLICATIONS_DEST)/$(CYCLONE_NAME)





#------------------------------------------------------------------------------#
# IEMABS
IEMABS_NAME=iemabs
iemabs:


iemabs_install: iemabs
#  iemabs still has the help patches in the old help-*.pd style
	install -d $(OBJECTS_DEST)/$(IEMABS_NAME)
	install -p $(shell ls -1 $(EXTERNALS_SRC)/iemlib/iemabs/*.pd | \
		grep -v 'help') $(OBJECTS_DEST)/$(IEMABS_NAME)
	install -d $(HELP_DEST)/$(IEMABS_NAME)
	install -p $(EXTERNALS_SRC)/iemlib/iemabs/*help*.pd \
		$(HELP_DEST)/$(IEMABS_NAME)
	install -p $(EXTERNALS_SRC)/iemlib/iemabs/*.mp3 $(HELP_DEST)/$(IEMABS_NAME)
	install -p $(EXTERNALS_SRC)/iemlib/iemabs/*.wav $(HELP_DEST)/$(IEMABS_NAME)
	install -d $(MANUALS_DEST)/$(IEMABS_NAME)
	install -p $(EXTERNALS_SRC)/iemlib/iemabs/*.txt \
		$(MANUALS_DEST)/$(IEMABS_NAME)



#------------------------------------------------------------------------------#
# IEMLIB
IEMLIB_NAME=iemlib
iemlib:


iemlib_install: iemlib
#	install -d $(OBJECTS_DEST)/$(IEMLIB_NAME)
#	install -d $(HELP_DEST)/$(IEMLIB_NAME)
	install -d $(HELP_DEST)/iemhelp
	install -p $(EXTERNALS_SRC)/iemlib/iemhelp/*.* $(HELP_DEST)/iemhelp
#	install -d $(MANUALS_DEST)/$(IEMLIB_NAME)
	install -d $(APPLICATIONS_DEST)/$(IEMLIB_NAME)
	install -p $(EXTERNALS_SRC)/iemlib/examples/*.* \
		$(APPLICATIONS_DEST)/$(IEMLIB_NAME)



#------------------------------------------------------------------------------#
# IEMMATRIX
IEMMATRIX_NAME=iemmatrix
iemmatrix:


iemmatrix_install: iemmatrix
	install -d $(OBJECTS_DEST)/$(IEMMATRIX_NAME)
	install -p $(shell ls -1 $(EXTERNALS_SRC)/iem/iemmatrix/abs/*.* | \
		grep -v '\-help.pd') $(OBJECTS_DEST)/$(IEMMATRIX_NAME)
	install -d $(HELP_DEST)/$(IEMMATRIX_NAME)
	install -p $(EXTERNALS_SRC)/iem/iemmatrix/doc/*.pd \
		$(HELP_DEST)/$(IEMMATRIX_NAME)



#------------------------------------------------------------------------------#
# PDDP
PDDP_NAME=pddp
# pddp is compiled straight into $(OUT_DIR)
PDDP_OUT_DIR=$(OBJECTS_DEST)/$(PDDP_NAME)
pddp:


pddp_install: pddp
	install -d $(OBJECTS_DEST)/$(PDDP_NAME)
	$(SCRIPTS_SRC)/generate-libdir-metafile.sh $(OBJECTS_DEST) $(PDDP_NAME) \
		--author "PDDP" \
		--license "BSD" \
		--description "objects for working with Tcl and Pd's Tk GUI"
	cd $(EXTERNALS_SRC)/miXed/pddp && $(MAKE) OUT_DIR=$(PDDP_OUT_DIR)
#	install -d $(HELP_DEST)/$(PDDP_NAME)
#	install -d $(MANUALS_DEST)/$(PDDP_NAME)
	install -d $(APPLICATIONS_DEST)/$(PDDP_NAME)
	install -p $(EXTERNALS_SRC)/miXed/test/pddp/*.*  \
		$(APPLICATIONS_DEST)/$(PDDP_NAME)



#------------------------------------------------------------------------------#
# PDP
PDP_NAME=pdp
pdp:
#	cd $(EXTERNALS_SRC)/pdp && ./configure && $(MAKE)
#TODO: compile pidip here
#TODO: compile gem2pdp here

pdp_install: pdp
#	install -d $(OBJECTS_DEST)/$(PDP_NAME)
#	install -p $(EXTERNALS_SRC)/pdp/*.$(EXTENSION) $(OBJECTS_DEST)
#	install -p $(EXTERNALS_SRC)/pidip/*.$(EXTENSION) $(OBJECTS_DEST)
#	install -p $(EXTERNALS_SRC)/gem2pdp/*.$(EXTENSION) $(OBJECTS_DEST)
	install -p $(EXTERNALS_SRC)/pdp/abstractions/*.pd $(OBJECTS_DEST)
#	install -d $(HELP_DEST)/$(PDP_NAME)
	install -p $(EXTERNALS_SRC)/pdp/doc/objects/*.* $(HELP_DEST)
	install -d $(MANUALS_DEST)/$(PDP_NAME)
	install -p $(EXTERNALS_SRC)/pdp/doc/reference.txt $(MANUALS_DEST)/$(PDP_NAME)
	install -p $(EXTERNALS_SRC)/pdp/doc/introduction/*.* \
		$(MANUALS_DEST)/$(PDP_NAME)
	install -d $(APPLICATIONS_DEST)/$(PDP_NAME)
	install -p $(EXTERNALS_SRC)/pdp/doc/examples/*.* \
		$(APPLICATIONS_DEST)/$(PDP_NAME)



#------------------------------------------------------------------------------#
# PMPD
PMPD_NAME=pmpd
pmpd:


pmpd_install: pmpd
	install -d $(OBJECTS_DEST)/$(PMPD_NAME)
	install -d $(HELP_DEST)/$(PMPD_NAME)
	install -p $(EXTERNALS_SRC)/pmpd/help/*.pd \
		 $(HELP_DEST)/$(PMPD_NAME)
	install -d $(MANUALS_DEST)/$(PMPD_NAME)
	install -d $(MANUALS_DEST)/$(PMPD_NAME)
	install -p $(EXTERNALS_SRC)/pmpd/doc/pmpd.pdf/pmpd.pdf \
		$(MANUALS_DEST)/$(PMPD_NAME)
	install -d $(APPLICATIONS_DEST)/$(PMPD_NAME)
	install -p $(EXTERNALS_SRC)/pmpd/exemples/*.pd \
		$(APPLICATIONS_DEST)/$(PMPD_NAME)



#------------------------------------------------------------------------------#
# TOXY
TOXY_NAME=toxy
# toxy is compiled straight into $(OUT_DIR)
TOXY_OUT_DIR=$(OBJECTS_DEST)/$(TOXY_NAME)
toxy:


toxy_install: toxy
	install -d $(OBJECTS_DEST)/$(TOXY_NAME)
	$(SCRIPTS_SRC)/generate-libdir-metafile.sh $(OBJECTS_DEST) $(TOXY_NAME) \
		--author "Kzrysztof Czaja" \
		--license "BSD" \
		--description "objects for working with Tcl and Pd's Tk GUI"
	cd $(EXTERNALS_SRC)/miXed/toxy && $(MAKE) OUT_DIR=$(TOXY_OUT_DIR)
	install -d $(HELP_DEST)/$(TOXY_NAME)
	install -p $(EXTERNALS_SRC)/miXed/doc/help/toxy/*.*  \
		$(HELP_DEST)/$(TOXY_NAME)
#	install -d $(MANUALS_DEST)/$(TOXY_NAME)
	install -d $(APPLICATIONS_DEST)/$(TOXY_NAME)
	install -p $(EXTERNALS_SRC)/miXed/test/toxy/*.*  \
		$(APPLICATIONS_DEST)/$(TOXY_NAME)



#------------------------------------------------------------------------------#
# VBAP
VBAP_NAME=vbap
vbap:


vbap_install: vbap
	install -d $(OBJECTS_DEST)/$(VBAP_NAME)
#	install -d $(HELP_DEST)/$(VBAP_NAME)
#	install -d $(MANUALS_DEST)/$(VBAP_NAME)
#	install -d $(APPLICATIONS_DEST)/$(VBAP_NAME)
	install -p $(EXTERNALS_SRC)/vbap/graph-to-aziele.pd \
		$(OBJECTS_DEST)/$(VBAP_NAME)



#------------------------------------------------------------------------------#
# Zexy
ZEXY_NAME = zexy
zexy:
#  zexy's new build system doesn't work with CVS layout, and most of zexy is
#  included in the extrnals build system now anyway.  But the abstractions
#  should still be included
#	cd $(EXTERNALS_SRC)/zexy/src && autoconf && ./configure && $(MAKE)


zexy_install: zexy
	install -d $(OBJECTS_DEST)/$(ZEXY_NAME)
#	install -p $(EXTERNALS_SRC)/zexy/src/*.$(EXTENSION) $(OBJECTS_DEST)/$(ZEXY_NAME)
	install -p $(shell ls -1 $(EXTERNALS_SRC)/zexy/abs/*.pd | \
		grep -v '-help.pd' | sed 's/\([&<>|~]\)/\\\1/g') \
		$(OBJECTS_DEST)/$(ZEXY_NAME)
	install -d $(HELP_DEST)/$(ZEXY_NAME)
	install -p $(EXTERNALS_SRC)/zexy/abs/*-help.pd $(HELP_DEST)/$(ZEXY_NAME)
	install -p $(EXTERNALS_SRC)/zexy/zexy.pd  $(HELP_DEST)
	install -p $(EXTERNALS_SRC)/zexy/examples/*.* $(HELP_DEST)/$(ZEXY_NAME)



#==============================================================================#
#
# UNFILTERED PROJECT TARGETS
#
#==============================================================================#
# this is not yet organized into libdirs, but just leftover <hans@at.or.at>

unfiltered_install:
#----------------------------------------------------------------------------
# hcs
	install -p $(shell ls -1 $(EXTERNALS_SRC)/hcs/*.pd | \
			 grep -v '\-help.pd') $(OBJECTS_DEST)
# hid
	cd $(EXTERNALS_SRC)/hcs/hid && $(MAKE) 
	install -p $(EXTERNALS_SRC)/hcs/hid/hid.$(EXTENSION) $(OBJECTS_DEST)
	install -p $(shell ls -1 $(EXTERNALS_SRC)/hcs/hid/*.pd | \
			 grep -v '\-help.pd'| grep -v '\-list.pd') $(OBJECTS_DEST)
# general
	install -p $(EXTERNALS_SRC)/hcs/general/*.pd $(OBJECTS_DEST)
# pan
	install -p $(shell ls -1 $(EXTERNALS_SRC)/hcs/pan/*.pd | \
			 grep -v '\-help.pd') $(OBJECTS_DEST)
#----------------------------------------------------------------------------
# OSC
	cd $(EXTERNALS_SRC)/OSCx && ./configure && $(MAKE)
	install -p $(EXTERNALS_SRC)/OSCx/doc/*.* $(HELP_DEST)
	install -p $(EXTERNALS_SRC)/OSCx/src/*.$(EXTENSION) $(OBJECTS_DEST)
#----------------------------------------------------------------------------
# unauthorized
	cd $(EXTERNALS_SRC)/unauthorized && $(MAKE) 
	install -p $(EXTERNALS_SRC)/unauthorized/*/*.$(EXTENSION) $(OBJECTS_DEST)
	install -p $(EXTERNALS_SRC)/unauthorized/*/*.pd $(HELP_DEST)
	install -p $(EXTERNALS_SRC)/unauthorized/*/*.txt $(HELP_DEST)
	install -p $(EXTERNALS_SRC)/unauthorized/*/*.pls $(HELP_DEST)
	cp -Rfp $(EXTERNALS_SRC)/unauthorized/blinkenlights/blm  $(HELP_DEST)


#==============================================================================#
#
# DEVELOPER'S TARGETS
#
#==============================================================================#

# make the symlinks necessary to simulate the installed environment
devsymlinks: 


#==============================================================================#
#
# CLEAN TARGETS
#
#==============================================================================#

# the destination-specific clean targets are in Makefile.buildlayout
clean: install_clean

distclean: clean cruft_clean