#
# GOLD Makefile -- Compiles and installs GOLD command line tools
# (c) 2000-2001 Goncalo Abecasis
#

# version information
VERSION = 1.1.0

# default installation directory
INSTALLDIR=/usr/local/bin

# default C++ compiler and flags
CXX=gcc
CFLAGS=-O3 -I./libsrc/ 

# executable file names and locations
BINDIR = executables
LDMAX = $(BINDIR)/ldmax
COLLECT2 = $(BINDIR)/collect-simwalk2
SETUP2 = $(BINDIR)/setup-simwalk2
HAPLOXT = $(BINDIR)/haploxt
EXECUTABLES = $(LDMAX) $(COLLECT2) $(SETUP2) $(HAPLOXT)
EXAMPLES = sample/sample.dat sample/sample.ped sample/sample.gm sample/sample.xt

# LDMAX File Set
LDBASE = ldmax/LdMax
LDHDR = $(LDBASE:=.h) 
LDSRC = $(LDBASE:=.cpp) ldmax/Interface.cpp
LDOBJ = $(LDSRC:.cpp=.o)

# HAPLOXT File Set
XTBASE = haploxt/AssocLD haploxt/Core haploxt/HaploVector
XTHDR = $(XTBASE:=.h)
XTSRC = $(XTBASE:=.cpp) haploxt/Main.cpp
XTOBJ = $(XTSRC:.cpp=.o)

# COLLECT-SIMWALK2 File Set
COLLECTBASE = collect-simwalk2/Core collect-simwalk2/HaploSum \
 collect-simwalk2/HaploVector
COLLECTHDR = $(COLLECTBASE:=.h)
COLLECTSRC = $(COLLECTBASE:=.cpp) collect-simwalk2/collect-simwalk2.cpp
COLLECTOBJ = $(COLLECTSRC:.cpp=.o)

# SETUP-SIMWALK2 File Set
SETUPSRC = setup-simwalk2/setup-simwalk2.cpp
SETUPOBJ = $(SETUPSRC:.cpp=.o)

# Combined File Sets
GOLDSRC = $(LDSRC) $(XTSRC) $(COLLECTSRC) $(SETUPSRC)
GOLDHDR = $(LDHDR) $(XTHDR) $(COLLECTHDR) $(SETUPSRC)

# Utility Library File Set
LIBFILE = libsrc/lib-goncalo.a
LIBMAIN = libsrc/IntArray libsrc/MapFunction libsrc/MathAssoc libsrc/MathMatrix \
 libsrc/MathStats libsrc/MathVector libsrc/Parameters libsrc/Pedigree \
 libsrc/PedigreeAlleleFreq libsrc/PedigreeDescription libsrc/PedigreeFamily \
 libsrc/PedigreeGlobals libsrc/PedigreePerson libsrc/Sort \
 libsrc/StringArray libsrc/StringBasics libsrc/StringMap
LIBPED  = libsrc/PedigreeLoader libsrc/PedigreeTwin
LIBCPP = $(LIBMAIN:=.cpp) $(LIBPED:=.cpp)
LIBSRC = $(LIBCPP) libsrc/Error.c
LIBHDR = $(LIBMAIN:=.h) libsrc/Error.h libsrc/Constant.h \
 libsrc/MathConstant.h libsrc/PedigreeAlleles.h libsrc/LongInt.h
LIBOBJ = $(LIBCPP:.cpp=.o) libsrc/Error.o
 
# private parameters
FETCHDIR=$(HOME)/code
DISTRIBDIR=$(HOME)/code/distrib/gold-$(VERSION)

# helpful screen listing available options
help : 
	@echo "GOLD Source Distribution"
	@echo " "
	@echo "This Makefile will compile and install gold command line "
	@echo "tools on your system"
	@echo " "
	@echo "Type...           To..."
	@echo "make help         Display this help screen"
	@echo "make all          Compile command line tools"
	@echo "make install      Install binaries in $(INSTALLDIR)"
	@echo "make install INSTALLDIR=directory_for_binaries"
	@echo "                  Install binaries in directory_for_binaries"
	@echo "make clean        Delete temporary files"

# make everything
all : $(EXECUTABLES)

$(EXECUTABLES) : $(BINDIR)

