#*****************************************************************************
# DESCRIPTION: Verilator top level: Makefile pre-configure version
#
# This file is part of Verilator.
#
# Author: Wilson Snyder <wsnyder@wsnyder.org>
#
# Code available from: http://www.veripool.org/verilator
#
#*****************************************************************************
#
# Copyright 2003-2009 by Wilson Snyder. This program is free software; you can
# redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License
# Version 2.0.
#
# Verilator 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.
#
#****************************************************************************/
#
# make all	to compile and build Verilator.
# make install	to install it.
# make TAGS	to update tags tables.
#
# make clean  or  make mostlyclean
#      Delete all files from the current directory that are normally
#      created by building the program.	 Don't delete the files that
#      record the configuration.  Also preserve files that could be made
#      by building, but normally aren't because the distribution comes
#      with them.
#
# make distclean
#      Delete all files from the current directory that are created by
#      configuring or building the program.  If you have unpacked the
#      source and built the program without creating any other files,
#      `make distclean' should leave only the files that were in the
#      distribution.
#
# make maintainer-clean
#      Delete everything from the current directory that can be
#      reconstructed with this Makefile.  This typically includes
#      everything deleted by distclean, plus more: C source files
#      produced by Bison, tags tables, info files, and so on.
#
# make extraclean
#      Still more severe - delete backup and autosave files, too.

#### Start of system configuration section. ####

srcdir = @srcdir@
VPATH = @srcdir@
HOST = @HOST@

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
MAKEINFO = makeinfo
POD2TEXT = pod2text
PERL = @PERL@

# Destination prefix for RPMs
DESTDIR =

#### Don't edit: You're much better using configure switches to set these
prefix = @prefix@
exec_prefix = @exec_prefix@

# Directory in which to install scripts.
bindir = @bindir@

# Directory in which to install scripts.
mandir = @mandir@

# Directory in which to install library files.
datadir = @datadir@

# Directory in which to install documentation info files.
infodir = @infodir@

# Directory in which to install package specific files
# Generally ${prefix}/share/verilator
pkgdatadir = @pkgdatadir@

# Directory in which to install data across multiple architectures
datarootdir = @datarootdir@

# Compile options
CFG_WITH_DEFENV = @CFG_WITH_DEFENV@

#### End of system configuration section. ####
######################################################################

SHELL = /bin/sh

SUBDIRS = src test_verilated test_c test_sc test_sp test_regress test_vcs

INFOS = README internals.txt verilator.txt verilator.html verilator.1 verilator.pdf

# Files that can be generated, but should be up to date for a distribution.
DISTDEP = info Makefile
# Files to distribute.
DISTBIN = $(wildcard bin/verilator-*)

