mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-02 10:37:53 +02:00
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.
332 lines
9.7 KiB
Makefile
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)
|