#----------------------------------------------------------------------------
# Project specific path defintions.
#----------------------------------------------------------------------------
LIBINSTDIR = ../lib
LIBINCLDIR  = ../include

PROJDIR    = .


SRC        = $(PROJDIR)/src
INCL       = $(PROJDIR)/include
OBJ        = $(PROJDIR)/obj
BIN        = $(PROJDIR)/bin
LIB        = $(PROJDIR)/lib
TEST       = $(PROJDIR)/test
EXAMPLES   = $(PROJDIR)/examples
PROJS      = ./..
INSTALLDIR = $(PROJS)/bin
#----------------------------------------------------------------------------
# LINCLUDES and LDEFINES are appended to CFLAGS and C++FLAGS
#----------------------------------------------------------------------------
LDEFINES    = -DNO_RANGE_CHECK  
LINCLUDES      =  -I$(INCL) -I$(LIBINCLDIR) 

#----------------------------------------------------------------------------
# Include the appropriate compiler/platform definitions ...
#----------------------------------------------------------------------------
include ../etc/Makefile.platform

CIFLIBS = $(LIBINSTDIR)/libciffileobj.a \
          $(LIBINSTDIR)/libcifobj.a \
          $(LIBINSTDIR)/libcifstr.a \
          $(LIBINSTDIR)/libistable.a \
          $(LIBINSTDIR)/libregex.a \
          $(LIBINSTDIR)/libtblindex.a \
          $(LIBINSTDIR)/libndbmisc.a

# TARGET1, 2 is only for test
TARGET1       = $(BIN)/FOtest1

HARV    = $(BIN)/pdb_extract
SF      = $(BIN)/pdb_extract_sf
EXTRACT = $(BIN)/extract

ALLTARGETS =  $(HARV) $(SF) $(EXTRACT) # $(TARGET1)

SRCFILES = $(SRC)/harv.C \
           $(SRC)/cns.C \
           $(SRC)/ccp4.C \
           $(SRC)/shelx.C \
           $(SRC)/solve.C \
           $(SRC)/tnt.C \
           $(SRC)/snb.C \
           $(SRC)/warp.C \
           $(SRC)/sharp.C \
           $(SRC)/nrutil.C \
           $(SRC)/util.C \
           $(SRC)/sf-log.C \
           $(SRC)/sf-refine.C \
           $(SRC)/sf-initial.C \
           $(SRC)/pdb_extract_sf.C \
           $(SRC)/struct_align.C \
           $(SRC)/ls-fit.C \
           $(SRC)/seq-sub.C \
           $(SRC)/cif2pdb.C \
           $(SRC)/software.C \
           $(SRC)/pdb2cif.C \
           $(SRC)/text_parser.C \
           $(SRC)/write-mmcif.C \
           $(SRC)/nmr.C 

#TARGETSRC =  $(SRC)/FOtest5.C 

TESTFILES = $(TEST)/deposit.mmcif \
            $(TEST)/water_pick.pdb \
            $(TEST)/w1.sca \
            $(TEST)/w2.sca


HFILES = $(INCL)/atom_mass.h $(INCL)/harv.h $(INCL)/match.h $(INCL)/nrutil.h \
         $(INCL)/sf.h $(INCL)/sg_nsym.h $(INCL)/software.h $(INCL)/structure.h \
         $(INCL)/structure-ini.h $(INCL)/util.h $(INCL)/version.h

# object for each program
OBJS_HARV =  $(OBJ)/harv.o \
            $(OBJ)/cns.o \
            $(OBJ)/ccp4.o \
            $(OBJ)/shelx.o \
            $(OBJ)/tnt.o \
            $(OBJ)/snb.o \
            $(OBJ)/warp.o \
            $(OBJ)/solve.o \
            $(OBJ)/sharp.o \
            $(OBJ)/sf-log.o \
            $(OBJ)/nrutil.o\
            $(OBJ)/pdb2cif.o\
            $(OBJ)/software.o\
            $(OBJ)/text_parser.o\
            $(OBJ)/write-mmcif.o\
            $(OBJ)/util.o \
            $(OBJ)/nmr.o

OBJS_SF   = $(OBJ)/pdb_extract_sf.o  \
            $(OBJ)/sf-refine.o  \
            $(OBJ)/sf-initial.o  \
            $(OBJ)/util.o  

OBJS_EXTRACT   = $(OBJ)/struct_align.o \
                 $(OBJ)/ls-fit.o\
                 $(OBJ)/seq-sub.o\
                 $(OBJ)/nrutil.o\
                 $(OBJ)/util.o\
                 $(OBJ)/text_parser.o\
                 $(OBJ)/cif2pdb.o

#OBJS_TEST1 = $(OBJ)/FOtest5.o

all: $(ALLTARGETS)

#
# Making application and generating objects for each program.
#
# test1
#$(TARGET1): $(OBJS_TEST1)
#	$(CCC) -O  $(C++FLAGS) -o $@ $(OBJS_TEST1) $(LDFLAGS)  $(CIFLIBS)    -lm $(MALLOCLIB)

#$(OBJ)/FOtest5.o: $(SRC)/FOtest5.C $(HFILES)
#	$(CCC) -O  $(C++FLAGS) -c $(SRC)/FOtest5.C -o $@

# ------pdb_extract

$(HARV): $(HFILES) $(OBJS_HARV) 
	$(CCC)  $(C++FLAGS_NONANSI) -o $@ $(OBJS_HARV)  $(LDFLAGS) $(CIFLIBS) -lm $(MALLOCLIB)

$(OBJ)/harv.o: $(SRC)/harv.C $(HFILES)
	$(CCC) -O  $(C++FLAGS_NONANSI) -c   $(SRC)/harv.C -o $@