DISTFILES_INC = $(INFOS) .gitignore Artistic COPYING COPYING.LESSER \
	*.in *.ac \
	Changes TODO \
	MANIFEST.SKIP \
	bin/* \
	install-sh configure mkinstalldirs *.pod \
	include/*.[chv]* \
	include/*.in \
	include/.*ignore \
	.*attributes */.*attributes  */*/.*attributes \
	src/.*ignore src/*.in src/*.cpp src/*.[chly] src/astgen src/bisonpre src/*fix \
	src/*.pl src/*.pod \
	test_*/.*ignore test_*/Makefile* test_*/*.cpp \
	test_*/*.pl test_*/*.v test_*/*.vc test_*/vlint \
	test_verilated/vgen*.pl \
	test_regress/t/*.cpp \
	test_regress/t/*.h \
	test_regress/t/*.dat \
	test_regress/t/*.mem \
	test_regress/t/*.out \
	test_regress/t/*.pl \
	test_regress/t/*.v* \
	verilator.* \

INST_PROJ_FILES = \
	bin/verilator \
	bin/verilator_includer \
	bin/verilator_profcfunc \
	include/verilated.[chv]* \
	include/verilated.mk \
	include/verilatedos.[chv]* \
	include/verilatedsc.[chv]* \

INST_PROJ_BIN_FILES = \
	verilator_bin \
	verilator_bin_dbg \

DISTFILES := $(DISTFILES_INC)

VL_INST_MAN_FILES = verilator.1

ifeq ($(OBJCACHE_JOBS),)
ifneq ($(OBJCACHE_HOSTS),)
export OBJCACHE_JOBS := -j $(shell objcache --jobs "$(OBJCACHE_HOSTS)")
endif
endif

default: all
all: all_nomsg msg_test
all_nomsg: verilator_exe $(VL_INST_MAN_FILES)

.PHONY:verilator_exe
.PHONY:verilator_bin
.PHONY:verilator_bin_dbg
verilator_exe verilator_bin verilator_bin_dbg:
	@echo ------------------------------------------------------------
	@echo "making verilator in src" ; \
	  (cd src && $(MAKE) $(OBJCACHE_JOBS) )

.PHONY:msg_test
msg_test:
	@echo "Build complete!"
	@echo
	@echo "Type 'make test' to test."
	@echo

.PHONY:test
ifeq ($(VERILATOR_AUTHOR_SITE),1)	# Local... Else don't burden users
test: test_vcs test_c test_sc test_sp test_verilated test_regress
else
test: test_c test_sc test_sp
endif
	@echo "Tests passed!"
	@echo
	@echo "Type 'make install' to install documentation."
	@echo

test_vcs: all_nomsg
	@(cd test_vcs && $(MAKE))
test_c: all_nomsg
	@(cd test_c && $(MAKE))
test_c_debug: all_nomsg
	@(cd test_c && $(MAKE) test_debug)
test_sc: all_nomsg
	@(cd test_sc && $(MAKE))
test_sc_debug: all_nomsg
	@(cd test_sc && $(MAKE) test_debug)
test_sp: all_nomsg
	@(cd test_sp && $(MAKE))
test_sp_debug: all_nomsg
	@(cd test_sp && $(MAKE) test_debug)
test_verilated: all_nomsg
	@(cd test_verilated && $(MAKE))
test_regress: all_nomsg
	@(cd test_regress && $(MAKE))

info: $(INFOS)

# Use --no-split to avoid creating filenames > 14 chars.
verilator.1: bin/verilator
	pod2man $< $@

verilator.txt: bin/verilator
	$(POD2TEXT) $< $@

verilator.html: bin/verilator
	pod2html $< >$@

verilator.pdf: bin/verilator $(DISTCONFIG)
	pod2latex --full --out verilator.tex bin/verilator
	cat < verilator.tex \
	   | sed 's/\\begin{document}/\\usepackage[left=1.7in,right=1.7in,top=1.3in,bottom=1.3in]{geometry}\n\\begin{document}/' \
	   | sed 's/\\begin{document}/\\usepackage[pdftex,bookmarks=true,bookmarksnumbered=true,hypertexnames=false,breaklinks=true,linkbordercolor={0 0 1}]{hyperref}\n\\begin{document}/' \
	   | sed 's/\\begin{document}/\\usepackage{fancyhdr} \\pagestyle{fancy}\n\\begin{document}/' \
	   | sed 's/\\begin{document}/\\setlength{\\parindent}{0pt} \\setlength{\\parskip}{\\baselineskip}\n\\begin{document}/' \
	   | sed 's/\\begin{document}/\\title{$(DISTTITLE)} \\date{${DISTDATE}} \\author{Wilson Snyder\\\\ http:\/\/www.veripool.org}\n\\begin{document}/' \
	   | sed 's/\\begin{document}/\\lhead[$(DISTTITLE)]{$(DISTTITLE)}\n\\begin{document}/' \
	   | sed 's/\\tableofcontents/\\begin{titlepage} \\maketitle \\end{titlepage}\n\\tableofcontents/' \
	   > verilator2.tex
	mv verilator2.tex verilator.tex
	pdflatex verilator.tex
	pdflatex verilator.tex
	-rm -f verilator.toc verilator.aux verilator.idx verilator.out

README: readme.pod
	-rm -f $@
	$(POD2TEXT) --loose $< > $@

internals.txt: internals.pod
	-rm -f $@
	$(POD2TEXT) --loose $< > $@

# See uninstall also
VL_INST_BIN_FILES = verilator verilator_bin verilator_bin_dbg \
	verilator_includer verilator_profcfunc
# Some scripts go into both the search path and pkgdatadir,
# so they can be found by the user, and under $VERILATOR_ROOT.
installbin:
	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(bindir)
	( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator $(DESTDIR)$(bindir)/verilator )
	( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_profcfunc $(DESTDIR)$(bindir)/verilator_profcfunc )
	( $(INSTALL_PROGRAM) verilator_bin $(DESTDIR)$(bindir)/verilator_bin )
	( $(INSTALL_PROGRAM) verilator_bin_dbg $(DESTDIR)$(bindir)/verilator_bin_dbg )
	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(pkgdatadir)/bin
	( cd ${srcdir}/bin ; $(INSTALL_PROGRAM) verilator_includer $(DESTDIR)$(pkgdatadir)/bin/verilator_includer )

installman: $(VL_INST_MAN_FILES)
	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(mandir)/man1
	for p in $(VL_INST_MAN_FILES) ; do \
	  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(mandir)/man1/$$p; \
	done

installdata:
	$(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(pkgdatadir)/include $(DESTDIR)$(pkgdatadir)/examples
	cp -r include/* $(DESTDIR)$(pkgdatadir)/include
	cp -r ${srcdir}/include/* $(DESTDIR)$(pkgdatadir)/include
	cp -r ${srcdir}/test_c  $(DESTDIR)$(pkgdatadir)/examples
	cp -r ${srcdir}/test_sc $(DESTDIR)$(pkgdatadir)/examples
	cp -r ${srcdir}/test_sp $(DESTDIR)$(pkgdatadir)/examples
	cp -r ${srcdir}/test_v  $(DESTDIR)$(pkgdatadir)/examples

VL_INST_DATA_FILES = verilator.1
install: all_nomsg installbin installman installdata install-msg

install-here: installman ftp

ifeq ($(VERILATOR_AUTHOR_SITE),1)	# Local... Else don't burden users
DIRPROJECT := $(shell project_dir --project)
INST_PROJ_CVS = cp_if_cvs_diff

install-project: dist
	@echo "Install-project to $(DIRPROJECT)"
	strip verilator_bin*
	$(MAKE) install-project-quick
	for p in verilator.1 ; do \
	  $(INSTALL_PROGRAM) -m 0666 $$p $(DIRPROJECT_PREFIX)/man/man1/$$p; \
	done
	$(INST_PROJ_CVS) $(DISTNAME).tgz $(DIRPROJECT)/hw/utils/verilator/verilator.tgz
	rm $(DISTNAME).tgz

install-project-quick:
ifeq ($(CFG_WITH_DEFENV),yes)
	@echo "%Error: Reconfigure with './configure --disable-defenv' to avoid hardcoded paths."
	false
endif
	@echo "Install-project-quick (no strip) to $(DIRPROJECT)"
	for p in $(INST_PROJ_FILES) ; do \
	  $(INST_PROJ_CVS) $$p $(DIRPROJECT)/hw/utils/verilator/$$p; \
	done
	for p in $(INST_PROJ_BIN_FILES) ; do \
	  $(INST_PROJ_CVS) $$p $(DIRPROJECT)/hw/utils/verilator/$$p-$(DIRPROJECT_ARCH); \
	done
endif

ftp: info

install-msg:
	@echo "Installed!"
	@echo
	@echo "Add to your startup file (for bash or csh, as appropriate):"
	@echo "	export VERILATOR_ROOT="`pwd`
	@echo "	setenv VERILATOR_ROOT "`pwd` " ; export VERILATOR_ROOT "
	@echo
	@echo "See 'verilator.txt' for documentation."
	@echo

uninstall:
	-cd $(DESTDIR)$(mandir)/man1 && rm -f $(VL_INST_MAN_FILES)
	-cd $(DESTDIR)$(bindir) && rm -f $(VL_INST_BIN_FILES)
	-rm -f $(DESTDIR)$(pkgdatadir)

# autoheader might not change config_build.h.in, so touch a stamp file.
IN_WILD := ${srcdir}/*.in ${srcdir}/*/*.in ${srcdir}/*/*/*.in \
	*.in */*.in */*.in

