# -----------------------------------------------------------------------------
# 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,
# Motif 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.sunlabs.com/research/tcl).
#

INSTALL		= \cp
REMOVE		= \rm -f

SPARKY		= /usr/local/src/sparky
SPARKY_SRC	= $(SPARKY)/c++
PY_VERSION	= 2.1
PY_VER		= 21
PYTHON_PREFIX	= /usr/local
PYTHON_LIB	= $(PYTHON_PREFIX)/lib/python$(PY_VERSION)
PYTHON_INC	= $(PYTHON_PREFIX)/include/python$(PY_VERSION)
TCLTK_VERSION	= 8.3
TCLTK_VER	= 83
TK_PREFIX	= /usr/local
TK_VERSION	= tk$(TCLTK_VERSION)
TCL_VERSION	= 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_VERSION) -l$(TCL_VERSION) -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 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 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)
SHLIB_SUFFIX	= .so
SPY_SHLIB	= spy$(SHLIB_SUFFIX)
TKINTER_SHLIB	= _tkinter$(SHLIB_SUFFIX)

.SUFFIXES: .cc

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

all: $(SPY_SHLIB) $(TKINTER_SHLIB) nopython

nopython: $(EXECUTABLES)

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

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_SHLIB) $(TKINTER_SHLIB) debug-sparky _tkinter.o

force:

# -----------------------------------------------------------------------------
# Build a Sparky with Python statically linked in for profiling.
#
PYLDFLAGS	= -L$(PYTHON_LIB)/config -lpython$(PY_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).lib
WIN32_TK_LIB	= /tools/Tcl/lib/tk$(TCLTK_VER).lib
WIN32_TCL_LIB	= /tools/Tcl/lib/tcl$(TCLTK_VER).lib

spy.dll: python.o $(SPARKY_OBJS) spy.def libtcl$(TCLTK_VER).a libtk$(TCLTK_VER).a libpython$(PY_VER).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).a libtk$(TCLTK_VER).a libpython$(PY_VER).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).a,
# libtcl$(TCLTK_VER).a, libtk$(TCLTK_VER).a
# for use with gcc starting from Python and Tcl/Tk distribution libraries
# built with other Microsoft Windows compilers.
#

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

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

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

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

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

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

include $(SPARKY_SRC)/Makefile.dep
