##########################################################################
#                                                                        #
#   Module: Makefile                                                     #
#                                                                        #
#   Makefile for MatScan programs                                        #
#                                                                        #
#   This file is part of the MatScan 2.0 distribution                    #
#                                                                        #
#     Copyright (C) 2021 - Enrique BLANCO GARCIA                         #
#                                                                        #
#  This program is free software; you can redistribute it and/or modify  #
#  it under the terms of the GNU General Public License as published by  #
#  the Free Software Foundation; either version 2 of the License, or     #
#  (at your option) any later version.                                   #
#                                                                        #
#  This program is distributed in the hope that it will be useful,       #
#  but WITHOUT ANY WARRANTY; without even the implied warranty of        #
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
#  GNU General Public License for more details.                          #
#                                                                        #
#  You should have received a copy of the GNU General Public License     #
#  along with this program; if not, write to the Free Software           #
#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.             #
##########################################################################

###########################
# 0. Compilation options  #
###########################

CC= gcc 
OPTS=-I$(INCLUDE) -Wall -O3
LOPS = -lm
INCLUDE= ./include
CDIR= ./src
OBJ = ./objects

# matscan
CDIR_MAIN= $(CDIR)/matscan
OBJ_MAIN= $(OBJ)/matscan

# SS
CDIR_SS= $(CDIR)/SS
OBJ_SS= $(OBJ)/SS

# RC
CDIR_RC= $(CDIR)/RC
OBJ_RC= $(OBJ)/RC


###########################
# 1. List of programs     #
###########################

ALL= all
MESS1 = mess1
MESS2 = mess2
MESS3 = mess3
MESS4 = mess4
MESS5 = mess5
MESS6 = mess6
MESS7 = mess7
MESS8 = mess8

MATSCAN= matscan
BIN_MATSCAN= bin/$(MATSCAN)

SS= SS
BIN_SS= bin/$(SS)

RC= RC
BIN_RC= bin/$(RC)


###########################
# 2. List of objects      #
###########################

OBJ_MATSCAN = 	$(OBJ_MAIN)/FetchSequence.o \
	$(OBJ_MAIN)/ScanSequence.o $(OBJ_MAIN)/Output.o \
	$(OBJ_MAIN)/PrintSites.o $(OBJ_MAIN)/ReadMatrixTransfac.o $(OBJ_MAIN)/ReadMatrixLog.o\
	$(OBJ_MAIN)/ReadMatrixJaspar.o\
	$(OBJ_MAIN)/ReadSequence.o $(OBJ_MAIN)/RecomputePositions.o \
	$(OBJ_MAIN)/RequestMemory.o $(OBJ_MAIN)/ProcessMatrix.o \
	$(OBJ_MAIN)/SetRatios.o 	$(OBJ_MAIN)/account.o \
	$(OBJ_MAIN)/readargv.o $(OBJ_MAIN)/SortSites.o


###########################
# 3. Makefile rules       #
###########################

### MATSCAN

$(BIN_MATSCAN): $(OBJ_MAIN)/$(MATSCAN).o $(OBJ_MATSCAN)
	$(CC) $(OPTS) -o $(BIN_MATSCAN) $(OBJ_MAIN)/$(MATSCAN).o $(OBJ_MATSCAN) $(LOPS)

$(OBJ_MAIN)/$(MATSCAN).o : $(CDIR_MAIN)/$(MATSCAN).c  
	$(CC) -c $(OPTS) $(CDIR_MAIN)/$(MATSCAN).c -o $(OBJ_MAIN)/$(MATSCAN).o 


$(OBJ_MAIN)/account.o :  $(CDIR_MAIN)/account.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/account.c -o $(OBJ_MAIN)/account.o

$(OBJ_MAIN)/readargv.o :  $(CDIR_MAIN)/readargv.c  
	$(CC) -c $(OPTS) $(CDIR_MAIN)/readargv.c -o $(OBJ_MAIN)/readargv.o

$(OBJ_MAIN)/ReadMatrixTransfac.o : $(CDIR_MAIN)/ReadMatrixTransfac.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ReadMatrixTransfac.c -o $(OBJ_MAIN)/ReadMatrixTransfac.o

