mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-13 21:01:47 +00:00
HACKING.tex: Change to a LaTeX version of HACKING
* configure.ac: Check for latexmk and pdflatex * Makefile.am: Add a conditional target to build HACKING.pdf, as a convenience * HACKING.tex: A slightly more structured HACKING, is readable on its own. * HACKING: removed
This commit is contained in:
parent
096259d062
commit
fa482834ea
406
HACKING
406
HACKING
@ -1,406 +0,0 @@
|
||||
-*- mode: text; -*-
|
||||
$QuaggaId: Format:%an, %ai, %h$ $
|
||||
|
||||
Contents:
|
||||
|
||||
* GUIDELINES FOR HACKING ON QUAGGA
|
||||
* COMPILE-TIME CONDITIONAL CODE
|
||||
* COMMIT MESSAGE
|
||||
* HACKING THE BUILD SYSTEM
|
||||
* RELEASE PROCEDURE
|
||||
* TOOL VERSIONS
|
||||
* SHARED LIBRARY VERSIONING
|
||||
* GIT COMMIT SUBSMISSION
|
||||
* PATCH SUBMISSION
|
||||
* PATCH APPLICATION
|
||||
* STABLE PLATFORMS AND DAEMONS
|
||||
* IMPORT OR UPDATE VENDOR SPECIFIC ROUTING PROTOCOLS
|
||||
|
||||
|
||||
GUIDELINES FOR HACKING ON QUAGGA
|
||||
|
||||
[this is a draft in progress]
|
||||
|
||||
GNU coding standards apply. Indentation follows the result of
|
||||
invoking GNU indent (as of 2.2.8a) with no arguments. Note that this
|
||||
uses tabs instead of spaces where possible for leading whitespace, and
|
||||
assumes that tabs are every 8 columns. Do not attempt to redefine the
|
||||
location of tab stops. Note also that some indentation does not
|
||||
follow GNU style. This is a historical accident, and we generally
|
||||
only clean up whitespace when code is unmaintainable due to whitespace
|
||||
issues, to minimise merging conflicts.
|
||||
|
||||
For GNU emacs, use indentation style "gnu".
|
||||
|
||||
For Vim, use the following lines (note that tabs are at 8, and that
|
||||
softtabstop sets the indentation level):
|
||||
|
||||
set tabstop=8
|
||||
set softtabstop=2
|
||||
set shiftwidth=2
|
||||
set noexpandtab
|
||||
|
||||
Be particularly careful not to break platforms/protocols that you
|
||||
cannot test.
|
||||
|
||||
New code should have good comments, which explain why the code is correct.
|
||||
Changes to existing code should in many cases upgrade the comments when
|
||||
necessary for a reviewer to conclude that the change has no unintended
|
||||
consequences.
|
||||
|
||||
Each file in the Git repository should have a git format-placeholder (like
|
||||
an RCS Id keyword), somewhere very near the top, commented out appropriately
|
||||
for the file type. The placeholder used for Quagga (replacing <dollar> with
|
||||
$) is:
|
||||
|
||||
$QuaggaId: <dollar>Format:%an, %ai, %h<dollar> $
|
||||
|
||||
See line 2 of HACKING for an example;
|
||||
|
||||
This placeholder string will be expanded out by the 'git archive' commands,
|
||||
wihch is used to generate the tar archives for snapshots and releases.
|
||||
|
||||
Please document fully the proper use of a new function in the header file
|
||||
in which it is declared. And please consult existing headers for
|
||||
documentation on how to use existing functions. In particular, please consult
|
||||
these header files:
|
||||
|
||||
lib/log.h logging levels and usage guidance
|
||||
[more to be added]
|
||||
|
||||
If changing an exported interface, please try to deprecate the interface in
|
||||
an orderly manner. If at all possible, try to retain the old deprecated
|
||||
interface as is, or functionally equivalent. Make a note of when the
|
||||
interface was deprecated and guard the deprecated interface definitions in
|
||||
the header file, ie:
|
||||
|
||||
/* Deprecated: 20050406 */
|
||||
#if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
|
||||
#warning "Using deprecated <libname> (interface(s)|function(s))"
|
||||
...
|
||||
#endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
|
||||
|
||||
To ensure that the core Quagga sources do not use the deprecated interfaces
|
||||
(you should update Quagga sources to use new interfaces, if applicable)
|
||||
while allowing external sources to continue to build. Deprecated interfaces
|
||||
should be excised in the next unstable cycle.
|
||||
|
||||
Note: If you wish, you can test for GCC and use a function
|
||||
marked with the 'deprecated' attribute. However, you must provide the
|
||||
#warning for other compilers.
|
||||
|
||||
If changing or removing a command definition, *ensure* that you properly
|
||||
deprecate it - use the _DEPRECATED form of the appropriate DEFUN macro. This
|
||||
is *critical*. Even if the command can no longer function, you *must* still
|
||||
implement it as a do-nothing stub. Failure to follow this causes grief for
|
||||
systems administrators. Deprecated commands should be excised in the next
|
||||
unstable cycle. A list of deprecated commands should be collated for each
|
||||
release.
|
||||
|
||||
See also below regarding SHARED LIBRARY VERSIONING.
|
||||
|
||||
|
||||
COMPILE-TIME CONDITIONAL CODE
|
||||
|
||||
Please think very carefully before making code conditional at compile time,
|
||||
as it increases maintenance burdens and user confusion. In particular,
|
||||
please avoid gratuitious --enable-.... switches to the configure script -
|
||||
typically code should be good enough to be in Quagga, or it shouldn't be
|
||||
there at all.
|
||||
|
||||
When code must be compile-time conditional, try have the compiler make it
|
||||
conditional rather than the C pre-processor - so that it will still be
|
||||
checked by the compiler, even if disabled. I.e. this:
|
||||
|
||||
if (SOME_SYMBOL)
|
||||
frobnicate();
|
||||
|
||||
rather than:
|
||||
|
||||
#ifdef SOME_SYMBOL
|
||||
frobnicate ();
|
||||
#endif /* SOME_SYMBOL */
|
||||
|
||||
Note that the former approach requires ensuring that SOME_SYMBOL will be
|
||||
defined (watch your AC_DEFINEs).
|
||||
|
||||
|
||||
COMMIT MESSAGES
|
||||
|
||||
The commit message MUST provide:
|
||||
|
||||
* A suitable one-line summary followed by a blank line as the very
|
||||
first line of the message, in the form:
|
||||
|
||||
topic: high-level, one line summary
|
||||
|
||||
Where topic would tend to be name of a subdirectory, and/or daemon, unless
|
||||
there's a more suitable topic (e.g. 'build'). This topic is used to
|
||||
organise change summaries in release announcements.
|
||||
|
||||
The remainder of the commit message - its "body" - should ideally try to
|
||||
address the following areas, so as to help reviewers and future browsers of
|
||||
the code-base understand why the change is correct (note also the code
|
||||
comment requirements):
|
||||
|
||||
* The motivation for the change (does it fix a bug, if so which?
|
||||
add a feature?)
|
||||
* The general approach taken, and trade-offs versus any other approaches.
|
||||
* Any testing undertaken or other information affecting the confidence
|
||||
that can be had in the change.
|
||||
* Information to allow reviewers to be able to tell which specific changes
|
||||
to the code are intended (and hence be able to spot any accidental
|
||||
unintended changes).
|
||||
|
||||
The one-line summary must be limited to 54 characters, and all other
|
||||
lines to 72 characters.
|
||||
|
||||
Commit message bodies in the Quagga project have typically taken the
|
||||
following form:
|
||||
|
||||
* An optional introduction, describing the change generally.
|
||||
* A short description of each specific change made, preferably:
|
||||
* file by file
|
||||
* function by function (use of "ditto", or globs is allowed)
|
||||
|
||||
Contributors are strongly encouraged to follow this form.
|
||||
|
||||
This itemised commit messages allows reviewers to have confidence that the
|
||||
author has self-reviewed every line of the patch, as well as providing
|
||||
reviewers a clear index of which changes are intended, and descriptions for
|
||||
them (C-to-english descriptions are not desireable - some discretion is
|
||||
useful). For short patches, a per-function/file break-down may be
|
||||
redundant. For longer patches, such a break-down may be essential. A
|
||||
contrived example (where the general discussion is obviously somewhat
|
||||
redundant, given the one-line summary):
|
||||
|
||||
zebra: Enhance frob FSM to detect loss of frob
|
||||
|
||||
Add a new DOWN state to the frob state machine to allow the barinator to
|
||||
detect loss of frob.
|
||||
|
||||
* frob.h: (struct frob) Add DOWN state flag.
|
||||
* frob.c: (frob_change) set/clear DOWN appropriately on state change.
|
||||
* bar.c: (barinate) Check frob for DOWN state.
|
||||
|
||||
Please have a look at the git commit logs to get a feel for what the norms
|
||||
are.
|
||||
|
||||
Note that the commit message format follows git norms, so that "git
|
||||
log --oneline" will have useful output.
|
||||
|
||||
HACKING THE BUILD SYSTEM
|
||||
|
||||
If you change or add to the build system (configure.ac, any Makefile.am,
|
||||
etc.), try to check that the following things still work:
|
||||
|
||||
- make dist
|
||||
- resulting dist tarball builds
|
||||
- out-of-tree builds
|
||||
|
||||
The quagga.net site relies on make dist to work to generate snapshots. It
|
||||
must work. Common problems are to forget to have some additional file
|
||||
included in the dist, or to have a make rule refer to a source file without
|
||||
using the srcdir variable.
|
||||
|
||||
|
||||
RELEASE PROCEDURE
|
||||
|
||||
* Tag the apppropriate commit with a release tag (follow existing
|
||||
conventions).
|
||||
[This enables recreating the release, and is just good CM practice.]
|
||||
|
||||
* Create a fresh tar archive of the quagga.net repository, and do a test
|
||||
build:
|
||||
|
||||
git-clone git:///code.quagga.net/quagga.git quagga
|
||||
git-archive --remote=git://code.quagga.net/quagga.git \
|
||||
--prefix=quagga-release/ master | tar -xf -
|
||||
cd quagga-release
|
||||
|
||||
autoreconf -i
|
||||
./configure
|
||||
make
|
||||
make dist
|
||||
|
||||
The tarball which 'make dist' creates is the tarball to be released! The
|
||||
git-archive step ensures you're working with code corresponding to that in
|
||||
the official repository, and also carries out keyword expansion. If any
|
||||
errors occur, move tags as needed and start over from the fresh checkouts.
|
||||
Do not append to tarballs, as this has produced non-standards-conforming
|
||||
tarballs in the past.
|
||||
|
||||
See also: http://wiki.quagga.net/index.php/Main/Processes
|
||||
|
||||
[TODO: collation of a list of deprecated commands. Possibly can be scripted
|
||||
to extract from vtysh/vtysh_cmd.c]
|
||||
|
||||
|
||||
TOOL VERSIONS
|
||||
|
||||
Require versions of support tools are listed in INSTALL.quagga.txt.
|
||||
Required versions should only be done with due deliberation, as it can
|
||||
cause environments to no longer be able to compile quagga.
|
||||
|
||||
|
||||
SHARED LIBRARY VERSIONING
|
||||
|
||||
[this section is at the moment just gdt's opinion]
|
||||
|
||||
Quagga builds several shared libaries (lib/libzebra, ospfd/libospf,
|
||||
ospfclient/libsopfapiclient). These may be used by external programs,
|
||||
e.g. a new routing protocol that works with the zebra daemon, or
|
||||
ospfapi clients. The libtool info pages (node Versioning) explain
|
||||
when major and minor version numbers should be changed. These values
|
||||
are set in Makefile.am near the definition of the library. If you
|
||||
make a change that requires changing the shared library version,
|
||||
please update Makefile.am.
|
||||
|
||||
libospf exports far more than it should, and is needed by ospfapi
|
||||
clients. Only bump libospf for changes to functions for which it is
|
||||
reasonable for a user of ospfapi to call, and please err on the side
|
||||
of not bumping.
|
||||
|
||||
There is no support intended for installing part of zebra. The core
|
||||
library libzebra and the included daemons should always be built and
|
||||
installed together.
|
||||
|
||||
|
||||
GIT COMMIT SUBSMISSION
|
||||
|
||||
The preferred method for submitting changes is to provide git commits via a
|
||||
publically-accessible git repository, which the maintainers can easily pull.
|
||||
|
||||
The commits should be in a branch based off the Quagga.net master - a
|
||||
"feature branch". Ideally there should be no commits to this branch other
|
||||
than those in master, and those intended to be submitted. However, merge
|
||||
commits to this branch from the Quagga master are permitted, though strongly
|
||||
discouraged - use another (potentially local and throw-away) branch to test
|
||||
merge with the latest Quagga master.
|
||||
|
||||
Recommended practice is to keep different logical sets of changes on
|
||||
separate branches - "topic" or "feature" branches. This allows you to still
|
||||
merge them together to one branch (potentially local and/or "throw-away")
|
||||
for testing or use, while retaining smaller, independent branches that are
|
||||
easier to merge.
|
||||
|
||||
All content guidelines in PATCH SUBMISSION apply.
|
||||
|
||||
|
||||
PATCH SUBMISSION
|
||||
|
||||
* For complex changes, contributors are strongly encouraged to first start a
|
||||
design discussion on the quagga-dev list before starting any coding.
|
||||
|
||||
* Send a clean diff against the 'master' branch of the quagga.git
|
||||
repository, in unified diff format, preferably with the '-p' argument to
|
||||
show C function affected by any chunk, and with the -w and -b arguments to
|
||||
minimise changes. E.g:
|
||||
|
||||
git diff -up mybranch..remotes/quagga.net/master
|
||||
|
||||
It is preferable to use git format-patch, and even more preferred to
|
||||
publish a git repository (see GIT COMMIT SUBMISSION).
|
||||
|
||||
If not using git format-patch, Include the commit message in the email.
|
||||
|
||||
* After a commit, code should have comments explaining to the reviewer
|
||||
why it is correct, without reference to history. The commit message
|
||||
should explain why the change is correct.
|
||||
|
||||
* Include NEWS entries as appropriate.
|
||||
|
||||
* Include only one semantic change or group of changes per patch.
|
||||
|
||||
* Do not make gratuitous changes to whitespace. See the w and b arguments
|
||||
to diff.
|
||||
|
||||
* Changes should be arranged so that the least contraversial and most
|
||||
trivial are first, and the most complex or more contraversial are last.
|
||||
This will maximise how many the Quagga maintainers can merge, even if some
|
||||
other commits need further work.
|
||||
|
||||
* Providing a unit-test is strongly encouraged. Doing so will make it
|
||||
much easier for maintainers to have confidence that they will be able
|
||||
to support your change.
|
||||
|
||||
* New code should be arranged so that it easy to verify and test. E.g.
|
||||
stateful logic should be separated out from functional logic as much as
|
||||
possible: wherever possible, move complex logic out to smaller helper
|
||||
functions which access no state other than their arguments.
|
||||
|
||||
* State on which platforms and with what daemons the patch has been
|
||||
tested. Understand that if the set of testing locations is small,
|
||||
and the patch might have unforeseen or hard to fix consequences that
|
||||
there may be a call for testers on quagga-dev, and that the patch
|
||||
may be blocked until test results appear.
|
||||
|
||||
If there are no users for a platform on quagga-dev who are able and
|
||||
willing to verify -current occasionally, that platform may be
|
||||
dropped from the "should be checked" list.
|
||||
|
||||
|
||||
PATCH APPLICATION
|
||||
|
||||
* Only apply patches that meet the submission guidelines.
|
||||
|
||||
* If the patch might break something, issue a call for testing on the
|
||||
mailinglist.
|
||||
|
||||
* Give an appropriate commit message (see above), and use the --author
|
||||
argument to git-commit, if required, to ensure proper attribution (you
|
||||
should still be listed as committer)
|
||||
|
||||
* Immediately after commiting, double-check (with git-log and/or gitk). If
|
||||
there's a small mistake you can easily fix it with 'git commit --amend ..'
|
||||
|
||||
* When merging a branch, always use an explicit merge commit. Giving --no-ff
|
||||
ensures a merge commit is created which documents "this human decided to
|
||||
merge this branch at this time".
|
||||
|
||||
STABLE PLATFORMS AND DAEMONS
|
||||
|
||||
The list of platforms that should be tested follow. This is a list
|
||||
derived from what quagga is thought to run on and for which
|
||||
maintainers can test or there are people on quagga-dev who are able
|
||||
and willing to verify that -current does or does not work correctly.
|
||||
|
||||
BSD (Free, Net or Open, any platform) # without capabilities
|
||||
GNU/Linux (any distribution, i386)
|
||||
Solaris (strict alignment, any platform)
|
||||
[future: NetBSD/sparc64]
|
||||
|
||||
The list of daemons that are thought to be stable and that should be
|
||||
tested are:
|
||||
|
||||
zebra
|
||||
bgpd
|
||||
ripd
|
||||
ospfd
|
||||
ripngd
|
||||
|
||||
Daemons which are in a testing phase are
|
||||
|
||||
ospf6d
|
||||
isisd
|
||||
watchquagga
|
||||
|
||||
|
||||
IMPORT OR UPDATE VENDOR SPECIFIC ROUTING PROTOCOLS
|
||||
|
||||
The source code of Quagga is based on two vendors:
|
||||
|
||||
zebra_org (http://www.zebra.org/)
|
||||
isisd_sf (http://isisd.sf.net/)
|
||||
|
||||
To import code from further sources, e.g. for archival purposes without
|
||||
necessarily having to review and/or fix some changeset, create a branch from
|
||||
'master':
|
||||
|
||||
git checkout -b archive/foo master
|
||||
<apply changes>
|
||||
git commit -a "Joe Bar <joe@example.com>"
|
||||
git push quagga archive/foo
|
||||
|
||||
presuming 'quagga' corresponds to a file in your .git/remotes with
|
||||
configuration for the appropriate Quagga.net repository.
|
462
HACKING.tex
Normal file
462
HACKING.tex
Normal file
@ -0,0 +1,462 @@
|
||||
%% -*- mode: text; -*-
|
||||
%% $QuaggaId: Format:%an, %ai, %h$ $
|
||||
|
||||
\documentclass[oneside]{article}
|
||||
\usepackage{parskip}
|
||||
\usepackage[bookmarks,colorlinks=true]{hyperref}
|
||||
|
||||
\title{Conventions for working on Quagga}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
This is a living document. Suggestions for updates, via the
|
||||
\href{http://lists.quagga.net/mailman/listinfo/quagga-dev}{quagga-dev list},
|
||||
are welcome.
|
||||
|
||||
\tableofcontents
|
||||
|
||||
\section{GUIDELINES FOR HACKING ON QUAGGA}
|
||||
\label{sec:guidelines}
|
||||
|
||||
|
||||
GNU coding standards apply. Indentation follows the result of
|
||||
invoking GNU indent (as of 2.2.8a) with no arguments. Note that this
|
||||
uses tabs instead of spaces where possible for leading whitespace, and
|
||||
assumes that tabs are every 8 columns. Do not attempt to redefine the
|
||||
location of tab stops. Note also that some indentation does not
|
||||
follow GNU style. This is a historical accident, and we generally
|
||||
only clean up whitespace when code is unmaintainable due to whitespace
|
||||
issues, to minimise merging conflicts.
|
||||
|
||||
For GNU emacs, use indentation style ``gnu''.
|
||||
|
||||
For Vim, use the following lines (note that tabs are at 8, and that
|
||||
softtabstop sets the indentation level):
|
||||
|
||||
set tabstop=8
|
||||
set softtabstop=2
|
||||
set shiftwidth=2
|
||||
set noexpandtab
|
||||
|
||||
Be particularly careful not to break platforms/protocols that you
|
||||
cannot test.
|
||||
|
||||
New code should have good comments, which explain why the code is correct.
|
||||
Changes to existing code should in many cases upgrade the comments when
|
||||
necessary for a reviewer to conclude that the change has no unintended
|
||||
consequences.
|
||||
|
||||
Each file in the Git repository should have a git format-placeholder (like
|
||||
an RCS Id keyword), somewhere very near the top, commented out appropriately
|
||||
for the file type. The placeholder used for Quagga (replacing <dollar> with
|
||||
\$) is:
|
||||
|
||||
\verb|$QuaggaId: <dollar>Format:%an, %ai, %h<dollar> $|
|
||||
|
||||
See line 2 of HACKING.tex, the source for this document, for an example.
|
||||
|
||||
This placeholder string will be expanded out by the `git archive' commands,
|
||||
wihch is used to generate the tar archives for snapshots and releases.
|
||||
|
||||
Please document fully the proper use of a new function in the header file
|
||||
in which it is declared. And please consult existing headers for
|
||||
documentation on how to use existing functions. In particular, please consult
|
||||
these header files:
|
||||
|
||||
\begin{description}
|
||||
\item{lib/log.h} logging levels and usage guidance
|
||||
\item{[more to be added]}
|
||||
\end{description}
|
||||
|
||||
If changing an exported interface, please try to deprecate the interface in
|
||||
an orderly manner. If at all possible, try to retain the old deprecated
|
||||
interface as is, or functionally equivalent. Make a note of when the
|
||||
interface was deprecated and guard the deprecated interface definitions in
|
||||
the header file, ie:
|
||||
|
||||
\begin{verbatim}
|
||||
/* Deprecated: 20050406 */
|
||||
#if !defined(QUAGGA_NO_DEPRECATED_INTERFACES)
|
||||
#warning "Using deprecated <libname> (interface(s)|function(s))"
|
||||
...
|
||||
#endif /* QUAGGA_NO_DEPRECATED_INTERFACES */
|
||||
\end{verbatim}
|
||||
|
||||
This is to ensure that the core Quagga sources do not use the deprecated
|
||||
interfaces (you should update Quagga sources to use new interfaces, if
|
||||
applicable), while allowing external sources to continue to build.
|
||||
Deprecated interfaces should be excised in the next unstable cycle.
|
||||
|
||||
Note: If you wish, you can test for GCC and use a function
|
||||
marked with the 'deprecated' attribute. However, you must provide the
|
||||
warning for other compilers.
|
||||
|
||||
If changing or removing a command definition, \emph{ensure} that you
|
||||
properly deprecate it - use the \_DEPRECATED form of the appropriate DEFUN
|
||||
macro. This is \emph{critical}. Even if the command can no longer
|
||||
function, you \emph{MUST} still implement it as a do-nothing stub.
|
||||
|
||||
Failure to follow this causes grief for systems administrators, as an
|
||||
upgrade may cause daemons to fail to start because of unrecognised commands.
|
||||
Deprecated commands should be excised in the next unstable cycle. A list of
|
||||
deprecated commands should be collated for each release.
|
||||
|
||||
See also section~\ref{sec:dll-versioning} below regarding SHARED LIBRARY
|
||||
VERSIONING.
|
||||
|
||||
|
||||
\section{COMPILE-TIME CONDITIONAL CODE}
|
||||
|
||||
Please think very carefully before making code conditional at compile time,
|
||||
as it increases maintenance burdens and user confusion. In particular,
|
||||
please avoid gratuitious --enable-\ldots switches to the configure script -
|
||||
typically code should be good enough to be in Quagga, or it shouldn't be
|
||||
there at all.
|
||||
|
||||
When code must be compile-time conditional, try have the compiler make it
|
||||
conditional rather than the C pre-processor - so that it will still be
|
||||
checked by the compiler, even if disabled. I.e. this:
|
||||
|
||||
\begin{verbatim}
|
||||
if (SOME_SYMBOL)
|
||||
frobnicate();
|
||||
\end{verbatim}
|
||||
|
||||
rather than:
|
||||
|
||||
\begin{verbatim}
|
||||
#ifdef SOME_SYMBOL
|
||||
frobnicate ();
|
||||
#endif /* SOME_SYMBOL */
|
||||
\end{verbatim}
|
||||
|
||||
Note that the former approach requires ensuring that SOME\_SYMBOL will be
|
||||
defined (watch your AC\_DEFINEs).
|
||||
|
||||
|
||||
\section{COMMIT MESSAGES}
|
||||
|
||||
The commit message requirements are:
|
||||
|
||||
\begin{itemize}
|
||||
|
||||
\item The message \emph{MUST} provide a suitable one-line summary followed
|
||||
by a blank line as the very first line of the message, in the form:
|
||||
|
||||
\verb|topic: high-level, one line summary|
|
||||
|
||||
Where topic would tend to be name of a subdirectory, and/or daemon, unless
|
||||
there's a more suitable topic (e.g. 'build'). This topic is used to
|
||||
organise change summaries in release announcements.
|
||||
|
||||
\item It should have a suitable "body", which tries to address the
|
||||
following areas, so as to help reviewers and future browsers of the
|
||||
code-base understand why the change is correct (note also the code
|
||||
comment requirements):
|
||||
|
||||
\begin{itemize}
|
||||
|
||||
\item The motivation for the change (does it fix a bug, if so which?
|
||||
add a feature?)
|
||||
|
||||
\item The general approach taken, and trade-offs versus any other
|
||||
approaches.
|
||||
|
||||
\item Any testing undertaken or other information affecting the confidence
|
||||
that can be had in the change.
|
||||
|
||||
\item Information to allow reviewers to be able to tell which specific
|
||||
changes to the code are intended (and hence be able to spot any accidental
|
||||
unintended changes).
|
||||
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
The one-line summary must be limited to 54 characters, and all other
|
||||
lines to 72 characters.
|
||||
|
||||
Commit message bodies in the Quagga project have typically taken the
|
||||
following form:
|
||||
|
||||
\begin{itemize}
|
||||
\item An optional introduction, describing the change generally.
|
||||
\item A short description of each specific change made, preferably:
|
||||
\begin{itemize} \item file by file
|
||||
\begin{itemize} \item function by function (use of "ditto", or globs is
|
||||
allowed)
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
\end{itemize}
|
||||
|
||||
Contributors are strongly encouraged to follow this form.
|
||||
|
||||
This itemised commit messages allows reviewers to have confidence that the
|
||||
author has self-reviewed every line of the patch, as well as providing
|
||||
reviewers a clear index of which changes are intended, and descriptions for
|
||||
them (C-to-english descriptions are not desireable - some discretion is
|
||||
useful). For short patches, a per-function/file break-down may be
|
||||
redundant. For longer patches, such a break-down may be essential. A
|
||||
contrived example (where the general discussion is obviously somewhat
|
||||
redundant, given the one-line summary):
|
||||
|
||||
\begin{quote}\begin{verbatim}
|
||||
zebra: Enhance frob FSM to detect loss of frob
|
||||
|
||||
Add a new DOWN state to the frob state machine to allow the barinator to
|
||||
detect loss of frob.
|
||||
|
||||
* frob.h: (struct frob) Add DOWN state flag.
|
||||
* frob.c: (frob\_change) set/clear DOWN appropriately on state change.
|
||||
* bar.c: (barinate) Check frob for DOWN state.
|
||||
\end{verbatim}\end{quote}
|
||||
|
||||
Please have a look at the git commit logs to get a feel for what the norms
|
||||
are.
|
||||
|
||||
Note that the commit message format follows git norms, so that ``git
|
||||
log --oneline'' will have useful output.
|
||||
|
||||
\section{HACKING THE BUILD SYSTEM}
|
||||
|
||||
If you change or add to the build system (configure.ac, any Makefile.am,
|
||||
etc.), try to check that the following things still work:
|
||||
|
||||
\begin{itemize}
|
||||
\item make dist
|
||||
\item resulting dist tarball builds
|
||||
\item out-of-tree builds
|
||||
\end{itemize}
|
||||
|
||||
The quagga.net site relies on make dist to work to generate snapshots. It
|
||||
must work. Common problems are to forget to have some additional file
|
||||
included in the dist, or to have a make rule refer to a source file without
|
||||
using the srcdir variable.
|
||||
|
||||
|
||||
\section{RELEASE PROCEDURE}
|
||||
|
||||
\begin{itemize}
|
||||
\item Tag the apppropriate commit with a release tag (follow existing
|
||||
conventions).
|
||||
|
||||
[This enables recreating the release, and is just good CM practice.]
|
||||
|
||||
\item Create a fresh tar archive of the quagga.net repository, and do a test
|
||||
build:
|
||||
|
||||
\begin{verbatim}
|
||||
git-clone git:///code.quagga.net/quagga.git quagga
|
||||
git-archive --remote=git://code.quagga.net/quagga.git \
|
||||
--prefix=quagga-release/ master | tar -xf -
|
||||
cd quagga-release
|
||||
|
||||
autoreconf -i
|
||||
./configure
|
||||
make
|
||||
make dist
|
||||
\end{verbatim}
|
||||
\end{itemize}
|
||||
|
||||
The tarball which `make dist' creates is the tarball to be released! The
|
||||
git-archive step ensures you're working with code corresponding to that in
|
||||
the official repository, and also carries out keyword expansion. If any
|
||||
errors occur, move tags as needed and start over from the fresh checkouts.
|
||||
Do not append to tarballs, as this has produced non-standards-conforming
|
||||
tarballs in the past.
|
||||
|
||||
See also: \url{http://wiki.quagga.net/index.php/Main/Processes}
|
||||
|
||||
[TODO: collation of a list of deprecated commands. Possibly can be scripted
|
||||
to extract from vtysh/vtysh\_cmd.c]
|
||||
|
||||
|
||||
\section{TOOL VERSIONS}
|
||||
|
||||
Require versions of support tools are listed in INSTALL.quagga.txt.
|
||||
Required versions should only be done with due deliberation, as it can
|
||||
cause environments to no longer be able to compile quagga.
|
||||
|
||||
|
||||
\section{SHARED LIBRARY VERSIONING}
|
||||
\label{sec:dll-versioning}
|
||||
|
||||
[this section is at the moment just gdt's opinion]
|
||||
|
||||
Quagga builds several shared libaries (lib/libzebra, ospfd/libospf,
|
||||
ospfclient/libsopfapiclient). These may be used by external programs,
|
||||
e.g. a new routing protocol that works with the zebra daemon, or
|
||||
ospfapi clients. The libtool info pages (node Versioning) explain
|
||||
when major and minor version numbers should be changed. These values
|
||||
are set in Makefile.am near the definition of the library. If you
|
||||
make a change that requires changing the shared library version,
|
||||
please update Makefile.am.
|
||||
|
||||
libospf exports far more than it should, and is needed by ospfapi
|
||||
clients. Only bump libospf for changes to functions for which it is
|
||||
reasonable for a user of ospfapi to call, and please err on the side
|
||||
of not bumping.
|
||||
|
||||
There is no support intended for installing part of zebra. The core
|
||||
library libzebra and the included daemons should always be built and
|
||||
installed together.
|
||||
|
||||
|
||||
\section{GIT COMMIT SUBMISSION}
|
||||
\label{sec:git-submission}
|
||||
|
||||
The preferred method for submitting changes is to provide git commits via a
|
||||
publically-accessible git repository, which the maintainers can easily pull.
|
||||
|
||||
The commits should be in a branch based off the Quagga.net master - a
|
||||
"feature branch". Ideally there should be no commits to this branch other
|
||||
than those in master, and those intended to be submitted. However, merge
|
||||
commits to this branch from the Quagga master are permitted, though strongly
|
||||
discouraged - use another (potentially local and throw-away) branch to test
|
||||
merge with the latest Quagga master.
|
||||
|
||||
Recommended practice is to keep different logical sets of changes on
|
||||
separate branches - "topic" or "feature" branches. This allows you to still
|
||||
merge them together to one branch (potentially local and/or "throw-away")
|
||||
for testing or use, while retaining smaller, independent branches that are
|
||||
easier to merge.
|
||||
|
||||
All content guidelines in section \ref{sec:patch-submission}, PATCH
|
||||
SUBMISSION apply.
|
||||
|
||||
|
||||
\section{PATCH SUBMISSION}
|
||||
\label{sec:patch-submission}
|
||||
|
||||
\begin{itemize}
|
||||
|
||||
\item For complex changes, contributors are strongly encouraged to first
|
||||
start a design discussion on the quagga-dev list \emph{before}
|
||||
starting any coding.
|
||||
|
||||
\item Send a clean diff against the 'master' branch of the quagga.git
|
||||
repository, in unified diff format, preferably with the '-p' argument to
|
||||
show C function affected by any chunk, and with the -w and -b arguments to
|
||||
minimise changes. E.g:
|
||||
|
||||
git diff -up mybranch..remotes/quagga.net/master
|
||||
|
||||
It is preferable to use git format-patch, and even more preferred to
|
||||
publish a git repository (see GIT COMMIT SUBMISSION, section
|
||||
\ref{sec:git-submission}).
|
||||
|
||||
If not using git format-patch, Include the commit message in the email.
|
||||
|
||||
\item After a commit, code should have comments explaining to the reviewer
|
||||
why it is correct, without reference to history. The commit message
|
||||
should explain why the change is correct.
|
||||
|
||||
\item Include NEWS entries as appropriate.
|
||||
|
||||
\item Include only one semantic change or group of changes per patch.
|
||||
|
||||
\item Do not make gratuitous changes to whitespace. See the w and b arguments
|
||||
to diff.
|
||||
|
||||
\item Changes should be arranged so that the least contraversial and most
|
||||
trivial are first, and the most complex or more contraversial are
|
||||
last. This will maximise how many the Quagga maintainers can merge,
|
||||
even if some other commits need further work.
|
||||
|
||||
\item Providing a unit-test is strongly encouraged. Doing so will make it
|
||||
much easier for maintainers to have confidence that they will be able
|
||||
to support your change.
|
||||
|
||||
\item New code should be arranged so that it easy to verify and test. E.g.
|
||||
stateful logic should be separated out from functional logic as much as
|
||||
possible: wherever possible, move complex logic out to smaller helper
|
||||
functions which access no state other than their arguments.
|
||||
|
||||
\item State on which platforms and with what daemons the patch has been
|
||||
tested. Understand that if the set of testing locations is small,
|
||||
and the patch might have unforeseen or hard to fix consequences that
|
||||
there may be a call for testers on quagga-dev, and that the patch
|
||||
may be blocked until test results appear.
|
||||
|
||||
If there are no users for a platform on quagga-dev who are able and
|
||||
willing to verify -current occasionally, that platform may be
|
||||
dropped from the "should be checked" list.
|
||||
|
||||
\end{itemize}
|
||||
|
||||
\section{PATCH APPLICATION}
|
||||
|
||||
\begin{itemize}
|
||||
|
||||
\item Only apply patches that meet the submission guidelines.
|
||||
|
||||
\item If the patch might break something, issue a call for testing on the
|
||||
mailinglist.
|
||||
|
||||
\item Give an appropriate commit message (see above), and use the --author
|
||||
argument to git-commit, if required, to ensure proper attribution (you
|
||||
should still be listed as committer)
|
||||
|
||||
\item Immediately after commiting, double-check (with git-log and/or gitk).
|
||||
If there's a small mistake you can easily fix it with `git commit
|
||||
--amend ..'
|
||||
|
||||
\item When merging a branch, always use an explicit merge commit. Giving
|
||||
--no-ff ensures a merge commit is created which documents ``this human
|
||||
decided to merge this branch at this time''.
|
||||
\end{itemize}
|
||||
|
||||
\section{STABLE PLATFORMS AND DAEMONS}
|
||||
|
||||
The list of platforms that should be tested follow. This is a list
|
||||
derived from what quagga is thought to run on and for which
|
||||
maintainers can test or there are people on quagga-dev who are able
|
||||
and willing to verify that -current does or does not work correctly.
|
||||
|
||||
\begin{itemize}
|
||||
\item BSD (Free, Net or Open, any platform)
|
||||
\item GNU/Linux (any distribution, i386)
|
||||
\item Solaris (strict alignment, any platform)
|
||||
\item future: NetBSD/sparc64
|
||||
\end{itemize}
|
||||
|
||||
The list of daemons that are thought to be stable and that should be
|
||||
tested are:
|
||||
|
||||
\begin{itemize}
|
||||
\item zebra
|
||||
\item bgpd
|
||||
\item ripd
|
||||
\item ospfd
|
||||
\item ripngd
|
||||
\end{itemize}
|
||||
Daemons which are in a testing phase are
|
||||
|
||||
\begin{itemize}
|
||||
\item ospf6d
|
||||
\item isisd
|
||||
\item watchquagga
|
||||
\end{itemize}
|
||||
|
||||
\section{IMPORT OR UPDATE VENDOR SPECIFIC ROUTING PROTOCOLS}
|
||||
|
||||
The source code of Quagga is based on two vendors:
|
||||
|
||||
\verb|zebra_org| (\url{http://www.zebra.org/})
|
||||
\verb|isisd_sf| (\url{http://isisd.sf.net/})
|
||||
|
||||
To import code from further sources, e.g. for archival purposes without
|
||||
necessarily having to review and/or fix some changeset, create a branch from
|
||||
`master':
|
||||
|
||||
\begin{verbatim}
|
||||
git checkout -b archive/foo master
|
||||
<apply changes>
|
||||
git commit -a "Joe Bar <joe@example.com>"
|
||||
git push quagga archive/foo
|
||||
\end{verbatim}
|
||||
|
||||
presuming `quagga' corresponds to a file in your .git/remotes with
|
||||
configuration for the appropriate Quagga.net repository.
|
||||
|
||||
\end{document}
|
10
Makefile.am
10
Makefile.am
@ -14,4 +14,14 @@ EXTRA_DIST = aclocal.m4 SERVICES TODO REPORTING-BUGS INSTALL.quagga.txt \
|
||||
tools/mrlg.cgi tools/rrcheck.pl tools/rrlookup.pl tools/zc.pl \
|
||||
tools/zebra.el tools/multiple-bgpd.sh
|
||||
|
||||
if HAVE_LATEX
|
||||
|
||||
HACKING.pdf: HACKING.tex
|
||||
$(LATEXMK) -pdf $<
|
||||
|
||||
clean-local:
|
||||
-$(LATEXMK) -C HACKING.tex
|
||||
|
||||
endif
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
10
configure.ac
10
configure.ac
@ -72,6 +72,16 @@ dnl autoconf 2.59 appears not to support AC_PROG_SED
|
||||
dnl AC_PROG_SED
|
||||
AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
|
||||
|
||||
dnl pdflatex and latexmk are needed to build HACKING.pdf
|
||||
AC_CHECK_PROG([PDFLATEX],[pdflatex],[pdflatex],[/bin/false])
|
||||
AC_CHECK_PROG([LATEXMK],[latexmk],[latexmk],[/bin/false])
|
||||
if test "x$PDFLATEX" = "x/bin/false" -o "x$LATEXMK" = "x/bin/false"; then
|
||||
AC_MSG_WARN([Will not be able to make PDF versions of TeX documents])
|
||||
else
|
||||
HAVE_LATEX=true
|
||||
fi
|
||||
AM_CONDITIONAL([HAVE_LATEX], [test "x$HAVE_LATEX" = "xtrue"])
|
||||
|
||||
dnl ------------------------------------------------------------------
|
||||
dnl Intel compiler check. Although Intel tries really hard to make icc
|
||||
dnl look like gcc, there are some differences. It's very verbose with
|
||||
|
Loading…
Reference in New Issue
Block a user