Blame view

3rdparty/boost_1_81_0/libs/config/doc/guidelines.qbk 9.73 KB
977ed18d   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  [/
      Boost.Config
  
      Copyright (c) 2001 Beman Dawes
      Copyright (c) 2001 Vesa Karvonen
      Copyright (c) 2001 John Maddock
  
      Distributed under the Boost Software License, Version 1.0.
      (See accompanying file LICENSE_1_0.txt or copy at
      http://www.boost.org/LICENSE_1_0.txt)
  ]
  
  
  
  [section Guidelines for Boost Authors]
  
  The __BOOST_CONFIG_HEADER__ header is used to pass configuration information
  to other boost files, allowing them to cope with platform dependencies such
  as arithmetic byte ordering, compiler pragmas, or compiler shortcomings.
  Without such configuration information, many current compilers would not work
  with the Boost libraries.
  
  Centralizing configuration information in this header reduces the number of
  files that must be modified when porting libraries to new platforms, or when
  compilers are updated. Ideally, no other files would have to be modified when
  porting to a new platform.
  
  Configuration headers are controversial because some view them as condoning
  broken compilers and encouraging non-standard subsets. Adding settings for
  additional platforms and maintaining existing settings can also be a problem.
  In other words, configuration headers are a necessary evil rather than a
  desirable feature. The boost config.hpp policy is designed to minimize the
  problems and maximize the benefits of a configuration header.
  
  Note that:
  
  * Boost library implementers are not required to "`#include <boost/config.hpp>`",
  and are not required in any way to support compilers that do not comply
  with the C++ Standard (ISO/IEC 14882). 
  * If a library implementer wishes to support some non-conforming compiler,
  or to support some platform specific feature, "`#include <boost/config.hpp>`"
  is the preferred way to obtain configuration information not available from
  the standard headers such as `<climits>`, etc.
  * If configuration information can be deduced from standard headers such as
  `<climits>`, use those standard headers rather than `<boost/config.hpp>`.
  * Boost files that use macros defined in `<boost/config.hpp>` should have
  sensible, standard conforming, default behavior if the macro is not defined.
  This means that the starting point for porting `<boost/config.hpp>` to a new
  platform is simply to define nothing at all specific to that platform. In
  the rare case where there is no sensible default behavior, an #error message
  should describe the problem.
  * If a Boost library implementer wants something added to `config.hpp`, post
  a request on the Boost mailing list. There is no guarantee such a request
  will be honored; the intent is to limit the complexity of config.hpp.
  * The intent is to support only compilers which appear on their way to
  becoming C++ Standard compliant, and only recent releases of those compilers
  at that.
  * The intent is not to disable mainstream features now well-supported by the
  majority of compilers, such as namespaces, exceptions, RTTI, or templates.
  
  
  [section:warnings Disabling Compiler Warnings]
  
  The header `<boost/config/warning_disable.hpp>` can be used to disable
  certain compiler warnings that are hard or impossible to otherwise remove.
  
  Note that:
  
  * This header [*['should never be included by another Boost header]], it should
  only ever be used by a library source file or a test case.
  * The header should be included [*['before you include any other header]].
  * This header only disables warnings that are hard or impossible to otherwise
   deal with, and which are typically emitted by one compiler only, or
   in one compilers own standard library headers.
   
  Currently it disables the following warnings:
  
  [table
  [[Compiler][Warning]]
  [[Visual C++ 8 and later][[@http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx C4996]: Error 'function': was declared deprecated]]
  [[Intel C++][Warning 1786: relates to the use of "deprecated" standard 
     library functions rather like C4996 in Visual C++.]]
  ]
  
  [endsect]
  
  
  [section Adding New Defect Macros]
  
  When you need to add a new defect macro - either to fix a problem with an
  existing library, or when adding a new library - distil the issue down to
  a simple test case; often, at this point other (possibly better) workarounds
  may become apparent. Secondly always post the test case code to the boost
  mailing list and invite comments; remember that C++ is complex and that
  sometimes what may appear a defect, may in fact turn out to be a problem
  with the authors understanding of the standard.
  
  When you name the macro, follow the `BOOST_NO_`['SOMETHING] naming
  convention, so that it's obvious that this is a macro reporting a defect.
  
  Finally, add the test program to the regression tests. You will need to
  place the test case in a `.ipp` file with the following comments near the top:
  
      //  MACRO:         BOOST_NO_FOO
      //  TITLE:         foo
      //  DESCRIPTION:   If the compiler fails to support foo
  
  These comments are processed by the autoconf script, so make sure the format
  follows the one given. The file should be named "`boost_no_foo.ipp`", where foo
  is the defect description - try and keep the file name under the Mac 30 character
  filename limit though. You will also need to provide a function prototype
  "`int test()`" that is declared in a namespace with the same name as the macro,
  but in all lower case, and which returns zero on success:
  
  
      namespace boost_no_foo {
      int test()
      {
          // test code goes here:
          //
          return 0;
      }
  
      }
  
  Once the test code is in place in libs/config/test, updating the configuration
  test system proceeds as:
  
  * cd into `libs/config/tools` and run `bjam`. This generates the `.cpp`
  file test cases from the `.ipp` file, updates the 
  libs/config/test/all/Jamfile.v2, `config_test.cpp` and `config_info.cpp`.[br][br]
  
  * cd into `libs/config/test/all` and run `bjam `['MACRONAME` compiler-list`], where
  ['MACRONAME] is the name of the new macro, and ['`compiler-list`] is a space separated list of
  compilers to test with.[br][br]
  The xxx_pass_test and the xxx_fail_test [*should both report `**passed**`].[br][br]
  If ['MACRONAME] is not defined when it should be defined, xxx_pass_test will not report `**passed**`.
  If ['MACRONAME] is defined when it should not be defined, xxx_fail_test will not report `**passed**`.[br][br] 
  
  * cd into `libs/config/test` and run `bjam config_info config_test `['`compiler-list`].
  `config_info` should build and run cleanly for all the compilers in ['`compiler-list`]
  while `config_test` should fail for those that have the defect, and pass for those
  that do not.
  
  Then you should:
  
  * Define the defect macro in those config headers that require it.
  * Document the macro in this documentation (please do not forget this step!!)
  * Commit everything.
  * Keep an eye on the regression tests for new failures in Boost.Config caused by
  the addition.
  * Start using the macro.
  
  [endsect]
  
  [section Adding New Feature Test Macros]
  
  When you need to add a macro that describes a feature that the standard does
  not require, follow the convention for adding a new defect macro (above), but
  call the macro `BOOST_HAS_FOO`, and name the test file "`boost_has_foo.ipp`".
  Try not to add feature test macros unnecessarily, if there is a platform
  specific macro that can already be used (for example `_WIN32`, `__BEOS__`, or
  `__linux__`) to identify the feature then use that. Try to keep the macro to a
  feature group, or header name, rather than one specific API (for example
  `BOOST_HAS_NL_TYPES_H` rather than `BOOST_HAS_CATOPEN`). If the macro
  describes a POSIX feature group, then add boilerplate code to
  __BOOST_CONFIG_SUFFIX_HEADER__ to auto-detect the feature where possible
  (if you are wondering why we can't use POSIX feature test macro directly,
  remember that many of these features can be added by third party libraries,
  and are not therefore identified inside `<unistd.h>`).
  
  [endsect]
  
  [section Modifying the Boost Configuration Headers]
  
  The aim of boost's configuration setup is that the configuration headers should
  be relatively stable - a boost user should not have to recompile their code
  just because the configuration for some compiler that they're not interested
  in has changed. Separating the configuration into separate compiler/standard
  library/platform sections provides for part of this stability, but boost
  authors require some amount of restraint as well, in particular:
  
  __BOOST_CONFIG_HEADER__ should never change, don't alter this file.
  
  __BOOST_CONFIG_USER_HEADER__ is included by default, don't add extra code to
  this file unless you have to. If you do, please remember to update
  [@../../tools/configure.in libs/config/tools/configure.in] as well.
  
  __BOOST_CONFIG_SUFFIX_HEADER__ is always included so be careful about
  modifying this file as it breaks dependencies for everyone. This file should
  include only "boilerplate" configuration code, and generally should change
  only when new macros are added.
  
  [@../../../../boost/config/detail/select_compiler_config.hpp <boost/config/detail/select_compiler_config.hpp>],
  [@../../../../boost/config/detail/select_platform_config.hpp <boost/config/detail/select_platform_config.hpp>] and
  [@../../../../boost/config/detail/select_stdlib_config.hpp <boost/config/detail/select_stdlib_config.hpp>]
  are included by default and should change only if support for a new
  compiler/standard library/platform is added.
  
  The compiler/platform/standard library selection code is set up so that unknown
  platforms are ignored and assumed to be fully standards compliant - this gives
  unknown platforms a "sporting chance" of working "as is" even without running
  the configure script.
  
  When adding or modifying the individual mini-configs, assume that future, as
  yet unreleased versions of compilers, have all the defects of the current
  version. Although this is perhaps unnecessarily pessimistic, it cuts down on
  the maintenance of these files, and experience suggests that pessimism is
  better placed than optimism here!
  
  [endsect]
  
  [endsect]