###############################################################################
#
# FILE NAME: Make.def
# VERSION: 1.2
# AUTHOR:       Nergal S.r.l.
# DATE: 2007-03-14
#
# DESCRIPTION:  base Makefile  
#
# REVISION HISTORY:
#
# Version     Date      Author         Change Description
#
###############################################################################

#------------------------------------------------------------------------------
# default settings
#------------------------------------------------------------------------------

ifndef BASEDIR
        BASEDIR =$(shell pwd)
endif

ifdef release
      debug = 0
      release = 1
endif

ifndef release
     debug = 1
     release = 0
endif
 

CC              = gcc
CXX             = g++
ifeq ($(GCC4),1)
F77             = gfortran
else
F77             = g77
endif
AR              = ar
AS              = as
CXXLD           = g++
OC              = cp
ROOT_DIR        = $(ROOTSYS)
ROOT_LIB        = $(ROOTSYS)/lib
ROOTCINT 	= $(ROOTSYS)/bin/rootcint

SHELL    = /bin/bash
MAKE     = /usr/bin/make BASEDIR=$(BASEDIR) 

.PHONY : clean help var

#------------------------------------------------------------------------------
# default compiler, assembler & linker FLAGS
#------------------------------------------------------------------------------


#CFLAGS         += -Wall
CFLAGS         += -Wall -shared
FFLAGS         += -O0 
LDFLAGS        +=  

#------------------------------------------------------------------------------
# optimization FLAG
#------------------------------------------------------------------------------

OPT_FLAG        = -O3

#------------------------------------------------------------------------------
# object's directories, FLAGS & libs extensions for release & debug version 
#------------------------------------------------------------------------------

OBJDIR_D         = obj/debug
OBJDIR_R         = obj/release

ifeq ("1", "$(debug)")
     CFLAGS         += -g $(OPT_FLAG) -DDEBUG 
     OBJDIR         = obj/debug
endif

ifeq ("1", "$(release)")
     CFLAGS         += $(OPT_FLAG)
     OBJDIR         = obj/release
endif

#------------------------------------------------------------------------------
# Objects & Dependencies
#------------------------------------------------------------------------------

OBJS   = \
	${FORSRCS:%.for=$(OBJDIR)/%.o}  \
	${FSRCS:%.f=$(OBJDIR)/%.o}  \
	${CSRCS:%.c=$(OBJDIR)/%.o}  \
	${CXXSRCS:%.cpp=$(OBJDIR)/%.o} 

DEPEND = \
	${FORSRCS:%.for=$(OBJDIR)/.%.d}  \
	${FSRCS:%.f=$(OBJDIR)/.%.d}  \
	${CSRCS:%.c=$(OBJDIR)/.%.d}  \
	${CXXSRCS:%.cpp=$(OBJDIR)/.%.d}


