# -----------------------------------------------------------------------------
# Build Sparky and programs to create and inspect UCSF format spectrum files
# bruk2ucsf, pipe2ucsf, vnmr2ucsf. peaks2ucsf, matrix2ucsf, ucsfdata
#
# Binary distributions of Sparky are available at
#
#	http://www.cgl.ucsf.edu/home/sparky
#
# If you want to compile your own version you will need Unix, X Windows,
# Tcl/Tk and a C++ compiler.  If you want to build Sparky as an extension
# to the Python language you will also need Python (http://www.python.org),
# and shared library versions of Tcl/Tk (http://www.tcl.tk).
#

INSTALL		= \cp
REMOVE		= \rm -f

SPARKY		= /usr/local/src/sparky
SPARKY_SRC	= $(SPARKY)/c++
PYTHON_VERSION	= 2.3
PY_VER_WIN32	= 23
PYTHON_PREFIX	= /usr/local
PYTHON_LIB	= $(PYTHON_PREFIX)/lib/python$(PYTHON_VERSION)
PYTHON_INC	= $(PYTHON_PREFIX)/include/python$(PYTHON_VERSION)
TCLTK_VERSION	= 8.4
TCLTK_VER_WIN32	= 84
TK_PREFIX	= /usr/local
TK_LIBNAME	= tk$(TCLTK_VERSION)
TCL_LIBNAME	= tcl$(TCLTK_VERSION)
PLATFORM	= unix

CXX		= g++
CXXFLAGS	= 
CC		= gcc
CFLAGS		=
PYFLAGS		= -I$(PYTHON_INC) -I$(PYTHON_LIB)/config
TKFLAGS		= -I$(TK_PREFIX)/include
TKLIBS		= -L$(TK_PREFIX)/lib -l$(TK_LIBNAME) -l$(TCL_LIBNAME) -lX11
EXTRALIBS	= 
SYSLIBS		= -lm
LDLIBS		= $(TKLIBS) $(SYSLIBS) $(EXTRALIBS)
LDFLAGS		=
LDSHARED	= -shared
DEPEND		= -MM

CXX_RULE_PREFIX	=
VPATH		= $(SPARKY_SRC)

SPARKY_OBJS	= \
	assignguess.o assigncopy.o attacheddata.o atom.o axismap.o \
	binaryIO.o blockfile.o brukerfile.o \
	color.o command.o condition.o contour.o contourplane.o \
	contourstream.o crosspeak.o dataregion.o \
	felixfile.o format.o grid.o group.o \
	integrate.o label.o line.o linefit.o lusolve.o list.o \
	memalloc.o memcache.o model.o molecule.o notifier.o nmrdata.o num.o \
	objectid.o ornament.o \
	paths.o peak.o peakgp.o peakpick.o print.o project.o \
	rectangle.o region.o reporter.o resonance.o \
	savefile.o session.o simplex.o spectrum.o spectrumdata.o \
	spoint.o stringc.o subarray.o system-$(PLATFORM).o \
	table.o ucsffile.o \
	uiassign.o uiassigncopy.o \
	uicolor.o uicomponents.o uicontour.o uicscale.o \
	uidatalocation.o uidialog.o uidrawing.o uiepanel.o \
	uifile.o uiguess.o uihelp.o uiintegrate.o uilabel.o \
	uimain.o uimenu.o uimidas.o uimode.o \
	uinote.o uiornament.o uiornamentsize.o uioverlay.o \
	uipeak.o uipkpanel.o uipick.o uiplop.o uipredefined.o \
	uipreference.o uiprint.o \
	uiregion.o uirename.o uiresonances.o uirpanel.o \
	uiscale.o uishifts.o \
	uislice.o uispectrum.o uisync.o \
	uiview.o uiviewopt.o uiviewdepth.o uiviewlist.o uiviewwin.o uiwait.o \
	undo.o utility.o \
	winsystem-$(PLATFORM).o

#
# Files needed to make conversion programs pipe2ucsf, vnmr2ucsf, bruk2ucsf
#
NMR_OBJS	= binaryIO.o blockfile.o brukerfile.o list.o memalloc.o \
		  memcache.o nihfile.o nmrdata.o num.o spoint.o subarray.o \
		  stringc.o system-$(PLATFORM).o table.o ucsffile.o utility.o \
		  varianfile.o

#
# Files not part of sparky-no-python and spy.so
# Used for building Makefile.dep
#
OTHER_OBJS	= bruk2ucsf.o main.o main-debug.o matrix2ucsf.o nihfile.o \
		  peaks2ucsf.o pipe2ucsf.o python.o system-all.o \
		  ucsfdata.o varianfile.o vnmr2ucsf.o winsystem-all.o

