improved handling of Funambol client library source

configure checks out the right source automatically. Subversion
and git are supported. When given an existing directory with sources,
out-of-tree compilation is used instead of making a copy first.


git-svn-id: https://zeitsenke.de/svn/SyncEvolution/trunk@744 15ad00c4-1369-45f4-8270-35d70d36bdcd
This commit is contained in:
Patrick Ohly 2008-09-14 17:52:08 +00:00
parent 57c7976a96
commit 894c61951e
3 changed files with 120 additions and 100 deletions

67
HACKING
View File

@ -1,45 +1,21 @@
Checking out the Source Checking out the Source
----------------------- -----------------------
SyncEvolution is hosted at sf.net. If you want to work SyncEvolution is hosted on estamos.de. Anonymous access is
on the code, just let me know what your SF account is via
and I can provide access to the developers CVS. The svn checkout http://www.estamos.de/svn/SyncEvolution/trunk
anonymous CVS mirrors the sources automatically, but
sometimes is lacking a bit behind. Before using sources
checked out from CVS, invoke "sh autogen.sh" with
appropriate autotools packages installed.
The most recent version of the Sync4j C++ client library Before using sources checked out from Subversion, invoke "sh
is available from CVS, checkout the "3x" module from the CVS at autogen.sh" with appropriate autotools packages installed.
http://forge.objectweb.org/projects/sync4j
You'll need the files in 3x/client-api/native.
Also note that some of the patches in the When running the configure script, it will check out the source of a
3x/client-api/native/.patches directory might be needed for suitable Funambol client library which will be compiled
SyncEvolution to compile and work correctly. See automatically. There are configure options for using a precompiled
3x/client-api/native/README for more information about those patches Funambol client library or non-default sources - see the "funambol"
and SyncEvolution's NEWS file for some information which client configure options for details.
library is compatible.
The recommended way to make that library available is by
installing it into its own directory with shared libraries disabled:
configure --prefix=<dir> --disable-shared; make; make install
and then pointing the configure of SyncEvolution towards it:
configure --with-sync4j=<dir> --disable-shared
Shared versions of the libraries are not recommended at the moment
because the client libraries API is not expected to be stable.
Alternatively SyncEvolution can work with a source snapshot of
the client library directly:
configure --with-sync4j-src=<dir>
where <dir> points towards the contents of the 3x/client-api/native
directory. This mode is required to generate source distributions
because those are meant to contain a copy of the client library
code.
For doing development work the recommended configure line is: For doing development work the recommended configure line is:
configure --with-sync4j-src=<dir> \ configure SYNCEVOLUTION_CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \
SYNCEVOLUTION_CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \
--enable-unit-tests --enable-unit-tests
In contrast to CXXFLAGS, SYNCEVOLUTION_CXXFLAGS adds these flags only In contrast to CXXFLAGS, SYNCEVOLUTION_CXXFLAGS adds these flags only
@ -53,11 +29,11 @@ Working with the Code
--------------------- ---------------------
The code follows the code formatting of the Funambol The code follows the code formatting of the Funambol
Sync4j C++ client library. Just emulate the existing C++ client library. Just emulate the existing
code when possible. code when possible.
Exceptions derived from std::exception are used to report Exceptions derived from std::exception are used to report
errors, but not in code which is called from inside the Sync4j errors, but not in code which is called from inside the client
library because that library does not handle exceptions for compatibility library because that library does not handle exceptions for compatibility
reasons. In that case special case must be taken to not reasons. In that case special case must be taken to not
forget that an error occurred (EvolutionSyncSource::m_hasFailed). forget that an error occurred (EvolutionSyncSource::m_hasFailed).
@ -121,7 +97,7 @@ using ScheduleWorld as example:
"make valgrind" runs the same tests inside valgrind "make valgrind" runs the same tests inside valgrind
[http://www.valgrind.org]. A suppression file is [http://www.valgrind.org]. A suppression file is
used to hide errors inside system libraries which used to hide errors inside system libraries which
are not caused by SyncEvolution or Sync4j C++ are not caused by SyncEvolution or Funambol C++
library code. Most likely the suppressions will only library code. Most likely the suppressions will only
work on Debian GNU/Linux 3.1 ("Sarge") - feel free work on Debian GNU/Linux 3.1 ("Sarge") - feel free
to add more for your system. to add more for your system.
@ -147,17 +123,10 @@ Building a Release
- compile binary .tar.gz packages for different Evolution versions; - compile binary .tar.gz packages for different Evolution versions;
done automatically by runtests.py on estamos.de (= Debian 3.0), using different Garnome done automatically by runtests.py on estamos.de (= Debian 3.0), using different Garnome
installations, and with special configure options to ensure maximum installations, and with special configure options to ensure maximum
portability (LDFLAGS=-W,--as-needed --enable-static-cxx) portability (LDFLAGS=-Wl,--as-needed --enable-static-cxx)
- compile .deb for Maemo - compile .deb for Maemo
- add new .debs/.zip to www.estamos.de/download:
- distribution "stable"
- for ITOS2008 also "chinook"
- upload new files to sf.net
- remove files from www.estamos.de so that downloads access sf.net
- update entries on the web about the release: - update entries on the web about the release:
http://maemo.org/downloads/product/OS2006/syncevolution/ http://maemo.org/downloads/product/OS2008/syncevolution/
http://maemo.org/downloads/product/OS2007/syncevolution/
http://www.modmyiphone.com/ (?)
http://www.estamos.de/blog/wp-admin http://www.estamos.de/blog/wp-admin
http://www.estamos.de/projects/SyncEvolution/Roadmap.html http://www.estamos.de/projects/SyncEvolution/Roadmap.html
http://freshmeat.net/projects/syncevolution/ http://freshmeat.net/projects/syncevolution/
@ -192,7 +161,7 @@ Compiling for iPhone
AddressBook framework must be added to iphone-dev/include/install-headers.sh.in AddressBook framework must be added to iphone-dev/include/install-headers.sh.in
Compile with curl-config in the PATH: Compile with curl-config in the PATH:
PATH=/usr/local/iphone/bin/:$PATH ~/projects/sync4jevolution/configure --host=arm-apple-darwin --with-sync4j-src=/home/patrick/projects/native CXXFLAGS=-O0 --disable-ecal --disable-ebook --enable-addressbook --prefix=/usr PATH=/usr/local/iphone/bin/:$PATH ~/projects/SyncEvolution/trunk/configure --host=arm-apple-darwin --with-funambol-src=/home/patrick/projects/native CXXFLAGS=-O0 --disable-ecal --disable-ebook --enable-addressbook --prefix=/usr
PATH=/usr/local/iphone/bin/:$PATH make all PATH=/usr/local/iphone/bin/:$PATH make all
Build a package with: Build a package with:
@ -202,7 +171,7 @@ Compiling for Mac OS X
---------------------- ----------------------
Configuring for development: Configuring for development:
<path>/configure --with-sync4j-src=<path> \ <path>/configure --with-funambol-src=<path> \
--enable-addressbook \ --enable-addressbook \
SYNCEVOLUTION_CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \ SYNCEVOLUTION_CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \
LDFLAGS="-framework Addressbook -framework CoreServices" \ LDFLAGS="-framework Addressbook -framework CoreServices" \

View File

@ -1,15 +1,17 @@
dnl Invoke autogen.sh to produce a configure script. dnl Invoke autogen.sh to produce a configure script.
AC_INIT(src/syncevolution.cpp) AC_INIT(src/syncevolution.cpp)
AM_INIT_AUTOMAKE(syncevolution, 0.8) AM_INIT_AUTOMAKE(syncevolution, 0.8-trunk)
define([FUNAMBOLSRC_REPO], [https://core.forge.funambol.org/svn/core/tags/r_tested/3x/client-api/native])
define([FUNAMBOLSRC_REVISION], [28731])
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
AC_LIBTOOL_DLOPEN AC_LIBTOOL_DLOPEN
dnl default device type (see AC_DEFINE below) dnl default device type (see AC_DEFINE below)
DEVICE_TYPE=desktop DEVICE_TYPE=desktop
# command used to configure client library, including options # options to be used when configuring client library
CLIENT_CONFIGURE=$PWD/src/client-api/build/autotools/configure CLIENT_CONFIGURE_OPTIONS=
AC_ARG_WITH(funambol, AC_ARG_WITH(funambol,
AS_HELP_STRING([--with-funambol=<base directory>], AS_HELP_STRING([--with-funambol=<base directory>],
@ -21,16 +23,43 @@ AC_ARG_WITH(sync4j,
[alias for --with-funambol]), [alias for --with-funambol]),
[FUNAMBOL="$withval"]) [FUNAMBOL="$withval"])
if test -e "$srcdir/src/client-api"; then
FUNAMBOLSRC_DEF="$srcdir/src/client-api"
else
FUNAMBOLSRC_DEF="FUNAMBOLSRC_REPO"
fi
AC_ARG_WITH(funambol-src, AC_ARG_WITH(funambol-src,
AS_HELP_STRING([--with-funambol-src=<base directory>], AS_HELP_STRING([--with-funambol-src=<base directory|svn URL|git URL>],
[specifies location of the Funambol '3x/client-api/native' source code]), [Specifies location of the Funambol 'client-api/native' source code.
[FUNAMBOLSRC="$withval"]) Use this instead of --with-funambol when the client library is to
be compiled as part of the SyncEvolution compilation. In release
versions of SyncEvolution, a copy of the client library is bundled
under 'src/client-api' and compiled unless something else is
specified. --with-funambol-src can be given a path to sources
checked out already, a Subversion repository URL or a git repository
URL. When given a repository URL, then the configure script
will checkout the sources into 'src/client-api-copy' or
update that working copy if the directory already exists.
Default: bundled source in src/client-api (in released SyncEvolution sources),
FUNAMBOLSRC_REPO otherwise.]),
[FUNAMBOLSRC="$withval"], [FUNAMBOLSRC="$FUNAMBOLSRC_DEF"])
AC_ARG_WITH(sync4j-src, AC_ARG_WITH(sync4j-src,
AS_HELP_STRING([--with-sync4j-src=<base directory>], AS_HELP_STRING([--with-sync4j-src=<base directory>],
[alias for --with-funambol-src]), [alias for --with-funambol-src]),
[FUNAMBOLSRC="$withval"]) [FUNAMBOLSRC="$withval"])
AC_ARG_WITH(funambol-username,
AS_HELP_STRING([--with-funambol-username=<svn username>],
[username to use when checking out --with-funambol-src sources from Subversion, default 'guest']),
[USERNAME="$withval"], [USERNAME="guest"])
AC_ARG_WITH(funambol-revision,
AS_HELP_STRING([--with-funambol-revision=<git tag/branch/hash or Subversion revision>],
[Identifies which source revision to use from --with-funambol-src repository, empty string stands for latest. Default: FUNAMBOLSRC_REVISION]),
[REVISION="$withval"], [REVISION="FUNAMBOLSRC_REVISION"])
AC_ARG_ENABLE(shared, AC_ARG_ENABLE(shared,
AS_HELP_STRING([--enable-shared], AS_HELP_STRING([--enable-shared],
[build backends as dynamically loadable modules]), [build backends as dynamically loadable modules]),
@ -80,11 +109,11 @@ AC_SUBST(CPPUNIT_LDFLAGS)
AC_SUBST(CPPUNIT_TESTS) AC_SUBST(CPPUNIT_TESTS)
if test $enable_unit_tests == "yes"; then if test $enable_unit_tests == "yes"; then
CLIENT_CONFIGURE="$CLIENT_CONFIGURE --enable-unit-tests" CLIENT_CONFIGURE_OPTIONS="$CLIENT_CONFIGURE_OPTIONS --enable-unit-tests"
AC_DEFINE(ENABLE_UNIT_TESTS, 1, [enable unit tests inside the library's source code]) AC_DEFINE(ENABLE_UNIT_TESTS, 1, [enable unit tests inside the library's source code])
fi fi
if test $enable_integration_tests == "yes"; then if test $enable_integration_tests == "yes"; then
CLIENT_CONFIGURE="$CLIENT_CONFIGURE --enable-integration-tests" CLIENT_CONFIGURE_OPTIONS="$CLIENT_CONFIGURE_OPTIONS --enable-integration-tests"
AC_DEFINE(ENABLE_INTEGRATION_TESTS, 1, [enable unit tests outside of the library's source code]) AC_DEFINE(ENABLE_INTEGRATION_TESTS, 1, [enable unit tests outside of the library's source code])
fi fi
@ -94,9 +123,10 @@ if test $enable_static_cxx == "yes"; then
fi fi
AC_SUBST(CORE_LDADD_DEP) AC_SUBST(CORE_LDADD_DEP)
# preserve src/client-api by default # preserve src/client-api by default,
# always
CLEAN_CLIENT_SRC= CLEAN_CLIENT_SRC=
FUNAMBOL_LIB=$PWD/src/client-api.build/src/libfunambol.la FUNAMBOL_LIB=$PWD/src/build-client-api/src/libfunambol.la
AC_SUBST(CLEAN_CLIENT_SRC) AC_SUBST(CLEAN_CLIENT_SRC)
@ -133,48 +163,68 @@ if test "x$use_mac_ta" = "xyes"; then
AC_SUBST(CURL_LDFLAGS) AC_SUBST(CURL_LDFLAGS)
fi fi
# absolute patch to source of Funambol client library
CLIENT_API_SRC=no-client-api-source
AC_SUBST(CLIENT_API_SRC)
if test ! "$FUNAMBOL"; then if test ! "$FUNAMBOL"; then
if test "$FUNAMBOLSRC"; then if test "$FUNAMBOLSRC"; then
# make a copy of the sources, remove it during maintainer-clean and distclean # default: checkout a copy of the sources, remove it during maintainer-clean and distclean
CLEAN_CLIENT_SRC=client-api CLEAN_CLIENT_SRC=client-api-copy
CLIENT_API_SRC=$PWD/src/client-api-copy
AC_MSG_NOTICE( [updating the content of src/client-api from $FUNAMBOLSRC] ) AC_MSG_NOTICE( [updating the content of $CLIENT_API_SRC from $FUNAMBOLSRC] )
mkdir -p src/client-api case "$FUNAMBOLSRC" in
if cp --help 2>/dev/null | grep >/dev/null -e "--update"; then *://*) protocol="`echo $FUNAMBOLSRC | sed -e 's;://.*;;'`";;
# GNU cp *) protocol="file";;
cp_opts="--update --archive" esac
else
cp_opts="-r"
fi
if cp $cp_opts $FUNAMBOLSRC/* src/client-api; then mkdir -p src
( cd src/client-api/build/autotools && ( test -f configure || sh autogen.sh ) ) case $protocol in
else file)
AC_MSG_ERROR( [copying $FUNAMBOLSRC into src/client-api failed] ) # use existing copy of the sources
fi CLEAN_CLIENT_SRC=
find src/client-api/build/autotools/win* -name output | xargs rm -rf case "$FUNAMBOLSRC" in
find src/client-api/build/autotools/include/* src/client-api/build/autotools/src/* -type d | xargs rm -rf /*) CLIENT_API_SRC="$FUNAMBOLSRC";;
find src/client-api -name "*~*" -o -name ".#*" -o -name "*.orig" -o -name "stamp-*" -o -name "*.o" -o -name "*.lo" -o -name .libs -o -name autom4te.cache -o -name config.status | xargs rm -rf *) CLIENT_API_SRC="$PWD/$FUNAMBOLSRC";;
else
if test ! -d src/client-api; then
if test -d $srcdir/src/client-api; then
mkdir -p src
case $srcdir in
/*) ln -s $srcdir/src/client-api src/client-api;;
*) ln -s $PWD/$srcdir/src/client-api src/client-api;;
esac esac
fi ;;
fi *svn*|*http*)
if test -d $CLIENT_API_SRC ; then
( set -x; cd $CLIENT_API_SRC && svn --username=$USERNAME switch -r "${REVISION:-HEAD}" "$FUNAMBOLSRC" ) || AC_ERROR([updating from $FUNAMBOLSRC failed])
else
(set -x; svn --username=$USERNAME checkout -r "${REVISION:-HEAD}" "$FUNAMBOLSRC" $CLIENT_API_SRC ) || AC_ERROR([checking out $FUNAMBOLSRC failed])
fi
;;
*git*)
if test -d $CLIENT_API_SRC ; then
( set -x; cd $CLIENT_API_SRC && git pull ) || AC_ERROR([updating from $FUNAMBOLSRC failed])
else
( set -x; git clone "$FUNAMBOLSRC" $CLIENT_API_SRC ) || AC_ERROR([checking out $FUNAMBOLSRC failed])
fi
if test "$REVISION"; then
( set -x; cd $CLIENT_API_SRC && git checkout "$REVISION" )
fi
;;
esac
else
# use existing copy of the sources; beware of
# out-of-tree compilation
case $srcdir in
/*) CLIENT_API_SRC="$srcdir/src/client-api";;
*) CLIENT_API_SRC="$PWD/$srcdir/src/client-api";;
esac
fi fi
if test -f src/client-api/build/autotools/configure; then ( cd $CLIENT_API_SRC/build/autotools && ( test -f configure || sh autogen.sh ) )
chmod u+x src/client-api/build/autotools/configure src/client-api/build/autotools/config.sub src/client-api/build/autotools/config.guess
if test -f $CLIENT_API_SRC/build/autotools/configure; then
CLIENT_CONFIGURE="$CLIENT_API_SRC/build/autotools/configure"
chmod u+x $CLIENT_API_SRC/build/autotools/configure $CLIENT_API_SRC/build/autotools/config.sub $CLIENT_API_SRC/build/autotools/config.guess
# use local copy of the sources, with dependencies # use local copy of the sources, with dependencies
# to trigger building the client library # to trigger building the client library
FUNAMBOL_SUBDIR=$PWD/src/client-api.build FUNAMBOL_SUBDIR=$PWD/src/build-client-api
FUNAMBOL_DEP=$PWD/src/client-api.build/src/libfunambol.la FUNAMBOL_DEP=$PWD/src/build-client-api/src/libfunambol.la
FUNAMBOL_CFLAGS="-I$FUNAMBOL_SUBDIR/include/posix -I$FUNAMBOL_SUBDIR/include/common -I$FUNAMBOL_SUBDIR/include -I$FUNAMBOL_SUBDIR/test" FUNAMBOL_CFLAGS="-I$FUNAMBOL_SUBDIR/include/posix -I$FUNAMBOL_SUBDIR/include/common -I$FUNAMBOL_SUBDIR/include -I$FUNAMBOL_SUBDIR/test"
FUNAMBOL_LIBS="-L$FUNAMBOL_SUBDIR/src -lfunambol" FUNAMBOL_LIBS="-L$FUNAMBOL_SUBDIR/src -lfunambol"
@ -194,7 +244,7 @@ if test ! "$FUNAMBOL"; then
# to check with autoconf for the right flags... # to check with autoconf for the right flags...
FUNAMBOL_LIB_SHARED_FLAGS="-DPIC -fPIC" FUNAMBOL_LIB_SHARED_FLAGS="-DPIC -fPIC"
fi fi
if (set -x; mkdir -p $FUNAMBOL_SUBDIR && cd $FUNAMBOL_SUBDIR && $CLIENT_CONFIGURE --build=$build_alias --host=$host_alias --target=$target_alias --disable-shared --with-transport-agent=curl CFLAGS="$CFLAGS $FUNAMBOL_LIB_SHARED_FLAGS" CXXFLAGS="$CXXFLAGS $FUNAMBOL_LIB_SHARED_FLAGS" $cxx_lib_args); then true; else if (set -x; mkdir -p $FUNAMBOL_SUBDIR && cd $FUNAMBOL_SUBDIR && $CLIENT_CONFIGURE $CLIENT_CONFIGURE_OPTIONS --build=$build_alias --host=$host_alias --target=$target_alias --disable-shared --with-transport-agent=curl CFLAGS="$CFLAGS $FUNAMBOL_LIB_SHARED_FLAGS" CXXFLAGS="$CXXFLAGS $FUNAMBOL_LIB_SHARED_FLAGS" $cxx_lib_args); then true; else
AC_MSG_ERROR( [configuring client library failed] ) AC_MSG_ERROR( [configuring client library failed] )
fi fi
else else

View File

@ -7,6 +7,12 @@ AM_CPPFLAGS = $(SUBDIRS:%=-I$(srcdir)/%) @BACKEND_CPPFLAGS@ @FUNAMBOL_CFLAGS@
# the Funambol C++ client library # the Funambol C++ client library
SYNCEVOLUTION_CXXFLAGS = @SYNCEVOLUTION_CXXFLAGS@ SYNCEVOLUTION_CXXFLAGS = @SYNCEVOLUTION_CXXFLAGS@
# set to directory name if the client API sources need to be removed
CLEAN_CLIENT_SRC=@CLEAN_CLIENT_SRC@
# set to absolute path of client API sources which need to be compiled
CLIENT_API_SRC=@CLIENT_API_SRC@
bin_PROGRAMS = syncevolution bin_PROGRAMS = syncevolution
bin_SCRIPTS = synccompare bin_SCRIPTS = synccompare
SYNCSOURCES = @SYNCSOURCES@ SYNCSOURCES = @SYNCSOURCES@
@ -90,8 +96,8 @@ BUILT_SOURCES = $(FUNAMBOL_SUBDIR)/all $(CLIENT_LIB_TEST_FILES)
# include client library in distribution # include client library in distribution
dist-hook: dist-hook:
[ ! "$(FUNAMBOL_SUBDIR)" ] || cp -r client-api $(distdir) [ ! "$(FUNAMBOL_SUBDIR)" ] || mkdir -p $(distdir)/client-api && cp -r $(CLIENT_API_SRC)/* $(distdir)/client-api
find $(distdir) -name .libs -o -name "*~" -o -name ".*" -o -name "*.o" -o -name "*.lo" -o -name CVS -o -name autom4te.cache | xargs rm -rf find $(distdir) -name .libs -o -name "*~" -o -name ".*" -o -name "*.o" -o -name "*.lo" -o -name CVS -o -name .svn -o -name .git -o -name autom4te.cache | xargs rm -rf
clean-local: testclean clean-local: testclean
rm -rf testcases rm -rf testcases
@ -103,7 +109,7 @@ testclean:
distclean-local: distclean-local:
rm -rf $(FUNAMBOL_SUBDIR) rm -rf $(FUNAMBOL_SUBDIR)
rm -rf @CLEAN_CLIENT_SRC@ # "client-api", only set when it was created by configure rm -rf $(CLEAN_CLIENT_SRC)
# With --disable-shared autotools links against libfunambol.a which does not # With --disable-shared autotools links against libfunambol.a which does not
# pull any of the test suites into the test binary, so they would not be # pull any of the test suites into the test binary, so they would not be
@ -162,11 +168,6 @@ $(FUNAMBOL_SUBDIR)/%.h :
$(FUNAMBOL_SUBDIR)/% : $(FUNAMBOL_SUBDIR)/% :
[ ! "$(FUNAMBOL_SUBDIR)" ] || ( cd ${@D} && $(MAKE) ${@F} ) [ ! "$(FUNAMBOL_SUBDIR)" ] || ( cd ${@D} && $(MAKE) ${@F} )
# compare the local copy of the C++ client library against
# the files where it was copied from
client-api-diff :
diff -r -c -x CVS -x config.guess -x config.sub -x depcomp -x install-sh -x ltmain.sh -x missing -x aclocal.m4 -x configure -x '.#*' -x '*~' -x '*.in' -x autom4te.cache $(FUNAMBOLSRC) client-api
# special target for testing with valgrind # special target for testing with valgrind
valgrind : test valgrind : test
valgrind --leak-check=yes --suppressions=valgrind.supp ./test valgrind --leak-check=yes --suppressions=valgrind.supp ./test