Files
iverilog/vvp/Makefile.in
T
Ralf Habacker 9d3101fd19 vvp: build and install libvvp as a versioned shared library
It uses a dedicated LIBVVP_SOVERSION specified in onfigure.ac
for the SONAME and full library version.

For linking, a pkg-config file is generated, and when building on
Windows, an import library is created that can be used with both
GCC and MSVC compilers.

On non-Windows platforms, all object files are compiled with -fPIC
to ensure compatibility with shared libraries.

On Windows use 'lib' prefix for library name with MinGW compiler
only. Other compiler like MSVC normally are not using any library
prefix.

With this commit the build rules for the vpp executable has been
cleaned too because the complex structure of the manually created
Makefile.in made it very difficult to extract specific parts of
them.
2026-05-13 10:45:04 +02:00

332 lines
9.7 KiB
Makefile

#
# This source code is free software; you can redistribute it
# and/or modify it in source code form under the terms of the GNU
# Library General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program 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 Library General Public License for more details.
#
# You should have received a copy of the GNU Library General Public
# License along with this program; if not, write to the Free
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
SHELL = /bin/sh
suffix = @install_suffix@
prefix = @prefix@
exec_prefix = @exec_prefix@
srcdir = @srcdir@
datarootdir = @datarootdir@
abs_builddir = @abs_builddir@
VPATH = $(srcdir)
bindir = @bindir@
libdir = @libdir@
man1dir = @mandir@/man1
docdir = @docdir@
pkgconfigdir = @libdir@/pkgconfig
# This is actually the directory where we install our own header files.
# It is a little different from the generic includedir.
ivl_includedir = @includedir@/iverilog$(suffix)
# For a cross compile these defines will need to be set accordingly.
HOSTCC = @CC@
HOSTCFLAGS = @WARNING_FLAGS@ @WARNING_FLAGS_CC@ @CFLAGS@
BUILDCC = @CC_FOR_BUILD@
BUILDEXT = @BUILD_EXEEXT@
CXX = @CXX@
ENV_VVP=@ENV_VVP@
INSTALL = @INSTALL@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
LEX = @LEX@
YACC = @YACC@
MAN = @MAN@
PS2PDF = @PS2PDF@
ifeq (@srcdir@,.)
INCLUDE_PATH = -I. -I..
else
INCLUDE_PATH = -I. -I.. -I$(srcdir) -I$(srcdir)/..
endif
CPPFLAGS = $(INCLUDE_PATH) @CPPFLAGS@ @DEFS@ -DICARUS_VPI_CONST=const
CFLAGS = @WARNING_FLAGS@ @WARNING_FLAGS_CC@ @CFLAGS@ @PICFLAG@
CXXFLAGS = @WARNING_FLAGS@ @WARNING_FLAGS_CXX@ @CXXFLAGS@ @PICFLAG@
LDFLAGS = @rdynamic@ @LDFLAGS@ @PICFLAG@
LIBS = @LIBS@ @EXTRALIBS@ @DLLIB@
LIBVVP_VERSION = @LIBVVP_VERSION@
LIBVVP_SOVERSION = @LIBVVP_SOVERSION@
LIBBASENAME=vvp$(suffix)
LDFLAGS_SHARED = @rdynamic@ @shared@ @LDFLAGS@
ifeq (@MINGW32@,yes)
SLDIR=$(bindir)
SLEXT=dll
IMPEXT=dll.a
LIBPREFIX=lib
LIBNAME=$(LIBPREFIX)$(LIBBASENAME)
LIBSONAME=$(LIBNAME).$(SLEXT).$(LIBVVP_SOVERSION)
LIBREALNAME=$(LIBNAME).$(SLEXT).$(LIBVVP_VERSION)
LIBLINKNAME=$(LIBNAME).$(SLEXT)
LIBTARGET=$(LIBNAME)-$(LIBVVP_SOVERSION).$(SLEXT)
LIBBUILD=$(LIBTARGET)
LIBLINKFLAGS=-Wl,--out-implib,$(LIBNAME).$(IMPEXT) -Wl,--no-undefined
LIBPOSTBUILD=@true
LIBINSTALL=$(LIBTARGET)
LIBDEVELINSTALL=$(LIBNAME).$(IMPEXT)
else ifeq (@WIN32@,yes)
SLDIR=$(bindir)
SLEXT=dll
IMPEXT=lib
LIBPREFIX=
LIBNAME=$(LIBPREFIX)$(LIBBASENAME)
LIBSONAME=$(LIBNAME).$(SLEXT).$(LIBVVP_SOVERSION)
LIBREALNAME=$(LIBNAME).$(SLEXT).$(LIBVVP_VERSION)
LIBLINKNAME=$(LIBNAME).$(SLEXT)
LIBTARGET=$(LIBLINKNAME)
LIBBUILD=$(LIBLINKNAME)
LIBLINKFLAGS=
LIBPOSTBUILD=@true
LIBINSTALL=$(LIBTARGET)
LIBDEVELINSTALL=
else ifneq (,$(findstring darwin,@host_os@))
SLDIR=$(libdir)
SLEXT=dylib
LIBPREFIX=lib
LIBNAME=$(LIBPREFIX)$(LIBBASENAME)
LIBSONAME=$(LIBNAME).$(LIBVVP_SOVERSION).$(SLEXT)
LIBREALNAME=$(LIBNAME).$(LIBVVP_VERSION).$(SLEXT)
LIBLINKNAME=$(LIBNAME).$(SLEXT)
LIBTARGET=$(LIBREALNAME)
LIBBUILD=$(LIBTARGET)
LDFLAGS_SHARED=-dynamiclib
LIBLINKFLAGS= \
-Wl,-install_name,$(libdir)/$(LIBSONAME) \
-Wl,-compatibility_version,$(LIBVVP_SOVERSION) \
-Wl,-current_version,$(LIBVVP_VERSION)
LIBPOSTBUILD= \
ln -sf $(LIBREALNAME) $(LIBSONAME) && \
ln -sf $(LIBSONAME) $(LIBLINKNAME)
LIBINSTALL=$(LIBTARGET)
LIBDEVELINSTALL=
else
SLDIR=$(libdir)
SLEXT=so
LIBPREFIX=lib
LIBNAME=$(LIBPREFIX)$(LIBBASENAME)
LIBSONAME=$(LIBNAME).$(SLEXT).$(LIBVVP_SOVERSION)
LIBREALNAME=$(LIBNAME).$(SLEXT).$(LIBVVP_VERSION)
LIBLINKNAME=$(LIBNAME).$(SLEXT)
LIBTARGET=$(LIBREALNAME)
LIBBUILD=$(LIBLINKNAME)
LIBLINKFLAGS=-Wl,-soname,$(LIBSONAME)
LIBPOSTBUILD=ln -sf $(LIBREALNAME) $(LIBSONAME) && ln -sf $(LIBSONAME) $(LIBLINKNAME)
LIBINSTALL=$(LIBTARGET)
LIBDEVELINSTALL=
endif
MDIR1 = -DMODULE_DIR1='"$(libdir)/ivl$(suffix)"'
CORE_OBJ = lib_main.o \
parse.o parse_misc.o lexor.o arith.o array_common.o array.o bufif.o compile.o \
concat.o dff.o class_type.o enum_type.o extend.o file_line.o latch.o npmos.o part.o \
permaheap.o reduce.o resolv.o \
sfunc.o stop.o \
substitute.o \
symbols.o ufunc.o codes.o vthread.o schedule.o \
statistics.o tables.o udp.o vvp_island.o vvp_net.o vvp_net_sig.o \
vvp_object.o vvp_cobject.o vvp_darray.o event.o logic.o delay.o \
words.o island_tran.o
VPI_OBJ = vpi_modules.o vpi_bit.o vpi_callback.o vpi_cobject.o vpi_const.o vpi_darray.o \
vpi_event.o vpi_iter.o vpi_mcd.o \
vpi_priv.o vpi_scope.o vpi_real.o vpi_signal.o vpi_string.o vpi_tasks.o vpi_time.o \
vpi_vthr_vector.o vpip_bin.o vpip_hex.o vpip_oct.o \
vpip_to_dec.o vpip_format.o vvp_vpi.o
LIB_OBJ = $(CORE_OBJ) $(VPI_OBJ)
LIB_CLEAN = $(LIBNAME)*.$(SLEXT)* libvvp.pc
VVP_OBJ = main.o
VVP_CLEAN = vvp@EXEEXT@
ifeq (@WIN32@,yes)
# To support cocotb, we export the VPI functions directly. This allows
# cocotb to build VPI modules without using our vpi_user.h and libvpi.a.
# The .def file controls what is exported.
VVP_OBJ += $(srcdir)/vvp.def
endif
ifeq (@LIBVVP@,yes)
VVP_LDFLAGS = -lvvp$(suffix)
VVP_DEPS = $(LIBBUILD)
else
VVP_OBJ += $(LIB_OBJ)
endif
ifneq (@install_suffix@,)
VVP_POSTBUILD = ln -sf vvp@EXEEXT@ vvp$(suffix)@EXEEXT@
VVP_CLEAN += vvp$(suffix)@EXEEXT@
endif
all: dep vvp@EXEEXT@ vvp.man
# ENV_VVP sets LD_LIBRARY_PATH by default to run vvp from the build tree
check: all
$(ENV_VVP) ./vvp$(suffix)@EXEEXT@ -M../vpi $(srcdir)/examples/hello.vvp | grep 'Hello, World.'
clean:
rm -f *.o *~ parse.cc parse.h lexor.cc tables.cc $(LIB_CLEAN)
rm -f $(VVP_CLEAN) parse.output vvp.man vvp.ps vvp.pdf vvp.exp
rm -rf dep
distclean: clean
rm -f Makefile config.log
rm -f stamp-config-h config.h
cppcheck: $(LIB_OBJ:.o=.cc) draw_tt.c
cppcheck --enable=all --std=c99 --std=c++11 -f \
--check-level=exhaustive \
--suppressions-list=$(srcdir)/../cppcheck-global.sup \
--suppressions-list=$(srcdir)/cppcheck.sup \
-UMODULE_DIR1 -UMODULE_DIR2 -UYY_USER_INIT \
-UYYPARSE_PARAM -UYYPRINT -Ushort -Usize_t -Uyyoverflow \
-UYYTYPE_INT8 -UYYTYPE_INT16 -UYYTYPE_UINT8 -UYYTYPE_UINT16 \
-UYYSTYPE -UINFINITY -U__SIZE_TYPE__ -Ufree \
-U__PTRDIFF_TYPE__ \
--relative-paths=$(srcdir) $(INCLUDE_PATH) $^
Makefile: $(srcdir)/Makefile.in
cd ..; ./config.status --file=vvp/$@
dep:
mkdir dep
ifeq (@LIBVVP@,yes)
$(LIBBUILD): $(LIB_OBJ)
$(CXX) $(LDFLAGS_SHARED) $(LIBLINKFLAGS) -o $(LIBTARGET) $^ $(LIBS)
$(LIBPOSTBUILD)
endif
vvp@EXEEXT@: $(VVP_OBJ) $(VVP_DEPS)
$(CXX) $(LDFLAGS) -o $@ $(VVP_OBJ) -L. $(VVP_LDFLAGS) $(LIBS)
$(VVP_POSTBUILD)
%.o: %.cc config.h | dep
$(CXX) $(CPPFLAGS) -DIVL_SUFFIX='"$(suffix)"' $(MDIR1) $(MDIR2) $(CXXFLAGS) @DEPENDENCY_FLAG@ -c $< -o $*.o
mv $*.d dep/$*.d
%.o: %.c config.h | dep
$(CC) $(CPPFLAGS) $(MDIR1) $(MDIR2) $(CFLAGS) @DEPENDENCY_FLAG@ -c $< -o $*.o
mv $*.d dep/$*.d
tables.cc: $(srcdir)/draw_tt.c
$(BUILDCC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o draw_tt$(BUILDEXT) $(srcdir)/draw_tt.c
./draw_tt$(BUILDEXT) > tables.cc
rm draw_tt$(BUILDEXT)
lexor.o: lexor.cc parse.h
parse.o: parse.cc
tables.o: tables.cc
# Use pattern rules to avoid parallel build issues (see pr3462585)
parse%cc parse%h: $(srcdir)/parse%y
$(YACC) --verbose -t --defines=parse.h -o parse.cc $<
lexor.cc: $(srcdir)/lexor.lex
$(LEX) -s -o$@ $<
vvp.man: $(srcdir)/vvp.man.in ../config.status
cd ..; ./config.status --file=vvp/$@
vvp.ps: vvp.man
$(MAN) -t ./$< > $@
vvp.pdf: vvp.ps
$(PS2PDF) $< $@
INSTALL_DOC =
ifneq ($(MAN),none)
INSTALL_DOC += installman
ifneq ($(PS2PDF),none)
ifeq (@MINGW32@,yes)
INSTALL_DOC += installpdf
all: vvp.pdf
endif
endif
endif
stamp-config-h: $(srcdir)/config.h.in ../config.status
@rm -f $@
cd ..; ./config.status --header=vvp/config.h
config.h: stamp-config-h
install: all installdirs installfiles installpkgconfig
F = ./vvp@EXEEXT@ $(srcdir)/libvvp.h $(INSTALL_DOC)
installman: vvp.man installdirs
$(INSTALL_DATA) vvp.man "$(DESTDIR)$(man1dir)/vvp$(suffix).1"
installpdf: vvp.pdf installdirs
$(INSTALL_DATA) vvp.pdf "$(DESTDIR)$(docdir)/vvp$(suffix).pdf"
installfiles: $(F) | installdirs
$(INSTALL_PROGRAM) ./vvp@EXEEXT@ "$(DESTDIR)$(bindir)/vvp$(suffix)@EXEEXT@"
ifeq (@LIBVVP@,yes)
$(INSTALL_PROGRAM) ./$(LIBINSTALL) "$(DESTDIR)$(SLDIR)/$(LIBINSTALL)"
ifeq (@WIN32@,yes)
ifneq ($(LIBDEVELINSTALL),)
$(INSTALL_PROGRAM) ./$(LIBDEVELINSTALL) "$(DESTDIR)$(libdir)/$(LIBDEVELINSTALL)"
endif
else
# Install real library
ln -sf $(LIBREALNAME) "$(DESTDIR)$(SLDIR)/$(LIBSONAME)"
ln -sf $(LIBSONAME) "$(DESTDIR)$(SLDIR)/$(LIBLINKNAME)"
endif
$(INSTALL_DATA) $(srcdir)/libvvp.h "$(DESTDIR)$(ivl_includedir)/libvvp.h"
endif
installdirs: $(srcdir)/../mkinstalldirs
$(srcdir)/../mkinstalldirs "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(ivl_includedir)" \
"$(DESTDIR)$(libdir)" \
"$(DESTDIR)$(docdir)" \
"$(DESTDIR)$(man1dir)"
installpkgconfig:
$(INSTALL) -d "$(DESTDIR)$(pkgconfigdir)"
$(INSTALL_DATA) libvvp.pc "$(DESTDIR)$(pkgconfigdir)/libvvp$(suffix).pc"
uninstall: $(UNINSTALL32)
rm -f "$(DESTDIR)$(bindir)/vvp$(suffix)@EXEEXT@"
rm -f "$(DESTDIR)$(man1dir)/vvp$(suffix).1" \
"$(DESTDIR)$(docdir)/vvp$(suffix).pdf"
ifeq (@LIBVVP@,yes)
rm -f "$(DESTDIR)$(SLDIR)/$(LIBINSTALL)"
ifeq (@WIN32@,yes)
ifneq ($(LIBDEVELINSTALL),)
rm -f "$(DESTDIR)$(libdir)/$(LIBDEVELINSTALL)"
endif
else
rm -f "$(DESTDIR)$(SLDIR)/$(LIBLINKNAME)"
rm -f "$(DESTDIR)$(SLDIR)/$(LIBSONAME)"
rm -f "$(DESTDIR)$(SLDIR)/$(LIBREALNAME)"
endif
rm -f "$(DESTDIR)$(pkgconfigdir)/libvvp$(suffix).pc"
rm -f "$(DESTDIR)$(ivl_includedir)/libvvp.h"
endif
-include $(patsubst %.o, dep/%.d, $LIB_OBJ)