Checking out the Source ----------------------- SyncEvolution is hosted at sf.net. If you want to work on the code, just let me know what your SF account is and I can provide access to the developers CVS. The 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 is available from CVS, checkout the "3x" module from the CVS at 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 3x/client-api/native/.patches directory might be needed for SyncEvolution to compile and work correctly. See 3x/client-api/native/README for more information about those patches and SyncEvolution's NEWS file for some information which client 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= --disable-shared; make; make install and then pointing the configure of SyncEvolution towards it: configure --with-sync4j= --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= where 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. Working with the Code --------------------- The code follows the code formatting of the Funambol Sync4j C++ client library. Just emulate the existing code when possible. Exceptions derived from std::exception are used to report errors, but not in code which is called from inside the Sync4j library because that library does not handle exceptions for compatibility reasons. In that case special case must be taken to not forget that an error occurred (EvolutionSyncSource::m_hasFailed). This is done in in EvolutionSyncSource wrapper functions which call the real functions which then may throw exceptions. The EvolutionSyncSource::handleException() function deals with logging the exception. "make check" in the src directory compiles and runs unit tests. Those tests were written inside the CppUnit [http://cppunit.sourceforge.net/cppunit-wiki] framework and so they (and just they) require that "cppunit-config" is in the shell search path. Before running them, setup your Evolution and ~/.sync4j configuration as described in the README section 'Exchanging Data' (create address books 'SyncEvolution test #1/2', etc). Running the test with the environment variable TEST_EVOLUTION_LOG set to the server's log file ensures that for each individual sync session both the client and the corresponding server log are stored in individual files in the src directory. The filenames are derived from the tests and the steps executed for each of them. The basic configuration is chosen via TEST_EVOLUTION_SERVER; the default is "localhost". If the server needs a certain delay between syncs, that can be set via TEST_EVOLUTION_DELAY=. The Sync4j 2.3 server needs a delay of around 20 seconds to work correctly. When invoking TestEvolution without parameters all tests will be run. Otherwise each test listed on the command line will be run: ./TestEvolution ContactSync::testItems \ ContactSync::testCopy For a list of available tests see the TestEvolution.cpp source code. "make valgrind" runs the same tests inside valgrind [http://www.valgrind.org]. A suppression file is used to hide errors inside system libraries which are not caused by SyncEvolution or Sync4j C++ library code. Most likely the suppressions will only work on Debian GNU/Linux 3.1 ("Sarge") - feel free to add more for your system. CVS --- Please add your changes to the ChangeLog file. The Emacs vc-update-change-log = C-x v a command collects the latest CVS commit messages and adds them automatically. Building a Release ------------------ - increase version number in configure.in/AM_INIT_AUTOMAKE - ensure ChangeLog and NEW are up-to-date - make distcheck - compile binary .tar.gz packages for different Evolution versions; done automatically by runtests.py on estamos.de (= Debian 3.0), using different Garnome installations, and with special configure options to ensure maximum portability (LDFLAGS=-W,--as-needed --enable-static-cxx) - compile .deb for Maemo: build patched libdbus (apt-get source dbus; apply dbus-timeout.patch; fakeroot dpkg-buildpackage); unpack source archive in Scratchbox (for maximum compatibility: use Mistral 2.0 rootstrap; for support of all backends: ensure that the EDS-DBus calendar dev packages are installed), DEB_BUILD_OPTIONS=maemo= fakeroot dpkg-buildpackage Maemo EDS-DBus calendar dev packages /etc/apt/source.list: deb http://maemo.o-hand.com/packages mistral/ deb-src http://maemo.o-hand.com/packages mistral/ Installation _without_ updating more than strictly necessary (just to be sure that address book syncing uses the default libraries): apt-get update apt-cache showpkg libecal-dev libedata-cal-dev ver=1.4.1-0zoh4; for i in libecal-dev libecal libedata-cal libedata-cal-dev; do wget http://maemo.o-hand.com/packages/mistral/${i}_${ver}_armel.deb; done dpkg --force-depends -i *.deb