$(OBJDIR)/.%.d: %.f
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
#	echo "generating depend infos for $< into $@"; \
	$(F77) -M $(FFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
	echo "generating depend infos for $< into $@"; \
	$(F77) -M $(FFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
endif

$(OBJDIR)/.%.d: %.for
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
#	echo "generating depend infos for $< into $@"; \
	$(F77) -M $(FFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
	echo "generating depend infos for $< into $@"; \
	$(F77) -M $(FFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
endif

$(OBJDIR)/.%.d: %.c
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
#	echo "generating depend infos for $< into $@"; \
	$(CC) -M $(CFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
	echo "generating depend infos for $< into $@"; \
	$(CC) -M $(CFLAGS) $< 2>/dev/null\
	        | sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
endif

$(OBJDIR)/.%.d: %.cpp
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
#	echo "generating depend infos for $< into $@"; \
	$(CXX) -M $(CFLAGS) $< 2>/dev/null\
		| sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	if [ ! -d $(OBJDIR)/$$(/usr/bin/dirname $<) ]; then mkdir -p $(OBJDIR)/$$(/usr/bin/dirname $<)  $(OBJDIR)/.$$(/usr/bin/dirname $<) ;fi; \
	echo "generating depend infos for $< into $@"; \
	$(CXX) -M $(CFLAGS) $< 2>/dev/null\
		| sed -e 's%$*.o%$(OBJDIR)/$*.o%g' > $(OBJDIR)/.$*.d
endif

$(OBJDIR)/%.o: %.for
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(F77) -c $(FFLAGS) -o $@ $<
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(F77) -c $(FFLAGS) -o $@ $<
endif

$(OBJDIR)/%.o: %.f
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(F77) -c $(FFLAGS) -o $@ $<
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(F77) -c $(FFLAGS) -o $@ $<
endif

$(OBJDIR)/%.o: %.c
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(CC) -c $(CFLAGS) -o $@ $<
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(CC) -c $(CFLAGS) -o $@ $<
endif

$(OBJDIR)/%.o: %.cpp
ifeq ($(verbose),)
	@if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(CXX) -c $(CFLAGS) -o $@ $<
else
	if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi; \
	$(CXX) -c $(CFLAGS) -o $@ $<
endif

#------------------------------------------------------------------------------
# General directory structure, includes, objects
#------------------------------------------------------------------------------

PAMOFF_DIR		= $(BASEDIR)/PamOffLineSW
EVENT_DIR		= $(BASEDIR)/event

FORROU_DIR		= $(PAMOFF_DIR)/forroutines
TRAK_DIR		= $(FORROU_DIR)/tracker
RRAW_DIR		= $(TRAK_DIR)/readraw
ACTR_DIR		= $(FORROU_DIR)/anticounter
CALO_DIR		= $(FORROU_DIR)/calorimeter
TOF_DIR 		= $(FORROU_DIR)/tof
TRGR_DIR 		= $(FORROU_DIR)/trigger

FORROUEXTDIR			= $(TRAK_DIR) $(RRAW_DIR) $(ACTR_DIR) $(CALO_DIR) $(TOF_DIR) $(TRGR_DIR)

PHYS_DIR 		= $(PAMOFF_DIR)/physics
TECH_DIR 		= $(PAMOFF_DIR)/techmodel

EXTDIR			= $(PHYS_DIR) $(TECH_DIR) $(FORROU_DIR)

#------------------------------------------------------------------------------

ROOT_DIR_INC             = $(ROOT_DIR)/include

FORROU_DIR_INC		= $(FORROU_DIR)/include
RRAW_DIR_INC		= $(RRAW_DIR)/include
TRAK_DIR_INC		= $(TRAK_DIR)/include
ACTR_DIR_INC		= $(ACTR_DIR)/include
CALO_DIR_INC		= $(CALO_DIR)/include
TOF_DIR_INC		= $(TOF_DIR)/include
TRGR_DIR_INC		= $(TRGR_DIR)/include

PHYS_DIR_INC		= $(PHYS_DIR)/include
TECH_DIR_INC		= $(TECH_DIR)/include

#------------------------------------------------------------------------------

FORROU_OBJ         =  $(FORROU_DIR)/$(OBJDIR)
RRAW_OBJ           =  $(RRAW_DIR)/$(OBJDIR)
TRAK_OBJ           =  $(TRAK_DIR)/$(OBJDIR)
ACTR_OBJ           =  $(ACTR_DIR)/$(OBJDIR)
CALO_OBJ           =  $(CALO_DIR)/$(OBJDIR)
TOF_OBJ            =  $(TOF_DIR)/$(OBJDIR)
TRGR_OBJ           =  $(TRGR_DIR)/$(OBJDIR)

PHYS_OBJ           =  $(PHYS_DIR)/$(OBJDIR)
TECH_OBJ           =  $(TECH_DIR)/$(OBJDIR)
PAMOFF_OBJ         =  $(PAMOFF_DIR)/$(OBJDIR)


#------------------------------------------------------------------------------
# Built libraries 
#------------------------------------------------------------------------------

FORROU_A     = $(FORROU_OBJ)/libforrou.a
FORROUINT_A  = $(FORROU_OBJ)/libforrouinternal.a
RRAW_A       = $(RRAW_OBJ)/libforreadraw.a
TRAK_A       = $(RRAW_OBJ)/libfortracker.a
ACTR_A       = $(ACTR_OBJ)/libanticounter.a
CALO_A       = $(CALO_OBJ)/libforcalor.a
TOF_A        = $(TOF_OBJ)/libfortof.a
TRGR_A       = $(TRGR_OBJ)/libfortrigger.a

FORROUEXTLIB	     = $(RRAW_A) $(TRAK_A) $(ACTR_A) $(CALO_A) $(TOF_A) $(TRGR_A)

PHYS_A       = $(PHYS_OBJ)/libdevreaders.a
TECH_A       = $(TECH_OBJ)/libtechmodel.a
PAMOFF_A     = $(PAMOFF_OBJ)/libpamoff.a

EXTLIB	     = $(TECH_A) $(PHYS_A) $(FORROU_A)
