]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/python/doc/building.qbk
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / python / doc / building.qbk
CommitLineData
7c673cae
FG
1[chapter Building and Testing
2 [quickbook 1.7]
3 [authors [Abrahams, David]]
4 [copyright 2002 - 2015 David Abrahams, Stefan Seefeld]
5 [id building]
6]
7[/ Copyright David Abrahams 2006. Distributed under the Boost
8 / Software License, Version 1.0. (See accompanying
9 / file LICENSE_1_0.txt or copy at
10 / http://www.boost.org/LICENSE_1_0.txt)
11 /]
12
13[section Requirements]
14
15Boost.Python requires [@http://www.python.org/2.2 Python 2.2]
16[footnote Note that although we tested earlier versions of Boost.Python
17 with Python 2.2, and we don't *think* we've done anything to break
18 compatibility, this release of Boost.Python may not have been tested
19 with versions of Python earlier than 2.4, so we're not 100% sure that
20 python 2.2 and 2.3 are supported.] *or* [@http://www.python.org newer].
21
22[endsect]
23[section Background]
24
25There are two basic models for combining C++ and Python:
26
27* [@http://www.python.org/doc/current/ext/intro.html extending],
28 in which the end-user launches the Python interpreter
29 executable and imports Python “extension modules” written in C++.
30 Think of taking a library written in C++ and giving it a Python
31 interface so Python programmers can use it. From Python, these
32 modules look just like regular Python modules.
33
34* [@http://www.python.org/doc/current/ext/embedding.html embedding],
35 in which the end-user launches a program written
36 in C++ that in turn invokes the Python interpreter as a library
37 subroutine. Think of adding scriptability to an existing
38 application.
39
40The key distinction between extending and embedding is the location
41of the C++ `main()` function: in the Python interpreter executable,
42or in some other program, respectively. Note that even when
43embedding Python in another program, [@http://www.python.org/doc/current/ext/extending-with-embedding.html extension modules are often
44the best way to make C/C++ functionality accessible to Python
45code], so the use of extension modules is really at the heart of
46both models.
47
48Except in rare cases, extension modules are built as
49dynamically-loaded libraries with a single entry point, which means
50you can change them without rebuilding either the other extension
51modules or the executable containing `main()`.
52
53[endsect]
54[section No-Install Quickstart]
55
56There is no need to “install Boost” in order to get started using
57Boost.Python. These instructions use _bb_ projects,
58which will build those binaries as soon as they're needed. Your
59first tests may take a little longer while you wait for
60Boost.Python to build, but doing things this way will save you from
61worrying about build intricacies like which library binaries to use
62for a specific compiler configuration and figuring out the right
63compiler options to use yourself.
64
65[note Of course it's possible to use other build systems to
66 build Boost.Python and its extensions, but they are not
67 officially supported by Boost. Moreover *99% of all “I can't
68 build Boost.Python” problems come from trying to use another
69 build system* without first following these instructions.
70
71 If you want to use another system anyway, we suggest that you
72 follow these instructions, and then invoke `bjam` with the
73
74 `-a -o`\ /filename/
75
76 options to dump the build commands it executes to a file, so
77 you can see what your alternate build system needs to do.]
78
79[section Basic Procedure]
80
811. Get Boost; see sections 1 and 2 of the _gsg_.
82
832. Get the `bjam` build driver. See section 5 of the _gsg_.
84
853. cd into the `example/quickstart/` directory of your
86 Boost.Python installation, which contains a small example project.
87
884. Invoke `bjam`. Replace the “\ `stage`\ “ argument from the
89 example invocation from section 5 of the _gsg_ with “\ `test`\ ,“ to
90 build all the test targets. Also add the argument “\ `--verbose-test`\ ”
91 to see the output generated by the tests when they are run.
92 On Windows, your `bjam` invocation might look something like:
93 ``
94 C:\\...\\quickstart> bjam toolset=msvc --verbose-test test
95 ``
96 and on Unix variants, perhaps,
97 ``
98 .../quickstart$ bjam toolset=gcc --verbose-test test
99 ``
100
101[note For the sake of concision, the rest of this guide will use
102 unix-style forward slashes in pathnames instead of the
103 backslashes with which Windows users may be more familiar. The forward
104 slashes should work everywhere except in
105 [@http://www.boost.org/more/getting_started/windows.html#command-prompt
106 Command Prompt] windows, where you should use backslashes.]
107
108If you followed this procedure successfully, you will have built an
109extension module called `extending` and tested it by running a
110Python script called `test_extending.py`. You will also have
111built and run a simple application called `embedding` that embeds
112python.
113
114[endsect]
115[section In Case of Trouble]
116
117If you're seeing lots of compiler and/or linker error messages,
118it's probably because Boost.Build is having trouble finding your
119Python installation. You might want to pass the
120`--debug-configuration` option to `bjam` the first few times
121you invoke it, to make sure that Boost.Build is correctly locating
122all the parts of your Python installation. If it isn't, consider
123[link building.configuring_boost_build Configuring Boost.Build]
124as detailed below.
125
126If you're still having trouble, Someone on one of the following
127mailing lists may be able to help:
128
129* The _bb_list_ for issues related to Boost.Build
130* The _bp_list_ for issues specifically related to Boost.Python
131
132[endsect]
133[section In Case Everything Seemed to Work]
134
135Rejoice! If you're new to Boost.Python, at this point it might be
136a good idea to ignore build issues for a while and concentrate on
137learning the library by going through the _tutorial_ and perhaps
138some of the _reference_, trying out what you've
139learned about the API by modifying the quickstart project.
140
141[endsect]
142[section Modifying the Example Project]
143
144If you're content to keep your extension module forever in one
145source file called `extending.cpp`, inside your Boost.Python
146distribution, and import it forever as `extending`, then you can
147stop here. However, it's likely that you will want to make a few
148changes. There are a few things you can do without having to learn
149_bb_ in depth.
150
151The project you just built is specified in two files in the current
152directory: `boost-build.jam`, which tells `bjam` where it can
153find the interpreted code of the Boost build system, and
154`Jamroot`, which describes the targets you just built. These
155files are heavily commented, so they should be easy to modify.
156Take care, however, to preserve whitespace. Punctuation such as
157`;` will not be recognized as intended by `bjam` if it is not
158surrounded by whitespace.
159
160[section Relocate the Project]
161
162You'll probably want to copy this project elsewhere so you can
163change it without modifying your Boost distribution. To do that,
164simply
165
166a. copy the entire `example/quickstart/` directory
167 into a new directory.
168
169b. In the new copies of `boost-build.jam` and `Jamroot`, locate
170 the relative path near the top of the file that is clearly
171 marked by a comment, and edit that path so that it refers to the
172 same directory your Boost distribution as it referred to when
173 the file was in its original location in the
174 `example/quickstart/` directory.
175
176For example, if you moved the project from
177`/home/dave/boost_1_34_0/libs/python/example/quickstart` to
178`/home/dave/my-project`, you could change the first path in
179`boost-build.jam` from
180``
181 ../../../../tools/build/src
182``
183to
184``
185 /home/dave/boost_1_34_0/tools/build/src
186``
187and change the first path in `Jamroot` from
188``
189 ../../../..
190``
191to
192``
193 /home/dave/boost_1_34_0
194``
195
196[endsect]
197[section Add New or Change Names of Existing Source Files]
198
199The names of additional source files involved in building your
200extension module or embedding application can be listed in
201`Jamroot` right alongside `extending.cpp` or `embedding.cpp`
202respectively. Just be sure to leave whitespace around each
203filename:
204``
205 … file1.cpp file2.cpp file3.cpp …
206``
207Naturally, if you want to change the name of a source file you can
208tell Boost.Build about it by editing the name in `Jamroot`.
209
210[endsect]
211[section Change the Name of your Extension Module]
212
213The name of the extension module is determined by two things:
214
215# the name in `Jamroot` immediately following `python-extension`, and
216# the name passed to `BOOST_PYTHON_MODULE` in `extending.cpp`.
217
218To change the name of the extension module from `extending` to
219`hello`, you'd edit `Jamroot`, changing
220``
221 python-extension extending : extending.cpp ;
222``
223to
224``
225 python-extension hello : extending.cpp ;
226``
227and you'd edit extending.cpp, changing
228
229``
230 BOOST_PYTHON_MODULE(extending)
231``
232to
233``
234 BOOST_PYTHON_MODULE(hello)
235``
236[endsect]
237[endsect]
238[endsect]
239[section Installing Boost.Python on your System]
240
241Since Boost.Python is a separately-compiled (as opposed to
242`header-only`) library, its user relies on the services of a
243Boost.Python library binary.
244
245If you need a regular installation of the Boost.Python library
246binaries on your system, the _gsg_ will
247walk you through the steps of creating one. If building binaries
248from source, you might want to supply the `--with-python`
249argument to `bjam` (or the `--with-libraries=python` argument
250to `configure`), so only the Boost.Python binary will be built,
251rather than all the Boost binaries.
252
253[endsect]
254[section Configuring Boost.Build]
255
256As described in the [@http://www.boost.org/build/doc/html/bbv2/overview/configuration.html Boost.Build Reference Manual], a file called
257`user-config.jam` in your home directory is used to
258specify the tools and libraries available to the build system. You
259may need to create or edit `user-config.jam` to tell Boost.Build
260how to invoke Python, `#include` its headers, and link with its
261libraries.
262
263[note If you are using a unix-variant OS and you ran Boost's
264 `configure` script, it may have generated a
265 `user-config.jam` for you. [footnote `configure` overwrites the existing
266 `user-config.jam` in your home directory (if any) after making a backup of
267 the old version.] If your `configure`\ /\ `make` sequence was successful and
268 Boost.Python binaries were built, your `user-config.jam` file is probably already
269 correct.]
270
271If you have one fairly “standard” python installation for your
272platform, you might not need to do anything special to describe it. If
273you haven't configured python in `user-config.jam` (and you don't
274specify `--without-python` on the Boost.Build command line),
275Boost.Build will automatically execute the equivalent of
276
277``
278 import toolset : using ;
279 using python ;
280``
281which automatically looks for Python in the most likely places.
282However, that only happens when using the Boost.Python project file
283(e.g. when referred to by another project as in the quickstart
284method). If instead you are linking against separately-compiled
285Boost.Python binaries, you should set up a `user-config.jam` file
286with at least the minimal incantation above.
287
288[section Python Configuration Parameters]
289
290If you have several versions of Python installed, or Python is
291installed in an unusual way, you may want to supply any or all of
292the following optional parameters to `using python`.
293
294[variablelist
295 [[version]
296
297 [the version of Python to use. Should be in Major.Minor
298 format, for example, `2.3`. Do not include the subminor
299 version (i.e. *not* `2.5.1`). If you have multiple Python
300 versions installed, the version will usually be the only
301 configuration argument required.]]
302
303 [[cmd-or-prefix]
304
305 [preferably, a command that invokes a Python interpreter.
306 Alternatively, the installation prefix for Python libraries and
307 header files. Only use the alternative formulation if there is
308 no appropriate Python executable available.]]
309
310 [[*includes*]
311
312 [the `#include` paths for Python headers. Normally the correct
313 path(s) will be automatically deduced from `version` and/or
314 `cmd-or-prefix`.]]
315
316 [[*libraries*]
317
318 [the path to Python library binaries. On MacOS/Darwin,
319 you can also pass the path of the Python framework. Normally the
320 correct path(s) will be automatically deduced from `version`
321 and/or `cmd-or-prefix`.]]
322
323 [[*condition*]
324
325 [if specified, should be a set of Boost.Build
326 properties that are matched against the build configuration when
327 Boost.Build selects a Python configuration to use. See examples
328 below for details.]]
329
330 [[*extension-suffix*]
331
332 [A string to append to the name of extension
333 modules before the true filename extension. You almost certainly
334 don't need to use this. Usually this suffix is only used when
335 targeting a Windows debug build of Python, and will be set
336 automatically for you based on the value of the
337 [link building.python_debugging_builds <python-debugging>] feature.
338 However, at least one Linux distribution (Ubuntu Feisty Fawn) has
339 a specially configured [@https://wiki.ubuntu.com/PyDbgBuilds <python-dbg>]
340 package that claims to use such a suffix.]]
341 ]
342
343[endsect]
344[section Examples]
345
346Note that in the examples below, case and *especially whitespace* are
347significant.
348
349* If you have both python 2.5 and python 2.4 installed,
350 `user-config.jam` might contain
351
352 ``
353 using python : 2.5 ; # Make both versions of Python available
354 using python : 2.4 ; # To build with python 2.4, add python=2.4
355 # to your command line.
356 ``
357 The first version configured (2.5) becomes the default. To build
358 against python 2.4, add `python=2.4` to the `bjam` command line.
359
360* If you have python installed in an unusual location, you might
361 supply the path to the interpreter in the `cmd-or-prefix`
362 parameter:
363
364 ``
365 using python : : /usr/local/python-2.6-beta/bin/python ;
366 ``
367
368* If you have a separate build of Python for use with a particular
369 toolset, you might supply that toolset in the `condition`
370 parameter:
371
372 ``
373 using python ; # use for most toolsets
374
375 # Use with Intel C++ toolset
376 using python
377 : # version
378 : c:\\Devel\\Python-2.5-IntelBuild\\PCBuild\\python # cmd-or-prefix
379 : # includes
380 : # libraries
381 : <toolset>intel # condition
382 ;
383 ``
384
385* If you have downloaded the Python sources and built both the
386 normal and the [link building.python_debugging_builds "python debugging"]
387 builds from source on Windows, you might see:
388
389 ``
390 using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python ;
391 using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python_d
392 : # includes
393 : # libs
394 : <python-debugging>on ;
395 ``
396* You can set up your user-config.jam so a bjam built under Windows
397 can build/test both Windows and Cygwin_ python extensions. Just pass
398 `<target-os>cygwin` in the `condition` parameter
399 for the cygwin python installation:
400
401 ``
402 # windows installation
403 using python ;
404
405 # cygwin installation
406 using python : : c:\\cygwin\\bin\\python2.5 : : : <target-os>cygwin ;
407 ``
408 when you put target-os=cygwin in your build request, it should build
409 with the cygwin version of python: [#flavor]_
410
411 ``
412 bjam target-os=cygwin toolset=gcc
413 ``
414 This is supposed to work the other way, too (targeting windows
415 python with a [@http://cygwin.com Cygwin] bjam) but it seems as though the support in
416 Boost.Build's toolsets for building that way is broken at the
417 time of this writing.
418
419* Note that because of [@http://zigzag.cs.msu.su/boost.build/wiki/AlternativeSelection
420 the way Boost.Build currently selects target alternatives], you might have be very
421 explicit in your build requests. For example, given:
422
423 ``
424 using python : 2.5 ; # a regular windows build
425 using python : 2.4 : : : : <target-os>cygwin ;
426 ``
427 building with
428 ``
429 bjam target-os=cygwin
430 ``
431
432 will yield an error. Instead, you'll need to write
433
434 ``
435 bjam target-os=cygwin/python=2.4
436 ``
437
438[endsect]
439[endsect]
440[section Choosing a Boost.Python Library Binary]
441
442If—instead of letting Boost.Build construct and link with the right
443libraries automatically—you choose to use a pre-built Boost.Python
444library, you'll need to think about which one to link with. The
445Boost.Python binary comes in both static and dynamic flavors. Take
446care to choose the right flavor for your application. [footnote
447Information about how to identify the static and dynamic builds of Boost.Python on
448[@http://boost.org/more/getting_started/windows.html#library-naming Windows] /
449[@http://boost.org/more/getting_started/unix-variants.html#library-naming Unix variants]]
450
451[section The Dynamic Binary]
452
453The dynamic library is the safest and most-versatile choice:
454
455* A single copy of the library code is used by all extension
456 modules built with a given toolset. [footnote Because of the way most \*nix platforms
457 share symbols among dynamically-loaded objects, I'm not certain
458 that extension modules built with different compiler toolsets
459 will always use different copies of the Boost.Python library
460 when loaded into the same Python instance. Not using different
461 libraries could be a good thing if the compilers have compatible
462 ABIs, because extension modules built with the two libraries
463 would be interoperable. Otherwise, it could spell disaster,
464 since an extension module and the Boost.Python library would
465 have different ideas of such things as class layout. I would
466 appreciate someone doing the experiment to find out what
467 happens.]
468
469* The library contains a type conversion registry. Because one
470 registry is shared among all extension modules, instances of a
471 class exposed to Python in one dynamically-loaded extension
472 module can be passed to functions exposed in another such module.
473
474[endsect]
475[section The Static Binary]
476
477It might be appropriate to use the static Boost.Python library in
478any of the following cases:
479
480* You are _extending_ python and the types exposed in your
481 dynamically-loaded extension module don't need to be used by any
482 other Boost.Python extension modules, and you don't care if the
483 core library code is duplicated among them.
484
485* You are _embedding_ python in your application and either:
486
487 * You are targeting a Unix variant OS other than MacOS or AIX,
488 where the dynamically-loaded extension modules can “see” the
489 Boost.Python library symbols that are part of the executable.
490
491 * Or, you have statically linked some Boost.Python extension
492 modules into your application and you don't care if any
493 dynamically-loaded Boost.Python extension modules are able to
494 use the types exposed by your statically-linked extension
495 modules (and vice-versa).
496
497[endsect]
498[endsect]
499[section `#include` Issues]
500
5011. If you should ever have occasion to `#include "python.h"`
502 directly in a translation unit of a program using Boost.Python,
503 use `#include "boost/python/detail/wrap_python.hpp"` instead.
504 It handles several issues necessary for use with Boost.Python,
505 one of which is mentioned in the next section.
506
5072. Be sure not to `#include` any system headers before
508 `wrap_python.hpp`. This restriction is actually imposed by
509 Python, or more properly, by Python's interaction with your
510 operating system. See
511 [@http://docs.python.org/ext/simpleExample.html] for details.
512
513[endsect]
514[section Python Debugging Builds]
515
516Python can be built in a special “python debugging” configuration
517that adds extra checks and instrumentation that can be very useful
518for developers of extension modules. The data structures used by
519the debugging configuration contain additional members, so *a
520Python executable built with python debugging enabled cannot be
521used with an extension module or library compiled without it, and
522vice-versa.*
523
524Since pre-built “python debugging” versions of the Python
525executable and libraries are not supplied with most distributions
526of Python, [footnote On Unix and similar platforms, a debugging python and associated libraries are built by adding --with-pydebug when configuring the Python build. On Windows, the debugging version of Python is generated by the "Win32 Debug" target of the Visual Studio project in the PCBuild subdirectory of a full Python source code distribution.] and we didn't want to force our users
527to build them, Boost.Build does not automatically enable python
528debugging in its `debug` build variant (which is the default).
529Instead there is a special build property called
530`python-debugging` that, when used as a build property, will
531define the right preprocessor symbols and select the right
532libraries to link with.
533
534On unix-variant platforms, the debugging versions of Python's data
535structures will only be used if the symbol `Py_DEBUG` is defined.
536On many windows compilers, when extension modules are built with
537the preprocessor symbol `_DEBUG`, Python defaults to force
538linking with a special debugging version of the Python DLL. Since
539that symbol is very commonly used even when Python is not present,
540Boost.Python temporarily undefines `_DEBUG` when `Python.h`
541is #included from `boost/python/detail/wrap_python.hpp` - unless
542`BOOST_DEBUG_PYTHON` is defined. The upshot is that if you want
543“python debugging”and you aren't using Boost.Build, you should make
544sure `BOOST_DEBUG_PYTHON` is defined, or python debugging will be
545suppressed.
546
547[endsect]
548[section Testing Boost.Python]
549
550To run the full test suite for Boost.Python, invoke `bjam` in the
551`test` subdirectory of your Boost.Python distribution.
552
553[endsect]
554[section Notes for MinGW (and Cygwin with -mno-cygwin) GCC Users]
555
556If you are using a version of Python prior to 2.4.1 with a MinGW
557prior to 3.0.0 (with binutils-2.13.90-20030111-1), you will need to
558create a MinGW-compatible version of the Python library; the one
559shipped with Python will only work with a Microsoft-compatible
560linker. Follow the instructions in the “Non-Microsoft” section of
561the “Building Extensions: Tips And Tricks” chapter in
562[@https://docs.python.org/2/install/index.html Installing Python Modules]
563to create `libpythonXX.a`, where `XX` corresponds to the major and minor
564version numbers of your Python installation.
565
566[endsect]