You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
288 lines
11 KiB
288 lines
11 KiB
4 months ago
|
Contact
|
||
|
=======
|
||
|
|
||
|
The project homepage is at https://sourceware.org/libabigail
|
||
|
|
||
|
The current libabigail source code can be checked out with:
|
||
|
git clone git://sourceware.org/git/libabigail
|
||
|
|
||
|
The mailing list to send messages and patches to is
|
||
|
libabigail@sourceware.org.
|
||
|
|
||
|
The archives of that list are available at http://sourceware.org/ml/libabigail.
|
||
|
|
||
|
File bugs
|
||
|
=========
|
||
|
|
||
|
Bugs are to be filled in bugzilla at
|
||
|
https://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail
|
||
|
|
||
|
Writing and sending patches
|
||
|
============================
|
||
|
|
||
|
Please supply patches using git format-patch and git send-email. If
|
||
|
you don't know how to use git, send-email, fine. Just use your
|
||
|
favorite email client, attach the patch to a nice message, and send us
|
||
|
the message.
|
||
|
|
||
|
Patches have to be sent by email to libabigail@sourceware.org.
|
||
|
|
||
|
Please read the file COMMIT-LOG-GUIDELINES in the source tree to learn
|
||
|
about how to write the commit log accompanying the patch.
|
||
|
|
||
|
If you are adding a new public header file to the project, or if you
|
||
|
are defining a new entry point to the API of libabigail, please take
|
||
|
some time to read the file VISIBILITY about how you need to handle the
|
||
|
visibility of symbols that are part of the API and ABI of libabigail.
|
||
|
|
||
|
Make sure you sign your patch. To learn about signing, please read
|
||
|
the "Sign your work" chapter below.
|
||
|
|
||
|
One important thing to do before sending your patch is to launch the
|
||
|
regression tests.
|
||
|
|
||
|
Regression tests
|
||
|
================
|
||
|
|
||
|
Regression tests are under the directory 'tests'. They are usually
|
||
|
written in C++ and are especially designed to be easy to debug. The
|
||
|
idea is that if the test fails, the programmer should just have to
|
||
|
launch them under GDB and debug them right away. No-bullshit style.
|
||
|
|
||
|
Regression tests are launched by doing:
|
||
|
|
||
|
make check
|
||
|
|
||
|
If you have N processor cores on your machine, you can launch the
|
||
|
tests in parallel to make whole thing go faster by doing:
|
||
|
|
||
|
make -jN -lN check
|
||
|
|
||
|
If you want to test the fabrication of the distribution tarball (this
|
||
|
is important, because that is how we do to actually release the
|
||
|
tarball of the project that you can download from the internet) then
|
||
|
you can do:
|
||
|
|
||
|
make distcheck
|
||
|
|
||
|
This actually builds the tarball, then untars it, configure/compile
|
||
|
the untarred source code and launches the regression checks from
|
||
|
there.
|
||
|
|
||
|
You can also launch this in parallel by doing:
|
||
|
|
||
|
make -jN -lN distcheck
|
||
|
|
||
|
with N being the number of processor core you have on your system.
|
||
|
|
||
|
Please make sure you always launch "make distcheck" before sending a
|
||
|
patch, so that you are sure that we can always build a tarball after
|
||
|
your patch is applied to the source tree.
|
||
|
|
||
|
A variant of distcheck is "make distcheck-fast". It's like "make
|
||
|
distcheck" but it's faster. You can just use that one.
|
||
|
|
||
|
A complementary regression checking target is "check-self-compare".
|
||
|
You invoke it by doing "make check-self-compare". That target
|
||
|
analyzes the ABI of the libabigail.so shared object, serializes it
|
||
|
into the ABIXML format and then compares the ABI internal
|
||
|
representation gathered from the libabigail.so binary against the one
|
||
|
gathered from the ABIXML format. The two should be equal if
|
||
|
everything goes right. This is an important regression test. The
|
||
|
problem is that it can takes twice as much time as make distcheck. So
|
||
|
we've put it into its own separate target.
|
||
|
|
||
|
So, to be complete the regression checking command to run against your
|
||
|
patch should be: "make check-self-compare distcheck -j16", if you have
|
||
|
a machine with a 16 threads processors, for instance.
|
||
|
|
||
|
Coding language and style
|
||
|
==========================
|
||
|
|
||
|
The coding style is self evident when reading the source code. So
|
||
|
please, stick to and mimic what is already in there for the sake of
|
||
|
consistency at very least. Just for history, it's derived from the
|
||
|
style of the C++ standard library from the GNU project.
|
||
|
|
||
|
As of libabigail 2.0, the language we use is C++ 11. The level
|
||
|
supported is the one supported by the GCC 4.8.x series of compilers.
|
||
|
This should be old and well tested enough to be supported by your
|
||
|
current favorite compiler.
|
||
|
|
||
|
Initially, the code base of the project was written in C++03, with the
|
||
|
TR1 extensions. That heritage is well visible in the code base as it
|
||
|
is today.
|
||
|
|
||
|
Please do not rush and send gazillions of patches that just re-write
|
||
|
tons of code into your favorite C++ 11 flavour du jour. We will
|
||
|
likely reject those patches. We want to keep the history of the code
|
||
|
base in such a way that tools like "git blame <sourcefile> are still
|
||
|
useful.
|
||
|
|
||
|
So we'll accept patches changing parts of the code base to more recent
|
||
|
C++ 11 constructs only if you happen to add functionality or fix
|
||
|
things in that area. If it makes "cultural common" sense to adopt
|
||
|
those constructs. What I mean by "cultural" is that must make sense
|
||
|
in relative to the culture of the project. And yes, that is
|
||
|
subjective. Sorry.
|
||
|
|
||
|
As a generic rule, we tend to favor the lowest possible level of
|
||
|
abstraction that makes sense without requiring future maintainers of
|
||
|
the project to have a PhD in design patterns. We are not impressed by
|
||
|
design patterns. We use them where they make clear sense, but we
|
||
|
don't idolize them. Put it another way, we will always favor the one
|
||
|
who *READS* and debug the code over the one who writes it. To put
|
||
|
things in a hypothetical perspective, we'll rather accept a repetitive
|
||
|
code that stays simple to read and debug over a highly abstract one
|
||
|
using meta programming to save a few lines of repetitive code located
|
||
|
in a very small number of places.
|
||
|
|
||
|
Really, in this project, we care about low level binary analysis
|
||
|
stuff. Issues in that area can be hard to reproduce and quite
|
||
|
challenging to debug. So having tons of abstraction layers in the
|
||
|
code base have proven to be a maintenance burden over the years, from
|
||
|
our experience in working on similar projects. So please help us
|
||
|
avoid those mistakes that we make just for the pleasure of writing
|
||
|
what can look as "pleasant code" at a first naive sight.
|
||
|
|
||
|
That being said, we also love cleanly designed APIs that are fairly
|
||
|
re-usable and well documented. And we also praise abstraction and
|
||
|
modularisation that we recognize as being the most basic tools of any
|
||
|
engineer. So we like to think about ourselves as well rounded people
|
||
|
who care about maintaining things for a long time to come :-)
|
||
|
|
||
|
Launching regression tests in Valgrind
|
||
|
--------------------------------------
|
||
|
|
||
|
To detect memory management errors, the tests of the regression test
|
||
|
suite can be run using Valgrind tools, essentially memcheck and
|
||
|
helgrind.
|
||
|
|
||
|
To do so, please do:
|
||
|
|
||
|
make check-valgrind
|
||
|
|
||
|
This runs the tests under the control of Valgrind memcheck and
|
||
|
helgrind tools.
|
||
|
|
||
|
But then, if you want Valgrind to check the libabigail command line
|
||
|
tools that are *forked* by some of the tests then type:
|
||
|
|
||
|
make check-valgrind-recursive
|
||
|
|
||
|
This one takes a long time. On my system for instance, it takes an
|
||
|
hour. But then it checks *everything*. If you don't have that time,
|
||
|
then "make check-valgrind" is enough, as the regression tests that use
|
||
|
the libabigail *library* directly (as opposed to forking libabigail
|
||
|
command line tools) will be verified.
|
||
|
|
||
|
How tests are organized
|
||
|
-----------------------
|
||
|
|
||
|
There are two kinds of regression tests. Those that use the
|
||
|
libabigail *library* directly, and those that spawn one of the
|
||
|
libabigail command line tools.
|
||
|
|
||
|
Generally, both are usually made of a loop that churns through a set of input
|
||
|
binaries to compare. Once the comparison is done, the resulting
|
||
|
report is compared against a reference report that is provided.
|
||
|
|
||
|
Test executable have names that starts with 'runtest*'. For instance,
|
||
|
under <build-directory>/tests/ you can find tests named
|
||
|
runtestdiffdwarf, runtestabidiff, etc...
|
||
|
|
||
|
If a test executable is named
|
||
|
<build-directory>/tests/runtestdiffdwarf, then its source code is
|
||
|
tests/test-diff-dwarf.cc. Similarly, the source code of the test
|
||
|
<build-directory>/tests/runtestabidiff is tests/test-abidiff.cc.
|
||
|
|
||
|
The data provided for each test (for instance the input binaries to
|
||
|
compare and the reference report that should result from the
|
||
|
comparison) is to be found under tests/data. So data for the test
|
||
|
runtestdiffdwarf is to be found under tests/data/test-diff-dwarf.
|
||
|
Data for the test runtestabidiff is to be found under
|
||
|
tests/data/test-abidiff.cc.
|
||
|
|
||
|
So adding your own tests usually just amounts to adding the input
|
||
|
right input into the right sub-directory of tests/data/. To do so,
|
||
|
look at several tests/test-*.cc to see which one you'd like to add
|
||
|
some input binaries to be compared in.
|
||
|
|
||
|
Then once you know which tests/test-*.cc you'd like to extend, and if
|
||
|
you added your input binaries and reference reports (maybe other
|
||
|
things too) to the right sub-director of tests/data/, you just need to
|
||
|
extend the array of input binaries/reference reports that the test
|
||
|
walks to perform the comparisons. It's generally a global variable
|
||
|
before the main() function of the test. In test-diff-dwarf.cc, for
|
||
|
instance, the variable name is "in_out_specs". You just have to add a
|
||
|
new entry to that array; that new entry contains the paths to your new
|
||
|
input binaries and reference reports. Just read the code in there and
|
||
|
use your brains. It should be straight forward.
|
||
|
|
||
|
Ah, also, if you added new files for the tests, then the build system
|
||
|
needs to be told that those files have to be added to the distribution
|
||
|
tarball when we do "make dist" (or make distcheck). To do so, please
|
||
|
make sure to add your new test input files to the
|
||
|
tests/data/Makefile.am file, in the EXTRA_DIST variable. Look at how
|
||
|
things are organized in that file, and please do things similarly.
|
||
|
|
||
|
Sign your work
|
||
|
==============
|
||
|
|
||
|
To facilitate tracking of who did what, we've adopted a "sign-off"
|
||
|
procedure for patches based on the procedure used by the Linux kernel
|
||
|
project.
|
||
|
|
||
|
The sign-off is a simple line at the end of the explanation for the
|
||
|
patch, which certifies that you wrote it or otherwise have the right
|
||
|
to pass it on as a patch under an appropriate license. The rules are
|
||
|
pretty simple: if you can certify the below:
|
||
|
|
||
|
Developer's Certificate of Origin
|
||
|
|
||
|
By making a contribution to this project, I certify that:
|
||
|
|
||
|
(a) The contribution was created in whole or in part by me,
|
||
|
and I have the right to submit the contribution under the
|
||
|
license indicated in, or otherwise designated as being
|
||
|
applicable to, the file.
|
||
|
|
||
|
(b) The contribution was provided directly to me by some other
|
||
|
person who certified (a), and I have not modified it.
|
||
|
|
||
|
(c) I understand and agree that the project and the
|
||
|
contribution are public and that a record of the
|
||
|
contribution (including all personal information I submit
|
||
|
with it, including my sign-off) is maintained indefinitely
|
||
|
and may be redistributed.
|
||
|
|
||
|
then you just add a line saying
|
||
|
|
||
|
Signed-off-by: Random J Developer <random@developer.example.org>
|
||
|
|
||
|
using your real name (sorry, no pseudonyms or anonymous contributions.)
|
||
|
|
||
|
git commit --signoff will add such a Signed-off-by line at the end of
|
||
|
the commit log message for you.
|
||
|
|
||
|
Modifying the website
|
||
|
=====================
|
||
|
|
||
|
The source code of the website of libabigail is stored in CVS (sigh,
|
||
|
yeah, that is so old school). You can check out that web source code
|
||
|
by doing:
|
||
|
|
||
|
CVS_RSH=ssh cvs -z9 -d :ext:user@sourceware.org:/cvs/libabigail/ co htdocs
|
||
|
|
||
|
where 'user' is your username on the sourceware system.
|
||
|
Alternatively, you can check out the the web source code anonymously,
|
||
|
if you don't have any user account on the sourceware system by doing:
|
||
|
|
||
|
export CVSROOT=:pserver:anoncvs@cygwin.com:/cvs/libabigail
|
||
|
cvs login
|
||
|
(the CVS anonymous password to use is "anoncvs")
|
||
|
cvs checkout htdocs
|
||
|
|
||
|
|
||
|
Happy Hacking!
|