| -*- 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 |
| * SHARED LIBRARY VERSIONING |
| * RELEASE PROCEDURE |
| * TOOL VERSIONS |
| * SHARED LIBRARY VERSIONING |
| * 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, as fewer changes from zebra lead to easier merges. |
| |
| 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, and 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. 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 should provide: |
| |
| * A suitable one-line summary 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. |
| |
| * An optional introduction, discussing the general intent of the change. |
| * A short description of each change made, preferably: |
| * file by file |
| * function by function (use of "ditto", or globs is allowed) |
| |
| to provide a short description of the general intent of the patch, in terms |
| of the problem it solves and how it achieves it, to help reviewers |
| understand. |
| |
| |
| The reason for such itemised commit messages is to encourage the author to |
| self-review every line of the patch, as well as provide reviewers an index |
| of which changes are intended, along with a short description for each. |
| Some discretion is obviously required. A C-to-english description is not |
| desireable. For short patches, a per-function/file break-down may be |
| redundant. For longer patches, such a break-down may be essential. |
| |
| An example (where the general discussion is obviously somewhat redundant, |
| given the one-line summary): |
| |
| zebra: Enhance frob FSM to detect loss of frob |
| |
| * (general) 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. |
| |
| |
| 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. |
| |
| |
| PATCH SUBMISSION |
| |
| * 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 |
| |
| Or by using git-format-patch. |
| |
| * Not doing so is a definite hindrance to patch application. |
| |
| * Include NEWS entries as appropriate. |
| |
| * Please, please include an appropriate commit message with any emailed |
| patches. Doing so makes it easier to review a patch, and apply it. |
| |
| * 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. |
| |
| * 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 ..' |
| |
| * By committing a patch, you are responsible for fixing problems |
| resulting from it (or backing it out). |
| |
| |
| 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. |