summaryrefslogtreecommitdiff
path: root/HACKING
blob: b9f57916f6558a52f0a31536fbc8f89998cf34f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
Checking out the Source
-----------------------

SyncEvolution is hosted on moblin.org. Anonymous access is via
  git clone git://git.moblin.org/syncevolution.git

Before using sources checked out from Subversion, invoke "sh
autogen.sh" with appropriate autotools packages installed.

When running the configure script, it can be told to compile a
Synthesis library automatically via the --with-synthesis-src configure
option. This has advantages when modifying the Synthesis source
together with SyncEvolution (no need to install Synthesis and thus
faster compilation) and will bundle the Synthesis sources in source
.tar.gz archives.

The upstream Synthesis source code is here:
  git://www.synthesis.ch/libsynthesis.git
The staging area for patches developed as part of Moblin are
in the following repository:
  git://git.moblin.org/libsynthesis.git

The intention is to include all these patches upstream to
prevent forking the code. If you want to get patches included
in the Synthesis code base, then please work directly with
the upstream branch.

For doing development work the recommended configure line is:
   configure CFLAGS="-g -Wall -Werror -Wno-unknown-pragmas" \
             CXXFLAGS="-g -Wall -Werror -Wno-unknown-pragmas" \
             --enable-unit-tests \
             --enable-libcurl \
             --enable-developer-mode

Enabling libcurl explicitly ensures that it gets built even when not
the default.

Backend libraries are dynamically scannned and loaded into syncevolution, the
library path defaults to $prefix/syncevolution/backends. When developer-mode is
enabled, it will scan libraries in current build directory instead.

-Wno-unknown-pragmas is required to avoid warnings triggered by
'#pragma }', a trick to preserve indention after 'extern "C" {' in
/usr/include/evolution-data-server-1.12/libical/

Working with the Code
---------------------

The code follows the code formatting of the Funambol
C++ client library. Just emulate the existing
code when possible.

Exceptions derived from std::exception are used to report errors. The
EvolutionSyncSource::handleException() function deals with logging the
exception.

SyncEvolution uses the a CPPUnit based testing framework. Configure
with --enable-integration-tests and (optionally) --enable-unit-tests,
then run "src/client-test" as described in src/client-test-app.cpp.

It understands several environment variables, among them:
- CLIENT_TEST_SERVER = chooses config
- CLIENT_TEST_SOURCES = comma separated list of enabled sources, identified
  by their name (ical20, vcard21, vcard30, itodo20, text (= memos))
- CLIENT_TEST_EVOLUTION_PREFIX=[name|file://<path>] overrides
  the evolutionsource setting in the configuration; if file:// is used
  then these database will be created automatically
- CLIENT_TEST_XML=1 use XML format as default instead of the normal WBXML

For unattended testing:
- CLIENT_TEST_FAILURES = comma separated list of tests which are allowed
  to fail without affecting the return code of the test runner
- CLIENT_TEST_SKIP = comma separated list of tests or test groups which
  are not to be executed at all; for this to work the test or test group
  has to be passed through test.h's version of ADD_TEST or FilterTest,
  which is the case for most tests but not all
- CLIENT_TEST_LOG = name of server log file, will be copied and reset
  after each sync
- CLIENT_TEST_ALARM = number of seconds a single test is allowed to run
  before aborting it

Most Client::Sync tests use the default encoding, usually WBXML unless
changed via CLIENT_TEST_XML=1. Client::Sync::*::testItemsXML always
uses XML and Client::Sync::*::testItems always WBXML.

Here are step-by-step instructions to get started with testing,
using ScheduleWorld as example:
- CLIENT_TEST_SERVER=scheduleworld \
  CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/testing/ \
  ./client-test -h
  => creates ~/.config/syncevolution/scheduleworld_[12]/ configs
     which use data bases under /tmp/testing, then
     prints all available tests
- edit ~/.config/syncevolution/scheduleworld_[12]/spds/syncml/config.txt
  and enter account data for ScheduleWorld in both configurations;
  check that the syncURL is correct
- CLIENT_TEST_SERVER=scheduleworld \
  CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/testing/ \
  ./client-test Client::Source
  => runs alls tests involving just local operations
- CLIENT_TEST_SERVER=scheduleworld \
  CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/testing/ \
  ./client-test Client::Sync::vcard30::testCopy
  => runs one test that checks that one contact can
     be copied to and from the server using the two
     configurations
- CLIENT_TEST_SERVER=scheduleworld \
  CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/testing/ \
  ./client-test Client::Sync
  => runs all tests which involve the SyncML server;
     tests involving just one source are run first,
     followed by the same tests with all enabled
     sources in two different orders

"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 Synthesis
library code. Most likely the suppressions are system
dependent and might have to be updated from time to time.


Building a Release
------------------

- increase version number in configure-pre.in/AM_INIT_AUTOMAKE
  For prereleases use "old version"+"new prerelease"-1 as
  package version. That ensures that package versions are
  higher than the old release, but lower than the final
  release. Avoid hyphens as part of the release names, i.e.
  use "0.7+0.8beta1" instead of "0.7+0.8-beta1".
- ensure files were updated:
  ./NEWS debian/changelog
- update po/LINGUAS
- check and if necessary, bump the Synthesis .so versions
  (libsynthesis/src/Makefile.am.in)
- ensure that Synthesis source code is tagged:
  use <base version>+<syncevo version> if local changes exist
- commit and tag SyncEvolution source code
- 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=-Wl,--as-needed --enable-static-cxx)
- compile .deb for Maemo
- update entries on the web about the release:
  http://maemo.org/downloads/product/OS2008/syncevolution/
  http://www.estamos.de/blog/wp-admin
  http://www.estamos.de/projects/SyncEvolution/Roadmap.html
  http://freshmeat.net/projects/syncevolution/


