From 9de103f0c9b27e2942437978e8854813c55cd128 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Fri, 2 Feb 2018 15:19:04 -0500 Subject: [PATCH] doc: document documentation Signed-off-by: Quentin Young --- doc/developer/conf.py | 6 +- doc/developer/workflow.rst | 367 +++++++++++++++++++++++-------------- 2 files changed, 234 insertions(+), 139 deletions(-) diff --git a/doc/developer/conf.py b/doc/developer/conf.py index 1eac6af763..c3295f88bd 100644 --- a/doc/developer/conf.py +++ b/doc/developer/conf.py @@ -271,7 +271,7 @@ latex_elements = { # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'FRR.tex', u'FRR User Manual', + (master_doc, 'FRR.tex', u"FRR Developer's Manual", u'FRR', 'manual'), ] @@ -301,7 +301,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'frr', u'FRR User Manual', + (master_doc, 'frr', u"FRR Developer's Manual", [author], 1) ] @@ -315,7 +315,7 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'FRR', u'FRR User Manual', + (master_doc, 'FRR', u"FRR Developer's Manual", author, 'FRR', 'One line description of project.', 'Miscellaneous'), ] diff --git a/doc/developer/workflow.rst b/doc/developer/workflow.rst index 88ae7ef761..1f33a51adc 100644 --- a/doc/developer/workflow.rst +++ b/doc/developer/workflow.rst @@ -1,53 +1,21 @@ +.. _process-and-workflow: + +******************* Process & Workflow -======================== +******************* FRR is a large project developed by many different groups. This section documents standards for code style & quality, commit messages, pull requests and best practices that all contributors are asked to follow. -This section is "descriptive/post-factual" in that it documents pratices that -are in use; it is not "definitive/pre-factual" in prescribing practices. This +This chapter is "descriptive/post-factual" in that it documents pratices that +are in use; it is not "definitive/pre-factual" in prescribing practices. This means that when a procedure changes, it is agreed upon, then put into practice, and then documented here. If this document doesn't match reality, it's the document that needs to be updated, not reality. -Git Structure -------------- - -The master Git for FRR resides on `Github -`__. - -.. figure:: ../figures/git_branches.png - :align: right - :alt: merging get branches into a central trunk - - Rough outline of FRR development workflow - -There is one main branch for development, ``master``. For each major release -(2.0, 3.0 etc) a new release branch is created based on the master. Subsequent -point releases based on a major branch are marked by tagging. - -Programming language, Tools and Libraries ------------------------------------------ - -The core of FRR is written in C (gcc or clang supported) and makes -use of GNU compiler extensions. A few non-essential scripts are -implemented in Perl and Python. FRR requires the following tools -to build distribution packages: automake, autoconf, texinfo, libtool and -gawk and various libraries (i.e. libpam and libjson-c). - -If your contribution requires a new library or other tool, then please -highlight this in your description of the change. Also make sure it’s -supported by all FRR platform OSes or provide a way to build -without the library (potentially without the new feature) on the other -platforms. - -Documentation should be written in reStructuredText. Sphinx extensions may be -utilized but pure ReST is preferred where possible. See `Documentation -<#documentation>`__. - -Mailing lists -------------- +Mailing Lists +============= The FRR development group maintains multiple mailing lists for use by the community. Italicized lists are private. @@ -66,19 +34,17 @@ community. Italicized lists are private. | *Technical Steering Committee* | tsc@lists.frrouting.org | +----------------------------------+--------------------------------+ -The Development list is used to discuss and document general issues -related to project development and governance. The public Slack -instance, frrouting.slack.com, and weekly technical meetings provide a -higher bandwidth channel for discussions. The results of such -discussions must be reflected in updates, as appropriate, to code (i.e., -merges), `Github <#https://github.com/FRRouting/frr/issues`__ tracked -issues, and for governance or process changes, updates to the -Development list and either this file or information posted at -`https://frrouting.org/ <#https://frrouting.org/>`__. +The Development list is used to discuss and document general issues related to +project development and governance. The public Slack instance, +frrouting.slack.com, and weekly technical meetings provide a higher bandwidth +channel for discussions. The results of such discussions must be reflected in +updates, as appropriate, to code (i.e., merges), `Github issues`_, and for +governance or process changes, updates to the Development list and either this +file or information posted at https://frrouting.org/. Changelog -~~~~~~~~~ +========= The changelog will be the base for the release notes. A changelog entry for your changes is usually not required and will be added based on your commit @@ -86,7 +52,7 @@ messages by the maintainers. However, you are free to include an update to the changelog with some better description. Submitting Patches and Enhancements ------------------------------------ +=================================== FRR accepts patches from two sources: @@ -102,7 +68,7 @@ The base branch for new contributions and non-critical bug fixes should be submit it. Pre-submission Checklist -~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------ - Format code (see `Code Formatting <#developers-guidelines>`__) - Verify and acknowledge license (see `License for @@ -125,14 +91,14 @@ Pre-submission Checklist feature License for contributions -~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------- FRR is under a “GPLv2 or later” license. Any code submitted must be released under the same license (preferred) or any license which allows redistribution under this GPLv2 license (eg MIT License). Signing Off -~~~~~~~~~~~ +----------- Code submitted to FRR must be signed off. We have the same requirements for using the signed-off-by process as the Linux kernel. In @@ -181,7 +147,7 @@ all of the following: this project or the open source license(s) involved. What do I submit my changes against? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +------------------------------------ We've documented where we would like to have the different fixes applied at @@ -190,7 +156,7 @@ If you are unsure where your submission goes, look at that document or ask a project maintainer. Github pull requests -~~~~~~~~~~~~~~~~~~~~ +-------------------- The preferred method of submitting changes is a Github pull request. Code submitted by pull request will be automatically tested by one or @@ -200,7 +166,7 @@ resolved, your code will be merged into the branch it was submitted against. Patch submission via mailing list -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +--------------------------------- As an alternative submission method, a patch can be mailed to the development mailing list. Patches received on the mailing list will be @@ -264,11 +230,47 @@ After submitting your changes community members. - Your submission is done once it is merged to the master branch. +Git Structure +============= + +.. figure:: ../figures/git_branches.png + :align: center + :scale: 55% + :alt: Merging Git branches into a central trunk + + Rough outline of FRR development workflow + +The master Git for FRR resides on `GitHub`_. + +There is one main branch for development, ``master``. For each major release +(2.0, 3.0 etc) a new release branch is created based on the master. Subsequent +point releases based on a major branch are marked by tagging. + +Programming Languages, Tools and Libraries +========================================== + +The core of FRR is written in C (gcc or clang supported) and makes +use of GNU compiler extensions. A few non-essential scripts are +implemented in Perl and Python. FRR requires the following tools +to build distribution packages: automake, autoconf, texinfo, libtool and +gawk and various libraries (i.e. libpam and libjson-c). + +If your contribution requires a new library or other tool, then please +highlight this in your description of the change. Also make sure it’s +supported by all FRR platform OSes or provide a way to build +without the library (potentially without the new feature) on the other +platforms. + +Documentation should be written in reStructuredText. Sphinx extensions may be +utilized but pure ReST is preferred where possible. See +:ref:`documentation`. + + Coding Practices & Style ------------------------- +======================== Commit messages -~~~~~~~~~~~~~~~ +--------------- Commit messages should be formatted in the same way as Linux kernel commit messages. The format is roughly @@ -280,15 +282,15 @@ commit messages. The format is roughly extended summary ``dir`` should be the top level source directory under which the change -was made. For example, a change in bgpd/rfapi would be formatted as: +was made. For example, a change in bgpd/rfapi would be formatted as::: -``bgpd: short summary`` + bgpd: short summary The first line should be no longer than 50 characters. Subsequent lines should be wrapped to 72 characters. Source file header -~~~~~~~~~~~~~~~~~~ +------------------ New files need to have a Copyright header (see `License for contributions <#license-for-contributions>`__ above) added to the file. @@ -318,7 +320,7 @@ Preferred form of the header is as follows: #include Adding copyright claims to existing files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------------------- When adding copyright claims for modifications to an existing file, please preface the claim with "Portions: " on a line before it and @@ -332,7 +334,7 @@ your indented claim immediately after. E.g.: Copyright (C) 2016 Your name [optional brief change description] Code formatting -~~~~~~~~~~~~~~~ +--------------- FRR uses Linux kernel style except where noted below. Code which does not comply with these style guidelines will not be accepted. @@ -350,9 +352,6 @@ in patches that change actual code.** To change/fix formatting issues, please create a separate patch that only does formatting changes and nothing else. -Style documentation -^^^^^^^^^^^^^^^^^^^ - Kernel and BSD styles are documented externally: - https://www.kernel.org/doc/html/latest/process/coding-style.html @@ -370,7 +369,8 @@ Exceptions FRR project code comes from a variety of sources, so there are some stylistic exceptions in place. They are organized here by branch. -**For ``master``:** +For ``master`` +"""""""""""""" BSD coding style applies to: @@ -382,7 +382,8 @@ BSD coding style applies to: - Indents are 4 spaces - Function return types are on their own line -**For ``stable/3.0`` and ``stable/2.0``:** +For ``stable/3.0`` and ``stable/2.0`` +""""""""""""""""""""""""""""""""""""" GNU coding style apply to the following parts: @@ -400,70 +401,8 @@ BSD coding style applies to: - ``ldpd/`` -Documentation -~~~~~~~~~~~~~ - -FRR is a large and complex software project developed by many different people -over a long period of time. Without adequate documentation, it can be -exceedingly difficult to understand code segments, APIs and other interfaces. -In the interest of keeping the project healthy and maintainable, you should -make every effort to document your code so that other people can understand -what it does without needing to closely read the code itself. - -Some specific guidelines that contributors should follow are: - -- Functions exposed in header files should have descriptive comments - above their signatures in the header file. At a minimum, a function - comment should contain information about the return value, - parameters, and a general summary of the function's purpose. - Documentation on parameter values can be omitted if it is (very) - obvious what they are used for. - -Function comments must follow the style for multiline comments laid out -in the kernel style guide. - -Example: - -:: - - /* - * Determines whether or not a string is cool. - * - * @param text - the string to check for coolness - * @param is_clccfc - whether capslock is cruise control for cool - * @return 7 if the text is cool, 0 otherwise - */ - int check_coolness(const char *text, bool is_clccfc); - -The Javadoc-style annotations are not required, but you should still -strive to make it equally clear what parameters and return values are -used for. - -- Static functions should have descriptive comments in the same form as - above if what they do is not immediately obvious. Use good - engineering judgement when deciding whether a comment is necessary. - If you are unsure, document your code. - -- Global variables, static or not, should have a comment describing - their use. - -- **For new code in ``lib/``, these guidelines are hard requirements.** - -If you are contributing code that adds significant user-visible -functionality please document it in ``doc/``. If you make significant changes -to portions of the codebase covered in the Developer's Manual, please -update the relevant sections. If you add a major feature or introduce a new -API, please document the architecture and API to the best of your abilities in -the Developer's Manual. - -Documentation should be in reStructuredText. - -Finally, if you come across some code that is undocumented and feel like -going above and beyond, document it! We absolutely appreciate and accept -patches that document previously undocumented code. - Compile-time conditional code -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------- Many users access FRR via binary packages from 3rd party sources; compile-time code puts inclusion/exclusion in the hands of the package @@ -495,7 +434,7 @@ Note that the former approach requires ensuring that ``SOME_SYMBOL`` will be defined (watch your ``AC_DEFINE``\ s). Debug-guards in code -~~~~~~~~~~~~~~~~~~~~ +-------------------- Debugging statements are an important methodology to allow developers to fix issues found in the code after it has been released. The caveat here @@ -507,7 +446,7 @@ CLI and it is expected that the developer will use this convention to allow control of their debugs. CLI changes -~~~~~~~~~~~ +----------- CLI's are a complicated ugly beast. Additions or changes to the CLI should use a DEFUN to encapsulate one setting as much as is possible. @@ -515,7 +454,7 @@ Additionally as new DEFUN's are added to the system, documentation should be provided for the new commands. Backwards Compatibility -~~~~~~~~~~~~~~~~~~~~~~~ +----------------------- As a general principle, changes to CLI and code in the lib/ directory should be made in a backwards compatible fashion. This means that @@ -551,7 +490,163 @@ pointing to the appropriate update path. A ``-Werror`` build should fail if compatibility bits are used. Miscellaneous -~~~~~~~~~~~~~ +------------- When in doubt, follow the guidelines in the Linux kernel style guide, or ask on the development mailing list / public Slack instance. + + +.. _documentation: + +Documentation +============= + +FRR uses Sphinx+RST as its documentation system. The document you are currently +reading was generated by Sphinx from RST source in +:file:`doc/developer/workflow.rst`. The documentation is structured as follows: + ++-----------------------+--------------------------------------------------------------+ +| Directory | Contents | ++=======================+==============================================================+ +| :file:`doc/user` | User documentation; configuration guides; protocol overviews | ++-----------------------+--------------------------------------------------------------+ +| :file:`doc/developer` | Developer's documentation; API specs; datastructures; | +| | architecture overviews; project management procedure | ++-----------------------+--------------------------------------------------------------+ +| :file:`doc/manpages` | Source for manpages | ++-----------------------+--------------------------------------------------------------+ +| :file:`doc/figures` | Images and diagrams | ++-----------------------+--------------------------------------------------------------+ + +Each of these directories, with the exception of :file:`doc/figures`, contains +a Sphinx-generated Makefile and configuration script :file:`conf.py` used to +set various document parameters. The makefile can be used for a variety of +targets; invoke `make help` in any of these directories for a listing of +available output formats. For convenience, there is a top-level +:file:`Makefile.am` that has targets for PDF and HTML documentation for both +developer and user documentation, respectively. That makefile is also +responsible for building manual pages packed with distribution builds. + +Indent and styling should follow existing conventions: + +- 3 spaces for indents under directives +- Cross references may contain only lowercase alphanumeric characters and + hyphens ('-') +- Lines wrapped to 80 characters where possible + +Characters for header levels should follow Python documentation guide: + +- ``#`` with overline, for parts +- ``*`` with overline, for chapters +- ``=``, for sections +- ``-``, for subsections +- ``^``, for subsubsections +- ``"``, for paragraphs + +After you have made your changes, please make sure that you can invoke +``make latexpdf`` and ``make html`` with no warnings. + +The documentation is currently incomplete and needs love. If you find a broken +cross-reference, figure, dead hyperlink, style issue or any other nastiness we +gladly accept documentation patches. + +Code +---- + +FRR is a large and complex software project developed by many different people +over a long period of time. Without adequate documentation, it can be +exceedingly difficult to understand code segments, APIs and other interfaces. +In the interest of keeping the project healthy and maintainable, you should +make every effort to document your code so that other people can understand +what it does without needing to closely read the code itself. + +Some specific guidelines that contributors should follow are: + +- Functions exposed in header files should have descriptive comments above + their signatures in the header file. At a minimum, a function comment should + contain information about the return value, parameters, and a general summary + of the function's purpose. Documentation on parameter values can be omitted + if it is (very) obvious what they are used for. + + Function comments must follow the style for multiline comments laid out in + the kernel style guide. + + Example: + + .. code-block:: c + + /* + * Determines whether or not a string is cool. + * + * @param text - the string to check for coolness + * @param is_clccfc - whether capslock is cruise control for cool + * @return 7 if the text is cool, 0 otherwise + */ + int check_coolness(const char *text, bool is_clccfc); + + The Javadoc-style annotations are not required, but you should still strive + to make it equally clear what parameters and return values are used for. + +- Static functions should have descriptive comments in the same form as above + if what they do is not immediately obvious. Use good engineering judgement + when deciding whether a comment is necessary. If you are unsure, document + your code. +- Global variables, static or not, should have a comment describing their use. +- **For new code in lib/, these guidelines are hard requirements.** + +If you make significant changes to portions of the codebase covered in the +Developer's Manual, add a major subsystem or feature, or gain arcane mastery of +some undocumented or poorly documented part of the codebase, please document +your work so others can benefit. If you add a major feature or introduce a new +API, please document the architecture and API to the best of your abilities in +the Developer's Manual, using good judgement when choosing where to place it. + +Finally, if you come across some code that is undocumented and feel like +going above and beyond, document it! We absolutely appreciate and accept +patches that document previously undocumented code. + +User +---- + +If you are contributing code that adds significant user-visible functionality +please document how to use it in :file:`doc/user`. Use good judgement when +choosing where to place documentation. For example, instructions on how to use +your implementation of a new BGP draft should go in the BGP chapter instead of +being its own chapter. If you are adding a new protocol daemon, please create a +new chapter. + +When documenting CLI please use a combination of the ``.. index::`` and +``.. clicmd::`` directives. For example, the command :clicmd:`show pony` would +be documented as follows: + +.. code-block:: rest + + .. index:: show pony + .. clicmd:: show pony + + Prints an ASCII pony. Example output::: + + >>\. + /_ )`. + / _)`^)`. _.---. _ + (_,' \ `^-)"" `.\ + | | \ + \ / | + / \ /.___.'\ (\ (_ + < ,"|| \ |`. \`-' + \\ () )| )/ + hjw |_>|> /_] // + /_] /_] + +When documented this way, CLI commands can be cross referenced with the +``:clicmd:`` inline markup like so: + +.. code-block:: rest + + :clicmd:`show pony` + +This is very helpful for users who want to quickly remind themselves what a +particular command does. + +.. _GitHub: https://github.com/frrouting/frr +.. _GitHub issues: https://github.com/frrouting/frr/issues -- 2.39.5