#------------------------------------------------------------------------------
# Makefile to install RISC V 0.3.0
#------------------------------------------------------------------------------
# 09/30/16 RD	added header-line to generated source_me scripts
# 09/29/16 RD	added SYSTEMC_MIC_HOME for optional SystemC-MIC library
# 09/19/16 RD	initial adjustments for release 0.3.0
# 03/13/16 RD	added developer targets clean_rose, uninstall_rose
# 03/13/16 RD	added developer targets clean_risc, uninstall_risc
# 03/13/16 RD	added developer options ROSE_OPTS and RISC_OPTS
# 02/29/16 RD	initial adjustments for release 0.2.2:
#		use 'tar' instead of 'gtar'
# 10/28/15 RD	final adjustments for release 0.2.1
# 10/28/15 RD	added 'demo' target
# 10/16/15 RD	SYSTEMC_HOME points to ACCELLERA installation(s) (i.e. _pt),
#		SYSTEMC_LW_HOME points to RISC LWSC installation,
#		SYSTEMC_OOP_HOME points to RISC OOPSC installation
# 10/13/15 RD	v0.2.1: separated download, build, install directories
# 10/12/15 RD	improvements, named the targets same as packages
# 10/08/15 RD	initial version based on INSTALLv020
#
# Requirements:
# - host platform: Linux, CentOS 6.6, x86_64 (or similar)
# - GNU C++ compiler tool chain (version 4.4.7 works, others may also)
#
# Prerequisites: (will be installed as needed)
# - boost library (version 1.47.0)
# - ROSE compiler source installation
# - Accellera SystemC 2.3.1 source installation
#
# Installation steps: (major targets)
# - Prep1:   'dirs':  prepare a directory tree
# - Prereq1: 'boost': install BOOST library
# - Prereq2: 'rose':  install ROSE compiler
# - Prereq3: 'sysc':  install Accellera SystemC
# - Step1:   'risc':  install RISC compiler and simulator
# - Step2:   'demo':  run the RISC demo examples

# PATHS: (adjust these to fit your environment!)
TOP		= /local/lecs/lecs/risc_v0.3.0/top
#TOP		= /opt/pkg
RISC		= $(TOP)/risc_v0.3.0
RISC_PKG	= $(TOP)/risc_v0.3.0/pkg
SOURCES		= /local/lecs/lecs/risc_v0.3.0/sources
#SOURCES	= /home/pkg/risc/risc_v0.3.0
RISC_DOWNLOAD	= $(SOURCES)/download
RISC_BUILD	= $(SOURCES)/build

# 3RD PARTY PACKAGES: (adjust if you already have these installed)
BOOST_HOME	= $(RISC_PKG)/boost_1_47_0
BOOST_TARGET	= $(BOOST_HOME)/include/boost/version.hpp
ROSE_HOME	= $(RISC_PKG)/edg4x-rose
ROSE_TARGET	= $(ROSE_HOME)/lib/librose.so
SYSTEMC_HOME	= $(RISC_PKG)/systemc-2.3.1_pt
SYSTEMC_TARGET	= $(SYSTEMC_HOME)/include/systemc.h

# RISC PACKAGE: (RISC compiler and simulator will be installed here)
RISC_HOME	= $(RISC)
RISC_TARGET	= $(RISC_HOME)/bin/risc
SYSTEMC_LW_HOME	= $(RISC_PKG)/systemc-2.3.1_lw
SYSTEMC_OOP_HOME= $(RISC_PKG)/systemc-2.3.1_oop
SYSTEMC_MIC_HOME= $(RISC_PKG)/systemc-2.3.1_mic

# DEVELOPER OPTIONS: (for developers only)
ROSE_OPTS	= --with-C_OPTIMIZE=-O2 --with-CXX_OPTIMIZE=-O2 \
		  --with-C_DEBUG=-DNDEBUG --with-CXX_DEBUG=-DNDEBUG
#ROSE_OPTS	= --with-C_OPTIMIZE=-O0 --with-CXX_OPTIMIZE=-O0 \
#		  --with-C_DEBUG=-g --with-CXX_DEBUG=-g
#ROSE_OPTS	+= CC=gcc-4.4 CXX=g++-4.4
RISC_OPTS	=
#RISC_OPTS	= DEBUG=-g

