Skip to content

Commit 26d60d2

Browse files
committed
vvp: build and install libvvp as a versioned shared library
Uses the package version 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. The shared library is assumed to be ABI-stable within the same major version, so the SONAME reflects only the major version number.
1 parent c845948 commit 26d60d2

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ else
159159
rm vvp/vvp$(suffix).exe
160160
endif
161161
else
162-
vvp/vvp -M- -M./vpi ./check.vvp | grep 'Hello, World'
162+
LD_LIBRARY_PATH=$(srcdir)/vvp vvp/vvp -M- -M./vpi ./check.vvp | grep 'Hello, World'
163163
endif
164164

165165
clean:

configure.ac

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ AC_SUBST([VERSION_MINOR], [VER_MINOR])
88
AC_SUBST([VERSION_EXTRA], [" (VER_EXTRA)"])
99
AC_SUBST([VERSION], ["VER_MAJOR.VER_MINOR (VER_EXTRA)"])
1010

11+
# setup libvvp soversion, which depends on abi not package version
12+
AC_SUBST([LIBVVP_SOVERSION], [1])
13+
# setup libvvp version
14+
AC_SUBST([LIBVVP_VERSION], [VER_MAJOR.VER_MINOR])
15+
1116
AC_CONFIG_SRCDIR([netlist.h])
1217
AC_CONFIG_HEADERS([config.h])
1318
AC_CONFIG_HEADERS([_pli_types.h])

vvp/Makefile.in

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ mandir = @mandir@
3333
# It is a little different from the generic includedir.
3434
includedir = @includedir@/iverilog$(suffix)
3535
pdfdir = @docdir@
36+
pkgconfigdir = @libdir@/pkgconfig
3637

3738
# For a cross compile these defines will need to be set accordingly.
3839
HOSTCC = @CC@
@@ -62,9 +63,17 @@ CXXFLAGS = @WARNING_FLAGS@ @WARNING_FLAGS_CXX@ @CXXFLAGS@
6263
LDFLAGS = @rdynamic@ @LDFLAGS@
6364
LIBS = @LIBS@ @EXTRALIBS@
6465

66+
LIBVVP_VERSION = @LIBVVP_VERSION@
67+
LIBVVP_SOVERSION = @LIBVVP_SOVERSION@
68+
6569
ifeq (@WIN32@,yes)
6670
SLDIR=$(bindir)
6771
SLEXT=dll
72+
ifeq (@MINGW32@,yes)
73+
IMPEXT=dll.a
74+
else
75+
IMPEXT=lib
76+
endif
6877
else
6978
SLDIR=$(libdir)
7079
SLEXT=so
@@ -105,7 +114,7 @@ else
105114
rm -f vvp$(suffix).exe
106115
endif
107116
else
108-
./vvp -M../vpi $(srcdir)/examples/hello.vvp | grep 'Hello, World.'
117+
LD_LIBRARY_PATH=. ./vvp -M../vpi $(srcdir)/examples/hello.vvp | grep 'Hello, World.'
109118
endif
110119

111120
clean:
@@ -136,16 +145,32 @@ dep:
136145

137146
ifeq (@LIBVVP@,yes)
138147

139-
CPPFLAGS+= -fpic
148+
ifeq (@WIN32@,yes)
149+
else
150+
CXXFLAGS+= -fPIC
151+
CFLAGS+= -fPIC
152+
endif
140153

141154
# To avoid setting LD_LIBRARY_PATH when running vvp from the build tree,
142155
# add option -Wl,-rpath=`pwd` to the CXX command below.
143156

144157
vvp@EXEEXT@: main.o $(srcdir)/vvp.def libvvp$(suffix).$(SLEXT)
145158
$(CXX) $(LDFLAGS) -o vvp@EXEEXT@ main.o -L. $(LDFLAGS) -lvvp$(suffix) $(LIBS)
146159

