autotools: ensure that link lines are complete

As mentioned by Tino Keitel on the mailing list, some libs and
executables were only implicitly linked against libraries that they
called directly. This happened to work by chance because these libraries
ended up in the running executable anyway, due to indirect loading.

To catch such problems, the "make installcheck" was extended:
dpkg-shlibdeps is run, if available, and the error output is scanned
for the messages which indicate that a symbol is used without linking
to the right library (example output below).

Had to fix quite a few _LIBADD lines to pass the test.
Some exceptions are allowed:
- libsmltk depends on the caller providing SySync logging support.
- libneon is intentionally not linked explicitly for syncevolution.org
  binaries, to make resulting binaries work with GNUTLS and OpenSSL.

dpkg-shlibdeps: warning: debian/syncevolution-libs/usr/lib/syncevolution/backends/syncdav.so contains an unresolvable reference to symbol icalparameter_new_from_value_string: it's probably a plugin.
dpkg-shlibdeps: warning: 51 other similar warnings have been skipped (use -v to see them all).
...
dpkg-shlibdeps: warning: symbol dlsym used by debian/libsyncevolution0/usr/lib/libsyncevolution.so.0.0.0 found in none of the libraries.
dpkg-shlibdeps: warning: symbol dlerror used by debian/libsyncevolution0/usr/lib/libsyncevolution.so.0.0.0 found in none of the libraries.
dpkg-shlibdeps: warning: symbol dlopen used by debian/libsyncevolution0/usr/lib/libsyncevolution.so.0.0.0 found in none of the libraries.
This commit is contained in:
Patrick Ohly 2012-07-12 15:59:33 +00:00
parent aa2bb63cec
commit 15f2d03184
12 changed files with 86 additions and 48 deletions

View File

@ -13,24 +13,6 @@ IMPROVEMENTS:
- Probably client test should be built only when unit tests or integration tests
are enabled.
- Look at the note at the bottom of configure.ac:
# Avoid hard-coding paths in backends. These names are chosen so
# that a backend can alternatively use its own top-level configure
# with PKG_CHECK_MODULES(SYNCEVOLUTION, "syncevolution") to set them.
# need absolute path, use pwd instead of relative $srcdir
SYNCEVOLUTION_CFLAGS=-I`cd $srcdir && pwd`/src
SYNCEVOLUTION_LIBS=`pwd`/src/syncevo/libsyncevolution.la
AC_SUBST(SYNCEVOLUTION_CFLAGS)
AC_SUBST(SYNCEVOLUTION_LIBS)
Backends does not have their own top-level configure scripts, so usage of
absolute path have to be checked. For now this is worked around
in generated backends.am. Also, for relative path not $(srcdir) should be used
but $(builddir).
- Review CLEANFILES, DISTCLEANFILES, MAINTAINERCLEANFILES and MOSTLYCLEANFILES.
That is - check which files should be assigned to which of CLEAN variables.

View File

@ -309,6 +309,43 @@ toplevel_so_check:
done
endif
# Check that no executable or shared object depends on symbols in
# libraries that it does not link against. Unnecessarily linking
# against libs is okay, that can be caught and fixed by
# -Wl,--as-needed. Depends on dpkg-shlibdeps, skipped if that is
# not available.
all_local_installchecks += toplevel_link_check
toplevel_link_check:
set -x; cd $(DESTDIR) && \
mkdir debian && \
touch debian/control && \
trap "rm -rf debian" EXIT && \
files=$$(find $(DESTDIR)/$(prefix) $(DESTDIR)/$(libdir) $(DESTDIR)/$(bindir) $(DESTDIR)/$(libexecdir) -type f -perm /u+x | sort -u) && \
files=$$(for i in $$files; do if file $$i | grep ELF >/dev/null; then echo $$i; fi; done) && \
if ! dpkg-shlibdeps --version; then \
echo "dpkg-shlibdeps not found, skipping link check"; \
elif LD_LIBRARY_PATH=usr/lib:usr/lib/syncevolution dpkg-shlibdeps \
--ignore-missing-info -O $$files \
2>&1 >/dev/null | \
grep -v $(LINK_CHECK_ALLOWED) | \
grep -e "symbol .* found in none of the libraries" \
-e "contains an unresolvable reference to symbol" \
; then \
echo "linking must be fixed"; false; \
else \
echo "linking is okay"; \
fi
# Some exceptions for the link check above (= symbol may be used without linking).
LINK_CHECK_ALLOWED = -e xxxxxxxx
# SySync_ConsolePrintf is expected by libsmltk and has to be provided by caller.
LINK_CHECK_ALLOWED += -e 'SySync_ConsolePrintf.*libsmltk.so'
if NEON_COMPATIBILITY
# libneon is intentionally not linked against, to choose between
# GNUTLS and OpenSSL at runtime.
LINK_CHECK_ALLOWED += -e 'symbol ne_.*syncdav.so'
endif
# Be strict about running 'syncevolution' only when not doing
# cross-compilation: in that case, if running 'syncevolution' fails,
# abort the build process. Otherwise proceed with the fallback below,

View File

@ -14,10 +14,10 @@ tf()
echo "$1" >>"$tmpfile"
}
tf '# This is a stupid workaround for an absolute path in SYNCEVOLUTION_LIBS.'
tf '# See AUTOTOOLS-TODO for details.'
tf '@SYNCEVOLUTION_LIBS@: src/syncevo/libsyncevolution.la ; @true'
tf ''
# tf '# This is a stupid workaround for an absolute path in SYNCEVOLUTION_LIBS.'
# tf '# See AUTOTOOLS-TODO for details.'
# tf '@SYNCEVOLUTION_LIBS@: src/syncevo/libsyncevolution.la ; @true'
# tf ''
tf "BACKENDS = $BACKENDS"
tf ''
tf "BACKEND_REGISTRIES = $BACKEND_REGISTRIES"

View File

@ -711,7 +711,7 @@ elif test "$SYNTHESISSRC" != "none" && test -d $srcdir/src/synthesis; then
elif test "$enable_shared" = "no"; then
# link against engine
PKG_CHECK_MODULES([SYNTHESIS], [synthesis >= 3.4])
SYNTHESIS_ENGINE="$SYNTHESIS_LIBS -lsynthesis"
SYNTHESIS_ENGINE="$SYNTHESIS_LIBS -lsynthesis -lsmltk"
else
# link against SDK alone, except in client-test
#PKG_CHECK_MODULES(SYNTHESIS, "synthesis-sdk")
@ -732,7 +732,7 @@ if test $SYNTHESIS_SRC != "no-synthesis-source"; then
# to trigger building the synthesis library
SYNTHESIS_SUBDIR=$PWD/src/build-synthesis
SYNTHESIS_CFLAGS="-I$SYNTHESIS_SUBDIR/src"
SYNTHESIS_LIBS="$SYNTHESIS_SUBDIR/src/libsynthesissdk.la"
SYNTHESIS_LIBS="$SYNTHESIS_SUBDIR/src/libsynthesissdk.la $SYNTHESIS_SUBDIR/src/libsmltk.la"
if test "x$enable_core" = "xno" && test "x$enable_gui" != "xno"; then
# SYNTHESIS_SUBDIR is ignored, at least build headers for GUI
@ -741,14 +741,14 @@ if test $SYNTHESIS_SRC != "no-synthesis-source"; then
if test "$enable_shared" = "no"; then
# link against the engines that were enabled
case $SYNCML_ENGINES in both|client|server) SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la";; esac
case $SYNCML_ENGINES in both|client|server) SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la $SYNTHESIS_SUBDIR/src/libsmltk.la";; esac
AC_DEFINE(ENABLE_SYNCML_LINKED, 1, [SyncML engines are linked directly])
else
# It would be nice if we could avoid linking against libsynthesis.la here.
# This doesn't work at the moment because sysync::SySyncDebugPuts()
# is called directly by the libsynthesissdk instead of going through
# the normal C function pointer lookup.
SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la"
SYNTHESIS_LIBS="$SYNTHESIS_LIBS $SYNTHESIS_SUBDIR/src/libsynthesis.la $SYNTHESIS_SUBDIR/src/libsmltk.la"
fi
SYNTHESIS_DEP=$SYNTHESIS_LIBS
@ -996,8 +996,11 @@ fi
# that a backend can alternatively use its own top-level configure
# with PKG_CHECK_MODULES(SYNCEVOLUTION, "syncevolution") to set them.
# need absolute path, use pwd instead of relative $srcdir
#
# When adding something here, remember to also update syncevolution.pc.in.
# -lrt is for clock_gettime() in the Timespec.h inline functions.
SYNCEVOLUTION_CFLAGS=-I`cd $srcdir && pwd`/src
SYNCEVOLUTION_LIBS=`pwd`/src/syncevo/libsyncevolution.la
SYNCEVOLUTION_LIBS="src/syncevo/libsyncevolution.la -lrt"
AC_SUBST(SYNCEVOLUTION_CFLAGS)
AC_SUBST(SYNCEVOLUTION_LIBS)