EXE_SUFFIX	=
EXECUTABLES	= sparky-no-python$(EXE_SUFFIX) ucsfdata$(EXE_SUFFIX) \
		  pipe2ucsf$(EXE_SUFFIX) vnmr2ucsf$(EXE_SUFFIX) \
		  bruk2ucsf$(EXE_SUFFIX) peaks2ucsf$(EXE_SUFFIX) \
		  matrix2ucsf$(EXE_SUFFIX)
PYMOD_SUFFIX	= .so
SPY_PYMOD	= spy$(PYMOD_SUFFIX)
TKINTER_PYMOD	= _tkinter$(PYMOD_SUFFIX)

.SUFFIXES: .cc

.cc.o:
	$(CXX) $(CXXFLAGS) -c $(CXX_RULE_PREFIX)$<

# The following prevents automatic RCS checkout by GNU make.
# It causes make on Tru64 5.1 to fail with a hash table overflow message.
% : RCS/%,v

all: $(SPY_PYMOD) $(TKINTER_PYMOD) nopython

nopython: $(EXECUTABLES)

install-python: $(SPY_PYMOD) $(TKINTER_PYMOD) $(SPARKY_INSTALL)/python \
  $(SPARKY_INSTALL)/python/sparky $(SPARKY_INSTALL)/python/lib-tk
	$(INSTALL) $(SPY_PYMOD) $(SPARKY_INSTALL)/python/sparky
	chmod 755 $(SPARKY_INSTALL)/python/sparky/$(SPY_PYMOD)
	$(INSTALL) $(TKINTER_PYMOD) $(SPARKY_INSTALL)/python/lib-tk
	chmod 755 $(SPARKY_INSTALL)/python/lib-tk/$(TKINTER_PYMOD)

install-nopython: $(EXECUTABLES) $(SPARKY_INSTALL)/bin
	$(INSTALL) $(EXECUTABLES) $(SPARKY_INSTALL)/bin
	cd $(SPARKY_INSTALL)/bin ; \
	chmod 755 $(EXECUTABLES)

$(SPARKY_INSTALL)/bin $(SPARKY_INSTALL)/python \
$(SPARKY_INSTALL)/python/sparky $(SPARKY_INSTALL)/python/lib-tk:
	mkdir $@
	chmod 755 $@

sparky-no-python$(EXE_SUFFIX): main.o $(SPARKY_OBJS)
	$(CXX) -o $@ main.o $(SPARKY_OBJS) $(LDFLAGS) $(LDLIBS)

ucsfdata$(EXE_SUFFIX): ucsfdata.o $(NMR_OBJS)
	$(CXX) -o $@ ucsfdata.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

pipe2ucsf$(EXE_SUFFIX): pipe2ucsf.o $(NMR_OBJS)
	$(CXX) -o $@ pipe2ucsf.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

vnmr2ucsf$(EXE_SUFFIX): vnmr2ucsf.o $(NMR_OBJS)
	$(CXX) -o $@ vnmr2ucsf.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

bruk2ucsf$(EXE_SUFFIX): bruk2ucsf.o $(NMR_OBJS)
	$(CXX) -o $@ bruk2ucsf.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

peaks2ucsf$(EXE_SUFFIX): peaks2ucsf.o $(NMR_OBJS)
	$(CXX) -o $@ peaks2ucsf.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

matrix2ucsf$(EXE_SUFFIX): matrix2ucsf.o $(NMR_OBJS)
	$(CXX) -o $@ matrix2ucsf.o $(NMR_OBJS) $(LDFLAGS) $(SYSLIBS) $(EXTRALIBS)

spy.so: python.o $(SPARKY_OBJS)
	$(CXX) $(LDSHARED) -o $@ python.o $(SPARKY_OBJS) $(LDFLAGS) $(LDLIBS)

winsystem-$(PLATFORM).o: winsystem-$(PLATFORM).cc
	$(CXX) $(CXXFLAGS) $(TKFLAGS) -c $(SPARKY_SRC)/winsystem-$(PLATFORM).cc

python.o: python.cc
	$(CXX) $(CXXFLAGS) $(PYFLAGS) $(TKFLAGS) -c $(SPARKY_SRC)/python.cc

_tkinter.so: _tkinter.o
	$(CXX) $(LDSHARED) -o $@ _tkinter.o $(LDFLAGS) $(TKLIBS)

_tkinter.o: _tkinter.c
	$(CC) $(CFLAGS) $(TKFLAGS) $(PYFLAGS) -c $(SPARKY_SRC)/_tkinter.c