160+
ifeq (@MINGW32@,yes)
161+
libvvp$(suffix).$(SLEXT): $O
162+
$(CXX) -shared $(LDFLAGS) -o libvvp$(suffix)-$(LIBVVP_SOVERSION).$(SLEXT) -Wl,--out-implib libvvp$(suffix).$(IMPEXT) $O $(LIBS) $(dllib)
163+
else
147164
libvvp$(suffix).$(SLEXT): $O
148-
$(CXX) -shared $(LDFLAGS) -o libvvp$(suffix).$(SLEXT) $O $(LIBS) $(dllib)
165+
$(CXX) -shared $(LDFLAGS) \
166+
-Wl,-soname,libvvp$(suffix).$(SLEXT).$(LIBVVP_SOVERSION) \
167+
-o libvvp$(suffix).$(SLEXT).$(LIBVVP_VERSION) \
168+
$O $(LIBS) $(dllib)
169+
ln -sf libvvp$(suffix).$(SLEXT).$(LIBVVP_VERSION) \
170+
libvvp$(suffix).$(SLEXT).$(LIBVVP_SOVERSION)
171+
ln -sf libvvp$(suffix).$(SLEXT).$(LIBVVP_SOVERSION) \
172+
libvvp$(suffix).$(SLEXT)
173+
endif
149174
else
150175
ifeq (@WIN32@,yes)
151176
# To support cocotb, we export the VPI functions directly. This allows
@@ -221,7 +246,7 @@ stamp-config-h: $(srcdir)/config.h.in ../config.status
221246
cd ..; ./config.status --header=vvp/config.h
222247
config.h: stamp-config-h
223248

224-
install: all installdirs installfiles
249+
install: all installdirs installfiles installpkgconfig
225250

226251
F = ./vvp@EXEEXT@ $(srcdir)/libvvp.h $(INSTALL_DOC)
227252

@@ -234,7 +259,20 @@ installpdf: vvp.pdf installdirs
234259
installfiles: $(F) | installdirs
235260
$(INSTALL_PROGRAM) ./vvp@EXEEXT@ "$(DESTDIR)$(bindir)/vvp$(suffix)@EXEEXT@"
236261
ifeq (@LIBVVP@,yes)
237-
$(INSTALL_PROGRAM) ./libvvp$(suffix).$(SLEXT) "$(DESTDIR)$(SLDIR)/libvvp$(suffix).$(SLEXT)"
262+
ifeq (@WIN32@,yes)
263+
$(INSTALL_PROGRAM) ./libvvp$(suffix)-$(LIBVVP_SOVERSION).$(SLEXT) "$(DESTDIR)$(bindir)/libvvp$(suffix)-$(LIBVVP_SOVERSION).$(SLEXT)"
264+
$(INSTALL_PROGRAM) ./libvvp$(suffix).$(IMPEXT) "$(DESTDIR)$(libdir)/libvvp$(suffix).$(IMPEXT)"
265+
else
266+
# Install real library
267+
$(INSTALL_PROGRAM) ./libvvp$(suffix).$(SLEXT).$(LIBVVP_VERSION) \
268+
"$(DESTDIR)$(SLDIR)/libvvp$(suffix).$(SLEXT).$(LIBVVP_VERSION)"
269+
# SONAME symlink (runtime)
270+
ln -sf libvvp$(suffix).$(SLEXT).$(LIBVVP_VERSION) \
271+
"$(DESTDIR)$(SLDIR)/libvvp$(suffix).$(SLEXT).$(LIBVVP_SOVERSION)"
272+
# Linker symlink (devel)
273+
ln -sf libvvp$(suffix).$(SLEXT).$(LIBVVP_SOVERSION) \
274+
"$(DESTDIR)$(SLDIR)/libvvp$(suffix).$(SLEXT)"
275+
endif
238276
$(INSTALL_DATA) $(srcdir)/libvvp.h "$(DESTDIR)$(includedir)/libvvp.h"
239277
endif
240278

@@ -244,6 +282,9 @@ installdirs: $(srcdir)/../mkinstalldirs
244282
"$(DESTDIR)$(INSTALL_DOCDIR)" \
245283
"$(DESTDIR)$(INSTALL_PDFDIR)"
246284

285+
installpkgconfig:
286+
$(INSTALL) -d $(DESTDIR)$(pkgconfigdir)
287+
$(INSTALL_DATA) libvvp.pc $(DESTDIR)$(pkgconfigdir)
247288

248289
uninstall: $(UNINSTALL32)
249290
rm -f "$(DESTDIR)$(bindir)/vvp$(suffix)@EXEEXT@"

vvp/libvvp.pc.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
prefix=@prefix@
2+
exec_prefix=@exec_prefix@
3+
libdir=@libdir@
4+
includedir=@includedir@
5+
6+
Name: libvvp
7+
Version: @LIBVVP_VERSION@
8+
Description: Icarus Verilog VVP runtime library
9+
Libs: -L${libdir} -lvvp
10+
Cflags: -I${includedir}/iverilog

0 commit comments

Comments
 (0)