# -*- Makefile -*- #***************************************************************************** # # DESCRIPTION: Verilator: Makefile for verilog source # # Code available from: https://verilator.org # #***************************************************************************** # # Copyright 2003-2021 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. # SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 # #****************************************************************************/ #### Start of system configuration section. #### # Unfortunately configure uses relative paths, and this makefile is called # from a level lower, so we need to move up if it's relative, not if absolute. config_srcdir = @srcdir@ ifeq ($(config_srcdir),.) srcdir = .. else # Run an experiment ifeq ($(wildcard $(config_srcdir)/../Makefile_obj.in),) srcdir = $(config_srcdir) else srcdir = $(config_srcdir)/.. endif endif incdir = $(srcdir)/../include # Bldsrc may differ from srcdir if configure wan't run from the kit top bldsrc = .. # Programs CC = @CC@ CXX = @CXX@ LINK = @CXX@ LEX = @LEX@ LFLAGS = -d PERL = @PERL@ PYTHON3 = @PYTHON3@ YACC = @YACC@ OBJCACHE ?= @OBJCACHE@ prefix = @prefix@ # Directory in which to install data across multiple architectures datarootdir = @datarootdir@ # Directory in which to install package specific files # Generally ${prefix}/share/verilator pkgdatadir = @pkgdatadir@ # Compile options CFG_WITH_CCWARN = @CFG_WITH_CCWARN@ CFG_WITH_DEFENV = @CFG_WITH_DEFENV@ CPPFLAGS += @CPPFLAGS@ CFLAGS += @CFLAGS@ CXXFLAGS += @CXXFLAGS@ LDFLAGS += @LDFLAGS@ EXEEXT = @EXEEXT@ CFG_CXXFLAGS_SRC = @CFG_CXXFLAGS_SRC@ CFG_CXXFLAGS_PARSER = @CFG_CXXFLAGS_PARSER@ # Compiler flags that turn on extra warnings CFG_CXXFLAGS_WEXTRA = @CFG_CXXFLAGS_WEXTRA@ CFG_LDFLAGS_SRC = @CFG_LDFLAGS_SRC@ CFG_LIBS = @CFG_LIBS@ #### End of system configuration section. #### VPATH += . $(bldsrc) $(srcdir) TGT = ../../verilator_bin$(EXEEXT) ################# ifeq ($(VL_DEBUG),) # Optimize CPPFLAGS += -O2 else # Debug CPPFLAGS += @CFG_CXXFLAGS_DEBUG@ -DVL_DEBUG -D_GLIBCXX_DEBUG LDFLAGS += @CFG_LDFLAGS_DEBUG@ endif ################# #LIBS += -ldl #CCMALLOC = /usr/local/lib/ccmalloc-gcc.o -lccmalloc -ldl # -lfl not needed as Flex invoked with %nowrap option LIBS = $(CFG_LIBS) -lm CPPFLAGS += -MMD CPPFLAGS += -I. -I$(bldsrc) -I$(srcdir) -I$(incdir) -I../../include #CPPFLAGS += -DVL_LEAK_CHECKS # If running valgrind or other hunting tool CPPFLAGS += -MP # Only works on recent GCC versions ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users CPPFLAGS += -W -Wall $(CFG_CXXFLAGS_WEXTRA) $(CFG_CXXFLAGS_SRC) -Werror #CPPFLAGS += -pedantic-errors else CPPFLAGS += $(CFG_CXXFLAGS_SRC) endif LDFLAGS += $(CFG_LDFLAGS_SRC) CPPFLAGSWALL = $(CPPFLAGS) CPPFLAGSPARSER = $(CPPFLAGS) $(CFG_CXXFLAGS_PARSER) # Allow RPM builds to specify hardcoded data directories # To do this: ifeq ($(CFG_WITH_DEFENV),yes) CPPFLAGS += -DDEFENV_SYSTEMC=\"$(SYSTEMC)\" CPPFLAGS += -DDEFENV_SYSTEMC_ARCH=\"$(SYSTEMC_ARCH)\" CPPFLAGS += -DDEFENV_SYSTEMC_INCLUDE=\"$(SYSTEMC_INCLUDE)\" CPPFLAGS += -DDEFENV_SYSTEMC_LIBDIR=\"$(SYSTEMC_LIBDIR)\" ifeq ($(VERILATOR_ROOT),) # Use what we're given, or intuit CPPFLAGS += -DDEFENV_VERILATOR_ROOT=\"$(pkgdatadir)\" else CPPFLAGS += -DDEFENV_VERILATOR_ROOT=\"$(VERILATOR_ROOT)\" endif endif HEADERS = $(wildcard V*.h v*.h) ASTGEN = $(srcdir)/astgen BISONPRE = $(srcdir)/bisonpre FLEXFIX = $(srcdir)/flexfix VLCOVGEN = $(srcdir)/vlcovgen ###################################################################### #### Top level all: make_info $(TGT) make_info: @echo " Compile flags: " $(CXX) ${CFLAGS} ${CXXFLAGS} ${CPPFLAGS} clean mostlyclean distclean maintainer-clean:: -rm -f *.o *.d *_gen_* -rm -f *__gen* -rm -f obj_* .objcache* distclean maintainer-clean:: clean maintainer-clean:: maintainer-copy:: #### Top executable RAW_OBJS = \ Verilator.o \ V3Active.o \ V3ActiveTop.o \ V3Assert.o \ V3AssertPre.o \ V3Ast.o \ V3AstNodes.o \ V3Begin.o \ V3Branch.o \ V3Broken.o \ V3CCtors.o \ V3CUse.o \ V3Case.o \ V3Cast.o \ V3Cdc.o \ V3Changed.o \ V3Class.o \ V3Clean.o \ V3Clock.o \ V3Combine.o \ V3Common.o \ V3Config.o \ V3Const__gen.o \ V3Coverage.o \ V3CoverageJoin.o \ V3Dead.o \ V3Delayed.o \ V3Depth.o \ V3DepthBlock.o \ V3Descope.o \ V3DupFinder.o \ V3EmitCBase.o \ V3EmitCConstPool.o \ V3EmitCFunc.o \ V3EmitCHeaders.o \ V3EmitCImp.o \ V3EmitCInlines.o \ V3EmitCMain.o \ V3EmitCMake.o \ V3EmitCModel.o \ V3EmitCSyms.o \ V3EmitMk.o \ V3EmitV.o \ V3EmitXml.o \ V3Error.o \ V3Expand.o \ V3File.o \ V3FileLine.o \ V3Gate.o \ V3GenClk.o \ V3Global.o \ V3Graph.o \ V3GraphAlg.o \ V3GraphAcyc.o \ V3GraphPathChecker.o \ V3GraphTest.o \ V3Hash.o \ V3Hasher.o \ V3HierBlock.o \ V3Inline.o \ V3Inst.o \ V3InstrCount.o \ V3Life.o \ V3LifePost.o \ V3LinkCells.o \ V3LinkDot.o \ V3LinkJump.o \ V3LinkInc.o \ V3LinkLValue.o \ V3LinkLevel.o \ V3LinkParse.o \ V3LinkResolve.o \ V3Localize.o \ V3MergeCond.o \ V3Name.o \ V3Number.o \ V3OptionParser.o \ V3Options.o \ V3Order.o \ V3Os.o \ V3Param.o \ V3Partition.o \ V3PreShell.o \ V3Premit.o \ V3ProtectLib.o \ V3Randomize.o \ V3Reloop.o \ V3Scope.o \ V3Scoreboard.o \ V3Slice.o \ V3Split.o \ V3SplitAs.o \ V3SplitVar.o \ V3Stats.o \ V3StatsReport.o \ V3String.o \ V3Subst.o \ V3Table.o \ V3Task.o \ V3Trace.o \ V3TraceDecl.o \ V3Tristate.o \ V3TSP.o \ V3Undriven.o \ V3Unknown.o \ V3Unroll.o \ V3VariableOrder.o \ V3Waiver.o \ V3Width.o \ V3WidthSel.o \ # Non-concatable NC_OBJS += \ V3ParseImp.o \ V3ParseGrammar.o \ V3ParseLex.o \ V3PreProc.o \ # verilator_coverage VLCOV_OBJS = \ VlcMain.o \ #### Linking ifeq ($(VL_VLCOV),) PREDEP_H = V3Ast__gen_classes.h OBJS += $(RAW_OBJS) $(NC_OBJS) else PREDEP_H = OBJS += $(VLCOV_OBJS) endif V3__CONCAT.cpp: $(addsuffix .cpp, $(basename $(RAW_OBJS))) $(PERL) $(srcdir)/../bin/verilator_includer $^ > $@ $(TGT): $(PREDEP_H) $(OBJS) @echo " Linking $@..." ${LINK} ${LDFLAGS} -o $@ $(OBJS) $(CCMALLOC) ${LIBS} V3Number_test: V3Number_test.o ${LINK} ${LDFLAGS} -o $@ $^ ${LIBS} #### Modules %__gen.cpp: %.cpp $(ASTGEN) V3Ast.h V3AstNodes.h $(PYTHON3) $(ASTGEN) -I $(srcdir) $*.cpp %.o: %.cpp $(OBJCACHE) ${CXX} ${CXXFLAGS} ${CPPFLAGSWALL} -c $< -o $@ %.o: %.c $(OBJCACHE) ${CC} ${CFLAGS} ${CPPFLAGSWALL} -c $< -o $@ V3ParseLex.o: V3ParseLex.cpp V3Lexer.yy.cpp V3ParseBison.c $(OBJCACHE) ${CXX} ${CXXFLAGS} ${CPPFLAGSPARSER} -c $< -o $@ V3ParseGrammar.o: V3ParseGrammar.cpp V3ParseBison.c $(OBJCACHE) ${CXX} ${CXXFLAGS} ${CPPFLAGSPARSER} -c $< -o $@ V3ParseImp.o: V3ParseImp.cpp V3ParseBison.c $(OBJCACHE) ${CXX} ${CXXFLAGS} ${CPPFLAGSPARSER} -c $< -o $@ V3PreProc.o: V3PreProc.cpp V3PreLex.yy.cpp $(OBJCACHE) ${CXX} ${CXXFLAGS} ${CPPFLAGSPARSER} -c $< -o $@ #### Generated files # Target rule called before parallel build to make generated files serial:: V3Ast__gen_classes.h V3ParseBison.c serial_vlcov:: vlcovgen.d vlcovgen.d: $(VLCOVGEN) $(srcdir)/../include/verilated_cov_key.h $(PYTHON3) $(VLCOVGEN) --srcdir $(srcdir) touch $@ V3Ast__gen_classes.h : $(ASTGEN) V3Ast.h V3AstNodes.h $(PYTHON3) $(ASTGEN) -I $(srcdir) --classes V3ParseBison.h: V3ParseBison.c # Have only one output file in this rule to prevent parallel make issues V3ParseBison.c: verilog.y $(BISONPRE) @echo "If you get errors from verilog.y below, try upgrading bison to version 1.875 or newer." $(PYTHON3) $(BISONPRE) --yacc ${YACC} -d -v -o V3ParseBison.c $< V3Lexer_pregen.yy.cpp: verilog.l V3ParseBison.h $(HEADERS) ${LEX} --version ${LEX} ${LFLAGS} -o$@ $< V3Lexer.yy.cpp: V3Lexer_pregen.yy.cpp $(FLEXFIX) $(PYTHON3) $(FLEXFIX) V3Lexer <$< >$@ V3PreLex_pregen.yy.cpp: V3PreLex.l $(HEADERS) ${LEX} --version ${LEX} ${LFLAGS} -o$@ $< V3PreLex.yy.cpp: V3PreLex_pregen.yy.cpp $(FLEXFIX) $(PYTHON3) $(FLEXFIX) V3PreLex <$< >$@ .SUFFIXES: ###################################################################### ###################################################################### DEPS := $(wildcard *.d) ifneq ($(DEPS),) include $(DEPS) endif