# COMMANDS: (adjust only if you have an unusual Linux)
ECHO	= echo
CD	= cd
CP	= cp -f
MKDIR	= mkdir -p
MV	= mv -f
RM	= rm -f
RMDIR	= rmdir --ignore-fail-on-non-empty
TAR	= tar
GIT	= git
WGET	= wget -nv
SLEEP	= sleep

#-----------------------------------------------------------------------------
# Convenience targets:
#-----------------------------------------------------------------------------

all:
	$(MAKE) dirs
	$(MAKE) boost
	$(MAKE) rose
	$(MAKE) sysc
	$(MAKE) risc
	$(MAKE) demo

test:
	$(MAKE) demo

clean:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Deleting $(RISC_BUILD), demodir..."
	@$(ECHO) "***********************************************************"
	@$(ECHO) "Waiting 10 seconds, type CTRL-C if you want to abort!"
	$(SLEEP) 10
	$(RM) -r $(RISC_BUILD)
	$(RM) -r demodir
	-$(RMDIR) $(SOURCES)
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Build tree removed."
	@$(ECHO) "***********************************************************"

clean_downloads:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Deleting $(RISC_DOWNLOAD)..."
	@$(ECHO) "***********************************************************"
	@$(ECHO) "Waiting 10 seconds, type CTRL-C if you want to abort!"
	$(SLEEP) 10
	$(RM) -r $(RISC_DOWNLOAD)
	-$(RMDIR) $(SOURCES)
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Download tree removed."
	@$(ECHO) "***********************************************************"

uninstall:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Uninstalling, deleting $(RISC)..."
	@$(ECHO) "***********************************************************"
	@$(ECHO) "Waiting 10 seconds, type CTRL-C if you want to abort!"
	$(SLEEP) 10
	$(RM) -r $(RISC)
	-$(RMDIR) $(TOP)
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Uninstalled."
	@$(ECHO) "***********************************************************"

downloads: dirs
	$(MAKE) $(RISC_DOWNLOAD)/boost_1_47_0.tar.gz
	$(MAKE) $(RISC_DOWNLOAD)/edg4x-rose
	$(MAKE) $(RISC_DOWNLOAD)/systemc-2.3.1.tgz
	$(MAKE) $(RISC_DOWNLOAD)/risc_v0.3.0.tar.gz

# --- developer targets

clean_rose:
	$(RM) -r $(RISC_BUILD)/edg4x-rose
	-$(RMDIR) $(RISC_BUILD)

uninstall_rose:
	$(RM) -r $(RISC_PKG)/edg4x-rose
	-$(RMDIR) $(RISC_PKG)
	-$(RMDIR) $(RISC)

clean_risc:
	$(RM) -r $(RISC_BUILD)/risc_v0.3.0
	$(RM) -r $(RISC_BUILD)/systemc-2.3.1_lw
	$(RM) -r $(RISC_BUILD)/systemc-2.3.1_oop
	$(RM) -r $(RISC_BUILD)/systemc-2.3.1_mic
	-$(RMDIR) $(RISC_BUILD)

uninstall_risc:
	$(RM) $(RISC)/COPYRIGHT
	$(RM) $(RISC)/LICENSE
	$(RM) -r $(RISC)/bin
	$(RM) -r $(RISC)/docs
	$(RM) -r $(RISC)/examples
	$(RM) -r $(RISC)/include
	$(RM) -r $(RISC)/lib
	$(RM) -r $(RISC)/man
	$(RM) -r $(RISC_PKG)/systemc-2.3.1_lw
	$(RM) -r $(RISC_PKG)/systemc-2.3.1_oop
	$(RM) -r $(RISC_PKG)/systemc-2.3.1_mic
	-$(RMDIR) $(RISC_PKG)
	-$(RMDIR) $(RISC)

#-----------------------------------------------------------------------------
# RISC dirs: Prepare a top directory to assemble all packages
#-----------------------------------------------------------------------------

