On Fri, Nov 12, 2021 at 10:05:49PM +0100, mwilck@xxxxxxxx wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > Use abidw and abidiff (https://sourceware.org/libabigail/) to > generate a formal representation of our ABI, and check for changes. > This will reduce the amount of attention required to detect and > track library version changes. > > To check for differences, run "make abi" on some branch, rename the > "abi" directory to "reference-abi", checkout a different branch, > and run "make abi-test". > > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- > .gitignore | 4 +++ > Makefile | 55 ++++++++++++++++++++++++++++++++++------ > Makefile.inc | 6 +++++ > libdmmp/Makefile | 8 ++++-- > libmpathcmd/Makefile | 4 ++- > libmpathpersist/Makefile | 4 ++- > libmpathvalid/Makefile | 4 ++- > libmultipath/Makefile | 4 ++- > 8 files changed, 75 insertions(+), 14 deletions(-) > > diff --git a/.gitignore b/.gitignore > index 087dffc..5dbac39 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -3,6 +3,7 @@ > *~ > *.so > *.so.0 > +*.abi > *.a > *.gz > *.d > @@ -13,6 +14,9 @@ kpartx/kpartx > multipath/multipath > multipathd/multipathd > mpathpersist/mpathpersist > +abi.tar.gz > +abi > +abi-test > .nfs* > *.swp > *.patch > diff --git a/Makefile b/Makefile > index 7f21db8..1cec777 100644 > --- a/Makefile > +++ b/Makefile > @@ -2,33 +2,70 @@ > # Copyright (C) 2003 Christophe Varoqui, <christophe.varoqui@xxxxxxxxxxx> > # > > -BUILDDIRS := \ > +LIB_BUILDDIRS := \ > libmpathcmd \ > libmultipath \ > + libmpathpersist \ > + libmpathvalid > + > +ifneq ($(ENABLE_LIBDMMP),0) > +LIB_BUILDDIRS += \ > + libdmmp > +endif > + > +BUILDDIRS := $(LIB_BUILDDIRS) \ > libmultipath/prioritizers \ > libmultipath/checkers \ > libmultipath/foreign \ > - libmpathpersist \ > - libmpathvalid \ > multipath \ > multipathd \ > mpathpersist \ > kpartx > > -ifneq ($(ENABLE_LIBDMMP),0) > -BUILDDIRS += \ > - libdmmp > -endif > > BUILDDIRS.clean := $(BUILDDIRS:=.clean) tests.clean > > -.PHONY: $(BUILDDIRS) $(BUILDDIRS:=.uninstall) $(BUILDDIRS:=.install) $(BUILDDIRS.clean) > +.PHONY: $(BUILDDIRS) $(BUILDDIRS:=.uninstall) $(BUILDDIRS:=.install) $(BUILDDIRS:=.clean) $(LIB_BUILDDIRS:=.abi) > > all: $(BUILDDIRS) > > $(BUILDDIRS): > $(MAKE) -C $@ > > +$(LIB_BUILDDIRS:=.abi): $(LIB_BUILDDIRS) > + $(MAKE) -C ${@:.abi=} abi > + > +# Create formal representation of the ABI > +# Useful for verifying ABI compatibility > +# Requires abidw from the abigail suite (https://sourceware.org/libabigail/) > +.PHONY: abi > +abi: $(LIB_BUILDDIRS:=.abi) > + mkdir -p $@ > + ln -ft $@ $(LIB_BUILDDIRS:=/*.abi) > + > +abi.tar.gz: abi > + tar cfz $@ abi > + > +# Check the ABI against a reference. > +# This requires the ABI from a previous run to be present > +# in the directory "reference-abi" > +# Requires abidiff from the abigail suite > +abi-test: abi reference-abi $(wildcard abi/*.abi) > + @err=0; \ > + for lib in abi/*.abi; do \ > + diff=$$(abidiff "reference-$$lib" "$$lib") || { \ > + err=1; \ > + echo "==== ABI differences in for $$lib ===="; \ > + echo "$$diff"; \ > + }; \ > + done >$@; \ > + if [ $$err -eq 0 ]; then \ > + echo "*** OK, ABI unchanged ***"; \ > + else \ > + echo "*** WARNING: ABI has changed, see file $@ ***"; \ > + fi; \ > + [ $$err -eq 0 ] > + > libmultipath libdmmp: libmpathcmd > libmpathpersist libmpathvalid multipath multipathd: libmultipath > libmultipath/prioritizers libmultipath/checkers libmultipath/foreign: libmultipath > @@ -48,6 +85,8 @@ $(BUILDDIRS:=.uninstall): > $(MAKE) -C ${@:.uninstall=} uninstall > > clean: $(BUILDDIRS.clean) > + rm -rf abi abi.tar.gz abi-test compile_commands.json > + > install: all $(BUILDDIRS:=.install) > uninstall: $(BUILDDIRS:=.uninstall) > > diff --git a/Makefile.inc b/Makefile.inc > index d0ec9b4..17071ef 100644 > --- a/Makefile.inc > +++ b/Makefile.inc > @@ -140,3 +140,9 @@ check_file = $(shell \ > %.o: %.c > @echo building $@ because of $? > $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< > + > +%.abi: %.so.0 > + abidw $< >$@ > + > +%.abi: %.so > + abidw $< >$@ > diff --git a/libdmmp/Makefile b/libdmmp/Makefile > index 79b92fb..c91f0c3 100644 > --- a/libdmmp/Makefile > +++ b/libdmmp/Makefile > @@ -25,7 +25,11 @@ all: $(LIBS) doc > > $(LIBS): $(OBJS) > $(CC) $(LDFLAGS) $(SHARED_FLAGS) -Wl,-soname=$@ -o $@ $(OBJS) $(LIBDEPS) > - $(LN) $@ $(DEVLIB) > + > +$(DEVLIB): $(LIBS) > + $(LN) $(LIBS) $@ > + > +abi: $(DEVLIB:%.so=%.abi) > > install: doc.gz > mkdir -p $(DESTDIR)$(usrlibdir) > @@ -54,7 +58,7 @@ uninstall: > $(RM) $(DESTDIR)$(pkgconfdir)/$(PKGFILE) > > clean: dep_clean > - $(RM) core *.a *.o *.gz *.so *.so.* > + $(RM) core *.a *.o *.gz *.so *.so.* *.abi > $(RM) docs/man/*.gz > $(MAKE) -C test clean > > diff --git a/libmpathcmd/Makefile b/libmpathcmd/Makefile > index 2591019..5a7a6e9 100644 > --- a/libmpathcmd/Makefile > +++ b/libmpathcmd/Makefile > @@ -15,6 +15,8 @@ $(LIBS): $(OBJS) $(VERSION_SCRIPT) > $(CC) $(LDFLAGS) $(SHARED_FLAGS) -Wl,-soname=$@ \ > -Wl,--version-script=$(VERSION_SCRIPT) -o $@ $(OBJS) $(LIBDEPS) > > +abi: $(LIBS:%.so.0=%.abi) > + > $(DEVLIB): $(LIBS) > $(LN) $(LIBS) $@ > > @@ -31,7 +33,7 @@ uninstall: > $(RM) $(DESTDIR)$(includedir)/mpath_cmd.h > > clean: dep_clean > - $(RM) core *.a *.o *.so *.so.* *.gz > + $(RM) core *.a *.o *.so *.so.* *.gz *.abi > > include $(wildcard $(OBJS:.o=.d)) > > diff --git a/libmpathpersist/Makefile b/libmpathpersist/Makefile > index 57103e5..d76918f 100644 > --- a/libmpathpersist/Makefile > +++ b/libmpathpersist/Makefile > @@ -18,6 +18,8 @@ $(LIBS): $(OBJS) $(VERSION_SCRIPT) > $(CC) $(LDFLAGS) $(SHARED_FLAGS) -Wl,-soname=$@ \ > -Wl,--version-script=$(VERSION_SCRIPT) -o $@ $(OBJS) $(LIBDEPS) > > +abi: $(LIBS:%.so.0=%.abi) > + > $(DEVLIB): $(LIBS) > $(LN) $(LIBS) $@ > > @@ -44,7 +46,7 @@ uninstall: > $(RM) $(DESTDIR)$(syslibdir)/$(DEVLIB) > > clean: dep_clean > - $(RM) core *.a *.o *.so *.so.* *.gz > + $(RM) core *.a *.o *.so *.so.* *.gz *.abi > > include $(wildcard $(OBJS:.o=.d)) > > diff --git a/libmpathvalid/Makefile b/libmpathvalid/Makefile > index 6bea4bc..b579535 100644 > --- a/libmpathvalid/Makefile > +++ b/libmpathvalid/Makefile > @@ -18,6 +18,8 @@ $(LIBS): $(OBJS) $(VERSION_SCRIPT) > $(CC) $(LDFLAGS) $(SHARED_FLAGS) -Wl,-soname=$@ -o $@ $(OBJS) $(LIBDEPS) -Wl,--version-script=libmpathvalid.version > $(LN) $(LIBS) $(DEVLIB) > > +abi: $(LIBS:%.so.0=%.abi) > + > install: $(LIBS) > $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(syslibdir) > $(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS) > @@ -31,7 +33,7 @@ uninstall: > $(RM) $(DESTDIR)$(includedir)/mpath_valid.h > > clean: dep_clean > - $(RM) core *.a *.o *.so *.so.* *.gz > + $(RM) core *.a *.o *.so *.so.* *.gz *.abi > > include $(wildcard $(OBJS:.o=.d)) > > diff --git a/libmultipath/Makefile b/libmultipath/Makefile > index 7f3921c..42692b3 100644 > --- a/libmultipath/Makefile > +++ b/libmultipath/Makefile > @@ -81,6 +81,8 @@ $(LIBS): $(OBJS) $(VERSION_SCRIPT) > $(DEVLIB): $(LIBS) > $(LN) $(LIBS) $@ > > +abi: $(LIBS:%.so.0=%.abi) > + > ../tests/$(LIBS): $(OBJS) $(VERSION_SCRIPT) > $(CC) $(LDFLAGS) $(SHARED_FLAGS) -Wl,-soname=`basename $@` \ > -o $@ $(OBJS) $(LIBDEPS) > @@ -99,7 +101,7 @@ uninstall: > $(RM) $(DESTDIR)$(syslibdir)/$(DEVLIB) > > clean: dep_clean > - $(RM) core *.a *.o *.so *.so.* *.gz nvme-ioctl.c nvme-ioctl.h > + $(RM) core *.a *.o *.so *.so.* *.gz *.abi nvme-ioctl.c nvme-ioctl.h > > include $(wildcard $(OBJS:.o=.d)) > > -- > 2.33.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel