1Contact
2=======
3
4The project homepage is at https://sourceware.org/libabigail
5
6The current libabigail source code can be checked out with:
7git clone git://sourceware.org/git/libabigail
8
9The mailing list to send messages and patches to is
10libabigail@sourceware.org.
11
12The archives of that list are available at http://sourceware.org/ml/libabigail.
13
14File bugs
15=========
16
17Bugs are to be filled in bugzilla at
18https://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail
19
20Writing and sending patches
21============================
22
23Please supply patches using git format-patch and git send-email.  If
24you don't know how to use git, send-email, fine.  Just use your
25favorite email client, attach the patch to a nice message, and send us
26the message.
27
28Patches have to be sent by email to libabigail@sourceware.org.
29
30Please read the file COMMIT-LOG-GUIDELINES in the source tree to learn
31about how to write the commit log accompanying the patch.
32
33If you are adding a new public header file to the project, or if you
34are defining a new entry point to the API of libabigail, please take
35some time to read the file VISIBILITY about how you need to handle the
36visibility of symbols that are part of the API and ABI of libabigail.
37
38Make sure you sign your patch.  To learn about signing, please read
39the "Sign your work" chapter below.
40
41One important thing to do before sending your patch is to launch the
42regression tests.
43
44Regression tests
45================
46
47Regression tests are under the directory 'tests'.  They are usually
48written in C++ and are especially designed to be easy to debug.  The
49idea is that if the test fails, the programmer should just have to
50launch them under GDB and debug them right away.  No-bullshit style.
51
52Regression tests are launched by doing:
53
54   make check
55
56If you have N processor cores on your machine, you can launch the
57tests in parallel to make whole thing go faster by doing:
58
59  make -jN -lN check
60
61If you want to test the fabrication of the distribution tarball (this
62is important, because that is how we do to actually release the
63tarball of the project that you can download from the internet) then
64you can do:
65
66  make distcheck
67
68This actually builds the tarball, then untars it, configure/compile
69the untarred source code and launches the regression checks from
70there.
71
72You can also launch this in parallel by doing:
73
74  make -jN -lN distcheck
75
76with N being the number of processor core you have on your system.
77
78Please make sure you always launch "make distcheck" before sending a
79patch, so that you are sure that we can always build a tarball after
80your patch is applied to the source tree.
81
82A variant of distcheck is "make distcheck-fast".  It's like "make
83distcheck" but it's faster.  You can just use that one.
84
85A complementary regression checking target is "check-self-compare".
86You invoke it by doing "make check-self-compare".  That target
87analyzes the ABI of the libabigail.so shared object, serializes it
88into the ABIXML format and then compares the ABI internal
89representation gathered from the libabigail.so binary against the one
90gathered from the ABIXML format.  The two should be equal if
91everything goes right.  This is an important regression test.  The
92problem is that it can takes twice as much time as make distcheck.  So
93we've put it into its own separate target.
94
95So, to be complete the regression checking command to run against your
96patch should be: "make check-self-compare distcheck -j16", if you have
97a machine with a 16 threads processors, for instance.
98
99Coding language and style
100==========================
101
102The coding style is self evident when reading the source code.  So
103please, stick to and mimic what is already in there for the sake of
104consistency at very least.  Just for history, it's derived from the
105style of the C++ standard library from the GNU project.
106
107As of libabigail 2.0, the language we use is C++ 11.  The level
108supported is the one supported by the GCC 4.8.x series of compilers.
109This should be old and well tested enough to be supported by your
110current favorite compiler.
111
112Initially, the code base of the project was written in C++03, with the
113TR1 extensions.  That heritage is well visible in the code base as it
114is today.
115
116Please do not rush and send gazillions of patches that just re-write
117tons of code into your favorite C++ 11 flavour du jour.  We will
118likely reject those patches.  We want to keep the history of the code
119base in such a way that tools like "git blame <sourcefile> are still
120useful.
121
122So we'll accept patches changing parts of the code base to more recent
123C++ 11 constructs only if you happen to add functionality or fix
124things in that area.  If it makes "cultural common" sense to adopt
125those constructs.  What I mean by "cultural" is that must make sense
126in relative to the culture of the project.  And yes, that is
127subjective.  Sorry.
128
129As a generic rule, we tend to favor the lowest possible level of
130abstraction that makes sense without requiring future maintainers of
131the project to have a PhD in design patterns.  We are not impressed by
132design patterns.  We use them where they make clear sense, but we
133don't idolize them.  Put it another way, we will always favor the one
134who *READS* and debug the code over the one who writes it.  To put
135things in a hypothetical perspective, we'll rather accept a repetitive
136code that stays simple to read and debug over a highly abstract one
137using meta programming to save a few lines of repetitive code located
138in a very small number of places.
139
140Really, in this project, we care about low level binary analysis
141stuff.  Issues in that area can be hard to reproduce and quite
142challenging to debug.  So having tons of abstraction layers in the
143code base have proven to be a maintenance burden over the years, from
144our experience in working on similar projects.  So please help us
145avoid those mistakes that we make just for the pleasure of writing
146what can look as "pleasant code" at a first naive sight.
147
148That being said, we also love cleanly designed APIs that are fairly
149re-usable and well documented.  And we also praise abstraction and
150modularisation that we recognize as being the most basic tools of any
151engineer.  So we like to think about ourselves as well rounded people
152who care about maintaining things for a long time to come :-)
153
154Launching regression tests in Valgrind
155--------------------------------------
156
157To detect memory management errors, the tests of the regression test
158suite can be run using Valgrind tools, essentially memcheck and
159helgrind.
160
161To do so, please do:
162
163  make check-valgrind
164
165This runs the tests under the control of Valgrind memcheck and
166helgrind tools.
167
168But then, if you want Valgrind to check the libabigail command line
169tools that are *forked* by some of the tests then type:
170
171  make check-valgrind-recursive
172
173This one takes a long time.  On my system for instance, it takes an
174hour.  But then it checks *everything*.  If you don't have that time,
175then "make check-valgrind" is enough, as the regression tests that use
176the libabigail *library* directly (as opposed to forking libabigail
177command line tools) will be verified.
178
179How tests are organized
180-----------------------
181
182There are two kinds of regression tests.  Those that use the
183libabigail *library* directly, and those that spawn one of the
184libabigail command line tools.
185
186Generally, both are usually made of a loop that churns through a set of input
187binaries to compare.  Once the comparison is done, the resulting
188report is compared against a reference report that is provided.
189
190Test executable have names that starts with 'runtest*'.  For instance,
191under <build-directory>/tests/ you can find tests named
192runtestdiffdwarf, runtestabidiff, etc...
193
194If a test executable is named
195<build-directory>/tests/runtestdiffdwarf, then its source code is
196tests/test-diff-dwarf.cc.  Similarly, the source code of the test
197<build-directory>/tests/runtestabidiff is tests/test-abidiff.cc.
198
199The data provided for each test (for instance the input binaries to
200compare and the reference report that should result from the
201comparison) is to be found under tests/data.  So data for the test
202runtestdiffdwarf is to be found under tests/data/test-diff-dwarf.
203Data for the test runtestabidiff is to be found under
204tests/data/test-abidiff.cc.
205
206So adding your own tests usually just amounts to adding the input
207right input into the right sub-directory of tests/data/.  To do so,
208look at several tests/test-*.cc to see which one you'd like to add
209some input binaries to be compared in.
210
211Then once you know which tests/test-*.cc you'd like to extend, and if
212you added your input binaries and reference reports (maybe other
213things too) to the right sub-director of tests/data/, you just need to
214extend the array of input binaries/reference reports that the test
215walks to perform the comparisons.  It's generally a global variable
216before the main() function of the test.  In test-diff-dwarf.cc, for
217instance, the variable name is "in_out_specs".  You just have to add a
218new entry to that array; that new entry contains the paths to your new
219input binaries and reference reports.  Just read the code in there and
220use your brains.  It should be straight forward.
221
222Ah, also, if you added new files for the tests, then the build system
223needs to be told that those files have to be added to the distribution
224tarball when we do "make dist" (or make distcheck).  To do so, please
225make sure to add your new test input files to the
226tests/data/Makefile.am file, in the EXTRA_DIST variable.  Look at how
227things are organized in that file, and please do things similarly.
228
229Sign your work
230==============
231
232To facilitate tracking of who did what, we've adopted a "sign-off"
233procedure for patches based on the procedure used by the Linux kernel
234project.
235
236The sign-off is a simple line at the end of the explanation for the
237patch, which certifies that you wrote it or otherwise have the right
238to pass it on as a patch under an appropriate license. The rules are
239pretty simple: if you can certify the below:
240
241        Developer's Certificate of Origin
242
243        By making a contribution to this project, I certify that:
244
245	(a) The contribution was created in whole or in part by me,
246	    and I have the right to submit the contribution under the
247	    license indicated in, or otherwise designated as being
248	    applicable to, the file.
249
250        (b) The contribution was provided directly to me by some other
251            person who certified (a), and I have not modified it.
252
253        (c) I understand and agree that the project and the
254            contribution are public and that a record of the
255            contribution (including all personal information I submit
256            with it, including my sign-off) is maintained indefinitely
257            and may be redistributed.
258
259then you just add a line saying
260
261Signed-off-by: Random J Developer <random@developer.example.org>
262
263using your real name (sorry, no pseudonyms or anonymous contributions.)
264
265git commit --signoff will add such a Signed-off-by line at the end of
266the commit log message for you.
267
268Modifying the website
269=====================
270
271The source code of the website of libabigail is stored in CVS (sigh,
272yeah, that is so old school).  You can check out that web source code
273by doing:
274
275    CVS_RSH=ssh cvs -z9 -d :ext:user@sourceware.org:/cvs/libabigail/ co htdocs
276
277where 'user' is your username on the sourceware system.
278Alternatively, you can check out the the web source code anonymously,
279if you don't have any user account on the sourceware system by doing:
280
281    export CVSROOT=:pserver:anoncvs@cygwin.com:/cvs/libabigail
282    cvs login
283    (the CVS anonymous password to use is "anoncvs")
284    cvs checkout htdocs
285
286
287Happy Hacking!
288