View File

@ -1,2 +1,3 @@
src/gtk-ui/ui.xml
src/gtk-ui/gtkinfobar.c
src/synthesis/src/pcre/pcre_compile.c

View File

@ -18,10 +18,10 @@ src_backends_activesync_src = \
src/backends/activesync/ActiveSyncCalendarSource.cpp
src_backends_activesync_syncactivesync_la_SOURCES = $(src_backends_activesync_src)
src_backends_activesync_syncactivesync_la_LIBADD = $(EASCLIENT_LIBS) $(SYNCEVOLUTION_LIBS) $(LIBICAL_LIBS)
src_backends_activesync_syncactivesync_la_LIBADD = $(EASCLIENT_LIBS) $(SYNCEVOLUTION_LIBS) $(LIBICAL_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS)
src_backends_activesync_syncactivesync_la_LDFLAGS = -no-undefined -module -avoid-version
src_backends_activesync_syncactivesync_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS)
src_backends_activesync_syncactivesync_la_CXXFLAGS = $(EASCLIENT_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(LIBICAL_CFLAGS)
src_backends_activesync_syncactivesync_la_CXXFLAGS = $(EASCLIENT_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(LIBICAL_CFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS)
src_backends_activesync_syncactivesync_la_DEPENDENCIES = $(SYNCEVOLUTION_LIBS) $(EASCLIENT_DEPENDENCIES)
# activated by EASCLIENT_DEPENDENCIES: usually empty, unless --with-activesyncd-src is used

View File

@ -36,7 +36,7 @@ src_backends_evolution_cppflags = \
-I$(top_srcdir)/src/backends/evolution
src_backends_evolution_syncecal_la_SOURCES = $(src_backends_evolution_syncecal_src)
src_backends_evolution_syncecal_la_LIBADD = $(ECAL_LIBS) $(SYNCEVOLUTION_LIBS)
src_backends_evolution_syncecal_la_LIBADD = $(ECAL_LIBS) $(SYNCEVOLUTION_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS)
# _GNU_SOURCE and -ldl for libical.c + dlsym():
src_backends_evolution_syncecal_la_CPPFLAGS = -D_GNU_SOURCE \
-De_cal_check_timezones=syncevolution_check_timezones \
@ -45,12 +45,12 @@ src_backends_evolution_syncecal_la_CPPFLAGS = -D_GNU_SOURCE \
-De_cal_match_tzid=syncevolution_match_tzid \
$(src_backends_evolution_cppflags)
src_backends_evolution_syncecal_la_LDFLAGS = -module -avoid-version -ldl
src_backends_evolution_syncecal_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS)
src_backends_evolution_syncecal_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS)
src_backends_evolution_syncecal_la_DEPENDENCIES = $(SYNCEVOLUTION_LIBS)
src_backends_evolution_syncebook_la_SOURCES = $(src_backends_evolution_syncebook_src)
src_backends_evolution_syncebook_la_LIBADD = $(EBOOK_LIBS) $(SYNCEVOLUTION_LIBS)
src_backends_evolution_syncebook_la_LIBADD = $(EBOOK_LIBS) $(SYNCEVOLUTION_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS)
src_backends_evolution_syncebook_la_LDFLAGS = -module -avoid-version
src_backends_evolution_syncebook_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS)
src_backends_evolution_syncebook_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS)
src_backends_evolution_syncebook_la_CPPFLAGS = $(src_backends_evolution_cppflags)
src_backends_evolution_syncebook_la_DEPENDENCIES = $(SYNCEVOLUTION_LIBS)

View File

