
USEDOUBLE = no

CC = wine D:/MinGW/bin/gcc
CXX = wine D:/MinGW/bin/g++
CFLAGS = -Wall -O3 -fno-inline-functions
ifeq ($(strip $(USEDOUBLE)),yes)
CFLAGS += -march=i586 -mtune=pentium3 -fomit-frame-pointer -ffast-math
CFLAGS += -DUSE_DOUBLE -DUSE_LRINT
CSOUNDLIB = csound64.dll.5.1
CSLIB_LNK = -lcsound64
PROGRAM = csound.exe
WINSOUND = winsound.exe
CSOUND5GUI = csound5gui.exe
else
CFLAGS += -march=pentium3 -fomit-frame-pointer -ffast-math
CSOUNDLIB = csound32.dll.5.1
CSLIB_LNK = -lcsound32
PROGRAM = csound32.exe
WINSOUND = winsound32.exe
CSOUND5GUI = csound5gui32.exe
endif
CFLAGS += -I. -IH -DWIN32 -DPIPES -DHAVE_STDINT_H -DHAVE_DIRENT_H
CFLAGS += -DHAVE_UNISTD_H -DHAVE_FCNTL_H -DHAVE_SYS_TIME_H -DHAVE_SYS_TYPES_H
CFLAGS += -DHAVE_LIBSNDFILE=1016 -DPIC
LDFLAGS = -L.
LIBS = D:/MinGW/bin/libsndfile-1.dll -lgdi32 -luser32 -lkernel32 -lm
PYINCDIR = D:/MinGW/Python/include
PYLIB = python24.dll
FLTK_LIBS = -Wl,--enable-runtime-pseudo-reloc D:/MinGW/lib/fltk.dll -lstdc++
FLTK_LIBS += -lole32 -luuid -lwsock32
OSC_LIBS = D:/MinGW/lib/liblo.dll -lws2_32 D:/MinGW/lib/pthreadGC2.dll
FLUID_LIBS = D:/MinGW/lib/fluidsynth.dll -lwinmm -ldsound

PLUGINS =	babo.dll barmodel.dll compress.dll fluidOpcodes.dll	\
		ftest.dll grain4.dll hrtferX.dll minmax.dll mixer.dll	\
		modal4.dll osc.dll phisem.dll physmod.dll pitch.dll	\
		pvoc.dll pvs_ops.dll scansyn.dll sfont.dll stackops.dll	\
		vbap.dll stdopcod.dll stdutil.dll			\
		widgets.dll rtpa.dll rtwinmm.dll pmidi.dll

UTILS =		cvanal.exe dnoise.exe hetro.exe lpanal.exe mixer.exe	\
		pvanal.exe scale.exe sndinfo.exe srconv.exe		\
		extractor.exe scsort.exe extract.exe csb64enc.exe	\
		makecsd.exe cs.exe scot.exe

all: $(CSOUNDLIB) $(PROGRAM) $(WINSOUND) $(CSOUND5GUI) $(PLUGINS) $(UTILS)

CSOUNDLIB_OBJ =	Engine/auxfd.o Engine/cfgvar.o Engine/entry1.o		\
		Engine/envvar.o Engine/express.o Engine/extract.o	\
		Engine/fgens.o Engine/insert.o Engine/linevent.o	\
		Engine/memalloc.o Engine/memfiles.o Engine/musmon.o	\
		Engine/namedins.o Engine/otran.o Engine/rdorch.o	\
		Engine/rdscor.o Engine/scsort.o Engine/scxtract.o	\
		Engine/sort.o Engine/sread.o Engine/swrite.o		\
		Engine/twarp.o InOut/libsnd.o InOut/libsnd_u.o		\
		InOut/midifile.o InOut/midirecv.o InOut/midisend.o	\
		InOut/winascii.o InOut/windin.o InOut/window.o		\
		InOut/winEPS.o OOps/aops.o OOps/bus.o OOps/cmath.o	\
		OOps/diskin2.o OOps/diskin.o OOps/disprep.o		\
		OOps/dumpf.o OOps/fftlib.o OOps/goto_ops.o		\
		OOps/midiinterop.o OOps/midiops.o OOps/midiout.o	\
		OOps/mxfft.o OOps/oscils.o OOps/pstream.o		\
		OOps/pvfileio.o OOps/pvsanal.o OOps/random.o		\
		OOps/schedule.o OOps/sndinfUG.o OOps/str_ops.o		\
		OOps/ugens1.o OOps/ugens2.o OOps/ugens3.o OOps/ugens4.o	\
		OOps/ugens5.o OOps/ugens6.o OOps/ugrw1.o OOps/ugrw2.o	\
		OOps/vdelay.o Top/argdecode.o Top/cscore_internal.o	\
		Top/cscorfns.o Top/csmodule.o Top/csound.o		\
		Top/getstring.o Top/main.o Top/new_opts.o		\
		Top/one_file.o Top/opcode.o Top/threads.o Top/utility.o

