2009-06-02 21:09:45 +02:00
|
|
|
<?xml version='1.0' encoding="utf-8"?>
|
2016-04-22 10:04:29 +02:00
|
|
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
|
|
|
|
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
|
|
|
|
|
2009-06-02 21:09:45 +02:00
|
|
|
<book>
|
|
|
|
<title>The Music Player Daemon - Developer's Manual</title>
|
|
|
|
|
2017-01-09 17:11:56 +01:00
|
|
|
<chapter id="introduction">
|
2009-06-02 21:09:45 +02:00
|
|
|
<title>Introduction</title>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
This is a guide for those who wish to hack on the MPD source
|
|
|
|
code. MPD is an open project, and we are always happy about
|
2014-01-27 09:41:25 +01:00
|
|
|
contributions. So far, more than 150 people have contributed
|
2009-06-02 21:09:45 +02:00
|
|
|
patches.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
This document is work in progress. Most of it may be incomplete
|
|
|
|
yet. Please help!
|
|
|
|
</para>
|
|
|
|
</chapter>
|
|
|
|
|
2017-01-09 17:11:56 +01:00
|
|
|
<chapter id="code_style">
|
2009-06-02 21:09:45 +02:00
|
|
|
<title>Code Style</title>
|
|
|
|
|
|
|
|
<itemizedlist>
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
indent with tabs (width 8)
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
2013-10-20 13:03:32 +02:00
|
|
|
don't write CPP when you can write C++: use inline
|
|
|
|
functions and constexpr instead of macros
|
2009-06-02 21:09:45 +02:00
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
2017-01-09 17:04:41 +01:00
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
comment your code, document your APIs
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
2009-06-02 21:09:45 +02:00
|
|
|
<listitem>
|
|
|
|
<para>
|
2017-01-09 17:03:56 +01:00
|
|
|
the code should be C++14 compliant, and must compile with
|
2016-11-18 08:41:47 +01:00
|
|
|
<application>GCC</application> 4.9 and
|
|
|
|
<application>clang</application> 3.4
|
2009-06-02 21:09:45 +02:00
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
2017-01-09 17:04:41 +01:00
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
report error conditions with C++ exceptions, preferable
|
|
|
|
derived from <varname>std::runtime_error</varname>
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
all code must be exception-safe
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
classes and functions names use CamelCase; variables are
|
|
|
|
lower-case with words separated by underscore
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
|
2009-06-02 21:09:45 +02:00
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
Some example code:
|
|
|
|
</para>
|
|
|
|
|
2011-08-24 22:41:31 +02:00
|
|
|
<programlisting lang="C">static inline int
|
2017-01-09 17:04:41 +01:00
|
|
|
Foo(const char *abc, int xyz)
|
2009-06-02 21:09:45 +02:00
|
|
|
{
|
2017-01-09 17:04:41 +01:00
|
|
|
if (abc == nullptr) {
|
2013-09-27 22:31:24 +02:00
|
|
|
LogWarning("Foo happened!");
|
2009-06-02 21:09:45 +02:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return xyz;
|
|
|
|
}
|
|
|
|
</programlisting>
|
|
|
|
</listitem>
|
|
|
|
</itemizedlist>
|
|
|
|
</chapter>
|
|
|
|
|
2017-01-09 17:11:56 +01:00
|
|
|
<chapter id="hacking">
|
2009-06-02 21:09:45 +02:00
|
|
|
<title>Hacking The Source</title>
|
|
|
|
|
2013-11-08 12:54:16 +01:00
|
|
|
<para>
|
|
|
|
MPD sources are managed in a git repository on <ulink
|
2017-05-15 21:49:18 +02:00
|
|
|
url="https://github.com/MusicPlayerDaemon/">GitHub</ulink>.
|
2013-11-08 12:54:16 +01:00
|
|
|
</para>
|
|
|
|
|
2009-06-02 21:09:45 +02:00
|
|
|
<para>
|
|
|
|
Always write your code against the latest git:
|
|
|
|
</para>
|
|
|
|
|
2017-05-15 21:49:18 +02:00
|
|
|
<programlisting>git clone git://github.com/MusicPlayerDaemon/MPD</programlisting>
|
2009-06-02 21:09:45 +02:00
|
|
|
|
2013-11-08 12:54:16 +01:00
|
|
|
<para>
|
|
|
|
If you already have a clone, update it:
|
|
|
|
</para>
|
|
|
|
|
2017-05-15 21:49:18 +02:00
|
|
|
<programlisting>git pull --rebase git://github.com/MusicPlayerDaemon/MPD master</programlisting>
|
2013-11-08 12:54:16 +01:00
|
|
|
|
|
|
|
<para>
|
|
|
|
You can do without "--rebase", but we recommend that you rebase
|
|
|
|
your repository on the "master" repository all the time.
|
|
|
|
</para>
|
|
|
|
|
2009-06-02 21:09:45 +02:00
|
|
|
<para>
|
|
|
|
Configure with the options <option>--enable-debug
|
|
|
|
--enable-werror</option>. Enable as many plugins as possible,
|
|
|
|
to be sure that you don't break any disabled code.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Don't mix several changes in one single patch. Create a
|
|
|
|
separate patch for every change. Tools like
|
2013-11-08 12:54:16 +01:00
|
|
|
<application>stgit</application> help you with that. This way,
|
|
|
|
we can review your patches more easily, and we can pick the
|
|
|
|
patches we like most first.
|
2009-06-02 21:09:45 +02:00
|
|
|
</para>
|
2013-11-08 12:54:16 +01:00
|
|
|
|
|
|
|
|
|
|
|
<section>
|
|
|
|
<title> Basic stgit usage</title>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
stgit allows you to create a set of patches and refine all of
|
|
|
|
them: you can go back to any patch at any time, and re-edit it
|
|
|
|
(both the code and the commit message). You can reorder
|
|
|
|
patches and insert new patches at any position. It encourages
|
|
|
|
creating separate patches for tiny changes.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
stgit needs to be initialized on a git repository: stg init
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Before you edit the code, create a patch: stg new
|
|
|
|
my-patch-name (stgit now asks you for the commit message).
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Now edit the code. Once you're finished, you have to "refresh"
|
|
|
|
the patch, i.e. your edits are incorporated into the patch you
|
|
|
|
have created: stg refresh
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
You may now continue editing the same patch, and refresh it as
|
|
|
|
often as you like. Create more patches, edit and refresh them.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
To view the list of patches, type stg series. To go back to a
|
|
|
|
specific patch, type stg goto my-patch-name; now you can
|
|
|
|
re-edit it (don't forget stg refresh when you're finished with
|
|
|
|
that patch).
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
When the whole patch series is finished, convert stgit patches
|
|
|
|
to git commits: stg commit
|
|
|
|
</para>
|
|
|
|
</section>
|
2009-06-02 21:09:45 +02:00
|
|
|
</chapter>
|
|
|
|
|
2017-01-09 17:11:56 +01:00
|
|
|
<chapter id="submitting_patches">
|
2009-06-02 21:09:45 +02:00
|
|
|
<title>Submitting Patches</title>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Send your patches to the mailing list:
|
2014-01-27 10:44:05 +01:00
|
|
|
<email>mpd-devel@musicpd.org</email> (<ulink
|
|
|
|
url="http://mailman.blarg.de/listinfo/mpd-devel">subscribe
|
|
|
|
here</ulink>)
|
2009-06-02 21:09:45 +02:00
|
|
|
</para>
|
2014-01-27 09:43:49 +01:00
|
|
|
|
|
|
|
<para>
|
2017-05-15 21:49:18 +02:00
|
|
|
<command>git pull</command> requests are preferred.
|
2017-01-09 17:19:15 +01:00
|
|
|
</para>
|
2009-06-02 21:09:45 +02:00
|
|
|
</chapter>
|
2014-01-27 09:37:22 +01:00
|
|
|
|
2017-01-09 17:11:56 +01:00
|
|
|
<chapter id="tools">
|
2014-01-27 09:37:22 +01:00
|
|
|
<title>Development Tools</title>
|
|
|
|
|
|
|
|
<section>
|
|
|
|
<title>Clang Static Analyzer</title>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
The <ulink url="http://clang-analyzer.llvm.org/">clang static
|
|
|
|
analyzer</ulink> is a tool that helps find bugs. To run it on
|
|
|
|
the MPD code base, install LLVM and clang. Configure MPD to
|
|
|
|
use clang:
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<programlisting>./configure --enable-debug CXX=clang++ CC=clang ...</programlisting>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
It is recommended to use <option>--enable-debug</option>,
|
|
|
|
because the analyzer takes advantage of
|
|
|
|
<function>assert()</function> calls, which are only enabled in
|
|
|
|
the debug build.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Now run the analyzer:
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<programlisting>scan-build --use-c++=clang++ --use-cc=clang make</programlisting>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
The options <option>--use-c++</option> and
|
|
|
|
<option>--use-cc</option> are necessary because it invokes
|
|
|
|
<command>cc</command> for actually compiling the sources by
|
|
|
|
default. That breaks, because MPD requires a C99 compiler.
|
|
|
|
</para>
|
|
|
|
</section>
|
|
|
|
</chapter>
|
2009-06-02 21:09:45 +02:00
|
|
|
</book>
|