# *************************************************************************
# *                                                                       *
# *  Makefile for  mpC compiler                                           *
# *                                                                       *
# *                                                                       *
# *  Copyright (c) 1996 Institute for System Programming,                 *
# *                     Russian Academy of Sciences.                      *
# *                                                                       *
# *  All rights reserved. We assume no responsibility for the use         *
# *  or reliability of our software.                                      *
# *                                                                       *
# *************************************************************************

include ./install.vars

OPT	= -O2
MPIOPT	= -O2
SF	= '-D__i386__ -D__NO_MATH_INLINES'

# Directory for man pages; should be added later to MANPATH
MANDIR	= $(MPCHOME)/man

# The following targets are legal for compilation of 'reuse':
# PCS10
# PCS20
# SUN (this is valid for all others)
TARGET	= SUN

# For PCS10 you must define
# OPT = '-DPCS10'

# *******************************************************
# **     DON'T CHANGE ANYTHING BELOW THIS LINE !       **
# *******************************************************

BIN	= $(MPCHOME)/bin
INCDIR	= $(MPCHOME)/h
LIB	= $(MPCHOME)/lib
SRC	= $(MPCHOME)/source
TOPO	= $(MPCTOPO)
LOAD	= $(MPCLOAD)

MFLAGS	= BIN=$(BIN) CC=$(CC) OPT=$(OPT) SF=$(SF) MPCHOME=$(MPCHOME)
RTSMFLG	= BIN=$(BIN) OPT=$(MPIOPT) SF=$(SF) MPCHOME=$(MPCHOME)

TARGETS = reuselib front-end back-end

FRONT	= mpc_main.o mpcScanSource.o mpcScan.o mpcPars.o make_ast.o\
	  eval_ast.o topo_fun.o mpc_sn_rel.o Tree.o mpcAttr.o mpc_adv.o\
	  mpcErrors.o mpc_demo.o c2mpC.o CocktailIO.o

BACK	= BackEnd.o BEprint.o be_print.o Type.o Gen.o File_print.o\
	  VarDecl_print.o Type_print.o Expr_print.o Stats_print.o\
	  Prop.o NetType_print.o VarName.o NetDecl_print.o\
	  print_NetCreate.o GenTree.o Traverse.o Communication.o\
	  PredExpr_print.o Assign.o stack.o ConvertType.o IlpTree.o\
	  Optim_print.o ress.o tiling.o ilp.o

REUSE	= System.o General.o Memory.o DynArray.o Sets.o StringMem.o\
	  Idents.o Time.o Errors.o Positions.o Source.o



all:	mpcc environment run-time

mpcc:	$(TARGETS)
	$(CC) -o mpcc $(FRONT) $(BACK) $(REUSE)

reuselib:
	@echo; echo "Making public reuse modules"
	cd reuse && $(MAKE) $(MFLAGS) TARGET=$(TARGET)

front-end:
	@echo; echo "Making front-end"
	cd front && $(MAKE) $(MFLAGS) CPPDIR=$(CPPDIR)

back-end:
	@echo; echo "Making back-end"
	cd back && $(MAKE) $(MFLAGS)

environment:	$(MPI)_env

LAM_env:
	@echo; echo "Making environment for LAM MPI"
	cd env && $(MAKE) $(RTSMFLG) MPICC=hcc LDFLAGS='-lmpi -lm'

MPICH_env:
	@echo; echo "Making environment for MPICH"
	cd env && $(MAKE) $(RTSMFLG) MPICC=mpicc

run-time:	$(MPI)_rts

LAM_rts:
	@echo; echo "Making run-time system for LAM MPI"
	cd rts && $(MAKE) $(RTSMFLG) MPICC=hcc

MPICH_rts:
	@echo; echo "Making run-time system for MPICH"
	cd rts && $(MAKE) $(RTSMFLG) MPICC=mpicc

install:
	sh -c "if test ! -d $(MPCHOME); then mkdir -p $(MPCHOME); else true; fi"
	sh -c "if test ! -d $(BIN); then mkdir -p $(BIN); else true; fi"
	sh -c "if test ! -d $(LIB); then mkdir -p $(LIB); else true; fi"
	sh -c "if test ! -d $(SRC); then mkdir -p $(SRC); else true; fi"
	sh -c "if test ! -d $(SRC)/c; then mkdir -p $(SRC)/c; else true; fi"
	sh -c "if test ! -d $(SRC)/cb; then mkdir -p $(SRC)/cb; else true; fi"
	sh -c "if test ! -d $(SRC)/mpc; then mkdir -p $(SRC)/mpc; else true; fi"
	sh -c "if test ! -d $(MANDIR); then mkdir -p $(MANDIR); else true; fi"
	sh -c "if test ! -d $(MANDIR)/man1; then mkdir -p $(MANDIR)/man1; else true; fi"
	sh -c "if test ! -d $(INCDIR); then mkdir -p $(INCDIR); else true; fi"
	sh -c "if test ! -d $(TOPO); then mkdir -p $(TOPO); else true; fi"
	sh -c "if test ! -d $(TOPO)/log; then mkdir -p $(TOPO)/log; else true; fi"
	sh -c "if test ! -d $(LOAD); then mkdir -p $(LOAD); else true; fi"
	cp mpcc $(BIN)
	chmod a+rx $(BIN)/mpcc
	cd env && $(MAKE) install $(MFLAGS)
	cd rts && $(MAKE) install $(MFLAGS)
	cp h/* reuse/gnu_kw.h $(INCDIR)
	chmod a+r $(INCDIR)/*.h
	cd tests && $(MAKE) install $(MFLAGS) SRC=$(SRC)
	cd man && cp *.1 $(MANDIR)/man1 && chmod a+r $(MANDIR)/man1/*.1

test:	$(MPI)_test

LAM_test:
	@echo; echo "TESTING OF COMPILER INTEGRITY"
	cd tests && $(MAKE) $(MFLAGS) SRC=$(SRC) TARGET=$(TARGET) MPICC=hcc
	@echo; echo "TESTING DONE"

MPICH_test:
	@echo; echo "TESTING OF COMPILER INTEGRITY"
	cd tests && $(MAKE) $(MFLAGS) SRC=$(SRC) TARGET=$(TARGET) MPICC=mpicc
	@echo; echo "TESTING DONE"

run_test:
	@echo; echo "RUNNING DISTRIBUTED mpC TEST ON TEST MACHINE:"
	cd tests && $(MAKE) run_test
 
clean:
	rm -f mpcc *.o *% *.*% core
	cd reuse && $(MAKE) clean
	cd front && $(MAKE) clean
	cd back	 && $(MAKE) clean
	cd env   && $(MAKE) clean
	cd rts   && $(MAKE) clean
	cd tests && $(MAKE) clean