Makefile.dep: force
	cd $(SPARKY_SRC) ; \
	$(CXX) $(DEPEND) $(CXXFLAGS) $(TKFLAGS) $(PYFLAGS) \
		$(SPARKY_OBJS:.o=.cc) $(OTHER_OBJS:.o=.cc) > $@

TAGS: force
	cd $(SPARKY_SRC) ; etags *.cc *.h

clean:
	$(REMOVE) $(SPARKY_OBJS) $(OTHER_OBJS) $(PYTHON_OBJS) $(EXECUTABLES) \
		$(SPY_PYMOD) $(TKINTER_PYMOD) debug-sparky _tkinter.o

force:

# -----------------------------------------------------------------------------
# Build a Sparky with Python statically linked in for profiling.
#
PYLDFLAGS	= -L$(PYTHON_LIB)/config -lpython$(PYTHON_VERSION)
PYIFLAGS	= -I$(PYTHON_INC)

debug-sparky: main-debug.o python.o _tkinter.o $(SPARKY_OBJS)
	$(CXX) -o $@ main-debug.o python.o _tkinter.o $(SPARKY_OBJS) \
		$(LDFLAGS) $(PYLDFLAGS) $(LDLIBS)

main-debug.o: main-debug.cc
	$(CXX) $(CXXFLAGS) $(PYIFLAGS) -c $(SPARKY_SRC)/main-debug.cc

# -----------------------------------------------------------------------------
# The following targets are for building the Microsoft Windows version
#

WIN32_PYTHON_LIB	= /tools/Python/libs/python$(PY_VER_WIN32).lib
WIN32_TK_LIB	= /tools/Tcl/lib/tk$(TCLTK_VER_WIN32).lib
WIN32_TCL_LIB	= /tools/Tcl/lib/tcl$(TCLTK_VER_WIN32).lib

spy.dll: python.o $(SPARKY_OBJS) spy.def libtcl$(TCLTK_VER_WIN32).a libtk$(TCLTK_VER_WIN32).a libpython$(PY_VER_WIN32).a
	dllwrap --driver-name $(CXX) --def spy.def \
		-o spy.dll python.o $(SPARKY_OBJS) $(LDLIBS)

spy.def: python.o
	dlltool --export-all-symbols --output-def spy.def python.o

_tkinter.dll: _tkinter.o _tkinter.def libtcl$(TCLTK_VER_WIN32).a libtk$(TCLTK_VER_WIN32).a libpython$(PY_VER_WIN32).a
	dllwrap --driver-name $(CC) --def _tkinter.def \
		-o _tkinter.dll _tkinter.o $(LDLIBS)

_tkinter.def: _tkinter.o
	dlltool --export-all-symbols --output-def _tkinter.def _tkinter.o

# -----------------------------------------------------------------------------
# Build Python and Tcl/Tk libraries libpython$(PY_VER_WIN32).a,
# libtcl$(TCLTK_VER_WIN32).a, libtk$(TCLTK_VER_WIN32).a
# for use with gcc starting from Python and Tcl/Tk distribution libraries
# built with other Microsoft Windows compilers.
#

libpython$(PY_VER_WIN32).a: python$(PY_VER_WIN32).def
	dlltool --def python$(PY_VER_WIN32).def --dllname python$(PY_VER_WIN32).dll --output-lib $@

python$(PY_VER_WIN32).def: win32-python.def
	echo EXPORTS > $@
	nm $(WIN32_PYTHON_LIB) | grep "^........ [T] _" | sed "s/[^_]*_//" >> $@
	cat $(SPARKY_SRC)/win32-python.def >> $@

libtk$(TCLTK_VER_WIN32).a: tk$(TCLTK_VER_WIN32).def
	dlltool --def tk$(TCLTK_VER_WIN32).def --dllname tk$(TCLTK_VER_WIN32).dll --output-lib $@

tk$(TCLTK_VER_WIN32).def:
	echo EXPORTS > $@
	nm $(WIN32_TK_LIB) | grep "^........ [T] _" | sed "s/[^_]*_//" >> $@

libtcl$(TCLTK_VER_WIN32).a: tcl$(TCLTK_VER_WIN32).def
	dlltool --def tcl$(TCLTK_VER_WIN32).def --dllname tcl$(TCLTK_VER_WIN32).dll --output-lib $@

tcl$(TCLTK_VER_WIN32).def:
	echo EXPORTS > $@
	nm $(WIN32_TCL_LIB) | grep "^........ [T] _" | sed "s/[^_]*_//" >> $@

include $(SPARKY_SRC)/Makefile.dep
