[dm-devel] [PATCH 1/3] multipath-tools: support ABI testing with libabigail
Benjamin Marzinski
bmarzins at redhat.com
Wed Nov 17 18:20:17 UTC 2021
On Fri, Nov 12, 2021 at 10:05:49PM +0100, mwilck at suse.com wrote:
> From: Martin Wilck <mwilck at suse.com>
>
> 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 at suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
> .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 at opensvc.com>
> #
>
> -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
More information about the dm-devel
mailing list