$(CSOUNDLIB): $(CSOUNDLIB_OBJ)
	$(CXX) -O2 -shared -Wl,--output-def,$(subst .dll.5.1,.def,$(CSOUNDLIB)) -Wl,--out-implib,lib$(subst .dll.5.1,.a,$(CSOUNDLIB)) -o $@ $^ $(LDFLAGS) $(LIBS)

Opcodes/%.o: Opcodes/%.c
	$(CC) $(CFLAGS) -c $< -o $@

%.o: %.c
	$(CC) -D__BUILDING_LIBCSOUND $(CFLAGS) -c $< -o $@

%.oo: %.cpp
	$(CXX) $(CFLAGS) -c $< -o $@

Opcodes/sfont.o: Opcodes/sfont.c
	$(CC) $(CFLAGS) -fno-strict-aliasing -c $< -o $@

modal4.dll: Opcodes/modal4.o Opcodes/physutil.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

physmod.dll: Opcodes/physmod.o Opcodes/physutil.o Opcodes/mandolin.o	\
	     Opcodes/singwave.o Opcodes/fm4op.o Opcodes/moog1.o		\
	     Opcodes/shaker.o Opcodes/bowedbar.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

stdopcod.dll:	Opcodes/ambicode.o Opcodes/bbcut.o Opcodes/biquad.o	\
		Opcodes/butter.o Opcodes/clfilt.o Opcodes/cross2.o	\
		Opcodes/dam.o Opcodes/dcblockr.o Opcodes/filter.o	\
		Opcodes/flanger.o Opcodes/follow.o Opcodes/fout.o	\
		Opcodes/freeverb.o Opcodes/ftconv.o Opcodes/ftgen.o	\
		Opcodes/gab/gab.o Opcodes/gab/vectorial.o		\
		Opcodes/grain.o Opcodes/locsig.o Opcodes/lowpassr.o	\
		Opcodes/metro.o Opcodes/midiops2.o Opcodes/midiops3.o	\
		Opcodes/newfils.o Opcodes/nlfilt.o Opcodes/oscbnk.o	\
		Opcodes/pluck.o Opcodes/repluck.o Opcodes/reverbsc.o	\
		Opcodes/seqtime.o Opcodes/sndloop.o Opcodes/sndwarp.o	\
		Opcodes/space.o Opcodes/spat3d.o Opcodes/syncgrain.o	\
		Opcodes/ugens7.o Opcodes/ugens9.o Opcodes/ugensa.o	\
		Opcodes/uggab.o Opcodes/ugmoss.o Opcodes/ugnorman.o	\
		Opcodes/ugsc.o Opcodes/wave-terrain.o			\
		Opcodes/stdopcod.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

barmodel.dll: Opcodes/bilbar.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) $(LIBS)

pitch.dll: Opcodes/pitch.o Opcodes/pitch0.o Opcodes/spectra.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

pvoc.dll:	Opcodes/dsputil.o Opcodes/pvadd.o Opcodes/pvinterp.o	\
		Opcodes/pvocext.o Opcodes/pvread.o Opcodes/ugens8.o	\
		Opcodes/vpvoc.o Opcodes/pvoc.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

pvs_ops.dll:	Opcodes/ifd.o Opcodes/partials.o Opcodes/psynth.o	\
		Opcodes/pvsbasic.o Opcodes/pvscent.o Opcodes/pvsdemix.o	\
		Opcodes/pvs_ops.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

scansyn.dll: Opcodes/scansyn.o Opcodes/scansynx.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

vbap.dll:	Opcodes/vbap.o Opcodes/vbap_eight.o Opcodes/vbap_four.o	\
		Opcodes/vbap_sixteen.o Opcodes/vbap_zak.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

mixer.dll: Opcodes/mixer.oo
	$(CXX) -O2 -shared -o $@ $< $(LDFLAGS) -lstdc++ -lole32 -luuid -lwsock32 $(LIBS)