@ -33,9 +33,9 @@ src_backends_webdav_src = \
src/backends/webdav/NeonCXX.cpp
src_backends_webdav_syncdav_la_SOURCES = $(src_backends_webdav_src)
src_backends_webdav_syncdav_la_LIBADD = $(NEON_LIBS) $(SYNCEVOLUTION_LIBS)
src_backends_webdav_syncdav_la_LIBADD = $(NEON_LIBS) $(SYNCEVOLUTION_LIBS) $(LIBICAL_LIBS)
src_backends_webdav_syncdav_la_LDFLAGS = -module -avoid-version
src_backends_webdav_syncdav_la_CXXFLAGS = $(NEON_CFLAGS) $(SYNCEVO_WFLAGS)
src_backends_webdav_syncdav_la_CXXFLAGS = $(NEON_CFLAGS) $(SYNCEVO_WFLAGS) $(LIBICAL_CFLAGS)
src_backends_webdav_syncdav_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS)
src_backends_webdav_syncdav_la_DEPENDENCIES = $(SYNCEVOLUTION_LIBS)

View File

@ -4,7 +4,8 @@ src_gnome_bluetooth_LTLIBRARIES = src/gnome-bluetooth/libgbtsyncevolution.la
src_gnome_bluetooth_libgbtsyncevolution_la_SOURCES = src/gnome-bluetooth/syncevolution.c
src_gnome_bluetooth_libgbtsyncevolution_la_LDFLAGS = -module -avoid-version
src_gnome_bluetooth_libgbtsyncevolution_la_LIBADD = $(GUI_LIBS) $(DBUS_GLIB_LIBS)
src_gnome_bluetooth_libgbtsyncevolution_la_CPPFLAGS = \
$(GNOMEBLUETOOTH_CFLAGS) \
-DLOCALEDIR=\"$(SYNCEVOLUTION_LOCALEDIR)\"
src_gnome_bluetooth_libgbtsyncevolution_la_CFLAGS = $(SYNCEVO_WFLAGS)
src_gnome_bluetooth_libgbtsyncevolution_la_CFLAGS = $(SYNCEVO_WFLAGS) $(GUI_CFLAGS) $(DBUS_GLIB_CFLAGS)

View File

