summaryrefslogtreecommitdiff
path: root/HACKING
blob: ff6da1c1d645f92b909cf1de4199c83aeafac4c8 (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
229
230
231
232
233
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=<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:
   configure --with-sync4j-src=<dir> \
             SYNCEVOLUTION_CXXFLAGS="-Wall -Werror -Wno-unknown-pragmas" \
             --enable-unit-tests

In contrast to CXXFLAGS, SYNCEVOLUTION_CXXFLAGS adds these flags only
to the compilation of source files from the SyncEvolution source code
repository, but not the client library. -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
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.

SyncEvolution uses the Funambol C++ testing framework (which is
based on the previous SyncEvolution testing). Configure with
--enable-integration-tests and (optionally) --enable-unit-tests,
then run "src/client-test" as described in the C++ client libraries
test/README.txt.

It understands the same environment variables as the C++ client
libraries "client-test", among them:
- CLIENT_TEST_SERVER = chooses config
- CLIENT_TEST_LOG = name of server log file, will be copied and reset
  after each sync
- CLIENT_TEST_FAILURES = comma separated list of tests which are allowed
  to fail without affecting the return code of the test runner
- CLIENT_TEST_ALARM = number of seconds a single test is allowed to run
  before aborting it
- CLIENT_TEST_SOURCES = comma separated list of enabled sources, identified
  by their name (ical20, vcard21, vcard30, itodo20, text (= memos))

In addition it supports:
- 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

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 ~/.sync4j/evolution/scheduleworld_[12]/ configs
     which use data bases under /tmp/testing, then
     prints all available tests
- edit ~/.sync4j/evolution/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 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.


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

- increase version number in configure.in/AM_INIT_AUTOMAKE
- ensure files were updated:
  ./ChangeLog ./NEWS debian/changelog

  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.

  To update the ChangeLog file use "./svn2cl.sh". It invokes
  svn2cl with the right options.

- 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
- 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:
  http://maemo.org/downloads/product/OS2006/syncevolution/
  http://maemo.org/downloads/product/OS2007/syncevolution/
  http://www.modmyiphone.com/ (?)
  http://www.estamos.de/blog/wp-admin
  http://www.estamos.de/projects/SyncEvolution/Roadmap.html
  http://freshmeat.net/projects/syncevolution/


Compiling 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=<path of directory with patched libdbus-1.a> 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 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


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/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 make all

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

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

  <path>/configure --with-sync4j-src= --enable-addressbook
  make CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386" \
       LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386"

  ./configure --enable-addressbook \
              CXXFLAGS="-O -g -arch i386 -arch ppc" \
              CFLAGS="-O -g -arch i386 -arch ppc" \
              LDFLAGS="-arch i386 -arch ppc" --disable-dependency-tracking

  TODO: --disable-dependency-tracking an client-api weiterreichen
  
  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