${srcdir}/config_build.h.in: stamp-h.in
${srcdir}/stamp-h.in: configure.ac $(wildcard $(IN_WILD))
	cd ${srcdir} && autoheader
	echo timestamp > ${srcdir}/stamp-h.in
config_build.h: stamp-h
stamp-h: config_build.h.in config.status
	./config.status
Makefile: Makefile.in config.status
	./config.status
src/Makefile: src/Makefile.in config.status
	./config.status
config.status: configure
	./config.status --recheck
configure: configure.ac
	autoconf

maintainer-clean::
	@echo "This command is intended for maintainers to use;"
	@echo "rebuilding the deleted files requires makeinfo."
	rm -f *.info* $(INFOS) configure

clean mostlyclean distclean maintainer-clean maintainer-copy::
	for dir in $(SUBDIRS); do \
	  echo making $@ in $$dir ; \
	  (cd $$dir && $(MAKE) $@) ; \
	done

clean mostlyclean distclean maintainer-clean::
	rm -f $(SCRIPTS) *.tmp
	rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.kys *.log
	rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs *.idx
	rm -f *.ev *.evs *.ov *.ovs *.cv *.cvs *.ma *.mas
	rm -f *.tex

distclean maintainer-clean::
	rm -f Makefile config.status config.cache config.log verilator_bin* TAGS
	rm -f include/verilated.mk