dirs: $(RISC_DOWNLOAD) $(RISC_BUILD) $(RISC) $(RISC_PKG)

$(RISC_DOWNLOAD) $(RISC_BUILD) $(RISC) $(RISC_PKG):
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC dirs: Preparing directory tree..."
	@$(ECHO) "***********************************************************"
	$(MKDIR) $(RISC_DOWNLOAD)
	$(MKDIR) $(RISC_BUILD)
	$(MKDIR) $(RISC)
	$(MKDIR) $(RISC_PKG)
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC dirs: Directory tree prepared."
	@$(ECHO) "***********************************************************"

#-----------------------------------------------------------------------------
# RISC boost: Install BOOST library
#-----------------------------------------------------------------------------

# Reference:
# http://www.boost.org/doc/libs/1_59_0/more/getting_started/unix-variants.html

boost: dirs $(BOOST_TARGET)

$(RISC_DOWNLOAD)/boost_1_47_0.tar.gz:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC boost: Downloading BOOST library..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_DOWNLOAD) && \
		$(RM) boost_1_47_0.tar.gz && \
		$(WGET) http://downloads.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.gz

$(BOOST_TARGET):
	$(MAKE) $(RISC_DOWNLOAD)/boost_1_47_0.tar.gz
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC boost: Building/installing BOOST library..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_BUILD) && \
		$(TAR) xvzf ../download/boost_1_47_0.tar.gz
# ....TODO	add --without-python option (and any others!)
	$(CD) $(RISC_BUILD)/boost_1_47_0 && \
		./bootstrap.sh --prefix=$(BOOST_HOME)
	$(CD) $(RISC_BUILD)/boost_1_47_0 && \
		./b2 install
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC boost: BOOST library installed."
	@$(ECHO) "***********************************************************"

#-----------------------------------------------------------------------------
# RISC rose: Install ROSE compiler
#-----------------------------------------------------------------------------

# Reference:
# https://en.wikibooks.org/wiki/ROSE_Compiler_Framework/Installation
#
# Notes:
# ROSE requires many developer packages, including the following:
# CentOS: libtool libtool-ltdl libtool-ltdl-devel autoconf automake
# Ubuntu: libtool libltdl7 libltdl-dev autoconf automake autotools-dev

rose: dirs boost $(ROSE_TARGET)

$(RISC_DOWNLOAD)/edg4x-rose:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC rose: Downloading ROSE compiler..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_DOWNLOAD) && \
		$(GIT) clone https://github.com/rose-compiler/rose.git edg4x-rose
	$(CD) $(RISC_DOWNLOAD)/edg4x-rose && \
		$(GIT) checkout b3bfc1fdfb91f3f19c2791858b9f8c98aaf7a73e
	$(CD) $(RISC_DOWNLOAD)/edg4x-rose && \
		./build

$(ROSE_TARGET):
	$(MAKE) $(RISC_DOWNLOAD)/edg4x-rose
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC rose: Building/installing ROSE compiler..."
	@$(ECHO) "***********************************************************"
	$(MKDIR) $(RISC_BUILD)/edg4x-rose
	$(CD) $(RISC_BUILD)/edg4x-rose && \
		LD_LIBRARY_PATH=$(BOOST_HOME)/lib$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
			$(RISC_DOWNLOAD)/edg4x-rose/configure \
				--prefix=$(ROSE_HOME) --with-boost=$(BOOST_HOME) \
				--without-java --enable-languages=c,c++ \
				$(ROSE_OPTS)
	$(CD) $(RISC_BUILD)/edg4x-rose && \
		LD_LIBRARY_PATH=$(BOOST_HOME)/lib$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
			$(MAKE) -j4
#	$(CD) $(RISC_BUILD)/edg4x-rose && \
#		LD_LIBRARY_PATH=$(BOOST_HOME)/lib$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
#			$(MAKE) -j4 -C tests check
#		-> fails after about 10 minutes (Java missing?), skip!
	$(CD) $(RISC_BUILD)/edg4x-rose && \
		LD_LIBRARY_PATH=$(BOOST_HOME)/lib$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
			$(MAKE) install
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC rose: ROSE compiler installed."
	@$(ECHO) "***********************************************************"