widgets.dll: InOut/FL_graph.oo InOut/winFLTK.o InOut/widgets.oo
	$(CXX) -O2 -shared -o $@ $^ $(LDFLAGS) $(FLTK_LIBS) $(LIBS)

rtpa.dll: InOut/rtpa.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) D:/MinGW/lib/portaudio.dll -lwinmm -ldsound -lole32 $(LIBS)

rtwinmm.dll: InOut/rtwinmm.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) -lwinmm $(LIBS)

pmidi.dll: InOut/pmidi.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) -lportmidi -lporttime -lwinmm $(LIBS)

fluidOpcodes.dll: Opcodes/fluidOpcodes/fluidOpcodes.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) $(FLUID_LIBS) $(LIBS)

osc.dll: Opcodes/OSC.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) $(OSC_LIBS) $(LIBS)

stdutil.dll:	util/atsa.o util/cvanal.o util/dnoise.o util/envext.o	\
		util/xtrct.o util/het_export.o util/het_import.o	\
		util/hetro.o util/lpanal.o util/lpc_export.o		\
		util/lpc_import.o util/mixer.o util/pvanal.o		\
		util/pvlook.o util/scale.o util/sndinfo.o util/srconv.o	\
		util/std_util.o
	$(CC) -O2 -shared -o $@ $^ $(LDFLAGS) $(LIBS)

%.dll: Opcodes/%.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) $(LIBS)

$(PROGRAM): frontends/csound/csound_main.o $(CSOUNDLIB)
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

cvanal.exe: util/cvl_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

dnoise.exe: util/dnoise_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

hetro.exe: util/het_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

lpanal.exe: util/lpc_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

mixer.exe: util/mixer_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

pvanal.exe: util/pvl_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

scale.exe: util/scale_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

sndinfo.exe: util/sndinfo_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

srconv.exe: util/srconv_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

extractor.exe: util/xtrc_main.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

scsort.exe: util1/sortex/smain.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

extract.exe: util1/sortex/xmain.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

csb64enc.exe: util1/csd_util/base64.o util1/csd_util/csb64enc.o
	$(CXX) -O2 -o $@ $^ $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

makecsd.exe: util1/csd_util/base64.o util1/csd_util/makecsd.o
	$(CXX) -O2 -o $@ $^ $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

cs.exe: util1/csd_util/cs.o
	$(CXX) -O2 -o $@ $< $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

scot.exe: util1/scot/scot.o util1/scot/scot_main.o
	$(CXX) -O2 -o $@ $^ $(LDFLAGS) $(CSLIB_LNK) $(LIBS)

frontends/winsound/winsound.cxx: frontends/winsound/winsound.fl
	fluid -c -o $@ -h frontends/winsound/winsound.h $<

frontends/winsound/winsound.oo: frontends/winsound/winsound.cxx
	$(CXX) $(CFLAGS) -c $< -o $@

frontends/winsound/main.oo:	frontends/winsound/main.cxx		\
				frontends/winsound/winsound.cxx
	$(CXX) $(CFLAGS) -c $< -o $@

$(WINSOUND): frontends/winsound/winsound.oo frontends/winsound/main.oo
	$(CXX) -O2 -o $@ $^ $(LDFLAGS) $(FLTK_LIBS) $(CSLIB_LNK) $(LIBS)

Opcodes/py/pythonopcodes.o: Opcodes/py/pythonopcodes.c
	$(CC) $(CFLAGS) -I$(PYINCDIR) -c $< -o $@

py.dll: Opcodes/py/pythonopcodes.o
	$(CC) -O2 -shared -o $@ $< $(LDFLAGS) $(PYLIB) $(LIBS)

wrappers: _csnd.dll _jcsound.dll

interfaces/java_interface_wrap.oo: interfaces/java_interface_wrap.cc
	$(CXX) $(CFLAGS) -fno-strict-aliasing -D__BUILDING_CSOUND_INTERFACES -Iinterfaces -c $< -o $@

interfaces/python_interface_wrap.oo: interfaces/python_interface_wrap.cc
	$(CXX) $(CFLAGS) -fno-strict-aliasing -D__BUILDING_CSOUND_INTERFACES -I$(PYINCDIR) -Iinterfaces -c $< -o $@