TAGFILES=${srcdir}/*/*.cpp ${srcdir}/*/*.h ${srcdir}/*/[a-z]*.in \
	${srcdir}/[a-z]*.in ${srcdir}/*.pod

TAGS:	$(TAGFILES)
	etags $(TAGFILES)

######################################################################
# Test targets

dist-file-list:
	@echo "begin-dist-file-list:";  # Scripts look for this
	@echo $(wildcard $(DISTFILES))
	@echo "end-dist-file-list:";  # Scripts look for this

######################################################################
# Distributions

DISTCONFIG = ${srcdir}/src/config_build.h.in

DISTTITLE := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e 's/v/V/' -e q $(DISTCONFIG))
DISTNAME := $(shell sed -e '/DTVERSION/!d' -e 's/[^0-9]*\([0-9.a-z]*\).*/verilator-\1/' -e q $(DISTCONFIG))
DISTDATEPRE := $(shell sed -e '/DTVERSION/!d' -e 's/.*\([1-2][0-9][0-9][0-9].[0-9]*[0-9].[0-9]*[0-9]\).*/\1/' -e q $(DISTCONFIG))

DISTTAGNAME := $(subst .,_,$(subst -,_,$(DISTNAME)))
DISTDATE := $(subst /,-,$(DISTDATEPRE))

tag:
	svnorcvs tag $(DISTTAGNAME)

# Don't depend on DISTFILES because there's no rule for "standards.info*".
dist: $(DISTDEP) maintainer-copy
	-rm -fr $(DISTNAME)
	for file in $(DISTFILES); do \
	  mkdir -p `dirname $(DISTNAME)/$$file` >/dev/null ; \
	  ln $$file $(DISTNAME)/$$file \
	  || { echo copying $$file instead; cp -p $$file $(DISTNAME)/$$file;}; \
	done; true;
	chmod -R a+r $(DISTNAME)
	tar chf $(DISTNAME).tar $(DISTNAME)
	gzip --force --best $(DISTNAME).tar
	mv $(DISTNAME).tar.gz $(DISTNAME).tgz
	rm -fr $(DISTNAME)

maintainer-diff:
	svnorcvs diff $(DISTTAGNAME)

preexist:
	svnorcvs nexists $(DISTTAGNAME)

maintainer-dist: preexist dist tag
	svnorcvs release $(DISTNAME).tgz
