lib_guide.htm 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  4. <title>Boost Library Requirements and Guidelines</title>
  5. <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
  6. <meta name="ProgId" content="FrontPage.Editor.Document">
  7. <meta name="Microsoft Border" content="none, default">
  8. </head>
  9. <body bgcolor="#FFFFFF" text="#000000">
  10. <table border="1" bgcolor="#007F7F" cellpadding="2">
  11. <tr>
  12. <td bgcolor="#FFFFFF"><img src="../c++boost.gif" alt="c++boost.gif (8819 bytes)" width="277" height="86"></td>
  13. <td><a href="../index.htm"><font face="Arial" color="#FFFFFF"><big>Home</big></font></a></td>
  14. <td><a href="../libs/libraries.htm"><font face="Arial" color="#FFFFFF"><big>Libraries</big></font></a></td>
  15. <td><a href="../people/people.htm"><font face="Arial" color="#FFFFFF"><big>People</big></font></a></td>
  16. <td><a href="faq.htm"><font face="Arial" color="#FFFFFF"><big>FAQ</big></font></a></td>
  17. <td><a href="index.htm"><font face="Arial" color="#FFFFFF"><big>More</big></font></a></td>
  18. </tr>
  19. </table>
  20. <h1 align="left">Boost Library Requirements and Guidelines</h1>
  21. <p align="left">This page describes requirements and guidelines for the content
  22. of a library submitted to Boost.</p>
  23. <p align="left">See the <a href="submission_process.htm">Boost Library
  24. Submission Process</a> page for a description of the process involved.</p>
  25. <h2 align="left">Requirements</h2>
  26. <p>To avoid the frustration and wasted time of a proposed library being
  27. rejected, it must meets these requirements:</p>
  28. <ul>
  29. <li>The license must meet the <a href="#License">license requirements</a>
  30. below. Restricted licenses like the GPL and LGPL are not acceptable.
  31. </li>
  32. <li>The
  33. copyright <a href="#Ownership">ownership</a> must be clear.
  34. </li>
  35. <li>The library must be generally useful and not restricted to a narrow
  36. problem domain.
  37. </li>
  38. <li>The library must meet the <a href="#Portability">portability requirements</a>
  39. below.&nbsp;
  40. </li>
  41. <li>The library must come reasonably close to meeting the <a href="#Guidelines">Guidelines</a>
  42. below.
  43. <ul>
  44. <li><a href="#Design and Programming">Design and Programming</a></li>
  45. <li><a href="#Directory structure">Directory Structure</a></li>
  46. <li><a href="#Documentation">Documentation</a></li>
  47. </ul>
  48. </li>
  49. <li>The author must be willing to participate in discussions on the mailing
  50. list, and to refine the library accordingly.</li>
  51. </ul>
  52. <p>There's no requirement that an author read the mailing list for a time before
  53. making a submission. It has been noted, however, that submissions which begin
  54. &quot;I just started to read this mailing list ...&quot; seem to fail, often
  55. embarrassingly.</p>
  56. <h3 align="left"><a name="License">License</a> requirements</h3>
  57. <ul>
  58. <li>Must be simple to read and understand.
  59. </li>
  60. <li>Must grant permission to copy, use and modify the software for any use
  61. (commercial and non-commercial) for no fee.
  62. </li>
  63. <li>Must require that the license appear on all copies of the software source
  64. code.
  65. </li>
  66. <li>Must not require that the license appear with executables or other binary
  67. uses of the library.
  68. </li>
  69. <li>Must not require that the source code be
  70. available for execution or other binary uses of the library.
  71. </li>
  72. <li>May restrict the use of the name and description of the library to the
  73. standard version found on the Boost web site.</li>
  74. </ul>
  75. <h3 align="left"><a name="Portability">Portability</a> requirements</h3>
  76. <ul>
  77. <li>
  78. <p align="left">A library's interface must portable and not restricted to a
  79. particular compiler or operating system.
  80. </li>
  81. <li>
  82. <p align="left">A library's implementation must if possible be portable and
  83. not restricted to a particular compiler or operating system.&nbsp; If a
  84. portable implementation is not possible, non-portable constructions are
  85. acceptable if reasonably easy to port to other environments.
  86. </li>
  87. <li>
  88. <p align="left">There is no requirement that a library run on C++ compilers
  89. which do not conform to the ISO standard.&nbsp;
  90. </li>
  91. <li>
  92. <p align="left">There is no requirement that a library run on any particular
  93. C++ compiler.&nbsp; Boost contributors often try to ensure their libraries
  94. work with popular compilers.&nbsp; The boost/config.hpp <a href="../libs/config/index.htm">configuration
  95. header</a> is the preferred mechanism for working around compiler
  96. deficiencies.</li>
  97. </ul>
  98. <p align="left">Since there is no absolute way to prove portability, many boost
  99. submissions demonstrate practical portability by compiling and executing
  100. correctly with two different C++ compilers, often under different operating
  101. systems.&nbsp; Otherwise reviewers may disbelieve that porting is in fact
  102. practical.</p>
  103. <h3 align="left"><a name="Ownership">Ownership</a></h3>
  104. <p align="left">Are you sure you own the library you are thinking of
  105. submitting?&nbsp;&nbsp; &quot;How to Copyright Software&quot; by MJ Salone, Nolo
  106. Press, 1990 says:</p>
  107. <blockquote>
  108. <p align="left">Doing work on your own time that is very similar to
  109. programming you do for your employer on company time can raise nasty legal
  110. problems.&nbsp; In this situation, it's best to get a written release from
  111. your employer in advance.</p>
  112. </blockquote>
  113. <p align="left">Place a copyright notice in all the important files you submit.
  114. Boost.org won't accept libraries without clear copyright information.</p>
  115. <h2 align="left"><a name="Guidelines">Guidelines</a></h2>
  116. <p align="left">Please use these guidelines as a checklist for preparing the
  117. content a library submission.&nbsp; Not every guideline applies to every
  118. library, but a reasonable effort to comply is expected.</p>
  119. <h3><a name="Design and Programming">Design and Programming</a></h3>
  120. <ul>
  121. <li>Aim for ISO Standard C++. Than means making effective use of the standard
  122. features of the language, and avoiding non-standard compiler extensions. It
  123. also means using the C++ Standard Library where applicable.</li>
  124. </ul>
  125. <ul>
  126. <li>Headers should be good neighbors. See the <a href="header.htm">header
  127. policy</a>.</li>
  128. </ul>
  129. <ul>
  130. <li>Follow quality programming practices. See, for example, &quot;Effective
  131. C++&quot; 2nd Edition, and &quot;More Effective C++&quot;, both by Scott
  132. Meyers, published by Addison Wesley.</li>
  133. </ul>
  134. <ul>
  135. <li>Use the C++ Standard Library or other Boost libraries, but only when the
  136. benefits outweigh the costs.&nbsp; Do not use libraries other than the C++
  137. Standard Library or Boost. See <a href="library_reuse.htm">Library reuse</a>.</li>
  138. </ul>
  139. <ul>
  140. <li>Read <a href="imp_vars.htm">Implementation Variation</a> to see how to
  141. supply performance, platform, or other implementation variations.</li>
  142. </ul>
  143. <ul>
  144. <li>Use the lowercase/underscore <a href="#Naming">naming conventions</a> of
  145. the C++ standard library.&nbsp; Template parameter names begin with an
  146. uppercase letter. Macro (gasp!) names should be all uppercase and begin with
  147. BOOST_.</li>
  148. </ul>
  149. <ul>
  150. <li>Choose meaningful names - explicit is better than implicit, and readability counts.
  151. There is a strong preference for clear and descriptive names, even if
  152. lengthy.</li>
  153. </ul>
  154. <ul>
  155. <li>Use exceptions to report errors where appropriate, and write code that is
  156. safe in the face of exceptions.</li>
  157. </ul>
  158. <ul>
  159. <li>Avoid exception-specifications. See <a href="#Exception-specification">exception-specification
  160. rationale</a>.</li>
  161. </ul>
  162. <ul>
  163. <li>Provide sample programs or confidence tests so potential users can see how
  164. to use your library.</li>
  165. </ul>
  166. <ul>
  167. <li>Provide a regression test program or programs which follow the <a href="test_policy.htm">Test
  168. Policies and Protocols</a>.</li>
  169. </ul>
  170. <ul>
  171. <li>Although some boost members use proportional fonts, tabs, and unrestricted
  172. line lengths in their own code, boost's widely distributed source code
  173. should follow more conservative guidelines:
  174. <ul>
  175. <li>Use fixed-width fonts.&nbsp; See <a href="#code fonts">fonts rationale</a>.</li>
  176. <li>Use spaces rather than tabs.</li>
  177. <li>Limit line lengths to 80 characters.</li>
  178. </ul>
  179. </li>
  180. </ul>
  181. <ul>
  182. <li>Begin all source files with:
  183. <ul>
  184. <li>A comment line describing the contents of the file.</li>
  185. <li>Comments describing copyright and licensing.</li>
  186. <li>A comment line referencing the Boost home page in the form:<br>
  187. <code>// See http://www.boost.org for updates, documentation, and
  188. revision history.</code><br>
  189. [Including revision history in source files is no longer recommended;
  190. the publicly available CVS repository better serves that purpose.]</li>
  191. </ul>
  192. </li>
  193. </ul>
  194. <h3><a name="Directory structure">Directory Structure</a></h3>
  195. <ul>
  196. <li>All libraries have at their highest level a primary directory named for
  197. the particular library. The primary directory may have sub-directories.</li>
  198. <li>For very simple libraries implemented entirely within the library header,
  199. all files go in the primary directory (except headers, which go in the boost
  200. header directory).</li>
  201. </ul>
  202. <blockquote>
  203. <p><b>Boost standard sub-directory names</b></p>
  204. <table border="1" cellpadding="5">
  205. <tr>
  206. <td><b>Sub-directory</b></td>
  207. <td><b>Contents</b></td>
  208. <td><b>Required</b></td>
  209. </tr>
  210. <tr>
  211. <td><code>build</code></td>
  212. <td>Library build files such as make files or IDE project files.</td>
  213. <td>If any build files.</td>
  214. </tr>
  215. <tr>
  216. <td>doc</td>
  217. <td>Documentation (HTML) files.</td>
  218. <td>If several doc files.</td>
  219. </tr>
  220. <tr>
  221. <td><code>example</code></td>
  222. <td>Sample program files.</td>
  223. <td>If several sample files.</td>
  224. </tr>
  225. <tr>
  226. <td><code>src</code></td>
  227. <td>Source files which must be compiled to build the library.&nbsp;</td>
  228. <td>If any source files.</td>
  229. </tr>
  230. <tr>
  231. <td><code>test</code></td>
  232. <td>Regression or other test programs or scripts.</td>
  233. <td>If several test files.</td>
  234. </tr>
  235. </table>
  236. </blockquote>
  237. <h3><a name="Documentation">Documentation</a></h3>
  238. <p>Even the simplest library needs some documentation; the amount should be
  239. proportional to the need.&nbsp; The documentation should assume the readers have
  240. a basic knowledge of C++, but are not necessarily experts.</p>
  241. <p>The format for documentation should be HTML, and should not require an
  242. advanced browser or server-side extensions.</p>
  243. <p>There is no single right way to do documentation. HTML documentation is often
  244. organized quite differently from traditional printed documents. Task-oriented
  245. styles differ from reference oriented styles. In the end, it comes down to the
  246. question: Is the documentation sufficient for the mythical &quot;average&quot;
  247. C++ programmer to use the library successfully?</p>
  248. <p>Appropriate topics for documentation often include:
  249. <ul>
  250. <li>General introduction to the library.</li>
  251. <li>Description of each class.</li>
  252. <li>Relationship between classes.</li>
  253. <li>For each function, as applicable, description, requirements
  254. (preconditions), effects, post-conditions, returns, and throws.</li>
  255. <li>Discussion of error detection and recovery strategy.</li>
  256. <li>How to use including description of typical uses.</li>
  257. <li>How to compile and link.</li>
  258. <li>How to test.</li>
  259. <li>Version or revision history.</li>
  260. <li>Rationale for design decisions.&nbsp; See <a href="#Rationale">Rationale
  261. rationale</a>.</li>
  262. <li>Acknowledgements.&nbsp; See <a href="#Acknowledgements">Acknowledgments
  263. rationale.</a></li>
  264. </ul>
  265. <h2>Rationale</h2>
  266. <p>Rationale for some of the requirements and guidelines follows.</p>
  267. <hr>
  268. <h3><a name="Exception-specification">Exception-specification</a> rationale</h3>
  269. <p>Exception specifications [ISO 15.4] are sometimes coded to indicate what
  270. exceptions may be thrown, or because the programmer hopes they will improved
  271. performance.&nbsp; But consider the follow member from a smart pointer:</p>
  272. <pre> T&amp; operator*() const throw() { return *ptr; }</pre>
  273. <p>This function calls no other functions; it only manipulates fundamental data
  274. types like pointers Therefore, no runtime behavior of the
  275. exception-specification can ever be invoked.&nbsp; The function is completely
  276. exposed to the compiler; indeed it is declared inline Therefore, a smart
  277. compiler can easily deduce that the functions are incapable of throwing
  278. exceptions, and make the same optimizations it would have made based on the
  279. empty exception-specification. A &quot;dumb&quot; compiler, however, may make
  280. all kinds of pessimizations.</p>
  281. <p>For example, some compilers turn off inlining if there is an
  282. exception-specification.&nbsp; Some compilers add try/catch blocks. Such
  283. pessimizations can be a performance disaster which makes the code unusable in
  284. practical applications.</p>
  285. <p>Although initially appealing, an exception-specification tends to have
  286. consequences that require <b>very</b> careful thought to understand. The biggest
  287. problem with exception-specifications is that programmers use them as though
  288. they have the effect the programmer would like, instead of the effect they
  289. actually have.</p>
  290. <p>A non-inline function is the one place a &quot;throws nothing&quot;
  291. exception-specification may have some benefit with some compilers.</p>
  292. <hr>
  293. <h3><a name="Naming">Naming</a> conventions rationale</h3>
  294. <p>The C++ standard committee's Library Working Group discussed this issue in
  295. detail, and over a long period of time. The discussion was repeated again in
  296. early boost postings. A short summary:</p>
  297. <ul>
  298. <li>Naming conventions are contentious, and although several are widely used,
  299. no one style predominates.
  300. </li>
  301. <li>Given the intent to propose portions of boost for the next revision of the
  302. C++ standard library, boost decided to follow the standard library's
  303. conventions.
  304. </li>
  305. <li>Once a library settles on a particular convention, a vast majority of
  306. stakeholders want that style to be consistently used.
  307. </li>
  308. </ul>
  309. <hr>
  310. <h3>Source <a name="code fonts">code fonts</a> rationale</h3>
  311. <p>Dave Abrahams comments: An important purpose (I daresay the primary purpose)
  312. of source code is communication: the documentation of intent. This is a doubly
  313. important goal for boost, I think. Using a fixed-width font allows us to
  314. communicate with more people, in more ways (diagrams are possible) right there
  315. in the source. Code written for fixed-width fonts using spaces will read
  316. reasonably well when viewed with a variable-width font, and as far as I can tell
  317. every editor supporting variable-width fonts also supports fixed width. I don't
  318. think the converse is true.</p>
  319. <hr>
  320. <h3><a name="Rationale">Rationale</a> rationale</h3>
  321. <p>Rationale is defined as &quot;The fundamental reasons for something;
  322. basis.&quot; by the American Heritage Dictionary.</p>
  323. <p>Beman Dawes comments:&nbsp; Failure to supply contemporaneous rationale for
  324. design decisions is a major defect in many software projects. Lack of accurate
  325. rationale causes issues to revisited endlessly, causes maintenance bugs when a
  326. maintainer changes something without realizing it was done a certain way for
  327. some purpose, and shortens the useful lifetime of software.</p>
  328. <p>Rationale is fairly easy to provide at the time decisions are made, but very
  329. hard to accurately recover even a short time later.</p>
  330. <hr>
  331. <h3><a name="Acknowledgements">Acknowledgements</a> rationale</h3>
  332. <p>As a library matures, it almost always accumulates improvements suggested to
  333. the authors by other boost members.&nbsp; It is a part of the culture of
  334. boost.org to acknowledge such contributions, identifying the person making the
  335. suggestion.&nbsp; Major contributions are usually acknowledged in the
  336. documentation, while minor fixes are often mentioned in comments within the code
  337. itself.</p>
  338. <hr>
  339. <p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->06 February, 2001<!--webbot bot="Timestamp" endspan i-checksum="40406" --></p>
  340. </body>
  341. </html>
粤ICP备19079148号