# 
# GAINQC Makefile -- Compiles and installs GAINQC 
# (c) 2007 Goncalo Abecasis, Shyam Gopalakrishnan
#

# current version of the software 
VERSION=0.9.5

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

# default C++ compiler 
CXX=g++

# default compilation flags are 
# 
# CFLAGS=-O2 -I./libsrc/ -I./gainqc-src
# 
CFLAGS=-O2 -Wall -I./libsrc -I./gainqc-src -D_FILE_OFFSET_BITS=64 -g

# executable file names and locations 
BINDIR = executables
GAINQC = $(BINDIR)/gainqc
EXECUTABLES = $(GAINQC)

# GAINQC File Set 
QCBASE = gainqc-src/SNPInfo gainqc-src/AssayInfo gainqc-src/GenotypeLoader \
         gainqc-src/FirstPass gainqc-src/QC_Settings \
	 gainqc-src/RelationCheck gainqc-src/SecondPass \
	 gainqc-src/Quality gainqc-src/HapMapReference \
         gainqc-src/AlleleTools gainqc-src/QCHistograms \
	 gainqc-src/SampleLabel gainqc-src/IgnoreSamples \
	 gainqc-src/ResultFileOutput gainqc-src/LogManager
QCHDR = $(QCBASE:=.h) gainqc-src/constants.h
QCSRC = $(QCBASE:=.cpp) gainqc-src/GAINQC.cpp
QCOBJ = $(QCSRC:.cpp=.o)

# Utility Library File Set 
LIBFILE = libsrc/lib-gainqc.a 
LIBMAIN = libsrc/BasicHash libsrc/CustomSettings libsrc/Error \
          libsrc/FortranFormat libsrc/GenotypeLists libsrc/Hash \
          libsrc/IntArray libsrc/MapFunction \
          libsrc/MathGenMin libsrc/MathGold libsrc/MathMatrix \
	  libsrc/MathStats libsrc/MathSVD \
	  libsrc/MathVector libsrc/MemoryInfo \
	  libsrc/OptimizerConstraints libsrc/Parameters \
	  libsrc/PedigreeAlleleFreq libsrc/Pedigree \
	  libsrc/PedigreeDescription libsrc/PedigreeFamily \
	  libsrc/PedigreeGlobals libsrc/PedigreePerson \
	  libsrc/QuickIndex libsrc/Random libsrc/Sort \
	  libsrc/StringArray libsrc/StringBasics libsrc/StringHash \
	  libsrc/StringMap

LIBPED = libsrc/PedigreeLoader libsrc/PedigreeTwin libsrc/PedigreeTrim
LIBPDF = libsrc/PDF libsrc/PDFinfo libsrc/PDFfont libsrc/PDFpage \
	 libsrc/PDFBarChart libsrc/AxisLimits libsrc/ChartLayout \
	 libsrc/PDFChartLayout
LIBSRC = $(LIBMAIN:=.cpp) $(LIBPED:=.cpp) $(LIBPDF:=.cpp)
LIBHDR = $(LIBMAIN:=.h) libsrc/Constant.h \
	 libsrc/MathConstant.h libsrc/PedigreeAlleles.h libsrc/LongInt.h \
	 libsrc/ChartPoint.h
LIBOBJ = $(LIBSRC:.cpp=.o)
 
# private parameters 
FETCHDIR=$(HOME)/GAINQC/gainqc-src
DISTRIBDIR=$(HOME)/distrib/gainqc-$(VERSION)

# helpful screen listing available options 
help :
	@echo "GAINQC Source Distribution"
	@echo " "
	@echo "This Makefile will compile and install GAINQC 1.0 on your system"
	@echo " "
	@echo "  Type...          To..."
	@echo "  make help        Display this help screen"
	@echo "  make all         Compile gainqc and related 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)

# dependencies for executables 
$(GAINQC) : $(LIBFILE) $(QCOBJ) $(BINDIR)
	$(CXX) $(CFLAGS) -o $@ $(QCOBJ) $(LIBFILE) -lm

$(BINDIR) :
	mkdir $(BINDIR)

$(LIBFILE) : $(LIBOBJ) $(LIBHDR)
	ar -cr $@ $(LIBOBJ)
	ranlib $@

$(QCOBJ) : $(QCHDR) $(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 $(INSTALLDIR)

new-version :
	mkdir -p $(DISTRIBDIR) $(DISTRIBDIR)/gainqc
	mkdir -p $(DISTRIBDIR)/libsrc
	cp ChangeLog README $(DISTRIBDIR)
	cp Makefile $(DISTRIBDIR)
	cp -R examples $(DISTRIBDIR)
	
#fetch :
#	cd $(FETCHDIR) ; cp $(QCSRC) $(QCHDR) $(DISTRIBDIR)/gainqc
#	cd $(FETCHDIR) ; cp $(LIBSRC) $(LIBHDR) $(DISTRIBDIR)/libsrc
#	cd $(DISTRIBDIR); csh ../stamp MaCH

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

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

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

archive : clean
	mkdir -p gainqc-$(VERSION)
	cp -R README Makefile gainqc-$(VERSION)
#	cp -R gainqc libsrc examples gainqc-$(VERSION)
	cp -R libsrc gainqc-src gainqc-$(VERSION)
	tar -cvf gainqc-$(VERSION).tar gainqc-$(VERSION)
	gzip -f --best gainqc-$(VERSION).tar
	rm -rf gainqc-$(VERSION)

distrib : $(EXECUTABLES)
	mkdir -p gainqc-$(VERSION)
#	cp -R README ChangeLog $(EXECUTABLES) examples gainqc-$(VERSION)
	cp -R README gainqc-$(VERSION)
	cp -R $(EXECUTABLES) gainqc-$(VERSION)
	tar -cvf `uname`-gainqc.tar gainqc-$(VERSION)
	gzip -f `uname`-gainqc.tar
	rm -rf gainqc-$(VERSION)

windowszip : $(EXECUTABLES)
	mkdir -p gainqc-$(VERSION)
#	cp -R README ChangeLog $(EXECUTABLES) examples gainqc-$(VERSION)
	cp -R $(EXECUTABLES) gainqc-$(VERSION)
	zip -r Windows-gainqc.zip gainqc-$(VERSION)
	rm -rf gainqc-$(VERSION)

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


