########################################
#### ProSMART INSTALLATION OPTIONS: ####

# Location of binaries and library - it is assumed that these directories exist.
# BIN_DIR specifies the location of the ProSMART binaries.
# LIB_DIR specifies the location of the ProSMART library, which comprises any required non-executable files.

# BIN_DIR can be any directory that is listed in the PATH variable (i.e. a directory for executables).
# LIB_DIR can be any directory (with sufficient read permissions).

# Default values:
BIN_DIR = /usr/local/bin/
LIB_DIR = /usr/local/share/
# Note: installation to these directories may require superuser privileges (i.e. 'make install' may fail, in which case 'sudo make install' might be used).

# Alternatively, uncomment the following lines to install into CCP4 directories:
#BIN_DIR = $(CCP4)/bin/
#LIB_DIR = $(CCP4)/share/

# Another common option:
#BIN_DIR = /usr/bin/
#LIB_DIR = $(BIN_DIR)

# Alternatively, uncomment the following lines to install in your home directory - this is recommended if you only want to install locally for yourself, e.g. if you are a beginner, or haven't got appropriate permissions for other directories (e.g. if you are not a superuser, i.e. haven't got the permissions/password required to run 'sudo make install'):
#BIN_DIR = ~/bin/
#LIB_DIR = ~/bin/

##### END OF INSTALLATION OPTIONS ######
########################################
########################################
## DO NOT MODIFY ANYTHING BELOW HERE! ##

# Dir containing source code:
SOURCE = src/

# Dir containing data required by ProSMART:
PROSMART_DATA_IN = data/

# Output dir name that data required by ProSMART will be copied to during installation.
# i.e. PROSMART_DATA_IN will be copied to $(LIB_DIR)$(PROSMART_DATA_OUT)
PROSMART_DATA_OUT = prosmart_data/

###################

MAKEFLAGS += -j 8

CXX = g++
CXXARGS = -static-libgcc -O2
CONFIG_FILE = config.h

ITNTJAMA=-I$(SOURCE)tnt_jama/
INCLUDES=${ITNTJAMA}

###################

# config.h is only (re)generated if CONFIG_HEADER is same and CONFIG_ID is different to that in current config.h, if it exists.
CONFIG_HEADER = ProSMART makefile generated config file
ifdef TMP_DIR
	CONFIG_ID = PROSMART_BIN_DIR=$(BIN_DIR) PROSMART_LIB_DIR=$(LIB_DIR)$(PROSMART_DATA_OUT) PROSMART_TMP_DIR=$(TMP_DIR)
else
	CONFIG_ID = PROSMART_BIN_DIR=$(BIN_DIR) PROSMART_LIB_DIR=$(LIB_DIR)$(PROSMART_DATA_OUT)
endif

OBJ_SHARED = prosmart_array_tools.o prosmart_xml.o prosmart_string_tools.o prosmartClass_Coords.o prosmartClass_Transform.o prosmartClass_PDBfile.o prosmart_process_management.o prosmart_file_management.o 

OBJ_ALIGN = $(OBJ_SHARED) alignClass_Align.o alignClass_Frag.o align_output_filehandling.o align_helix.o align_alignment_algorithm.o align_alignment_scoring.o align_cluster.o alignClass_Residues.o

OBJ_RESTRAIN = $(OBJ_SHARED) restrain_vector_operations.o restrainClass_Residues.o restrain_align_handler.o restrainClass_Atomic_Bonds.o restrainClass_Diff_Info.o restrain_likelihood.o restrain_boxing_algorithm.o restrain_bfgs_optimisation.o restrain_atomic_restraints.o restrain_hbond.o

OBJ_PROSMART = $(OBJ_SHARED) prosmart_align_tools.o prosmart_external_programs.o prosmart_multiple_superposition.o prosmart_results.o prosmart_pdb_tools.o prosmartClass_Restraints.o prosmart_params.o prosmart_windows.o

FILE_LIST = $(OBJ_ALIGN) $(OBJ_RESTRAIN) $(OBJ_PROSMART) prosmart_align prosmart_restrain prosmart align.o restrain.o prosmart.o $(CONFIG_FILE)