$(BINDIR) :
	mkdir $(BINDIR)

# dependencies for executables
$(LDMAX) : $(LIBFILE) $(LDOBJ)
	$(CXX) $(CFLAGS) -o $@ $(LDOBJ) $(LIBFILE) -lm

$(COLLECT2) : $(LIBFILE) $(COLLECTOBJ)
	$(CXX) $(CFLAGS) -o $@ $(COLLECTOBJ) $(LIBFILE) -lm

$(SETUP2) : $(LIBFILE) $(SETUPOBJ)
	$(CXX) $(CFLAGS) -o $@ $(SETUPOBJ) $(LIBFILE) -lm

$(HAPLOXT) : $(LIBFILE) $(XTOBJ)
	$(CXX) $(CFLAGS) -o $@ $(XTOBJ) $(LIBFILE) -lm


$(LIBFILE) : $(LIBOBJ)
	ar -crs $@ $(LIBOBJ)

$(LDOBJ) : $(LDHDR) $(LIBHDR)

$(XTOBJ) : $(XTHDR) $(LIBHDR)

$(COLLECTOBJ) : $(COLLECTHDR) $(LIBHDR)

$(SETUPOBJ) : $(LIBHDR)

$(LIBOBJ) : $(LIBHDR)

clean :
	-rm -f */*.a */*.o $(EXECUTABLES) 

install : all $(INSTALLDIR)
	@echo " "
	@echo Installing to directory $(INSTALLDIR)
	@echo To select a different directory, run
	@echo " "
	@echo make install INSTALLDIR=your_preferred_dir
	@echo " "
	@cp $(EXECUTABLES) $(INSTALLDIR)

$(INSTALLDIR) :
	@echo " "
	@echo Creating directory $(INSTALLDIR)
	@echo " "
	@mkdir -p $(INSTALLDIR)

new-version :
	mkdir -p $(DISTRIBDIR) $(DISTRIBDIR)/libsrc
	mkdir -p $(DISTRIBDIR)/haploxt $(DISTRIBDIR)/ldmax
	mkdir -p $(DISTRIBDIR)/collect-simwalk2
	mkdir -p $(DISTRIBDIR)/setup-simwalk2
	mkdir -p $(DISTRIBDIR)/sample
	cp README $(DISTRIBDIR)
	cp Makefile $(DISTRIBDIR)
	
fetch : 
	cd $(FETCHDIR)/gold ; cp $(LDSRC) $(LDHDR) $(DISTRIBDIR)/ldmax
	cd $(FETCHDIR)/gold ; cp $(XTSRC) $(XTHDR) $(DISTRIBDIR)/haploxt
	cd $(FETCHDIR)/gold ; cp $(COLLECTSRC) $(COLLECTHDR) $(DISTRIBDIR)/collect-simwalk2
	cd $(FETCHDIR)/gold ; cp $(SETUPSRC) $(DISTRIBDIR)/setup-simwalk2
	cd $(FETCHDIR)/gold ; cp $(EXAMPLES) $(DISTRIBDIR)/sample
	cd $(FETCHDIR) ; cp $(LIBSRC) $(LIBHDR) $(DISTRIBDIR)/libsrc
	cd $(DISTRIBDIR); csh ../stamp GOLD

.c.o :
	$(CXX) $(CFLAGS) -o $@ -c $*.c

.cpp.o : 
	$(CXX) $(CFLAGS) -o $@ -c $*.cpp -DVERSION=\"$(VERSION)\"

archive : clean
	mkdir -p gold-$(VERSION)
	cp -R README Makefile ldmax haploxt collect-simwalk2 setup-simwalk2 libsrc sample gold-$(VERSION)
	tar -cvf gold-$(VERSION).tar gold-$(VERSION) 
	gzip -f --best gold-$(VERSION).tar
	rm -rf gold-$(VERSION)

distrib : $(EXECUTABLES)
	mkdir -p gold-$(VERSION)
	cp -R README $(EXECUTABLES) sample gold-$(VERSION)
	tar -cvf `uname`-gold.tar gold-$(VERSION)
	gzip -f `uname`-gold.tar
	rm -rf gold-$(VERSION)

.SUFFIXES : .cpp .c .o $(SUFFIXES)