$(OBJ)/cns.o:  $(SRC)/cns.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/cns.C -o $@

$(OBJ)/ccp4.o:   $(SRC)/ccp4.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/ccp4.C -o $@

$(OBJ)/shelx.o:  $(SRC)/shelx.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/shelx.C -o $@

$(OBJ)/tnt.o: $(SRC)/tnt.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/tnt.C -o $@

$(OBJ)/snb.o: $(SRC)/snb.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/snb.C -o $@

$(OBJ)/warp.o: $(SRC)/warp.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/warp.C -o $@

$(OBJ)/solve.o: $(SRC)/solve.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/solve.C -o $@

$(OBJ)/sharp.o: $(SRC)/sharp.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/sharp.C -o $@

$(OBJ)/sf-log.o: $(SRC)/sf-log.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/sf-log.C -o $@

$(OBJ)/nrutil.o: $(SRC)/nrutil.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/nrutil.C -o $@

$(OBJ)/util.o: $(SRC)/util.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/util.C -o $@

$(OBJ)/pdb2cif.o: $(SRC)/pdb2cif.C $(HFILES)
	$(CCC) -O   $(C++FLAGS)  -c  $(SRC)/pdb2cif.C -o $@

$(OBJ)/software.o: $(SRC)/software.C $(HFILES)
	$(CCC) -O   $(C++FLAGS)  -c  $(SRC)/software.C -o $@

$(OBJ)/text_parser.o: $(SRC)/text_parser.C $(HFILES)
	$(CCC) -O   $(C++FLAGS)  -c  $(SRC)/text_parser.C -o $@

$(OBJ)/write-mmcif.o: $(SRC)/write-mmcif.C $(HFILES)
	$(CCC) -O   $(C++FLAGS)  -c  $(SRC)/write-mmcif.C -o $@

$(OBJ)/nmr.o: $(SRC)/nmr.C $(HFILES)
	$(CCC) -O   $(C++FLAGS)  -c  $(SRC)/nmr.C -o $@


#------pdb_extract_sf

$(SF): $(HFILES) $(OBJS_SF)
	$(CCC)   $(C++FLAGS) -o $@ $(OBJS_SF) $(LDFLAGS) $(CIFLIBS) -lm $(MALLOCLIB)

$(OBJ)/pdb_extract_sf.o: $(SRC)/pdb_extract_sf.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/pdb_extract_sf.C -o $@

$(OBJ)/sf-refine.o: $(SRC)/sf-refine.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/sf-refine.C -o $@

$(OBJ)/sf-initial.o: $(SRC)/sf-initial.C $(HFILES)
	$(CCC) -O   $(C++FLAGS) -c  $(SRC)/sf-initial.C -o $@


#------extract

$(EXTRACT): $(OBJS_EXTRACT)
	$(CCC)  $(C++FLAGS) -o $@ $(OBJS_EXTRACT) $(LDFLAGS) $(CIFLIBS) -lm $(MALLOCLIB)

$(OBJ)/struct_align.o: $(SRC)/struct_align.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/struct_align.C -o $@

$(OBJ)/ls-fit.o: $(SRC)/ls-fit.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/ls-fit.C -o $@

$(OBJ)/seq-sub.o: $(SRC)/seq-sub.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/seq-sub.C -o $@

$(OBJ)/cif2pdb.o: $(SRC)/cif2pdb.C $(HFILES)
	$(CCC) -O  $(C++FLAGS) -c  $(SRC)/cif2pdb.C -o $@



testharv: $(HARV)
	$(HARV) -e MR -r CNS -iCIF $(TEST)/deposit.mmcif -iPDB $(TEST)/water_pick.pdb -o $(TEST)/name.cif.out 2>&1 | tee $(TEST)/testharv.out

testsf: $(SF)
	$(SF) -dp HKL -dt I -c 1 -w 1 -idat $(TEST)/w1.sca -c 1 -w 2 -idat $(TEST)/w2.sca -o $(TEST)/pdb_extract_sf.mmcif 2>&1 | tee $(TEST)/testsf.out

testpdb: $(EXTRACT)
	$(EXTRACT) -pdb $(TEST)/water_pick.pdb




install:$(ALLTARGETS)
	cp $(HARV) $(INSTALLDIR)/.
	cp $(SF) $(INSTALLDIR)/.
	cp $(EXTRACT) $(INSTALLDIR)/.
#	cp $(TARGET1) $(INSTALLDIR)/.

.PHONY : clean
clean:
	@rm -f $(OBJ)/*.o
	@rm -f $(ALLTARGETS)

export:
	mkdir -p $(EXPORT_DIR)
	@cd $(EXPORT_DIR); mkdir -p $(INCL)
	$(EXPORT) $(EXPORT_LIST) $(HFILES) $(EXPORT_DIR)/$(INCL)
	@cd $(EXPORT_DIR); mkdir -p $(SRC)
	$(EXPORT) $(EXPORT_LIST) $(SRCFILES) $(TARGETSRC) $(EXPORT_DIR)/$(SRC)
	@cd $(EXPORT_DIR); mkdir -p $(BIN)
	@cp -r $(LIB) $(EXPORT_DIR)/$(LIB)
	@cd $(EXPORT_DIR); mkdir -p $(OBJ)
	@cd $(EXPORT_DIR); mkdir -p $(TEST)
	@cp $(TESTFILES) $(EXPORT_DIR)/$(TEST)
	@cd $(EXPORT_DIR); mkdir -p $(EXAMPLES)
	@cp -r $(EXAMPLES)/Example_1 $(EXPORT_DIR)/$(EXAMPLES)
	@cp Makefile $(EXPORT_DIR)