$(OBJ_MAIN)/ReadMatrixJaspar.o : $(CDIR_MAIN)/ReadMatrixJaspar.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ReadMatrixJaspar.c -o $(OBJ_MAIN)/ReadMatrixJaspar.o

$(OBJ_MAIN)/ReadMatrixLog.o : $(CDIR_MAIN)/ReadMatrixLog.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ReadMatrixLog.c -o $(OBJ_MAIN)/ReadMatrixLog.o

$(OBJ_MAIN)/ProcessMatrix.o : $(CDIR_MAIN)/ProcessMatrix.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ProcessMatrix.c -o $(OBJ_MAIN)/ProcessMatrix.o

$(OBJ_MAIN)/CorrectExon.o : $(CDIR_MAIN)/CorrectExon.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/CorrectExon.c -o $(OBJ_MAIN)/CorrectExon.o

$(OBJ_MAIN)/FetchSequence.o : $(CDIR_MAIN)/FetchSequence.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/FetchSequence.c -o $(OBJ_MAIN)/FetchSequence.o

$(OBJ_MAIN)/ScanSequence.o : $(CDIR_MAIN)/ScanSequence.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ScanSequence.c -o $(OBJ_MAIN)/ScanSequence.o

$(OBJ_MAIN)/Output.o: $(CDIR_MAIN)/Output.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/Output.c -o $(OBJ_MAIN)/Output.o

$(OBJ_MAIN)/PrintSites.o :  $(CDIR_MAIN)/PrintSites.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/PrintSites.c -o $(OBJ_MAIN)/PrintSites.o

$(OBJ_MAIN)/ReadSequence.o : $(CDIR_MAIN)/ReadSequence.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/ReadSequence.c -o $(OBJ_MAIN)/ReadSequence.o

$(OBJ_MAIN)/RecomputePositions.o : $(CDIR_MAIN)/RecomputePositions.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/RecomputePositions.c -o $(OBJ_MAIN)/RecomputePositions.o

$(OBJ_MAIN)/RequestMemory.o :  $(CDIR_MAIN)/RequestMemory.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/RequestMemory.c -o $(OBJ_MAIN)/RequestMemory.o

$(OBJ_MAIN)/SetRatios.o : $(CDIR_MAIN)/SetRatios.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/SetRatios.c -o $(OBJ_MAIN)/SetRatios.o

$(OBJ_MAIN)/SortSites.o : $(CDIR_MAIN)/SortSites.c 
	$(CC) -c $(OPTS) $(CDIR_MAIN)/SortSites.c -o $(OBJ_MAIN)/SortSites.o

### SS

$(BIN_SS): $(CDIR_SS)/SS.c
	$(CC) $(OPTS) -o $(BIN_SS) $(CDIR_SS)/SS.c

### RC

$(BIN_RC): $(CDIR_RC)/RC.c
	$(CC) $(OPTS) -o $(BIN_RC) $(CDIR_RC)/RC.c


###########################
# 4. Makefile global rules#
###########################

mess1:
	@echo "***** Step 1. Building the MATSCAN program           *****"
mess2:
	@echo "***** [OK] MATSCAN sucessfully generated     *****\n"
mess3:
	@echo "***** Step 2. Building the SS program         *****"
mess4:
	@echo "***** [OK] SS sucessfully generated   *****\n"
mess5:
	@echo "***** Step 3. Building the RC program       *****"
mess6:
	@echo "***** [OK] RC sucessfully generated *****\n"

$(ALL):	$(MESS1) \
	$(BIN_MATSCAN) \
	$(MESS2) \
	$(MESS3) \
	$(BIN_SS) \
	$(MESS4) \
	$(MESS5) \
	$(BIN_RC) \
	$(MESS6) \

clean:
	rm -f $(OBJ_MATSCAN)/*.o $(BIN_MATSCAN) $(BIN_SS) $(BIN_RC) *~ $(INCLUDE)/*/*~ $(CDIR_MAIN)/*~ $(CDIR_SS)/*~ $(CDIR_RC)/*~ core