all : config align restrain prosmart

##################### generate config.h

config : 
	@if test -f $(CONFIG_FILE); then \
	  if [ "`grep "//$(CONFIG_HEADER)" $(CONFIG_FILE)`" == "//$(CONFIG_HEADER)" ]; then \
	    if [ "`grep "//$(CONFIG_ID)" $(CONFIG_FILE)`" != "//$(CONFIG_ID)" ]; then \
	      echo "//ProSMART makefile generated config file" > $(CONFIG_FILE); \
	      echo "//$(CONFIG_ID)" >> $(CONFIG_FILE); \
	      echo "#define PACKAGE_ROOT_BIN \"$(BIN_DIR)\"" >> $(CONFIG_FILE); \
	      echo "#define PACKAGE_ROOT_LIB \"$(LIB_DIR)$(PROSMART_DATA_OUT)\"" >> $(CONFIG_FILE); \
	      if [ "$(TMP_DIR)" != "" ]; then \
	        echo "#define PROSMART_TMP_DIR \"$(TMP_DIR)\"" >> $(CONFIG_FILE); \
	      fi; \
	      echo "#define PROSMART_TILDE \"`echo ~`\"" >> $(CONFIG_FILE); \
	    fi; \
	  fi; \
	else \
	  echo "//ProSMART makefile generated config file" > $(CONFIG_FILE); \
	  echo "//$(CONFIG_ID)" >> $(CONFIG_FILE); \
	  echo "#define PACKAGE_ROOT_BIN \"$(BIN_DIR)\"" >> $(CONFIG_FILE); \
	  echo "#define PACKAGE_ROOT_LIB \"$(LIB_DIR)$(PROSMART_DATA_OUT)\"" >> $(CONFIG_FILE); \
	  if [ "$(TMP_DIR)" != "" ]; then \
	    echo "#define PROSMART_TMP_DIR \"$(TMP_DIR)\"" >> $(CONFIG_FILE); \
	  fi; \
	  echo "#define PROSMART_TILDE \"`echo ~`\"" >> $(CONFIG_FILE); \
	fi

##################### Compile Executables

align : align.o
	@echo "Compiling prosmart_align"
	@$(CXX) $(CXXARGS) $(OBJ_ALIGN) align.o -o prosmart_align

restrain : restrain.o
	@echo "Compiling prosmart_restrain"
	@$(CXX) $(CXXARGS) $(OBJ_RESTRAIN) restrain.o -o prosmart_restrain

prosmart : prosmart.o
	@echo "Compiling prosmart"
	@$(CXX) $(CXXARGS) $(OBJ_PROSMART) prosmart.o -o prosmart

##################### Object Files For prosmart_align

alignClass_Align.o : $(SOURCE)alignClass_Align*
	@echo "Creating alignClass_Align.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)alignClass_Align.cpp ${INCLUDES}

alignClass_Residues.o : $(SOURCE)alignClass_Residues*
	@echo "Creating alignClass_Residues.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)alignClass_Residues.cpp ${INCLUDES}

alignClass_Frag.o : $(SOURCE)alignClass_Frag*
	@echo "Creating alignClass_Frag.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)alignClass_Frag.cpp ${INCLUDES}

align_output_filehandling.o : $(SOURCE)align_output_filehandling*
	@echo "Creating align_output_filehandling.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align_output_filehandling.cpp ${INCLUDES}

align_helix.o : $(SOURCE)align_helix*
	@echo "Creating align_helix.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align_helix.cpp ${INCLUDES}

align_alignment_algorithm.o : $(SOURCE)align_alignment_algorithm*
	@echo "Creating align_alignment_algorithm.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align_alignment_algorithm.cpp ${INCLUDES}

align_alignment_scoring.o : $(SOURCE)align_alignment_scoring*
	@echo "Creating align_alignment_scoring.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align_alignment_scoring.cpp ${INCLUDES}

align_cluster.o : $(SOURCE)align_cluster*
	@echo "Creating align_cluster.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align_cluster.cpp ${INCLUDES}

align.o : $(SOURCE)align.cpp ${OBJ_ALIGN}
	@echo "Creating align.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)align.cpp ${INCLUDES}

##################### Object Files For prosmart_restrain

restrain_vector_operations.o : $(SOURCE)restrain_vector_operations*
	@echo "Creating restrain_vector_operations.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_vector_operations.cpp ${INCLUDES}

restrainClass_Residues.o : $(SOURCE)restrainClass_Residues*
	@echo "Creating restrainClass_Residues.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrainClass_Residues.cpp ${INCLUDES}

restrain_align_handler.o : $(SOURCE)restrain_align_handler*
	@echo "Creating restrain_align_handler.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_align_handler.cpp ${INCLUDES}

restrainClass_Atomic_Bonds.o : $(SOURCE)restrainClass_Atomic_Bonds*
	@echo "Creating restrainClass_Atomic_Bonds.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrainClass_Atomic_Bonds.cpp ${INCLUDES}

restrainClass_Diff_Info.o : $(SOURCE)restrainClass_Diff_Info*
	@echo "Creating restrainClass_Diff_Info.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrainClass_Diff_Info.cpp ${INCLUDES}

restrain_likelihood.o : $(SOURCE)restrain_likelihood*
	@echo "Creating restrain_likelihood.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_likelihood.cpp ${INCLUDES}

restrain_boxing_algorithm.o : $(SOURCE)restrain_boxing_algorithm*
	@echo "Creating restrain_boxing_algorithm.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_boxing_algorithm.cpp ${INCLUDES}

restrain_hbond.o : $(SOURCE)restrain_hbond*
	@echo "Creating restrain_hbond.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_hbond.cpp ${INCLUDES}

restrain_bfgs_optimisation.o : $(SOURCE)restrain_bfgs_optimisation*
	@echo "Creating restrain_bfgs_optimisation.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_bfgs_optimisation.cpp ${INCLUDES}

restrain_atomic_restraints.o : $(SOURCE)restrain_atomic_restraints*
	@echo "Creating restrain_atomic_restraints.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain_atomic_restraints.cpp ${INCLUDES}

restrain.o : $(SOURCE)restrain.cpp ${OBJ_RESTRAIN}
	@echo "Creating restrain.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)restrain.cpp ${INCLUDES}

##################### Object Files For prosmart

prosmart_array_tools.o : $(SOURCE)prosmart_array_tools*
	@echo "Creating prosmart_array_tools.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_array_tools.cpp ${INCLUDES}

prosmartClass_Coords.o : $(SOURCE)prosmartClass_Coords*
	@echo "Creating prosmartClass_Coords.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmartClass_Coords.cpp ${INCLUDES}

prosmart_xml.o : $(SOURCE)prosmart_xml*
	@echo "Creating prosmart_xml.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_xml.cpp

prosmart_string_tools.o : $(SOURCE)prosmart_string_tools* $(SOURCE)prosmart_flags.h
	@echo "Creating prosmart_string_tools.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_string_tools.cpp

prosmart_align_tools.o : $(SOURCE)prosmart_align_tools*
	@echo "Creating prosmart_align_tools.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_align_tools.cpp ${INCLUDES}

prosmart_process_management.o : $(SOURCE)prosmart_process_management*
	@echo "Creating prosmart_process_management.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_process_management.cpp

prosmartClass_Restraints.o : $(SOURCE)prosmartClass_Restraints*
	@echo "Creating prosmartClass_Restraints.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmartClass_Restraints.cpp

prosmart_file_management.o : $(SOURCE)prosmart_file_management*
	@echo "Creating prosmart_file_management.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_file_management.cpp

prosmartClass_Transform.o : $(SOURCE)prosmartClass_Transform*
	@echo "Creating prosmartClass_Transform.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmartClass_Transform.cpp ${INCLUDES}

prosmartClass_PDBfile.o : $(SOURCE)prosmartClass_PDBfile*
	@echo "Creating prosmartClass_PDBfile.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmartClass_PDBfile.cpp ${INCLUDES}

prosmart_pdb_tools.o : $(SOURCE)prosmart_pdb_tools*
	@echo "Creating prosmart_pdb_tools.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_pdb_tools.cpp ${INCLUDES}

prosmart_external_programs.o : $(SOURCE)prosmart_external_programs*
	@echo "Creating prosmart_external_programs.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_external_programs.cpp ${INCLUDES}

prosmart_multiple_superposition.o : $(SOURCE)prosmart_multiple_superposition*
	@echo "Creating prosmart_multiple_superposition.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_multiple_superposition.cpp ${INCLUDES}

prosmart_params.o : $(SOURCE)prosmart_params* $(CONFIG_FILE)
	@echo "Creating prosmart_params.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_params.cpp ${INCLUDES}

prosmart_results.o : $(SOURCE)prosmart_results*
	@echo "Creating prosmart_results.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_results.cpp ${INCLUDES}

prosmart_windows.o : $(SOURCE)prosmart_windows*
	@echo "Creating prosmart_windows.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart_windows.cpp ${INCLUDES}

prosmart.o : $(SOURCE)prosmart.cpp ${OBJ_PROSMART}
	@echo "Creating prosmart.o"
	@$(CXX) $(CXXARGS) -c $(SOURCE)prosmart.cpp ${INCLUDES}


##################### Install ProSMART

install : all
	@if [ "$(BIN_DIR)" != "" ]; then \
	  if test -d $(BIN_DIR); then \
	    cp prosmart prosmart_align prosmart_restrain $(BIN_DIR) 2> ./temp.txt; \
	    if ! test -s ./temp.txt && test -f $(BIN_DIR)/prosmart && test -f $(BIN_DIR)/prosmart_align && test -f $(BIN_DIR)/prosmart_restrain; then \
	      echo ""; \
	      echo "ProSMART executables installed successfully to $(BIN_DIR)"; \
	    else \
	      echo ""; \
	      echo "ProSMART executables could not be copied to $(BIN_DIR)"; \
	      echo "Please ensure that you have sufficient permissions for $(BIN_DIR)"; \
	    fi; \
	    rm ./temp.txt; \
	  else \
	    echo ""; \
	    echo "Could not find location for binaries: $(BIN_DIR)"; \
	    echo "Installation unsuccessful."; \
	    echo "Please ensure that the directory exists, adjust location in makefile accordingly, or refer to the user documentation for manual installation instructions."; \
	  fi \
	else \
	  echo ""; \
	  echo "Bin directory incorrectly specified. Installation unsuccessful."; \
	  echo "Please refer to the user documentation for manual installation instructions."; \
	fi; \
	if [ "$(LIB_DIR)" != "" ]; then \
	  if test -d $(LIB_DIR); then \
	    cp -r $(PROSMART_DATA_IN) $(LIB_DIR)$(PROSMART_DATA_OUT) 2> ./temp.txt; \
	    if ! test -s ./temp.txt && test -d $(LIB_DIR)$(PROSMART_DATA_OUT); then \
	      echo ""; \
	      echo "ProSMART data successfully copied to $(LIB_DIR)$(PROSMART_DATA_OUT)"; \
	      echo ""; \
	    else \
	      echo ""; \
	      echo "ProSMART data could not be copied to $(LIB_DIR)$(PROSMART_DATA_OUT)"; \
	      echo "Please ensure that you have sufficient permissions for $(LIB_DIR)"; \
	      echo ""; \
	    fi; \
	    rm ./temp.txt; \
	  else \
	    echo ""; \
	    echo "Could not find location for data: $(LIB_DIR)"; \
	    echo "Installation unsuccessful."; \
	    echo "Please ensure that the directory exists, adjust location in makefile accordingly, or refer to the user documentation for manual installation instructions."; \
	    echo ""; \
	  fi \
	else \
	  echo ""; \
	  echo "Directory for data incorrectly specified. Installation unsuccessful."; \
	  echo "Please refer to the documentation for manual installation instructions."; \
	  echo ""; \
	fi

##################### Remove Created Files

clean :
	@for FILE in $(FILE_LIST); do if test -f $$FILE; then rm -f $$FILE; fi done