Compiling for Maemo
-------------------
  unpack source archive in Scratchbox (for maximum compatibility: use Chinook 4.0
  rootstrap; for support of all backends: ensure that the EDS-DBus calendar dev packages
  are installed),
  DEB_BUILD_OPTIONS=maemo fakeroot dpkg-buildpackage
  NOTE: dpkg-buildpackage -rfakeroot does *not* work as it leads to strange problems executing a.out
  during the client-src configure.

Maemo EDS-DBus calendar dev packages /etc/apt/source.list:
  deb http://maemo.o-hand.com/packages chinook/


Compiling for iPhone
--------------------
  Requires iPhone toolchain and a libcurl compiled for the iPhone.
  libcurl is ideally configured as small as possible
  and statically (to avoid packaging problems):
      ./configure --prefix=/usr/local/iphone --host=arm-apple-darwin --disable-shared \
                  --disable-crypto-auth --without-gnutls --without-ssl --without-zlib \
                  --without-libssh2 --disable-ipv6 --disable-manual --disable-telnet \
                  --disable-tftp  --disable-ldap  --disable-file --disable-ftp
      manually set HAVE_POSIX_STRERROR_R in lib/config.h

  Potential problems with toolchain:
    std++ not found: ln -s libstdc++.6.dylib /usr/local/iphone-filesystem/usr/lib/libstdc++.dylib
    AddressBook framework must be added to iphone-dev/include/install-headers.sh.in

  Compile with curl-config in the PATH:
    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

  Build a package with:
    make distbin BINSUFFIX="iphone"

Compiling for Mac OS X
----------------------

  Configuring for development:
  <path>/configure --with-funambol-src=<path> \
              --enable-addressbook \
              --disable-ecal --disable-ebook \
              CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \
              LDFLAGS="-framework Addressbook -framework CoreServices" \
              CXXFLAGS=-g \
              CFLAGS=-g



  Compiling final release:
  ./configure --enable-addressbook \
              --disable-ecal --disable-ebook \
              CXXFLAGS="-O -g -arch i386 -arch ppc" \
              CFLAGS="-O -g -arch i386 -arch ppc" \
              LDFLAGS="-arch i386 -arch ppc -framework Addressbook -framework CoreServices" \
              --disable-dependency-tracking
  make BINSUFFIX=mac-os-x distbin

  Fine-grained memory checking:
    MallocStackLogging=1 MallocStackLoggingNoCompact=1 \
    MallocScribble=1 MallocPreScribble=1 MallocGuardEdges=1 \
    MallocCheckHeapStart=1 MallocCheckHeapEach=100


Debugging
---------

The following packages contain debug information for
relevant libraries on Ubuntu 7.10:
  evolution-data-server-dbg libglib2.0-0-dbg evolution-dbg

Normally, syncevolution redirects stderr to its own log file.  In
crash scenarios the final error messages may get lost. To debug such
cases, disable redirection by setting the environment variable
SYNCEVOLUTION_DEBUG (value doesn't matter) and capture the output
normally.