@ -121,14 +121,22 @@ src_syncevolution_CXXFLAGS = $(PCRECPP_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(CORE_
src_syncevolution_CPPFLAGS = $(src_cppflags) -I$(gdbus_dir)
# include Synthesis in distribution: package only files in git if using a git checkout
#
# Need to run autogen.sh in $(distdir)-synthesis and not the final
# $(distdir)/src/synthesis because recent autotools do not copy
# files like config.sub when invoked in $(distdir)/src/synthesis
# (automake 1.11.5, autoconf 2.69), probably because they are
# found in a parent directory. However, these files are needed
# later on during the recursive libsynthesis configure+make.
all_dist_hooks += src_dist_hook
src_dist_hook:
@set -x; [ ! '$(SYNTHESIS_SUBDIR)' ] || \
mkdir -p $(distdir)/src/synthesis && \
rm -rf $(distdir)-synthesis && \
mkdir -p $(distdir)-synthesis && \
if test -d '$(SYNTHESIS_SRC)/.git'; \
then \
( ( cd '$(SYNTHESIS_SRC)' && git archive HEAD ) | ( cd '$(distdir)/src/synthesis' && tar xf - && $$SHELL autogen.sh && rm -rf autom4te.cache && find . -name .gitignore -delete ) ) && \
( printf '%s' 'Creating ChangeLog...' && \
( ( cd '$(SYNTHESIS_SRC)' && git archive HEAD ) | ( cd '$(distdir)-synthesis' && tar xf - && $$SHELL autogen.sh && rm -rf autom4te.cache && find . -name .gitignore -delete ) ) && \
( printf 'Creating synthesis ChangeLog... ' && \
( ( cd '$(SYNTHESIS_SRC)' && \
echo '# Generated by configure. Do not edit.' && \
githash=`git show-ref --head --hash | head -1` && \
@ -136,18 +144,19 @@ src_dist_hook:
echo "# git tag `git describe --tags $$githash`" && \
echo && \
'$(top_srcdir)/missing' --run perl '$(top_srcdir)/build/gen-changelog.pl' ) >ChangeLog.tmp ) && \
( mv -f ChangeLog.tmp '$(distdir)/src/synthesis/ChangeLog' && \
printf '%s\n' ' done.' ) || \
( mv -f ChangeLog.tmp '$(distdir)-synthesis/ChangeLog' && \
printf 'synthesis ChangeLog done\n' ) || \
( rm -f ChangeLog.tmp ; \
printf '%s\n' ' failed.'; \
echo 'Failed to generate ChangeLog.' >&2 ) \
printf 'synthesis ChangeLog failed\n'; \
echo 'Failed to generate synthesis ChangeLog.' >&2 ) \
); \
elif test '$(SYNTHESIS_SRC)' != 'no-synthesis-source'; \
then \
cp -a '$(SYNTHESIS_SRC)/'* '$(distdir)/src/synthesis' && \
cp -a '$(SYNTHESIS_SRC)/'* '$(distdir)-synthesis' && \
for i in _build autom4te.cache; do [ ! -d "$(SYNTHESIS_SRC)/$$i" ] || chmod -R u+rwx "$(SYNTHESIS_SRC)/$$i"; done && \
find '$(distdir)/src/synthesis' -name '.libs' -o -name '*~' -o -name '.*' -o -name '*.o' -o -name '*.lo' -o -name 'CVS' -o -name '.svn' -o -name '.git' -o -name .gitignore -o -name 'autom4te.cache' -print0 | xargs -0 rm -rf; \
fi
find '$(distdir)-synthesis' -name '.libs' -o -name '*~' -o -name '.*' -o -name '*.o' -o -name '*.lo' -o -name 'CVS' -o -name '.svn' -o -name '.git' -o -name .gitignore -o -name 'autom4te.cache' -print0 | xargs -0 rm -rf; \
fi && \
mv '$(distdir)-synthesis' '$(distdir)/src/synthesis'
clean-local: testclean
rm -rf src/testcases

View File

@ -4,7 +4,7 @@ include $(top_srcdir)/src/syncevo/configs/configs.am
# the Funambol C++ client library
src_syncevo_cxxflags = @SYNCEVOLUTION_CXXFLAGS@
src_syncevo_cppflags = @BACKEND_CPPFLAGS@ @GLIB_CFLAGS@ -I$(top_srcdir)/test -I$(gdbus_dir) $(DBUS_CFLAGS) -I$(top_builddir)/src/syncevo -I$(top_srcdir)/src -DSYNCEVO_LIBEXEC=\"$(libexecdir)\" -DSYNCEVO_BACKEND=\"$(BACKENDS_SEARCH_DIRECTORY)\"
src_syncevo_ldadd = @SYNCEVOLUTION_LDADD@
src_syncevo_ldadd = @SYNCEVOLUTION_LDADD@
# needed in all cases
src_syncevo_ldadd += $(gdbus_build_dir)/libgdbussyncevo.la
@ -198,7 +198,11 @@ src_syncevo_libsyncevolution_la_LIBADD = \
$(TRANSPORT_LIBS) \
@LIBS@ \
$(src_syncevo_ldadd) \
$(DBUS_LIBS) \
$(NSS_LIBS)
if ENABLE_MODULES
src_syncevo_libsyncevolution_la_LIBADD += -ldl
endif
src_syncevo_libsyncevolution_la_CXXFLAGS = \
$(PCRECPP_CFLAGS) \
$(TRANSPORT_CFLAGS) \
@ -210,6 +214,7 @@ src_syncevo_libsyncevolution_la_CFLAGS = \
$(SYNCEVO_WFLAGS)
src_syncevo_libsyncevolution_la_CPPFLAGS = \
$(src_syncevo_cppflags) \
$(DBUS_CFLAGS) \
-DDATA_DIR=\""$(pkgdatadir)"\" \
-DXML_CONFIG_DIR=\""$(datadir)/syncevolution/xml"\" \
-DTEMPLATE_DIR=\""$(datadir)/syncevolution/templates"\" \

View File

@ -11,5 +11,5 @@ Description: SyncEvolution Library
Version: @VERSION@
Cflags: -I${includedir}
Requires: synthesis
Libs: -L${libdir} -lsyncevolution
Libs: -L${libdir} -lsyncevolution -lrt
Libs.private: -L${libdir}/syncevolution -lgdbussyncevo