#-----------------------------------------------------------------------------
# RISC sysc: Install Accellera SystemC
#-----------------------------------------------------------------------------

# Reference:
# http://www.accellera.org/downloads/standards/systemc/files

sysc: dirs $(SYSTEMC_TARGET)

$(RISC_DOWNLOAD)/systemc-2.3.1.tgz:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC sysc: Downloading Accellera SystemC..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_DOWNLOAD) && \
		$(RM) systemc-2.3.1.tgz && \
		$(WGET) http://www.accellera.org/images/downloads/standards/systemc/systemc-2.3.1.tgz

$(SYSTEMC_TARGET):
	$(MAKE) $(RISC_DOWNLOAD)/systemc-2.3.1.tgz
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC sysc: Building/installing Accellera SystemC..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_BUILD) && \
		$(TAR) xvzf $(RISC_DOWNLOAD)/systemc-2.3.1.tgz
	$(MKDIR) $(RISC_BUILD)/systemc-2.3.1/objdir
	$(CD) $(RISC_BUILD)/systemc-2.3.1/objdir && \
		CXX=g++ ../configure --prefix=$(RISC_PKG)/systemc-2.3.1
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir all
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir install
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir check
	$(MKDIR) $(RISC_BUILD)/systemc-2.3.1/objdir_pt
	$(CD) $(RISC_BUILD)/systemc-2.3.1/objdir_pt && \
		CXX=g++ ../configure --prefix=$(SYSTEMC_HOME) --enable-pthreads
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir_pt all
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir_pt install
	$(MAKE) -C $(RISC_BUILD)/systemc-2.3.1/objdir_pt check
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC sysc: Accellera SystemC installed."
	@$(ECHO) "***********************************************************"

#-----------------------------------------------------------------------------
# RISC risc: Install RISC compiler and simulator
#-----------------------------------------------------------------------------

# Reference:
# http://www.cecs.uci.edu/~doemer/risc/v030/INSTALL

risc: dirs boost rose sysc ${RISC_TARGET}

$(RISC_DOWNLOAD)/risc_v0.3.0.tar.gz:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC risc: Downloading RISC compiler and simulator..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_DOWNLOAD) && \
		$(RM) risc_v0.3.0.tar.gz && \
		$(WGET) http://www.cecs.uci.edu/~doemer/risc/v030/risc_v0.3.0.tar.gz

