Changes between Version 1 and Version 2 of Guidelines/Requirements


Ignore:
Timestamp:
Feb 14, 2010, 11:55:11 AM (13 years ago)
Author:
Daniel James
Comment:

Various wiki fixes

Legend:

Unmodified
Added
Removed
Modified
  • Guidelines/Requirements

    v1 v2  
    1717library being rejected, it must meets these requirements:
    1818
    19  *  The license must meet the [#License license requirements]
    20     below. Restricted licenses like the GPL and
    21     LGPL are not acceptable.
    22  *  The copyright [#Ownership ownership] must be
    23     clear.
    24  *  The library must be generally useful and not restricted
    25     to a narrow problem domain.
    26  *  The library must meet the [#Portability portability requirements] below.
    27  *  The library must come reasonably close to meeting the
    28     [#Guidelines Guidelines] below.   
    29      * [#Design_and_Programming Design and Programming]
    30      * [#Directory_structure Directory Structure]
    31      * [#Documentation Documentation]
    32  *  The author must be willing to participate in discussions
    33     on the mailing list, and to refine the library
    34     accordingly.
     19 * The license must meet the [#License license requirements]
     20   below. Restricted licenses like the GPL and
     21   LGPL are not acceptable.
     22 * The copyright [#Ownership ownership] must be
     23   clear.
     24 * The library must be generally useful and not restricted
     25   to a narrow problem domain.
     26 * The library must meet the [#Portability portability requirements] below.
     27 * The library must come reasonably close to meeting the
     28   [#Guidelines Guidelines] below.   
     29   * [#Design_and_Programming Design and Programming]
     30   * [#Directory_structure Directory Structure]
     31   * [#Documentation Documentation]
     32 * The author must be willing to participate in discussions
     33   on the mailing list, and to refine the library
     34   accordingly.
    3535
    3636There's no requirement that an author read the mailing list
     
    5151The license requirements:
    5252
    53  *  Must be simple to read and understand.
    54  *  Must grant permission without fee to copy, use and modify
    55     the software for any use (commercial and
    56     non-commercial).
    57  *  Must require that the license appear on all copies of the
    58     software source code.
    59  *  Must not require that the license appear with executables
    60     or other binary uses of the library.
    61  *  Must not require that the source code be available for
    62     execution or other binary uses of the library.
    63  *  May restrict the use of the name and description of the
    64     library to the standard version found on the Boost web
    65     site.
     53 * Must be simple to read and understand.
     54 * Must grant permission without fee to copy, use and modify
     55   the software for any use (commercial and
     56   non-commercial).
     57 * Must require that the license appear on all copies of the
     58   software source code.
     59 * Must not require that the license appear with executables
     60   or other binary uses of the library.
     61 * Must not require that the source code be available for
     62   execution or other binary uses of the library.
     63 * May restrict the use of the name and description of the
     64   library to the standard version found on the Boost web
     65   site.
    6666
    6767=== Portability requirements === #Portability
    6868
    69  *  A library's interface must portable and not restricted to
    70     a particular compiler or operating system.
    71  *  A library's implementation must if possible be portable
    72     and not restricted to a particular compiler or operating
    73     system. If a portable implementation is not possible,
    74     non-portable constructions are acceptable if reasonably easy
    75     to port to other environments, and implementations are
    76     provided for at least two popular operating systems (such as
    77     UNIX and Windows).
    78  *  There is no requirement that a library run on C++
    79     compilers which do not conform to the ISO standard.
    80  *  There is no requirement that a library run on any
    81     particular C++ compiler. Boost contributors often try to
    82     ensure their libraries work with popular compilers. The
    83     boost/config.hpp
    84     [http://www.boost.org/doc/libs/release/libs/config/config.htm configuration header]
    85     is the preferred mechanism for working around
    86     compiler deficiencies.
     69 * A library's interface must portable and not restricted to
     70   a particular compiler or operating system.
     71 * A library's implementation must if possible be portable
     72   and not restricted to a particular compiler or operating
     73   system. If a portable implementation is not possible,
     74   non-portable constructions are acceptable if reasonably easy
     75   to port to other environments, and implementations are
     76   provided for at least two popular operating systems (such as
     77   UNIX and Windows).
     78 * There is no requirement that a library run on C++
     79   compilers which do not conform to the ISO standard.
     80 * There is no requirement that a library run on any
     81   particular C++ compiler. Boost contributors often try to
     82   ensure their libraries work with popular compilers. The
     83   boost/config.hpp
     84   [http://www.boost.org/doc/libs/release/libs/config/config.htm configuration header]
     85   is the preferred mechanism for working around
     86   compiler deficiencies.
    8787
    8888Since there is no absolute way to prove portability, many
     
    144144Read the
    145145[http://www.boost.org/development/separate_compilation.html guidelines for libraries with separate source]
    146  to see how to ensure that
    147 compiled link libraries meet user expectations.
     146to see how to ensure that compiled link libraries meet user expectations.
    148147
    149148Use the naming conventions of the C++ Standard Library (See
    150149[#Naming Naming conventions rationale]):
    151150
    152  *  Names (except as noted below) should be all lowercase,
    153     with words separated by underscores.
    154  *  Acronyms should be treated as ordinary names (e.g.
    155     `xml_parser` instead of
    156     `XML_parser`).
    157  *  Template parameter names begin with an uppercase
    158     letter.
    159  *  Macro (gasp!) names all uppercase and begin with
    160     `BOOST_`.
     151 * Names (except as noted below) should be all lowercase,
     152   with words separated by underscores.
     153 * Acronyms should be treated as ordinary names (e.g.
     154   `xml_parser` instead of
     155   `XML_parser`).
     156 * Template parameter names begin with an uppercase
     157   letter.
     158 * Macro (gasp!) names all uppercase and begin with `BOOST_`.
    161159
    162160Choose meaningful names - explicit is better than implicit,
     
    181179guidelines:
    182180
    183  *  Use fixed-width fonts. See [#code_fonts fonts rationale].
    184  *  Use spaces rather than tabs. See [#Tabs tabs rationale].
    185  *  Limit line lengths to 80 characters.
     181 * Use fixed-width fonts. See [#code_fonts fonts rationale].
     182 * Use spaces rather than tabs. See [#Tabs tabs rationale].
     183 * Limit line lengths to 80 characters.
    186184
    187185End all documentation files (HTML or otherwise) with a
     
    193191scripts, etc.) with:
    194192
    195  *  A comment line describing the contents of the file.
    196  *  Comments describing copyright and licensing: again, the
    197     preferred form is indicated in the
    198     [http://www.boost.org/users/license.html license information] page
    199  *  Note that developers should not provide a copy of
    200     `LICENSE_1_0.txt` with their libraries: Boost
    201     distributions already include a copy in the Boost root
    202     directory.
    203  *  A comment line referencing your library on the Boost web
    204     site. For example:
    205 
    206         // See http://www.boost.org/libs/foo for library home page.
    207 
    208     Where `foo` is the directory name (see below)
    209     for the library. As well as aiding users who come across a
    210     Boost file detached from its documentation, some of Boost's
    211     automatic tools depend on this comment to identify which
    212     library header files belong to.
     193 * A comment line describing the contents of the file.
     194 * Comments describing copyright and licensing: again, the
     195   preferred form is indicated in the
     196   [http://www.boost.org/users/license.html license information] page
     197 * Note that developers should not provide a copy of
     198   `LICENSE_1_0.txt` with their libraries: Boost
     199   distributions already include a copy in the Boost root
     200   directory.
     201 * A comment line referencing your library on the Boost web
     202   site. For example:
     203   {{{
     204// See http://www.boost.org/libs/foo for library home page.
     205   }}}
     206   Where `foo` is the directory name (see below)
     207   for the library. As well as aiding users who come across a
     208   Boost file detached from its documentation, some of Boost's
     209   automatic tools depend on this comment to identify which
     210   library header files belong to.
    213211
    214212Make sure your code compiles in the presence of the
     
    219217substitution:
    220218
    221  *  If you want to call `std::min()` or
    222     `std::max()`:
    223      *  If you do not require argument-dependent look-up, use
    224         `(std::min)(a,b)`.
    225      *  If you do require argument-dependent look-up, you
    226         should:
    227          *  `#include <boost/config.hpp>`
    228          *  Use `BOOST_USING_STD_MIN();` to bring
    229             `std::min()` into the current scope.
    230          *  Use `min BOOST_PREVENT_MACRO_SUBSTITUTION
    231             (a,b);` to make an argument-dependent call to
    232             `min(a,b)`.
    233  *  If you want to call
    234     `std::numeric_limits<int>::max()`, use
    235     `(std::numeric_limits<int>::max)()`
    236     instead.
    237  *  If you want to call a `min()` or
    238     `max()` member function, instead to doing
    239     `obj.min()`, use `(obj.min)()`.
    240  *  If you want to declare or define a function or a member
    241     function named `min` or `max`, then you
    242     must use the `BOOST_PREVENT_MACRO_SUBSTITUTION`
    243     macro. Instead of writing `int min() { return 0;
    244     }` you should write `int min
    245     BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; }` This
    246     is true regardless if the function is a free (namespace
    247     scope) function, a member function or a static member
    248     function, and it applies for the function declaration as well
    249     as for the function definition.
     219 * If you want to call `std::min()` or
     220   `std::max()`:
     221   * If you do not require argument-dependent look-up, use
     222     `(std::min)(a,b)`.
     223   * If you do require argument-dependent look-up, you should:
     224     * `#include <boost/config.hpp>`
     225     * Use `BOOST_USING_STD_MIN();` to bring
     226       `std::min()` into the current scope.
     227     * Use `min BOOST_PREVENT_MACRO_SUBSTITUTION
     228       (a,b);` to make an argument-dependent call to `min(a,b)`.
     229 * If you want to call
     230   `std::numeric_limits<int>::max()`, use
     231   `(std::numeric_limits<int>::max)()`
     232   instead.
     233 * If you want to call a `min()` or
     234   `max()` member function, instead to doing
     235   `obj.min()`, use `(obj.min)()`.
     236 * If you want to declare or define a function or a member
     237   function named `min` or `max`, then you
     238   must use the `BOOST_PREVENT_MACRO_SUBSTITUTION`
     239   macro. Instead of writing `int min() { return 0; }`
     240   you should write
     241   `int min BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; }`
     242   This is true regardless if the function is a free (namespace
     243   scope) function, a member function or a static member
     244   function, and it applies for the function declaration as well
     245   as for the function definition.
    250246
    251247=== Directory Structure and Filenames === #Directory_structure
     
    257253choice.
    258254
    259  *  Names must contain only
    260     '''lowercase'''^[#Filename_rationale_1 1]^ ASCII letters
    261     (`'a'`-`'z'`), numbers
    262     (`'0'`-`'9'`), underscores
    263     (`'_'`), hyphens (`'-'`), and periods
    264     (`'.'`). Spaces are not allowed^[#Filename_rationale_2 2]^.
    265  *  Directory names must not contain periods
    266     (`'.'`)^[#Filename_Rationale_3 3]^.
    267  *  The first and last character of a file name must not be a
    268     period (`'.'`)^[#Filename_rationale_4 4]^.
    269  *  The first character of names must not be a hyphen
    270     (`'-'`)^[#Filename_rationale_5 5]^.
    271  *  The maximum length of directory and file names is 31
    272     characters^[#Filename_rationale_6 6]^.
    273  *  The total path length must not exceed 207
    274     characters^[#Filename_rationale_7 7]^.
     255 * Names must contain only
     256   '''lowercase'''^[#Filename_rationale_1 1]^ ASCII letters
     257   (`'a'`-`'z'`), numbers
     258   (`'0'`-`'9'`), underscores
     259   (`'_'`), hyphens (`'-'`), and periods
     260   (`'.'`). Spaces are not allowed^[#Filename_rationale_2 2]^.
     261 * Directory names must not contain periods
     262   (`'.'`)^[#Filename_Rationale_3 3]^.
     263 * The first and last character of a file name must not be a
     264   period (`'.'`)^[#Filename_rationale_4 4]^.
     265 * The first character of names must not be a hyphen
     266   (`'-'`)^[#Filename_rationale_5 5]^.
     267 * The maximum length of directory and file names is 31
     268   characters^[#Filename_rationale_6 6]^.
     269 * The total path length must not exceed 207
     270   characters^[#Filename_rationale_7 7]^.
    275271
    276272Other conventions ease communication:
    277273
    278  *  Files intended to be processed by a C++ compiler as part
    279     of a translation unit should have '''a three-letter
    280     filename extension ending in "pp"'''. Other files
    281     should ''not'' use extensions ending in "pp". This
    282     convention makes it easy to identify all of the C++ source in
    283     Boost.
    284  *  All libraries have at their highest level a primary
    285     directory named for the particular library. See
    286     [#Naming_consistency Naming consistency]. The primary
    287     directory may have sub-directories.
    288  *  For very simple libraries implemented entirely within the
    289     library header, all files go in the primary directory (except
    290     headers, which go in the boost header directory).
     274 * Files intended to be processed by a C++ compiler as part
     275   of a translation unit should have '''a three-letter
     276   filename extension ending in "pp"'''. Other files
     277   should ''not'' use extensions ending in "pp". This
     278   convention makes it easy to identify all of the C++ source in
     279   Boost.
     280 * All libraries have at their highest level a primary
     281   directory named for the particular library. See
     282   [#Naming_consistency Naming consistency]. The primary
     283   directory may have sub-directories.
     284 * For very simple libraries implemented entirely within the
     285   library header, all files go in the primary directory (except
     286   headers, which go in the boost header directory).
    291287
    292288==== Boost standard sub-directory names ==== #subdirectory
     
    348344"nicecode".
    349345
    350  *  The library's primary directory (in parent
    351     ''boost-root/libs'') is given that same name. For
    352     example, ''boost-root/libs/filesystem''.
    353  *  The library's primary header directory (in parent
    354     ''boost-root/boost'') is given that same name. For
    355     example, ''boost-root/boost/filesystem''.
    356  *  The library's primary namespace (in parent
    357     ''::boost'') is given that same name, except when
    358     there's a component with that name (e.g.,
    359     ''boost::tuple''), in which case the namespace name is
    360     pluralized. For example, ''::boost::filesystem''.
     346 * The library's primary directory (in parent
     347   ''boost-root/libs'') is given that same name. For
     348   example, ''boost-root/libs/filesystem''.
     349 * The library's primary header directory (in parent
     350   ''boost-root/boost'') is given that same name. For
     351   example, ''boost-root/boost/filesystem''.
     352 * The library's primary namespace (in parent
     353   ''::boost'') is given that same name, except when
     354   there's a component with that name (e.g.,
     355   ''boost::tuple''), in which case the namespace name is
     356   pluralized. For example, ''::boost::filesystem''.
    361357
    362358When documenting Boost libraries, follow these conventions
    363359(see also the following section of this document):
    364360
    365  *  The library name is set in roman type.
    366  *  The library name is capitalized.
    367  *  A period between "Boost" and the library name (e.g.,
    368     Boost.Bind) is used if and only if the library name is not
    369     followed by the word "library".
    370  *  The word "library" is not part of the library name and is
    371     therefore lowercased.
     361 * The library name is set in roman type.
     362 * The library name is capitalized.
     363 * A period between "Boost" and the library name (e.g.,
     364   Boost.Bind) is used if and only if the library name is not
     365   followed by the word "library".
     366 * The word "library" is not part of the library name and is
     367   therefore lowercased.
    372368
    373369Here are a few examples of how to apply these
    374370conventions:
    375371
    376  *  Boost.Bind was written by Peter Dimov.
    377  *  The Boost Bind library was written by Peter Dimov.
    378  *  I regularly use Bind, a Boost library written by Peter Dimov.
     372 * Boost.Bind was written by Peter Dimov.
     373 * The Boost Bind library was written by Peter Dimov.
     374 * I regularly use Bind, a Boost library written by Peter Dimov.
    379375
    380376=== Documentation === #Documentation
     
    400396Appropriate topics for documentation often include:
    401397
    402  *  General introduction to the library. The introduction
    403     particularly needs to include:
    404      * A very high-level overview of what the library is
    405         good for, and perhaps what it isn't good for,
    406         understandable even by those with no prior knowledge of
    407         the problem domain.
    408      * The simplest possible ("hello world") example of
    409         using the library.
    410  *  Tutorial covering basic use cases.
    411  *  Reference documentation:
    412      * Description of each class.
    413      * Relationship between classes.
    414      * For each function, as applicable, description,
    415         requirements (preconditions), effects, post-conditions,
    416         returns, and throws.
    417      * Discussion of error detection and recovery
    418         strategy.
    419  *  How to compile and link.
    420  *  How to test.
    421  *  Version or revision history.
    422  *  Rationale for design decisions. See [#Rationale Rationale rationale].
    423  *  Acknowledgements. See [#Acknowledgements Acknowledgments rationale.]
     398 * General introduction to the library. The introduction
     399   particularly needs to include:
     400   * A very high-level overview of what the library is
     401    good for, and perhaps what it isn't good for,
     402    understandable even by those with no prior knowledge of
     403    the problem domain.
     404    * The simplest possible ("hello world") example of
     405      using the library.
     406 * Tutorial covering basic use cases.
     407 * Reference documentation:
     408   * Description of each class.
     409   * Relationship between classes.
     410   * For each function, as applicable, description,
     411     requirements (preconditions), effects, post-conditions,
     412     returns, and throws.
     413   * Discussion of error detection and recovery
     414     strategy.
     415 * How to compile and link.
     416 * How to test.
     417 * Version or revision history.
     418 * Rationale for design decisions. See [#Rationale Rationale rationale].
     419 * Acknowledgements. See [#Acknowledgements Acknowledgments rationale.]
    424420
    425421If you need more help with how to write documentation you
     
    475471summary:
    476472
    477  *  Naming conventions are contentious, and although several
    478     are widely used, no one style predominates.
    479  *  Given the intent to propose portions of boost for the
    480     next revision of the C++ standard library, boost decided to
    481     follow the standard library's conventions.
    482  *  Once a library settles on a particular convention, a vast
    483     majority of stakeholders want that style to be consistently
    484     used.
     473 * Naming conventions are contentious, and although several
     474   are widely used, no one style predominates.
     475 * Given the intent to propose portions of boost for the
     476   next revision of the C++ standard library, boost decided to
     477   follow the standard library's conventions.
     478 * Once a library settles on a particular convention, a vast
     479   majority of stakeholders want that style to be consistently
     480   used.
    485481
    486482=== Source code fonts rationale === #code_fonts
     
    511507=== Directory and File Names rationale === #FileNamesRat
    512508
    513  1. Some legacy file systems require
    514     single-case names. Single-case names eliminate casing mistakes
    515     when moving from case-insensitive to case-sensitive file
    516     systems.
    517 
    518  2. This is the lowercase portion of
    519     the POSIX portable filename character set. To quote the POSIX
    520     standard, "Filenames should be constructed from the portable
    521     filename character set because the use of other characters can
    522     be confusing or ambiguous in certain contexts."
    523 
    524  3. Strict implementations of ISO
    525     9660:1999 and some legacy operating systems prohibit dots in
    526     directory names. The need for this restriction is fading, and
    527     it will probably be removed fairly soon.
    528 
    529  4. POSIX has special rules for names
    530     beginning with a period. Windows prohibits names ending in a
    531     period.
    532 
    533  5. Would be too confusing or ambiguous in certain contexts.
    534 
    535  6. We had to draw the line
    536     somewhere, and so the limit imposed by a now obsolete Apple
    537     file system was chosen years ago. It still seems a reasonable
    538     limit to aid human comprehension.
    539 
    540  7. ISO 9660:1999.
     509{{{
     510#!html
     511<a name="Filename_rationale_1" id="Filename_rationale_1"></a>
     512}}}
     5131. Some legacy file systems require
     514single-case names. Single-case names eliminate casing mistakes
     515when moving from case-insensitive to case-sensitive file
     516systems.
     517
     518{{{
     519#!html
     520<a name="Filename_rationale_2" id="Filename_rationale_2"></a>
     521}}}
     5222. This is the lowercase portion of
     523the POSIX portable filename character set. To quote the POSIX
     524standard, "Filenames should be constructed from the portable
     525filename character set because the use of other characters can
     526be confusing or ambiguous in certain contexts."
     527
     528{{{
     529#!html
     530<a name="Filename_rationale_3" id="Filename_rationale_3"></a>
     531}}}
     5323.Strict implementations of ISO
     5339660:1999 and some legacy operating systems prohibit dots in
     534directory names. The need for this restriction is fading, and
     535it will probably be removed fairly soon.
     536
     537{{{
     538#!html
     539<a name="Filename_rationale_4" id="Filename_rationale_4"></a>
     540}}}
     5414. POSIX has special rules for names
     542beginning with a period. Windows prohibits names ending in a
     543period.
     544
     545{{{
     546#!html
     547<a name="Filename_rationale_5" id="Filename_rationale_5"></a>
     548}}}
     5495.Would be too confusing or ambiguous in certain contexts.
     550
     551{{{
     552#!html
     553<a name="Filename_rationale_6" id="Filename_rationale_6"></a>
     554}}}
     5556.We had to draw the line
     556somewhere, and so the limit imposed by a now obsolete Apple
     557file system was chosen years ago. It still seems a reasonable
     558limit to aid human comprehension.
     559
     560{{{
     561#!html
     562<a name="Filename_rationale_7" id="Filename_rationale_7"></a>
     563}}}
     5647.ISO 9660:1999.
    541565
    542566=== ECMAScript/JavaScript rationale === #JavaScript
     
    548572ECMAScript/JavaScript. Reasons given for banning included:
    549573
    550  *  Incompatible with some older browsers and some text based
    551     browsers.
    552  *  Makes printing docs pages difficult.
    553  *  Often results in really bad user interface design.
    554  *  "It's just annoying in general."
    555  *  Would require Boost to test web pages for
    556     ECMAScript/JavaScript compliance.
    557  *  Makes docs maintenance by other than the original
    558     developer more difficult.
     574 * Incompatible with some older browsers and some text based
     575   browsers.
     576 * Makes printing docs pages difficult.
     577 * Often results in really bad user interface design.
     578 * "It's just annoying in general."
     579 * Would require Boost to test web pages for
     580   ECMAScript/JavaScript compliance.
     581 * Makes docs maintenance by other than the original
     582   developer more difficult.
    559583
    560584=== Rationale rationale === #Rationale_rationale
     
    584608documentation, while minor fixes are often mentioned in
    585609comments within the code itself.
     610
     611Copyright Beman Dawes, 2003.