_csnd.dll:	interfaces/filebuilding.oo interfaces/CppSound.oo	\
		interfaces/CsoundFile.oo interfaces/cs_glue.oo		\
		interfaces/csPerfThread.oo interfaces/pyMsgCb.oo	\
		interfaces/Soundfile.oo interfaces/python_interface_wrap.oo
	$(CXX) -O2 -shared -o $@ $^ $(LDFLAGS) -Wl,--add-stdcall-alias -Wl,--output-def,_csnd.def $(CSLIB_LNK) -lstdc++ $(PYLIB) $(LIBS)

_jcsound.dll:	interfaces/filebuilding.oo interfaces/CppSound.oo	\
		interfaces/CsoundFile.oo interfaces/cs_glue.oo		\
		interfaces/csPerfThread.oo interfaces/pyMsgCb_stub.oo	\
		interfaces/Soundfile.oo interfaces/java_interface_wrap.oo
	$(CXX) -O2 -shared -o $@ $^ $(LDFLAGS) -Wl,--add-stdcall-alias -Wl,--output-def,_jcsound.def $(CSLIB_LNK) -lstdc++ $(LIBS)

$(CSOUND5GUI):	frontends/fltk_gui/ConfigFile.oo			\
		frontends/fltk_gui/CsoundAboutWindow_FLTK.oo		\
		frontends/fltk_gui/CsoundCopyrightInfo.oo		\
		frontends/fltk_gui/CsoundGlobalSettings.oo		\
		frontends/fltk_gui/CsoundGlobalSettingsPanel_FLTK.oo	\
		frontends/fltk_gui/CsoundGUIConsole.oo			\
		frontends/fltk_gui/CsoundGUIConsole_FLTK.oo		\
		frontends/fltk_gui/CsoundGUIMain.oo			\
		frontends/fltk_gui/CsoundGUIMain_FLTK.oo		\
		frontends/fltk_gui/CsoundPerformance.oo			\
		frontends/fltk_gui/CsoundPerformanceSettings.oo		\
		frontends/fltk_gui/CsoundPerformanceSettingsPanel_FLTK.oo   \
		frontends/fltk_gui/CsoundUtilitiesWindow_FLTK.oo	\
		frontends/fltk_gui/CsoundUtility.oo			\
		frontends/fltk_gui/main.oo				\
		interfaces/csPerfThread.oo
	$(CXX) -O2 -o $@ $^ $(LDFLAGS) $(FLTK_LIBS) $(CSLIB_LNK) $(LIBS)

frontends/fltk_gui/%_FLTK.cpp: frontends/fltk_gui/%_FLTK.fl
	fluid -c -o $@ -h frontends/fltk_gui/$*_FLTK.hpp $<

frontends/fltk_gui/CsoundPerformance.oo:				\
		frontends/fltk_gui/CsoundPerformance.cpp
	$(CXX) $(CFLAGS) -Iinterfaces -c $< -o $@

frontends/fltk_gui/CsoundPython.oo: frontends/fltk_gui/CsoundPython.cpp
	$(CXX) $(CFLAGS) -Iinterfaces -c $< -o $@

frontends/fltk_gui/ConfigFile.cpp:					\
		frontends/fltk_gui/CsoundAboutWindow_FLTK.cpp		\
		frontends/fltk_gui/CsoundGlobalSettingsPanel_FLTK.cpp	\
		frontends/fltk_gui/CsoundGUIConsole_FLTK.cpp		\
		frontends/fltk_gui/CsoundGUIMain_FLTK.cpp		\
		frontends/fltk_gui/CsoundPerformanceSettingsPanel_FLTK.cpp  \
		frontends/fltk_gui/CsoundUtilitiesWindow_FLTK.cpp

clean:
	-rm `find . -type f \( -name "*.o" -o -name "*.oo" \) -print`
	-rm `find . -type f \( -name "*.a" -o -name "*.dll" \) -print`
	-rm `find . -type f \( -name "*.exe" -o -name "*.xmg" \) -print`
	-rm csound32.def csound64.def _csnd.def csnd.py csnd.pyc csnd.pyo
	-rm _jcsound.def $(CSOUNDLIB)
	-rm interfaces/python_interface_wrap.cc
	-rm interfaces/python_interface_wrap.h
	-rm interfaces/java_interface_wrap.cc
	-rm interfaces/java_interface_wrap.h
	-rm frontends/fltk_gui/*_FLTK.cpp frontends/fltk_gui/*_FLTK.hpp
	-rm frontends/winsound/winsound.cxx frontends/winsound/winsound.h