$(RISC_TARGET):
	$(MAKE) $(RISC_DOWNLOAD)/risc_v0.3.0.tar.gz
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC risc: Building/installing RISC comp. and sim. ..."
	@$(ECHO) "***********************************************************"
	$(CD) $(RISC_BUILD) && \
		$(TAR) xvzf $(RISC_DOWNLOAD)/risc_v0.3.0.tar.gz
	$(CD) $(RISC_BUILD)/risc_v0.3.0 && \
		$(MV) source_me.csh source_me.csh.bak && \
		$(ECHO) > source_me.csh '# source_me.csh: generated by RISC top-level Makefile' && \
		$(ECHO) >>source_me.csh 'setenv RISC ${RISC}' && \
		$(ECHO) >>source_me.csh 'setenv RISC_HOME ${RISC_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv RISC_BUILD ${RISC_BUILD}' && \
		$(ECHO) >>source_me.csh 'setenv RISC_DOWNLOAD ${RISC_DOWNLOAD}' && \
		$(ECHO) >>source_me.csh 'setenv ROSE_HOME ${ROSE_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv BOOST_HOME ${BOOST_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv SYSTEMC_HOME ${SYSTEMC_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv SYSTEMC_LW_HOME ${SYSTEMC_LW_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv SYSTEMC_OOP_HOME ${SYSTEMC_OOP_HOME}' && \
		$(ECHO) >>source_me.csh 'setenv SYSTEMC_MIC_HOME ${SYSTEMC_MIC_HOME}' && \
		$(ECHO) >>source_me.csh 'if ( $$?LD_LIBRARY_PATH ) then' && \
		$(ECHO) >>source_me.csh '  setenv LD_LIBRARY_PATH $${RISC_HOME}/lib:$${ROSE_HOME}/lib:$${BOOST_HOME}/lib:$${SYSTEMC_HOME}/lib-linux64:$${LD_LIBRARY_PATH}' && \
		$(ECHO) >>source_me.csh 'else' && \
		$(ECHO) >>source_me.csh '  setenv LD_LIBRARY_PATH $${RISC_HOME}/lib:$${ROSE_HOME}/lib:$${BOOST_HOME}/lib:$${SYSTEMC_HOME}/lib-linux64' && \
		$(ECHO) >>source_me.csh 'endif'
	$(CD) $(RISC_BUILD)/risc_v0.3.0 && \
		$(MV) source_me.sh source_me.sh.bak && \
		$(ECHO) > source_me.sh '# source_me.sh: generated by RISC top-level Makefile' && \
		$(ECHO) >>source_me.sh 'export RISC=${RISC}' && \
		$(ECHO) >>source_me.sh 'export RISC_HOME=${RISC_HOME}' && \
		$(ECHO) >>source_me.sh 'export RISC_BUILD=${RISC_BUILD}' && \
		$(ECHO) >>source_me.sh 'export RISC_DOWNLOAD=${RISC_DOWNLOAD}' && \
		$(ECHO) >>source_me.sh 'export ROSE_HOME=${ROSE_HOME}' && \
		$(ECHO) >>source_me.sh 'export BOOST_HOME=${BOOST_HOME}' && \
		$(ECHO) >>source_me.sh 'export SYSTEMC_HOME=${SYSTEMC_HOME}' && \
		$(ECHO) >>source_me.sh 'export SYSTEMC_LW_HOME=${SYSTEMC_LW_HOME}' && \
		$(ECHO) >>source_me.sh 'export SYSTEMC_OOP_HOME=${SYSTEMC_OOP_HOME}' && \
		$(ECHO) >>source_me.sh 'export SYSTEMC_MIC_HOME=${SYSTEMC_MIC_HOME}' && \
		$(ECHO) >>source_me.sh 'export LD_LIBRARY_PATH=$${RISC_HOME}/lib:$${ROSE_HOME}/lib:$${BOOST_HOME}/lib:$${SYSTEMC_HOME}/lib-linux64$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH}'
	. $(RISC_BUILD)/risc_v0.3.0/source_me.sh && \
		$(MAKE) $(RISC_OPTS) -C $(RISC_BUILD)/risc_v0.3.0 clean
	. $(RISC_BUILD)/risc_v0.3.0/source_me.sh && \
		$(MAKE) $(RISC_OPTS) -C $(RISC_BUILD)/risc_v0.3.0 build
	. $(RISC_BUILD)/risc_v0.3.0/source_me.sh && \
		$(MAKE) $(RISC_OPTS) -C $(RISC_BUILD)/risc_v0.3.0 install
	. $(RISC_BUILD)/risc_v0.3.0/source_me.sh && \
		$(MAKE) $(RISC_OPTS) -C $(RISC_BUILD)/risc_v0.3.0 test
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC risc: RISC compiler and simulator installed."
	@$(ECHO) "***********************************************************"

#-----------------------------------------------------------------------------
# RISC demo: Run the RISC demo examples
#-----------------------------------------------------------------------------

demo:
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Compiling and running the demo examples..."
	@$(ECHO) "***********************************************************"
	$(MKDIR) demodir
	$(CP) $(RISC)/examples/demo/* demodir
	. $(RISC)/bin/setup.sh && \
		$(MAKE) -C demodir clean
	. $(RISC)/bin/setup.sh && \
		$(MAKE) -C demodir play_demo
	. $(RISC)/bin/setup.sh && \
		$(MAKE) -C demodir mandelbrot_demo
	@$(ECHO) "***********************************************************"
	@$(ECHO) "*** RISC: Demo successful."
	@$(ECHO) "***********************************************************"

#------------------------------------------------------------------------------
# EOF Makefile (The RISC Team, September 30, 2016)
#------------------------------------------------------------------------------
