Compare commits
1957 Commits
svn-branch
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97402f7925 | ||
|
|
668bc7c106 | ||
|
|
5f5f38fa8a | ||
|
|
cc873d9682 | ||
|
|
20de46cd0c | ||
|
|
5d7b9a0648 | ||
|
|
608ec27c4d | ||
|
|
7fd39323ac | ||
|
|
2b6f667e98 | ||
|
|
aa458d2ca9 | ||
|
|
16627261f1 | ||
|
|
303299e677 | ||
|
|
cb95b611bb | ||
|
|
b4fb28e99a | ||
|
|
867f0dddfe | ||
|
|
a40bb656ee | ||
|
|
f604eb8d0f | ||
|
|
d30c1bb7a8 | ||
|
|
3e7be69e1e | ||
|
|
cbdf1ce2a1 | ||
|
|
4fe3403584 | ||
|
|
b1b43f1e1a | ||
|
|
7b1960446b | ||
|
|
2dc5a92727 | ||
|
|
4fc3afa3ac | ||
|
|
ff0ae9b29d | ||
|
|
b988d70207 | ||
|
|
b3a28d7033 | ||
|
|
3ea0cb8501 | ||
|
|
95e53011d8 | ||
|
|
301256cf1e | ||
|
|
c76d67ef3f | ||
|
|
0102b31945 | ||
|
|
4c6f40fb82 | ||
|
|
d1910f3d65 | ||
|
|
c4e3b13dc2 | ||
|
|
a498e2458c | ||
|
|
7a3cc07042 | ||
|
|
58b1a010bb | ||
|
|
8ca8724ad9 | ||
|
|
5a8d096135 | ||
|
|
30bdbf3ae2 | ||
|
|
5a07cdb96b | ||
|
|
06fa956fe8 | ||
|
|
9ab1742c46 | ||
|
|
071b0bc964 | ||
|
|
d8d9861036 | ||
|
|
f6d20e1099 | ||
|
|
99a5352b5c | ||
|
|
1fed0824ad | ||
|
|
0474de0f6c | ||
|
|
6c3f3ecacf | ||
|
|
47d5bc76f6 | ||
|
|
508da1d198 | ||
|
|
271bcea8bf | ||
|
|
fdd3e8b2c1 | ||
|
|
a218babc8d | ||
|
|
41e208ecb5 | ||
|
|
f028aa4076 | ||
|
|
a060d43bf2 | ||
|
|
8dd1511773 | ||
|
|
909a4d1530 | ||
|
|
aee2667407 | ||
|
|
209179fa09 | ||
|
|
5e77eabb63 | ||
|
|
ecda18f01e | ||
|
|
2a82afdf6d | ||
|
|
aca3c80c4f | ||
|
|
68fa9dccde | ||
|
|
f5d14ef15e | ||
|
|
f7254f5d8a | ||
|
|
bffcb99ae7 | ||
|
|
cbd2d9f033 | ||
|
|
0f1945060f | ||
|
|
30dd3fe8b1 | ||
|
|
500194edb7 | ||
|
|
cd953cff06 | ||
|
|
5e4f6278e0 | ||
|
|
108c93f7c3 | ||
|
|
3dd6bcf39f | ||
|
|
97a8550a9f | ||
|
|
c9521a8ef5 | ||
|
|
8328a4f535 | ||
|
|
cc973263c4 | ||
|
|
f1320bf30b | ||
|
|
d9f06052e2 | ||
|
|
9ad5298d0b | ||
|
|
944fa075b3 | ||
|
|
b4fbf1840b | ||
|
|
ec402ea0d7 | ||
|
|
60405cc48c | ||
|
|
9e1132f4f5 | ||
|
|
bf824c1b98 | ||
|
|
01ab510585 | ||
|
|
5e2d55d801 | ||
|
|
17886fc296 | ||
|
|
15115eb1f8 | ||
|
|
1727b67a5a | ||
|
|
0a9b687e9e | ||
|
|
8c8b0dc215 | ||
|
|
fdc9ec760f | ||
|
|
102acf1d34 | ||
|
|
0b0c0536d6 | ||
|
|
0d0cd711a7 | ||
|
|
72e254bf8b | ||
|
|
1f1b9b6aef | ||
|
|
6bd6d71850 | ||
|
|
b9c0e58d57 | ||
|
|
4b01139720 | ||
|
|
65bfec2d97 | ||
|
|
4f6d547c0a | ||
|
|
90813b1ad7 | ||
|
|
b644946368 | ||
|
|
c7799aa44f | ||
|
|
02095af952 | ||
|
|
6f72675bff | ||
|
|
ed4776b59c | ||
|
|
ac62db1cf1 | ||
|
|
b4230e98f6 | ||
|
|
467a89eba7 | ||
|
|
28e2c6512c | ||
|
|
b0f512c15a | ||
|
|
77ff0d6bbc | ||
|
|
24313709a7 | ||
|
|
ac9fa536c8 | ||
|
|
7352c9c0f7 | ||
|
|
26ac881b9d | ||
|
|
19f6c782aa | ||
|
|
f3df1bf912 | ||
|
|
a383ecdd88 | ||
|
|
d515eb82c8 | ||
|
|
0021720a46 | ||
|
|
61591f7ad2 | ||
|
|
6b8ab7a5a3 | ||
|
|
02e079cf4d | ||
|
|
9039286937 | ||
|
|
429ac28c4a | ||
|
|
1db3871f50 | ||
|
|
66dad425aa | ||
|
|
ed3cbf8a60 | ||
|
|
2f6e728de5 | ||
|
|
65be0e0f0f | ||
|
|
d4d41d94ae | ||
|
|
660487c43f | ||
|
|
d6d54ce483 | ||
|
|
7c33ff0c59 | ||
|
|
b9d0d97499 | ||
|
|
fc978f085b | ||
|
|
ebba009a9f | ||
|
|
9ad3313d1f | ||
|
|
bf9a03399b | ||
|
|
2d9871fc5a | ||
|
|
30c9eb1fb6 | ||
|
|
7c5e478432 | ||
|
|
2b7842a39f | ||
|
|
8d37630cc8 | ||
|
|
9d2903cd5e | ||
|
|
b09d80a93e | ||
|
|
135c025484 | ||
|
|
ecf05c4a90 | ||
|
|
00b7ed03a7 | ||
|
|
fed4f0d0f9 | ||
|
|
39edfd45cf | ||
|
|
c2424bcc8f | ||
|
|
b3b67273b0 | ||
|
|
8c2a808cbe | ||
|
|
31c8b7f1b4 | ||
|
|
aeedea409a | ||
|
|
2d1f66fd19 | ||
|
|
69e38d2186 | ||
|
|
df6926551e | ||
|
|
8536e97c67 | ||
|
|
142661dac8 | ||
|
|
d6554d6c65 | ||
|
|
90829714cc | ||
|
|
664d443df3 | ||
|
|
c4fe369d69 | ||
|
|
7cfc47008e | ||
|
|
1452dfe713 | ||
|
|
3613142839 | ||
|
|
b2f53e1acf | ||
|
|
3844c4fc5f | ||
|
|
7d3df3d3a7 | ||
|
|
df16e3e55e | ||
|
|
ae747521b0 | ||
|
|
3066c73c09 | ||
|
|
edd890bd2b | ||
|
|
352792c90a | ||
|
|
47faef65ee | ||
|
|
5e4b44e0af | ||
|
|
5121fc11f9 | ||
|
|
07b1489f3b | ||
|
|
471e6181b2 | ||
|
|
44ea0562b2 | ||
|
|
60fba03e99 | ||
|
|
398e7f02b8 | ||
|
|
1e315242ce | ||
|
|
77ee91d5c5 | ||
|
|
e3c9dd78aa | ||
|
|
e670de2795 | ||
|
|
367b793ac9 | ||
|
|
8c170d9193 | ||
|
|
bd7b8ecba5 | ||
|
|
0224f54ae0 | ||
|
|
d14b8cf411 | ||
|
|
4e0b96faa8 | ||
|
|
7178a70176 | ||
|
|
aaf9022770 | ||
|
|
36bbdde2fe | ||
|
|
1df6d84b80 | ||
|
|
e968329174 | ||
|
|
07c8cbe652 | ||
|
|
163e469bc4 | ||
|
|
ac39d2ed69 | ||
|
|
264f6ae4b9 | ||
|
|
84c96447e2 | ||
|
|
dc8d68d3fc | ||
|
|
91512a971d | ||
|
|
88ea1f9626 | ||
|
|
731ba745ca | ||
|
|
080eb55be6 | ||
|
|
a3d8223b5d | ||
|
|
b9431cd326 | ||
|
|
2ccf54f091 | ||
|
|
4ce4821111 | ||
|
|
69ddfcae17 | ||
|
|
3ace4a0015 | ||
|
|
cbb3851488 | ||
|
|
127cc20a1d | ||
|
|
482219f20a | ||
|
|
061050c006 | ||
|
|
03adaee6d2 | ||
|
|
bc2f77a3db | ||
|
|
aaf0d220ae | ||
|
|
bb6f52dc35 | ||
|
|
d422058fb4 | ||
|
|
a60ab14b91 | ||
|
|
e0ee734161 | ||
|
|
444c948abe | ||
|
|
97e4b34a15 | ||
|
|
5029273ca8 | ||
|
|
63e3079a16 | ||
|
|
adfac2d139 | ||
|
|
d79b59616b | ||
|
|
8a58f716ac | ||
|
|
f3931cfc38 | ||
|
|
b0f6414269 | ||
|
|
76708620cb | ||
|
|
b877b98fee | ||
|
|
94dfa4c762 | ||
|
|
5c723e96ea | ||
|
|
b49a186b6f | ||
|
|
a5a08bfb7b | ||
|
|
e53a68defd | ||
|
|
f0d5bef32d | ||
|
|
e820537f3b | ||
|
|
c2d144ab71 | ||
|
|
55f283bf18 | ||
|
|
2e8cd3d8f2 | ||
|
|
b3e9290599 | ||
|
|
07dd8eaa55 | ||
|
|
81b3263743 | ||
|
|
7b7c4b85d5 | ||
|
|
f7d7c54173 | ||
|
|
68400823db | ||
|
|
905b34210b | ||
|
|
400f3db73a | ||
|
|
57cd933240 | ||
|
|
f399391be2 | ||
|
|
5233f45da4 | ||
|
|
63323f020f | ||
|
|
e9c265a84a | ||
|
|
f2c465ffa5 | ||
|
|
77bdbf0432 | ||
|
|
26aaa5b62e | ||
|
|
359b7f0473 | ||
|
|
52b268a8c6 | ||
|
|
e3aacc64fe | ||
|
|
f753f4bc30 | ||
|
|
9e53eb2c23 | ||
|
|
6c2e3fb487 | ||
|
|
fcbba59630 | ||
|
|
61a399e80a | ||
|
|
42b06fa3a3 | ||
|
|
f410fbd64d | ||
|
|
d18c7787e6 | ||
|
|
5dce79445d | ||
|
|
c41a1e8531 | ||
|
|
41c61dd756 | ||
|
|
d0b6fb9557 | ||
|
|
b68ce3b156 | ||
|
|
04cad679a5 | ||
|
|
d4d7f018f9 | ||
|
|
99022d2eb8 | ||
|
|
37f8f37cda | ||
|
|
0a4c76b9ac | ||
|
|
156054371b | ||
|
|
d06f4aeaca | ||
|
|
e8d7bb5027 | ||
|
|
b207fc1a04 | ||
|
|
9742c30f47 | ||
|
|
97f894bc1a | ||
|
|
eefc434bae | ||
|
|
226d1ac961 | ||
|
|
36f8f69411 | ||
|
|
97b0d9737c | ||
|
|
3e405b6fd5 | ||
|
|
e1e9eb303a | ||
|
|
9eee9ef461 | ||
|
|
fe24ab9dd5 | ||
|
|
a911c17fd6 | ||
|
|
8d5d777ebb | ||
|
|
ea87bfee8c | ||
|
|
a0e849ed91 | ||
|
|
4dbb2784ee | ||
|
|
4d9ab505b0 | ||
|
|
17a7655c74 | ||
|
|
3494381c01 | ||
|
|
bc13c4c600 | ||
|
|
73b8350e53 | ||
|
|
c509a3ab01 | ||
|
|
4c2070f39f | ||
|
|
e2c23fd5f9 | ||
|
|
7ff5465e7d | ||
|
|
e747cc9422 | ||
|
|
b46ccc4f51 | ||
|
|
0a47c583b1 | ||
|
|
be72aab254 | ||
|
|
5035f6e801 | ||
|
|
0b549aee88 | ||
|
|
bf73da1bce | ||
|
|
ca8ce585b7 | ||
|
|
81551cf6b6 | ||
|
|
e445e193fe | ||
|
|
832a1edd79 | ||
|
|
6b7e0cc71f | ||
|
|
74b9bcaaa5 | ||
|
|
371914a0e0 | ||
|
|
8021a21abb | ||
|
|
9ceb9c02f5 | ||
|
|
97f9a10b9c | ||
|
|
87f776b178 | ||
|
|
e3bf3c6f51 | ||
|
|
c8798676f6 | ||
|
|
590b7887f4 | ||
|
|
badedbebfc | ||
|
|
cc80f46a6d | ||
|
|
42e7d7bbb3 | ||
|
|
5476f97d59 | ||
|
|
da01e9b660 | ||
|
|
a89bf7e9e8 | ||
|
|
52201f0cba | ||
|
|
3480aee9e7 | ||
|
|
ead8d0aba5 | ||
|
|
7a4b240838 | ||
|
|
f500202dab | ||
|
|
c9974daec2 | ||
|
|
b46dfd9064 | ||
|
|
956606ef0c | ||
|
|
0b59058fa2 | ||
|
|
2a41c80c58 | ||
|
|
42a57978ee | ||
|
|
4b99e6b83f | ||
|
|
ca18dc9daa | ||
|
|
fc3f1bb531 | ||
|
|
8cc149f4f4 | ||
|
|
5f8f5b4c3e | ||
|
|
49b536fbd3 | ||
|
|
a3f478e9af | ||
|
|
2e47285fb5 | ||
|
|
45b588b85a | ||
|
|
cce7dfcf17 | ||
|
|
2f7742ffec | ||
|
|
46b959cceb | ||
|
|
ca3526c76a | ||
|
|
303885fefa | ||
|
|
46796f3413 | ||
|
|
2c1a276671 | ||
|
|
0b8b88abc7 | ||
|
|
c3d20eb07f | ||
|
|
4ec94c676b | ||
|
|
a35cbd1af1 | ||
|
|
28a9fab278 | ||
|
|
ab2225bcbd | ||
|
|
e32979fe0a | ||
|
|
dbe4903887 | ||
|
|
405f99cd3c | ||
|
|
313dcbb628 | ||
|
|
dca44829a6 | ||
|
|
46f6382fe4 | ||
|
|
99e6194620 | ||
|
|
4c2850cbfd | ||
|
|
029eb385ed | ||
|
|
77b89341d0 | ||
|
|
588027252b | ||
|
|
d61d41a786 | ||
|
|
1d3a535e53 | ||
|
|
65dc91f3da | ||
|
|
782ca7bf20 | ||
|
|
1a5a3e1701 | ||
|
|
00c61f4767 | ||
|
|
c20af50ae3 | ||
|
|
38e68fa2ae | ||
|
|
35a62fea52 | ||
|
|
b219376e24 | ||
|
|
76db3311ed | ||
|
|
af8efb72bd | ||
|
|
5792bffaa2 | ||
|
|
7acb544b47 | ||
|
|
e3130fe75b | ||
|
|
f054b64315 | ||
|
|
ef6194f1f8 | ||
|
|
b262615aa8 | ||
|
|
842cf85d4b | ||
|
|
9064a063b2 | ||
|
|
5daa36d04d | ||
|
|
fa24dbb88f | ||
|
|
ba5503cf89 | ||
|
|
1e66e33201 | ||
|
|
8f909d55ac | ||
|
|
05c21bcae1 | ||
|
|
0cb3bd7aa5 | ||
|
|
7a84a00673 | ||
|
|
9d7dfd8449 | ||
|
|
2a8823f745 | ||
|
|
beaa4b0e4d | ||
|
|
55c3b0569e | ||
|
|
49e8699b9f | ||
|
|
8449c34948 | ||
|
|
2aca81bca9 | ||
|
|
32d2135462 | ||
|
|
838f44c050 | ||
|
|
6699e8a4a2 | ||
|
|
7064cf3186 | ||
|
|
777e16e1d0 | ||
|
|
715e5cbc31 | ||
|
|
67b5b07976 | ||
|
|
7b088c9df2 | ||
|
|
3dda62f8b8 | ||
|
|
c33460c265 | ||
|
|
4c12b004ec | ||
|
|
5bed132ff8 | ||
|
|
3ffcf3335a | ||
|
|
c314274a56 | ||
|
|
437373456f | ||
|
|
7add755ae0 | ||
|
|
79182d7189 | ||
|
|
36e9e38373 | ||
|
|
45e52301e9 | ||
|
|
37a73f344b | ||
|
|
bbd9aad6e9 | ||
|
|
8fa1f9db9e | ||
|
|
9c56469358 | ||
|
|
196c9e653f | ||
|
|
c572b4db73 | ||
|
|
b2519a25a9 | ||
|
|
2979e4b062 | ||
|
|
88dd5330d0 | ||
|
|
fa51b58cd6 | ||
|
|
302fee14b0 | ||
|
|
211c90ae0f | ||
|
|
f1efb481c3 | ||
|
|
419b6ec973 | ||
|
|
085f574d6e | ||
|
|
69d9f34f3e | ||
|
|
36ee7d23f9 | ||
|
|
b269b4b124 | ||
|
|
3e409f9a87 | ||
|
|
20b68f2a2f | ||
|
|
2794a9bd15 | ||
|
|
cfa2baf8c9 | ||
|
|
1212a14739 | ||
|
|
8e703e9569 | ||
|
|
0a76801936 | ||
|
|
faf3cd0b78 | ||
|
|
daf466a697 | ||
|
|
718cfd468e | ||
|
|
3796825523 | ||
|
|
6904a166f7 | ||
|
|
39b9047190 | ||
|
|
930167e961 | ||
|
|
64b2c1697b | ||
|
|
f0345b2521 | ||
|
|
4df7f1c247 | ||
|
|
201c100422 | ||
|
|
f441ec7dfd | ||
|
|
09dc86f5f2 | ||
|
|
a5e564be83 | ||
|
|
dcc3590907 | ||
|
|
a11a3f9f76 | ||
|
|
74daea3d88 | ||
|
|
4c2927ca46 | ||
|
|
e28f0509d8 | ||
|
|
a8fb9f7746 | ||
|
|
0a211a746d | ||
|
|
2a20884e78 | ||
|
|
77ec571511 | ||
|
|
70c7fbd1d8 | ||
|
|
91a1119070 | ||
|
|
a300f7cdd0 | ||
|
|
65db10061f | ||
|
|
3d7f523384 | ||
|
|
252c3aa695 | ||
|
|
ba213663b6 | ||
|
|
b5336f36d6 | ||
|
|
736ba48c2b | ||
|
|
fa32b8dfab | ||
|
|
6066ffef9a | ||
|
|
c501874bc2 | ||
|
|
f759e9eb0e | ||
|
|
584df88fb2 | ||
|
|
ba1416fff0 | ||
|
|
42ca807c82 | ||
|
|
cae31b5380 | ||
|
|
76af2cfc6b | ||
|
|
846c5d9914 | ||
|
|
bd8a9eb1fd | ||
|
|
b988e8c45f | ||
|
|
65b3aadc63 | ||
|
|
38e92833f6 | ||
|
|
14ea71e201 | ||
|
|
e13ebcd0e8 | ||
|
|
63a3f188b8 | ||
|
|
34b162738f | ||
|
|
e481c136e5 | ||
|
|
c7db44f617 | ||
|
|
569b395cdd | ||
|
|
f3aecdf2f4 | ||
|
|
ea3c254370 | ||
|
|
ed6e9d6726 | ||
|
|
1f04129832 | ||
|
|
b63d44e781 | ||
|
|
52d7dfffdf | ||
|
|
40bd0326f3 | ||
|
|
a3e76d59c3 | ||
|
|
99d3a54ad5 | ||
|
|
4b9cb5337d | ||
|
|
c3d186e0bf | ||
|
|
e0fa8ec619 | ||
|
|
e2b2ebe862 | ||
|
|
5b36b84444 | ||
|
|
78ec0d12db | ||
|
|
a7c16bf695 | ||
|
|
86db60255a | ||
|
|
37b45d2baf | ||
|
|
6d4be7ab3a | ||
|
|
65e74ccf1e | ||
|
|
eef2eef7dd | ||
|
|
189915bc8b | ||
|
|
9398a63250 | ||
|
|
1660730320 | ||
|
|
5418a663cb | ||
|
|
33408d2dcc | ||
|
|
3ad52bce72 | ||
|
|
471be524f4 | ||
|
|
4f6a37f80d | ||
|
|
e485244886 | ||
|
|
338732793a | ||
|
|
b9cd3ff109 | ||
|
|
8b0655ce94 | ||
|
|
36d24b9f8b | ||
|
|
d804f1250e | ||
|
|
89100353db | ||
|
|
35ff0adf2b | ||
|
|
115cde9c7f | ||
|
|
ef2a02c396 | ||
|
|
46be73387c | ||
|
|
e3f6f01588 | ||
|
|
d685a5e8c5 | ||
|
|
d7389277d3 | ||
|
|
8d2ca93e98 | ||
|
|
e80224b1ad | ||
|
|
d47e3b2a15 | ||
|
|
03fdf5b992 | ||
|
|
27aa9382fc | ||
|
|
1a204046c7 | ||
|
|
3c98a72153 | ||
|
|
a4f028246a | ||
|
|
6ffeca641c | ||
|
|
22b65a1485 | ||
|
|
d45b9ea66b | ||
|
|
0373302165 | ||
|
|
ef53bedd0a | ||
|
|
73b4cd3325 | ||
|
|
3ecb3301a2 | ||
|
|
e16b3f8ab8 | ||
|
|
f7d31f6ead | ||
|
|
47bb3f55a7 | ||
|
|
6296bd5bc4 | ||
|
|
7a7b32661e | ||
|
|
e312047405 | ||
|
|
50acffa593 | ||
|
|
cf5fcc0a1e | ||
|
|
c9e694bed8 | ||
|
|
0b7333f854 | ||
|
|
217250f078 | ||
|
|
98a9fa445b | ||
|
|
354fbb4d24 | ||
|
|
29152af56c | ||
|
|
472b18881b | ||
|
|
96798a3a38 | ||
|
|
7d2f44b21e | ||
|
|
5cda75ebe7 | ||
|
|
19846f5d79 | ||
|
|
6347f2e86c | ||
|
|
97f3d849df | ||
|
|
61fc9cf054 | ||
|
|
b3e91f845e | ||
|
|
d67cd6717d | ||
|
|
a1924a2a72 | ||
|
|
c205cd86c6 | ||
|
|
8d86dc199c | ||
|
|
c44100afda | ||
|
|
1dee81dc71 | ||
|
|
55e9ff14a1 | ||
|
|
801326275f | ||
|
|
98f20f30d6 | ||
|
|
b01e0e6b9c | ||
|
|
b0a9b11c9c | ||
|
|
304277b806 | ||
|
|
4fea58f634 | ||
|
|
a334649b0c | ||
|
|
79b7f88df6 | ||
|
|
a33ed032c6 | ||
|
|
b316819925 | ||
|
|
52245de2e5 | ||
|
|
2f1f79ce87 | ||
|
|
694ae13063 | ||
|
|
863bff9072 | ||
|
|
5168895803 | ||
|
|
c8bf94663c | ||
|
|
2213cf98c6 | ||
|
|
928a9389ce | ||
|
|
2dba3148ce | ||
|
|
7d22435994 | ||
|
|
48aa6ab9a9 | ||
|
|
96dd880146 | ||
|
|
6ba5067e0b | ||
|
|
60f4f5e54c | ||
|
|
7ee9cf679b | ||
|
|
63f8e9f3d7 | ||
|
|
03a72363a4 | ||
|
|
38cc1a0c15 | ||
|
|
ff44521920 | ||
|
|
0ac7e3f858 | ||
|
|
5cbb539ec5 | ||
|
|
40e4940877 | ||
|
|
ab0911cf53 | ||
|
|
0d81eb6695 | ||
|
|
e0b535df1e | ||
|
|
d2517faa78 | ||
|
|
d9b4ada654 | ||
|
|
f5df393360 | ||
|
|
8cd4ff8950 | ||
|
|
26f77691ee | ||
|
|
6e7f594027 | ||
|
|
eada30f0cb | ||
|
|
e919ffdac4 | ||
|
|
1cf41fd031 | ||
|
|
7b67118271 | ||
|
|
e14c702a40 | ||
|
|
d303ea16fc | ||
|
|
65114d8637 | ||
|
|
597dfc586b | ||
|
|
6a3085ad5d | ||
|
|
190d0d7ea6 | ||
|
|
8b915a15ff | ||
|
|
90c5c19220 | ||
|
|
cfe6f96f69 | ||
|
|
77907c5369 | ||
|
|
bf33b54638 | ||
|
|
87451007b9 | ||
|
|
512b30c971 | ||
|
|
f005518686 | ||
|
|
274a219965 | ||
|
|
2392a6a3e2 | ||
|
|
abc4abf84a | ||
|
|
94a3ced83a | ||
|
|
7eb0c678ee | ||
|
|
92460adce6 | ||
|
|
8cfd3fb2ef | ||
|
|
62ef542eaf | ||
|
|
5809078ba9 | ||
|
|
04e54d670c | ||
|
|
dd7c0a7f3d | ||
|
|
71f54cc920 | ||
|
|
6c1e7decfa | ||
|
|
2851325748 | ||
|
|
bd606e5017 | ||
|
|
a5706ec3b0 | ||
|
|
9de994c0d1 | ||
|
|
a346c577cf | ||
|
|
217e4ca8f8 | ||
|
|
f2f47f85c0 | ||
|
|
e9caacc428 | ||
|
|
5070e84f70 | ||
|
|
b130c93af6 | ||
|
|
13432b504f | ||
|
|
0739bb7df8 | ||
|
|
c253c5cc9c | ||
|
|
fe23d9885f | ||
|
|
8f263e1fdb | ||
|
|
a6125a3632 | ||
|
|
e7ee17b71b | ||
|
|
a784bfc0f8 | ||
|
|
5edb63d01c | ||
|
|
b8937d0bae | ||
|
|
f4b3aab7d4 | ||
|
|
6af67d1a4c | ||
|
|
16d975ba5c | ||
|
|
4fc5cafd40 | ||
|
|
4827ae73d5 | ||
|
|
8eddc7aa37 | ||
|
|
1b5cd10f7c | ||
|
|
98a468dadc | ||
|
|
ea4e6c0a4c | ||
|
|
7cd7f6d8ee | ||
|
|
4c39e8c990 | ||
|
|
6c6f654fbe | ||
|
|
b7eaea096e | ||
|
|
904ae8604c | ||
|
|
44d53c448b | ||
|
|
0f91872518 | ||
|
|
e61401d27e | ||
|
|
dc6b2979e4 | ||
|
|
be7ca7d269 | ||
|
|
47b4b4efbb | ||
|
|
4fa07f2b3d | ||
|
|
50034140c4 | ||
|
|
c880e7d69d | ||
|
|
08a6f35ec2 | ||
|
|
67236ffbad | ||
|
|
c73ad50286 | ||
|
|
0910710ac4 | ||
|
|
04c528138b | ||
|
|
1b66cd9643 | ||
|
|
96ab7a80a4 | ||
|
|
d8c3ff199e | ||
|
|
c2dd9fa833 | ||
|
|
0c4ebef579 | ||
|
|
8fe9d41b58 | ||
|
|
b085121369 | ||
|
|
8a4590b2ef | ||
|
|
d67b040683 | ||
|
|
fa219bce9b | ||
|
|
2db61657f2 | ||
|
|
10b85d67e7 | ||
|
|
6d2ee96ba3 | ||
|
|
ca91dc828e | ||
|
|
a74c8e3da3 | ||
|
|
3a53c1dec0 | ||
|
|
9f4d39d9fe | ||
|
|
da8e309957 | ||
|
|
31c19644ed | ||
|
|
2bd9141d4a | ||
|
|
600d444136 | ||
|
|
c3bda6a903 | ||
|
|
c3bd0fcbad | ||
|
|
d61909d3ea | ||
|
|
1755dad7e6 | ||
|
|
991a7c198a | ||
|
|
9b67f0447d | ||
|
|
3b392c99be | ||
|
|
b714f6cc23 | ||
|
|
24ba93607b | ||
|
|
479a6ba4fc | ||
|
|
49d4aac8ec | ||
|
|
d78836b828 | ||
|
|
7a59131d37 | ||
|
|
545be29ad3 | ||
|
|
8553c109c7 | ||
|
|
5ab00bc9c8 | ||
|
|
315c3d50ee | ||
|
|
d5219979a4 | ||
|
|
d42054f3a0 | ||
|
|
72b06e70ee | ||
|
|
94500ae36d | ||
|
|
375cc3aa93 | ||
|
|
5e5d34cc36 | ||
|
|
4eb286a034 | ||
|
|
a824230155 | ||
|
|
c6f2aa4ef2 | ||
|
|
1bc3750ab3 | ||
|
|
36abcee847 | ||
|
|
c7fb2f7047 | ||
|
|
b8b7768eb7 | ||
|
|
7ad9dc6c64 | ||
|
|
decc34551a | ||
|
|
5acb44ede0 | ||
|
|
ef62f87963 | ||
|
|
b5c893381f | ||
|
|
815969bf8b | ||
|
|
afedc1cd9a | ||
|
|
0d57e9e808 | ||
|
|
070e02d7d5 | ||
|
|
7ba6a00617 | ||
|
|
ccc56c2a4c | ||
|
|
e00a88ff49 | ||
|
|
e70bbe4791 | ||
|
|
e527bc860f | ||
|
|
7ff0f62729 | ||
|
|
921e306b9a | ||
|
|
95f0b39c90 | ||
|
|
bed1d26904 | ||
|
|
23057688f9 | ||
|
|
029618f719 | ||
|
|
41a342f026 | ||
|
|
cee8e07046 | ||
|
|
38f7a4e9b6 | ||
|
|
0806e89964 | ||
|
|
f5421ca6b2 | ||
|
|
eea7697175 | ||
|
|
777ce7b561 | ||
|
|
864ece5539 | ||
|
|
2610eb9acb | ||
|
|
326c871224 | ||
|
|
567a2c7b89 | ||
|
|
924eeccd53 | ||
|
|
05070faf12 | ||
|
|
4a63cf4843 | ||
|
|
ad8069314d | ||
|
|
1d65b74273 | ||
|
|
9366c48351 | ||
|
|
5a14319753 | ||
|
|
279a4f7888 | ||
|
|
3c1ae689a7 | ||
|
|
d3418d494c | ||
|
|
a99bd50e52 | ||
|
|
c839427246 | ||
|
|
8b178594ff | ||
|
|
dd3a136b18 | ||
|
|
786aeef998 | ||
|
|
48696918de | ||
|
|
45e4cf506f | ||
|
|
88be35ddc2 | ||
|
|
8fb6e1f48d | ||
|
|
9ee0d36a1d | ||
|
|
ecf70b05f2 | ||
|
|
f240e0bab6 | ||
|
|
4081605e4b | ||
|
|
c54acdb9db | ||
|
|
f332ff2d89 | ||
|
|
489dae2b58 | ||
|
|
ec77608840 | ||
|
|
f852ce6f7b | ||
|
|
f5a69a1dab | ||
|
|
e500919d25 | ||
|
|
a1e865061c | ||
|
|
596e92404a | ||
|
|
2640f5af94 | ||
|
|
0605e9fdcf | ||
|
|
cf68da0b19 | ||
|
|
d3c474b295 | ||
|
|
c9300e07c2 | ||
|
|
7a645a6d8a | ||
|
|
fa2185e5ab | ||
|
|
cab94a7bba | ||
|
|
caa9cb8268 | ||
|
|
66ac61450e | ||
|
|
59f81def56 | ||
|
|
92862028b7 | ||
|
|
b0ba7dfc50 | ||
|
|
fe3abeda9f | ||
|
|
5cc33461dd | ||
|
|
7b93f2fdc5 | ||
|
|
3fdfb30e33 | ||
|
|
cdcf8633bb | ||
|
|
219743964d | ||
|
|
e7927ef4ea | ||
|
|
8c1f04bd4c | ||
|
|
136587c96f | ||
|
|
23664ec448 | ||
|
|
6b1a3c4489 | ||
|
|
fa4ebe5c53 | ||
|
|
28ef4a9e38 | ||
|
|
5d1053552c | ||
|
|
0a38ca1660 | ||
|
|
5791e3b58e | ||
|
|
2bfd2fa0fd | ||
|
|
0793267bf0 | ||
|
|
eca25c0b7d | ||
|
|
a8bad65556 | ||
|
|
6ef31ba33a | ||
|
|
c15216b385 | ||
|
|
a1ff35769b | ||
|
|
22e82ae30f | ||
|
|
2d117bc4ad | ||
|
|
6347ca8065 | ||
|
|
c39836ddc8 | ||
|
|
fb35a82bf1 | ||
|
|
44c5c18f45 | ||
|
|
e0cceeb88c | ||
|
|
4a5f6f2e24 | ||
|
|
8b1748fea0 | ||
|
|
82919f0d5c | ||
|
|
1f6ded7b4e | ||
|
|
a0d2873156 | ||
|
|
0519d54229 | ||
|
|
c181874335 | ||
|
|
203a42c35f | ||
|
|
8eba0eb25b | ||
|
|
152e76220a | ||
|
|
8897cc9ce6 | ||
|
|
335cd02c2d | ||
|
|
758d92b33e | ||
|
|
28eef45d28 | ||
|
|
d8790a34d3 | ||
|
|
3b058185c6 | ||
|
|
2261e7eedc | ||
|
|
19a196493f | ||
|
|
d10b5e8d1a | ||
|
|
1cacefc226 | ||
|
|
efcd2833f1 | ||
|
|
2f9323d9e9 | ||
|
|
8b2f4b4ce0 | ||
|
|
ab046dc634 | ||
|
|
ef3f9b15f0 | ||
|
|
68463e2fd2 | ||
|
|
f75eca94e0 | ||
|
|
a23030b83e | ||
|
|
321cf2502a | ||
|
|
4996f912b4 | ||
|
|
09e24cb17d | ||
|
|
ac32d13e10 | ||
|
|
b0496d1207 | ||
|
|
a076239fc8 | ||
|
|
7cf0f9090f | ||
|
|
479f068673 | ||
|
|
9b326f15fa | ||
|
|
f094a5b9eb | ||
|
|
4367850e5d | ||
|
|
f44a4d6468 | ||
|
|
5206dd55d2 | ||
|
|
988bf849a1 | ||
|
|
6fee43fc6f | ||
|
|
6ec4387ea1 | ||
|
|
e2f59ef548 | ||
|
|
92a6fafd20 | ||
|
|
4721f5f9af | ||
|
|
3864838da2 | ||
|
|
8e77df69d5 | ||
|
|
12770b03e8 | ||
|
|
c8a692b4b4 | ||
|
|
2571ebb0c2 | ||
|
|
283dbfb593 | ||
|
|
83f227034f | ||
|
|
c5f514a4e6 | ||
|
|
9fb15f631e | ||
|
|
3d8f4c90ba | ||
|
|
5597dcb321 | ||
|
|
ab2912e3c2 | ||
|
|
b705931ff0 | ||
|
|
2974286209 | ||
|
|
1cec514b39 | ||
|
|
8ecd49cbf0 | ||
|
|
67a7669ff4 | ||
|
|
e80545a7d3 | ||
|
|
6afe0d4732 | ||
|
|
f8280b0e1a | ||
|
|
aa20ce7d2c | ||
|
|
6074a23242 | ||
|
|
9ceac3ff8f | ||
|
|
126a3efb92 | ||
|
|
9205f507b0 | ||
|
|
bff975f08c | ||
|
|
262bcee750 | ||
|
|
a3f12b18b1 | ||
|
|
ad635ec2d1 | ||
|
|
affd36e857 | ||
|
|
332a45f333 | ||
|
|
6cc48f7e5d | ||
|
|
5b6192d738 | ||
|
|
980733a96d | ||
|
|
331209d8b5 | ||
|
|
9116cf382b | ||
|
|
8cc2b7a5df | ||
|
|
dab01ad668 | ||
|
|
1fca114f6a | ||
|
|
70ee460a14 | ||
|
|
07c95aea4e | ||
|
|
a3d8a384fa | ||
|
|
432d4782a5 | ||
|
|
424f5bdf31 | ||
|
|
13b16f9729 | ||
|
|
82563df3bf | ||
|
|
adb7b62a62 | ||
|
|
02c0b2b486 | ||
|
|
c876db8cae | ||
|
|
3ce88daa8b | ||
|
|
4cec6c4f2f | ||
|
|
e38bf06257 | ||
|
|
0deed1ff9b | ||
|
|
a05a0ae46b | ||
|
|
fe3906a7cb | ||
|
|
e5ed3a1c6c | ||
|
|
2bbff71109 | ||
|
|
c492551111 | ||
|
|
b217c4ffa8 | ||
|
|
96e9d6a872 | ||
|
|
fef288fed2 | ||
|
|
2fdb98079d | ||
|
|
bbabf21abf | ||
|
|
6d24977dd2 | ||
|
|
c2b5925600 | ||
|
|
91e76a296f | ||
|
|
e4eee902d4 | ||
|
|
db71f17dba | ||
|
|
b754037949 | ||
|
|
7bd76d869b | ||
|
|
c25967a094 | ||
|
|
bcb6370b0e | ||
|
|
17faf4504c | ||
|
|
53c335f106 | ||
|
|
cd8951439e | ||
|
|
0e5e2dc92e | ||
|
|
4d50bf0ad9 | ||
|
|
1cfa79554d | ||
|
|
567e620565 | ||
|
|
5933fdbf39 | ||
|
|
4c21a29a9f | ||
|
|
7c21f3b48d | ||
|
|
6f4167700c | ||
|
|
efae35bbd8 | ||
|
|
8dbd926d9e | ||
|
|
c6e658cfca | ||
|
|
b77dcf4bea | ||
|
|
1e3cfbca03 | ||
|
|
1ed231747b | ||
|
|
a926eaa86d | ||
|
|
acd8ec2c31 | ||
|
|
441a9dbea0 | ||
|
|
63e92c49df | ||
|
|
49dd8bcf51 | ||
|
|
942f4c4ffd | ||
|
|
43791f3a71 | ||
|
|
321bea59fb | ||
|
|
601fd16cba | ||
|
|
a9cddc10a9 | ||
|
|
03fc159aec | ||
|
|
59b596e1ee | ||
|
|
1fe6626edb | ||
|
|
fa8cffb3a2 | ||
|
|
11daf8dde8 | ||
|
|
0d6ac67c04 | ||
|
|
978dc88499 | ||
|
|
655868d803 | ||
|
|
92ff4ab76f | ||
|
|
48a6db6598 | ||
|
|
a97d050016 | ||
|
|
e888d8aa88 | ||
|
|
59ca82128a | ||
|
|
0620462efb | ||
|
|
f99f1e187c | ||
|
|
937a851baa | ||
|
|
8e396f8e91 | ||
|
|
bd74676685 | ||
|
|
70e012bc45 | ||
|
|
3bb3434a8d | ||
|
|
2121039a2b | ||
|
|
5bab5a2398 | ||
|
|
2ca8be0bb2 | ||
|
|
227448f061 | ||
|
|
0b026dc5a2 | ||
|
|
3ba268ed9c | ||
|
|
c4b09c7526 | ||
|
|
164e517a54 | ||
|
|
fd75e791a7 | ||
|
|
7eb9f910ba | ||
|
|
78cd3298aa | ||
|
|
2f5dfbb728 | ||
|
|
3750668aad | ||
|
|
dc2acc5bf5 | ||
|
|
f7db275bc4 | ||
|
|
7171a34364 | ||
|
|
f1260e6869 | ||
|
|
0b4f2bafe6 | ||
|
|
c5cf576deb | ||
|
|
bfd7f71601 | ||
|
|
87718f91ab | ||
|
|
3918395715 | ||
|
|
dec9c6d96e | ||
|
|
0c651a890c | ||
|
|
e00462992c | ||
|
|
951c65e5a1 | ||
|
|
0f19b148f6 | ||
|
|
c750be6fc6 | ||
|
|
d1003f08de | ||
|
|
386c45fd4d | ||
|
|
725d203c32 | ||
|
|
07a14ce350 | ||
|
|
77c2c8d77c | ||
|
|
9ea7f100cc | ||
|
|
51487a75e9 | ||
|
|
500b8e190d | ||
|
|
9102c12c6d | ||
|
|
cb45ee8879 | ||
|
|
ecae47236e | ||
|
|
d0ca0886bb | ||
|
|
18411f4b5f | ||
|
|
2c383e7216 | ||
|
|
cac6d3e5ac | ||
|
|
bd985d67d8 | ||
|
|
6f0a70fa66 | ||
|
|
cbe6de2a2d | ||
|
|
4885d65ec9 | ||
|
|
047896ac16 | ||
|
|
fbe3a563c3 | ||
|
|
0c453fda0b | ||
|
|
a1f74e9c63 | ||
|
|
763fa1cf0c | ||
|
|
c8e8ccfa22 | ||
|
|
597342bf15 | ||
|
|
8338b2fb49 | ||
|
|
fed0b09c4e | ||
|
|
3e76482713 | ||
|
|
d6325d902e | ||
|
|
615adc5fe6 | ||
|
|
2bdb728e87 | ||
|
|
5e82d653a1 | ||
|
|
27653b7fbf | ||
|
|
af1530953e | ||
|
|
87290af774 | ||
|
|
8469d7727d | ||
|
|
44e9ffc5ca | ||
|
|
2e86d1f9bb | ||
|
|
112c999818 | ||
|
|
858e5e9720 | ||
|
|
f2f7b10d15 | ||
|
|
4e3c2f237c | ||
|
|
c246e918f4 | ||
|
|
b76f185cb6 | ||
|
|
9d7097177d | ||
|
|
c6587596b1 | ||
|
|
b661aad9ac | ||
|
|
ca0a0a4a3d | ||
|
|
a9cd67873c | ||
|
|
b58812e7f1 | ||
|
|
9e2b4380d5 | ||
|
|
8ae8430e7c | ||
|
|
2ee25fda61 | ||
|
|
e766286d92 | ||
|
|
4df59a752a | ||
|
|
e0bf57ae36 | ||
|
|
5df66bb179 | ||
|
|
b5256ef70b | ||
|
|
6c8fec96b6 | ||
|
|
cd139bd4ec | ||
|
|
17b0c819e4 | ||
|
|
79c7d736f0 | ||
|
|
b627f93cf1 | ||
|
|
7d632ab3dd | ||
|
|
bdf80a683c | ||
|
|
ed7292abd3 | ||
|
|
e92f042677 | ||
|
|
53cf9e7422 | ||
|
|
954afd78b2 | ||
|
|
957ad2b4b1 | ||
|
|
7187c6132a | ||
|
|
b3f0d7c756 | ||
|
|
0cdfdee18f | ||
|
|
a283f56d05 | ||
|
|
e6fd78ce93 | ||
|
|
aeed5f029e | ||
|
|
04484d55de | ||
|
|
476cba228d | ||
|
|
115f9f0644 | ||
|
|
a9c2a95366 | ||
|
|
29f3891a68 | ||
|
|
7b602ef607 | ||
|
|
15e555c7f1 | ||
|
|
f4fb49d32f | ||
|
|
89be2fb736 | ||
|
|
62f0885852 | ||
|
|
355e155e69 | ||
|
|
ae1584ff3c | ||
|
|
4a7686cd33 | ||
|
|
799eeb0cb8 | ||
|
|
8452e275d0 | ||
|
|
53268000e7 | ||
|
|
52febfe3fc | ||
|
|
8fcfed495a | ||
|
|
2dfe76b082 | ||
|
|
11d8751d29 | ||
|
|
b03c3a29e0 | ||
|
|
53e8982e05 | ||
|
|
4a30841ad8 | ||
|
|
234ebadb8d | ||
|
|
11ee20fa36 | ||
|
|
440599545f | ||
|
|
44ba088cb4 | ||
|
|
08d3798722 | ||
|
|
56ff8e438e | ||
|
|
3590a3589d | ||
|
|
7674c82e1f | ||
|
|
b93b21a7f2 | ||
|
|
f53925848c | ||
|
|
eedc88b56a | ||
|
|
1102fec2a0 | ||
|
|
589fefe4b9 | ||
|
|
cfc867bd18 | ||
|
|
5bc28e3016 | ||
|
|
23b7ccca7f | ||
|
|
e9d6286a1d | ||
|
|
48321857e4 | ||
|
|
156da15715 | ||
|
|
4a0d7965cb | ||
|
|
1f522823ff | ||
|
|
6795a280fd | ||
|
|
f369e22638 | ||
|
|
a278da2eba | ||
|
|
37b2bdba79 | ||
|
|
e9519db974 | ||
|
|
dd7a24ebce | ||
|
|
bc92a7d155 | ||
|
|
a68db84df6 | ||
|
|
7b9bba3190 | ||
|
|
bcec0af232 | ||
|
|
0d437c4102 | ||
|
|
feff7bccd3 | ||
|
|
b12de3f01b | ||
|
|
0d108f12e4 | ||
|
|
4aca2ca33b | ||
|
|
9a967ae514 | ||
|
|
9481c39874 | ||
|
|
1e02065982 | ||
|
|
1fee0da689 | ||
|
|
c760cf8418 | ||
|
|
cdee5997af | ||
|
|
4289280cdc | ||
|
|
962dfa17c5 | ||
|
|
0a21aef601 | ||
|
|
8cbbd504cf | ||
|
|
91b23c8367 | ||
|
|
3729be263f | ||
|
|
ea91f4217a | ||
|
|
7fab3ce0b1 | ||
|
|
ef7d675d67 | ||
|
|
2b9d29a0fc | ||
|
|
95b95d012c | ||
|
|
4af7d5bca7 | ||
|
|
d879eb235f | ||
|
|
4f129d035b | ||
|
|
7a354c4ff4 | ||
|
|
364826b3b3 | ||
|
|
e9b308da46 | ||
|
|
94cfa2602f | ||
|
|
3533bd0504 | ||
|
|
1a51a7df9e | ||
|
|
615be89951 | ||
|
|
912ca36a1f | ||
|
|
fba93805dc | ||
|
|
96d66f4624 | ||
|
|
c3bae63e41 | ||
|
|
6c22aceabc | ||
|
|
92a77dfe7f | ||
|
|
4f2dbeda28 | ||
|
|
bec2de08fe | ||
|
|
db192e1e01 | ||
|
|
454654a9cc | ||
|
|
1018bc56eb | ||
|
|
f920dc87d0 | ||
|
|
8b97caae46 | ||
|
|
3b74aab818 | ||
|
|
e78b4939b3 | ||
|
|
621b5fc2db | ||
|
|
6ada069d5a | ||
|
|
50db384be1 | ||
|
|
ae7225ae83 | ||
|
|
911ba333a2 | ||
|
|
5cd8cce531 | ||
|
|
6a2a76cea9 | ||
|
|
7a9a3d30c9 | ||
|
|
034ca4d5eb | ||
|
|
00e3fa32fb | ||
|
|
0133bdfbe3 | ||
|
|
e563def5ba | ||
|
|
b3910f4e4d | ||
|
|
4a7b8fe839 | ||
|
|
fc56544da4 | ||
|
|
c839d25722 | ||
|
|
c6b5ecbbdb | ||
|
|
d3473afa23 | ||
|
|
379b28eb85 | ||
|
|
7f5bd33ead | ||
|
|
eef6fb9891 | ||
|
|
4a7f52ab2c | ||
|
|
10b249a162 | ||
|
|
5fc5fce663 | ||
|
|
f00fe3c0b1 | ||
|
|
3047d51613 | ||
|
|
f9f7146960 | ||
|
|
ca9dc3103a | ||
|
|
c03afa379c | ||
|
|
cbacc98e3f | ||
|
|
84daf14f1b | ||
|
|
4af28b2a46 | ||
|
|
acbc01933c | ||
|
|
7ec78eecbd | ||
|
|
87c5e37f5e | ||
|
|
d02959e3ed | ||
|
|
b844d8b750 | ||
|
|
0a3010b29f | ||
|
|
2b380d03c9 | ||
|
|
3f70253a3f | ||
|
|
165e294298 | ||
|
|
f7c9f45508 | ||
|
|
af2a924301 | ||
|
|
3981e83de5 | ||
|
|
88b9721e3f | ||
|
|
4946af1448 | ||
|
|
9959dcfa49 | ||
|
|
cfb13fad22 | ||
|
|
4e3f3a052d | ||
|
|
dc7ae9ed20 | ||
|
|
929badf4c6 | ||
|
|
c4a3f2c04f | ||
|
|
a933e458b3 | ||
|
|
06b8320815 | ||
|
|
7f3aceafd2 | ||
|
|
da5979931c | ||
|
|
d8c7e75095 | ||
|
|
187506c97f | ||
|
|
145c6d1e4f | ||
|
|
e2973f27f9 | ||
|
|
976b8180ae | ||
|
|
37acf41d43 | ||
|
|
6f26778491 | ||
|
|
834d815c87 | ||
|
|
57e58c445b | ||
|
|
8a1a8342d6 | ||
|
|
fa70ddc2c5 | ||
|
|
8ca32bb494 | ||
|
|
f6c82eba0c | ||
|
|
344044a315 | ||
|
|
b10805dc4c | ||
|
|
07f397e2ed | ||
|
|
054dc439d2 | ||
|
|
5008dcbdd4 | ||
|
|
9c6650963f | ||
|
|
d482d57689 | ||
|
|
edf6516085 | ||
|
|
957ac66e14 | ||
|
|
07ce84c4e7 | ||
|
|
918636ff03 | ||
|
|
83a6adbfa9 | ||
|
|
fcbc1d562f | ||
|
|
c3b4b58075 | ||
|
|
568b62a8a4 | ||
|
|
da34e7f507 | ||
|
|
a0c31b47e5 | ||
|
|
5fb677c0c5 | ||
|
|
168476382a | ||
|
|
7fa6a29814 | ||
|
|
f2b51da0ab | ||
|
|
53726746b8 | ||
|
|
fe0b59f559 | ||
|
|
c014dee6dc | ||
|
|
90c69d961e | ||
|
|
342f7db678 | ||
|
|
9eb704f85a | ||
|
|
7754a91929 | ||
|
|
e4dc639e54 | ||
|
|
5d90101671 | ||
|
|
437fb70852 | ||
|
|
d598404c48 | ||
|
|
32c7088600 | ||
|
|
ccede29816 | ||
|
|
b55b7e2f7b | ||
|
|
9217a6a253 | ||
|
|
07c1319b99 | ||
|
|
714b5dc26e | ||
|
|
1f715958f9 | ||
|
|
0922aca873 | ||
|
|
30ec6181b5 | ||
|
|
b28d586612 | ||
|
|
f48aacf477 | ||
|
|
bfa868a440 | ||
|
|
f01ff3a277 | ||
|
|
d88e6bf688 | ||
|
|
a3cdacd088 | ||
|
|
81d99c855f | ||
|
|
5cd110f625 | ||
|
|
416895ff30 | ||
|
|
e41abb6e92 | ||
|
|
a6440a3fa6 | ||
|
|
2dece7ecaf | ||
|
|
7aae525587 | ||
|
|
ac5314093b | ||
|
|
1524fb9fa9 | ||
|
|
957549460b | ||
|
|
3b33f54fb8 | ||
|
|
42ab6b6b66 | ||
|
|
f59a5bbabc | ||
|
|
0be371d747 | ||
|
|
2b52210291 | ||
|
|
96a7bce78e | ||
|
|
c1e1ea697c | ||
|
|
874d6ebf2c | ||
|
|
77f5eb703c | ||
|
|
af53ae8329 | ||
|
|
8f76b8880e | ||
|
|
fa398734be | ||
|
|
362d20a8c7 | ||
|
|
6a33b8aeeb | ||
|
|
d4e06ac436 | ||
|
|
817dcd37e0 | ||
|
|
25bfd3c50f | ||
|
|
b13c902fb0 | ||
|
|
c95ef44b02 | ||
|
|
162727590c | ||
|
|
7e159844fb | ||
|
|
787b79cc2c | ||
|
|
b77652b499 | ||
|
|
0c8444b8ed | ||
|
|
3e6ee799ba | ||
|
|
dd14ccb115 | ||
|
|
ba0fcd27c3 | ||
|
|
d476e67067 | ||
|
|
4588f5e9ab | ||
|
|
68f54d364b | ||
|
|
7dba18e7b9 | ||
|
|
67b265fe96 | ||
|
|
8289269a86 | ||
|
|
9f711ed821 | ||
|
|
73e2ab5125 | ||
|
|
7ea2ab1672 | ||
|
|
c821e903f8 | ||
|
|
54db04521a | ||
|
|
91fdecd76f | ||
|
|
f140a74a13 | ||
|
|
4854a2a81b | ||
|
|
d94bb65006 | ||
|
|
6ca5280b2c | ||
|
|
5da3e1deea | ||
|
|
1ae85d0e39 | ||
|
|
256e3a467c | ||
|
|
4477fe4dd6 | ||
|
|
5d1e245858 | ||
|
|
ec750a44c9 | ||
|
|
006f1d9802 | ||
|
|
638b3d4ee1 | ||
|
|
a1cc1651fa | ||
|
|
9fe141f5ad | ||
|
|
d52f0c7d40 | ||
|
|
bb55c4a855 | ||
|
|
f1a06b14de | ||
|
|
286f3dc093 | ||
|
|
a731322782 | ||
|
|
0db07ec25e | ||
|
|
bc112ba65f | ||
|
|
62ba322658 | ||
|
|
02135b550d | ||
|
|
ee4b06bb50 | ||
|
|
16c5435ca8 | ||
|
|
2595049748 | ||
|
|
5911691c0d | ||
|
|
e369bddc84 | ||
|
|
dccf2bbb4a | ||
|
|
eaab3fc038 | ||
|
|
858e1aba67 | ||
|
|
19eff7791d | ||
|
|
c81af4ffe0 | ||
|
|
9675e4233b | ||
|
|
e6a176bb1e | ||
|
|
ff0980914b | ||
|
|
43e5ccd0a7 | ||
|
|
66d6272942 | ||
|
|
2f1b828967 | ||
|
|
622636dcf1 | ||
|
|
0c22c276bf | ||
|
|
7a4a79c74e | ||
|
|
06f454e1d3 | ||
|
|
c1dbd52de1 | ||
|
|
c3f5679188 | ||
|
|
97e2628f95 | ||
|
|
6cecfcb704 | ||
|
|
022a5a16f5 | ||
|
|
a39a834e75 | ||
|
|
2a1210384a | ||
|
|
d497611069 | ||
|
|
46d8786f5a | ||
|
|
b8028729eb | ||
|
|
30e7768a87 | ||
|
|
10dc663e07 | ||
|
|
42fc57d761 | ||
|
|
74cd2f4844 | ||
|
|
a15135f1c1 | ||
|
|
ccd84c0be6 | ||
|
|
510215f284 | ||
|
|
c7ea0aacd6 | ||
|
|
f7f089d2d4 | ||
|
|
82721c77a1 | ||
|
|
1c9bf7d91c | ||
|
|
9bf78396cb | ||
|
|
d994e4719c | ||
|
|
44b886bb76 | ||
|
|
8d2f012bcf | ||
|
|
a86deed5f6 | ||
|
|
3fd9ad7a60 | ||
|
|
319a5cf97c | ||
|
|
0fd503d6af | ||
|
|
bf696026bd | ||
|
|
734657244b | ||
|
|
d2470e4f9c | ||
|
|
28a2792280 | ||
|
|
cd985a33d8 | ||
|
|
726d2beffd | ||
|
|
f04be3fc1b | ||
|
|
b6927410d9 | ||
|
|
44b2e1ef8b | ||
|
|
3d01e6af89 | ||
|
|
00387b2076 | ||
|
|
f9bf514801 | ||
|
|
fa27bddfab | ||
|
|
f27e8f8ddc | ||
|
|
5b2623ff2e | ||
|
|
a83a726b6e | ||
|
|
93df7e00a7 | ||
|
|
6b7748a88d | ||
|
|
f102c77fa2 | ||
|
|
a4fa261b77 | ||
|
|
8a15fefc6c | ||
|
|
12a4cc16be | ||
|
|
6335716342 | ||
|
|
db0602ac2a | ||
|
|
390ad530f1 | ||
|
|
6eb2e8d68a | ||
|
|
b804b3b221 | ||
|
|
936c1118bd | ||
|
|
4ba7b8a8ff | ||
|
|
70601e9da0 | ||
|
|
c32d1f9614 | ||
|
|
e031f78ad4 | ||
|
|
7d0273051a | ||
|
|
29d537571b | ||
|
|
39f243f76b | ||
|
|
0712360cc9 | ||
|
|
02c125cbb4 | ||
|
|
13256fb7e9 | ||
|
|
f11d757807 | ||
|
|
2e123849fb | ||
|
|
2f6cfaf0e9 | ||
|
|
f9b216d6f9 | ||
|
|
5fdd10d77e | ||
|
|
41de02d528 | ||
|
|
1c3d08f23a | ||
|
|
0f1dc1fd50 | ||
|
|
cd06018820 | ||
|
|
7816eb6344 | ||
|
|
9813f4b55f | ||
|
|
f81ca21b22 | ||
|
|
f1b7620c9e | ||
|
|
7d5c453f59 | ||
|
|
bc4feb42b5 | ||
|
|
ca9920874f | ||
|
|
415991f6fc | ||
|
|
20c52def19 | ||
|
|
7dcacbcfc4 | ||
|
|
34bf1560a9 | ||
|
|
39195ac97a | ||
|
|
6aa71e1f72 | ||
|
|
257a6c45f8 | ||
|
|
d34a11b584 | ||
|
|
ca64c96133 | ||
|
|
ff734e3269 | ||
|
|
d028a60cc2 | ||
|
|
577f58149c | ||
|
|
4b97e191b8 | ||
|
|
15a148ab10 | ||
|
|
5ac7741ca9 | ||
|
|
4c7cff6e8e | ||
|
|
c6ca85b525 | ||
|
|
99f45b474e | ||
|
|
ee44c90e85 | ||
|
|
2c4fa48f46 | ||
|
|
90fcd9369d | ||
|
|
923feda9f7 | ||
|
|
6d7d2ea5fe | ||
|
|
4874a1801b | ||
|
|
479d8fc0f6 | ||
|
|
1c346b2531 | ||
|
|
5cdebaf896 | ||
|
|
600602f9dc | ||
|
|
2a530bb9d2 | ||
|
|
acdad5caf3 | ||
|
|
b42b243287 | ||
|
|
a76f5f3db7 | ||
|
|
4e9f745d4a | ||
|
|
101961a7c6 | ||
|
|
29d1f860c1 | ||
|
|
2663e73f1c | ||
|
|
1f9d0bb196 | ||
|
|
ff9f262fac | ||
|
|
472dc3bd41 | ||
|
|
6f91b93519 | ||
|
|
47291f68b2 | ||
|
|
2b5ef3c572 | ||
|
|
9c50496d93 | ||
|
|
80488e2f23 | ||
|
|
ad8da7166b | ||
|
|
55cb918c51 | ||
|
|
ac55c5ccf7 | ||
|
|
5bcf90766f | ||
|
|
8f12fdea4a | ||
|
|
6f687ee402 | ||
|
|
9dfe98abb0 | ||
|
|
399cf70b92 | ||
|
|
571790097a | ||
|
|
21f3c7c8c2 | ||
|
|
9d26167ec1 | ||
|
|
ba4906d05c | ||
|
|
e13a11eb7f | ||
|
|
72b214b8db | ||
|
|
84a8fb71b8 | ||
|
|
4f5272cab9 | ||
|
|
5895047e23 | ||
|
|
50bcf8db34 | ||
|
|
7defd3bbed | ||
|
|
b9ecc931b0 | ||
|
|
b84a8fd737 | ||
|
|
2b1a2ce09c | ||
|
|
bcf36610e1 | ||
|
|
1bb3254d4d | ||
|
|
0f95d507c4 | ||
|
|
aa58e21bda | ||
|
|
eac0412d18 | ||
|
|
0c8aa84f2f | ||
|
|
3d874d1618 | ||
|
|
b8edd99dbd | ||
|
|
0df5ebf0fa | ||
|
|
809535b934 | ||
|
|
854e957b78 | ||
|
|
df24f29232 | ||
|
|
14c7d9ab14 | ||
|
|
0e36ac6b72 | ||
|
|
0d2cdbbdfe | ||
|
|
48f9bee21e | ||
|
|
dd8fc049ff | ||
|
|
abd22f1273 | ||
|
|
4a5817d8ba | ||
|
|
eab084c9a2 | ||
|
|
80ea2383a7 | ||
|
|
ec76fbe027 | ||
|
|
c772038e77 | ||
|
|
59b1a8e71c | ||
|
|
83c38876fe | ||
|
|
9163c40a1a | ||
|
|
8b79380977 | ||
|
|
34c9d895c8 | ||
|
|
bf8bb83ec5 | ||
|
|
328697952f | ||
|
|
3c19b89d9a | ||
|
|
ae9f394906 | ||
|
|
8467f36b80 | ||
|
|
43a9571b2c | ||
|
|
bbef71dc7d | ||
|
|
c4df3c6562 | ||
|
|
0ad3bfd0ab | ||
|
|
fb7c450b76 | ||
|
|
3fc70519cf | ||
|
|
98c2bf8ff2 | ||
|
|
f9c8bf15bb | ||
|
|
a7e19ffb0b | ||
|
|
7609a1c7c6 | ||
|
|
087e2d6e35 | ||
|
|
bb7710a5a2 | ||
|
|
0d582e0e79 | ||
|
|
3d0579cc08 | ||
|
|
352e390c7b | ||
|
|
394037a127 | ||
|
|
9d4e235cf6 | ||
|
|
cfbc1a6b48 | ||
|
|
31b8b58de9 | ||
|
|
a77a835694 | ||
|
|
dca5c5108b | ||
|
|
e14e4e156c | ||
|
|
05ce65d9d2 | ||
|
|
b952e45036 | ||
|
|
4c630512fe | ||
|
|
0461d25de6 | ||
|
|
2df120af72 | ||
|
|
791b7e1a1b | ||
|
|
f6f4e59473 | ||
|
|
60924e82e2 | ||
|
|
75bd427b8e | ||
|
|
715118ce39 | ||
|
|
e3deb8275d | ||
|
|
c30e12f956 | ||
|
|
983b23db92 | ||
|
|
ed2da9bedb | ||
|
|
409ff3c179 | ||
|
|
39eab72293 | ||
|
|
71ea2bec86 | ||
|
|
c9af6ca94b | ||
|
|
72d5bac69f | ||
|
|
6e0733afa2 | ||
|
|
e660cc50c6 | ||
|
|
e6b40f54cd | ||
|
|
c2af21169d | ||
|
|
4f7af97f8c | ||
|
|
57f54952c3 | ||
|
|
b321b6d9db | ||
|
|
56c5227cf7 | ||
|
|
ae2931ba1b | ||
|
|
9e3589ec4d | ||
|
|
61b7094dbd | ||
|
|
50ecc751d1 | ||
|
|
bb536a0eaa | ||
|
|
8b7527318d | ||
|
|
f2ac0145da | ||
|
|
06fe0f1bcc | ||
|
|
7ea2447246 | ||
|
|
0adf4477a3 | ||
|
|
b3311fd59d | ||
|
|
ae109f13a2 | ||
|
|
cb1901e111 | ||
|
|
bbc052bedc | ||
|
|
f2797ec262 | ||
|
|
a21727741f | ||
|
|
5f022269b1 | ||
|
|
0e76fcf706 | ||
|
|
6b4dc2901d | ||
|
|
bcf864fce3 | ||
|
|
0168d8fbc8 | ||
|
|
88b1c1b926 | ||
|
|
1f93827b63 | ||
|
|
8e3ba0bba3 | ||
|
|
42a0441cb8 | ||
|
|
7b091b86d2 | ||
|
|
f346eaf693 | ||
|
|
038be89766 | ||
|
|
a682dd9362 | ||
|
|
387e8aadc6 | ||
|
|
da273519fd | ||
|
|
8c2d6bb31b | ||
|
|
3cb4a029e0 | ||
|
|
037f952136 | ||
|
|
7fc441801d | ||
|
|
c389e057b4 | ||
|
|
2c7829f50e | ||
|
|
0593074196 | ||
|
|
c7626150fc | ||
|
|
f6990fedc7 | ||
|
|
adb02376eb | ||
|
|
65b6eb0c27 | ||
|
|
654354e681 | ||
|
|
f1a709e074 | ||
|
|
87b011e7e8 | ||
|
|
6bb7c2d7b3 | ||
|
|
7d9770762c | ||
|
|
df8c8f025c | ||
|
|
51264c30cc | ||
|
|
1d5fb97981 | ||
|
|
a06540e471 | ||
|
|
f79dc1c2e7 | ||
|
|
8a94c597a0 | ||
|
|
8a9a3a00bd | ||
|
|
8c8b4ee332 | ||
|
|
a295ac6590 | ||
|
|
e49e0d2705 | ||
|
|
4fd20185e9 | ||
|
|
920125794a | ||
|
|
ca6c28ed93 | ||
|
|
e9757c46e3 | ||
|
|
7e840acd19 | ||
|
|
6f76db9c6c | ||
|
|
86489dd5a7 | ||
|
|
33f139e516 | ||
|
|
30d9331079 | ||
|
|
8207dc756a | ||
|
|
1887594d8a | ||
|
|
ee17b41e62 | ||
|
|
5e8d775b87 | ||
|
|
f4d457998f | ||
|
|
bd0175c167 | ||
|
|
81ffe96c76 | ||
|
|
e5fbe651d8 | ||
|
|
a91112e5d9 | ||
|
|
2b5f421501 | ||
|
|
ecd7905e8f | ||
|
|
8f989f318b | ||
|
|
7b9dad44d1 | ||
|
|
f5eab48017 | ||
|
|
66ff762fbb | ||
|
|
2bdd01d084 | ||
|
|
2bdc4cdffa | ||
|
|
90a6d484b7 | ||
|
|
021aa51707 | ||
|
|
48fffd7a7b | ||
|
|
17033037eb | ||
|
|
f43b913302 | ||
|
|
f7b087ed8f | ||
|
|
8cecbe31a7 | ||
|
|
f2055b0d80 | ||
|
|
28e5bedf49 | ||
|
|
f8a9b922be | ||
|
|
2a199af8f7 | ||
|
|
2373020225 | ||
|
|
e13d09242c | ||
|
|
09eba4c38f | ||
|
|
2aa23a317d | ||
|
|
5cd513859d | ||
|
|
c6cba55667 | ||
|
|
65ce6ddf1d | ||
|
|
fa7b1404c1 | ||
|
|
61b528c85d | ||
|
|
77b1b247c4 | ||
|
|
a06430c5fa | ||
|
|
0e38aa7f37 | ||
|
|
707ce53c16 | ||
|
|
19982e5551 | ||
|
|
170bbea166 | ||
|
|
6b5ea675c3 | ||
|
|
d873aec9e6 | ||
|
|
0d1efb61e2 | ||
|
|
a27c2f7a80 | ||
|
|
36d85eb02e | ||
|
|
9ae0940e99 | ||
|
|
2f4e12916d | ||
|
|
c860d74cba | ||
|
|
8cd3e16e26 | ||
|
|
94063f7862 | ||
|
|
a0ff708d29 | ||
|
|
6bfbeb3dfa | ||
|
|
3158d28264 | ||
|
|
997e84f117 | ||
|
|
bc91db64d7 | ||
|
|
82ef6ec659 | ||
|
|
374b55be8a | ||
|
|
72e1c1a7f6 | ||
|
|
173021377e | ||
|
|
17879958ca | ||
|
|
31a8be0434 | ||
|
|
87d619e02a | ||
|
|
f4aa72373b | ||
|
|
3cb9ecae78 | ||
|
|
88caf4f5b6 | ||
|
|
a75ee50533 | ||
|
|
8e941417a5 | ||
|
|
e8d2bbd2c9 | ||
|
|
065a53b997 | ||
|
|
ca5a222aec | ||
|
|
4320c73336 | ||
|
|
7f98265272 | ||
|
|
0b75a8e94e | ||
|
|
eb3e237e47 | ||
|
|
b1796c0acb | ||
|
|
bff10e5711 | ||
|
|
0f559f3f97 | ||
|
|
34aead4d49 | ||
|
|
7cc01e155c | ||
|
|
7fe5fb92b4 | ||
|
|
b084f8a616 | ||
|
|
802a2f3fdb | ||
|
|
06f6f2ff21 | ||
|
|
b37198106d | ||
|
|
604928adc4 | ||
|
|
4a6762540d | ||
|
|
af5176be70 | ||
|
|
482006ed1a | ||
|
|
5923e20b7e | ||
|
|
14cca4610b | ||
|
|
2dbb0093c1 | ||
|
|
d91b6e9a1b | ||
|
|
ada55bd9e2 | ||
|
|
5113de875e | ||
|
|
e079006a4b | ||
|
|
07561794e9 | ||
|
|
75a0da31fb | ||
|
|
33ee2a43c5 | ||
|
|
dcb6a88c63 | ||
|
|
eeda822196 | ||
|
|
060f59daa8 | ||
|
|
4117614861 | ||
|
|
e76440e940 | ||
|
|
f8490a8850 | ||
|
|
ee1cc99c65 | ||
|
|
dcf7e7cf0c | ||
|
|
4c8bcd918b | ||
|
|
a26bb0390d | ||
|
|
26a0df8253 | ||
|
|
526d99f832 | ||
|
|
acbb5be6ab | ||
|
|
522a29241b | ||
|
|
b8d3c84d3c | ||
|
|
9d520877d1 | ||
|
|
5cda0581cd | ||
|
|
ce2e9de6fb | ||
|
|
4d53fb97b6 | ||
|
|
d274a8395b | ||
|
|
ba86f516d8 | ||
|
|
ac02c763c7 | ||
|
|
7407a6b144 | ||
|
|
0453e05bb2 | ||
|
|
946a93164a | ||
|
|
fe02cae4f7 | ||
|
|
5762eb9b33 | ||
|
|
73ffc4a13f | ||
|
|
865ef2ab7f | ||
|
|
7d35ed4eda | ||
|
|
ec3cc6abe8 | ||
|
|
6f7957fd40 | ||
|
|
ec4de3326e | ||
|
|
f030618d19 | ||
|
|
5bcb9010f6 | ||
|
|
780fff70c4 | ||
|
|
1d94d7e604 | ||
|
|
a6cac2886b | ||
|
|
2566b8732e | ||
|
|
d4c50383af | ||
|
|
1ee7bd2a60 | ||
|
|
0bbfa9b483 | ||
|
|
2cad1b3d93 | ||
|
|
bcaa1043ea | ||
|
|
0b33d1800d | ||
|
|
946942214f | ||
|
|
cd6476e487 | ||
|
|
0b02fd4e99 | ||
|
|
d779a94cfb | ||
|
|
2f89a8eb58 | ||
|
|
26d3375900 | ||
|
|
b06e8c3022 | ||
|
|
8a20f8b2da | ||
|
|
e1099e9370 | ||
|
|
68c8901c2a | ||
|
|
cfb1aebf66 | ||
|
|
e4f54bd53a | ||
|
|
30ea4dd46e | ||
|
|
d5c33a203d | ||
|
|
087c09cc65 | ||
|
|
a9bb2a017e | ||
|
|
8a049b8ee7 | ||
|
|
37efd93725 | ||
|
|
3e61803e89 | ||
|
|
3173d88f3f | ||
|
|
f96a898c51 | ||
|
|
d66b79f468 | ||
|
|
b7e300d155 | ||
|
|
4bd680cec8 | ||
|
|
78ae892db6 | ||
|
|
d748e371e5 | ||
|
|
6bdc89252e | ||
|
|
c104f0167f | ||
|
|
6e3c6d1ba8 | ||
|
|
b77262ba13 | ||
|
|
960ebb13db | ||
|
|
1a7b331a4b | ||
|
|
3092e07281 | ||
|
|
a5d53d1ac8 | ||
|
|
3c5df28101 | ||
|
|
49e071d363 | ||
|
|
6e06ff048d | ||
|
|
c5ee39f54b | ||
|
|
f7b1e4ec09 | ||
|
|
e6830b2c19 | ||
|
|
fe3cf386c3 | ||
|
|
0a6a213891 |
7
.ci/faber
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# -*- python -*-
|
||||||
|
|
||||||
|
from faber.tools.boost import boostbook
|
||||||
|
from faber.tools.python import python
|
||||||
|
|
||||||
|
bb = boostbook(prefix='/usr/share/boostbook')
|
||||||
|
p = python(command='$PYTHON')
|
||||||
37
.github/workflows/deploy-documentation.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
name: deploy documentation
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: setup
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install \
|
||||||
|
libboost-tools-dev \
|
||||||
|
python3 \
|
||||||
|
python3-numpy \
|
||||||
|
python3-sphinx \
|
||||||
|
xsltproc \
|
||||||
|
docbook-xsl
|
||||||
|
sudo python3 -m pip install --upgrade pip
|
||||||
|
sudo python3 -m pip install faber
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
sed -e "s/\$PYTHON/python3/g" .ci/faber > ~/.faber
|
||||||
|
faber --builddir=build doc.html
|
||||||
|
if [ "${GITHUB_REF##*/}" == master ]; then
|
||||||
|
echo "destination_dir=doc/html" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "destination_dir=doc/develop/html" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
- name: deploy
|
||||||
|
uses: peaceiris/actions-gh-pages@v4
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
publish_dir: build/doc/html
|
||||||
|
destination_dir: ${{ env.destination_dir }}
|
||||||
|
keep_files: true
|
||||||
50
.github/workflows/test-osx.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
name: Test OSX
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: macOS-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python-version: [3.8.10]
|
||||||
|
cxx: [clang++]
|
||||||
|
std: [c++11, c++14] # TODO: c++17 is failing !
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- name: setup python
|
||||||
|
uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: setup prerequisites
|
||||||
|
run: |
|
||||||
|
brew install boost
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install setuptools faber
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
python --version
|
||||||
|
${{ matrix.cxx }} --version
|
||||||
|
brew info boost
|
||||||
|
faber -v
|
||||||
|
sed -e "s/\$PYTHON/python/g" .ci/faber > ~/.faber
|
||||||
|
faber \
|
||||||
|
--with-boost-include=$(brew --prefix boost)/include \
|
||||||
|
--builddir=build \
|
||||||
|
cxx.name=${{ matrix.cxx }} \
|
||||||
|
cxxflags=-std=${{ matrix.std }} \
|
||||||
|
cppflags=-std=${{ matrix.std }} \
|
||||||
|
-j`sysctl -n hw.ncpu`
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
faber \
|
||||||
|
--with-boost-include=$(brew --prefix boost)/include \
|
||||||
|
--builddir=build\
|
||||||
|
cxx.name=${{ matrix.cxx }} \
|
||||||
|
cxxflags=-std=${{ matrix.std }} \
|
||||||
|
cppflags=-std=${{ matrix.std }} \
|
||||||
|
-j`sysctl -n hw.ncpu` \
|
||||||
|
test.report
|
||||||
57
.github/workflows/test-ubuntu.yml
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
name: Test Ubuntu
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python: [python, python3]
|
||||||
|
cxx: [g++, clang++]
|
||||||
|
std: [c++11, c++14, c++17]
|
||||||
|
include:
|
||||||
|
# Add the appropriate docker image for each compiler.
|
||||||
|
# The images from teeks99/boost-python-test already have boost::python
|
||||||
|
# pre-reqs installed, see:
|
||||||
|
# https://github.com/teeks99/boost-python-test-docker
|
||||||
|
- cxx: clang++
|
||||||
|
docker-img: teeks99/boost-python-test:clang-21_1.89.0
|
||||||
|
- cxx: g++
|
||||||
|
docker-img: teeks99/boost-python-test:gcc-15_1.89.0
|
||||||
|
|
||||||
|
container:
|
||||||
|
image: ${{ matrix.docker-img }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
|
||||||
|
- name: setup prerequisites
|
||||||
|
run: |
|
||||||
|
# Warning: this is not necessarily the same Python version as the one configured above !
|
||||||
|
python3 -m pip install -U faber --break-system-packages
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
${{ matrix.python }} --version
|
||||||
|
${{ matrix.cxx }} --version
|
||||||
|
faber -v
|
||||||
|
sed -e "s/\$PYTHON/${{ matrix.python }}/g" .ci/faber > ~/.faber
|
||||||
|
faber \
|
||||||
|
--with-boost-include=${BOOST_PY_DEPS} \
|
||||||
|
--builddir=build \
|
||||||
|
cxx.name=${{ matrix.cxx }} \
|
||||||
|
cxxflags=-std=${{ matrix.std }} \
|
||||||
|
cppflags=-std=${{ matrix.std }} \
|
||||||
|
-j`nproc`
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
faber \
|
||||||
|
--with-boost-include=${BOOST_PY_DEPS} \
|
||||||
|
--builddir=build \
|
||||||
|
cxx.name=${{ matrix.cxx }} \
|
||||||
|
cxxflags=-std=${{ matrix.std }} \
|
||||||
|
cppflags=-std=${{ matrix.std }} \
|
||||||
|
-j`nproc` \
|
||||||
|
test.report
|
||||||
49
.github/workflows/test-windows.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Test Windows
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python-version: [3.7]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v5
|
||||||
|
- uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- uses: microsoft/setup-msbuild@v2
|
||||||
|
- name: setup boost prerequisites
|
||||||
|
uses: lukka/run-vcpkg@v6
|
||||||
|
with:
|
||||||
|
vcpkgGitCommitId: '88b1071e39f13b632644d9d953738d345a4ac055'
|
||||||
|
vcpkgDirectory: '${{ runner.workspace }}/vcpkg'
|
||||||
|
vcpkgTriplet: x64-windows
|
||||||
|
vcpkgArguments: >
|
||||||
|
boost-config
|
||||||
|
boost-core
|
||||||
|
boost-function
|
||||||
|
boost-graph
|
||||||
|
boost-iterator
|
||||||
|
boost-lexical-cast
|
||||||
|
boost-mpl
|
||||||
|
boost-preprocessor
|
||||||
|
boost-smart-ptr
|
||||||
|
boost-static-assert
|
||||||
|
boost-align
|
||||||
|
- name: setup faber
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install setuptools faber numpy
|
||||||
|
faber --info=tools cxx
|
||||||
|
- name: build
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
faber --builddir=build cxx.name=msvc --log=commands --log=output --with-boost-include=${{ runner.workspace }}\vcpkg\installed\x64-windows\include -j4
|
||||||
|
- name: test
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
faber --builddir=build cxx.name=msvc --with-boost-include=${{ runner.workspace }}\vcpkg\installed\x64-windows\include -j4 test.report
|
||||||
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
bin.SCons
|
||||||
|
*.pyc
|
||||||
|
*~
|
||||||
|
\#*\#
|
||||||
176
CMakeLists.txt
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
# Copyright 2020, 2021 Peter Dimov
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# https://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.14...3.20)
|
||||||
|
|
||||||
|
project(boost_python VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||||
|
|
||||||
|
find_package(Python REQUIRED COMPONENTS Development OPTIONAL_COMPONENTS NumPy)
|
||||||
|
|
||||||
|
if(Python_NumPy_FOUND)
|
||||||
|
message(STATUS "Boost.Python: using Python ${Python_VERSION} with NumPy at ${Python_NumPy_INCLUDE_DIRS}")
|
||||||
|
else()
|
||||||
|
message(STATUS "Boost.Python: using Python ${Python_VERSION} without NumPy")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# boost_pythonXY
|
||||||
|
|
||||||
|
set(_pyver ${Python_VERSION_MAJOR}${Python_VERSION_MINOR})
|
||||||
|
set(_boost_python boost_python${_pyver})
|
||||||
|
|
||||||
|
add_library(${_boost_python}
|
||||||
|
src/dict.cpp
|
||||||
|
src/errors.cpp
|
||||||
|
src/exec.cpp
|
||||||
|
src/import.cpp
|
||||||
|
src/list.cpp
|
||||||
|
src/long.cpp
|
||||||
|
src/module.cpp
|
||||||
|
src/object_operators.cpp
|
||||||
|
src/object_protocol.cpp
|
||||||
|
src/slice.cpp
|
||||||
|
src/str.cpp
|
||||||
|
src/tuple.cpp
|
||||||
|
src/wrapper.cpp
|
||||||
|
src/converter/from_python.cpp
|
||||||
|
src/converter/registry.cpp
|
||||||
|
src/converter/type_id.cpp
|
||||||
|
src/converter/builtin_converters.cpp
|
||||||
|
src/converter/arg_to_python_base.cpp
|
||||||
|
src/object/enum.cpp
|
||||||
|
src/object/class.cpp
|
||||||
|
src/object/function.cpp
|
||||||
|
src/object/inheritance.cpp
|
||||||
|
src/object/life_support.cpp
|
||||||
|
src/object/pickle_support.cpp
|
||||||
|
src/object/iterator.cpp
|
||||||
|
src/object/stl_iterator.cpp
|
||||||
|
src/object_protocol.cpp
|
||||||
|
src/object_operators.cpp
|
||||||
|
src/object/function_doc_signature.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(Boost::python${_pyver} ALIAS ${_boost_python})
|
||||||
|
|
||||||
|
target_include_directories(${_boost_python} PUBLIC include)
|
||||||
|
|
||||||
|
target_link_libraries(${_boost_python}
|
||||||
|
PUBLIC
|
||||||
|
Boost::align
|
||||||
|
Boost::bind
|
||||||
|
Boost::config
|
||||||
|
Boost::conversion
|
||||||
|
Boost::core
|
||||||
|
Boost::detail
|
||||||
|
Boost::foreach
|
||||||
|
Boost::function
|
||||||
|
Boost::iterator
|
||||||
|
Boost::lexical_cast
|
||||||
|
Boost::mpl
|
||||||
|
Boost::numeric_conversion
|
||||||
|
Boost::preprocessor
|
||||||
|
Boost::smart_ptr
|
||||||
|
Boost::static_assert
|
||||||
|
Boost::tuple
|
||||||
|
Boost::type_traits
|
||||||
|
Boost::utility
|
||||||
|
|
||||||
|
Python::Module
|
||||||
|
|
||||||
|
PRIVATE
|
||||||
|
Boost::graph
|
||||||
|
Boost::integer
|
||||||
|
Boost::property_map
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(${_boost_python}
|
||||||
|
PUBLIC BOOST_PYTHON_NO_LIB
|
||||||
|
PRIVATE BOOST_PYTHON_SOURCE
|
||||||
|
)
|
||||||
|
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
target_compile_definitions(${_boost_python} PUBLIC BOOST_PYTHON_DYN_LINK)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(${_boost_python} PUBLIC BOOST_PYTHON_STATIC_LINK BOOST_PYTHON_STATIC_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Boost::python alias
|
||||||
|
|
||||||
|
add_library(boost_python INTERFACE)
|
||||||
|
add_library(Boost::python ALIAS boost_python)
|
||||||
|
target_link_libraries(boost_python INTERFACE Boost::python${_pyver})
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
|
||||||
|
boost_install(TARGETS ${_boost_python} boost_python VERSION ${BOOST_SUPERPROJECT_VERSION} HEADER_DIRECTORY include)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(Python_NumPy_FOUND)
|
||||||
|
|
||||||
|
# boost_numpyXY
|
||||||
|
|
||||||
|
set(_boost_numpy boost_numpy${_pyver})
|
||||||
|
|
||||||
|
add_library(${_boost_numpy}
|
||||||
|
src/numpy/dtype.cpp
|
||||||
|
src/numpy/matrix.cpp
|
||||||
|
src/numpy/ndarray.cpp
|
||||||
|
src/numpy/numpy.cpp
|
||||||
|
src/numpy/scalars.cpp
|
||||||
|
src/numpy/ufunc.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(Boost::numpy${_pyver} ALIAS ${_boost_numpy})
|
||||||
|
|
||||||
|
target_include_directories(${_boost_numpy} PUBLIC include)
|
||||||
|
|
||||||
|
target_link_libraries(${_boost_numpy}
|
||||||
|
PUBLIC
|
||||||
|
Boost::config
|
||||||
|
Boost::core
|
||||||
|
Boost::detail
|
||||||
|
Boost::mpl
|
||||||
|
Boost::python
|
||||||
|
Boost::smart_ptr
|
||||||
|
|
||||||
|
Python::NumPy
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(${_boost_numpy}
|
||||||
|
PUBLIC BOOST_NUMPY_NO_LIB
|
||||||
|
PRIVATE BOOST_NUMPY_SOURCE
|
||||||
|
)
|
||||||
|
|
||||||
|
if(BUILD_SHARED_LIBS)
|
||||||
|
target_compile_definitions(${_boost_numpy} PUBLIC BOOST_NUMPY_DYN_LINK)
|
||||||
|
else()
|
||||||
|
target_compile_definitions(${_boost_numpy} PUBLIC BOOST_NUMPY_STATIC_LINK BOOST_NUMPY_STATIC_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Boost::numpy alias
|
||||||
|
|
||||||
|
add_library(boost_numpy INTERFACE)
|
||||||
|
add_library(Boost::numpy ALIAS boost_numpy)
|
||||||
|
target_link_libraries(boost_numpy INTERFACE Boost::numpy${_pyver})
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
|
||||||
|
if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
|
||||||
|
boost_install(TARGETS ${_boost_numpy} boost_numpy VERSION ${BOOST_SUPERPROJECT_VERSION})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(_pyver)
|
||||||
|
unset(_boost_python)
|
||||||
|
unset(_boost_numpy)
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
|
||||||
|
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
||||||
|
|
||||||
|
add_subdirectory(test)
|
||||||
|
|
||||||
|
endif()
|
||||||
42
Jamfile
@@ -1,42 +0,0 @@
|
|||||||
subproject libs/python ;
|
|
||||||
|
|
||||||
# bring in the rules for python
|
|
||||||
SEARCH on <module@>python.jam = $(BOOST_BUILD_PATH) ;
|
|
||||||
include <module@>python.jam ;
|
|
||||||
|
|
||||||
local bpl-ldflags ;
|
|
||||||
|
|
||||||
if $(UNIX) && ( $(OS) = AIX )
|
|
||||||
{
|
|
||||||
bpl-linkflags = <linkflags>"-e initlibbpl" ;
|
|
||||||
}
|
|
||||||
|
|
||||||
dll bpl
|
|
||||||
:
|
|
||||||
src/list.cpp
|
|
||||||
src/long.cpp
|
|
||||||
src/dict.cpp
|
|
||||||
src/tuple.cpp
|
|
||||||
src/str.cpp
|
|
||||||
|
|
||||||
src/aix_init_module.cpp
|
|
||||||
src/converter/from_python.cpp
|
|
||||||
src/converter/registry.cpp
|
|
||||||
src/converter/type_id.cpp
|
|
||||||
src/object/class.cpp
|
|
||||||
src/object/function.cpp
|
|
||||||
src/object/inheritance.cpp
|
|
||||||
src/object/life_support.cpp
|
|
||||||
src/object/pickle_support.cpp
|
|
||||||
src/errors.cpp
|
|
||||||
src/module.cpp
|
|
||||||
src/converter/builtin_converters.cpp
|
|
||||||
src/converter/arg_to_python_base.cpp
|
|
||||||
src/object/iterator.cpp
|
|
||||||
src/object_protocol.cpp
|
|
||||||
src/object_operators.cpp
|
|
||||||
:
|
|
||||||
$(BOOST_PYTHON_V2_PROPERTIES)
|
|
||||||
<define>BOOST_PYTHON_SOURCE
|
|
||||||
$(bpl-linkflags)
|
|
||||||
;
|
|
||||||
23
LICENSE_1_0.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
59
README.md
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|

|
||||||
|
|
||||||
|
# Synopsis
|
||||||
|
|
||||||
|
[](https://gitter.im/boostorg/python?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
|
Welcome to Boost.Python, a C++ library which enables seamless interoperability between C++ and the Python programming language. The library includes support for:
|
||||||
|
|
||||||
|
* References and Pointers
|
||||||
|
* Globally Registered Type Coercions
|
||||||
|
* Automatic Cross-Module Type Conversions
|
||||||
|
* Efficient Function Overloading
|
||||||
|
* C++ to Python Exception Translation
|
||||||
|
* Default Arguments
|
||||||
|
* Keyword Arguments
|
||||||
|
* Manipulating Python objects in C++
|
||||||
|
* Exporting C++ Iterators as Python Iterators
|
||||||
|
* Documentation Strings
|
||||||
|
|
||||||
|
See the [Boost.Python](http://boostorg.github.io/python) documentation for details.
|
||||||
|
|
||||||
|
**Hint :** Check out the [development version](http://boostorg.github.io/python/develop) of the documentation to see work in progress.
|
||||||
|
|
||||||
|
# Building   
|
||||||
|
|
||||||
|
While Boost.Python is part of the Boost C++ Libraries super-project, and thus can be compiled as part of Boost, it can also be compiled and installed stand-alone, i.e. against a pre-installed Boost package.
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
* [Python](http://www.python.org)
|
||||||
|
* [Boost](http://www.boost.org)
|
||||||
|
* [Faber](https://stefanseefeld.github.io/faber)
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
Run
|
||||||
|
|
||||||
|
```
|
||||||
|
faber
|
||||||
|
```
|
||||||
|
to build the library.
|
||||||
|
|
||||||
|
## Test
|
||||||
|
|
||||||
|
Run
|
||||||
|
|
||||||
|
```
|
||||||
|
faber test.report
|
||||||
|
```
|
||||||
|
to run the tests.
|
||||||
|
|
||||||
|
## Build docs
|
||||||
|
|
||||||
|
Run
|
||||||
|
|
||||||
|
```
|
||||||
|
faber doc.html
|
||||||
|
```
|
||||||
|
to build the documentation.
|
||||||
41
build.jam
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Copyright René Ferdinand Rivera Morell 2024
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
require-b2 5.2 ;
|
||||||
|
|
||||||
|
constant boost_dependencies :
|
||||||
|
/boost/align//boost_align
|
||||||
|
/boost/bind//boost_bind
|
||||||
|
/boost/config//boost_config
|
||||||
|
/boost/conversion//boost_conversion
|
||||||
|
/boost/core//boost_core
|
||||||
|
/boost/detail//boost_detail
|
||||||
|
/boost/foreach//boost_foreach
|
||||||
|
/boost/function//boost_function
|
||||||
|
/boost/iterator//boost_iterator
|
||||||
|
/boost/lexical_cast//boost_lexical_cast
|
||||||
|
/boost/mpl//boost_mpl
|
||||||
|
/boost/numeric_conversion//boost_numeric_conversion
|
||||||
|
/boost/preprocessor//boost_preprocessor
|
||||||
|
/boost/static_assert//boost_static_assert
|
||||||
|
/boost/tuple//boost_tuple
|
||||||
|
/boost/type_traits//boost_type_traits
|
||||||
|
/boost/utility//boost_utility ;
|
||||||
|
|
||||||
|
project /boost/python
|
||||||
|
: common-requirements
|
||||||
|
<include>include
|
||||||
|
;
|
||||||
|
|
||||||
|
explicit
|
||||||
|
[ alias boost_python : build//boost_python ]
|
||||||
|
[ alias boost_numpy : build//boost_numpy ]
|
||||||
|
[ alias all : boost_python boost_numpy test ]
|
||||||
|
;
|
||||||
|
|
||||||
|
call-if : boost-library python
|
||||||
|
: install boost_python boost_numpy
|
||||||
|
;
|
||||||
|
|
||||||
308
build/Jamfile
@@ -1,173 +1,175 @@
|
|||||||
# (C) Copyright David Abrahams 2001. Permission to copy, use, modify, sell and
|
# Copyright David Abrahams 2001-2006. Distributed under the Boost
|
||||||
# distribute this software is granted provided this copyright notice appears
|
# Software License, Version 1.0. (See accompanying
|
||||||
# in all copies. This software is provided "as is" without express or implied
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
# warranty, and with no claim as to its suitability for any purpose.
|
|
||||||
#
|
|
||||||
# Boost.Python build and test Jamfile
|
|
||||||
#
|
|
||||||
# To run all tests quietly: jam test
|
|
||||||
# To run all tests with verbose output: jam -sPYTHON_TEST_ARGS=-v test
|
|
||||||
#
|
|
||||||
# Declares the following targets:
|
|
||||||
# 1. libboost_python.dll/.so, a dynamic library to be linked with all
|
|
||||||
# Boost.Python modules
|
|
||||||
#
|
|
||||||
# 2. pairs of test targets of the form <name>.test and <name>.run
|
|
||||||
# <name>.test runs the test when it is out-of-date, and the "test"
|
|
||||||
# pseudotarget depends on it. <name>.run runs
|
|
||||||
# a test unconditionally, and can be used to force a test to run.. Each
|
|
||||||
# test target builds one or more Boost.Python modules and runs a Python
|
|
||||||
# script to test them. The test names are:
|
|
||||||
#
|
|
||||||
# from ../test
|
|
||||||
#
|
|
||||||
# comprehensive - a comprehensive test of Boost.Python features
|
|
||||||
#
|
|
||||||
# from ../example:
|
|
||||||
# abstract -
|
|
||||||
# getting_started1 -
|
|
||||||
# getting_started2 -
|
|
||||||
# simple_vector -
|
|
||||||
# do_it_yourself_convts -
|
|
||||||
# pickle1 -
|
|
||||||
# pickle2 -
|
|
||||||
# pickle3 -
|
|
||||||
#
|
|
||||||
# dvect1 -
|
|
||||||
# dvect2 -
|
|
||||||
# ivect1 -
|
|
||||||
# ivect2 -
|
|
||||||
# noncopyable -
|
|
||||||
#
|
|
||||||
# subproject-specific environment/command-line variables:
|
|
||||||
#
|
|
||||||
# PYTHON - How to invoke the Python interpreter. Defaults to "python"
|
|
||||||
#
|
|
||||||
# PYTHON_ROOT - Windows only: where Python is installed. Defaults to "c:/tools/python"
|
|
||||||
#
|
|
||||||
# PYTHON_VERSION - Version of Python. Defaults to "2.1" on Windows, "1.5" on Unix
|
|
||||||
#
|
|
||||||
# PYTHON_TEST_ARGS - specifies arguments to be passed to test scripts on
|
|
||||||
# the command line. "-v" can be useful if you want to
|
|
||||||
# see the output of successful tests.
|
|
||||||
#
|
|
||||||
# PYTHON_VECT_ITERATIONS - specifies the number of test iterations to use for
|
|
||||||
# the dvect and ivect tests above.
|
|
||||||
|
|
||||||
# declare the location of this subproject relative to the root
|
import os ;
|
||||||
subproject libs/python/build ;
|
import indirect ;
|
||||||
|
import modules ;
|
||||||
|
import feature ;
|
||||||
|
import property ;
|
||||||
|
import python ;
|
||||||
|
|
||||||
# bring in the rules for python
|
if ! [ python.configured ] && ! ( --without-python in [ modules.peek : ARGV ] )
|
||||||
SEARCH on <module@>python.jam = $(BOOST_BUILD_PATH) ;
|
|
||||||
include <module@>python.jam ;
|
|
||||||
|
|
||||||
# This nasty hack works with versions of Python 1.5.2 -> 2.2 to avoid
|
|
||||||
# building any Python stuff if there's no installation.
|
|
||||||
SEARCH on <find-python-install>__init__.py = $(PYTHON_STDLIB_PATH)/test $(SUBDIR) ;
|
|
||||||
include <find-python-install>__init__.py ;
|
|
||||||
if ! $(gNO_PYTHON_INSTALL)
|
|
||||||
{
|
{
|
||||||
|
# Attempt default configuration of python
|
||||||
local PYTHON_PROPERTIES = $(PYTHON_PROPERTIES) <define>BOOST_PYTHON_DYNAMIC_LIB ;
|
import toolset : using ;
|
||||||
|
using python ;
|
||||||
#######################
|
|
||||||
rule bpl-test ( test-name : sources + )
|
|
||||||
{
|
|
||||||
boost-python-test $(test-name) : $(sources) <dll>boost_python ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################
|
if [ python.configured ] || ( --without-python in [ modules.peek : ARGV ] )
|
||||||
|
{
|
||||||
|
alias config-warning ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
message config-warning
|
||||||
|
: "warning: No python installation configured and autoconfiguration"
|
||||||
|
: "note: failed. See http://www.boost.org/libs/python/doc/building.html"
|
||||||
|
: "note: for configuration instructions or pass --without-python to"
|
||||||
|
: "note: suppress this message and silently skip all Boost.Python targets"
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
#
|
constant boost_dependencies_private :
|
||||||
# Declare the boost python static link library
|
/boost/graph//boost_graph
|
||||||
#
|
/boost/integer//boost_integer
|
||||||
|
/boost/property_map//boost_property_map
|
||||||
# Base names of the source files for libboost_python
|
/boost/smart_ptr//boost_smart_ptr
|
||||||
local CPP_SOURCES =
|
|
||||||
types classes conversions extension_class functions
|
|
||||||
init_function module_builder objects cross_module errors
|
|
||||||
;
|
|
||||||
|
|
||||||
lib boost_python_static : ../src/$(CPP_SOURCES).cpp
|
|
||||||
# requirements
|
|
||||||
: $(BOOST_PYTHON_INCLUDES)
|
|
||||||
<shared-linkable>true
|
|
||||||
<define>BOOST_PYTHON_STATIC_LIB=1
|
|
||||||
[ difference $(PYTHON_PROPERTIES) : <define>BOOST_PYTHON_DYNAMIC_LIB ]
|
|
||||||
: <suppress>true # don't build this unless the user asks for it by name
|
|
||||||
;
|
|
||||||
|
|
||||||
dll boost_python
|
|
||||||
# $(SUFDLL[1])
|
|
||||||
: ../src/$(CPP_SOURCES).cpp
|
|
||||||
# requirements
|
|
||||||
: $(BOOST_PYTHON_INCLUDES)
|
|
||||||
<shared-linkable>true
|
|
||||||
<runtime-link>dynamic
|
|
||||||
$(PYTHON_PROPERTIES)
|
|
||||||
;
|
|
||||||
|
|
||||||
stage bin-stage : <dll>boost_python
|
|
||||||
:
|
|
||||||
<tag><debug>"_debug"
|
|
||||||
<tag><debug-python>"_pydebug"
|
|
||||||
:
|
|
||||||
debug release
|
|
||||||
;
|
;
|
||||||
|
|
||||||
############# comprehensive module and test ###########
|
project
|
||||||
bpl-test boost_python_test
|
: source-location ../src
|
||||||
: ../test/comprehensive.cpp ;
|
: common-requirements <library>$(boost_dependencies)
|
||||||
|
: requirements <library>$(boost_dependencies_private)
|
||||||
|
;
|
||||||
|
|
||||||
boost-python-runtest comprehensive
|
rule cond ( test ? : yes * : no * ) { if $(test) { return $(yes) ; } else { return $(no) ; } }
|
||||||
: ../test/comprehensive.py <pyd>boost_python_test <dll>boost_python ;
|
rule unless ( test ? : yes * : no * ) { if ! $(test) { return $(yes) ; } else { return $(no) ; } }
|
||||||
|
local rule eq ( a : b ) { if $(a) = $(b) { return 1 ; } }
|
||||||
|
|
||||||
############# simple tests from ../example ############
|
rule tag ( name : type ? : property-set )
|
||||||
|
|
||||||
rule boost-python-example-runtest ( name )
|
|
||||||
{
|
{
|
||||||
bpl-test $(name)
|
if python-tag in [ RULENAMES $(__name__) ]
|
||||||
: ../example/$(name).cpp ;
|
{
|
||||||
|
return [ $(__name__).python-tag $(name) : $(type) : $(property-set) ] ;
|
||||||
boost-python-runtest $(name)
|
}
|
||||||
: ../example/test_$(name).py <pyd>$(name) <dll>boost_python ;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if [ python.configured ]
|
||||||
boost-python-example-runtest abstract ;
|
|
||||||
boost-python-example-runtest getting_started1 ;
|
|
||||||
boost-python-example-runtest getting_started2 ;
|
|
||||||
boost-python-example-runtest simple_vector ;
|
|
||||||
boost-python-example-runtest do_it_yourself_convts ;
|
|
||||||
boost-python-example-runtest pickle1 ;
|
|
||||||
boost-python-example-runtest pickle2 ;
|
|
||||||
boost-python-example-runtest pickle3 ;
|
|
||||||
|
|
||||||
|
|
||||||
bpl-test ivect : ../example/ivect.cpp ;
|
|
||||||
bpl-test dvect : ../example/dvect.cpp ;
|
|
||||||
bpl-test noncopyable_export : ../example/noncopyable_export.cpp ;
|
|
||||||
bpl-test noncopyable_import : ../example/noncopyable_import.cpp ;
|
|
||||||
|
|
||||||
############## cross-module tests from ../example ##########
|
|
||||||
|
|
||||||
# A simple rule to build a test which depends on multiple modules in the PYTHONPATH
|
|
||||||
rule boost-python-multi-example-runtest ( test-name : modules + )
|
|
||||||
{
|
{
|
||||||
boost-python-runtest $(test-name)
|
|
||||||
: ../example/tst_$(test-name).py <pyd>$(modules) <dll>boost_python
|
lib boost_python
|
||||||
: : : $(PYTHON_VECT_ITERATIONS) ;
|
: # sources
|
||||||
|
list.cpp
|
||||||
|
long.cpp
|
||||||
|
dict.cpp
|
||||||
|
tuple.cpp
|
||||||
|
str.cpp
|
||||||
|
slice.cpp
|
||||||
|
|
||||||
|
converter/from_python.cpp
|
||||||
|
converter/registry.cpp
|
||||||
|
converter/type_id.cpp
|
||||||
|
object/enum.cpp
|
||||||
|
object/class.cpp
|
||||||
|
object/function.cpp
|
||||||
|
object/inheritance.cpp
|
||||||
|
object/life_support.cpp
|
||||||
|
object/pickle_support.cpp
|
||||||
|
errors.cpp
|
||||||
|
module.cpp
|
||||||
|
converter/builtin_converters.cpp
|
||||||
|
converter/arg_to_python_base.cpp
|
||||||
|
object/iterator.cpp
|
||||||
|
object/stl_iterator.cpp
|
||||||
|
object_protocol.cpp
|
||||||
|
object_operators.cpp
|
||||||
|
wrapper.cpp
|
||||||
|
import.cpp
|
||||||
|
exec.cpp
|
||||||
|
object/function_doc_signature.cpp
|
||||||
|
: # requirements
|
||||||
|
<link>static:<define>BOOST_PYTHON_STATIC_LIB
|
||||||
|
<define>BOOST_PYTHON_SOURCE
|
||||||
|
|
||||||
|
# On Windows, all code using Python has to link to the Python
|
||||||
|
# import library.
|
||||||
|
#
|
||||||
|
# On *nix we never link libboost_python to libpython. When
|
||||||
|
# extending Python, all Python symbols are provided by the
|
||||||
|
# Python interpreter executable. When embedding Python, the
|
||||||
|
# client executable is expected to explicitly link to
|
||||||
|
# /python//python (the target representing libpython) itself.
|
||||||
|
#
|
||||||
|
# python_for_extensions is a target defined by Boost.Build to
|
||||||
|
# provide the Python include paths, and on Windows, the Python
|
||||||
|
# import library, as usage requirements.
|
||||||
|
[ cond [ python.configured ] : <library>/python//python_for_extensions ]
|
||||||
|
|
||||||
|
# we prevent building when there is no python available
|
||||||
|
# as it's not possible anyway, and to cause dependents to
|
||||||
|
# fail to build
|
||||||
|
[ unless [ python.configured ] : <build>no ]
|
||||||
|
<dependency>config-warning
|
||||||
|
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||||
|
-<tag>@%boostcpp.tag
|
||||||
|
-<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||||
|
<tag>@tag
|
||||||
|
<conditional>@python.require-py
|
||||||
|
|
||||||
|
: # default build
|
||||||
|
<link>shared
|
||||||
|
: # usage requirements
|
||||||
|
<link>static:<define>BOOST_PYTHON_STATIC_LIB
|
||||||
|
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||||
|
<define>BOOST_PYTHON_NO_LIB
|
||||||
|
;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
alias boost_python : config-warning ;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PYTHON_VECT_ITERATIONS ?= 10 ;
|
if [ python.configured ] && [ python.numpy ]
|
||||||
|
{
|
||||||
|
|
||||||
boost-python-multi-example-runtest dvect1 : ivect dvect ;
|
numpy-include = [ python.numpy-include ] ;
|
||||||
boost-python-multi-example-runtest dvect2 : ivect dvect ;
|
lib boost_numpy
|
||||||
|
: # sources
|
||||||
|
numpy/dtype.cpp
|
||||||
|
numpy/matrix.cpp
|
||||||
|
numpy/ndarray.cpp
|
||||||
|
numpy/numpy.cpp
|
||||||
|
numpy/scalars.cpp
|
||||||
|
numpy/ufunc.cpp
|
||||||
|
: # requirements
|
||||||
|
<link>static:<define>BOOST_NUMPY_STATIC_LIB
|
||||||
|
<define>BOOST_NUMPY_SOURCE
|
||||||
|
[ cond [ python.numpy ] : <library>/python//python_for_extensions ]
|
||||||
|
[ unless [ python.numpy ] : <build>no ]
|
||||||
|
<library>/python//numpy
|
||||||
|
<library>boost_python
|
||||||
|
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||||
|
-<tag>@%boostcpp.tag
|
||||||
|
-<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||||
|
<tag>@tag
|
||||||
|
<conditional>@python.require-py
|
||||||
|
|
||||||
boost-python-multi-example-runtest ivect1 : ivect dvect ;
|
: # default build
|
||||||
boost-python-multi-example-runtest ivect2 : ivect dvect ;
|
<link>shared
|
||||||
|
: # usage requirements
|
||||||
|
<link>static:<define>BOOST_NUMPY_STATIC_LIB
|
||||||
|
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||||
|
<define>BOOST_NUMPY_NO_LIB
|
||||||
|
;
|
||||||
|
|
||||||
boost-python-multi-example-runtest
|
}
|
||||||
noncopyable : noncopyable_import noncopyable_export ;
|
else
|
||||||
|
{
|
||||||
|
|
||||||
}
|
alias boost_numpy : config-warning ;
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
# Dummy file actually to be included by Jam when the python headers
|
|
||||||
# can't be found
|
|
||||||
|
|
||||||
if ! $(gNO_PYTHON_INSTALL)
|
|
||||||
{
|
|
||||||
ECHO "---------------------------------------------------------------------" ;
|
|
||||||
ECHO skipping Boost.Python library build ;
|
|
||||||
ECHO You can configure the location of your python installation, by setting: ;
|
|
||||||
ECHO "PYTHON_ROOT - currently" \"$(PYTHON_ROOT:J=" ")\" ;
|
|
||||||
ECHO "PYTHON_VERSION - The 2-part python Major.Minor version number (e.g." ;
|
|
||||||
ECHO " \"2.2\", NOT \"2.2.1\") - currently" \"$(PYTHON_VERSION)\" ;
|
|
||||||
ECHO ;
|
|
||||||
ECHO "The following are automatically configured from PYTHON_ROOT if not" ;
|
|
||||||
ECHO "otherwise set:" ;
|
|
||||||
ECHO " PYTHON_INCLUDES - path to Python #include directories; currently" \"$(PYTHON_INCLUDES:J=" ")\" ;
|
|
||||||
ECHO " PYTHON_LIB_PATH - path to Python library; currently" ;
|
|
||||||
ECHO " " \"$(PYTHON_LIB_PATH:J=" ")\" ;
|
|
||||||
ECHO " PYTHON_STDLIB_PATH - path to Python standard library modules; currently" ;
|
|
||||||
ECHO " " \"$(PYTHON_STDLIB_PATH:J=" ")\" ;
|
|
||||||
ECHO "---------------------------------------------------------------------" ;
|
|
||||||
}
|
|
||||||
gNO_PYTHON_INSTALL ?= true ;
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Revision History:
|
|
||||||
# 17 Apr 01 include cross-module support, compile getting_started1 (R.W. Grosse-Kunstleve) UNTESTED!
|
|
||||||
# 06 Mar 01 Fixed typo in use of "PYTHON_LIB" (Dave Abrahams)
|
|
||||||
# 04 Mar 01 Changed library name to libboost_python.a (David Abrahams)
|
|
||||||
|
|
||||||
LIBSRC = \
|
|
||||||
classes.cpp \
|
|
||||||
conversions.cpp \
|
|
||||||
cross_module.cpp \
|
|
||||||
errors.cpp \
|
|
||||||
extension_class.cpp \
|
|
||||||
functions.cpp \
|
|
||||||
init_function.cpp \
|
|
||||||
module_builder.cpp \
|
|
||||||
objects.cpp \
|
|
||||||
types.cpp
|
|
||||||
|
|
||||||
LIBOBJ = $(LIBSRC:.cpp=.o)
|
|
||||||
OBJ = $(LIBOBJ)
|
|
||||||
|
|
||||||
|
|
||||||
ifeq "$(OS)" "Windows_NT"
|
|
||||||
PYTHON_LIB=c:/tools/python/libs/python15.lib
|
|
||||||
INC = -Ic:/cygnus/usr/include/g++-3 -Ic:/cygnus/usr/include -Ic:/boost -Ic:/tools/python/include
|
|
||||||
MODULE_EXTENSION=dll
|
|
||||||
else
|
|
||||||
INC = -I/usr/local/include/python1.5
|
|
||||||
MODULE_EXTENSION=so
|
|
||||||
endif
|
|
||||||
|
|
||||||
%.o: ../src/%.cpp
|
|
||||||
como --pic $(INC) -o $*.o -c $<
|
|
||||||
|
|
||||||
%.d: ../src/%.cpp
|
|
||||||
@echo creating $@
|
|
||||||
@set -e; como -M $(INC) -c $< \
|
|
||||||
| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
|
|
||||||
[ -s $@ ] || rm -f $@
|
|
||||||
|
|
||||||
getting_started1: getting_started1.o libboost_python.a
|
|
||||||
como-dyn-link -o ../example/getting_started1.$(MODULE_EXTENSION) $(PYTHON_LIB) getting_started1.o -L. -lboost_python
|
|
||||||
ln -s ../test/doctest.py ../example
|
|
||||||
python ../example/test_getting_started1.py
|
|
||||||
|
|
||||||
getting_started1.o: ../example/getting_started1.cpp
|
|
||||||
como --pic $(INC) -o $*.o -c $<
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf *.o *.$(MODULE_EXTENSION) *.a *.d *.pyc *.bak a.out
|
|
||||||
|
|
||||||
libboost_python.a: $(LIBOBJ)
|
|
||||||
rm -f libboost_python.a
|
|
||||||
ar cq libboost_python.a $(LIBOBJ)
|
|
||||||
|
|
||||||
DEP = $(OBJ:.o=.d)
|
|
||||||
|
|
||||||
ifneq "$(MAKECMDGOALS)" "clean"
|
|
||||||
include $(DEP)
|
|
||||||
endif
|
|
||||||
146
build/filemgr.py
@@ -1,146 +0,0 @@
|
|||||||
# Revision history:
|
|
||||||
# 12 Apr 01 use os.path, shutil
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
bpl_src = "/libs/python/src"
|
|
||||||
bpl_tst = "/libs/python/test"
|
|
||||||
bpl_exa = "/libs/python/example"
|
|
||||||
files = (
|
|
||||||
bpl_src + "/classes.cpp",
|
|
||||||
bpl_src + "/conversions.cpp",
|
|
||||||
bpl_src + "/errors.cpp",
|
|
||||||
bpl_src + "/extension_class.cpp",
|
|
||||||
bpl_src + "/functions.cpp",
|
|
||||||
bpl_src + "/init_function.cpp",
|
|
||||||
bpl_src + "/module_builder.cpp",
|
|
||||||
bpl_src + "/objects.cpp",
|
|
||||||
bpl_src + "/types.cpp",
|
|
||||||
bpl_src + "/cross_module.cpp",
|
|
||||||
bpl_tst + "/comprehensive.cpp",
|
|
||||||
bpl_tst + "/comprehensive.hpp",
|
|
||||||
bpl_tst + "/comprehensive.py",
|
|
||||||
bpl_tst + "/doctest.py",
|
|
||||||
bpl_exa + "/abstract.cpp",
|
|
||||||
bpl_exa + "/getting_started1.cpp",
|
|
||||||
bpl_exa + "/getting_started2.cpp",
|
|
||||||
bpl_exa + "/simple_vector.cpp",
|
|
||||||
bpl_exa + "/do_it_yourself_convts.cpp",
|
|
||||||
bpl_exa + "/nested.cpp",
|
|
||||||
bpl_exa + "/pickle1.cpp",
|
|
||||||
bpl_exa + "/pickle2.cpp",
|
|
||||||
bpl_exa + "/pickle3.cpp",
|
|
||||||
bpl_exa + "/test_abstract.py",
|
|
||||||
bpl_exa + "/test_getting_started1.py",
|
|
||||||
bpl_exa + "/test_getting_started2.py",
|
|
||||||
bpl_exa + "/test_simple_vector.py",
|
|
||||||
bpl_exa + "/test_do_it_yourself_convts.py",
|
|
||||||
bpl_exa + "/test_nested.py",
|
|
||||||
bpl_exa + "/test_pickle1.py",
|
|
||||||
bpl_exa + "/test_pickle2.py",
|
|
||||||
bpl_exa + "/test_pickle3.py",
|
|
||||||
bpl_exa + "/noncopyable.h",
|
|
||||||
bpl_exa + "/noncopyable_export.cpp",
|
|
||||||
bpl_exa + "/noncopyable_import.cpp",
|
|
||||||
bpl_exa + "/dvect.h",
|
|
||||||
bpl_exa + "/dvect.cpp",
|
|
||||||
bpl_exa + "/dvect_conversions.cpp",
|
|
||||||
bpl_exa + "/dvect_defs.cpp",
|
|
||||||
bpl_exa + "/ivect.h",
|
|
||||||
bpl_exa + "/ivect.cpp",
|
|
||||||
bpl_exa + "/ivect_conversions.cpp",
|
|
||||||
bpl_exa + "/ivect_defs.cpp",
|
|
||||||
bpl_exa + "/tst_noncopyable.py",
|
|
||||||
bpl_exa + "/tst_dvect1.py",
|
|
||||||
bpl_exa + "/tst_dvect2.py",
|
|
||||||
bpl_exa + "/tst_ivect1.py",
|
|
||||||
bpl_exa + "/tst_ivect2.py",
|
|
||||||
bpl_exa + "/test_cross_module.py",
|
|
||||||
bpl_exa + "/vector_wrapper.h",
|
|
||||||
bpl_exa + "/richcmp1.cpp",
|
|
||||||
bpl_exa + "/richcmp2.cpp",
|
|
||||||
bpl_exa + "/richcmp3.cpp",
|
|
||||||
bpl_exa + "/test_richcmp1.py",
|
|
||||||
bpl_exa + "/test_richcmp2.py",
|
|
||||||
bpl_exa + "/test_richcmp3.py",
|
|
||||||
)
|
|
||||||
|
|
||||||
defs = (
|
|
||||||
"boost_python_test",
|
|
||||||
"abstract",
|
|
||||||
"getting_started1",
|
|
||||||
"getting_started2",
|
|
||||||
"simple_vector",
|
|
||||||
"do_it_yourself_convts",
|
|
||||||
"nested",
|
|
||||||
"pickle1",
|
|
||||||
"pickle2",
|
|
||||||
"pickle3",
|
|
||||||
"noncopyable_export",
|
|
||||||
"noncopyable_import",
|
|
||||||
"ivect",
|
|
||||||
"dvect",
|
|
||||||
"richcmp1",
|
|
||||||
"richcmp2",
|
|
||||||
"richcmp3",
|
|
||||||
)
|
|
||||||
|
|
||||||
if (__name__ == "__main__"):
|
|
||||||
|
|
||||||
import sys, os, shutil
|
|
||||||
|
|
||||||
path = sys.argv[1]
|
|
||||||
mode = sys.argv[2]
|
|
||||||
if (not mode in ("softlinks", "unlink", "cp", "rm", "copy", "del")):
|
|
||||||
raise RuntimeError, \
|
|
||||||
"usage: python filemgr.py path <softlinks|unlink|cp|rm|copy|del>"
|
|
||||||
|
|
||||||
if (mode in ("cp", "copy")):
|
|
||||||
for fn in files:
|
|
||||||
f = os.path.basename(fn)
|
|
||||||
print "Copying: " + f
|
|
||||||
shutil.copy(path + fn, ".")
|
|
||||||
|
|
||||||
elif (mode == "softlinks"):
|
|
||||||
for fn in files:
|
|
||||||
f = os.path.basename(fn)
|
|
||||||
if (os.path.exists(f)):
|
|
||||||
print "File exists: " + f
|
|
||||||
else:
|
|
||||||
print "Linking: " + f
|
|
||||||
os.symlink(path + fn, f)
|
|
||||||
|
|
||||||
elif (mode in ("rm", "del")):
|
|
||||||
for fn in files:
|
|
||||||
f = os.path.basename(fn)
|
|
||||||
if (os.path.exists(f)):
|
|
||||||
print "Removing: " + f
|
|
||||||
try: os.unlink(f)
|
|
||||||
except: pass
|
|
||||||
|
|
||||||
elif (mode == "unlink"):
|
|
||||||
for fn in files:
|
|
||||||
f = os.path.basename(fn)
|
|
||||||
if (os.path.exists(f)):
|
|
||||||
if (os.path.islink(f)):
|
|
||||||
print "Unlinking: " + f
|
|
||||||
try: os.unlink(f)
|
|
||||||
except: pass
|
|
||||||
else:
|
|
||||||
print "Not a softlink: " + f
|
|
||||||
|
|
||||||
if (mode in ("softlinks", "cp", "copy")):
|
|
||||||
for d in defs:
|
|
||||||
fn = d + ".def"
|
|
||||||
print "Creating: " + fn
|
|
||||||
f = open(fn, "w")
|
|
||||||
f.write("EXPORTS\n")
|
|
||||||
f.write("\tinit" + d + "\n")
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if (mode in ("unlink", "rm", "del")):
|
|
||||||
for d in defs:
|
|
||||||
fn = d + ".def"
|
|
||||||
if (os.path.exists(fn)):
|
|
||||||
print "Removing: " + fn
|
|
||||||
try: os.unlink(fn)
|
|
||||||
except: pass
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
# Revision History
|
|
||||||
|
|
||||||
# 17 Apr 01 include cross-module support, compile getting_started1 (R.W. Grosse-Kunstleve)
|
|
||||||
# 17 Apr 01 build shared library (patch provided by Dan Nuffer)
|
|
||||||
# 04 Mar 01 Changed library name to libboost_python.a, various cleanups,
|
|
||||||
# attempted Cygwin compatibility. Still needs testing on Linux
|
|
||||||
# (David Abrahams)
|
|
||||||
|
|
||||||
|
|
||||||
LIBSRC = \
|
|
||||||
classes.cpp \
|
|
||||||
conversions.cpp \
|
|
||||||
cross_module.cpp \
|
|
||||||
errors.cpp \
|
|
||||||
extension_class.cpp \
|
|
||||||
functions.cpp \
|
|
||||||
init_function.cpp \
|
|
||||||
module_builder.cpp \
|
|
||||||
objects.cpp \
|
|
||||||
types.cpp
|
|
||||||
|
|
||||||
LIBOBJ = $(LIBSRC:.cpp=.o)
|
|
||||||
OBJ = $(LIBOBJ)
|
|
||||||
|
|
||||||
LIBNAME = libboost_python
|
|
||||||
# libpython2.0.dll
|
|
||||||
|
|
||||||
ifeq "$(OS)" "Windows_NT"
|
|
||||||
ROOT=c:/cygnus
|
|
||||||
INC = -Ic:/cygnus/usr/include/g++-3 -Ic:/cygnus/usr/include -Ic:/boost -I$(PYTHON_INC)
|
|
||||||
MODULE_EXTENSION=dll
|
|
||||||
PYTHON_LIB=c:/cygnus/usr/local/lib/python2.0/config/libpython2.0.dll.a
|
|
||||||
SHARED_LIB = $(LIBNAME).dll
|
|
||||||
else
|
|
||||||
PYTHON_INC=$(ROOT)/usr/local/Python-2.0/include/python2.0
|
|
||||||
BOOST_INC=../../..
|
|
||||||
INC = -I$(BOOST_INC) -I$(PYTHON_INC)
|
|
||||||
MODULE_EXTENSION=so
|
|
||||||
VERSION=1
|
|
||||||
SHARED_LIB = $(LIBNAME).so.$(VERSION)
|
|
||||||
endif
|
|
||||||
|
|
||||||
%.o: ../src/%.cpp
|
|
||||||
g++ -fPIC -Wall -W $(INC) $(CXXFLAGS) -o $*.o -c $<
|
|
||||||
|
|
||||||
%.d: ../src/%.cpp
|
|
||||||
@echo creating $@
|
|
||||||
@set -e; g++ -M $(INC) -c $< \
|
|
||||||
| sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' > $@; \
|
|
||||||
[ -s $@ ] || rm -f $@
|
|
||||||
|
|
||||||
|
|
||||||
PYTHON = python
|
|
||||||
|
|
||||||
all: test $(SHARED_LIB) getting_started1
|
|
||||||
|
|
||||||
test: comprehensive.o $(LIBNAME).a $(SHARED_LIB)
|
|
||||||
g++ $(CXXFLAGS) -shared -o ../test/boost_python_test.$(MODULE_EXTENSION) comprehensive.o -L. -lboost_python $(PYTHON_LIB)
|
|
||||||
$(PYTHON) ../test/comprehensive.py
|
|
||||||
|
|
||||||
comprehensive.o: ../test/comprehensive.cpp
|
|
||||||
g++ $(CXXFLAGS) --template-depth-32 -fPIC -Wall -W $(INC) -o $*.o -c $<
|
|
||||||
|
|
||||||
|
|
||||||
getting_started1: getting_started1.o $(LIBNAME).a
|
|
||||||
g++ $(CXXFLAGS) -shared -o ../example/getting_started1.$(MODULE_EXTENSION) getting_started1.o -L. -lboost_python $(PYTHON_LIB)
|
|
||||||
ln -s ../test/doctest.py ../example
|
|
||||||
$(PYTHON) ../example/test_getting_started1.py
|
|
||||||
|
|
||||||
getting_started1.o: ../example/getting_started1.cpp
|
|
||||||
g++ $(CXXFLAGS) --template-depth-32 -fPIC -Wall -W $(INC) -o $*.o -c $<
|
|
||||||
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -rf *.o *.$(MODULE_EXTENSION) *.a *.d *.pyc *.bak a.out
|
|
||||||
|
|
||||||
$(LIBNAME).a: $(LIBOBJ)
|
|
||||||
rm -f $@
|
|
||||||
ar cqs $@ $(LIBOBJ)
|
|
||||||
|
|
||||||
$(SHARED_LIB): $(LIBOBJ)
|
|
||||||
g++ $(CXXFLAGS) -shared -o $@ -Wl,--soname=$(LIBNAME).$(MODULE_EXTENSION)
|
|
||||||
|
|
||||||
DEP = $(OBJ:.o=.d)
|
|
||||||
|
|
||||||
ifneq "$(MAKECMDGOALS)" "clean"
|
|
||||||
include $(DEP)
|
|
||||||
endif
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# Create a new empty directory anywhere (preferably not in the boost tree).
|
|
||||||
# Copy this Makefile to that new directory and rename it to "Makefile"
|
|
||||||
# Adjust the pathnames below.
|
|
||||||
#
|
|
||||||
# make softlinks Create softlinks to source code and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make unlink Remove softlinks
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
ROOT=$(HOME)
|
|
||||||
BOOST=$(ROOT)/boost
|
|
||||||
|
|
||||||
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
|
||||||
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
|
||||||
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
|
||||||
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
|
||||||
STLPORTINC=-I$(BOOST)/boost/compatibility/cpp_c_headers
|
|
||||||
|
|
||||||
STDOPTS=
|
|
||||||
WARNOPTS=-woff 1001,1234,1682
|
|
||||||
OPTOPTS=-g
|
|
||||||
|
|
||||||
CPP=CC -LANG:std -n32 -mips4
|
|
||||||
CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST) $(PYINC) \
|
|
||||||
$(STDOPTS) $(WARNOPTS) $(OPTOPTS)
|
|
||||||
MAKEDEP=-M
|
|
||||||
|
|
||||||
LD=CC -LANG:std -n32 -mips4
|
|
||||||
LDOPTS=-shared
|
|
||||||
|
|
||||||
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
|
||||||
init_function.o module_builder.o \
|
|
||||||
objects.o types.o cross_module.o
|
|
||||||
DEPOBJ=$(OBJ) \
|
|
||||||
comprehensive.o \
|
|
||||||
abstract.o \
|
|
||||||
getting_started1.o getting_started2.o \
|
|
||||||
simple_vector.o \
|
|
||||||
do_it_yourself_convts.o \
|
|
||||||
nested.o \
|
|
||||||
pickle1.o pickle2.o pickle3.o \
|
|
||||||
noncopyable_export.o noncopyable_import.o \
|
|
||||||
ivect.o dvect.o \
|
|
||||||
richcmp1.o richcmp2.o richcmp3.o
|
|
||||||
|
|
||||||
.SUFFIXES: .o .cpp
|
|
||||||
|
|
||||||
all: libboost_python.a \
|
|
||||||
boost_python_test.so \
|
|
||||||
abstract.so \
|
|
||||||
getting_started1.so getting_started2.so \
|
|
||||||
simple_vector.so \
|
|
||||||
do_it_yourself_convts.so \
|
|
||||||
nested.so \
|
|
||||||
pickle1.so pickle2.so pickle3.so \
|
|
||||||
noncopyable_export.so noncopyable_import.so \
|
|
||||||
ivect.so dvect.so \
|
|
||||||
richcmp1.so richcmp2.so richcmp3.so
|
|
||||||
|
|
||||||
libboost_python.a: $(OBJ)
|
|
||||||
rm -f libboost_python.a
|
|
||||||
$(CPP) -ar -o libboost_python.a $(OBJ)
|
|
||||||
|
|
||||||
boost_python_test.so: $(OBJ) comprehensive.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) comprehensive.o -o boost_python_test.so -lm
|
|
||||||
|
|
||||||
abstract.so: $(OBJ) abstract.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) abstract.o -o abstract.so
|
|
||||||
|
|
||||||
getting_started1.so: $(OBJ) getting_started1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started1.o -o getting_started1.so
|
|
||||||
|
|
||||||
getting_started2.so: $(OBJ) getting_started2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started2.o -o getting_started2.so
|
|
||||||
|
|
||||||
simple_vector.so: $(OBJ) simple_vector.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) simple_vector.o -o simple_vector.so
|
|
||||||
|
|
||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
|
||||||
|
|
||||||
nested.so: $(OBJ) nested.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
|
||||||
|
|
||||||
pickle2.so: $(OBJ) pickle2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle2.o -o pickle2.so
|
|
||||||
|
|
||||||
pickle3.so: $(OBJ) pickle3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle3.o -o pickle3.so
|
|
||||||
|
|
||||||
noncopyable_export.so: $(OBJ) noncopyable_export.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_export.o -o noncopyable_export.so
|
|
||||||
|
|
||||||
noncopyable_import.so: $(OBJ) noncopyable_import.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_import.o -o noncopyable_import.so
|
|
||||||
|
|
||||||
ivect.so: $(OBJ) ivect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) ivect.o -o ivect.so
|
|
||||||
|
|
||||||
dvect.so: $(OBJ) dvect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) dvect.o -o dvect.so
|
|
||||||
|
|
||||||
richcmp1.so: $(OBJ) richcmp1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp1.o -o richcmp1.so
|
|
||||||
|
|
||||||
richcmp2.so: $(OBJ) richcmp2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp2.o -o richcmp2.so
|
|
||||||
|
|
||||||
richcmp3.so: $(OBJ) richcmp3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp3.o -o richcmp3.so
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
$(CPP) $(CPPOPTS) -c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
$(PYEXE) comprehensive.py
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJ) libboost_python.a libboost_python.a.input
|
|
||||||
rm -f comprehensive.o boost_python_test.so
|
|
||||||
rm -f abstract.o abstract.so
|
|
||||||
rm -f getting_started1.o getting_started1.so
|
|
||||||
rm -f getting_started2.o getting_started2.so
|
|
||||||
rm -f simple_vector.o simple_vector.so
|
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
|
||||||
rm -f nested.o nested.so
|
|
||||||
rm -f pickle1.o pickle1.so
|
|
||||||
rm -f pickle2.o pickle2.so
|
|
||||||
rm -f pickle3.o pickle3.so
|
|
||||||
rm -f noncopyable_export.o noncopyable_export.so
|
|
||||||
rm -f noncopyable_import.o noncopyable_import.so
|
|
||||||
rm -f ivect.o ivect.so
|
|
||||||
rm -f dvect.o dvect.so
|
|
||||||
rm -f richcmp1.o richcmp1.so
|
|
||||||
rm -f richcmp2.o richcmp2.so
|
|
||||||
rm -f richcmp3.o richcmp3.so
|
|
||||||
rm -f so_locations *.pyc
|
|
||||||
rm -rf ii_files
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) rm
|
|
||||||
|
|
||||||
depend:
|
|
||||||
@ cat Makefile.nodepend; \
|
|
||||||
for obj in $(DEPOBJ); \
|
|
||||||
do \
|
|
||||||
bn=`echo "$$obj" | cut -d. -f1`; \
|
|
||||||
$(CPP) $(CPPOPTS) $(MAKEDEP) "$$bn".cpp; \
|
|
||||||
done
|
|
||||||
|
|
||||||
@@ -1,184 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# Create a new empty directory anywhere (preferably not in the boost tree).
|
|
||||||
# Copy this Makefile to that new directory and rename it to "Makefile"
|
|
||||||
# Adjust the pathnames below.
|
|
||||||
#
|
|
||||||
# make softlinks Create softlinks to source code and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make unlink Remove softlinks
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
ROOT=$(HOME)
|
|
||||||
BOOST=$(ROOT)/boost
|
|
||||||
|
|
||||||
#PYEXE=PYTHONPATH=. /usr/bin/python
|
|
||||||
#PYINC=-I/usr/include/python1.5
|
|
||||||
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
|
||||||
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
|
||||||
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
|
||||||
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
|
||||||
|
|
||||||
STDOPTS=-fPIC -ftemplate-depth-21
|
|
||||||
WARNOPTS=
|
|
||||||
OPTOPTS=-g
|
|
||||||
|
|
||||||
CPP=g++
|
|
||||||
CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST) $(PYINC) \
|
|
||||||
$(STDOPTS) $(WARNOPTS) $(OPTOPTS)
|
|
||||||
MAKEDEP=-M
|
|
||||||
|
|
||||||
LD=$(CPP)
|
|
||||||
LDOPTS=-shared
|
|
||||||
|
|
||||||
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
|
||||||
init_function.o module_builder.o \
|
|
||||||
objects.o types.o cross_module.o
|
|
||||||
DEPOBJ=$(OBJ) \
|
|
||||||
comprehensive.o \
|
|
||||||
abstract.o \
|
|
||||||
getting_started1.o getting_started2.o \
|
|
||||||
simple_vector.o \
|
|
||||||
do_it_yourself_convts.o \
|
|
||||||
nested.o \
|
|
||||||
pickle1.o pickle2.o pickle3.o \
|
|
||||||
noncopyable_export.o noncopyable_import.o \
|
|
||||||
ivect.o dvect.o \
|
|
||||||
richcmp1.o richcmp2.o richcmp3.o
|
|
||||||
|
|
||||||
.SUFFIXES: .o .cpp
|
|
||||||
|
|
||||||
all: libboost_python.a \
|
|
||||||
boost_python_test.so \
|
|
||||||
abstract.so \
|
|
||||||
getting_started1.so getting_started2.so \
|
|
||||||
simple_vector.so \
|
|
||||||
do_it_yourself_convts.so \
|
|
||||||
nested.so \
|
|
||||||
pickle1.so pickle2.so pickle3.so \
|
|
||||||
noncopyable_export.so noncopyable_import.so \
|
|
||||||
ivect.so dvect.so \
|
|
||||||
richcmp1.so richcmp2.so richcmp3.so
|
|
||||||
|
|
||||||
libboost_python.a: $(OBJ)
|
|
||||||
rm -f libboost_python.a
|
|
||||||
ar r libboost_python.a $(OBJ)
|
|
||||||
|
|
||||||
boost_python_test.so: $(OBJ) comprehensive.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) comprehensive.o -o boost_python_test.so -lm
|
|
||||||
|
|
||||||
abstract.so: $(OBJ) abstract.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) abstract.o -o abstract.so
|
|
||||||
|
|
||||||
getting_started1.so: $(OBJ) getting_started1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started1.o -o getting_started1.so
|
|
||||||
|
|
||||||
getting_started2.so: $(OBJ) getting_started2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started2.o -o getting_started2.so
|
|
||||||
|
|
||||||
simple_vector.so: $(OBJ) simple_vector.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) simple_vector.o -o simple_vector.so
|
|
||||||
|
|
||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
|
||||||
|
|
||||||
nested.so: $(OBJ) nested.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
|
||||||
|
|
||||||
pickle2.so: $(OBJ) pickle2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle2.o -o pickle2.so
|
|
||||||
|
|
||||||
pickle3.so: $(OBJ) pickle3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle3.o -o pickle3.so
|
|
||||||
|
|
||||||
noncopyable_export.so: $(OBJ) noncopyable_export.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_export.o -o noncopyable_export.so
|
|
||||||
|
|
||||||
noncopyable_import.so: $(OBJ) noncopyable_import.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_import.o -o noncopyable_import.so
|
|
||||||
|
|
||||||
ivect.so: $(OBJ) ivect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) ivect.o -o ivect.so
|
|
||||||
|
|
||||||
dvect.so: $(OBJ) dvect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) dvect.o -o dvect.so
|
|
||||||
|
|
||||||
richcmp1.so: $(OBJ) richcmp1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp1.o -o richcmp1.so
|
|
||||||
|
|
||||||
richcmp2.so: $(OBJ) richcmp2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp2.o -o richcmp2.so
|
|
||||||
|
|
||||||
richcmp3.so: $(OBJ) richcmp3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp3.o -o richcmp3.so
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
$(CPP) $(CPPOPTS) -c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
$(PYEXE) comprehensive.py
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJ) libboost_python.a libboost_python.a.input
|
|
||||||
rm -f comprehensive.o boost_python_test.so
|
|
||||||
rm -f abstract.o abstract.so
|
|
||||||
rm -f getting_started1.o getting_started1.so
|
|
||||||
rm -f getting_started2.o getting_started2.so
|
|
||||||
rm -f simple_vector.o simple_vector.so
|
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
|
||||||
rm -f nested.o nested.so
|
|
||||||
rm -f pickle1.o pickle1.so
|
|
||||||
rm -f pickle2.o pickle2.so
|
|
||||||
rm -f pickle3.o pickle3.so
|
|
||||||
rm -f noncopyable_export.o noncopyable_export.so
|
|
||||||
rm -f noncopyable_import.o noncopyable_import.so
|
|
||||||
rm -f ivect.o ivect.so
|
|
||||||
rm -f dvect.o dvect.so
|
|
||||||
rm -f richcmp1.o richcmp1.so
|
|
||||||
rm -f richcmp2.o richcmp2.so
|
|
||||||
rm -f richcmp3.o richcmp3.so
|
|
||||||
rm -f so_locations *.pyc
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) rm
|
|
||||||
|
|
||||||
depend:
|
|
||||||
@ cat Makefile.nodepend; \
|
|
||||||
for obj in $(DEPOBJ); \
|
|
||||||
do \
|
|
||||||
bn=`echo "$$obj" | cut -d. -f1`; \
|
|
||||||
$(CPP) $(CPPOPTS) $(MAKEDEP) "$$bn".cpp; \
|
|
||||||
done
|
|
||||||
|
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# make copy Copy the sources and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make del Remove the sources and tests
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
# To install mingw32, follow instructions at:
|
|
||||||
# http://starship.python.net/crew/kernr/mingw32/Notes.html
|
|
||||||
# In particular, install:
|
|
||||||
# ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/gcc-2.95.2/gcc-2.95.2-msvcrt.exe
|
|
||||||
# ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/gcc-2.95.2/fixes/quote-fix-msvcrt.exe
|
|
||||||
# http://starship.python.net/crew/kernr/mingw32/Python-1.5.2-mingw32.zip
|
|
||||||
# Unpack the first two archives in the default locations and update your PATH.
|
|
||||||
# Unpack the third archive in \usr.
|
|
||||||
|
|
||||||
# Note: comprehensive.cpp generates compiler errors and later crashes.
|
|
||||||
# L:\boost\boost\python\detail\extension_class.hpp:643: warning:
|
|
||||||
# alignment of `vtable for class
|
|
||||||
# boost::python::detail::held_instance<bpl_test::Derived1>'
|
|
||||||
# is greater than maximum object file alignment. Using 16.
|
|
||||||
# Could this be fixed with compiler options?
|
|
||||||
# -fhuge-objects looks interesting, but requires recompiling the C++ library.
|
|
||||||
# (what exactly does that mean?)
|
|
||||||
# -fvtable-thunks eliminates the compiler warning, but
|
|
||||||
# "import boost_python_test" still causes a crash.
|
|
||||||
|
|
||||||
ROOT=R:
|
|
||||||
BOOST_WIN="$(ROOT)\boost"
|
|
||||||
BOOST_UNIX=$(HOME)/boost
|
|
||||||
|
|
||||||
PYEXE="C:\Program files\Python\python.exe"
|
|
||||||
PYINC=-I"C:\usr\include\python1.5"
|
|
||||||
PYLIB="C:\usr\lib\libpython15.a"
|
|
||||||
#PYEXE="C:\Python21\python.exe"
|
|
||||||
#PYINC=-I"C:\usr\include\python2.1"
|
|
||||||
#PYLIB="C:\usr\lib\libpython21.a"
|
|
||||||
|
|
||||||
STDOPTS=-ftemplate-depth-21
|
|
||||||
WARNOPTS=
|
|
||||||
OPTOPTS=-g
|
|
||||||
|
|
||||||
CPP=g++
|
|
||||||
CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST_WIN) $(PYINC) \
|
|
||||||
$(STDOPTS) $(WARNOPTS) $(OPTOPTS)
|
|
||||||
|
|
||||||
LD=g++
|
|
||||||
LDOPTS=-shared
|
|
||||||
|
|
||||||
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
|
||||||
init_function.o module_builder.o \
|
|
||||||
objects.o types.o cross_module.o
|
|
||||||
|
|
||||||
.SUFFIXES: .o .cpp
|
|
||||||
|
|
||||||
all: libboost_python.a \
|
|
||||||
abstract.pyd \
|
|
||||||
getting_started1.pyd getting_started2.pyd \
|
|
||||||
simple_vector.pyd \
|
|
||||||
do_it_yourself_convts.pyd \
|
|
||||||
nested.pyd \
|
|
||||||
pickle1.pyd pickle2.pyd pickle3.pyd \
|
|
||||||
noncopyable_export.pyd noncopyable_import.pyd \
|
|
||||||
ivect.pyd dvect.pyd \
|
|
||||||
richcmp1.pyd richcmp2.pyd richcmp3.pyd
|
|
||||||
|
|
||||||
libboost_python.a: $(OBJ)
|
|
||||||
-del libboost_python.a
|
|
||||||
ar r libboost_python.a $(OBJ)
|
|
||||||
|
|
||||||
DLLWRAPOPTS=-s --driver-name g++ -s \
|
|
||||||
--entry _DllMainCRTStartup@12 --target=i386-mingw32
|
|
||||||
|
|
||||||
boost_python_test.pyd: $(OBJ) comprehensive.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname boost_python_test.pyd \
|
|
||||||
--def boost_python_test.def \
|
|
||||||
$(OBJ) comprehensive.o $(PYLIB)
|
|
||||||
|
|
||||||
abstract.pyd: $(OBJ) abstract.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname abstract.pyd \
|
|
||||||
--def abstract.def \
|
|
||||||
$(OBJ) abstract.o $(PYLIB)
|
|
||||||
|
|
||||||
getting_started1.pyd: $(OBJ) getting_started1.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname getting_started1.pyd \
|
|
||||||
--def getting_started1.def \
|
|
||||||
$(OBJ) getting_started1.o $(PYLIB)
|
|
||||||
|
|
||||||
getting_started2.pyd: $(OBJ) getting_started2.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname getting_started2.pyd \
|
|
||||||
--def getting_started2.def \
|
|
||||||
$(OBJ) getting_started2.o $(PYLIB)
|
|
||||||
|
|
||||||
simple_vector.pyd: $(OBJ) simple_vector.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname simple_vector.pyd \
|
|
||||||
--def simple_vector.def \
|
|
||||||
$(OBJ) simple_vector.o $(PYLIB)
|
|
||||||
|
|
||||||
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname do_it_yourself_convts.pyd \
|
|
||||||
--def do_it_yourself_convts.def \
|
|
||||||
$(OBJ) do_it_yourself_convts.o $(PYLIB)
|
|
||||||
|
|
||||||
nested.pyd: $(OBJ) nested.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname nested.pyd \
|
|
||||||
--def nested.def \
|
|
||||||
$(OBJ) nested.o $(PYLIB)
|
|
||||||
|
|
||||||
pickle1.pyd: $(OBJ) pickle1.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname pickle1.pyd \
|
|
||||||
--def pickle1.def \
|
|
||||||
$(OBJ) pickle1.o $(PYLIB)
|
|
||||||
|
|
||||||
pickle2.pyd: $(OBJ) pickle2.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname pickle2.pyd \
|
|
||||||
--def pickle2.def \
|
|
||||||
$(OBJ) pickle2.o $(PYLIB)
|
|
||||||
|
|
||||||
pickle3.pyd: $(OBJ) pickle3.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname pickle3.pyd \
|
|
||||||
--def pickle3.def \
|
|
||||||
$(OBJ) pickle3.o $(PYLIB)
|
|
||||||
|
|
||||||
noncopyable_export.pyd: $(OBJ) noncopyable_export.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname noncopyable_export.pyd \
|
|
||||||
--def noncopyable_export.def \
|
|
||||||
$(OBJ) noncopyable_export.o $(PYLIB)
|
|
||||||
|
|
||||||
noncopyable_import.pyd: $(OBJ) noncopyable_import.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname noncopyable_import.pyd \
|
|
||||||
--def noncopyable_import.def \
|
|
||||||
$(OBJ) noncopyable_import.o $(PYLIB)
|
|
||||||
|
|
||||||
ivect.pyd: $(OBJ) ivect.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname ivect.pyd \
|
|
||||||
--def ivect.def \
|
|
||||||
$(OBJ) ivect.o $(PYLIB)
|
|
||||||
|
|
||||||
dvect.pyd: $(OBJ) dvect.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname dvect.pyd \
|
|
||||||
--def dvect.def \
|
|
||||||
$(OBJ) dvect.o $(PYLIB)
|
|
||||||
|
|
||||||
richcmp1.pyd: $(OBJ) richcmp1.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname richcmp1.pyd \
|
|
||||||
--def richcmp1.def \
|
|
||||||
$(OBJ) richcmp1.o $(PYLIB)
|
|
||||||
|
|
||||||
richcmp2.pyd: $(OBJ) richcmp2.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname richcmp2.pyd \
|
|
||||||
--def richcmp2.def \
|
|
||||||
$(OBJ) richcmp2.o $(PYLIB)
|
|
||||||
|
|
||||||
richcmp3.pyd: $(OBJ) richcmp3.o
|
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
|
||||||
--dllname richcmp3.pyd \
|
|
||||||
--def richcmp3.def \
|
|
||||||
$(OBJ) richcmp3.o $(PYLIB)
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
$(CPP) $(CPPOPTS) -c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
# $(PYEXE) comprehensive.py
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-del *.o
|
|
||||||
-del *.a
|
|
||||||
-del *.pyd
|
|
||||||
-del *.pyc
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) rm
|
|
||||||
|
|
||||||
copy:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) copy
|
|
||||||
|
|
||||||
del:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) del
|
|
||||||
@@ -1,199 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# Create a new empty directory anywhere (preferably not in the boost tree).
|
|
||||||
# Copy this Makefile to that new directory and rename it to "Makefile"
|
|
||||||
# Adjust the pathnames below.
|
|
||||||
#
|
|
||||||
# make softlinks Create softlinks to source code and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make unlink Remove softlinks
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
ROOT=$(HOME)
|
|
||||||
BOOST=$(ROOT)/boost
|
|
||||||
|
|
||||||
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
|
||||||
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
|
||||||
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
|
||||||
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
|
||||||
#STLPORTINC=-I/usr/local/STLport-4.1b3/stlport
|
|
||||||
#STLPORTINC=-I/usr/local/STLport-4.1b4/stlport
|
|
||||||
#STLPORTOPTS= \
|
|
||||||
# -D__USE_STD_IOSTREAM \
|
|
||||||
# -D__STL_NO_SGI_IOSTREAMS \
|
|
||||||
# -D__STL_USE_NATIVE_STRING \
|
|
||||||
# -D__STL_NO_NEW_C_HEADERS \
|
|
||||||
# -D_RWSTD_COMPILE_INSTANTIATE=1
|
|
||||||
STLPORTINC=-I$(BOOST)/boost/compatibility/cpp_c_headers
|
|
||||||
|
|
||||||
STDOPTS=-std strict_ansi
|
|
||||||
# use -msg_display_number to obtain integer tags for -msg_disable
|
|
||||||
WARNOPTS=-msg_disable 186,450,1115
|
|
||||||
OPTOPTS=-g
|
|
||||||
|
|
||||||
CPP=cxx
|
|
||||||
CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST) $(PYINC) \
|
|
||||||
$(STDOPTS) $(WARNOPTS) $(OPTOPTS)
|
|
||||||
MAKEDEP=-Em
|
|
||||||
|
|
||||||
LD=cxx
|
|
||||||
LDOPTS=-shared -expect_unresolved 'Py*' -expect_unresolved '_Py*'
|
|
||||||
|
|
||||||
#HIDDEN=-hidden
|
|
||||||
|
|
||||||
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
|
||||||
init_function.o module_builder.o \
|
|
||||||
objects.o types.o cross_module.o
|
|
||||||
DEPOBJ=$(OBJ) \
|
|
||||||
comprehensive.o \
|
|
||||||
abstract.o \
|
|
||||||
getting_started1.o getting_started2.o \
|
|
||||||
simple_vector.o \
|
|
||||||
do_it_yourself_convts.o \
|
|
||||||
nested.o \
|
|
||||||
pickle1.o pickle2.o pickle3.o \
|
|
||||||
noncopyable_export.o noncopyable_import.o \
|
|
||||||
ivect.o dvect.o \
|
|
||||||
richcmp1.o richcmp2.o richcmp3.o
|
|
||||||
|
|
||||||
.SUFFIXES: .o .cpp
|
|
||||||
|
|
||||||
all: libboost_python.a \
|
|
||||||
boost_python_test.so \
|
|
||||||
abstract.so \
|
|
||||||
getting_started1.so getting_started2.so \
|
|
||||||
simple_vector.so \
|
|
||||||
do_it_yourself_convts.so \
|
|
||||||
nested.so \
|
|
||||||
pickle1.so pickle2.so pickle3.so \
|
|
||||||
noncopyable_export.so noncopyable_import.so \
|
|
||||||
ivect.so dvect.so \
|
|
||||||
richcmp1.so richcmp2.so richcmp3.so
|
|
||||||
|
|
||||||
libboost_python.a: $(OBJ)
|
|
||||||
rm -f libboost_python.a
|
|
||||||
cd cxx_repository; \
|
|
||||||
ls -1 > ../libboost_python.a.input; \
|
|
||||||
ar r ../libboost_python.a -input ../libboost_python.a.input
|
|
||||||
rm -f libboost_python.a.input
|
|
||||||
ar r libboost_python.a $(OBJ)
|
|
||||||
|
|
||||||
boost_python_test.so: $(OBJ) comprehensive.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) comprehensive.o -o boost_python_test.so -lm
|
|
||||||
|
|
||||||
abstract.so: $(OBJ) abstract.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) abstract.o -o abstract.so
|
|
||||||
|
|
||||||
getting_started1.so: $(OBJ) getting_started1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started1.o -o getting_started1.so
|
|
||||||
|
|
||||||
getting_started2.so: $(OBJ) getting_started2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started2.o -o getting_started2.so
|
|
||||||
|
|
||||||
simple_vector.so: $(OBJ) simple_vector.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) simple_vector.o -o simple_vector.so
|
|
||||||
|
|
||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
|
||||||
|
|
||||||
nested.so: $(OBJ) nested.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
|
||||||
|
|
||||||
pickle2.so: $(OBJ) pickle2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle2.o -o pickle2.so
|
|
||||||
|
|
||||||
pickle3.so: $(OBJ) pickle3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle3.o -o pickle3.so
|
|
||||||
|
|
||||||
noncopyable_export.so: $(OBJ) noncopyable_export.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_export.o -o noncopyable_export.so
|
|
||||||
|
|
||||||
noncopyable_import.so: $(OBJ) noncopyable_import.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) \
|
|
||||||
noncopyable_import.o -o noncopyable_import.so
|
|
||||||
|
|
||||||
ivect.so: $(OBJ) ivect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) ivect.o -o ivect.so
|
|
||||||
|
|
||||||
dvect.so: $(OBJ) dvect.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) $(HIDDEN) dvect.o -o dvect.so
|
|
||||||
|
|
||||||
richcmp1.so: $(OBJ) richcmp1.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp1.o -o richcmp1.so
|
|
||||||
|
|
||||||
richcmp2.so: $(OBJ) richcmp2.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp2.o -o richcmp2.so
|
|
||||||
|
|
||||||
richcmp3.so: $(OBJ) richcmp3.o
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp3.o -o richcmp3.so
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
$(CPP) $(CPPOPTS) -c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
$(PYEXE) comprehensive.py
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJ) libboost_python.a libboost_python.a.input
|
|
||||||
rm -f comprehensive.o boost_python_test.so
|
|
||||||
rm -f abstract.o abstract.so
|
|
||||||
rm -f getting_started1.o getting_started1.so
|
|
||||||
rm -f getting_started2.o getting_started2.so
|
|
||||||
rm -f simple_vector.o simple_vector.so
|
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
|
||||||
rm -f nested.o nested.so
|
|
||||||
rm -f pickle1.o pickle1.so
|
|
||||||
rm -f pickle2.o pickle2.so
|
|
||||||
rm -f pickle3.o pickle3.so
|
|
||||||
rm -f noncopyable_export.o noncopyable_export.so
|
|
||||||
rm -f noncopyable_import.o noncopyable_import.so
|
|
||||||
rm -f ivect.o ivect.so
|
|
||||||
rm -f dvect.o dvect.so
|
|
||||||
rm -f richcmp1.o richcmp1.so
|
|
||||||
rm -f richcmp2.o richcmp2.so
|
|
||||||
rm -f richcmp3.o richcmp3.so
|
|
||||||
rm -f so_locations *.pyc
|
|
||||||
rm -rf cxx_repository
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
$(PYEXE) $(BOOST)/libs/python/build/filemgr.py $(BOOST) rm
|
|
||||||
|
|
||||||
depend:
|
|
||||||
@ cat Makefile.nodepend; \
|
|
||||||
for obj in $(DEPOBJ); \
|
|
||||||
do \
|
|
||||||
bn=`echo "$$obj" | cut -d. -f1`; \
|
|
||||||
$(CPP) $(CPPOPTS) $(MAKEDEP) "$$bn".cpp; \
|
|
||||||
done
|
|
||||||
|
|
||||||
154
build/vc60.mak
@@ -1,154 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# Create a new empty directory anywhere (preferably not in the boost tree).
|
|
||||||
# Copy this Makefile to that new directory and rename it to "Makefile"
|
|
||||||
# Adjust the pathnames below.
|
|
||||||
#
|
|
||||||
# make copy Copy the sources and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make del Remove the sources and tests
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
|
||||||
|
|
||||||
ROOT=R:
|
|
||||||
BOOST_WIN="$(ROOT)\boost"
|
|
||||||
BOOST_UNIX=$(HOME)/boost
|
|
||||||
|
|
||||||
#PYEXE="C:\Program files\Python\python.exe"
|
|
||||||
#PYINC=/I"C:\Program files\Python\include"
|
|
||||||
#PYLIB="C:\Program files\Python\libs\python15.lib"
|
|
||||||
PYEXE="C:\Python21\python.exe"
|
|
||||||
PYINC=/I"C:\Python21\include"
|
|
||||||
PYLIB="C:\Python21\libs\python21.lib"
|
|
||||||
|
|
||||||
STDOPTS=/nologo /MD /GR /GX /Zm300 /DBOOST_PYTHON_STATIC_LIB
|
|
||||||
WARNOPTS=
|
|
||||||
OPTOPTS=
|
|
||||||
|
|
||||||
CPP=cl.exe
|
|
||||||
CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) /I$(BOOST_WIN) $(PYINC) \
|
|
||||||
$(STDOPTS) $(WARNOPTS) $(OPTOPTS)
|
|
||||||
|
|
||||||
LD=link.exe
|
|
||||||
LDOPTS=/nologo /dll /incremental:no
|
|
||||||
|
|
||||||
OBJ=classes.obj conversions.obj errors.obj extension_class.obj functions.obj \
|
|
||||||
init_function.obj module_builder.obj \
|
|
||||||
objects.obj types.obj cross_module.obj
|
|
||||||
|
|
||||||
.SUFFIXES: .obj .cpp
|
|
||||||
|
|
||||||
all: boost_python.lib \
|
|
||||||
boost_python_test.pyd \
|
|
||||||
abstract.pyd \
|
|
||||||
getting_started1.pyd getting_started2.pyd \
|
|
||||||
simple_vector.pyd \
|
|
||||||
do_it_yourself_convts.pyd \
|
|
||||||
nested.pyd \
|
|
||||||
pickle1.pyd pickle2.pyd pickle3.pyd \
|
|
||||||
noncopyable_export.pyd noncopyable_import.pyd \
|
|
||||||
ivect.pyd dvect.pyd \
|
|
||||||
richcmp1.pyd richcmp2.pyd richcmp3.pyd
|
|
||||||
|
|
||||||
boost_python.lib: $(OBJ)
|
|
||||||
$(LD) -lib /nologo /out:boost_python.lib $(OBJ)
|
|
||||||
|
|
||||||
boost_python_test.pyd: $(OBJ) comprehensive.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) comprehensive.obj $(PYLIB) /export:initboost_python_test /out:"boost_python_test.pyd"
|
|
||||||
|
|
||||||
abstract.pyd: $(OBJ) abstract.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) abstract.obj $(PYLIB) /export:initabstract /out:"abstract.pyd"
|
|
||||||
|
|
||||||
getting_started1.pyd: $(OBJ) getting_started1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started1.obj $(PYLIB) /export:initgetting_started1 /out:"getting_started1.pyd"
|
|
||||||
|
|
||||||
getting_started2.pyd: $(OBJ) getting_started2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started2.obj $(PYLIB) /export:initgetting_started2 /out:"getting_started2.pyd"
|
|
||||||
|
|
||||||
simple_vector.pyd: $(OBJ) simple_vector.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) simple_vector.obj $(PYLIB) /export:initsimple_vector /out:"simple_vector.pyd"
|
|
||||||
|
|
||||||
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) /export:initdo_it_yourself_convts /out:"do_it_yourself_convts.pyd"
|
|
||||||
|
|
||||||
nested.pyd: $(OBJ) nested.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) nested.obj $(PYLIB) /export:initnested /out:"nested.pyd"
|
|
||||||
|
|
||||||
pickle1.pyd: $(OBJ) pickle1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) /export:initpickle1 /out:"pickle1.pyd"
|
|
||||||
|
|
||||||
pickle2.pyd: $(OBJ) pickle2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle2.obj $(PYLIB) /export:initpickle2 /out:"pickle2.pyd"
|
|
||||||
|
|
||||||
pickle3.pyd: $(OBJ) pickle3.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle3.obj $(PYLIB) /export:initpickle3 /out:"pickle3.pyd"
|
|
||||||
|
|
||||||
noncopyable_export.pyd: $(OBJ) noncopyable_export.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) noncopyable_export.obj $(PYLIB) /export:initnoncopyable_export /out:"noncopyable_export.pyd"
|
|
||||||
|
|
||||||
noncopyable_import.pyd: $(OBJ) noncopyable_import.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) noncopyable_import.obj $(PYLIB) /export:initnoncopyable_import /out:"noncopyable_import.pyd"
|
|
||||||
|
|
||||||
ivect.pyd: $(OBJ) ivect.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) ivect.obj $(PYLIB) /export:initivect /out:"ivect.pyd"
|
|
||||||
|
|
||||||
dvect.pyd: $(OBJ) dvect.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) dvect.obj $(PYLIB) /export:initdvect /out:"dvect.pyd"
|
|
||||||
|
|
||||||
richcmp1.pyd: $(OBJ) richcmp1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp1.obj $(PYLIB) /export:initrichcmp1 /out:"richcmp1.pyd"
|
|
||||||
|
|
||||||
richcmp2.pyd: $(OBJ) richcmp2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp2.obj $(PYLIB) /export:initrichcmp2 /out:"richcmp2.pyd"
|
|
||||||
|
|
||||||
richcmp3.pyd: $(OBJ) richcmp3.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp3.obj $(PYLIB) /export:initrichcmp3 /out:"richcmp3.pyd"
|
|
||||||
|
|
||||||
.cpp.obj:
|
|
||||||
$(CPP) $(CPPOPTS) /c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
$(PYEXE) comprehensive.py --broken-auto-ptr
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py --broken-auto-ptr
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-del *.obj
|
|
||||||
-del *.lib
|
|
||||||
-del *.exp
|
|
||||||
-del *.idb
|
|
||||||
-del *.pyd
|
|
||||||
-del *.pyc
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) rm
|
|
||||||
|
|
||||||
copy:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) copy
|
|
||||||
|
|
||||||
del:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) del
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
# Usage:
|
|
||||||
#
|
|
||||||
# make copy Copy the sources and tests
|
|
||||||
# make Compile all sources
|
|
||||||
# make test Run doctest tests
|
|
||||||
# make clean Remove all object files
|
|
||||||
# make del Remove the sources and tests
|
|
||||||
#
|
|
||||||
# Revision history:
|
|
||||||
# 14 Dec 01 derived from vc60.mak (R.W. Grosse-Kunstleve)
|
|
||||||
|
|
||||||
ROOT=R:
|
|
||||||
BOOST_WIN="$(ROOT)\boost"
|
|
||||||
BOOST_UNIX=$(HOME)/boost
|
|
||||||
|
|
||||||
#PYEXE="C:\Program files\Python\python.exe"
|
|
||||||
#PYINC=-I"C:\Program files\Python\include"
|
|
||||||
#PYLIB="C:\Program files\Python\libs\python15.lib"
|
|
||||||
PYEXE="C:\Python21\python.exe"
|
|
||||||
PYINC=-I"C:\Python21\include"
|
|
||||||
PYLIB="C:\Python21\libs\python21.lib"
|
|
||||||
|
|
||||||
STDOPTS=-gccinc -prefix UseDLLPrefix.h -DBOOST_PYTHON_STATIC_LIB
|
|
||||||
WARNOPTS=-warn on,nounusedexpr,nounused
|
|
||||||
OPTOPTS=-O
|
|
||||||
|
|
||||||
CPP=mwcc
|
|
||||||
CPPOPTS=$(STDOPTS) $(WARNOPTS) $(OPTOPTS) \
|
|
||||||
$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST_WIN) $(PYINC)
|
|
||||||
|
|
||||||
LD=mwld
|
|
||||||
LDOPTS=-export dllexport -shared
|
|
||||||
|
|
||||||
OBJ=classes.obj conversions.obj errors.obj extension_class.obj functions.obj \
|
|
||||||
init_function.obj module_builder.obj \
|
|
||||||
objects.obj types.obj cross_module.obj
|
|
||||||
|
|
||||||
.SUFFIXES: .obj .cpp
|
|
||||||
|
|
||||||
all: libboost_python.lib \
|
|
||||||
boost_python_test.pyd \
|
|
||||||
abstract.pyd \
|
|
||||||
getting_started1.pyd getting_started2.pyd \
|
|
||||||
simple_vector.pyd \
|
|
||||||
do_it_yourself_convts.pyd \
|
|
||||||
nested.pyd \
|
|
||||||
pickle1.pyd pickle2.pyd pickle3.pyd \
|
|
||||||
noncopyable_export.pyd noncopyable_import.pyd \
|
|
||||||
ivect.pyd dvect.pyd \
|
|
||||||
richcmp1.pyd richcmp2.pyd richcmp3.pyd
|
|
||||||
|
|
||||||
libboost_python.lib: $(OBJ)
|
|
||||||
$(LD) -library -o libboost_python.lib $(OBJ)
|
|
||||||
|
|
||||||
boost_python_test.pyd: $(OBJ) comprehensive.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) comprehensive.obj $(PYLIB) -o boost_python_test.pyd
|
|
||||||
|
|
||||||
abstract.pyd: $(OBJ) abstract.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) abstract.obj $(PYLIB) -o abstract.pyd
|
|
||||||
|
|
||||||
getting_started1.pyd: $(OBJ) getting_started1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started1.obj $(PYLIB) -o getting_started1.pyd
|
|
||||||
|
|
||||||
getting_started2.pyd: $(OBJ) getting_started2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) getting_started2.obj $(PYLIB) -o getting_started2.pyd
|
|
||||||
|
|
||||||
simple_vector.pyd: $(OBJ) simple_vector.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) simple_vector.obj $(PYLIB) -o simple_vector.pyd
|
|
||||||
|
|
||||||
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) -o do_it_yourself_convts.pyd
|
|
||||||
|
|
||||||
nested.pyd: $(OBJ) nested.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) nested.obj $(PYLIB) -o nested.pyd
|
|
||||||
|
|
||||||
pickle1.pyd: $(OBJ) pickle1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) -o pickle1.pyd
|
|
||||||
|
|
||||||
pickle2.pyd: $(OBJ) pickle2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle2.obj $(PYLIB) -o pickle2.pyd
|
|
||||||
|
|
||||||
pickle3.pyd: $(OBJ) pickle3.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle3.obj $(PYLIB) -o pickle3.pyd
|
|
||||||
|
|
||||||
noncopyable_export.pyd: $(OBJ) noncopyable_export.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) noncopyable_export.obj $(PYLIB) -o noncopyable_export.pyd
|
|
||||||
|
|
||||||
noncopyable_import.pyd: $(OBJ) noncopyable_import.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) noncopyable_import.obj $(PYLIB) -o noncopyable_import.pyd
|
|
||||||
|
|
||||||
ivect.pyd: $(OBJ) ivect.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) ivect.obj $(PYLIB) -o ivect.pyd
|
|
||||||
|
|
||||||
dvect.pyd: $(OBJ) dvect.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) dvect.obj $(PYLIB) -o dvect.pyd
|
|
||||||
|
|
||||||
richcmp1.pyd: $(OBJ) richcmp1.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp1.obj $(PYLIB) -o richcmp1.pyd
|
|
||||||
|
|
||||||
richcmp2.pyd: $(OBJ) richcmp2.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp2.obj $(PYLIB) -o richcmp2.pyd
|
|
||||||
|
|
||||||
richcmp3.pyd: $(OBJ) richcmp3.obj
|
|
||||||
$(LD) $(LDOPTS) $(OBJ) richcmp3.obj $(PYLIB) -o richcmp3.pyd
|
|
||||||
|
|
||||||
.cpp.obj:
|
|
||||||
$(CPP) $(CPPOPTS) -c $*.cpp
|
|
||||||
|
|
||||||
test:
|
|
||||||
$(PYEXE) comprehensive.py
|
|
||||||
$(PYEXE) test_abstract.py
|
|
||||||
$(PYEXE) test_getting_started1.py
|
|
||||||
$(PYEXE) test_getting_started2.py
|
|
||||||
$(PYEXE) test_simple_vector.py
|
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
|
||||||
$(PYEXE) test_nested.py
|
|
||||||
$(PYEXE) test_pickle1.py
|
|
||||||
$(PYEXE) test_pickle2.py
|
|
||||||
$(PYEXE) test_pickle3.py
|
|
||||||
$(PYEXE) test_cross_module.py
|
|
||||||
$(PYEXE) test_richcmp1.py
|
|
||||||
$(PYEXE) test_richcmp2.py
|
|
||||||
$(PYEXE) test_richcmp3.py
|
|
||||||
|
|
||||||
clean:
|
|
||||||
-del *.obj
|
|
||||||
-del *.lib
|
|
||||||
-del *.exp
|
|
||||||
-del *.idb
|
|
||||||
-del *.pyd
|
|
||||||
-del *.pyc
|
|
||||||
|
|
||||||
softlinks:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) softlinks
|
|
||||||
|
|
||||||
unlink:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) unlink
|
|
||||||
|
|
||||||
cp:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) cp
|
|
||||||
|
|
||||||
rm:
|
|
||||||
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) rm
|
|
||||||
|
|
||||||
copy:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) copy
|
|
||||||
|
|
||||||
del:
|
|
||||||
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) del
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
call "c:\program files\metrowerks\codewarrior\other metrowerks tools\command line tools\cwenv.bat"
|
|
||||||
set MWWinx86LibraryFiles=MSL_All-DLL_x86.lib;gdi32.lib;user32.lib;kernel32.lib
|
|
||||||
66
doc/Jamfile
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Copyright (c) 2006 Joel de Guzman
|
||||||
|
# Copyright (c) 2015 Stefan Seefeld
|
||||||
|
#
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
import boostbook ;
|
||||||
|
import quickbook ;
|
||||||
|
import docutils ;
|
||||||
|
import os ;
|
||||||
|
|
||||||
|
path-constant here : . ;
|
||||||
|
path-constant images : html/images ;
|
||||||
|
|
||||||
|
project python/doc
|
||||||
|
: requirements
|
||||||
|
-<xsl:param>boost.defaults=Boost
|
||||||
|
<format>html:<xsl:param>boost.defaults=none
|
||||||
|
<format>html:<xsl:param>toc.max.depth=3
|
||||||
|
<format>html:<xsl:param>toc.section.depth=2
|
||||||
|
<format>html:<xsl:param>chunk.section.depth=1
|
||||||
|
;
|
||||||
|
|
||||||
|
make numpy : numpy/index.rst : @sphinx-build ;
|
||||||
|
|
||||||
|
if [ os.name ] = NT
|
||||||
|
{
|
||||||
|
actions sphinx-build { chdir "$(>:D)" && make clean && make html}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
actions sphinx-build { make -C "$(>:D)" clean html}
|
||||||
|
}
|
||||||
|
|
||||||
|
boostbook python : python.qbk
|
||||||
|
: <format>html:<name>$(here)/html
|
||||||
|
<format>html:<xsl:param>generate.toc="library nop; chapter toc; section toc;"
|
||||||
|
<format>html:<xsl:param>html.stylesheet=boostbook.css
|
||||||
|
<format>html:<xsl:param>boost.image.src=images/boost.png
|
||||||
|
<format>html:<xsl:param>boost.graphics.root=images/
|
||||||
|
;
|
||||||
|
|
||||||
|
boostbook tutorial : tutorial.qbk
|
||||||
|
: <format>html:<name>$(here)/html/tutorial
|
||||||
|
<format>html:<xsl:param>html.stylesheet=../boostbook.css
|
||||||
|
<format>html:<xsl:param>boost.image.src=../images/boost.png
|
||||||
|
<format>html:<xsl:param>boost.graphics.root=../images/
|
||||||
|
;
|
||||||
|
|
||||||
|
boostbook reference : reference.qbk
|
||||||
|
: <format>html:<name>$(here)/html/reference
|
||||||
|
<format>html:<xsl:param>html.stylesheet=../boostbook.css
|
||||||
|
<format>html:<xsl:param>boost.image.src=../images/boost.png
|
||||||
|
<format>html:<xsl:param>boost.graphics.root=../images/
|
||||||
|
;
|
||||||
|
|
||||||
|
html article : article.rst
|
||||||
|
: <location>html
|
||||||
|
<docutils-html>"--link-stylesheet --traceback --trim-footnote-reference-space --footnote-references=superscript --stylesheet=rst.css"
|
||||||
|
;
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
alias boostdoc ;
|
||||||
|
explicit boostdoc ;
|
||||||
|
alias boostrelease : python tutorial reference numpy article ;
|
||||||
|
explicit boostrelease ;
|
||||||
947
doc/article.rst
Normal file
@@ -0,0 +1,947 @@
|
|||||||
|
+++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
Building Hybrid Systems with Boost.Python
|
||||||
|
+++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
:Author: David Abrahams
|
||||||
|
:Contact: dave@boost-consulting.com
|
||||||
|
:organization: `Boost Consulting`_
|
||||||
|
:date: 2003-05-14
|
||||||
|
|
||||||
|
:Author: Ralf W. Grosse-Kunstleve
|
||||||
|
|
||||||
|
:copyright: Copyright David Abrahams and Ralf W. Grosse-Kunstleve 2003. All rights reserved
|
||||||
|
|
||||||
|
.. contents:: Table of Contents
|
||||||
|
|
||||||
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|
||||||
|
==========
|
||||||
|
Abstract
|
||||||
|
==========
|
||||||
|
|
||||||
|
Boost.Python is an open source C++ library which provides a concise
|
||||||
|
IDL-like interface for binding C++ classes and functions to
|
||||||
|
Python. Leveraging the full power of C++ compile-time introspection
|
||||||
|
and of recently developed metaprogramming techniques, this is achieved
|
||||||
|
entirely in pure C++, without introducing a new syntax.
|
||||||
|
Boost.Python's rich set of features and high-level interface make it
|
||||||
|
possible to engineer packages from the ground up as hybrid systems,
|
||||||
|
giving programmers easy and coherent access to both the efficient
|
||||||
|
compile-time polymorphism of C++ and the extremely convenient run-time
|
||||||
|
polymorphism of Python.
|
||||||
|
|
||||||
|
==============
|
||||||
|
Introduction
|
||||||
|
==============
|
||||||
|
|
||||||
|
Python and C++ are in many ways as different as two languages could
|
||||||
|
be: while C++ is usually compiled to machine-code, Python is
|
||||||
|
interpreted. Python's dynamic type system is often cited as the
|
||||||
|
foundation of its flexibility, while in C++ static typing is the
|
||||||
|
cornerstone of its efficiency. C++ has an intricate and difficult
|
||||||
|
compile-time meta-language, while in Python, practically everything
|
||||||
|
happens at runtime.
|
||||||
|
|
||||||
|
Yet for many programmers, these very differences mean that Python and
|
||||||
|
C++ complement one another perfectly. Performance bottlenecks in
|
||||||
|
Python programs can be rewritten in C++ for maximal speed, and
|
||||||
|
authors of powerful C++ libraries choose Python as a middleware
|
||||||
|
language for its flexible system integration capabilities.
|
||||||
|
Furthermore, the surface differences mask some strong similarities:
|
||||||
|
|
||||||
|
* 'C'-family control structures (if, while, for...)
|
||||||
|
|
||||||
|
* Support for object-orientation, functional programming, and generic
|
||||||
|
programming (these are both *multi-paradigm* programming languages.)
|
||||||
|
|
||||||
|
* Comprehensive operator overloading facilities, recognizing the
|
||||||
|
importance of syntactic variability for readability and
|
||||||
|
expressivity.
|
||||||
|
|
||||||
|
* High-level concepts such as collections and iterators.
|
||||||
|
|
||||||
|
* High-level encapsulation facilities (C++: namespaces, Python: modules)
|
||||||
|
to support the design of re-usable libraries.
|
||||||
|
|
||||||
|
* Exception-handling for effective management of error conditions.
|
||||||
|
|
||||||
|
* C++ idioms in common use, such as handle/body classes and
|
||||||
|
reference-counted smart pointers mirror Python reference semantics.
|
||||||
|
|
||||||
|
Given Python's rich 'C' interoperability API, it should in principle
|
||||||
|
be possible to expose C++ type and function interfaces to Python with
|
||||||
|
an analogous interface to their C++ counterparts. However, the
|
||||||
|
facilities provided by Python alone for integration with C++ are
|
||||||
|
relatively meager. Compared to C++ and Python, 'C' has only very
|
||||||
|
rudimentary abstraction facilities, and support for exception-handling
|
||||||
|
is completely missing. 'C' extension module writers are required to
|
||||||
|
manually manage Python reference counts, which is both annoyingly
|
||||||
|
tedious and extremely error-prone. Traditional extension modules also
|
||||||
|
tend to contain a great deal of boilerplate code repetition which
|
||||||
|
makes them difficult to maintain, especially when wrapping an evolving
|
||||||
|
API.
|
||||||
|
|
||||||
|
These limitations have lead to the development of a variety of wrapping
|
||||||
|
systems. SWIG_ is probably the most popular package for the
|
||||||
|
integration of C/C++ and Python. A more recent development is SIP_,
|
||||||
|
which was specifically designed for interfacing Python with the Qt_
|
||||||
|
graphical user interface library. Both SWIG and SIP introduce their
|
||||||
|
own specialized languages for customizing inter-language bindings.
|
||||||
|
This has certain advantages, but having to deal with three different
|
||||||
|
languages (Python, C/C++ and the interface language) also introduces
|
||||||
|
practical and mental difficulties. The CXX_ package demonstrates an
|
||||||
|
interesting alternative. It shows that at least some parts of
|
||||||
|
Python's 'C' API can be wrapped and presented through a much more
|
||||||
|
user-friendly C++ interface. However, unlike SWIG and SIP, CXX does
|
||||||
|
not include support for wrapping C++ classes as new Python types.
|
||||||
|
|
||||||
|
The features and goals of Boost.Python_ overlap significantly with
|
||||||
|
many of these other systems. That said, Boost.Python attempts to
|
||||||
|
maximize convenience and flexibility without introducing a separate
|
||||||
|
wrapping language. Instead, it presents the user with a high-level
|
||||||
|
C++ interface for wrapping C++ classes and functions, managing much of
|
||||||
|
the complexity behind-the-scenes with static metaprogramming.
|
||||||
|
Boost.Python also goes beyond the scope of earlier systems by
|
||||||
|
providing:
|
||||||
|
|
||||||
|
* Support for C++ virtual functions that can be overridden in Python.
|
||||||
|
|
||||||
|
* Comprehensive lifetime management facilities for low-level C++
|
||||||
|
pointers and references.
|
||||||
|
|
||||||
|
* Support for organizing extensions as Python packages,
|
||||||
|
with a central registry for inter-language type conversions.
|
||||||
|
|
||||||
|
* A safe and convenient mechanism for tying into Python's powerful
|
||||||
|
serialization engine (pickle).
|
||||||
|
|
||||||
|
* Coherence with the rules for handling C++ lvalues and rvalues that
|
||||||
|
can only come from a deep understanding of both the Python and C++
|
||||||
|
type systems.
|
||||||
|
|
||||||
|
The key insight that sparked the development of Boost.Python is that
|
||||||
|
much of the boilerplate code in traditional extension modules could be
|
||||||
|
eliminated using C++ compile-time introspection. Each argument of a
|
||||||
|
wrapped C++ function must be extracted from a Python object using a
|
||||||
|
procedure that depends on the argument type. Similarly the function's
|
||||||
|
return type determines how the return value will be converted from C++
|
||||||
|
to Python. Of course argument and return types are part of each
|
||||||
|
function's type, and this is exactly the source from which
|
||||||
|
Boost.Python deduces most of the information required.
|
||||||
|
|
||||||
|
This approach leads to *user guided wrapping*: as much information is
|
||||||
|
extracted directly from the source code to be wrapped as is possible
|
||||||
|
within the framework of pure C++, and some additional information is
|
||||||
|
supplied explicitly by the user. Mostly the guidance is mechanical
|
||||||
|
and little real intervention is required. Because the interface
|
||||||
|
specification is written in the same full-featured language as the
|
||||||
|
code being exposed, the user has unprecedented power available when
|
||||||
|
she does need to take control.
|
||||||
|
|
||||||
|
.. _Python: http://www.python.org/
|
||||||
|
.. _SWIG: http://www.swig.org/
|
||||||
|
.. _SIP: http://www.riverbankcomputing.co.uk/sip/index.php
|
||||||
|
.. _Qt: http://www.trolltech.com/
|
||||||
|
.. _CXX: http://cxx.sourceforge.net/
|
||||||
|
.. _Boost.Python: http://www.boost.org/libs/python/doc
|
||||||
|
|
||||||
|
===========================
|
||||||
|
Boost.Python Design Goals
|
||||||
|
===========================
|
||||||
|
|
||||||
|
The primary goal of Boost.Python is to allow users to expose C++
|
||||||
|
classes and functions to Python using nothing more than a C++
|
||||||
|
compiler. In broad strokes, the user experience should be one of
|
||||||
|
directly manipulating C++ objects from Python.
|
||||||
|
|
||||||
|
However, it's also important not to translate all interfaces *too*
|
||||||
|
literally: the idioms of each language must be respected. For
|
||||||
|
example, though C++ and Python both have an iterator concept, they are
|
||||||
|
expressed very differently. Boost.Python has to be able to bridge the
|
||||||
|
interface gap.
|
||||||
|
|
||||||
|
It must be possible to insulate Python users from crashes resulting
|
||||||
|
from trivial misuses of C++ interfaces, such as accessing
|
||||||
|
already-deleted objects. By the same token the library should
|
||||||
|
insulate C++ users from low-level Python 'C' API, replacing
|
||||||
|
error-prone 'C' interfaces like manual reference-count management and
|
||||||
|
raw ``PyObject`` pointers with more-robust alternatives.
|
||||||
|
|
||||||
|
Support for component-based development is crucial, so that C++ types
|
||||||
|
exposed in one extension module can be passed to functions exposed in
|
||||||
|
another without loss of crucial information like C++ inheritance
|
||||||
|
relationships.
|
||||||
|
|
||||||
|
Finally, all wrapping must be *non-intrusive*, without modifying or
|
||||||
|
even seeing the original C++ source code. Existing C++ libraries have
|
||||||
|
to be wrappable by third parties who only have access to header files
|
||||||
|
and binaries.
|
||||||
|
|
||||||
|
==========================
|
||||||
|
Hello Boost.Python World
|
||||||
|
==========================
|
||||||
|
|
||||||
|
And now for a preview of Boost.Python, and how it improves on the raw
|
||||||
|
facilities offered by Python. Here's a function we might want to
|
||||||
|
expose::
|
||||||
|
|
||||||
|
char const* greet(unsigned x)
|
||||||
|
{
|
||||||
|
static char const* const msgs[] = { "hello", "Boost.Python", "world!" };
|
||||||
|
|
||||||
|
if (x > 2)
|
||||||
|
throw std::range_error("greet: index out of range");
|
||||||
|
|
||||||
|
return msgs[x];
|
||||||
|
}
|
||||||
|
|
||||||
|
To wrap this function in standard C++ using the Python 'C' API, we'd
|
||||||
|
need something like this::
|
||||||
|
|
||||||
|
extern "C" // all Python interactions use 'C' linkage and calling convention
|
||||||
|
{
|
||||||
|
// Wrapper to handle argument/result conversion and checking
|
||||||
|
PyObject* greet_wrap(PyObject* args, PyObject * keywords)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
if (PyArg_ParseTuple(args, "i", &x)) // extract/check arguments
|
||||||
|
{
|
||||||
|
char const* result = greet(x); // invoke wrapped function
|
||||||
|
return PyString_FromString(result); // convert result to Python
|
||||||
|
}
|
||||||
|
return 0; // error occurred
|
||||||
|
}
|
||||||
|
|
||||||
|
// Table of wrapped functions to be exposed by the module
|
||||||
|
static PyMethodDef methods[] = {
|
||||||
|
{ "greet", greet_wrap, METH_VARARGS, "return one of 3 parts of a greeting" }
|
||||||
|
, { NULL, NULL, 0, NULL } // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
// module initialization function
|
||||||
|
DL_EXPORT init_hello()
|
||||||
|
{
|
||||||
|
(void) Py_InitModule("hello", methods); // add the methods to the module
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Now here's the wrapping code we'd use to expose it with Boost.Python::
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE(hello)
|
||||||
|
{
|
||||||
|
def("greet", greet, "return one of 3 parts of a greeting");
|
||||||
|
}
|
||||||
|
|
||||||
|
and here it is in action::
|
||||||
|
|
||||||
|
>>> import hello
|
||||||
|
>>> for x in range(3):
|
||||||
|
... print hello.greet(x)
|
||||||
|
...
|
||||||
|
hello
|
||||||
|
Boost.Python
|
||||||
|
world!
|
||||||
|
|
||||||
|
Aside from the fact that the 'C' API version is much more verbose,
|
||||||
|
it's worth noting a few things that it doesn't handle correctly:
|
||||||
|
|
||||||
|
* The original function accepts an unsigned integer, and the Python
|
||||||
|
'C' API only gives us a way of extracting signed integers. The
|
||||||
|
Boost.Python version will raise a Python exception if we try to pass
|
||||||
|
a negative number to ``hello.greet``, but the other one will proceed
|
||||||
|
to do whatever the C++ implementation does when converting an
|
||||||
|
negative integer to unsigned (usually wrapping to some very large
|
||||||
|
number), and pass the incorrect translation on to the wrapped
|
||||||
|
function.
|
||||||
|
|
||||||
|
* That brings us to the second problem: if the C++ ``greet()``
|
||||||
|
function is called with a number greater than 2, it will throw an
|
||||||
|
exception. Typically, if a C++ exception propagates across the
|
||||||
|
boundary with code generated by a 'C' compiler, it will cause a
|
||||||
|
crash. As you can see in the first version, there's no C++
|
||||||
|
scaffolding there to prevent this from happening. Functions wrapped
|
||||||
|
by Boost.Python automatically include an exception-handling layer
|
||||||
|
which protects Python users by translating unhandled C++ exceptions
|
||||||
|
into a corresponding Python exception.
|
||||||
|
|
||||||
|
* A slightly more-subtle limitation is that the argument conversion
|
||||||
|
used in the Python 'C' API case can only get that integer ``x`` in
|
||||||
|
*one way*. PyArg_ParseTuple can't convert Python ``long`` objects
|
||||||
|
(arbitrary-precision integers) which happen to fit in an ``unsigned
|
||||||
|
int`` but not in a ``signed long``, nor will it ever handle a
|
||||||
|
wrapped C++ class with a user-defined implicit ``operator unsigned
|
||||||
|
int()`` conversion. Boost.Python's dynamic type conversion
|
||||||
|
registry allows users to add arbitrary conversion methods.
|
||||||
|
|
||||||
|
==================
|
||||||
|
Library Overview
|
||||||
|
==================
|
||||||
|
|
||||||
|
This section outlines some of the library's major features. Except as
|
||||||
|
neccessary to avoid confusion, details of library implementation are
|
||||||
|
omitted.
|
||||||
|
|
||||||
|
------------------
|
||||||
|
Exposing Classes
|
||||||
|
------------------
|
||||||
|
|
||||||
|
C++ classes and structs are exposed with a similarly-terse interface.
|
||||||
|
Given::
|
||||||
|
|
||||||
|
struct World
|
||||||
|
{
|
||||||
|
void set(std::string msg) { this->msg = msg; }
|
||||||
|
std::string greet() { return msg; }
|
||||||
|
std::string msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
The following code will expose it in our extension module::
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
BOOST_PYTHON_MODULE(hello)
|
||||||
|
{
|
||||||
|
class_<World>("World")
|
||||||
|
.def("greet", &World::greet)
|
||||||
|
.def("set", &World::set)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
Although this code has a certain pythonic familiarity, people
|
||||||
|
sometimes find the syntax bit confusing because it doesn't look like
|
||||||
|
most of the C++ code they're used to. All the same, this is just
|
||||||
|
standard C++. Because of their flexible syntax and operator
|
||||||
|
overloading, C++ and Python are great for defining domain-specific
|
||||||
|
(sub)languages
|
||||||
|
(DSLs), and that's what we've done in Boost.Python. To break it down::
|
||||||
|
|
||||||
|
class_<World>("World")
|
||||||
|
|
||||||
|
constructs an unnamed object of type ``class_<World>`` and passes
|
||||||
|
``"World"`` to its constructor. This creates a new-style Python class
|
||||||
|
called ``World`` in the extension module, and associates it with the
|
||||||
|
C++ type ``World`` in the Boost.Python type conversion registry. We
|
||||||
|
might have also written::
|
||||||
|
|
||||||
|
class_<World> w("World");
|
||||||
|
|
||||||
|
but that would've been more verbose, since we'd have to name ``w``
|
||||||
|
again to invoke its ``def()`` member function::
|
||||||
|
|
||||||
|
w.def("greet", &World::greet)
|
||||||
|
|
||||||
|
There's nothing special about the location of the dot for member
|
||||||
|
access in the original example: C++ allows any amount of whitespace on
|
||||||
|
either side of a token, and placing the dot at the beginning of each
|
||||||
|
line allows us to chain as many successive calls to member functions
|
||||||
|
as we like with a uniform syntax. The other key fact that allows
|
||||||
|
chaining is that ``class_<>`` member functions all return a reference
|
||||||
|
to ``*this``.
|
||||||
|
|
||||||
|
So the example is equivalent to::
|
||||||
|
|
||||||
|
class_<World> w("World");
|
||||||
|
w.def("greet", &World::greet);
|
||||||
|
w.def("set", &World::set);
|
||||||
|
|
||||||
|
It's occasionally useful to be able to break down the components of a
|
||||||
|
Boost.Python class wrapper in this way, but the rest of this article
|
||||||
|
will stick to the terse syntax.
|
||||||
|
|
||||||
|
For completeness, here's the wrapped class in use: ::
|
||||||
|
|
||||||
|
>>> import hello
|
||||||
|
>>> planet = hello.World()
|
||||||
|
>>> planet.set('howdy')
|
||||||
|
>>> planet.greet()
|
||||||
|
'howdy'
|
||||||
|
|
||||||
|
Constructors
|
||||||
|
============
|
||||||
|
|
||||||
|
Since our ``World`` class is just a plain ``struct``, it has an
|
||||||
|
implicit no-argument (nullary) constructor. Boost.Python exposes the
|
||||||
|
nullary constructor by default, which is why we were able to write: ::
|
||||||
|
|
||||||
|
>>> planet = hello.World()
|
||||||
|
|
||||||
|
However, well-designed classes in any language may require constructor
|
||||||
|
arguments in order to establish their invariants. Unlike Python,
|
||||||
|
where ``__init__`` is just a specially-named method, In C++
|
||||||
|
constructors cannot be handled like ordinary member functions. In
|
||||||
|
particular, we can't take their address: ``&World::World`` is an
|
||||||
|
error. The library provides a different interface for specifying
|
||||||
|
constructors. Given::
|
||||||
|
|
||||||
|
struct World
|
||||||
|
{
|
||||||
|
World(std::string msg); // added constructor
|
||||||
|
...
|
||||||
|
|
||||||
|
we can modify our wrapping code as follows::
|
||||||
|
|
||||||
|
class_<World>("World", init<std::string>())
|
||||||
|
...
|
||||||
|
|
||||||
|
of course, a C++ class may have additional constructors, and we can
|
||||||
|
expose those as well by passing more instances of ``init<...>`` to
|
||||||
|
``def()``::
|
||||||
|
|
||||||
|
class_<World>("World", init<std::string>())
|
||||||
|
.def(init<double, double>())
|
||||||
|
...
|
||||||
|
|
||||||
|
Boost.Python allows wrapped functions, member functions, and
|
||||||
|
constructors to be overloaded to mirror C++ overloading.
|
||||||
|
|
||||||
|
Data Members and Properties
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Any publicly-accessible data members in a C++ class can be easily
|
||||||
|
exposed as either ``readonly`` or ``readwrite`` attributes::
|
||||||
|
|
||||||
|
class_<World>("World", init<std::string>())
|
||||||
|
.def_readonly("msg", &World::msg)
|
||||||
|
...
|
||||||
|
|
||||||
|
and can be used directly in Python: ::
|
||||||
|
|
||||||
|
>>> planet = hello.World('howdy')
|
||||||
|
>>> planet.msg
|
||||||
|
'howdy'
|
||||||
|
|
||||||
|
This does *not* result in adding attributes to the ``World`` instance
|
||||||
|
``__dict__``, which can result in substantial memory savings when
|
||||||
|
wrapping large data structures. In fact, no instance ``__dict__``
|
||||||
|
will be created at all unless attributes are explicitly added from
|
||||||
|
Python. Boost.Python owes this capability to the new Python 2.2 type
|
||||||
|
system, in particular the descriptor interface and ``property`` type.
|
||||||
|
|
||||||
|
In C++, publicly-accessible data members are considered a sign of poor
|
||||||
|
design because they break encapsulation, and style guides usually
|
||||||
|
dictate the use of "getter" and "setter" functions instead. In
|
||||||
|
Python, however, ``__getattr__``, ``__setattr__``, and since 2.2,
|
||||||
|
``property`` mean that attribute access is just one more
|
||||||
|
well-encapsulated syntactic tool at the programmer's disposal.
|
||||||
|
Boost.Python bridges this idiomatic gap by making Python ``property``
|
||||||
|
creation directly available to users. If ``msg`` were private, we
|
||||||
|
could still expose it as attribute in Python as follows::
|
||||||
|
|
||||||
|
class_<World>("World", init<std::string>())
|
||||||
|
.add_property("msg", &World::greet, &World::set)
|
||||||
|
...
|
||||||
|
|
||||||
|
The example above mirrors the familiar usage of properties in Python
|
||||||
|
2.2+: ::
|
||||||
|
|
||||||
|
>>> class World(object):
|
||||||
|
... __init__(self, msg):
|
||||||
|
... self.__msg = msg
|
||||||
|
... def greet(self):
|
||||||
|
... return self.__msg
|
||||||
|
... def set(self, msg):
|
||||||
|
... self.__msg = msg
|
||||||
|
... msg = property(greet, set)
|
||||||
|
|
||||||
|
Operator Overloading
|
||||||
|
====================
|
||||||
|
|
||||||
|
The ability to write arithmetic operators for user-defined types has
|
||||||
|
been a major factor in the success of both languages for numerical
|
||||||
|
computation, and the success of packages like NumPy_ attests to the
|
||||||
|
power of exposing operators in extension modules. Boost.Python
|
||||||
|
provides a concise mechanism for wrapping operator overloads. The
|
||||||
|
example below shows a fragment from a wrapper for the Boost rational
|
||||||
|
number library::
|
||||||
|
|
||||||
|
class_<rational<int> >("rational_int")
|
||||||
|
.def(init<int, int>()) // constructor, e.g. rational_int(3,4)
|
||||||
|
.def("numerator", &rational<int>::numerator)
|
||||||
|
.def("denominator", &rational<int>::denominator)
|
||||||
|
.def(-self) // __neg__ (unary minus)
|
||||||
|
.def(self + self) // __add__ (homogeneous)
|
||||||
|
.def(self * self) // __mul__
|
||||||
|
.def(self + int()) // __add__ (heterogenous)
|
||||||
|
.def(int() + self) // __radd__
|
||||||
|
...
|
||||||
|
|
||||||
|
The magic is performed using a simplified application of "expression
|
||||||
|
templates" [VELD1995]_, a technique originally developed for
|
||||||
|
optimization of high-performance matrix algebra expressions. The
|
||||||
|
essence is that instead of performing the computation immediately,
|
||||||
|
operators are overloaded to construct a type *representing* the
|
||||||
|
computation. In matrix algebra, dramatic optimizations are often
|
||||||
|
available when the structure of an entire expression can be taken into
|
||||||
|
account, rather than evaluating each operation "greedily".
|
||||||
|
Boost.Python uses the same technique to build an appropriate Python
|
||||||
|
method object based on expressions involving ``self``.
|
||||||
|
|
||||||
|
.. _NumPy: http://www.pfdubois.com/numpy/
|
||||||
|
|
||||||
|
Inheritance
|
||||||
|
===========
|
||||||
|
|
||||||
|
C++ inheritance relationships can be represented to Boost.Python by adding
|
||||||
|
an optional ``bases<...>`` argument to the ``class_<...>`` template
|
||||||
|
parameter list as follows::
|
||||||
|
|
||||||
|
class_<Derived, bases<Base1,Base2> >("Derived")
|
||||||
|
...
|
||||||
|
|
||||||
|
This has two effects:
|
||||||
|
|
||||||
|
1. When the ``class_<...>`` is created, Python type objects
|
||||||
|
corresponding to ``Base1`` and ``Base2`` are looked up in
|
||||||
|
Boost.Python's registry, and are used as bases for the new Python
|
||||||
|
``Derived`` type object, so methods exposed for the Python ``Base1``
|
||||||
|
and ``Base2`` types are automatically members of the ``Derived``
|
||||||
|
type. Because the registry is global, this works correctly even if
|
||||||
|
``Derived`` is exposed in a different module from either of its
|
||||||
|
bases.
|
||||||
|
|
||||||
|
2. C++ conversions from ``Derived`` to its bases are added to the
|
||||||
|
Boost.Python registry. Thus wrapped C++ methods expecting (a
|
||||||
|
pointer or reference to) an object of either base type can be
|
||||||
|
called with an object wrapping a ``Derived`` instance. Wrapped
|
||||||
|
member functions of class ``T`` are treated as though they have an
|
||||||
|
implicit first argument of ``T&``, so these conversions are
|
||||||
|
neccessary to allow the base class methods to be called for derived
|
||||||
|
objects.
|
||||||
|
|
||||||
|
Of course it's possible to derive new Python classes from wrapped C++
|
||||||
|
class instances. Because Boost.Python uses the new-style class
|
||||||
|
system, that works very much as for the Python built-in types. There
|
||||||
|
is one significant detail in which it differs: the built-in types
|
||||||
|
generally establish their invariants in their ``__new__`` function, so
|
||||||
|
that derived classes do not need to call ``__init__`` on the base
|
||||||
|
class before invoking its methods : ::
|
||||||
|
|
||||||
|
>>> class L(list):
|
||||||
|
... def __init__(self):
|
||||||
|
... pass
|
||||||
|
...
|
||||||
|
>>> L().reverse()
|
||||||
|
>>>
|
||||||
|
|
||||||
|
Because C++ object construction is a one-step operation, C++ instance
|
||||||
|
data cannot be constructed until the arguments are available, in the
|
||||||
|
``__init__`` function: ::
|
||||||
|
|
||||||
|
>>> class D(SomeBoostPythonClass):
|
||||||
|
... def __init__(self):
|
||||||
|
... pass
|
||||||
|
...
|
||||||
|
>>> D().some_boost_python_method()
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "<stdin>", line 1, in ?
|
||||||
|
TypeError: bad argument type for built-in operation
|
||||||
|
|
||||||
|
This happened because Boost.Python couldn't find instance data of type
|
||||||
|
``SomeBoostPythonClass`` within the ``D`` instance; ``D``'s ``__init__``
|
||||||
|
function masked construction of the base class. It could be corrected
|
||||||
|
by either removing ``D``'s ``__init__`` function or having it call
|
||||||
|
``SomeBoostPythonClass.__init__(...)`` explicitly.
|
||||||
|
|
||||||
|
Virtual Functions
|
||||||
|
=================
|
||||||
|
|
||||||
|
Deriving new types in Python from extension classes is not very
|
||||||
|
interesting unless they can be used polymorphically from C++. In
|
||||||
|
other words, Python method implementations should appear to override
|
||||||
|
the implementation of C++ virtual functions when called *through base
|
||||||
|
class pointers/references from C++*. Since the only way to alter the
|
||||||
|
behavior of a virtual function is to override it in a derived class,
|
||||||
|
the user must build a special derived class to dispatch a polymorphic
|
||||||
|
class' virtual functions::
|
||||||
|
|
||||||
|
//
|
||||||
|
// interface to wrap:
|
||||||
|
//
|
||||||
|
class Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual int f(std::string x) { return 42; }
|
||||||
|
virtual ~Base();
|
||||||
|
};
|
||||||
|
|
||||||
|
int calls_f(Base const& b, std::string x) { return b.f(x); }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Wrapping Code
|
||||||
|
//
|
||||||
|
|
||||||
|
// Dispatcher class
|
||||||
|
struct BaseWrap : Base
|
||||||
|
{
|
||||||
|
// Store a pointer to the Python object
|
||||||
|
BaseWrap(PyObject* self_) : self(self_) {}
|
||||||
|
PyObject* self;
|
||||||
|
|
||||||
|
// Default implementation, for when f is not overridden
|
||||||
|
int f_default(std::string x) { return this->Base::f(x); }
|
||||||
|
// Dispatch implementation
|
||||||
|
int f(std::string x) { return call_method<int>(self, "f", x); }
|
||||||
|
};
|
||||||
|
|
||||||
|
...
|
||||||
|
def("calls_f", calls_f);
|
||||||
|
class_<Base, BaseWrap>("Base")
|
||||||
|
.def("f", &Base::f, &BaseWrap::f_default)
|
||||||
|
;
|
||||||
|
|
||||||
|
Now here's some Python code which demonstrates: ::
|
||||||
|
|
||||||
|
>>> class Derived(Base):
|
||||||
|
... def f(self, s):
|
||||||
|
... return len(s)
|
||||||
|
...
|
||||||
|
>>> calls_f(Base(), 'foo')
|
||||||
|
42
|
||||||
|
>>> calls_f(Derived(), 'forty-two')
|
||||||
|
9
|
||||||
|
|
||||||
|
Things to notice about the dispatcher class:
|
||||||
|
|
||||||
|
* The key element which allows overriding in Python is the
|
||||||
|
``call_method`` invocation, which uses the same global type
|
||||||
|
conversion registry as the C++ function wrapping does to convert its
|
||||||
|
arguments from C++ to Python and its return type from Python to C++.
|
||||||
|
|
||||||
|
* Any constructor signatures you wish to wrap must be replicated with
|
||||||
|
an initial ``PyObject*`` argument
|
||||||
|
|
||||||
|
* The dispatcher must store this argument so that it can be used to
|
||||||
|
invoke ``call_method``
|
||||||
|
|
||||||
|
* The ``f_default`` member function is needed when the function being
|
||||||
|
exposed is not pure virtual; there's no other way ``Base::f`` can be
|
||||||
|
called on an object of type ``BaseWrap``, since it overrides ``f``.
|
||||||
|
|
||||||
|
Deeper Reflection on the Horizon?
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Admittedly, this formula is tedious to repeat, especially on a project
|
||||||
|
with many polymorphic classes. That it is neccessary reflects some
|
||||||
|
limitations in C++'s compile-time introspection capabilities: there's
|
||||||
|
no way to enumerate the members of a class and find out which are
|
||||||
|
virtual functions. At least one very promising project has been
|
||||||
|
started to write a front-end which can generate these dispatchers (and
|
||||||
|
other wrapping code) automatically from C++ headers.
|
||||||
|
|
||||||
|
Pyste_ is being developed by Bruno da Silva de Oliveira. It builds on
|
||||||
|
GCC_XML_, which generates an XML version of GCC's internal program
|
||||||
|
representation. Since GCC is a highly-conformant C++ compiler, this
|
||||||
|
ensures correct handling of the most-sophisticated template code and
|
||||||
|
full access to the underlying type system. In keeping with the
|
||||||
|
Boost.Python philosophy, a Pyste interface description is neither
|
||||||
|
intrusive on the code being wrapped, nor expressed in some unfamiliar
|
||||||
|
language: instead it is a 100% pure Python script. If Pyste is
|
||||||
|
successful it will mark a move away from wrapping everything directly
|
||||||
|
in C++ for many of our users. It will also allow us the choice to
|
||||||
|
shift some of the metaprogram code from C++ to Python. We expect that
|
||||||
|
soon, not only our users but the Boost.Python developers themselves
|
||||||
|
will be "thinking hybrid" about their own code.
|
||||||
|
|
||||||
|
.. _`GCC_XML`: http://www.gccxml.org/HTML/Index.html
|
||||||
|
.. _`Pyste`: http://www.boost.org/libs/python/pyste
|
||||||
|
|
||||||
|
---------------
|
||||||
|
Serialization
|
||||||
|
---------------
|
||||||
|
|
||||||
|
*Serialization* is the process of converting objects in memory to a
|
||||||
|
form that can be stored on disk or sent over a network connection. The
|
||||||
|
serialized object (most often a plain string) can be retrieved and
|
||||||
|
converted back to the original object. A good serialization system will
|
||||||
|
automatically convert entire object hierarchies. Python's standard
|
||||||
|
``pickle`` module is just such a system. It leverages the language's strong
|
||||||
|
runtime introspection facilities for serializing practically arbitrary
|
||||||
|
user-defined objects. With a few simple and unintrusive provisions this
|
||||||
|
powerful machinery can be extended to also work for wrapped C++ objects.
|
||||||
|
Here is an example::
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
struct World
|
||||||
|
{
|
||||||
|
World(std::string a_msg) : msg(a_msg) {}
|
||||||
|
std::string greet() const { return msg; }
|
||||||
|
std::string msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
struct World_picklers : pickle_suite
|
||||||
|
{
|
||||||
|
static tuple
|
||||||
|
getinitargs(World const& w) { return make_tuple(w.greet()); }
|
||||||
|
};
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE(hello)
|
||||||
|
{
|
||||||
|
class_<World>("World", init<std::string>())
|
||||||
|
.def("greet", &World::greet)
|
||||||
|
.def_pickle(World_picklers())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
Now let's create a ``World`` object and put it to rest on disk::
|
||||||
|
|
||||||
|
>>> import hello
|
||||||
|
>>> import pickle
|
||||||
|
>>> a_world = hello.World("howdy")
|
||||||
|
>>> pickle.dump(a_world, open("my_world", "w"))
|
||||||
|
|
||||||
|
In a potentially *different script* on a potentially *different
|
||||||
|
computer* with a potentially *different operating system*::
|
||||||
|
|
||||||
|
>>> import pickle
|
||||||
|
>>> resurrected_world = pickle.load(open("my_world", "r"))
|
||||||
|
>>> resurrected_world.greet()
|
||||||
|
'howdy'
|
||||||
|
|
||||||
|
Of course the ``cPickle`` module can also be used for faster
|
||||||
|
processing.
|
||||||
|
|
||||||
|
Boost.Python's ``pickle_suite`` fully supports the ``pickle`` protocol
|
||||||
|
defined in the standard Python documentation. Like a __getinitargs__
|
||||||
|
function in Python, the pickle_suite's getinitargs() is responsible for
|
||||||
|
creating the argument tuple that will be use to reconstruct the pickled
|
||||||
|
object. The other elements of the Python pickling protocol,
|
||||||
|
__getstate__ and __setstate__ can be optionally provided via C++
|
||||||
|
getstate and setstate functions. C++'s static type system allows the
|
||||||
|
library to ensure at compile-time that nonsensical combinations of
|
||||||
|
functions (e.g. getstate without setstate) are not used.
|
||||||
|
|
||||||
|
Enabling serialization of more complex C++ objects requires a little
|
||||||
|
more work than is shown in the example above. Fortunately the
|
||||||
|
``object`` interface (see next section) greatly helps in keeping the
|
||||||
|
code manageable.
|
||||||
|
|
||||||
|
------------------
|
||||||
|
Object interface
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Experienced 'C' language extension module authors will be familiar
|
||||||
|
with the ubiquitous ``PyObject*``, manual reference-counting, and the
|
||||||
|
need to remember which API calls return "new" (owned) references or
|
||||||
|
"borrowed" (raw) references. These constraints are not just
|
||||||
|
cumbersome but also a major source of errors, especially in the
|
||||||
|
presence of exceptions.
|
||||||
|
|
||||||
|
Boost.Python provides a class ``object`` which automates reference
|
||||||
|
counting and provides conversion to Python from C++ objects of
|
||||||
|
arbitrary type. This significantly reduces the learning effort for
|
||||||
|
prospective extension module writers.
|
||||||
|
|
||||||
|
Creating an ``object`` from any other type is extremely simple::
|
||||||
|
|
||||||
|
object s("hello, world"); // s manages a Python string
|
||||||
|
|
||||||
|
``object`` has templated interactions with all other types, with
|
||||||
|
automatic to-python conversions. It happens so naturally that it's
|
||||||
|
easily overlooked::
|
||||||
|
|
||||||
|
object ten_Os = 10 * s[4]; // -> "oooooooooo"
|
||||||
|
|
||||||
|
In the example above, ``4`` and ``10`` are converted to Python objects
|
||||||
|
before the indexing and multiplication operations are invoked.
|
||||||
|
|
||||||
|
The ``extract<T>`` class template can be used to convert Python objects
|
||||||
|
to C++ types::
|
||||||
|
|
||||||
|
double x = extract<double>(o);
|
||||||
|
|
||||||
|
If a conversion in either direction cannot be performed, an
|
||||||
|
appropriate exception is thrown at runtime.
|
||||||
|
|
||||||
|
The ``object`` type is accompanied by a set of derived types
|
||||||
|
that mirror the Python built-in types such as ``list``, ``dict``,
|
||||||
|
``tuple``, etc. as much as possible. This enables convenient
|
||||||
|
manipulation of these high-level types from C++::
|
||||||
|
|
||||||
|
dict d;
|
||||||
|
d["some"] = "thing";
|
||||||
|
d["lucky_number"] = 13;
|
||||||
|
list l = d.keys();
|
||||||
|
|
||||||
|
This almost looks and works like regular Python code, but it is pure
|
||||||
|
C++. Of course we can wrap C++ functions which accept or return
|
||||||
|
``object`` instances.
|
||||||
|
|
||||||
|
=================
|
||||||
|
Thinking hybrid
|
||||||
|
=================
|
||||||
|
|
||||||
|
Because of the practical and mental difficulties of combining
|
||||||
|
programming languages, it is common to settle a single language at the
|
||||||
|
outset of any development effort. For many applications, performance
|
||||||
|
considerations dictate the use of a compiled language for the core
|
||||||
|
algorithms. Unfortunately, due to the complexity of the static type
|
||||||
|
system, the price we pay for runtime performance is often a
|
||||||
|
significant increase in development time. Experience shows that
|
||||||
|
writing maintainable C++ code usually takes longer and requires *far*
|
||||||
|
more hard-earned working experience than developing comparable Python
|
||||||
|
code. Even when developers are comfortable working exclusively in
|
||||||
|
compiled languages, they often augment their systems by some type of
|
||||||
|
ad hoc scripting layer for the benefit of their users without ever
|
||||||
|
availing themselves of the same advantages.
|
||||||
|
|
||||||
|
Boost.Python enables us to *think hybrid*. Python can be used for
|
||||||
|
rapidly prototyping a new application; its ease of use and the large
|
||||||
|
pool of standard libraries give us a head start on the way to a
|
||||||
|
working system. If necessary, the working code can be used to
|
||||||
|
discover rate-limiting hotspots. To maximize performance these can
|
||||||
|
be reimplemented in C++, together with the Boost.Python bindings
|
||||||
|
needed to tie them back into the existing higher-level procedure.
|
||||||
|
|
||||||
|
Of course, this *top-down* approach is less attractive if it is clear
|
||||||
|
from the start that many algorithms will eventually have to be
|
||||||
|
implemented in C++. Fortunately Boost.Python also enables us to
|
||||||
|
pursue a *bottom-up* approach. We have used this approach very
|
||||||
|
successfully in the development of a toolbox for scientific
|
||||||
|
applications. The toolbox started out mainly as a library of C++
|
||||||
|
classes with Boost.Python bindings, and for a while the growth was
|
||||||
|
mainly concentrated on the C++ parts. However, as the toolbox is
|
||||||
|
becoming more complete, more and more newly added functionality can be
|
||||||
|
implemented in Python.
|
||||||
|
|
||||||
|
.. image:: images/python_cpp_mix.png
|
||||||
|
|
||||||
|
This figure shows the estimated ratio of newly added C++ and Python
|
||||||
|
code over time as new algorithms are implemented. We expect this
|
||||||
|
ratio to level out near 70% Python. Being able to solve new problems
|
||||||
|
mostly in Python rather than a more difficult statically typed
|
||||||
|
language is the return on our investment in Boost.Python. The ability
|
||||||
|
to access all of our code from Python allows a broader group of
|
||||||
|
developers to use it in the rapid development of new applications.
|
||||||
|
|
||||||
|
=====================
|
||||||
|
Development history
|
||||||
|
=====================
|
||||||
|
|
||||||
|
The first version of Boost.Python was developed in 2000 by Dave
|
||||||
|
Abrahams at Dragon Systems, where he was privileged to have Tim Peters
|
||||||
|
as a guide to "The Zen of Python". One of Dave's jobs was to develop
|
||||||
|
a Python-based natural language processing system. Since it was
|
||||||
|
eventually going to be targeting embedded hardware, it was always
|
||||||
|
assumed that the compute-intensive core would be rewritten in C++ to
|
||||||
|
optimize speed and memory footprint [#proto]_. The project also wanted to
|
||||||
|
test all of its C++ code using Python test scripts [#test]_. The only
|
||||||
|
tool we knew of for binding C++ and Python was SWIG_, and at the time
|
||||||
|
its handling of C++ was weak. It would be false to claim any deep
|
||||||
|
insight into the possible advantages of Boost.Python's approach at
|
||||||
|
this point. Dave's interest and expertise in fancy C++ template
|
||||||
|
tricks had just reached the point where he could do some real damage,
|
||||||
|
and Boost.Python emerged as it did because it filled a need and
|
||||||
|
because it seemed like a cool thing to try.
|
||||||
|
|
||||||
|
This early version was aimed at many of the same basic goals we've
|
||||||
|
described in this paper, differing most-noticeably by having a
|
||||||
|
slightly more cumbersome syntax and by lack of special support for
|
||||||
|
operator overloading, pickling, and component-based development.
|
||||||
|
These last three features were quickly added by Ullrich Koethe and
|
||||||
|
Ralf Grosse-Kunstleve [#feature]_, and other enthusiastic contributors arrived
|
||||||
|
on the scene to contribute enhancements like support for nested
|
||||||
|
modules and static member functions.
|
||||||
|
|
||||||
|
By early 2001 development had stabilized and few new features were
|
||||||
|
being added, however a disturbing new fact came to light: Ralf had
|
||||||
|
begun testing Boost.Python on pre-release versions of a compiler using
|
||||||
|
the EDG_ front-end, and the mechanism at the core of Boost.Python
|
||||||
|
responsible for handling conversions between Python and C++ types was
|
||||||
|
failing to compile. As it turned out, we had been exploiting a very
|
||||||
|
common bug in the implementation of all the C++ compilers we had
|
||||||
|
tested. We knew that as C++ compilers rapidly became more
|
||||||
|
standards-compliant, the library would begin failing on more
|
||||||
|
platforms. Unfortunately, because the mechanism was so central to the
|
||||||
|
functioning of the library, fixing the problem looked very difficult.
|
||||||
|
|
||||||
|
Fortunately, later that year Lawrence Berkeley and later Lawrence
|
||||||
|
Livermore National labs contracted with `Boost Consulting`_ for support
|
||||||
|
and development of Boost.Python, and there was a new opportunity to
|
||||||
|
address fundamental issues and ensure a future for the library. A
|
||||||
|
redesign effort began with the low level type conversion architecture,
|
||||||
|
building in standards-compliance and support for component-based
|
||||||
|
development (in contrast to version 1 where conversions had to be
|
||||||
|
explicitly imported and exported across module boundaries). A new
|
||||||
|
analysis of the relationship between the Python and C++ objects was
|
||||||
|
done, resulting in more intuitive handling for C++ lvalues and
|
||||||
|
rvalues.
|
||||||
|
|
||||||
|
The emergence of a powerful new type system in Python 2.2 made the
|
||||||
|
choice of whether to maintain compatibility with Python 1.5.2 easy:
|
||||||
|
the opportunity to throw away a great deal of elaborate code for
|
||||||
|
emulating classic Python classes alone was too good to pass up. In
|
||||||
|
addition, Python iterators and descriptors provided crucial and
|
||||||
|
elegant tools for representing similar C++ constructs. The
|
||||||
|
development of the generalized ``object`` interface allowed us to
|
||||||
|
further shield C++ programmers from the dangers and syntactic burdens
|
||||||
|
of the Python 'C' API. A great number of other features including C++
|
||||||
|
exception translation, improved support for overloaded functions, and
|
||||||
|
most significantly, CallPolicies for handling pointers and
|
||||||
|
references, were added during this period.
|
||||||
|
|
||||||
|
In October 2002, version 2 of Boost.Python was released. Development
|
||||||
|
since then has concentrated on improved support for C++ runtime
|
||||||
|
polymorphism and smart pointers. Peter Dimov's ingenious
|
||||||
|
``boost::shared_ptr`` design in particular has allowed us to give the
|
||||||
|
hybrid developer a consistent interface for moving objects back and
|
||||||
|
forth across the language barrier without loss of information. At
|
||||||
|
first, we were concerned that the sophistication and complexity of the
|
||||||
|
Boost.Python v2 implementation might discourage contributors, but the
|
||||||
|
emergence of Pyste_ and several other significant feature
|
||||||
|
contributions have laid those fears to rest. Daily questions on the
|
||||||
|
Python C++-sig and a backlog of desired improvements show that the
|
||||||
|
library is getting used. To us, the future looks bright.
|
||||||
|
|
||||||
|
.. _`EDG`: http://www.edg.com
|
||||||
|
|
||||||
|
=============
|
||||||
|
Conclusions
|
||||||
|
=============
|
||||||
|
|
||||||
|
Boost.Python achieves seamless interoperability between two rich and
|
||||||
|
complimentary language environments. Because it leverages template
|
||||||
|
metaprogramming to introspect about types and functions, the user
|
||||||
|
never has to learn a third syntax: the interface definitions are
|
||||||
|
written in concise and maintainable C++. Also, the wrapping system
|
||||||
|
doesn't have to parse C++ headers or represent the type system: the
|
||||||
|
compiler does that work for us.
|
||||||
|
|
||||||
|
Computationally intensive tasks play to the strengths of C++ and are
|
||||||
|
often impossible to implement efficiently in pure Python, while jobs
|
||||||
|
like serialization that are trivial in Python can be very difficult in
|
||||||
|
pure C++. Given the luxury of building a hybrid software system from
|
||||||
|
the ground up, we can approach design with new confidence and power.
|
||||||
|
|
||||||
|
===========
|
||||||
|
Citations
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. [VELD1995] T. Veldhuizen, "Expression Templates," C++ Report,
|
||||||
|
Vol. 7 No. 5 June 1995, pp. 26-31.
|
||||||
|
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html
|
||||||
|
|
||||||
|
===========
|
||||||
|
Footnotes
|
||||||
|
===========
|
||||||
|
|
||||||
|
.. [#proto] In retrospect, it seems that "thinking hybrid" from the
|
||||||
|
ground up might have been better for the NLP system: the
|
||||||
|
natural component boundaries defined by the pure python
|
||||||
|
prototype turned out to be inappropriate for getting the
|
||||||
|
desired performance and memory footprint out of the C++ core,
|
||||||
|
which eventually caused some redesign overhead on the Python
|
||||||
|
side when the core was moved to C++.
|
||||||
|
|
||||||
|
.. [#test] We also have some reservations about driving all C++
|
||||||
|
testing through a Python interface, unless that's the only way
|
||||||
|
it will be ultimately used. Any transition across language
|
||||||
|
boundaries with such different object models can inevitably
|
||||||
|
mask bugs.
|
||||||
|
|
||||||
|
.. [#feature] These features were expressed very differently in v1 of
|
||||||
|
Boost.Python
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
H1
|
|
||||||
{
|
|
||||||
FONT-SIZE: 200%
|
|
||||||
COLOR: #00007f
|
|
||||||
}
|
|
||||||
H2
|
|
||||||
{
|
|
||||||
FONT-SIZE: 150%;
|
|
||||||
}
|
|
||||||
H3
|
|
||||||
{
|
|
||||||
FONT-SIZE: 125%;
|
|
||||||
}
|
|
||||||
H4
|
|
||||||
{
|
|
||||||
FONT-SIZE: 108%;
|
|
||||||
}
|
|
||||||
BODY
|
|
||||||
{
|
|
||||||
FONT-SIZE: 100%;
|
|
||||||
BACKGROUND-COLOR: #ffffff
|
|
||||||
}
|
|
||||||
PRE
|
|
||||||
{
|
|
||||||
MARGIN-LEFT: 2pc;
|
|
||||||
FONT-SIZE: 80%;
|
|
||||||
BACKGROUND-COLOR: #dfffff
|
|
||||||
}
|
|
||||||
CODE
|
|
||||||
{
|
|
||||||
FONT-SIZE: 95%;
|
|
||||||
white-space: pre
|
|
||||||
}
|
|
||||||
.index
|
|
||||||
{
|
|
||||||
TEXT-ALIGN: left
|
|
||||||
}
|
|
||||||
.page-index
|
|
||||||
{
|
|
||||||
TEXT-ALIGN: left
|
|
||||||
}
|
|
||||||
.definition
|
|
||||||
{
|
|
||||||
TEXT-ALIGN: left
|
|
||||||
}
|
|
||||||
.footnote
|
|
||||||
{
|
|
||||||
FONT-SIZE: 66%;
|
|
||||||
VERTICAL-ALIGN: super;
|
|
||||||
TEXT-DECORATION: none
|
|
||||||
}
|
|
||||||
.function-semantics
|
|
||||||
{
|
|
||||||
CLEAR: left
|
|
||||||
}
|
|
||||||
.metafunction-semantics
|
|
||||||
{
|
|
||||||
CLEAR: left
|
|
||||||
}
|
|
||||||
716
doc/boostbook.css
Normal file
@@ -0,0 +1,716 @@
|
|||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Copyright (c) 2004 Joel de Guzman
|
||||||
|
http://spirit.sourceforge.net/
|
||||||
|
|
||||||
|
Copyright 2013 Niall Douglas additions for colors and alignment.
|
||||||
|
Copyright 2013 Paul A. Bristow additions for more colors and alignments.
|
||||||
|
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompany-
|
||||||
|
ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Body defaults
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
body
|
||||||
|
{
|
||||||
|
margin: 1em;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Paragraphs
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
p
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Program listings
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/* Code on paragraphs */
|
||||||
|
p tt.computeroutput
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listings in tables don't get borders */
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
margin: 0pc 0pc 0pc 0pc;
|
||||||
|
padding: 0pc 0pc 0pc 0pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Headings
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
margin: 1em 0em 0.5em 0em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { font-size: 140%; }
|
||||||
|
h2 { font-weight: bold; font-size: 140%; }
|
||||||
|
h3 { font-weight: bold; font-size: 130%; }
|
||||||
|
h4 { font-weight: bold; font-size: 120%; }
|
||||||
|
h5 { font-weight: normal; font-style: italic; font-size: 110%; }
|
||||||
|
h6 { font-weight: normal; font-style: italic; font-size: 100%; }
|
||||||
|
|
||||||
|
/* Top page titles */
|
||||||
|
title,
|
||||||
|
h1.title,
|
||||||
|
h2.title
|
||||||
|
h3.title,
|
||||||
|
h4.title,
|
||||||
|
h5.title,
|
||||||
|
h6.title,
|
||||||
|
.refentrytitle
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 1pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.title { font-size: 140% }
|
||||||
|
h2.title { font-size: 140% }
|
||||||
|
h3.title { font-size: 130% }
|
||||||
|
h4.title { font-size: 120% }
|
||||||
|
h5.title { font-size: 110% }
|
||||||
|
h6.title { font-size: 100% }
|
||||||
|
|
||||||
|
.section h1
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
font-size: 140%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section h2 { font-size: 140% }
|
||||||
|
.section h3 { font-size: 130% }
|
||||||
|
.section h4 { font-size: 120% }
|
||||||
|
.section h5 { font-size: 110% }
|
||||||
|
.section h6 { font-size: 100% }
|
||||||
|
|
||||||
|
/* Code on titles */
|
||||||
|
h1 tt.computeroutput { font-size: 140% }
|
||||||
|
h2 tt.computeroutput { font-size: 140% }
|
||||||
|
h3 tt.computeroutput { font-size: 130% }
|
||||||
|
h4 tt.computeroutput { font-size: 130% }
|
||||||
|
h5 tt.computeroutput { font-size: 130% }
|
||||||
|
h6 tt.computeroutput { font-size: 130% }
|
||||||
|
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Author
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
h3.author
|
||||||
|
{
|
||||||
|
font-size: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Lists
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
li
|
||||||
|
{
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unordered lists */
|
||||||
|
ul
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ordered lists */
|
||||||
|
ol
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Links
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
a
|
||||||
|
{
|
||||||
|
text-decoration: none; /* no underline */
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover
|
||||||
|
{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Spirit style navigation
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
.spirit-nav
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav a
|
||||||
|
{
|
||||||
|
color: white;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav img
|
||||||
|
{
|
||||||
|
border-width: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Copyright footer
|
||||||
|
=============================================================================*/
|
||||||
|
.copyright-footer
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
font-size: 70%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright-footer p
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Table of contents
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.1pc 1pc 0.1pc 1pc;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boost-toc
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
padding: 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code on toc */
|
||||||
|
.toc .computeroutput { font-size: 120% }
|
||||||
|
|
||||||
|
/* No margin on nested menus */
|
||||||
|
|
||||||
|
.toc dl dl { margin: 0; }
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Tables
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
.table-title,
|
||||||
|
div.table p.title
|
||||||
|
{
|
||||||
|
margin-left: 4%;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.informaltable table,
|
||||||
|
.table table
|
||||||
|
{
|
||||||
|
width: 92%;
|
||||||
|
margin-left: 4%;
|
||||||
|
margin-right: 4%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table,
|
||||||
|
div.table table
|
||||||
|
{
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table Cells */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
padding: 0.5em;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 9pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
padding: 0.5em 0.5em 0.5em 0.5em;
|
||||||
|
border: 1pt solid white;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.simplelist
|
||||||
|
{
|
||||||
|
width: auto !important;
|
||||||
|
margin: 0em !important;
|
||||||
|
padding: 0em !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
table.simplelist td
|
||||||
|
{
|
||||||
|
margin: 0em !important;
|
||||||
|
padding: 0em !important;
|
||||||
|
text-align: left !important;
|
||||||
|
font-size: 9pt !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Suppress margins in tables
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
table th > *:first-child,
|
||||||
|
table td > *:first-child
|
||||||
|
{
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table th > *:last-child,
|
||||||
|
table td > *:last-child
|
||||||
|
{
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Blurbs
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.note,
|
||||||
|
div.tip,
|
||||||
|
div.important,
|
||||||
|
div.caution,
|
||||||
|
div.warning,
|
||||||
|
p.blurb
|
||||||
|
{
|
||||||
|
font-size: 9pt; /* A little bit smaller than the main text */
|
||||||
|
line-height: 1.2;
|
||||||
|
display: block;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.blurb img
|
||||||
|
{
|
||||||
|
padding: 1pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Variable Lists
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.variablelist
|
||||||
|
{
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make the terms in definition lists bold */
|
||||||
|
div.variablelist dl dt,
|
||||||
|
span.term
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist table tbody tr td
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 0em 2em 0em 0em;
|
||||||
|
font-size: 10pt;
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist dl dt
|
||||||
|
{
|
||||||
|
margin-bottom: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist dl dd
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 2em;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist table tbody tr td p,
|
||||||
|
div.variablelist dl dd p
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Misc
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/* Title of books and articles in bibliographies */
|
||||||
|
span.title
|
||||||
|
{
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.underline
|
||||||
|
{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.strikethrough
|
||||||
|
{
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copyright, Legal Notice */
|
||||||
|
div div.legalnotice p
|
||||||
|
{
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Colors
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
@media screen
|
||||||
|
{
|
||||||
|
body {
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Syntax Highlighting */
|
||||||
|
.keyword { color: #0000AA; }
|
||||||
|
.identifier { color: #000000; }
|
||||||
|
.special { color: #707070; }
|
||||||
|
.preprocessor { color: #402080; }
|
||||||
|
.char { color: teal; }
|
||||||
|
.comment { color: #800000; }
|
||||||
|
.string { color: teal; }
|
||||||
|
.number { color: teal; }
|
||||||
|
.white_bkd { background-color: #FFFFFF; }
|
||||||
|
.dk_grey_bkd { background-color: #999999; }
|
||||||
|
|
||||||
|
/* Links */
|
||||||
|
a, a .keyword, a .identifier, a .special, a .preprocessor
|
||||||
|
a .char, a .comment, a .string, a .number
|
||||||
|
{
|
||||||
|
color: #005a9c;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited, a:visited .keyword, a:visited .identifier,
|
||||||
|
a:visited .special, a:visited .preprocessor a:visited .char,
|
||||||
|
a:visited .comment, a:visited .string, a:visited .number
|
||||||
|
{
|
||||||
|
color: #9c5a9c;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
|
||||||
|
h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
|
||||||
|
{
|
||||||
|
text-decoration: none; /* no underline */
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copyright, Legal Notice */
|
||||||
|
.copyright
|
||||||
|
{
|
||||||
|
color: #666666;
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
div div.legalnotice p
|
||||||
|
{
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listing */
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
border: 0px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blurbs */
|
||||||
|
div.note,
|
||||||
|
div.tip,
|
||||||
|
div.important,
|
||||||
|
div.caution,
|
||||||
|
div.warning,
|
||||||
|
p.blurb
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table of contents */
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
background-color: #F0F0F0;
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright-footer
|
||||||
|
{
|
||||||
|
color: #8F8F8F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
span.highlight
|
||||||
|
{
|
||||||
|
color: #00A000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print
|
||||||
|
{
|
||||||
|
/* Links */
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited
|
||||||
|
{
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listing */
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
border: 0px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table of contents */
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.informaltable table,
|
||||||
|
.table table
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.simplelist tr td
|
||||||
|
{
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
span.highlight
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Images
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
span.inlinemediaobject img
|
||||||
|
{
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Super and Subscript: style so that line spacing isn't effected, see
|
||||||
|
http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
sup,
|
||||||
|
sub {
|
||||||
|
height: 0;
|
||||||
|
line-height: 1;
|
||||||
|
vertical-align: baseline;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For internet explorer: */
|
||||||
|
|
||||||
|
* html sup,
|
||||||
|
* html sub {
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
bottom: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
top: .5ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Indexes: pretty much the same as the TOC.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
.index
|
||||||
|
{
|
||||||
|
font-size: 80%;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
margin-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index ul
|
||||||
|
{
|
||||||
|
padding-left: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index p
|
||||||
|
{
|
||||||
|
padding: 2px;
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index-entry-level-0
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index em
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Alignment and coloring use 'role' feature, available from Quickbook 1.6 up.
|
||||||
|
Added from Niall Douglas for role color and alignment.
|
||||||
|
http://article.gmane.org/gmane.comp.lib.boost.devel/243318
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */
|
||||||
|
span.aligncenter
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: center;
|
||||||
|
}
|
||||||
|
span.alignright
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: right;
|
||||||
|
}
|
||||||
|
/* alignleft is the default. */
|
||||||
|
span.alignleft
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* alignjustify stretches the word spacing so that each line has equal width
|
||||||
|
within a chosen fraction of page width (here arbitrarily 20%).
|
||||||
|
*Not* useful inside table items as the column width remains the total string width.
|
||||||
|
Nor very useful, except to temporarily restrict the width.
|
||||||
|
*/
|
||||||
|
span.alignjustify
|
||||||
|
{
|
||||||
|
display: inline-block; width: 20%; text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Text colors.
|
||||||
|
Names at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords.
|
||||||
|
Quickbook Usage: [role red Some red text]
|
||||||
|
|
||||||
|
*/
|
||||||
|
span.red { inline-block; color: red; }
|
||||||
|
span.green { color: green; }
|
||||||
|
span.lime { color: #00FF00; }
|
||||||
|
span.blue { color: blue; }
|
||||||
|
span.navy { color: navy; }
|
||||||
|
span.yellow { color: yellow; }
|
||||||
|
span.magenta { color: magenta; }
|
||||||
|
span.indigo { color: #4B0082; }
|
||||||
|
span.cyan { color: cyan; }
|
||||||
|
span.purple { color: purple; }
|
||||||
|
span.gold { color: gold; }
|
||||||
|
span.silver { color: silver; } /* lighter gray */
|
||||||
|
span.gray { color: #808080; } /* light gray */
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
||||||
|
|
||||||
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
|
||||||
|
|
||||||
<title>Building an Extension Module</title>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<h1><img width="277" height="86" align="center" src=
|
|
||||||
"../../../c++boost.gif" alt="c++boost.gif (8819 bytes)">Building an
|
|
||||||
Extension Module</h1>
|
|
||||||
|
|
||||||
<h2>Building Boost.Python</h2>
|
|
||||||
|
|
||||||
<p>Every Boost.Python extension module must be linked with the
|
|
||||||
<code>boost_python</code> shared library. To build
|
|
||||||
<code>boost_python</code>, use <a
|
|
||||||
href="../../../tools/build/index.html">Boost.Build</a> in the
|
|
||||||
usual way from the <code>libs/python/build</code> subdirectory
|
|
||||||
of your boost installation (if you have already built boost from
|
|
||||||
the top level this may have no effect, since the work is already
|
|
||||||
done).
|
|
||||||
|
|
||||||
<h3>Configuration</h3>
|
|
||||||
You may need to configure the following variables to point Boost.Build at your Python installation:
|
|
||||||
|
|
||||||
<table border="1">
|
|
||||||
<tr><th>Variable Name <th>Semantics <th>Default <th>Notes
|
|
||||||
<tr>
|
|
||||||
<td><code>PYTHON_ROOT</code>
|
|
||||||
<td>The root directory of your Python installation
|
|
||||||
<td>Windows: <code>c:/tools/python</code>
|
|
||||||
Unix: <code>/usr/local</code>
|
|
||||||
<td>On Unix, this is the <code>--with-prefix=</code> directory
|
|
||||||
used to configure Python
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>PYTHON_VERSION</code>
|
|
||||||
<td>The The 2-part python Major.Minor version number
|
|
||||||
<td>Windows: <code>2.1</code>
|
|
||||||
Unix: <code>1.5</code>
|
|
||||||
<td>Be sure not to include a third number, e.g. <b>not</b>
|
|
||||||
"<code>2.2.1</code>", even if that's the version you
|
|
||||||
have.
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>PYTHON_INCLUDES</code>
|
|
||||||
<td>path to Python <code>#include</code> directories
|
|
||||||
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>PYTHON_LIB_PATH</code>
|
|
||||||
<td>path to Python library object.
|
|
||||||
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>PYTHON_STDLIB_PATH</code>
|
|
||||||
<td>path to Python standard library modules
|
|
||||||
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>CYGWIN_ROOT</code>
|
|
||||||
<td>path to the user's Cygwin installation
|
|
||||||
<td>
|
|
||||||
<td><a href="http://www.cygwin.com">Cygwin</a> only. This and the following two settings are
|
|
||||||
useful when building with multiple toolsets on Windows, since
|
|
||||||
Cygwin requires a different build of Python.
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>GCC_PYTHON_ROOT</code>
|
|
||||||
<td>path to the user's Cygwin Python installation
|
|
||||||
<td><code>$(CYGWIN_ROOT)/usr/local</code>
|
|
||||||
<td><a href="http://www.cygwin.com">Cygwin</a> only
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td><code>GCC_DEBUG_PYTHON_ROOT</code>
|
|
||||||
<td>path to the user's Cygwin <code><a
|
|
||||||
href="#variants">pydebug</a></code> build
|
|
||||||
<td><code>$(CYGWIN_ROOT)/usr/local/pydebug</code>
|
|
||||||
<td><a href="http://www.cygwin.com">Cygwin</a> only
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<h3>Results</h3>
|
|
||||||
<p>The build process will create a
|
|
||||||
<code>libs/python/build/bin-stage</code> subdirectory of the
|
|
||||||
boost root (or of <code>$(ALL_LOCATE_TARGET)</code>,
|
|
||||||
if you have set that variable), containing the built
|
|
||||||
libraries. The libraries are actually built to unique
|
|
||||||
directories for each toolset and variant elsewhere in the
|
|
||||||
filesystem, and copied to the
|
|
||||||
<code>bin-stage</code> directory as a convenience, so if you
|
|
||||||
build with multiple toolsets at once, the product of later
|
|
||||||
toolsets will overwrite that of earlier toolsets in
|
|
||||||
<code>bin-stage</code>.
|
|
||||||
|
|
||||||
<h3>Testing</h3>
|
|
||||||
<p>To build and test Boost.Python from within the
|
|
||||||
<code>libs/python/build</code> directory, invoke
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
bjam -sTOOLS=<i><a href="../../../tools/build/index.html#Tools">toolset</a></i> test
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
This will
|
|
||||||
update all of the Boost.Python v1 test and example targets. The tests
|
|
||||||
are relatively quiet by default. To get more-verbose output, you might try
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
bjam -sTOOLS=<i><a href="../../../tools/build/index.html#Tools">toolset</a></i> -sPYTHON_TEST_ARGS=-v test
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
which will print each test's Python code with the expected output as
|
|
||||||
it passes.
|
|
||||||
|
|
||||||
<h2>Building your Extension Module</h2>
|
|
||||||
|
|
||||||
Though there are other approaches, the easiest way to build an
|
|
||||||
extension module using Boost.Python is with Boost.Build. Until
|
|
||||||
Boost.Build v2 is released, cross-project build dependencies are
|
|
||||||
not supported, so it works most smoothly if you add a new
|
|
||||||
subproject to your boost installation. The
|
|
||||||
<code>libs/python/example</code> subdirectory of your boost
|
|
||||||
installation contains a minimal example (along with many extra
|
|
||||||
sources). To copy the example subproject:
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>Create a new subdirectory in, <code>libs/python</code>, say
|
|
||||||
<code>libs/python/my_project</code>.
|
|
||||||
|
|
||||||
<li>Copy <code><a
|
|
||||||
href="../example/Jamfile">libs/python/example/Jamfile</a></code>
|
|
||||||
to your new directory.
|
|
||||||
|
|
||||||
<li>Edit the Jamfile as appropriate for your project. You'll
|
|
||||||
want to change the "<code>subproject</code>" rule
|
|
||||||
invocation at the top, and the names of some of the source files
|
|
||||||
and/or targets.
|
|
||||||
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
If you can't modify or copy your boost installation, the
|
|
||||||
alternative is to create your own Boost.Build project. A similar
|
|
||||||
example you can use as a starting point is available in <code><a
|
|
||||||
href="../example/project.zip">this archive</a></code>. You'll
|
|
||||||
need to edit the Jamfile and Jamrules files, depending on the
|
|
||||||
relative location of your Boost installation and the new
|
|
||||||
project. Note that automatic testing of extension modules is not
|
|
||||||
available in this configuration.
|
|
||||||
|
|
||||||
<h2><a name="variants">Build Variants</a></h2>
|
|
||||||
|
|
||||||
Three <a
|
|
||||||
href="../../../tools/build/build_system.htm#variants">variant</a>
|
|
||||||
configurations of all python-related targets are supported, and
|
|
||||||
can be selected by setting the <code><a
|
|
||||||
href="../../../tools/build/build_system.htm#user_globals">BUILD</a></code>
|
|
||||||
variable:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><code>release</code> (optimization, <tt>-DNDEBUG</tt>)
|
|
||||||
|
|
||||||
<li><code>debug</code> (no optimization <tt>-D_DEBUG</tt>)
|
|
||||||
|
|
||||||
<li><code>debug-python</code> (no optimization, <tt>-D_DEBUG
|
|
||||||
-DBOOST_DEBUG_PYTHON</tt>)
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>The first two variants of the <code>boost_python</code>
|
|
||||||
library are built by default, and are compatible with the
|
|
||||||
default Python distribution. The <code>debug-python</code>
|
|
||||||
variant corresponds to a specially-built debugging version of
|
|
||||||
Python. On Unix platforms, this python is built by adding
|
|
||||||
<code>--with-pydebug</code> when configuring the Python
|
|
||||||
build. On Windows, the debugging version of Python is generated
|
|
||||||
by the "Win32 Debug" target of the
|
|
||||||
<code>PCBuild.dsw</code> Visual C++ 6.0 project in the
|
|
||||||
<code>PCBuild</code> subdirectory of your Python distribution.
|
|
||||||
|
|
||||||
Extension modules built with Python debugging enabled are <b>not
|
|
||||||
link-compatible</b> with a non-debug build of Python. Since few
|
|
||||||
people actually have a debug build of Python (it doesn't come
|
|
||||||
with the standard distribution), the normal
|
|
||||||
<code>debug</code> variant builds modules which are compatible
|
|
||||||
with ordinary Python.
|
|
||||||
|
|
||||||
|
|
||||||
<p>On many windows compilers, when extension modules are built
|
|
||||||
with
|
|
||||||
<tt>-D_DEBUG</tt>, Python defaults to <i>force</i> linking with a
|
|
||||||
special debugging version of the Python DLL. Since this debug DLL
|
|
||||||
isn't supplied with the default Python installation for Windows,
|
|
||||||
Boost.Python uses <tt><a href=
|
|
||||||
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a></tt>
|
|
||||||
to temporarily undefine <tt>_DEBUG</tt> when <tt>Python.h</tt> is
|
|
||||||
<tt>#include</tt>d - unless <code>BOOST_DEBUG_PYTHON</code> is defined.
|
|
||||||
|
|
||||||
<p>If you want the extra runtime checks available with the
|
|
||||||
debugging version of the library, <tt>#define
|
|
||||||
BOOST_DEBUG_PYTHON</tt> to re-enable python debuggin, and link
|
|
||||||
with the <code>debug-python</code> variant of
|
|
||||||
<tt>boost_python</tt>.
|
|
||||||
|
|
||||||
<p>If you do not <tt>#define BOOST_DEBUG_PYTHON</tt>, be sure that
|
|
||||||
any source files in your extension module <tt>#include <<a href=
|
|
||||||
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a>></tt>
|
|
||||||
instead of the usual <tt>Python.h</tt>, or you will have link
|
|
||||||
incompatibilities.<br>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
Next: <a href="enums.html">Wrapping Enums</a> Previous: <a href=
|
|
||||||
"under-the-hood.html">A Peek Under the Hood</a> Up: <a href=
|
|
||||||
"index.html">Top</a>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<p>© Copyright David Abrahams 2002. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided ``as is'' without
|
|
||||||
express or implied warranty, and with no claim as to its suitability for
|
|
||||||
any purpose.
|
|
||||||
|
|
||||||
<p>Updated: May 15, 2002 (David Abrahams)
|
|
||||||
</div>
|
|
||||||
566
doc/building.qbk
Normal file
@@ -0,0 +1,566 @@
|
|||||||
|
[chapter Building and Testing
|
||||||
|
[quickbook 1.7]
|
||||||
|
[authors [Abrahams, David]]
|
||||||
|
[copyright 2002 - 2015 David Abrahams, Stefan Seefeld]
|
||||||
|
[id building]
|
||||||
|
]
|
||||||
|
[/ Copyright David Abrahams 2006. 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 Requirements]
|
||||||
|
|
||||||
|
Boost.Python requires [@http://www.python.org/2.2 Python 2.2]
|
||||||
|
[footnote Note that although we tested earlier versions of Boost.Python
|
||||||
|
with Python 2.2, and we don't *think* we've done anything to break
|
||||||
|
compatibility, this release of Boost.Python may not have been tested
|
||||||
|
with versions of Python earlier than 2.4, so we're not 100% sure that
|
||||||
|
python 2.2 and 2.3 are supported.] *or* [@http://www.python.org newer].
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Background]
|
||||||
|
|
||||||
|
There are two basic models for combining C++ and Python:
|
||||||
|
|
||||||
|
* [@http://www.python.org/doc/current/ext/intro.html extending],
|
||||||
|
in which the end-user launches the Python interpreter
|
||||||
|
executable and imports Python “extension modules” written in C++.
|
||||||
|
Think of taking a library written in C++ and giving it a Python
|
||||||
|
interface so Python programmers can use it. From Python, these
|
||||||
|
modules look just like regular Python modules.
|
||||||
|
|
||||||
|
* [@http://www.python.org/doc/current/ext/embedding.html embedding],
|
||||||
|
in which the end-user launches a program written
|
||||||
|
in C++ that in turn invokes the Python interpreter as a library
|
||||||
|
subroutine. Think of adding scriptability to an existing
|
||||||
|
application.
|
||||||
|
|
||||||
|
The key distinction between extending and embedding is the location
|
||||||
|
of the C++ `main()` function: in the Python interpreter executable,
|
||||||
|
or in some other program, respectively. Note that even when
|
||||||
|
embedding Python in another program, [@http://www.python.org/doc/current/ext/extending-with-embedding.html extension modules are often
|
||||||
|
the best way to make C/C++ functionality accessible to Python
|
||||||
|
code], so the use of extension modules is really at the heart of
|
||||||
|
both models.
|
||||||
|
|
||||||
|
Except in rare cases, extension modules are built as
|
||||||
|
dynamically-loaded libraries with a single entry point, which means
|
||||||
|
you can change them without rebuilding either the other extension
|
||||||
|
modules or the executable containing `main()`.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section No-Install Quickstart]
|
||||||
|
|
||||||
|
There is no need to “install Boost” in order to get started using
|
||||||
|
Boost.Python. These instructions use _bb_ projects,
|
||||||
|
which will build those binaries as soon as they're needed. Your
|
||||||
|
first tests may take a little longer while you wait for
|
||||||
|
Boost.Python to build, but doing things this way will save you from
|
||||||
|
worrying about build intricacies like which library binaries to use
|
||||||
|
for a specific compiler configuration and figuring out the right
|
||||||
|
compiler options to use yourself.
|
||||||
|
|
||||||
|
[note Of course it's possible to use other build systems to
|
||||||
|
build Boost.Python and its extensions, but they are not
|
||||||
|
officially supported by Boost. Moreover *99% of all “I can't
|
||||||
|
build Boost.Python” problems come from trying to use another
|
||||||
|
build system* without first following these instructions.
|
||||||
|
|
||||||
|
If you want to use another system anyway, we suggest that you
|
||||||
|
follow these instructions, and then invoke `bjam` with the
|
||||||
|
|
||||||
|
`-a -o`\ /filename/
|
||||||
|
|
||||||
|
options to dump the build commands it executes to a file, so
|
||||||
|
you can see what your alternate build system needs to do.]
|
||||||
|
|
||||||
|
[section Basic Procedure]
|
||||||
|
|
||||||
|
1. Get Boost; see sections 1 and 2 of the _gsg_.
|
||||||
|
|
||||||
|
2. Get the `bjam` build driver. See section 5 of the _gsg_.
|
||||||
|
|
||||||
|
3. cd into the `example/quickstart/` directory of your
|
||||||
|
Boost.Python installation, which contains a small example project.
|
||||||
|
|
||||||
|
4. Invoke `bjam`. Replace the “\ `stage`\ “ argument from the
|
||||||
|
example invocation from section 5 of the _gsg_ with “\ `test`\ ,“ to
|
||||||
|
build all the test targets. Also add the argument “\ `--verbose-test`\ ”
|
||||||
|
to see the output generated by the tests when they are run.
|
||||||
|
On Windows, your `bjam` invocation might look something like:
|
||||||
|
``
|
||||||
|
C:\\...\\quickstart> bjam toolset=msvc --verbose-test test
|
||||||
|
``
|
||||||
|
and on Unix variants, perhaps,
|
||||||
|
``
|
||||||
|
.../quickstart$ bjam toolset=gcc --verbose-test test
|
||||||
|
``
|
||||||
|
|
||||||
|
[note For the sake of concision, the rest of this guide will use
|
||||||
|
unix-style forward slashes in pathnames instead of the
|
||||||
|
backslashes with which Windows users may be more familiar. The forward
|
||||||
|
slashes should work everywhere except in
|
||||||
|
[@http://www.boost.org/more/getting_started/windows.html#command-prompt
|
||||||
|
Command Prompt] windows, where you should use backslashes.]
|
||||||
|
|
||||||
|
If you followed this procedure successfully, you will have built an
|
||||||
|
extension module called `extending` and tested it by running a
|
||||||
|
Python script called `test_extending.py`. You will also have
|
||||||
|
built and run a simple application called `embedding` that embeds
|
||||||
|
python.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section In Case of Trouble]
|
||||||
|
|
||||||
|
If you're seeing lots of compiler and/or linker error messages,
|
||||||
|
it's probably because Boost.Build is having trouble finding your
|
||||||
|
Python installation. You might want to pass the
|
||||||
|
`--debug-configuration` option to `bjam` the first few times
|
||||||
|
you invoke it, to make sure that Boost.Build is correctly locating
|
||||||
|
all the parts of your Python installation. If it isn't, consider
|
||||||
|
[link building.configuring_boost_build Configuring Boost.Build]
|
||||||
|
as detailed below.
|
||||||
|
|
||||||
|
If you're still having trouble, Someone on one of the following
|
||||||
|
mailing lists may be able to help:
|
||||||
|
|
||||||
|
* The _bb_list_ for issues related to Boost.Build
|
||||||
|
* The _bp_list_ for issues specifically related to Boost.Python
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section In Case Everything Seemed to Work]
|
||||||
|
|
||||||
|
Rejoice! If you're new to Boost.Python, at this point it might be
|
||||||
|
a good idea to ignore build issues for a while and concentrate on
|
||||||
|
learning the library by going through the _tutorial_ and perhaps
|
||||||
|
some of the _reference_, trying out what you've
|
||||||
|
learned about the API by modifying the quickstart project.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Modifying the Example Project]
|
||||||
|
|
||||||
|
If you're content to keep your extension module forever in one
|
||||||
|
source file called `extending.cpp`, inside your Boost.Python
|
||||||
|
distribution, and import it forever as `extending`, then you can
|
||||||
|
stop here. However, it's likely that you will want to make a few
|
||||||
|
changes. There are a few things you can do without having to learn
|
||||||
|
_bb_ in depth.
|
||||||
|
|
||||||
|
The project you just built is specified in two files in the current
|
||||||
|
directory: `boost-build.jam`, which tells `bjam` where it can
|
||||||
|
find the interpreted code of the Boost build system, and
|
||||||
|
`Jamroot`, which describes the targets you just built. These
|
||||||
|
files are heavily commented, so they should be easy to modify.
|
||||||
|
Take care, however, to preserve whitespace. Punctuation such as
|
||||||
|
`;` will not be recognized as intended by `bjam` if it is not
|
||||||
|
surrounded by whitespace.
|
||||||
|
|
||||||
|
[section Relocate the Project]
|
||||||
|
|
||||||
|
You'll probably want to copy this project elsewhere so you can
|
||||||
|
change it without modifying your Boost distribution. To do that,
|
||||||
|
simply
|
||||||
|
|
||||||
|
a. copy the entire `example/quickstart/` directory
|
||||||
|
into a new directory.
|
||||||
|
|
||||||
|
b. In the new copies of `boost-build.jam` and `Jamroot`, locate
|
||||||
|
the relative path near the top of the file that is clearly
|
||||||
|
marked by a comment, and edit that path so that it refers to the
|
||||||
|
same directory your Boost distribution as it referred to when
|
||||||
|
the file was in its original location in the
|
||||||
|
`example/quickstart/` directory.
|
||||||
|
|
||||||
|
For example, if you moved the project from
|
||||||
|
`/home/dave/boost_1_34_0/libs/python/example/quickstart` to
|
||||||
|
`/home/dave/my-project`, you could change the first path in
|
||||||
|
`boost-build.jam` from
|
||||||
|
``
|
||||||
|
../../../../tools/build/src
|
||||||
|
``
|
||||||
|
to
|
||||||
|
``
|
||||||
|
/home/dave/boost_1_34_0/tools/build/src
|
||||||
|
``
|
||||||
|
and change the first path in `Jamroot` from
|
||||||
|
``
|
||||||
|
../../../..
|
||||||
|
``
|
||||||
|
to
|
||||||
|
``
|
||||||
|
/home/dave/boost_1_34_0
|
||||||
|
``
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Add New or Change Names of Existing Source Files]
|
||||||
|
|
||||||
|
The names of additional source files involved in building your
|
||||||
|
extension module or embedding application can be listed in
|
||||||
|
`Jamroot` right alongside `extending.cpp` or `embedding.cpp`
|
||||||
|
respectively. Just be sure to leave whitespace around each
|
||||||
|
filename:
|
||||||
|
``
|
||||||
|
… file1.cpp file2.cpp file3.cpp …
|
||||||
|
``
|
||||||
|
Naturally, if you want to change the name of a source file you can
|
||||||
|
tell Boost.Build about it by editing the name in `Jamroot`.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Change the Name of your Extension Module]
|
||||||
|
|
||||||
|
The name of the extension module is determined by two things:
|
||||||
|
|
||||||
|
# the name in `Jamroot` immediately following `python-extension`, and
|
||||||
|
# the name passed to `BOOST_PYTHON_MODULE` in `extending.cpp`.
|
||||||
|
|
||||||
|
To change the name of the extension module from `extending` to
|
||||||
|
`hello`, you'd edit `Jamroot`, changing
|
||||||
|
``
|
||||||
|
python-extension extending : extending.cpp ;
|
||||||
|
``
|
||||||
|
to
|
||||||
|
``
|
||||||
|
python-extension hello : extending.cpp ;
|
||||||
|
``
|
||||||
|
and you'd edit extending.cpp, changing
|
||||||
|
|
||||||
|
``
|
||||||
|
BOOST_PYTHON_MODULE(extending)
|
||||||
|
``
|
||||||
|
to
|
||||||
|
``
|
||||||
|
BOOST_PYTHON_MODULE(hello)
|
||||||
|
``
|
||||||
|
[endsect]
|
||||||
|
[endsect]
|
||||||
|
[endsect]
|
||||||
|
[section Installing Boost.Python on your System]
|
||||||
|
|
||||||
|
Since Boost.Python is a separately-compiled (as opposed to
|
||||||
|
`header-only`) library, its user relies on the services of a
|
||||||
|
Boost.Python library binary.
|
||||||
|
|
||||||
|
If you need a regular installation of the Boost.Python library
|
||||||
|
binaries on your system, the _gsg_ will
|
||||||
|
walk you through the steps of creating one. If building binaries
|
||||||
|
from source, you might want to supply the `--with-python`
|
||||||
|
argument to `bjam` (or the `--with-libraries=python` argument
|
||||||
|
to `configure`), so only the Boost.Python binary will be built,
|
||||||
|
rather than all the Boost binaries.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Configuring Boost.Build]
|
||||||
|
|
||||||
|
As described in the [@http://www.boost.org/build/doc/html/bbv2/overview/configuration.html Boost.Build Reference Manual], a file called
|
||||||
|
`user-config.jam` in your home directory is used to
|
||||||
|
specify the tools and libraries available to the build system. You
|
||||||
|
may need to create or edit `user-config.jam` to tell Boost.Build
|
||||||
|
how to invoke Python, `#include` its headers, and link with its
|
||||||
|
libraries.
|
||||||
|
|
||||||
|
[note If you are using a unix-variant OS and you ran Boost's
|
||||||
|
`configure` script, it may have generated a
|
||||||
|
`user-config.jam` for you. [footnote `configure` overwrites the existing
|
||||||
|
`user-config.jam` in your home directory (if any) after making a backup of
|
||||||
|
the old version.] If your `configure`\ /\ `make` sequence was successful and
|
||||||
|
Boost.Python binaries were built, your `user-config.jam` file is probably already
|
||||||
|
correct.]
|
||||||
|
|
||||||
|
If you have one fairly “standard” python installation for your
|
||||||
|
platform, you might not need to do anything special to describe it. If
|
||||||
|
you haven't configured python in `user-config.jam` (and you don't
|
||||||
|
specify `--without-python` on the Boost.Build command line),
|
||||||
|
Boost.Build will automatically execute the equivalent of
|
||||||
|
|
||||||
|
``
|
||||||
|
import toolset : using ;
|
||||||
|
using python ;
|
||||||
|
``
|
||||||
|
which automatically looks for Python in the most likely places.
|
||||||
|
However, that only happens when using the Boost.Python project file
|
||||||
|
(e.g. when referred to by another project as in the quickstart
|
||||||
|
method). If instead you are linking against separately-compiled
|
||||||
|
Boost.Python binaries, you should set up a `user-config.jam` file
|
||||||
|
with at least the minimal incantation above.
|
||||||
|
|
||||||
|
[section Python Configuration Parameters]
|
||||||
|
|
||||||
|
If you have several versions of Python installed, or Python is
|
||||||
|
installed in an unusual way, you may want to supply any or all of
|
||||||
|
the following optional parameters to `using python`.
|
||||||
|
|
||||||
|
[variablelist
|
||||||
|
[[version]
|
||||||
|
|
||||||
|
[the version of Python to use. Should be in Major.Minor
|
||||||
|
format, for example, `2.3`. Do not include the subminor
|
||||||
|
version (i.e. *not* `2.5.1`). If you have multiple Python
|
||||||
|
versions installed, the version will usually be the only
|
||||||
|
configuration argument required.]]
|
||||||
|
|
||||||
|
[[cmd-or-prefix]
|
||||||
|
|
||||||
|
[preferably, a command that invokes a Python interpreter.
|
||||||
|
Alternatively, the installation prefix for Python libraries and
|
||||||
|
header files. Only use the alternative formulation if there is
|
||||||
|
no appropriate Python executable available.]]
|
||||||
|
|
||||||
|
[[*includes*]
|
||||||
|
|
||||||
|
[the `#include` paths for Python headers. Normally the correct
|
||||||
|
path(s) will be automatically deduced from `version` and/or
|
||||||
|
`cmd-or-prefix`.]]
|
||||||
|
|
||||||
|
[[*libraries*]
|
||||||
|
|
||||||
|
[the path to Python library binaries. On MacOS/Darwin,
|
||||||
|
you can also pass the path of the Python framework. Normally the
|
||||||
|
correct path(s) will be automatically deduced from `version`
|
||||||
|
and/or `cmd-or-prefix`.]]
|
||||||
|
|
||||||
|
[[*condition*]
|
||||||
|
|
||||||
|
[if specified, should be a set of Boost.Build
|
||||||
|
properties that are matched against the build configuration when
|
||||||
|
Boost.Build selects a Python configuration to use. See examples
|
||||||
|
below for details.]]
|
||||||
|
|
||||||
|
[[*extension-suffix*]
|
||||||
|
|
||||||
|
[A string to append to the name of extension
|
||||||
|
modules before the true filename extension. You almost certainly
|
||||||
|
don't need to use this. Usually this suffix is only used when
|
||||||
|
targeting a Windows debug build of Python, and will be set
|
||||||
|
automatically for you based on the value of the
|
||||||
|
[link building.python_debugging_builds <python-debugging>] feature.
|
||||||
|
However, at least one Linux distribution (Ubuntu Feisty Fawn) has
|
||||||
|
a specially configured [@https://wiki.ubuntu.com/PyDbgBuilds <python-dbg>]
|
||||||
|
package that claims to use such a suffix.]]
|
||||||
|
]
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Examples]
|
||||||
|
|
||||||
|
Note that in the examples below, case and *especially whitespace* are
|
||||||
|
significant.
|
||||||
|
|
||||||
|
* If you have both python 2.5 and python 2.4 installed,
|
||||||
|
`user-config.jam` might contain
|
||||||
|
|
||||||
|
``
|
||||||
|
using python : 2.5 ; # Make both versions of Python available
|
||||||
|
using python : 2.4 ; # To build with python 2.4, add python=2.4
|
||||||
|
# to your command line.
|
||||||
|
``
|
||||||
|
The first version configured (2.5) becomes the default. To build
|
||||||
|
against python 2.4, add `python=2.4` to the `bjam` command line.
|
||||||
|
|
||||||
|
* If you have python installed in an unusual location, you might
|
||||||
|
supply the path to the interpreter in the `cmd-or-prefix`
|
||||||
|
parameter:
|
||||||
|
|
||||||
|
``
|
||||||
|
using python : : /usr/local/python-2.6-beta/bin/python ;
|
||||||
|
``
|
||||||
|
|
||||||
|
* If you have a separate build of Python for use with a particular
|
||||||
|
toolset, you might supply that toolset in the `condition`
|
||||||
|
parameter:
|
||||||
|
|
||||||
|
``
|
||||||
|
using python ; # use for most toolsets
|
||||||
|
|
||||||
|
# Use with Intel C++ toolset
|
||||||
|
using python
|
||||||
|
: # version
|
||||||
|
: c:\\Devel\\Python-2.5-IntelBuild\\PCBuild\\python # cmd-or-prefix
|
||||||
|
: # includes
|
||||||
|
: # libraries
|
||||||
|
: <toolset>intel # condition
|
||||||
|
;
|
||||||
|
``
|
||||||
|
|
||||||
|
* If you have downloaded the Python sources and built both the
|
||||||
|
normal and the [link building.python_debugging_builds "python debugging"]
|
||||||
|
builds from source on Windows, you might see:
|
||||||
|
|
||||||
|
``
|
||||||
|
using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python ;
|
||||||
|
using python : 2.5 : C:\\src\\Python-2.5\\PCBuild\\python_d
|
||||||
|
: # includes
|
||||||
|
: # libs
|
||||||
|
: <python-debugging>on ;
|
||||||
|
``
|
||||||
|
* You can set up your user-config.jam so a bjam built under Windows
|
||||||
|
can build/test both Windows and Cygwin_ python extensions. Just pass
|
||||||
|
`<target-os>cygwin` in the `condition` parameter
|
||||||
|
for the cygwin python installation:
|
||||||
|
|
||||||
|
``
|
||||||
|
# windows installation
|
||||||
|
using python ;
|
||||||
|
|
||||||
|
# cygwin installation
|
||||||
|
using python : : c:\\cygwin\\bin\\python2.5 : : : <target-os>cygwin ;
|
||||||
|
``
|
||||||
|
when you put target-os=cygwin in your build request, it should build
|
||||||
|
with the cygwin version of python: [#flavor]_
|
||||||
|
|
||||||
|
``
|
||||||
|
bjam target-os=cygwin toolset=gcc
|
||||||
|
``
|
||||||
|
This is supposed to work the other way, too (targeting windows
|
||||||
|
python with a [@http://cygwin.com Cygwin] bjam) but it seems as though the support in
|
||||||
|
Boost.Build's toolsets for building that way is broken at the
|
||||||
|
time of this writing.
|
||||||
|
|
||||||
|
* Note that because of [@http://zigzag.cs.msu.su/boost.build/wiki/AlternativeSelection
|
||||||
|
the way Boost.Build currently selects target alternatives], you might have be very
|
||||||
|
explicit in your build requests. For example, given:
|
||||||
|
|
||||||
|
``
|
||||||
|
using python : 2.5 ; # a regular windows build
|
||||||
|
using python : 2.4 : : : : <target-os>cygwin ;
|
||||||
|
``
|
||||||
|
building with
|
||||||
|
``
|
||||||
|
bjam target-os=cygwin
|
||||||
|
``
|
||||||
|
|
||||||
|
will yield an error. Instead, you'll need to write
|
||||||
|
|
||||||
|
``
|
||||||
|
bjam target-os=cygwin/python=2.4
|
||||||
|
``
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[endsect]
|
||||||
|
[section Choosing a Boost.Python Library Binary]
|
||||||
|
|
||||||
|
If—instead of letting Boost.Build construct and link with the right
|
||||||
|
libraries automatically—you choose to use a pre-built Boost.Python
|
||||||
|
library, you'll need to think about which one to link with. The
|
||||||
|
Boost.Python binary comes in both static and dynamic flavors. Take
|
||||||
|
care to choose the right flavor for your application. [footnote
|
||||||
|
Information about how to identify the static and dynamic builds of Boost.Python on
|
||||||
|
[@http://boost.org/more/getting_started/windows.html#library-naming Windows] /
|
||||||
|
[@http://boost.org/more/getting_started/unix-variants.html#library-naming Unix variants]]
|
||||||
|
|
||||||
|
[section The Dynamic Binary]
|
||||||
|
|
||||||
|
The dynamic library is the safest and most-versatile choice:
|
||||||
|
|
||||||
|
* A single copy of the library code is used by all extension
|
||||||
|
modules built with a given toolset. [footnote Because of the way most \*nix platforms
|
||||||
|
share symbols among dynamically-loaded objects, I'm not certain
|
||||||
|
that extension modules built with different compiler toolsets
|
||||||
|
will always use different copies of the Boost.Python library
|
||||||
|
when loaded into the same Python instance. Not using different
|
||||||
|
libraries could be a good thing if the compilers have compatible
|
||||||
|
ABIs, because extension modules built with the two libraries
|
||||||
|
would be interoperable. Otherwise, it could spell disaster,
|
||||||
|
since an extension module and the Boost.Python library would
|
||||||
|
have different ideas of such things as class layout. I would
|
||||||
|
appreciate someone doing the experiment to find out what
|
||||||
|
happens.]
|
||||||
|
|
||||||
|
* The library contains a type conversion registry. Because one
|
||||||
|
registry is shared among all extension modules, instances of a
|
||||||
|
class exposed to Python in one dynamically-loaded extension
|
||||||
|
module can be passed to functions exposed in another such module.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section The Static Binary]
|
||||||
|
|
||||||
|
It might be appropriate to use the static Boost.Python library in
|
||||||
|
any of the following cases:
|
||||||
|
|
||||||
|
* You are _extending_ python and the types exposed in your
|
||||||
|
dynamically-loaded extension module don't need to be used by any
|
||||||
|
other Boost.Python extension modules, and you don't care if the
|
||||||
|
core library code is duplicated among them.
|
||||||
|
|
||||||
|
* You are _embedding_ python in your application and either:
|
||||||
|
|
||||||
|
* You are targeting a Unix variant OS other than MacOS or AIX,
|
||||||
|
where the dynamically-loaded extension modules can “see” the
|
||||||
|
Boost.Python library symbols that are part of the executable.
|
||||||
|
|
||||||
|
* Or, you have statically linked some Boost.Python extension
|
||||||
|
modules into your application and you don't care if any
|
||||||
|
dynamically-loaded Boost.Python extension modules are able to
|
||||||
|
use the types exposed by your statically-linked extension
|
||||||
|
modules (and vice-versa).
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[endsect]
|
||||||
|
[section `#include` Issues]
|
||||||
|
|
||||||
|
1. If you should ever have occasion to `#include "python.h"`
|
||||||
|
directly in a translation unit of a program using Boost.Python,
|
||||||
|
use `#include "boost/python/detail/wrap_python.hpp"` instead.
|
||||||
|
It handles several issues necessary for use with Boost.Python,
|
||||||
|
one of which is mentioned in the next section.
|
||||||
|
|
||||||
|
2. Be sure not to `#include` any system headers before
|
||||||
|
`wrap_python.hpp`. This restriction is actually imposed by
|
||||||
|
Python, or more properly, by Python's interaction with your
|
||||||
|
operating system. See
|
||||||
|
[@http://docs.python.org/ext/simpleExample.html] for details.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Python Debugging Builds]
|
||||||
|
|
||||||
|
Python can be built in a special “python debugging” configuration
|
||||||
|
that adds extra checks and instrumentation that can be very useful
|
||||||
|
for developers of extension modules. The data structures used by
|
||||||
|
the debugging configuration contain additional members, so *a
|
||||||
|
Python executable built with python debugging enabled cannot be
|
||||||
|
used with an extension module or library compiled without it, and
|
||||||
|
vice-versa.*
|
||||||
|
|
||||||
|
Since pre-built “python debugging” versions of the Python
|
||||||
|
executable and libraries are not supplied with most distributions
|
||||||
|
of 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
|
||||||
|
to build them, Boost.Build does not automatically enable python
|
||||||
|
debugging in its `debug` build variant (which is the default).
|
||||||
|
Instead there is a special build property called
|
||||||
|
`python-debugging` that, when used as a build property, will
|
||||||
|
define the right preprocessor symbols and select the right
|
||||||
|
libraries to link with.
|
||||||
|
|
||||||
|
On unix-variant platforms, the debugging versions of Python's data
|
||||||
|
structures will only be used if the symbol `Py_DEBUG` is defined.
|
||||||
|
On many windows compilers, when extension modules are built with
|
||||||
|
the preprocessor symbol `_DEBUG`, Python defaults to force
|
||||||
|
linking with a special debugging version of the Python DLL. Since
|
||||||
|
that symbol is very commonly used even when Python is not present,
|
||||||
|
Boost.Python temporarily undefines `_DEBUG` when `Python.h`
|
||||||
|
is #included from `boost/python/detail/wrap_python.hpp` - unless
|
||||||
|
`BOOST_DEBUG_PYTHON` is defined. The upshot is that if you want
|
||||||
|
“python debugging”and you aren't using Boost.Build, you should make
|
||||||
|
sure `BOOST_DEBUG_PYTHON` is defined, or python debugging will be
|
||||||
|
suppressed.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Testing Boost.Python]
|
||||||
|
|
||||||
|
To run the full test suite for Boost.Python, invoke `bjam` in the
|
||||||
|
`test` subdirectory of your Boost.Python distribution.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Notes for MinGW (and Cygwin with -mno-cygwin) GCC Users]
|
||||||
|
|
||||||
|
If you are using a version of Python prior to 2.4.1 with a MinGW
|
||||||
|
prior to 3.0.0 (with binutils-2.13.90-20030111-1), you will need to
|
||||||
|
create a MinGW-compatible version of the Python library; the one
|
||||||
|
shipped with Python will only work with a Microsoft-compatible
|
||||||
|
linker. Follow the instructions in the “Non-Microsoft” section of
|
||||||
|
the “Building Extensions: Tips And Tricks” chapter in
|
||||||
|
[@https://docs.python.org/2/install/index.html Installing Python Modules]
|
||||||
|
to create `libpythonXX.a`, where `XX` corresponds to the major and minor
|
||||||
|
version numbers of your Python installation.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"
|
|
||||||
"http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<title>
|
|
||||||
Comparisons with Other Systems
|
|
||||||
</title>
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
<img width="277" height="86" id="_x0000_i1025" align="center"
|
|
||||||
src="../../../c++boost.gif" alt= "c++boost.gif (8819 bytes)"><br>
|
|
||||||
Comparisons with
|
|
||||||
Other Systems
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<h2>CXX</h2>
|
|
||||||
<p>
|
|
||||||
Like Boost.Python, <a href="http://cxx.sourceforge.net/">CXX</a> attempts to
|
|
||||||
provide a C++-oriented interface to Python. In most cases, as with the
|
|
||||||
boost library, it relieves the user from worrying about
|
|
||||||
reference-counts. Both libraries automatically convert thrown C++
|
|
||||||
exceptions into Python exceptions. As far as I can tell, CXX has no
|
|
||||||
support for subclassing C++ extension types in Python. An even
|
|
||||||
more significant difference is that a user's C++ code is still basically
|
|
||||||
``dealing with Python objects'', though they are wrapped in
|
|
||||||
C++ classes. This means such jobs as argument parsing and conversion are
|
|
||||||
still left to be done explicitly by the user.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
CXX claims to interoperate well with the C++ Standard Library
|
|
||||||
(a.k.a. STL) by providing iterators into Python Lists and Dictionaries,
|
|
||||||
but the claim is unfortunately unsupportable. The problem is that in
|
|
||||||
general, access to Python sequence and mapping elements through
|
|
||||||
iterators requires the use of proxy objects as the return value of
|
|
||||||
iterator dereference operations. This usage conflicts with the basic
|
|
||||||
ForwardIterator requirements in <a
|
|
||||||
href="http://anubis.dkuug.dk/jtc1/sc22/open/n2356/lib-iterators.html#lib.forward.iterators">
|
|
||||||
section 24.1.3 of the standard</a> (dereferencing must produce a
|
|
||||||
reference). Although you may be able to use these iterators with some
|
|
||||||
operations in some standard library implementations, it is neither
|
|
||||||
guaranteed to work nor portable.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
As far as I can tell, CXX enables one to write what is essentially
|
|
||||||
idiomatic Python code in C++, manipulating Python objects through the
|
|
||||||
same fully-generic interfaces we use in Python. While you're hardly
|
|
||||||
programming directly to the ``bare metal'' with CXX, it basically
|
|
||||||
presents a ``C++-ized'' version of the Python 'C' API. Some fraction of
|
|
||||||
that capability is available in Boost.Python through <tt><a
|
|
||||||
href="../../../boost/python/objects.hpp">boost/python/objects.hpp</a></tt>,
|
|
||||||
which provides C++ objects corresponding to Python lists, tuples,
|
|
||||||
strings, and dictionaries, and through <tt><a
|
|
||||||
href="../../../boost/python/callback.hpp">boost/python/callback.hpp</a></tt>,
|
|
||||||
which allows you to call back into python with C++ arguments.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="mailto:dubois1@llnl.gov">Paul F. Dubois</a>, the original
|
|
||||||
author of CXX, has told me that what I've described is only half of the
|
|
||||||
picture with CXX, but I never understood his explanation well-enough to
|
|
||||||
fill in the other half. Here is his response to the commentary above:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
``My intention with CXX was not to do what you are doing. It was to enable a
|
|
||||||
person to write an extension directly in C++ rather than C. I figured others had
|
|
||||||
the wrapping business covered. I thought maybe CXX would provide an easier
|
|
||||||
target language for those making wrappers, but I never explored
|
|
||||||
that.''<br><i>-<a href="mailto:dubois1@llnl.gov">Paul Dubois</a></i>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<h2>SWIG</h2>
|
|
||||||
<p>
|
|
||||||
<a href= "http://www.swig.org/">SWIG</a> is an impressively mature tool
|
|
||||||
for exporting an existing ANSI 'C' interface into various scripting
|
|
||||||
languages. Swig relies on a parser to read your source code and produce
|
|
||||||
additional source code files which can be compiled into a Python (or
|
|
||||||
Perl or Tcl) extension module. It has been successfully used to create
|
|
||||||
many Python extension modules. Like Boost.Python, SWIG is trying to allow an
|
|
||||||
existing interface to be wrapped with little or no change to the
|
|
||||||
existing code. The documentation says ``SWIG parses a form of ANSI C
|
|
||||||
syntax that has been extended with a number of special directives. As a
|
|
||||||
result, interfaces are usually built by grabbing a header file and
|
|
||||||
tweaking it a little bit.'' For C++ interfaces, the tweaking has often
|
|
||||||
proven to amount to more than just a little bit. One user
|
|
||||||
writes:
|
|
||||||
|
|
||||||
<blockquote> ``The problem with swig (when I used it) is that it
|
|
||||||
couldnt handle templates, didnt do func overloading properly etc. For
|
|
||||||
ANSI C libraries this was fine. But for usual C++ code this was a
|
|
||||||
problem. Simple things work. But for anything very complicated (or
|
|
||||||
realistic), one had to write code by hand. I believe Boost.Python doesn't have
|
|
||||||
this problem[<a href="#sic">sic</a>]... IMHO overloaded functions are very important to
|
|
||||||
wrap correctly.''<br><i>-Prabhu Ramachandran</i>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
By contrast, Boost.Python doesn't attempt to parse C++ - the problem is simply
|
|
||||||
too complex to do correctly. <a name="sic">Technically</a>, one does
|
|
||||||
write code by hand to use Boost.Python. The goal, however, has been to make
|
|
||||||
that code nearly as simple as listing the names of the classes and
|
|
||||||
member functions you want to expose in Python.
|
|
||||||
|
|
||||||
<h2>SIP</h2>
|
|
||||||
<p>
|
|
||||||
<a
|
|
||||||
href="http://www.thekompany.com/projects/pykde/background.php3?dhtml_ok=1">SIP</a>
|
|
||||||
is a system similar to SWIG, though seemingly more
|
|
||||||
C++-oriented. The author says that like Boost.Python, SIP supports overriding
|
|
||||||
extension class member functions in Python subclasses. It appears to
|
|
||||||
have been designed specifically to directly support some features of
|
|
||||||
PyQt/PyKDE, which is its primary client. Documentation is almost
|
|
||||||
entirely missing at the time of this writing, so a detailed comparison
|
|
||||||
is difficult.
|
|
||||||
|
|
||||||
<h2>ILU</h2>
|
|
||||||
<p>
|
|
||||||
<a
|
|
||||||
href="ftp://ftp.parc.xerox.com/pub/ilu/ilu.html">ILU</a>
|
|
||||||
is a very ambitious project which tries to describe a module's interface
|
|
||||||
(types and functions) in terms of an <a
|
|
||||||
href="ftp://ftp.parc.xerox.com/pub/ilu/2.0b1/manual-html/manual_2.html">Interface
|
|
||||||
Specification Language</a> (ISL) so that it can be uniformly interfaced
|
|
||||||
to a wide range of computer languages, including Common Lisp, C++, C,
|
|
||||||
Modula-3, and Python. ILU can parse the ISL to generate a C++ language
|
|
||||||
header file describing the interface, of which the user is expected to
|
|
||||||
provide an implementation. Unlike Boost.Python, this means that the system
|
|
||||||
imposes implementation details on your C++ code at the deepest level. It
|
|
||||||
is worth noting that some of the C++ names generated by ILU are supposed
|
|
||||||
to be reserved to the C++ implementation. It is unclear from the
|
|
||||||
documentation whether ILU supports overriding C++ virtual functions in Python.
|
|
||||||
|
|
||||||
<h2>GRAD</h2>
|
|
||||||
<p>
|
|
||||||
<a
|
|
||||||
href="http://www.python.org/workshops/1996-11/papers/GRAD/html/GRADcover.html">GRAD</a>
|
|
||||||
is another very ambitious project aimed at generating Python wrappers for
|
|
||||||
interfaces written in ``legacy languages'', among which C++ is the first one
|
|
||||||
implemented. Like SWIG, it aims to parse source code and automatically
|
|
||||||
generate wrappers, though it appears to take a more sophisticated approach
|
|
||||||
to parsing in general and C++ in particular, so it should do a much better
|
|
||||||
job with C++. It appears to support function overloading. The
|
|
||||||
documentation is missing a lot of information I'd like to see, so it is
|
|
||||||
difficult to give an accurate and fair assessment. I am left with the
|
|
||||||
following questions:
|
|
||||||
<ul>
|
|
||||||
<li>Does it support overriding of virtual functions?
|
|
||||||
<li>What about overriding private or protected virtual functions (the documentation indicates
|
|
||||||
that only public interfaces are supported)?
|
|
||||||
<li>Which C++ language constructs are supportd?
|
|
||||||
<li>Does it support implicit conversions between wrapped C++ classes that have
|
|
||||||
an inheritance relationship?
|
|
||||||
<li>Does it support smart pointers?
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Anyone in the possession of the answers to these questions will earn my
|
|
||||||
gratitude for a write-up <code>;-)</code>
|
|
||||||
|
|
||||||
<h2>Zope ExtensionClasses</h2>
|
|
||||||
<p>
|
|
||||||
<a href="http:http://www.digicool.com/releases/ExtensionClass">
|
|
||||||
ExtensionClasses in Zope</a> use the same underlying mechanism as Boost.Python
|
|
||||||
to support subclassing of extension types in Python, including
|
|
||||||
multiple-inheritance. Both systems support pickling/unpickling of
|
|
||||||
extension class instances in very similar ways. Both systems rely on the
|
|
||||||
same ``<a
|
|
||||||
href="http://www.python.org/workshops/1994-11/BuiltInClasses/Welcome.html">Don
|
|
||||||
Beaudry Hack</a>'' that also inspired Don's MESS System.
|
|
||||||
<p>
|
|
||||||
The major differences are:
|
|
||||||
<ul>
|
|
||||||
<li>Zope is entirely 'C' language-based. It doesn't require a C++
|
|
||||||
compiler, so it's much more portable than Boost.Python, which stresses
|
|
||||||
the limits of even some modern C++ implementations.
|
|
||||||
|
|
||||||
<li>
|
|
||||||
Boost.Python lifts the burden on the user to parse and convert function
|
|
||||||
argument types. Zope provides no such facility.
|
|
||||||
<li>
|
|
||||||
Boost.Python lifts the burden on the user to maintain Python
|
|
||||||
reference-counts.
|
|
||||||
<li>
|
|
||||||
Boost.Python supports function overloading; Zope does not.
|
|
||||||
<li>
|
|
||||||
Boost.Python supplies a simple mechanism for exposing read-only and
|
|
||||||
read/write access to data members of the wrapped C++ type as Python
|
|
||||||
attributes.
|
|
||||||
<li>
|
|
||||||
Writing a Zope ExtensionClass is significantly more complex than
|
|
||||||
exposing a C++ class to python using Boost.Python (mostly a summary of the
|
|
||||||
previous 4 items). <a href=
|
|
||||||
"http://www.digicool.com/releases/ExtensionClass/MultiMapping.html">A
|
|
||||||
Zope Example</a> illustrates the differences.
|
|
||||||
<li>
|
|
||||||
Zope's ExtensionClasses are specifically motivated by ``the need for a
|
|
||||||
C-based persistence mechanism''. Boost.Python's are motivated by the desire
|
|
||||||
to simply reflect a C++ API into Python with as little modification as
|
|
||||||
possible.
|
|
||||||
<li>
|
|
||||||
The following Zope restriction does not apply to Boost.Python: ``At most one
|
|
||||||
base extension direct or indirect super class may define C data
|
|
||||||
members. If an extension subclass inherits from multiple base
|
|
||||||
extension classes, then all but one must be mix-in classes that
|
|
||||||
provide extension methods but no data.''
|
|
||||||
<li>
|
|
||||||
Zope requires use of the somewhat funky inheritedAttribute (search for
|
|
||||||
``inheritedAttribute'' on <a
|
|
||||||
href="http://www.digicool.com/releases/ExtensionClass">this page</a>)
|
|
||||||
method to access base class methods. In Boost.Python, base class methods can
|
|
||||||
be accessed in the usual way by writing
|
|
||||||
``<code>BaseClass.method</code>''.
|
|
||||||
<li>
|
|
||||||
Zope supplies some creative but esoteric idioms such as <a href=
|
|
||||||
"http://www.digicool.com/releases/ExtensionClass/Acquisition.html">
|
|
||||||
Acquisition</a>. No specific support for this is built into Boost.Python.
|
|
||||||
<li>
|
|
||||||
Zope's ComputedAttribute support is designed to be used from Python.
|
|
||||||
<a href="special.html#getter_setter">The analogous feature of
|
|
||||||
Boost.Python</a> can be used from C++ or Python. The feature is arguably
|
|
||||||
easier to use in Boost.Python.
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
Next: <a href="example1.html">A Simple Example Using Boost.Python</a>
|
|
||||||
Previous: <a href="extending.html">A Brief Introduction to writing Python Extension Modules</a>
|
|
||||||
Up: <a href="index.html">Top</a>
|
|
||||||
<p>
|
|
||||||
© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided ``as is'' without
|
|
||||||
express or implied warranty, and with no claim as to its suitability
|
|
||||||
for any purpose.
|
|
||||||
<p>
|
|
||||||
Updated: Mar 6, 2001
|
|
||||||
</div>
|
|
||||||
|
|
||||||
83
doc/configuration.qbk
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
[chapter Configuration
|
||||||
|
[quickbook 1.7]
|
||||||
|
[authors [Abrahams, David]]
|
||||||
|
[copyright 2002 - 2015 David Abrahams, Stefan Seefeld]
|
||||||
|
[id configuration]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
[section Configuration]
|
||||||
|
|
||||||
|
[section Introduction]
|
||||||
|
[*Boost.Python] uses several configuration macros in `<boost/config.hpp>`, as well as configuration macros meant to be supplied by the application. These macros are documented here.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Application Defined Macros]
|
||||||
|
|
||||||
|
These are the macros that may be defined by an application using Boost.Python. Note that if you extend a strict interpretation of the C++ standard to cover dynamic libraries, using different values of these macros when compiling different libraries (including extension modules and the Boost.Python library itself) is a violation of the [link odr ODR]. However, we know of no C++ implementations on which this particular violation is detectable or causes any problems.
|
||||||
|
|
||||||
|
[table
|
||||||
|
[[Macro][Default][Meaning]]
|
||||||
|
[[BOOST_PYTHON_MAX_ARITY]
|
||||||
|
[15]
|
||||||
|
[The maximum arity of any function, member function,
|
||||||
|
or constructor to be wrapped, invocation of a
|
||||||
|
Boost.Python function wich is specified as taking
|
||||||
|
arguments x1, x2,...Xn. This includes, in particular,
|
||||||
|
callback mechanisms such as object::operator()(...) or call_method<R>(... ).]]
|
||||||
|
[[BOOST_PYTHON_MAX_BASES][10]
|
||||||
|
[The maximum number of template arguments to the
|
||||||
|
`bases<...>` class template, which is used to specify
|
||||||
|
the bases of a wrapped C++ class..]]
|
||||||
|
[[BOOST_PYTHON_STATIC_MODULE]
|
||||||
|
[ /not defined/ ]
|
||||||
|
[If defined, prevents your module initialization
|
||||||
|
function from being treated as an exported symbol
|
||||||
|
on platforms which support that distinction in-code]]
|
||||||
|
[[BOOST_PYTHON_ENABLE_CDECL]
|
||||||
|
[ /not defined/ ]
|
||||||
|
[If defined, allows functions using the `__cdecl`
|
||||||
|
calling convention to be wrapped.]]
|
||||||
|
[[BOOST_PYTHON_ENABLE_STDCALL]
|
||||||
|
[ /not defined/ ]
|
||||||
|
[If defined, allows functions using the `__stdcall`
|
||||||
|
calling convention to be wrapped.]]
|
||||||
|
[[BOOST_PYTHON_ENABLE_FASTCALL]
|
||||||
|
[ /not defined/ ]
|
||||||
|
[If defined, allows functions using the `__fastcall`
|
||||||
|
calling convention to be wrapped.]]
|
||||||
|
]
|
||||||
|
[endsect]
|
||||||
|
[section Library Defined Defined Macros]
|
||||||
|
These macros are defined by *Boost.Python* and are implementation details of interest only to implementors and those porting to new platforms.
|
||||||
|
[table
|
||||||
|
[[Macro][Default][Meaning]]
|
||||||
|
[[BOOST_PYTHON_TYPE_ID_NAME][ /not defined/ ]
|
||||||
|
[If defined, this indicates that the type_info comparison across
|
||||||
|
shared library boundaries does not work on this platform.
|
||||||
|
In other words, if shared-lib-1 passes `typeid(T)` to a function
|
||||||
|
in shared-lib-2 which compares it to `typeid(T)`, that comparison
|
||||||
|
may return `false`. If this macro is #defined, Boost.Python uses
|
||||||
|
and compares `typeid(T).name()` instead of using and comparing
|
||||||
|
the `std::type_info` objects directly.]]
|
||||||
|
[[BOOST_PYTHON_NO_PY_SIGNATURES][ /not defined/ ]
|
||||||
|
[If defined for a module no pythonic signatures are generated for
|
||||||
|
the docstrings of the module functions, and no python type is
|
||||||
|
associated with any of the converters registered by the module.
|
||||||
|
This also reduces the binary size of the module by about 14%
|
||||||
|
(gcc compiled).
|
||||||
|
If defined for the boost_python runtime library, the default for
|
||||||
|
the `docstring_options.enable_py_signatures()` is set to `false`.]]
|
||||||
|
[[BOOST_PYTHON_SUPPORTS_PY_SIGNATURES]
|
||||||
|
[ /defined/ if `BOOST_PYTHON_NO_PY_SIGNATURES` is /undefined/ ]
|
||||||
|
[This macro is defined to enable a smooth transition from older
|
||||||
|
Boost.Python versions which do not support pythonic signatures.
|
||||||
|
For example usage see here.]]
|
||||||
|
[[BOOST_PYTHON_PY_SIGNATURES_PROPER_INIT_SELF_TYPE][ /not defined/ ]
|
||||||
|
[If defined the python type of `__init__` method "self" parameters
|
||||||
|
is properly generated, otherwise object is used. It is undefined by
|
||||||
|
default because it increases the binary size of the module by about
|
||||||
|
14% (gcc compiled).]]
|
||||||
|
]
|
||||||
|
[endsect]
|
||||||
|
[endsect]
|
||||||
@@ -1,336 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"
|
|
||||||
"http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
|
|
||||||
<title>Cross-extension-module dependencies</title>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
|
|
||||||
<img src="../../../c++boost.gif"
|
|
||||||
alt="c++boost.gif (8819 bytes)"
|
|
||||||
align="center"
|
|
||||||
width="277" height="86">
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h1>Cross-extension-module dependencies</h1>
|
|
||||||
|
|
||||||
It is good programming practice to organize large projects as modules
|
|
||||||
that interact with each other via well defined interfaces. With
|
|
||||||
Boost.Python it is possible to reflect this organization at the C++
|
|
||||||
level at the Python level. This is, each logical C++ module can be
|
|
||||||
organized as a separate Python extension module.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
At first sight this might seem natural and straightforward. However, it
|
|
||||||
is a fairly complex problem to establish cross-extension-module
|
|
||||||
dependencies while maintaining the same ease of use Boost.Python
|
|
||||||
provides for classes that are wrapped in the same extension module. To
|
|
||||||
a large extent this complexity can be hidden from the author of a
|
|
||||||
Boost.Python extension module, but not entirely.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>The recipe</h2>
|
|
||||||
|
|
||||||
Suppose there is an extension module that exposes certain instances of
|
|
||||||
the C++ <tt>std::vector</tt> template library such that it can be used
|
|
||||||
from Python in the following manner:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import std_vector
|
|
||||||
v = std_vector.double([1, 2, 3, 4])
|
|
||||||
v.push_back(5)
|
|
||||||
v.size()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
Suppose the <tt>std_vector</tt> module is done well and reflects all
|
|
||||||
C++ functions that are useful at the Python level, for all C++ built-in
|
|
||||||
data types (<tt>std_vector.int</tt>, <tt>std_vector.long</tt>, etc.).
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Suppose further that there is statistic module with a C++ class that
|
|
||||||
has constructors or member functions that use or return a
|
|
||||||
<tt>std::vector</tt>. For example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
class xy {
|
|
||||||
public:
|
|
||||||
xy(const std::vector<double>& x, const std::vector<double>& y) : m_x(x), m_y(y) {}
|
|
||||||
const std::vector<double>& x() const { return m_x; }
|
|
||||||
const std::vector<double>& y() const { return m_y; }
|
|
||||||
double correlation();
|
|
||||||
private:
|
|
||||||
std::vector<double> m_x;
|
|
||||||
std::vector<double> m_y;
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
What is more natural than reusing the <tt>std_vector</tt> extension
|
|
||||||
module to expose these constructors or functions to Python?
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Unfortunately, what seems natural needs a little work in both the
|
|
||||||
<tt>std_vector</tt> and the <tt>statistics</tt> module.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
In the <tt>std_vector</tt> extension module,
|
|
||||||
<tt>std::vector<double></tt> is exposed to Python in the usual
|
|
||||||
way with the <tt>class_builder<></tt> template. To also enable the
|
|
||||||
automatic conversion of <tt>std::vector<double></tt> function
|
|
||||||
arguments or return values in other Boost.Python C++ modules, the
|
|
||||||
converters that convert a <tt>std::vector<double></tt> C++ object
|
|
||||||
to a Python object and vice versa (i.e. the <tt>to_python()</tt> and
|
|
||||||
<tt>from_python()</tt> template functions) have to be exported. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
#include <boost/python/cross_module.hpp>
|
|
||||||
//...
|
|
||||||
class_builder<std::vector<double> > v_double(std_vector_module, "double");
|
|
||||||
export_converters(v_double);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
In the extension module that wraps <tt>class xy</tt> we can now import
|
|
||||||
these converters with the <tt>import_converters<></tt> template.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
#include <boost/python/cross_module.hpp>
|
|
||||||
//...
|
|
||||||
import_converters<std::vector<double> > v_double_converters("std_vector", "double");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
That is all. All the attributes that are defined for
|
|
||||||
<tt>std_vector.double</tt> in the <tt>std_vector</tt> Boost.Python
|
|
||||||
module will be available for the returned objects of <tt>xy.x()</tt>
|
|
||||||
and <tt>xy.y()</tt>. Similarly, the constructor for <tt>xy</tt> will
|
|
||||||
accept objects that were created by the <tt>std_vector</tt>module.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Placement of <tt>import_converters<></tt> template instantiations</h2>
|
|
||||||
|
|
||||||
<tt>import_converts<></tt> can be viewed as a drop-in replacement
|
|
||||||
for <tt>class_wrapper<></tt>, and the recommendations for the
|
|
||||||
placement of <tt>class_wrapper<></tt> template instantiations
|
|
||||||
also apply to to <tt>import_converts<></tt>. In particular, it is
|
|
||||||
important that an instantiation of <tt>class_wrapper<></tt> is
|
|
||||||
visible to any code which wraps a C++ function with a <tt>T</tt>,
|
|
||||||
<tt>T*</tt>, const <tt>T&</tt>, etc. parameter or return value.
|
|
||||||
Therefore you may want to group all <tt>class_wrapper<></tt> and
|
|
||||||
<tt>import_converts<></tt> instantiations at the top of your
|
|
||||||
module's init function, then <tt>def()</tt> the member functions later
|
|
||||||
to avoid problems with inter-class dependencies.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Non-copyable types</h2>
|
|
||||||
|
|
||||||
<tt>export_converters()</tt> instantiates C++ template functions that
|
|
||||||
invoke the copy constructor of the wrapped type. For a type that is
|
|
||||||
non-copyable this will result in compile-time error messages. In such a
|
|
||||||
case, <tt>export_converters_noncopyable()</tt> can be used to export
|
|
||||||
the converters that do not involve the copy constructor of the wrapped
|
|
||||||
type. For example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
class_builder<store> py_store(your_module, "store");
|
|
||||||
export_converters_noncopyable(py_store);
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
The corresponding <tt>import_converters<></tt> statement does not
|
|
||||||
need any special attention:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import_converters<store> py_store("noncopyable_export", "store");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Python module search path</h2>
|
|
||||||
|
|
||||||
The <tt>std_vector</tt> and <tt>statistics</tt> modules can now be used
|
|
||||||
in the following way:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import std_vector
|
|
||||||
import statistics
|
|
||||||
x = std_vector.double([1, 2, 3, 4])
|
|
||||||
y = std_vector.double([2, 4, 6, 8])
|
|
||||||
xy = statistics.xy(x, y)
|
|
||||||
xy.correlation()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
In this example it is clear that Python has to be able to find both the
|
|
||||||
<tt>std_vector</tt> and the <tt>statistics</tt> extension module. In
|
|
||||||
other words, both extension modules need to be in the Python module
|
|
||||||
search path (<tt>sys.path</tt>).
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The situation is not always this obvious. Suppose the
|
|
||||||
<tt>statistics</tt> module has a <tt>random()</tt> function that
|
|
||||||
returns a vector of random numbers with a given length:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import statistics
|
|
||||||
x = statistics.random(5)
|
|
||||||
y = statistics.random(5)
|
|
||||||
xy = statistics.xy(x, y)
|
|
||||||
xy.correlation()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
A naive user will not easily anticipate that the <tt>std_vector</tt>
|
|
||||||
module is used to pass the <tt>x</tt> and <tt>y</tt> vectors around. If
|
|
||||||
the <tt>std_vector</tt> module is in the Python module search path,
|
|
||||||
this form of ignorance is of no harm. On the contrary, we are glad
|
|
||||||
that we do not have to bother the user with details like this.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If the <tt>std_vector</tt> module is not in the Python module search
|
|
||||||
path, a Python exception will be raised:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
Traceback (innermost last):
|
|
||||||
File "foo.py", line 2, in ?
|
|
||||||
x = statistics.random(5)
|
|
||||||
ImportError: No module named std_vector
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
As is the case with any system of a non-trivial complexity, it is
|
|
||||||
important that the setup is consistent and complete.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Two-way module dependencies</h2>
|
|
||||||
|
|
||||||
Boost.Python supports two-way module dependencies. This is best
|
|
||||||
illustrated by a simple example.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Suppose there is a module <tt>ivect</tt> that implements vectors of
|
|
||||||
integers, and a similar module <tt>dvect</tt> that implements vectors
|
|
||||||
of doubles. We want to be able do convert an integer vector to a double
|
|
||||||
vector and vice versa. For example:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import ivect
|
|
||||||
iv = ivect.ivect((1,2,3,4,5))
|
|
||||||
dv = iv.as_dvect()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
The last expression will implicitly import the <tt>dvect</tt> module in
|
|
||||||
order to enable the conversion of the C++ representation of
|
|
||||||
<tt>dvect</tt> to a Python object. The analogous is possible for a
|
|
||||||
<tt>dvect</tt>:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import dvect
|
|
||||||
dv = dvect.dvect((1,2,3,4,5))
|
|
||||||
iv = dv.as_ivect()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
Now the <tt>ivect</tt> module is imported implicitly.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note that the two-way dependencies are possible because the
|
|
||||||
dependencies are resolved only when needed. This is, the initialization
|
|
||||||
of the <tt>ivect</tt> module does not rely on the <tt>dvect</tt>
|
|
||||||
module, and vice versa. Only if <tt>as_dvect()</tt> or
|
|
||||||
<tt>as_ivect()</tt> is actually invoked will the corresponding module
|
|
||||||
be implicitly imported. This also means that, for example, the
|
|
||||||
<tt>dvect</tt> module does not have to be available at all if
|
|
||||||
<tt>as_dvect()</tt> is never used.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Clarification of compile-time and link-time dependencies</h2>
|
|
||||||
|
|
||||||
Boost.Python's support for resolving cross-module dependencies at
|
|
||||||
runtime does not imply that compile-time dependencies are eliminated.
|
|
||||||
For example, the statistics extension module in the example above will
|
|
||||||
need to <tt>#include <vector></tt>. This is immediately obvious
|
|
||||||
from the definition of <tt>class xy</tt>.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
If a library is wrapped that consists of both header files and compiled
|
|
||||||
components (e.g. <tt>libdvect.a</tt>, <tt>dvect.lib</tt>, etc.), both
|
|
||||||
the Boost.Python extension module with the
|
|
||||||
<tt>export_converters()</tt> statement and the module with the
|
|
||||||
<tt>import_converters<></tt> statement need to be linked against
|
|
||||||
the object library. Ideally one would build a shared library (e.g.
|
|
||||||
<tt>libdvect.so</tt>, <tt>dvect.dll</tt>, etc.). However, this
|
|
||||||
introduces the issue of having to configure the search path for the
|
|
||||||
dynamic loading correctly. For small libraries it is therefore often
|
|
||||||
more convenient to ignore the fact that the object files are loaded
|
|
||||||
into memory more than once.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Summary of motivation for cross-module support</h2>
|
|
||||||
|
|
||||||
The main purpose of Boost.Python's cross-module support is to allow for
|
|
||||||
a modular system layout. With this support it is straightforward to
|
|
||||||
reflect C++ code organization at the Python level. Without the
|
|
||||||
cross-module support, a multi-purpose module like <tt>std_vector</tt>
|
|
||||||
would be impractical because the entire wrapper code would somehow have
|
|
||||||
to be duplicated in all extension modules that use it, making them
|
|
||||||
harder to maintain and harder to build.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Another motivation for the cross-module support is that two extension
|
|
||||||
modules that wrap the same class cannot both be imported into Python.
|
|
||||||
For example, if there are two modules <tt>A</tt> and <tt>B</tt> that
|
|
||||||
both wrap a given <tt>class X</tt>, this will work:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import A
|
|
||||||
x = A.X()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
This will also work:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import B
|
|
||||||
x = B.X()
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
However, this will fail:
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
import A
|
|
||||||
import B
|
|
||||||
python: /net/cci/rwgk/boost/boost/python/detail/extension_class.hpp:866:
|
|
||||||
static void boost::python::detail::class_registry<X>::register_class(boost::python::detail::extension_class_base *):
|
|
||||||
Assertion `static_class_object == 0' failed.
|
|
||||||
Abort
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
A good solution is to wrap <tt>class X</tt> only once. Depending on the
|
|
||||||
situation, this could be done by module <tt>A</tt> or <tt>B</tt>, or an
|
|
||||||
additional small extension module that only wraps and exports
|
|
||||||
<tt>class X</tt>.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Finally, there can be important psychological or political reasons for
|
|
||||||
using the cross-module support. If a group of classes is lumped
|
|
||||||
together with many others in a huge module, the authors will have
|
|
||||||
difficulties in being identified with their work. The situation is
|
|
||||||
much more transparent if the work is represented by a module with a
|
|
||||||
recognizable name. This is not just a question of strong egos, but also
|
|
||||||
of getting credit and funding.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<h2>Why not use <tt>export_converters()</tt> universally?</h2>
|
|
||||||
|
|
||||||
There is some overhead associated with the Boost.Python cross-module
|
|
||||||
support. Depending on the platform, the size of the code generated by
|
|
||||||
<tt>export_converters()</tt> is roughly 10%-20% of that generated
|
|
||||||
by <tt>class_builder<></tt>. For a large extension module with
|
|
||||||
many wrapped classes, this could mean a significant difference.
|
|
||||||
Therefore the general recommendation is to use
|
|
||||||
<tt>export_converters()</tt> only for classes that are likely to
|
|
||||||
be used as function arguments or return values in other modules.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
© Copyright Ralf W. Grosse-Kunstleve 2001. Permission to copy,
|
|
||||||
use, modify, sell and distribute this document is granted provided this
|
|
||||||
copyright notice appears in all copies. This document is provided "as
|
|
||||||
is" without express or implied warranty, and with no claim as to its
|
|
||||||
suitability for any purpose.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Updated: April 2001
|
|
||||||
|
|
||||||
</div>
|
|
||||||
@@ -1,192 +0,0 @@
|
|||||||
Given a real Python class 'A', a wrapped C++ class 'B', and this definition:
|
|
||||||
|
|
||||||
class C(A, B):
|
|
||||||
def __init__(self):
|
|
||||||
B.__init__(self)
|
|
||||||
self.x = 1
|
|
||||||
...
|
|
||||||
|
|
||||||
c = C()
|
|
||||||
|
|
||||||
this diagram describes the internal structure of an instance of 'C', including
|
|
||||||
its inheritance relationships. Note that ExtensionClass<B> is derived from
|
|
||||||
Class<ExtensionInstance>, and is in fact identical for all intents and purposes.
|
|
||||||
|
|
||||||
MetaClass<ExtensionInstance>
|
|
||||||
+---------+ +---------+
|
|
||||||
types.ClassType: | | | |
|
|
||||||
| | | |
|
|
||||||
| | | |
|
|
||||||
+---------+ +---------+
|
|
||||||
^ ^ ^
|
|
||||||
PyClassObject | ExtensionClass<B> | |
|
|
||||||
A: +------------+ | B: +------------+ | |
|
|
||||||
| ob_type -+-+ | ob_type -+-----+ |
|
|
||||||
| | ()<--+- __bases__ | |
|
|
||||||
| | | __dict__ -+->{...} |
|
|
||||||
| | 'B'<-+- __name__ | |
|
|
||||||
+------------+ +------------+ |
|
|
||||||
^ ^ |
|
|
||||||
| | |
|
|
||||||
+-----+ +-------------+ |
|
|
||||||
| | |
|
|
||||||
| | Class<ExtensionInstance> |
|
|
||||||
| | C: +------------+ |
|
|
||||||
| | | ob_type -+------------+
|
|
||||||
tuple:(*, *)<--+- __bases__ |
|
|
||||||
| __dict__ -+->{__module__, <methods, etc.>}
|
|
||||||
'C' <-+- __name__ |
|
|
||||||
+------------+
|
|
||||||
^ (in case of inheritance from more than one
|
|
||||||
| extension class, this vector would contain
|
|
||||||
+---------------+ a pointer to an instance holder for the data
|
|
||||||
| of each corresponding C++ class)
|
|
||||||
| ExtensionInstance
|
|
||||||
| c: +---------------------+ std::vector<InstanceHolderBase>
|
|
||||||
+----+- __class__ | +---+--
|
|
||||||
| m_wrapped_objects -+->| * | ...
|
|
||||||
{'x': 1}<-+- __dict__ | +-|-+--
|
|
||||||
+---------------------+ | InstanceValueHolder<B>
|
|
||||||
| +--------------------------------+
|
|
||||||
+-->| (contains a C++ instance of B) |
|
|
||||||
+--------------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
In our inheritance test cases in extclass_demo.cpp/test_extclass.py, we have the
|
|
||||||
following C++ inheritance hierarchy:
|
|
||||||
|
|
||||||
+-----+ +----+
|
|
||||||
| A1 | | A2 |
|
|
||||||
+-----+ +----+
|
|
||||||
^ ^ ^ ^ ^
|
|
||||||
| | | | |
|
|
||||||
+-----+ | +---------+-----+
|
|
||||||
| | | |
|
|
||||||
| +---+----------+
|
|
||||||
.......!...... | |
|
|
||||||
: A_callback : +-+--+ +-+--+
|
|
||||||
:............: | B1 | | B2 |
|
|
||||||
+----+ +----+
|
|
||||||
^
|
|
||||||
|
|
|
||||||
+-------+---------+
|
|
||||||
| |
|
|
||||||
+-+-+ ......!.......
|
|
||||||
| C | : B_callback :
|
|
||||||
+---+ :............:
|
|
||||||
|
|
||||||
|
|
||||||
A_callback and B_callback are used as part of the wrapping mechanism but not
|
|
||||||
represented in Python. C is also not represented in Python but is delivered
|
|
||||||
there polymorphically through a smart pointer.
|
|
||||||
|
|
||||||
This is the data structure in Python.
|
|
||||||
|
|
||||||
ExtensionClass<A1>
|
|
||||||
A1: +------------+
|
|
||||||
()<--+- __bases__ |
|
|
||||||
| __dict__ -+->{...}
|
|
||||||
+------------+
|
|
||||||
^
|
|
||||||
| ExtensionInstance
|
|
||||||
| a1: +---------------------+ vec InstanceValueHolder<A1,A_callback>
|
|
||||||
+---------+- __class__ | +---+ +---------------------+
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| contains A_callback |
|
|
||||||
| +---------------------+ +---+ +---------------------+
|
|
||||||
|
|
|
||||||
| ExtensionInstance
|
|
||||||
| pa1_a1: +---------------------+ vec InstancePtrHolder<auto_ptr<A1>,A1>
|
|
||||||
+---------+- __class__ | +---+ +---+
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| *-+-+ A1
|
|
||||||
| +---------------------+ +---+ +---+ | +---+
|
|
||||||
| +->| |
|
|
||||||
| ExtensionInstance +---+
|
|
||||||
| pb1_a1: +---------------------+ vec InstancePtrHolder<auto_ptr<A1>,A1>
|
|
||||||
+---------+- __class__ | +---+ +---+
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| *-+-+ B1
|
|
||||||
| +---------------------+ +---+ +---+ | +---+
|
|
||||||
| +->| |
|
|
||||||
| ExtensionInstance +---+
|
|
||||||
| pb2_a1: +---------------------+ vec InstancePtrHolder<auto_ptr<A1>,A1>
|
|
||||||
+---------+- __class__ | +---+ +---+
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| *-+-+ B2
|
|
||||||
| +---------------------+ +---+ +---+ | +---+
|
|
||||||
| +->| |
|
|
||||||
| +---+
|
|
||||||
| ExtensionClass<A1>
|
|
||||||
| A2: +------------+
|
|
||||||
| ()<--+- __bases__ |
|
|
||||||
| | __dict__ -+->{...}
|
|
||||||
| +------------+
|
|
||||||
| ^
|
|
||||||
| | ExtensionInstance
|
|
||||||
| a2: | +---------------------+ vec InstanceValueHolder<A2>
|
|
||||||
| +-+- __class__ | +---+ +-------------+
|
|
||||||
| | | m_wrapped_objects -+->| *-+-->| contains A2 |
|
|
||||||
| | +---------------------+ +---+ +-------------+
|
|
||||||
| |
|
|
||||||
| | ExtensionInstance
|
|
||||||
| pa2_a2: | +---------------------+ vec InstancePtrHolder<auto_ptr<A2>,A2>
|
|
||||||
| +-+- __class__ | +---+ +---+
|
|
||||||
| | | m_wrapped_objects -+->| *-+-->| *-+-+ A2
|
|
||||||
| | +---------------------+ +---+ +---+ | +---+
|
|
||||||
| | +->| |
|
|
||||||
| | ExtensionInstance +---+
|
|
||||||
| pb1_a2: | +---------------------+ vec InstancePtrHolder<auto_ptr<A2>,A2>
|
|
||||||
| +-+- __class__ | +---+ +---+
|
|
||||||
| | | m_wrapped_objects -+->| *-+-->| *-+-+ B1
|
|
||||||
| | +---------------------+ +---+ +---+ | +---+
|
|
||||||
| | +->| |
|
|
||||||
| | +---+
|
|
||||||
| |
|
|
||||||
| +---------------+------------------------------+
|
|
||||||
| | |
|
|
||||||
+------+-------------------------+-|----------------------------+ |
|
|
||||||
| | | | |
|
|
||||||
| Class<ExtensionInstance> | | ExtensionClass<B1> | | ExtensionClass<B1>
|
|
||||||
| DA1: +------------+ | | B1: +------------+ | | B2: +------------+
|
|
||||||
(*,)<---+- __bases__ | (*,*)<---+- __bases__ | (*,*)<---+- __bases__ |
|
|
||||||
| __dict__ -+->{...} | __dict__ -+->{...} | __dict__ -+->{...}
|
|
||||||
+------------+ +------------+ +------------+
|
|
||||||
^ ^ ^
|
|
||||||
| ExtensionInstance | |
|
|
||||||
| da1: +---------------------+ | vec InstanceValueHolder<A1,A_callback>
|
|
||||||
+-------+- __class__ | | +---+ +---------------------+ |
|
|
||||||
| m_wrapped_objects -+--|-->| *-+-->| contains A_callback | |
|
|
||||||
+---------------------+ | +---+ +---------------------+ |
|
|
||||||
+--------------------------------------+ |
|
|
||||||
| ExtensionInstance |
|
|
||||||
b1: | +---------------------+ vec InstanceValueHolder<B1,B_callback> |
|
|
||||||
+-+- __class__ | +---+ +---------------------+ |
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| contains B_callback | |
|
|
||||||
| +---------------------+ +---+ +---------------------+ |
|
|
||||||
| |
|
|
||||||
| ExtensionInstance |
|
|
||||||
pb1_b1: | +---------------------+ vec InstancePtrHolder<auto_ptr<B1>,B1> |
|
|
||||||
+-+- __class__ | +---+ +---+ |
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| *-+-+ B1 |
|
|
||||||
| +---------------------+ +---+ +---+ | +---+ |
|
|
||||||
| +->| | |
|
|
||||||
| ExtensionInstance +---+ |
|
|
||||||
pc_b1: | +---------------------+ vec InstancePtrHolder<auto_ptr<B1>,B1> |
|
|
||||||
+-+- __class__ | +---+ +---+ |
|
|
||||||
| | m_wrapped_objects -+->| *-+-->| *-+-+ C |
|
|
||||||
| +---------------------+ +---+ +---+ | +---+ |
|
|
||||||
| +->| | |
|
|
||||||
| +---+ |
|
|
||||||
| |
|
|
||||||
| Class<ExtensionInstance> +---------------------------------------+
|
|
||||||
| DB1: +------------+ | ExtensionInstance
|
|
||||||
(*,)<---+- __bases__ | a2: | +---------------------+ vec InstanceValueHolder<A2>
|
|
||||||
| __dict__ -+->{...} +-+- __class__ | +---+ +-------------+
|
|
||||||
+------------+ | m_wrapped_objects -+->| *-+-->| contains A2 |
|
|
||||||
^ +---------------------+ +---+ +-------------+
|
|
||||||
| ExtensionInstance
|
|
||||||
db1: | +---------------------+ vec InstanceValueHolder<B1,B_callback>
|
|
||||||
+-+- __class__ | +---+ +----------------------+
|
|
||||||
| m_wrapped_objects -+-->| *-+-->| contains B1_callback |
|
|
||||||
+---------------------+ +---+ +----------------------+
|
|
||||||
120
doc/enums.html
@@ -1,120 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"
|
|
||||||
"http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<title>
|
|
||||||
Wrapping enums
|
|
||||||
</title>
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
<img width="277" height="86" id="_x0000_i1025" align="center"
|
|
||||||
src="../../../c++boost.gif" alt= "c++boost.gif (8819 bytes)"><br>
|
|
||||||
Wrapping enums
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p>Because there is in general no way to deduce that a value of arbitrary type T
|
|
||||||
is an enumeration constant, the Boost Python Library cannot automatically
|
|
||||||
convert enum values to and from Python. To handle this case, you need to decide
|
|
||||||
how you want the enum to show up in Python (since Python doesn't have
|
|
||||||
enums). Once you have done that, you can write some simple
|
|
||||||
<code>from_python()</code> and <code>to_python()</code> functions.
|
|
||||||
|
|
||||||
<p>If you are satisfied with a Python int as a way to represent your enum
|
|
||||||
values, we provide a shorthand for these functions. You just need to cause
|
|
||||||
<code>boost::python::enum_as_int_converters<EnumType></code> to be
|
|
||||||
instantiated, where
|
|
||||||
<code>EnumType</code> is your enumerated type. There are two convenient ways to do this:
|
|
||||||
|
|
||||||
<ol>
|
|
||||||
<li>Explicit instantiation:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
template class boost::python::enum_as_int_converters<my_enum>;
|
|
||||||
</blockquote></pre>
|
|
||||||
|
|
||||||
Some buggy C++ implementations require a class to be instantiated in the same
|
|
||||||
namespace in which it is defined. In that case, the simple incantation above becomes:
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
...
|
|
||||||
} // close my_namespace
|
|
||||||
|
|
||||||
// drop into namespace python and explicitly instantiate
|
|
||||||
namespace boost { namespace python {
|
|
||||||
template class enum_as_int_converters<my_enum_type>;
|
|
||||||
}} // namespace boost::python
|
|
||||||
|
|
||||||
namespace my_namespace { // re-open my_namespace
|
|
||||||
...
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
|
|
||||||
<li>If you have such an implementation, you may find this technique more convenient
|
|
||||||
<blockquote><pre>
|
|
||||||
// instantiate as base class in any namespace
|
|
||||||
struct EnumTypeConverters
|
|
||||||
: boost::python::enum_as_int_converters<EnumType>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
</blockquote></pre>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<p>Either of the above is equivalent to the following declarations:
|
|
||||||
<blockquote><pre>
|
|
||||||
BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE // this is a gcc 2.95.2 bug workaround
|
|
||||||
|
|
||||||
MyEnumType from_python(PyObject* x, boost::python::type<MyEnumType>)
|
|
||||||
{
|
|
||||||
return static_cast<MyEnum>(
|
|
||||||
from_python(x, boost::python::type<long>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
MyEnumType from_python(PyObject* x, boost::python::type<const MyEnumType&>)
|
|
||||||
{
|
|
||||||
return static_cast<MyEnum>(
|
|
||||||
from_python(x, boost::python::type<long>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
PyObject* to_python(MyEnumType x)
|
|
||||||
{
|
|
||||||
return to_python(static_cast<long>(x));
|
|
||||||
}
|
|
||||||
BOOST_PYTHON_END_CONVERSION_NAMESPACE
|
|
||||||
</pre></blockquote>
|
|
||||||
|
|
||||||
<p>This technique defines the conversions of
|
|
||||||
<code>MyEnumType</code> in terms of the conversions for the built-in
|
|
||||||
<code>long</code> type.
|
|
||||||
|
|
||||||
You may also want to add a bunch of lines like this to your module
|
|
||||||
initialization. These bind the corresponding enum values to the appropriate
|
|
||||||
names so they can be used from Python:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
mymodule.add(boost::python::make_ref(enum_value_1), "enum_value_1");
|
|
||||||
mymodule.add(boost::python::make_ref(enum_value_2), "enum_value_2");
|
|
||||||
...
|
|
||||||
</pre></blockquote>
|
|
||||||
|
|
||||||
You can also add these to an extension class definition, if your enum happens to
|
|
||||||
be local to a class and you want the analogous interface in Python:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
my_class_builder.add(boost::python::to_python(enum_value_1), "enum_value_1");
|
|
||||||
my_class_builder.add(boost::python::to_python(enum_value_2), "enum_value_2");
|
|
||||||
...
|
|
||||||
</pre></blockquote>
|
|
||||||
<p>
|
|
||||||
Next: <a href="pointers.html">Pointers and Smart Pointers</a>
|
|
||||||
Previous: <a href="building.html">Building an Extension Module</a>
|
|
||||||
Up: <a href="index.html">Top</a>
|
|
||||||
<p>
|
|
||||||
© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided ``as
|
|
||||||
is'' without express or implied warranty, and with no claim as to
|
|
||||||
its suitability for any purpose.
|
|
||||||
<p>
|
|
||||||
Updated: Mar 6, 2001
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"
|
|
||||||
"http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<title>
|
|
||||||
A Simple Example
|
|
||||||
</title>
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
<img width="277" height="86" id="_x0000_i1025" src="../../../c++boost.gif" alt=
|
|
||||||
"c++boost.gif (8819 bytes)">
|
|
||||||
</h1>
|
|
||||||
<h1>
|
|
||||||
A Simple Example
|
|
||||||
</h1>
|
|
||||||
<p>
|
|
||||||
Suppose we have the following C++ API which we want to expose in
|
|
||||||
Python:
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace { // Avoid cluttering the global namespace.
|
|
||||||
|
|
||||||
// A couple of simple C++ functions that we want to expose to Python.
|
|
||||||
std::string greet() { return "hello, world"; }
|
|
||||||
int square(int number) { return number * number; }
|
|
||||||
}
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
<p>
|
|
||||||
Here is the C++ code for a python module called <tt>getting_started1</tt>
|
|
||||||
which exposes the API.
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
#include <boost/python/class_builder.hpp>
|
|
||||||
namespace python = boost::python;
|
|
||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
|
||||||
python::module_builder this_module("getting_started1");
|
|
||||||
|
|
||||||
// Add regular functions to the module.
|
|
||||||
this_module.def(greet, "greet");
|
|
||||||
this_module.def(square, "square");
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
</blockquote>
|
|
||||||
<p>
|
|
||||||
That's it! If we build this shared library and put it on our <code>
|
|
||||||
PYTHONPATH</code> we can now access our C++ functions from
|
|
||||||
Python.
|
|
||||||
<blockquote>
|
|
||||||
<pre>
|
|
||||||
>>> import getting_started1
|
|
||||||
>>> print getting_started1.greet()
|
|
||||||
hello, world
|
|
||||||
>>> number = 11
|
|
||||||
>>> print number, '*', number, '=', getting_started1.square(number)
|
|
||||||
11 * 11 = 121
|
|
||||||
</pre>
|
|
||||||
<p>
|
|
||||||
Next: <a href="exporting_classes.html">Exporting Classes</a>
|
|
||||||
Previous: <a href="comparisons.html">Comparisons with other systems</a> Up:
|
|
||||||
<a href="index.html">Top</a>
|
|
||||||
<p>
|
|
||||||
© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided "as is" without
|
|
||||||
express or implied warranty, and with no claim as to its suitability
|
|
||||||
for any purpose.
|
|
||||||
<p>
|
|
||||||
Updated: Mar 6, 2000
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN"
|
|
||||||
"http://www.w3.org/TR/REC-html40/strict.dtd">
|
|
||||||
<title>
|
|
||||||
Exporting Classes
|
|
||||||
</title>
|
|
||||||
<div>
|
|
||||||
<h1>
|
|
||||||
<img width="277" height="86" id="_x0000_i1025" src="../../../c++boost.gif" alt=
|
|
||||||
"c++boost.gif (8819 bytes)">
|
|
||||||
</h1>
|
|
||||||
<h1>
|
|
||||||
Exporting Classes
|
|
||||||
</h1>
|
|
||||||
<p>
|
|
||||||
Now let's expose a C++ class to Python:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace { // Avoid cluttering the global namespace.
|
|
||||||
|
|
||||||
// A friendly class.
|
|
||||||
class hello
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
hello(const std::string& country) { this->country = country; }
|
|
||||||
std::string greet() const { return "Hello from " + country; }
|
|
||||||
private:
|
|
||||||
std::string country;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A function taking a hello object as an argument.
|
|
||||||
std::string invite(const hello& w) {
|
|
||||||
return w.greet() + "! Please come soon!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</blockquote></pre> <p>
|
|
||||||
To expose the class, we use a <tt>class_builder</tt> in addition to the
|
|
||||||
<tt>module_builder</tt> from the previous example. Class member functions
|
|
||||||
are exposed by using the <tt>def()</tt> member function on the
|
|
||||||
<tt>class_builder</tt>:
|
|
||||||
<blockquote><pre>
|
|
||||||
#include <boost/python/class_builder.hpp>
|
|
||||||
namespace python = boost::python;
|
|
||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
|
||||||
python::module_builder this_module("getting_started2");
|
|
||||||
|
|
||||||
// Create the Python type object for our extension class.
|
|
||||||
python::class_builder<hello> hello_class(this_module, "hello");
|
|
||||||
|
|
||||||
// Add the __init__ function.
|
|
||||||
hello_class.def(python::constructor<std::string>());
|
|
||||||
// Add a regular member function.
|
|
||||||
hello_class.def(&hello::greet, "greet");
|
|
||||||
|
|
||||||
// Add invite() as a regular function to the module.
|
|
||||||
this_module.def(invite, "invite");
|
|
||||||
|
|
||||||
// Even better, invite() can also be made a member of hello_class!!!
|
|
||||||
hello_class.def(invite, "invite");
|
|
||||||
}
|
|
||||||
</blockquote></pre>
|
|
||||||
<p>
|
|
||||||
Now we can use the class normally from Python:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
>>> from getting_started2 import *
|
|
||||||
>>> hi = hello('California')
|
|
||||||
>>> hi.greet()
|
|
||||||
'Hello from California'
|
|
||||||
>>> invite(hi)
|
|
||||||
'Hello from California! Please come soon!'
|
|
||||||
>>> hi.invite()
|
|
||||||
'Hello from California! Please come soon!'
|
|
||||||
</blockquote></pre>
|
|
||||||
|
|
||||||
Notes:<ul>
|
|
||||||
<li> We expose the class' constructor by calling <tt>def()</tt> on the
|
|
||||||
<tt>class_builder</tt> with an argument whose type is
|
|
||||||
<tt>constructor<</tt><i>params</i><tt>></tt>, where <i>params</i>
|
|
||||||
matches the list of constructor argument types:
|
|
||||||
|
|
||||||
|
|
||||||
<li>Regular member functions are defined by calling <tt>def()</tt> with a
|
|
||||||
member function pointer and its Python name:
|
|
||||||
|
|
||||||
<li>Any function added to a class whose initial argument matches the class (or
|
|
||||||
any base) will act like a member function in Python.
|
|
||||||
|
|
||||||
<li>To define a nested class, just pass the enclosing
|
|
||||||
<tt>class_builder</tt> (instead of a <tt>module_builder</tt>) as the
|
|
||||||
first argument to the nested <tt>class_builder</tt>'s constructor.
|
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
<p>
|
|
||||||
We can even make a subclass of <code>hello.world</code>:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
>>> class wordy(hello):
|
|
||||||
... def greet(self):
|
|
||||||
... return hello.greet(self) + ', where the weather is fine'
|
|
||||||
...
|
|
||||||
>>> hi2 = wordy('Florida')
|
|
||||||
>>> hi2.greet()
|
|
||||||
'Hello from Florida, where the weather is fine'
|
|
||||||
>>> invite(hi2)
|
|
||||||
'Hello from Florida! Please come soon!'
|
|
||||||
</blockquote></pre>
|
|
||||||
<p>
|
|
||||||
Pretty cool! You can't do that with an ordinary Python extension type!
|
|
||||||
|
|
||||||
Of course, you may now have a slightly empty feeling in the pit of
|
|
||||||
your little pythonic stomach. Perhaps you wanted to see the following
|
|
||||||
<tt>wordy</tt> invitation:
|
|
||||||
|
|
||||||
<blockquote><pre>
|
|
||||||
'Hello from Florida, where the weather is fine! Please come soon!'
|
|
||||||
</blockquote></pre>
|
|
||||||
|
|
||||||
After all, <tt>invite</tt> calls <tt>hello::greet()</tt>, and you
|
|
||||||
reimplemented that in your Python subclass, <tt>wordy</tt>. If so, <a
|
|
||||||
href= "overriding.html">read on</a>...
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Next: <a href="overriding.html">Overridable virtual functions</a>
|
|
||||||
Previous: <a href="example1.html">A Simple Example</a> Up:
|
|
||||||
<a href="index.html">Top</a>
|
|
||||||
<p>
|
|
||||||
© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided "as is" without
|
|
||||||
express or implied warranty, and with no claim as to its suitability
|
|
||||||
for any purpose.
|
|
||||||
<p>
|
|
||||||
Updated: Mar 6, 2001
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
|
||||||
<title>
|
|
||||||
A Brief Introduction to writing Python extension modules
|
|
||||||
</title>
|
|
||||||
<h1>
|
|
||||||
<img src="../../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center"
|
|
||||||
width="277" height="86">
|
|
||||||
</h1>
|
|
||||||
<h1>
|
|
||||||
A Brief Introduction to writing Python extension modules
|
|
||||||
</h1>
|
|
||||||
<p>
|
|
||||||
Interfacing any language to Python involves building a module which can
|
|
||||||
be loaded by the Python interpreter, but which isn't written in Python.
|
|
||||||
This is known as an <em>extension module</em>. Many of the <a href=
|
|
||||||
"http://www.python.org/doc/current/lib/lib.html">built-in Python
|
|
||||||
libraries</a> are constructed in 'C' this way; Python even supplies its
|
|
||||||
<a href="http://www.python.org/doc/current/lib/types.html">fundamental
|
|
||||||
types</a> using the same mechanism. An extension module can be statically
|
|
||||||
linked with the Python interpreter, but it more commonly resides in a
|
|
||||||
shared library or DLL.
|
|
||||||
<p>
|
|
||||||
As you can see from <a href=
|
|
||||||
"http://www.python.org/doc/current/ext/ext.html"> The Python Extending
|
|
||||||
and Embedding Tutorial</a>, writing an extension module normally means
|
|
||||||
worrying about
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="http://www.python.org/doc/current/ext/refcounts.html">
|
|
||||||
maintaining reference counts</a>
|
|
||||||
<li>
|
|
||||||
<a href="http://www.python.org/doc/current/ext/callingPython.html"> how
|
|
||||||
to call back into Python</a>
|
|
||||||
<li>
|
|
||||||
<a href="http://www.python.org/doc/current/ext/parseTuple.html">
|
|
||||||
function argument parsing and typechecking</a>
|
|
||||||
</ul>
|
|
||||||
This last item typically occupies a great deal of code in an extension
|
|
||||||
module. Remember that Python is a completely dynamic language. A callable
|
|
||||||
object receives its arguments in a tuple; it is up to that object to extract
|
|
||||||
those arguments from the tuple, check their types, and raise appropriate
|
|
||||||
exceptions. There are numerous other tedious details that need to be
|
|
||||||
managed; too many to mention here. The Boost Python Library is designed to
|
|
||||||
lift most of that burden.<br>
|
|
||||||
<br>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Another obstacle that most people run into eventually when extending
|
|
||||||
Python is that there's no way to make a true Python class in an extension
|
|
||||||
module. The typical solution is to create a new Python type in the
|
|
||||||
extension module, and then write an additional module in 100% Python. The
|
|
||||||
Python module defines a Python class which dispatches to an instance of
|
|
||||||
the extension type, which it contains. This allows users to write
|
|
||||||
subclasses of the class in the Python module, almost as though they were
|
|
||||||
sublcassing the extension type. Aside from being tedious, it's not really
|
|
||||||
the same as having a true class, because there's no way for the user to
|
|
||||||
override a method of the extension type which is called from the
|
|
||||||
extension module. Boost.Python solves this problem by taking advantage of <a
|
|
||||||
href="http://www.python.org/doc/essays/metaclasses/">Python's metaclass
|
|
||||||
feature</a> to provide objects which look, walk, and hiss almost exactly
|
|
||||||
like regular Python classes. Boost.Python classes are actually cleaner than
|
|
||||||
Python classes in some subtle ways; a more detailed discussion will
|
|
||||||
follow (someday).</p>
|
|
||||||
<p>Next: <a href="comparisons.html">Comparisons with Other Systems</a> Up: <a
|
|
||||||
href="index.html">Top</a> </p>
|
|
||||||
<p>
|
|
||||||
© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
|
||||||
sell and distribute this document is granted provided this copyright
|
|
||||||
notice appears in all copies. This document is provided "as is" without
|
|
||||||
express or implied warranty, and with no claim as to its suitability for
|
|
||||||
any purpose.</p>
|
|
||||||
|
|
||||||
83
doc/fabscript
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# -*- python -*-
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 Stefan Seefeld
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
from faber.tools.xslt import xsltflags
|
||||||
|
from faber.tools.boost import quickbook, boostbook
|
||||||
|
from faber.artefacts import html
|
||||||
|
from glob import glob as G
|
||||||
|
from os import makedirs
|
||||||
|
from os.path import relpath, dirname, exists
|
||||||
|
from shutil import copyfile
|
||||||
|
|
||||||
|
|
||||||
|
def glob(pattern):
|
||||||
|
prefix = srcdir + '/'
|
||||||
|
p = len(prefix)+1
|
||||||
|
return [f[p:] for f in G(prefix + pattern)]
|
||||||
|
|
||||||
|
|
||||||
|
class make_html(action):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
action.__init__(self, 'make_html', self.process)
|
||||||
|
|
||||||
|
def map(self, fs):
|
||||||
|
return boostbook.html.map(fs)
|
||||||
|
|
||||||
|
def process(self, target, source):
|
||||||
|
boostbook.html(target, source[0:1])
|
||||||
|
for s in source[1:]:
|
||||||
|
t = target[0]._filename + relpath(s._filename, srcdir)
|
||||||
|
d = dirname(t)
|
||||||
|
if not exists(d):
|
||||||
|
makedirs(d)
|
||||||
|
copyfile(s._filename, t)
|
||||||
|
|
||||||
|
|
||||||
|
sphinx_build = action('sphinx-build', 'sphinx-build -b html $(>) $(<)')
|
||||||
|
rst2html = action('rst2html', 'rst2html --trim-footnote-reference-space --footnote-references=superscript --stylesheet=$(>:D)/rst.css $(>) $(<)')
|
||||||
|
|
||||||
|
python_bbk = rule(quickbook.process, 'python.bbk', 'python.qbk',
|
||||||
|
dependencies=['release_notes.qbk',
|
||||||
|
'building.qbk',
|
||||||
|
'configuration.qbk',
|
||||||
|
'suport.qbk',
|
||||||
|
'faq.qbk',
|
||||||
|
'glossary.qbk'])
|
||||||
|
tutorial_bbk = rule(quickbook.process, 'tutorial.bbk', 'tutorial.qbk')
|
||||||
|
reference_bbk = rule(quickbook.process, 'reference.bbk', 'reference.qbk')
|
||||||
|
|
||||||
|
python_db = rule(boostbook.db, 'python.db', python_bbk)
|
||||||
|
tutorial_db = rule(boostbook.db, 'tutorial.db', tutorial_bbk)
|
||||||
|
reference_db = rule(boostbook.db, 'reference.db', reference_bbk)
|
||||||
|
|
||||||
|
python = html.dir(make_html(), 'html', [python_db, 'boostbook.css'] + glob('/images/*.*') + glob('/images/callouts/*.*'),
|
||||||
|
features=xsltflags('--stringparam generate.toc "library nop; chaper toc; section toc;"',
|
||||||
|
'--stringparam html.stylesheet boostbook.css',
|
||||||
|
'--stringparam boost.image.src images/bpl.png',
|
||||||
|
'--stringparam boost.graphics.root images/',
|
||||||
|
'--stringparam boost.defaults none',
|
||||||
|
'--param toc.max.depth 3',
|
||||||
|
'--param toc.section.depth 2',
|
||||||
|
'--param chunk.section.depth 1'))
|
||||||
|
tutorial = html.dir(boostbook.html, 'html/tutorial', tutorial_db, dependencies=[python],
|
||||||
|
features=xsltflags('--stringparam html.stylesheet ../boostbook.css',
|
||||||
|
'--stringparam boost.image.src ../images/bpl.png',
|
||||||
|
'--stringparam boost.graphics.root ../images/'))
|
||||||
|
reference = html.dir(boostbook.html, 'html/reference', reference_db, dependencies=[python],
|
||||||
|
features=xsltflags('--stringparam html.stylesheet ../boostbook.css',
|
||||||
|
'--stringparam boost.image.src ../images/bpl.png',
|
||||||
|
'--stringparam boost.graphics.root ../images/'))
|
||||||
|
numpy = rule(sphinx_build, 'html/numpy', 'numpy', attrs=always, dependencies=[python])
|
||||||
|
|
||||||
|
article = rule(rst2html, 'html/article.html', 'article.rst')
|
||||||
|
|
||||||
|
html = alias('html', [python, tutorial, reference, numpy, article])
|
||||||
|
|
||||||
|
default = html
|
||||||
736
doc/faq.qbk
Normal file
@@ -0,0 +1,736 @@
|
|||||||
|
[chapter Frequently Asked Questions (FAQs)
|
||||||
|
[quickbook 1.7]
|
||||||
|
[id faq]
|
||||||
|
]
|
||||||
|
|
||||||
|
[section How can I wrap a function which takes a function pointer as an argument?]
|
||||||
|
|
||||||
|
If what you're trying to do is something like this:
|
||||||
|
``
|
||||||
|
typedef boost::function<void (string s) > funcptr;
|
||||||
|
|
||||||
|
void foo(funcptr fp)
|
||||||
|
{
|
||||||
|
fp("hello,world!");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE(test)
|
||||||
|
{
|
||||||
|
def("foo",foo);
|
||||||
|
}
|
||||||
|
``
|
||||||
|
|
||||||
|
And then:
|
||||||
|
|
||||||
|
``
|
||||||
|
>>> def hello(s):
|
||||||
|
... print s
|
||||||
|
...
|
||||||
|
>>> foo(hello)
|
||||||
|
hello, world!
|
||||||
|
``
|
||||||
|
The short answer is: "you can't". This is not a
|
||||||
|
Boost.Python limitation so much as a limitation of C++. The
|
||||||
|
problem is that a Python function is actually data, and the only
|
||||||
|
way of associating data with a C++ function pointer is to store it
|
||||||
|
in a static variable of the function. The problem with that is
|
||||||
|
that you can only associate one piece of data with every C++
|
||||||
|
function, and we have no way of compiling a new C++ function
|
||||||
|
on-the-fly for every Python function you decide to pass
|
||||||
|
to `foo`. In other words, this could work if the C++
|
||||||
|
function is always going to invoke the /same/ Python
|
||||||
|
function, but you probably don't want that.
|
||||||
|
|
||||||
|
If you have the luxury of changing the C++ code you're
|
||||||
|
wrapping, pass it an `object` instead and call that;
|
||||||
|
the overloaded function call operator will invoke the Python
|
||||||
|
function you pass it behind the `object`.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section I'm getting the "attempt to return dangling reference" error.
|
||||||
|
What am I doing wrong?]
|
||||||
|
|
||||||
|
That exception is protecting you from causing a nasty crash. It usually
|
||||||
|
happens in response to some code like this:
|
||||||
|
``
|
||||||
|
period const &get_floating_frequency() const
|
||||||
|
{
|
||||||
|
return boost::python::call_method<period const &>(
|
||||||
|
m_self,"get_floating_frequency");
|
||||||
|
}
|
||||||
|
``
|
||||||
|
And you get:
|
||||||
|
``
|
||||||
|
ReferenceError: Attempt to return dangling reference to object of type:
|
||||||
|
class period
|
||||||
|
``
|
||||||
|
|
||||||
|
In this case, the Python method invoked by `call_method`
|
||||||
|
constructs a new Python object. You're trying to return a reference to a
|
||||||
|
C++ object (an instance of `class period`) contained within
|
||||||
|
and owned by that Python object. Because the called method handed back a
|
||||||
|
brand new object, the only reference to it is held for the duration of
|
||||||
|
`get_floating_frequency()` above. When the function returns,
|
||||||
|
the Python object will be destroyed, destroying the instance of
|
||||||
|
`class period`, and leaving the returned reference dangling.
|
||||||
|
That's already undefined behavior, and if you try to do anything with
|
||||||
|
that reference you're likely to cause a crash. Boost.Python detects this
|
||||||
|
situation at runtime and helpfully throws an exception instead of letting
|
||||||
|
you do that.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Is `return_internal_reference` efficient?]
|
||||||
|
|
||||||
|
[*Q:] /I have an object composed of 12 doubles. A `const&` to
|
||||||
|
this object is returned by a member function of another class. From the
|
||||||
|
viewpoint of using the returned object in Python I do not care if I get
|
||||||
|
a copy or a reference to the returned object. In Boost.Python I have the
|
||||||
|
choice of using `copy_const_reference` or `return_internal_reference`.
|
||||||
|
Are there considerations that would lead me to prefer one over the other,
|
||||||
|
such as size of generated code or memory overhead?/
|
||||||
|
|
||||||
|
[*A:] `copy_const_reference` will make an instance with storage
|
||||||
|
for one of your objects, `size = base_size + 12 * sizeof(double)`.
|
||||||
|
`return_internal_reference` will make an instance with storage for a
|
||||||
|
pointer to one of your objects, `size = base_size + sizeof(void*)`.
|
||||||
|
However, it will also create a weak reference object which goes in the
|
||||||
|
source object's weakreflist and a special callback object to manage the
|
||||||
|
lifetime of the internally-referenced object. My guess?
|
||||||
|
`copy_const_reference` is your friend here, resulting in less overall
|
||||||
|
memory use and less fragmentation, also probably fewer total
|
||||||
|
cycles.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section How can I wrap functions which take C++ containers as arguments?]
|
||||||
|
|
||||||
|
Ralf W. Grosse-Kunstleve provides these notes:
|
||||||
|
|
||||||
|
# Using the regular `class_<>` wrapper:
|
||||||
|
``
|
||||||
|
class_<std::vector<double> >("std_vector_double")
|
||||||
|
.def(...)
|
||||||
|
...
|
||||||
|
;
|
||||||
|
``
|
||||||
|
This can be moved to a template so that several types (`double`, `int`,
|
||||||
|
`long`, etc.) can be wrapped with the same code. This technique is used
|
||||||
|
in the file `scitbx/include/scitbx/array_family/boost_python/flex_wrapper.h`
|
||||||
|
in the "scitbx" package. The file could easily be modified for
|
||||||
|
wrapping `std::vector<>` instantiations.
|
||||||
|
This type of C++/Python binding is most suitable for containers
|
||||||
|
that may contain a large number of elements (>10000).
|
||||||
|
|
||||||
|
# Using custom rvalue converters. Boost.Python "rvalue converters"
|
||||||
|
match function signatures such as:
|
||||||
|
``
|
||||||
|
void foo(std::vector<double> const &array); // pass by const-reference
|
||||||
|
void foo(std::vector<double> array); // pass by value
|
||||||
|
``
|
||||||
|
Some custom rvalue converters are implemented in the file
|
||||||
|
`scitbx/include/scitbx/boost_python/container_conversions.h`
|
||||||
|
This code can be used to convert from C++ container types such as
|
||||||
|
`std::vector<>` or `std::list<>` to Python tuples and vice
|
||||||
|
versa. A few simple examples can be found in the file
|
||||||
|
`scitbx/array_family/boost_python/regression_test_module.cpp`
|
||||||
|
Automatic C++ container <-> Python tuple conversions are most
|
||||||
|
suitable for containers of moderate size. These converters generate
|
||||||
|
significantly less object code compared to alternative 1 above.
|
||||||
|
|
||||||
|
A disadvantage of using alternative 2 is that operators such as
|
||||||
|
arithmetic +,-,*,/,% are not available. It would be useful to have custom
|
||||||
|
rvalue converters that convert to a "math_array" type instead of tuples.
|
||||||
|
This is currently not implemented but is possible within the framework of
|
||||||
|
Boost.Python V2 as it will be released in the next couple of weeks. [ed.:
|
||||||
|
this was posted on 2002/03/10]
|
||||||
|
|
||||||
|
It would also be useful to also have "custom lvalue converters" such
|
||||||
|
as `std::vector<>` <-> Python list. These converters would
|
||||||
|
support the modification of the Python list from C++. For example:
|
||||||
|
|
||||||
|
C++:
|
||||||
|
``
|
||||||
|
void foo(std::vector<double> &array)
|
||||||
|
{
|
||||||
|
for(std::size_t i=0;i<array.size();i++) {
|
||||||
|
array[i] *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
``
|
||||||
|
Python: [python]
|
||||||
|
``
|
||||||
|
>>> l = [1, 2, 3]
|
||||||
|
>>> foo(l)
|
||||||
|
>>> print l
|
||||||
|
[2, 4, 6]
|
||||||
|
``
|
||||||
|
Custom lvalue converters require changes to the Boost.Python core library
|
||||||
|
and are currently not available.
|
||||||
|
|
||||||
|
P.S.:
|
||||||
|
|
||||||
|
The "scitbx" files referenced above are available via anonymous
|
||||||
|
CVS:
|
||||||
|
``
|
||||||
|
cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx login
|
||||||
|
cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx co scitbx
|
||||||
|
``
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section fatal error C1204:Compiler limit:internal structure overflow]
|
||||||
|
|
||||||
|
[*Q:] /I get this error message when compiling a large source file. What can I do?/
|
||||||
|
|
||||||
|
[*A:] You have two choices:
|
||||||
|
|
||||||
|
# Upgrade your compiler (preferred)
|
||||||
|
|
||||||
|
# Break your source file up into multiple translation units.
|
||||||
|
|
||||||
|
`my_module.cpp`: [c++]
|
||||||
|
|
||||||
|
``
|
||||||
|
...
|
||||||
|
void more_of_my_module();
|
||||||
|
BOOST_PYTHON_MODULE(my_module)
|
||||||
|
{
|
||||||
|
def("foo", foo);
|
||||||
|
def("bar", bar);
|
||||||
|
...
|
||||||
|
more_of_my_module();
|
||||||
|
}
|
||||||
|
``
|
||||||
|
`more_of_my_module.cpp`:
|
||||||
|
``
|
||||||
|
void more_of_my_module()
|
||||||
|
{
|
||||||
|
def("baz", baz);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
``
|
||||||
|
If you find that a `class_<...>` declaration
|
||||||
|
can't fit in a single source file without triggering the error, you
|
||||||
|
can always pass a reference to the `class_` object to a
|
||||||
|
function in another source file, and call some of its member
|
||||||
|
functions (e.g. `.def(...)`) in the auxilliary source
|
||||||
|
file:
|
||||||
|
|
||||||
|
`more_of_my_class.cpp`:
|
||||||
|
``
|
||||||
|
void more_of_my_class(class<my_class>& x)
|
||||||
|
{
|
||||||
|
x
|
||||||
|
.def("baz", baz)
|
||||||
|
.add_property("xx", &my_class::get_xx, &my_class::set_xx)
|
||||||
|
;
|
||||||
|
...
|
||||||
|
}
|
||||||
|
``
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section How do I debug my Python extensions?]
|
||||||
|
|
||||||
|
Greg Burley gives the following answer for Unix GCC users:
|
||||||
|
|
||||||
|
[:Once you have created a boost python extension for your c++ library or
|
||||||
|
class, you may need to debug the code. Afterall this is one of the
|
||||||
|
reasons for wrapping the library in python. An expected side-effect or
|
||||||
|
benefit of using BPL is that debugging should be isolated to the c++
|
||||||
|
library that is under test, given that python code is minimal and
|
||||||
|
boost::python either works or it doesn't. (ie. While errors can occur
|
||||||
|
when the wrapping method is invalid, most errors are caught by the
|
||||||
|
compiler ;-).
|
||||||
|
|
||||||
|
The basic steps required to initiate a gdb session to debug a c++
|
||||||
|
library via python are shown here. Note, however that you should start
|
||||||
|
the gdb session in the directory that contains your BPL my_ext.so
|
||||||
|
module.
|
||||||
|
|
||||||
|
``
|
||||||
|
(gdb) target exec python
|
||||||
|
(gdb) run
|
||||||
|
>>> from my_ext import *
|
||||||
|
>>> [C-c]
|
||||||
|
(gdb) break MyClass::MyBuggyFunction
|
||||||
|
(gdb) cont
|
||||||
|
>>> pyobj = MyClass()
|
||||||
|
>>> pyobj.MyBuggyFunction()
|
||||||
|
Breakpoint 1, MyClass::MyBuggyFunction ...
|
||||||
|
Current language: auto; currently c++
|
||||||
|
(gdb) do debugging stuff
|
||||||
|
``
|
||||||
|
]
|
||||||
|
|
||||||
|
Greg's approach works even better using Emacs' "gdb"
|
||||||
|
command, since it will show you each line of source as you step through it.
|
||||||
|
|
||||||
|
On *Windows*, my favorite debugging solution is the debugger that
|
||||||
|
comes with Microsoft Visual C++ 7. This debugger seems to work with code
|
||||||
|
generated by all versions of Microsoft and Metrowerks toolsets; it's rock
|
||||||
|
solid and "just works" without requiring any special tricks from the
|
||||||
|
user.
|
||||||
|
|
||||||
|
Raoul Gough has provided the following for gdb on Windows:
|
||||||
|
|
||||||
|
[:gdb support for Windows DLLs has improved lately, so it is
|
||||||
|
now possible to debug Python extensions using a few
|
||||||
|
tricks. Firstly, you will need an up-to-date gdb with support
|
||||||
|
for minimal symbol extraction from a DLL. Any gdb from version 6
|
||||||
|
onwards, or Cygwin gdb-20030214-1 and onwards should do. A
|
||||||
|
suitable release will have a section in the gdb.info file under
|
||||||
|
Configuration - Native - Cygwin Native -
|
||||||
|
Non-debug DLL symbols. Refer to that info section for more
|
||||||
|
details of the procedures outlined here.
|
||||||
|
|
||||||
|
Secondly, it seems necessary to set a breakpoint in the
|
||||||
|
Python interpreter, rather than using ^C to break execution. A
|
||||||
|
good place to set this breakpoint is PyOS_Readline, which will
|
||||||
|
stop execution immediately before reading each interactive
|
||||||
|
Python command. You have to let Python start once under the
|
||||||
|
debugger, so that it loads its own DLL, before you can set the
|
||||||
|
breakpoint:
|
||||||
|
|
||||||
|
``
|
||||||
|
$ gdb python
|
||||||
|
GNU gdb 2003-09-02-cvs (cygwin-special)
|
||||||
|
[...]
|
||||||
|
|
||||||
|
(gdb) run
|
||||||
|
Starting program: /cygdrive/c/Python22/python.exe
|
||||||
|
Python 2.2.2 (#37, Oct 14 2002, 17:02:34) [MSC 32 bit (Intel)] on win32
|
||||||
|
Type "help", "copyright", "credits" or "license" for more information.
|
||||||
|
>>> ^Z
|
||||||
|
|
||||||
|
|
||||||
|
Program exited normally.
|
||||||
|
(gdb) break *&PyOS_Readline
|
||||||
|
Breakpoint 1 at 0x1e04eff0
|
||||||
|
(gdb) run
|
||||||
|
Starting program: /cygdrive/c/Python22/python.exe
|
||||||
|
Python 2.2.2 (#37, Oct 14 2002, 17:02:34) [MSC 32 bit (Intel)] on win32
|
||||||
|
Type "help", "copyright", "credits" or "license" for more information.
|
||||||
|
|
||||||
|
Breakpoint 1, 0x1e04eff0 in python22!PyOS_Readline ()
|
||||||
|
from /cygdrive/c/WINNT/system32/python22.dll
|
||||||
|
(gdb) cont
|
||||||
|
Continuing.
|
||||||
|
>>> from my_ext import *
|
||||||
|
|
||||||
|
Breakpoint 1, 0x1e04eff0 in python22!PyOS_Readline ()
|
||||||
|
from /cygdrive/c/WINNT/system32/python22.dll
|
||||||
|
(gdb) # my_ext now loaded (with any debugging symbols it contains)
|
||||||
|
``
|
||||||
|
]
|
||||||
|
|
||||||
|
[h2 Debugging extensions through Boost.Build]
|
||||||
|
|
||||||
|
If you are launching your extension module tests with _bb_ using the
|
||||||
|
`boost-python-runtest` rule, you can ask it to launch your
|
||||||
|
debugger for you by adding "--debugger=/debugger/" to your bjam
|
||||||
|
command-line:
|
||||||
|
``
|
||||||
|
bjam -sTOOLS=vc7.1 "--debugger=devenv /debugexe" test
|
||||||
|
bjam -sTOOLS=gcc -sPYTHON_LAUNCH=gdb test
|
||||||
|
``
|
||||||
|
It can also be extremely useful to add the `-d+2` option when
|
||||||
|
you run your test, because Boost.Build will then show you the exact
|
||||||
|
commands it uses to invoke it. This will invariably involve setting up
|
||||||
|
PYTHONPATH and other important environment variables such as
|
||||||
|
LD_LIBRARY_PATH which may be needed by your debugger in order to get
|
||||||
|
things to work right.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Why doesn't my `*=` operator work?]
|
||||||
|
|
||||||
|
[*Q:] ['I have exported my class to python, with many overloaded
|
||||||
|
operators. it works fine for me except the `*=`
|
||||||
|
operator. It always tells me "can't multiply sequence with non int
|
||||||
|
type". If I use `p1.__imul__(p2)` instead of
|
||||||
|
`p1 *= p2`, it successfully executes my code. What's
|
||||||
|
wrong with me?]
|
||||||
|
|
||||||
|
[*A:] There's nothing wrong with you. This is a bug in Python
|
||||||
|
2.2. You can see the same effect in Pure Python (you can learn a lot
|
||||||
|
about what's happening in Boost.Python by playing with new-style
|
||||||
|
classes in Pure Python).
|
||||||
|
``
|
||||||
|
>>> class X(object):
|
||||||
|
... def __imul__(self, x):
|
||||||
|
... print 'imul'
|
||||||
|
...
|
||||||
|
>>> x = X()
|
||||||
|
>>> x *= 1
|
||||||
|
``
|
||||||
|
To cure this problem, all you need to do is upgrade your Python to
|
||||||
|
version 2.2.1 or later.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Does Boost.Python work with Mac OS X?]
|
||||||
|
|
||||||
|
It is known to work under 10.2.8 and 10.3 using
|
||||||
|
Apple's gcc 3.3 compiler:
|
||||||
|
``gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1493)``
|
||||||
|
Under 10.2.8 get the August 2003 gcc update (free at [@http://connect.apple.com]).
|
||||||
|
Under 10.3 get the Xcode Tools v1.0 (also free).
|
||||||
|
|
||||||
|
Python 2.3 is required. The Python that ships with 10.3 is
|
||||||
|
fine. Under 10.2.8 use these commands to install Python
|
||||||
|
as a framework:
|
||||||
|
``./configure --enable-framework
|
||||||
|
make
|
||||||
|
make frameworkinstall``
|
||||||
|
|
||||||
|
The last command requires root privileges because the target
|
||||||
|
directory is `/Library/Frameworks/Python.framework/Versions/2.3`.
|
||||||
|
However, the installation does not interfere with the Python
|
||||||
|
version that ships with 10.2.8.
|
||||||
|
|
||||||
|
It is also crucial to increase the `stacksize` before
|
||||||
|
starting compilations, e.g.:
|
||||||
|
``limit stacksize 8192k``
|
||||||
|
If the `stacksize` is too small the build might crash with
|
||||||
|
internal compiler errors.
|
||||||
|
|
||||||
|
Sometimes Apple's compiler exhibits a bug by printing an error
|
||||||
|
like the following while compiling a
|
||||||
|
`boost::python::class_<your_type>`
|
||||||
|
template instantiation:
|
||||||
|
``
|
||||||
|
.../inheritance.hpp:44: error: cannot
|
||||||
|
dynamic_cast `p' (of type `struct cctbx::boost_python::<unnamed>::add_pair*
|
||||||
|
') to type `void*' (source type is not polymorphic)
|
||||||
|
``
|
||||||
|
|
||||||
|
We do not know a general workaround, but if the definition of
|
||||||
|
`your_type` can be modified the following was found
|
||||||
|
to work in all cases encountered so far:
|
||||||
|
``
|
||||||
|
struct your_type
|
||||||
|
{
|
||||||
|
// before defining any member data
|
||||||
|
#if defined(__MACH__) && defined(__APPLE_CC__) && __APPLE_CC__ == 1493
|
||||||
|
bool dummy_;
|
||||||
|
#endif
|
||||||
|
// now your member data, e.g.
|
||||||
|
double x;
|
||||||
|
int j;
|
||||||
|
// etc.
|
||||||
|
};
|
||||||
|
``
|
||||||
|
[endsect]
|
||||||
|
[section How can I find the existing PyObject that holds a C++ object?]
|
||||||
|
|
||||||
|
[: "I am wrapping a function that always returns a pointer to an
|
||||||
|
already-held C++ object."]
|
||||||
|
|
||||||
|
One way to do that is to hijack the mechanisms used for wrapping a class
|
||||||
|
with virtual functions. If you make a wrapper class with an initial
|
||||||
|
PyObject* constructor argument and store that PyObject* as "self", you
|
||||||
|
can get back to it by casting down to that wrapper type in a thin wrapper
|
||||||
|
function. For example:
|
||||||
|
``
|
||||||
|
class X { X(int); virtual ~X(); ... };
|
||||||
|
X* f(); // known to return Xs that are managed by Python objects
|
||||||
|
|
||||||
|
|
||||||
|
// wrapping code
|
||||||
|
|
||||||
|
struct X_wrap : X
|
||||||
|
{
|
||||||
|
X_wrap(PyObject* self, int v) : self(self), X(v) {}
|
||||||
|
PyObject* self;
|
||||||
|
};
|
||||||
|
|
||||||
|
handle<> f_wrap()
|
||||||
|
{
|
||||||
|
X_wrap* xw = dynamic_cast<X_wrap*>(f());
|
||||||
|
assert(xw != 0);
|
||||||
|
return handle<>(borrowed(xw->self));
|
||||||
|
}
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
def("f", f_wrap());
|
||||||
|
class_<X,X_wrap,boost::noncopyable>("X", init<int>())
|
||||||
|
...
|
||||||
|
;
|
||||||
|
``
|
||||||
|
|
||||||
|
Of course, if X has no virtual functions you'll have to use
|
||||||
|
`static_cast` instead of `dynamic_cast` with no
|
||||||
|
runtime check that it's valid. This approach also only works if the
|
||||||
|
`X` object was constructed from Python, because
|
||||||
|
`X`\ s constructed from C++ are of course never
|
||||||
|
`X_wrap` objects.
|
||||||
|
|
||||||
|
Another approach to this requires you to change your C++ code a bit;
|
||||||
|
if that's an option for you it might be a better way to go. work we've
|
||||||
|
been meaning to get to anyway. When a `shared_ptr<X>` is
|
||||||
|
converted from Python, the shared_ptr actually manages a reference to the
|
||||||
|
containing Python object. When a shared_ptr<X> is converted back to
|
||||||
|
Python, the library checks to see if it's one of those "Python object
|
||||||
|
managers" and if so just returns the original Python object. So you could
|
||||||
|
just write `object(p)` to get the Python object back. To
|
||||||
|
exploit this you'd have to be able to change the C++ code you're wrapping
|
||||||
|
so that it deals with shared_ptr instead of raw pointers.
|
||||||
|
|
||||||
|
There are other approaches too. The functions that receive the Python
|
||||||
|
object that you eventually want to return could be wrapped with a thin
|
||||||
|
wrapper that records the correspondence between the object address and
|
||||||
|
its containing Python object, and you could have your f_wrap function
|
||||||
|
look in that mapping to get the Python object out.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section How can I wrap a function which needs to take ownership of a raw pointer?]
|
||||||
|
|
||||||
|
[*Q:] Part of an API that I'm wrapping goes something like this:
|
||||||
|
|
||||||
|
``
|
||||||
|
struct A {}; struct B { void add( A* ); }
|
||||||
|
where B::add() takes ownership of the pointer passed to it.
|
||||||
|
``
|
||||||
|
|
||||||
|
However:
|
||||||
|
|
||||||
|
``
|
||||||
|
a = mod.A()
|
||||||
|
b = mod.B()
|
||||||
|
b.add( a )
|
||||||
|
del a
|
||||||
|
del b
|
||||||
|
# python interpreter crashes
|
||||||
|
# later due to memory corruption.
|
||||||
|
``
|
||||||
|
|
||||||
|
Even binding the lifetime of a to b via `with_custodian_and_ward` doesn't prevent
|
||||||
|
the python object a from ultimately trying to delete the object it's pointing to.
|
||||||
|
Is there a way to accomplish a 'transfer-of-ownership' of a wrapped C++ object?
|
||||||
|
|
||||||
|
--Bruce Lowery
|
||||||
|
|
||||||
|
Yes: Make sure the C++ object is held by auto_ptr:
|
||||||
|
``
|
||||||
|
class_<A, std::auto_ptr<A> >("A")
|
||||||
|
...
|
||||||
|
;
|
||||||
|
``
|
||||||
|
Then make a thin wrapper function which takes an auto_ptr parameter:
|
||||||
|
``
|
||||||
|
void b_insert(B &b, std::auto_ptr<A> a)
|
||||||
|
{
|
||||||
|
b.insert(a.get());
|
||||||
|
a.release();
|
||||||
|
}
|
||||||
|
``
|
||||||
|
Wrap that as B.add. Note that pointers returned via `manage_new_object`
|
||||||
|
will also be held by `auto_ptr`, so this transfer-of-ownership
|
||||||
|
will also work correctly.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Compilation takes too much time and eats too much memory!
|
||||||
|
What can I do to make it faster?]
|
||||||
|
|
||||||
|
Please refer to the `Reducing Compiling Time` section in the _tutorial_.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section How do I create sub-packages using Boost.Python?]
|
||||||
|
|
||||||
|
Please refer to the `Creating Packages` section in the _tutorial_.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section error C2064: term does not evaluate to a function taking 2 arguments]
|
||||||
|
|
||||||
|
/Niall Douglas provides these notes:/
|
||||||
|
|
||||||
|
If you see Microsoft Visual C++ 7.1 (MS Visual Studio .NET 2003) issue
|
||||||
|
an error message like the following it is most likely due to a bug
|
||||||
|
in the compiler:
|
||||||
|
``
|
||||||
|
boost\boost\python\detail\invoke.hpp(76):
|
||||||
|
error C2064: term does not evaluate to a function taking 2 arguments"
|
||||||
|
``
|
||||||
|
This message is triggered by code like the following:
|
||||||
|
``
|
||||||
|
#include <boost/python.hpp>
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
class FXThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool setAutoDelete(bool doso) throw();
|
||||||
|
};
|
||||||
|
|
||||||
|
void Export_FXThread()
|
||||||
|
{
|
||||||
|
class_< FXThread >("FXThread")
|
||||||
|
.def("setAutoDelete", &FXThread::setAutoDelete)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
``
|
||||||
|
The bug is related to the `throw()` modifier.
|
||||||
|
As a workaround cast off the modifier. E.g.:
|
||||||
|
``
|
||||||
|
.def("setAutoDelete", (bool (FXThread::*)(bool)) &FXThread::setAutoDelete)
|
||||||
|
``
|
||||||
|
(The bug has been reported to Microsoft.)
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section How can I automatically convert my custom string type to and from a Python string?]
|
||||||
|
|
||||||
|
/Ralf W. Grosse-Kunstleve provides these notes:/
|
||||||
|
|
||||||
|
Below is a small, self-contained demo extension module that shows
|
||||||
|
how to do this. Here is the corresponding trivial test:
|
||||||
|
``
|
||||||
|
import custom_string
|
||||||
|
assert custom_string.hello() == "Hello world."
|
||||||
|
assert custom_string.size("california") == 10
|
||||||
|
``
|
||||||
|
If you look at the code you will find:
|
||||||
|
|
||||||
|
* A custom `to_python` converter (easy):
|
||||||
|
`custom_string_to_python_str`
|
||||||
|
|
||||||
|
*A custom lvalue converter (needs more code):
|
||||||
|
`custom_string_from_python_str`
|
||||||
|
|
||||||
|
The custom converters are registered in the global Boost.Python
|
||||||
|
registry near the top of the module initialization function. Once
|
||||||
|
flow control has passed through the registration code the automatic
|
||||||
|
conversions from and to Python strings will work in any module
|
||||||
|
imported in the same process.
|
||||||
|
|
||||||
|
``
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/def.hpp>
|
||||||
|
#include <boost/python/to_python_converter.hpp>
|
||||||
|
|
||||||
|
namespace sandbox { namespace {
|
||||||
|
|
||||||
|
class custom_string
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
custom_string() {}
|
||||||
|
custom_string(std::string const &value) : value_(value) {}
|
||||||
|
std::string const &value() const { return value_; }
|
||||||
|
private:
|
||||||
|
std::string value_;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct custom_string_to_python_str
|
||||||
|
{
|
||||||
|
static PyObject* convert(custom_string const &s)
|
||||||
|
{
|
||||||
|
return boost::python::incref(boost::python::object(s.value()).ptr());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct custom_string_from_python_str
|
||||||
|
{
|
||||||
|
custom_string_from_python_str()
|
||||||
|
{
|
||||||
|
boost::python::converter::registry::push_back(
|
||||||
|
&convertible,
|
||||||
|
&construct,
|
||||||
|
boost::python::type_id<custom_string>());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* convertible(PyObject* obj_ptr)
|
||||||
|
{
|
||||||
|
if (!PyString_Check(obj_ptr)) return 0;
|
||||||
|
return obj_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void construct(
|
||||||
|
PyObject* obj_ptr,
|
||||||
|
boost::python::converter::rvalue_from_python_stage1_data* data)
|
||||||
|
{
|
||||||
|
const char* value = PyString_AsString(obj_ptr);
|
||||||
|
if (value == 0) boost::python::throw_error_already_set();
|
||||||
|
void* storage = (
|
||||||
|
(boost::python::converter::rvalue_from_python_storage<custom_string>*)
|
||||||
|
data)->storage.bytes;
|
||||||
|
new (storage) custom_string(value);
|
||||||
|
data->convertible = storage;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
custom_string hello() { return custom_string("Hello world."); }
|
||||||
|
|
||||||
|
std::size_t size(custom_string const &s) { return s.value().size(); }
|
||||||
|
|
||||||
|
void init_module()
|
||||||
|
{
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
boost::python::to_python_converter<
|
||||||
|
custom_string,
|
||||||
|
custom_string_to_python_str>();
|
||||||
|
|
||||||
|
custom_string_from_python_str();
|
||||||
|
|
||||||
|
def("hello", hello);
|
||||||
|
def("size", size);
|
||||||
|
}
|
||||||
|
|
||||||
|
}} // namespace sandbox::<anonymous>
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE(custom_string)
|
||||||
|
{
|
||||||
|
sandbox::init_module();
|
||||||
|
}
|
||||||
|
``
|
||||||
|
[endsect]
|
||||||
|
[section Why is my automatic to-python conversion not being found?]
|
||||||
|
|
||||||
|
/Niall Douglas provides these notes:/
|
||||||
|
|
||||||
|
If you define custom converters similar to the ones
|
||||||
|
shown above the `def_readonly()` and `def_readwrite()`
|
||||||
|
member functions provided by `boost::python::class_` for
|
||||||
|
direct access to your member data will not work as expected.
|
||||||
|
This is because `def_readonly("bar",&foo::bar)` is
|
||||||
|
equivalent to:
|
||||||
|
|
||||||
|
``
|
||||||
|
.add_property("bar", make_getter(&foo::bar, return_internal_reference()))
|
||||||
|
``
|
||||||
|
Similarly, `def_readwrite("bar",&foo::bar)` is
|
||||||
|
equivalent to:
|
||||||
|
|
||||||
|
``
|
||||||
|
.add_property("bar", make_getter(&foo::bar, return_internal_reference()),
|
||||||
|
make_setter(&foo::bar, return_internal_reference())
|
||||||
|
``
|
||||||
|
In order to define return value policies compatible with the
|
||||||
|
custom conversions replace `def_readonly()` and
|
||||||
|
`def_readwrite()` by `add_property()`. E.g.:
|
||||||
|
|
||||||
|
``
|
||||||
|
.add_property("bar", make_getter(&foo::bar, return_value_policy<return_by_value>()),
|
||||||
|
make_setter(&foo::bar, return_value_policy<return_by_value>()))
|
||||||
|
``
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
[section Is Boost.Python thread-aware/compatible with multiple interpreters?]
|
||||||
|
|
||||||
|
/Niall Douglas provides these notes:/
|
||||||
|
|
||||||
|
The quick answer to this is: no.
|
||||||
|
|
||||||
|
The longer answer is that it can be patched to be so, but it's
|
||||||
|
complex. You will need to add custom lock/unlock wrapping of every
|
||||||
|
time your code enters Boost.Python (particularly every virtual
|
||||||
|
function override) plus heavily modify
|
||||||
|
`boost/python/detail/invoke.hpp` with custom unlock/lock
|
||||||
|
wrapping of every time Boost.Python enters your code. You must
|
||||||
|
furthermore take care to /not/ unlock/lock when Boost.Python
|
||||||
|
is invoking iterator changes via `invoke.hpp`.
|
||||||
|
|
||||||
|
There is a patched `invoke.hpp` posted on the C++-SIG
|
||||||
|
mailing list archives and you can find a real implementation of all
|
||||||
|
the machinery necessary to fully implement this in the TnFOX
|
||||||
|
project at [@http://sourceforge.net/projects/tnfox/ this]
|
||||||
|
SourceForge project location.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
38
doc/glossary.qbk
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
[chapter Glossary
|
||||||
|
[quickbook 1.7]
|
||||||
|
[id glossary]
|
||||||
|
]
|
||||||
|
|
||||||
|
[variablelist
|
||||||
|
[[arity [#arity]]
|
||||||
|
[The number of argumnts accepted by a function or member function.
|
||||||
|
Unless otherwise specified, the hidden `this` argument to member
|
||||||
|
functions is not counted when specifying arity.]]
|
||||||
|
[[ntbs [#ntbs]]
|
||||||
|
[Null-Terminated Byte String, or 'C'-string. C++ string literals are *ntbs*\ es.
|
||||||
|
An *ntbs* must never be null.]]
|
||||||
|
[[raise [#raise]]
|
||||||
|
[Exceptions in Python are "raised", not "thrown", as they are in C++.
|
||||||
|
When this documentation says that some Python exception is "raised" in
|
||||||
|
the context of C++ code, it means that the corresponding Python exception
|
||||||
|
is set via the [@http://www.python.org/doc/current/api/exceptionHandling.html Python/'C' API],
|
||||||
|
and `throw_error_already_set()` is called.]]
|
||||||
|
[[POD [#pod]]
|
||||||
|
[A technical term from the C++ standard. Short for "Plain Ol'Data":
|
||||||
|
A POD-struct is an aggregate class that has no non-static data members
|
||||||
|
of type pointer to member, non-POD-struct, non-POD-union (or array of such
|
||||||
|
types) or reference, and has no user-defined copy assign- ment operator and
|
||||||
|
no user-defined destructor. Similarly, a POD-union is an aggregate union that
|
||||||
|
has no non-static data members of type pointer to member, non-POD-struct,
|
||||||
|
non-POD-union (or array of such types) or reference, and has no
|
||||||
|
user-defined copy assignment operator and no user-defined destructor. A
|
||||||
|
POD class is a class that is either a POD-struct or a POD-union. An
|
||||||
|
aggregate is an array or a class (clause 9) with no user-declared
|
||||||
|
constructors (12.1), no private or protected non-static data members
|
||||||
|
(clause 11), no base classes (clause 10), and no virtual functions
|
||||||
|
(10.3).]]
|
||||||
|
[[ODR [#odr]]
|
||||||
|
[The "One Definition Rule", which says that any entity in a C++ program must have
|
||||||
|
the same definition in all translation units (object files) which make up a program.]]
|
||||||
|
]
|
||||||
|
|
||||||
66
doc/html/boost.css
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
/*=============================================================================
|
||||||
|
Copyright 2002 William E. Kempf
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompany-
|
||||||
|
ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
H1
|
||||||
|
{
|
||||||
|
FONT-SIZE: 200%;
|
||||||
|
COLOR: #00008B;
|
||||||
|
}
|
||||||
|
H2
|
||||||
|
{
|
||||||
|
FONT-SIZE: 150%;
|
||||||
|
}
|
||||||
|
H3
|
||||||
|
{
|
||||||
|
FONT-SIZE: 125%;
|
||||||
|
}
|
||||||
|
H4
|
||||||
|
{
|
||||||
|
FONT-SIZE: 108%;
|
||||||
|
}
|
||||||
|
BODY
|
||||||
|
{
|
||||||
|
FONT-SIZE: 100%;
|
||||||
|
BACKGROUND-COLOR: #ffffff;
|
||||||
|
COLOR: #000000;
|
||||||
|
}
|
||||||
|
PRE
|
||||||
|
{
|
||||||
|
MARGIN-LEFT: 2em;
|
||||||
|
FONT-FAMILY: Courier,
|
||||||
|
monospace;
|
||||||
|
}
|
||||||
|
CODE
|
||||||
|
{
|
||||||
|
FONT-FAMILY: Courier,
|
||||||
|
monospace;
|
||||||
|
}
|
||||||
|
CODE.as_pre
|
||||||
|
{
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
.index
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left;
|
||||||
|
}
|
||||||
|
.page-index
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left;
|
||||||
|
}
|
||||||
|
.definition
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left;
|
||||||
|
}
|
||||||
|
.footnote
|
||||||
|
{
|
||||||
|
FONT-SIZE: 66%;
|
||||||
|
VERTICAL-ALIGN: super;
|
||||||
|
TEXT-DECORATION: none;
|
||||||
|
}
|
||||||
|
.function-semantics
|
||||||
|
{
|
||||||
|
CLEAR: left;
|
||||||
|
}
|
||||||
700
doc/html/boostbook.css
Normal file
@@ -0,0 +1,700 @@
|
|||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Copyright (c) 2004 Joel de Guzman
|
||||||
|
http://spirit.sourceforge.net/
|
||||||
|
|
||||||
|
Copyright 2013 Niall Douglas additions for colors and alignment.
|
||||||
|
Copyright 2013 Paul A. Bristow additions for more colors and alignments.
|
||||||
|
|
||||||
|
Distributed under the Boost Software License, Version 1.0. (See accompany-
|
||||||
|
ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Body defaults
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
body
|
||||||
|
{
|
||||||
|
margin: 1em;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Paragraphs
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
p
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Program listings
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/* Code on paragraphs */
|
||||||
|
p tt.computeroutput
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
font-size: 9pt;
|
||||||
|
display: block;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listings in tables don't get borders */
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
margin: 0pc 0pc 0pc 0pc;
|
||||||
|
padding: 0pc 0pc 0pc 0pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Headings
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
margin: 1em 0em 0.5em 0em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { font-size: 140%; }
|
||||||
|
h2 { font-weight: bold; font-size: 140%; }
|
||||||
|
h3 { font-weight: bold; font-size: 130%; }
|
||||||
|
h4 { font-weight: bold; font-size: 120%; }
|
||||||
|
h5 { font-weight: normal; font-style: italic; font-size: 110%; }
|
||||||
|
h6 { font-weight: normal; font-style: italic; font-size: 100%; }
|
||||||
|
|
||||||
|
/* Top page titles */
|
||||||
|
title,
|
||||||
|
h1.title,
|
||||||
|
h2.title
|
||||||
|
h3.title,
|
||||||
|
h4.title,
|
||||||
|
h5.title,
|
||||||
|
h6.title,
|
||||||
|
.refentrytitle
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 1pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1.title { font-size: 140% }
|
||||||
|
h2.title { font-size: 140% }
|
||||||
|
h3.title { font-size: 130% }
|
||||||
|
h4.title { font-size: 120% }
|
||||||
|
h5.title { font-size: 110% }
|
||||||
|
h6.title { font-size: 100% }
|
||||||
|
|
||||||
|
.section h1
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
font-size: 140%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section h2 { font-size: 140% }
|
||||||
|
.section h3 { font-size: 130% }
|
||||||
|
.section h4 { font-size: 120% }
|
||||||
|
.section h5 { font-size: 110% }
|
||||||
|
.section h6 { font-size: 100% }
|
||||||
|
|
||||||
|
/* Code on titles */
|
||||||
|
h1 tt.computeroutput { font-size: 140% }
|
||||||
|
h2 tt.computeroutput { font-size: 140% }
|
||||||
|
h3 tt.computeroutput { font-size: 130% }
|
||||||
|
h4 tt.computeroutput { font-size: 130% }
|
||||||
|
h5 tt.computeroutput { font-size: 130% }
|
||||||
|
h6 tt.computeroutput { font-size: 130% }
|
||||||
|
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Author
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
h3.author
|
||||||
|
{
|
||||||
|
font-size: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Lists
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
li
|
||||||
|
{
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unordered lists */
|
||||||
|
ul
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ordered lists */
|
||||||
|
ol
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Links
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
a
|
||||||
|
{
|
||||||
|
text-decoration: none; /* no underline */
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover
|
||||||
|
{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Spirit style navigation
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
.spirit-nav
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav a
|
||||||
|
{
|
||||||
|
color: white;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav img
|
||||||
|
{
|
||||||
|
border-width: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Copyright footer
|
||||||
|
=============================================================================*/
|
||||||
|
.copyright-footer
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
font-size: 70%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright-footer p
|
||||||
|
{
|
||||||
|
text-align: right;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Table of contents
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.1pc 1pc 0.1pc 1pc;
|
||||||
|
font-size: 80%;
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boost-toc
|
||||||
|
{
|
||||||
|
float: right;
|
||||||
|
padding: 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code on toc */
|
||||||
|
.toc .computeroutput { font-size: 120% }
|
||||||
|
|
||||||
|
/* No margin on nested menus */
|
||||||
|
|
||||||
|
.toc dl dl { margin: 0; }
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Tables
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
.table-title,
|
||||||
|
div.table p.title
|
||||||
|
{
|
||||||
|
margin-left: 4%;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.informaltable table,
|
||||||
|
.table table
|
||||||
|
{
|
||||||
|
width: 92%;
|
||||||
|
margin-left: 4%;
|
||||||
|
margin-right: 4%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table,
|
||||||
|
div.table table
|
||||||
|
{
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table Cells */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
padding: 0.5em;
|
||||||
|
text-align: left;
|
||||||
|
font-size: 9pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
padding: 0.5em 0.5em 0.5em 0.5em;
|
||||||
|
border: 1pt solid white;
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.simplelist
|
||||||
|
{
|
||||||
|
width: auto !important;
|
||||||
|
margin: 0em !important;
|
||||||
|
padding: 0em !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
table.simplelist td
|
||||||
|
{
|
||||||
|
margin: 0em !important;
|
||||||
|
padding: 0em !important;
|
||||||
|
text-align: left !important;
|
||||||
|
font-size: 9pt !important;
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Blurbs
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.note,
|
||||||
|
div.tip,
|
||||||
|
div.important,
|
||||||
|
div.caution,
|
||||||
|
div.warning,
|
||||||
|
p.blurb
|
||||||
|
{
|
||||||
|
font-size: 9pt; /* A little bit smaller than the main text */
|
||||||
|
line-height: 1.2;
|
||||||
|
display: block;
|
||||||
|
margin: 1pc 4% 0pc 4%;
|
||||||
|
padding: 0.5pc 0.5pc 0.5pc 0.5pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.blurb img
|
||||||
|
{
|
||||||
|
padding: 1pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Variable Lists
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
div.variablelist
|
||||||
|
{
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make the terms in definition lists bold */
|
||||||
|
div.variablelist dl dt,
|
||||||
|
span.term
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist table tbody tr td
|
||||||
|
{
|
||||||
|
text-align: left;
|
||||||
|
vertical-align: top;
|
||||||
|
padding: 0em 2em 0em 0em;
|
||||||
|
font-size: 10pt;
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist dl dt
|
||||||
|
{
|
||||||
|
margin-bottom: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist dl dd
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 2em;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.variablelist table tbody tr td p,
|
||||||
|
div.variablelist dl dd p
|
||||||
|
{
|
||||||
|
margin: 0em 0em 0.5em 0em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Misc
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
/* Title of books and articles in bibliographies */
|
||||||
|
span.title
|
||||||
|
{
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.underline
|
||||||
|
{
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.strikethrough
|
||||||
|
{
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copyright, Legal Notice */
|
||||||
|
div div.legalnotice p
|
||||||
|
{
|
||||||
|
text-align: left
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Colors
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
@media screen
|
||||||
|
{
|
||||||
|
body {
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Syntax Highlighting */
|
||||||
|
.keyword { color: #0000AA; }
|
||||||
|
.identifier { color: #000000; }
|
||||||
|
.special { color: #707070; }
|
||||||
|
.preprocessor { color: #402080; }
|
||||||
|
.char { color: teal; }
|
||||||
|
.comment { color: #800000; }
|
||||||
|
.string { color: teal; }
|
||||||
|
.number { color: teal; }
|
||||||
|
.white_bkd { background-color: #FFFFFF; }
|
||||||
|
.dk_grey_bkd { background-color: #999999; }
|
||||||
|
|
||||||
|
/* Links */
|
||||||
|
a, a .keyword, a .identifier, a .special, a .preprocessor
|
||||||
|
a .char, a .comment, a .string, a .number
|
||||||
|
{
|
||||||
|
color: #005a9c;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited, a:visited .keyword, a:visited .identifier,
|
||||||
|
a:visited .special, a:visited .preprocessor a:visited .char,
|
||||||
|
a:visited .comment, a:visited .string, a:visited .number
|
||||||
|
{
|
||||||
|
color: #9c5a9c;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
|
||||||
|
h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
|
||||||
|
h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
|
||||||
|
{
|
||||||
|
text-decoration: none; /* no underline */
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copyright, Legal Notice */
|
||||||
|
.copyright
|
||||||
|
{
|
||||||
|
color: #666666;
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
div div.legalnotice p
|
||||||
|
{
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listing */
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
border: 0px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blurbs */
|
||||||
|
div.note,
|
||||||
|
div.tip,
|
||||||
|
div.important,
|
||||||
|
div.caution,
|
||||||
|
div.warning,
|
||||||
|
p.blurb
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table of contents */
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
background-color: #F0F0F0;
|
||||||
|
border: 1px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copyright-footer
|
||||||
|
{
|
||||||
|
color: #8F8F8F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
span.highlight
|
||||||
|
{
|
||||||
|
color: #00A000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print
|
||||||
|
{
|
||||||
|
/* Links */
|
||||||
|
a
|
||||||
|
{
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:visited
|
||||||
|
{
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.spirit-nav
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Program listing */
|
||||||
|
pre.synopsis
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.programlisting,
|
||||||
|
.screen
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
td .programlisting,
|
||||||
|
td .screen
|
||||||
|
{
|
||||||
|
border: 0px solid #DCDCDC;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table of contents */
|
||||||
|
div.toc
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.informaltable table,
|
||||||
|
.table table
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tables */
|
||||||
|
div.informaltable table tr td,
|
||||||
|
div.table table tr td
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.informaltable table tr th,
|
||||||
|
div.table table tr th
|
||||||
|
{
|
||||||
|
border: 1px solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.simplelist tr td
|
||||||
|
{
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Misc */
|
||||||
|
span.highlight
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
Images
|
||||||
|
=============================================================================*/
|
||||||
|
|
||||||
|
span.inlinemediaobject img
|
||||||
|
{
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Super and Subscript: style so that line spacing isn't effected, see
|
||||||
|
http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
sup,
|
||||||
|
sub {
|
||||||
|
height: 0;
|
||||||
|
line-height: 1;
|
||||||
|
vertical-align: baseline;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For internet explorer: */
|
||||||
|
|
||||||
|
* html sup,
|
||||||
|
* html sub {
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
bottom: 1ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
top: .5ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Indexes: pretty much the same as the TOC.
|
||||||
|
==============================================================================*/
|
||||||
|
|
||||||
|
.index
|
||||||
|
{
|
||||||
|
font-size: 80%;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
margin-left: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index ul
|
||||||
|
{
|
||||||
|
padding-left: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index p
|
||||||
|
{
|
||||||
|
padding: 2px;
|
||||||
|
margin: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index-entry-level-0
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index em
|
||||||
|
{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================================
|
||||||
|
Alignment and coloring use 'role' feature, available from Quickbook 1.6 up.
|
||||||
|
Added from Niall Douglas for role color and alignment.
|
||||||
|
http://article.gmane.org/gmane.comp.lib.boost.devel/243318
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Add text alignment (see http://www.w3schools.com/cssref/pr_text_text-align.asp) */
|
||||||
|
span.aligncenter
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: center;
|
||||||
|
}
|
||||||
|
span.alignright
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: right;
|
||||||
|
}
|
||||||
|
/* alignleft is the default. */
|
||||||
|
span.alignleft
|
||||||
|
{
|
||||||
|
display: inline-block; width: 100%; text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* alignjustify stretches the word spacing so that each line has equal width
|
||||||
|
within a chosen fraction of page width (here arbitrarily 20%).
|
||||||
|
*Not* useful inside table items as the column width remains the total string width.
|
||||||
|
Nor very useful, except to temporarily restrict the width.
|
||||||
|
*/
|
||||||
|
span.alignjustify
|
||||||
|
{
|
||||||
|
display: inline-block; width: 20%; text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Text colors.
|
||||||
|
Names at http://www.w3.org/TR/2002/WD-css3-color-20020219/ 4.3. X11 color keywords.
|
||||||
|
Quickbook Usage: [role red Some red text]
|
||||||
|
|
||||||
|
*/
|
||||||
|
span.red { inline-block; color: red; }
|
||||||
|
span.green { color: green; }
|
||||||
|
span.lime { color: #00FF00; }
|
||||||
|
span.blue { color: blue; }
|
||||||
|
span.navy { color: navy; }
|
||||||
|
span.yellow { color: yellow; }
|
||||||
|
span.magenta { color: magenta; }
|
||||||
|
span.indigo { color: #4B0082; }
|
||||||
|
span.cyan { color: cyan; }
|
||||||
|
span.purple { color: purple; }
|
||||||
|
span.gold { color: gold; }
|
||||||
|
span.silver { color: silver; } /* lighter gray */
|
||||||
|
span.gray { color: #808080; } /* light gray */
|
||||||
275
doc/html/docutils.css
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
/*
|
||||||
|
:Author: David Goodger
|
||||||
|
:Contact: goodger@python.org
|
||||||
|
:Date: $Date$
|
||||||
|
:Revision: $Revision$
|
||||||
|
:Copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
|
|
||||||
|
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
|
||||||
|
customize this style sheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* used to remove borders from tables and images */
|
||||||
|
.borderless, table.borderless td, table.borderless th {
|
||||||
|
border: 0 }
|
||||||
|
|
||||||
|
table.borderless td, table.borderless th {
|
||||||
|
/* Override padding for "table.docutils td" with "! important".
|
||||||
|
The right padding separates the table cells. */
|
||||||
|
padding: 0 0.5em 0 0 ! important }
|
||||||
|
|
||||||
|
.first {
|
||||||
|
/* Override more specific margin styles with "! important". */
|
||||||
|
margin-top: 0 ! important }
|
||||||
|
|
||||||
|
.last, .with-subtitle {
|
||||||
|
margin-bottom: 0 ! important }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none }
|
||||||
|
|
||||||
|
a.toc-backref {
|
||||||
|
text-decoration: none ;
|
||||||
|
color: black }
|
||||||
|
|
||||||
|
blockquote.epigraph {
|
||||||
|
margin: 2em 5em ; }
|
||||||
|
|
||||||
|
dl.docutils dd {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get bold-faced definition list terms
|
||||||
|
dl.docutils dt {
|
||||||
|
font-weight: bold }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.abstract {
|
||||||
|
margin: 2em 5em }
|
||||||
|
|
||||||
|
div.abstract p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
div.admonition, div.attention, div.caution, div.danger, div.error,
|
||||||
|
div.hint, div.important, div.note, div.tip, div.warning {
|
||||||
|
margin: 2em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.admonition p.admonition-title, div.hint p.admonition-title,
|
||||||
|
div.important p.admonition-title, div.note p.admonition-title,
|
||||||
|
div.tip p.admonition-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||||
|
div.danger p.admonition-title, div.error p.admonition-title,
|
||||||
|
div.warning p.admonition-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
/* Uncomment (and remove this text!) to get reduced vertical space in
|
||||||
|
compound paragraphs.
|
||||||
|
div.compound .compound-first, div.compound .compound-middle {
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
div.compound .compound-last, div.compound .compound-middle {
|
||||||
|
margin-top: 0.5em }
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.dedication {
|
||||||
|
margin: 2em 5em ;
|
||||||
|
text-align: center ;
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
div.dedication p.topic-title {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-style: normal }
|
||||||
|
|
||||||
|
div.figure {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
div.footer, div.header {
|
||||||
|
clear: both;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
div.line-block {
|
||||||
|
display: block ;
|
||||||
|
margin-top: 1em ;
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
div.line-block div.line-block {
|
||||||
|
margin-top: 0 ;
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-left: 1.5em }
|
||||||
|
|
||||||
|
div.sidebar {
|
||||||
|
margin-left: 1em ;
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em ;
|
||||||
|
background-color: #ffffee ;
|
||||||
|
width: 40% ;
|
||||||
|
float: right ;
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
div.sidebar p.rubric {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-size: medium }
|
||||||
|
|
||||||
|
div.system-messages {
|
||||||
|
margin: 5em }
|
||||||
|
|
||||||
|
div.system-messages h1 {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
div.system-message {
|
||||||
|
border: medium outset ;
|
||||||
|
padding: 1em }
|
||||||
|
|
||||||
|
div.system-message p.system-message-title {
|
||||||
|
color: red ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
div.topic {
|
||||||
|
margin: 2em }
|
||||||
|
|
||||||
|
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
|
||||||
|
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
|
||||||
|
margin-top: 0.4em }
|
||||||
|
|
||||||
|
h1.title {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
h2.subtitle {
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
hr.docutils {
|
||||||
|
width: 75% }
|
||||||
|
|
||||||
|
img.align-left {
|
||||||
|
clear: left }
|
||||||
|
|
||||||
|
img.align-right {
|
||||||
|
clear: right }
|
||||||
|
|
||||||
|
ol.simple, ul.simple {
|
||||||
|
margin-bottom: 1em }
|
||||||
|
|
||||||
|
ol.arabic {
|
||||||
|
list-style: decimal }
|
||||||
|
|
||||||
|
ol.loweralpha {
|
||||||
|
list-style: lower-alpha }
|
||||||
|
|
||||||
|
ol.upperalpha {
|
||||||
|
list-style: upper-alpha }
|
||||||
|
|
||||||
|
ol.lowerroman {
|
||||||
|
list-style: lower-roman }
|
||||||
|
|
||||||
|
ol.upperroman {
|
||||||
|
list-style: upper-roman }
|
||||||
|
|
||||||
|
p.attribution {
|
||||||
|
text-align: right ;
|
||||||
|
margin-left: 50% }
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
font-style: italic }
|
||||||
|
|
||||||
|
p.credits {
|
||||||
|
font-style: italic ;
|
||||||
|
font-size: smaller }
|
||||||
|
|
||||||
|
p.label {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
p.rubric {
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger ;
|
||||||
|
color: maroon ;
|
||||||
|
text-align: center }
|
||||||
|
|
||||||
|
p.sidebar-title {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold ;
|
||||||
|
font-size: larger }
|
||||||
|
|
||||||
|
p.sidebar-subtitle {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
p.topic-title {
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
pre.address {
|
||||||
|
margin-bottom: 0 ;
|
||||||
|
margin-top: 0 ;
|
||||||
|
font-family: serif ;
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
pre.literal-block, pre.doctest-block {
|
||||||
|
margin-left: 2em ;
|
||||||
|
margin-right: 2em }
|
||||||
|
|
||||||
|
span.classifier {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-style: oblique }
|
||||||
|
|
||||||
|
span.classifier-delimiter {
|
||||||
|
font-family: sans-serif ;
|
||||||
|
font-weight: bold }
|
||||||
|
|
||||||
|
span.interpreted {
|
||||||
|
font-family: sans-serif }
|
||||||
|
|
||||||
|
span.option {
|
||||||
|
white-space: nowrap }
|
||||||
|
|
||||||
|
span.pre {
|
||||||
|
white-space: pre }
|
||||||
|
|
||||||
|
span.problematic {
|
||||||
|
color: red }
|
||||||
|
|
||||||
|
span.section-subtitle {
|
||||||
|
/* font-size relative to parent (h1..h6 element) */
|
||||||
|
font-size: 80% }
|
||||||
|
|
||||||
|
table.citation {
|
||||||
|
border-left: solid 1px gray;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docinfo {
|
||||||
|
margin: 2em 4em }
|
||||||
|
|
||||||
|
table.docutils {
|
||||||
|
margin-top: 0.5em ;
|
||||||
|
margin-bottom: 0.5em }
|
||||||
|
|
||||||
|
table.footnote {
|
||||||
|
border-left: solid 1px black;
|
||||||
|
margin-left: 1px }
|
||||||
|
|
||||||
|
table.docutils td, table.docutils th,
|
||||||
|
table.docinfo td, table.docinfo th {
|
||||||
|
padding-left: 0.5em ;
|
||||||
|
padding-right: 0.5em ;
|
||||||
|
vertical-align: top }
|
||||||
|
|
||||||
|
table.docutils th.field-name, table.docinfo th.docinfo-name {
|
||||||
|
font-weight: bold ;
|
||||||
|
text-align: left ;
|
||||||
|
white-space: nowrap ;
|
||||||
|
padding-left: 0 }
|
||||||
|
|
||||||
|
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
|
||||||
|
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
|
||||||
|
font-size: 100% }
|
||||||
|
|
||||||
|
ul.auto-toc {
|
||||||
|
list-style-type: none }
|
||||||
BIN
doc/html/images/alert.png
Normal file
|
After Width: | Height: | Size: 603 B |
BIN
doc/html/images/blank.png
Normal file
|
After Width: | Height: | Size: 374 B |
BIN
doc/html/images/boost.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
doc/html/images/callouts/1.png
Normal file
|
After Width: | Height: | Size: 391 B |
15
doc/html/images/callouts/1.svg
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M10.428,10.411h0.56c3.78,0,4.788-1.96,4.872-3.444h3.22v19.88h-3.92V13.154h-4.732V10.411z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 703 B |
BIN
doc/html/images/callouts/10.png
Normal file
|
After Width: | Height: | Size: 485 B |
18
doc/html/images/callouts/10.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.815,10.758h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.11H3.815V10.758z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M22.175,7.806c4.009,0,5.904,2.76,5.904,8.736c0,5.975-1.896,8.76-5.904,8.76
|
||||||
|
c-4.008,0-5.904-2.785-5.904-8.76C16.271,10.566,18.167,7.806,22.175,7.806z M22.175,22.613c1.921,0,2.448-1.68,2.448-6.071
|
||||||
|
c0-4.393-0.527-6.049-2.448-6.049c-1.92,0-2.448,1.656-2.448,6.049C19.727,20.934,20.255,22.613,22.175,22.613z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
doc/html/images/callouts/11.png
Normal file
|
After Width: | Height: | Size: 410 B |
16
doc/html/images/callouts/11.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M5.209,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H5.209V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M18.553,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.359V12.764h-4.056V10.412z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 827 B |
BIN
doc/html/images/callouts/12.png
Normal file
|
After Width: | Height: | Size: 488 B |
18
doc/html/images/callouts/12.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M4.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.813V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M17.316,13.484c0-5.545,4.056-6.024,5.568-6.024c3.265,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.553,5.544c-2.256,1.584-3.432,2.353-3.815,3.145h7.392V24.5h-11.64c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.353-2.424c-2.352,0-2.423,1.944-2.447,3.192H17.316z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
doc/html/images/callouts/13.png
Normal file
|
After Width: | Height: | Size: 509 B |
20
doc/html/images/callouts/13.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H3.813V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M20.611,14.636h0.529c1.008,0,2.855-0.096,2.855-2.304c0-0.624-0.288-2.185-2.137-2.185
|
||||||
|
c-2.303,0-2.303,2.185-2.303,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.279,0,5.279,1.152,5.279,4.752
|
||||||
|
c0,1.728-1.08,2.808-2.039,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.377,5.496-5.809,5.496
|
||||||
|
c-1.607,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.52-0.911,2.52-2.808
|
||||||
|
c0-2.328-2.256-2.424-3.816-2.424V14.636z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
doc/html/images/callouts/14.png
Normal file
|
After Width: | Height: | Size: 499 B |
17
doc/html/images/callouts/14.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M4.146,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.146V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M28.457,20.732h-1.896V24.5h-3.36v-3.768h-6.72v-2.904L22.746,7.46h3.815v10.656h1.896V20.732z
|
||||||
|
M23.201,18.116c0-4.128,0.072-6.792,0.072-7.32h-0.048l-4.272,7.32H23.201z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 906 B |
BIN
doc/html/images/callouts/15.png
Normal file
|
After Width: | Height: | Size: 507 B |
19
doc/html/images/callouts/15.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.479,11.079h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.43H3.479V11.079z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M19.342,14.943c0.625-0.433,1.392-0.937,3.048-0.937c2.279,0,5.16,1.584,5.16,5.496
|
||||||
|
c0,2.328-1.176,6.121-6.192,6.121c-2.664,0-5.376-1.584-5.544-5.016h3.36c0.144,1.391,0.888,2.326,2.376,2.326
|
||||||
|
c1.607,0,2.544-1.367,2.544-3.191c0-1.512-0.72-3.047-2.496-3.047c-0.456,0-1.608,0.023-2.256,1.223l-3-0.143l1.176-9.361h9.36
|
||||||
|
v2.832h-6.937L19.342,14.943z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
20
doc/html/images/callouts/16.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H3.813V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M24.309,11.78c-0.097-0.96-0.721-1.633-1.969-1.633c-2.184,0-2.688,2.496-2.808,4.704L19.58,14.9
|
||||||
|
c0.456-0.624,1.296-1.416,3.191-1.416c3.529,0,5.209,2.712,5.209,5.256c0,3.72-2.28,6.216-5.568,6.216
|
||||||
|
c-5.16,0-6.168-4.32-6.168-8.568c0-3.24,0.432-8.928,6.336-8.928c0.695,0,2.641,0.264,3.48,1.104
|
||||||
|
c0.936,0.912,1.271,1.416,1.584,3.217H24.309z M22.172,16.172c-1.271,0-2.568,0.792-2.568,2.928c0,1.849,1.056,3.168,2.664,3.168
|
||||||
|
c1.225,0,2.353-0.936,2.353-3.239C24.62,16.868,23.229,16.172,22.172,16.172z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
17
doc/html/images/callouts/17.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.479,11.079h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.43H3.479V11.079z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M27.838,11.006c-1.631,1.776-5.807,6.816-6.215,14.16h-3.457c0.36-6.816,4.632-12.24,6.072-13.776
|
||||||
|
h-8.472l0.072-2.976h12V11.006z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 866 B |
21
doc/html/images/callouts/18.svg
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M4.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.813V10.412z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M23.172,24.956c-4.392,0-5.904-2.856-5.904-5.185c0-0.863,0-3.119,2.592-4.319
|
||||||
|
c-1.344-0.672-2.064-1.752-2.064-3.336c0-2.904,2.328-4.656,5.304-4.656c3.528,0,5.4,2.088,5.4,4.44
|
||||||
|
c0,1.464-0.6,2.712-1.968,3.432c1.632,0.815,2.544,1.896,2.544,4.104C29.076,21.596,27.684,24.956,23.172,24.956z M23.124,16.916
|
||||||
|
c-1.224,0-2.4,0.792-2.4,2.64c0,1.632,0.936,2.712,2.472,2.712c1.752,0,2.424-1.512,2.424-2.688
|
||||||
|
C25.62,18.38,24.996,16.916,23.124,16.916z M25.284,12.26c0-1.296-0.888-2.112-1.968-2.112c-1.512,0-2.305,0.864-2.305,2.112
|
||||||
|
c0,1.008,0.744,2.112,2.185,2.112C24.516,14.372,25.284,13.484,25.284,12.26z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
20
doc/html/images/callouts/19.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M4.146,10.746h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.041h-3.36V13.097H4.146V10.746z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M20.225,20.898v0.023c0.192,1.176,0.936,1.68,1.968,1.68c1.392,0,2.783-1.176,2.808-4.752
|
||||||
|
l-0.048-0.049c-0.768,1.152-2.088,1.441-3.24,1.441c-3.264,0-5.16-2.473-5.16-5.329c0-4.176,2.472-6.12,5.808-6.12
|
||||||
|
c5.904,0,6,6.36,6,8.76c0,6.601-3.12,8.736-6.192,8.736c-2.904,0-4.992-1.68-5.28-4.391H20.225z M22.434,16.553
|
||||||
|
c1.176,0,2.472-0.84,2.472-2.855c0-1.944-0.841-3.145-2.568-3.145c-0.864,0-2.424,0.433-2.424,2.88
|
||||||
|
C19.913,16.001,21.161,16.553,22.434,16.553z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
doc/html/images/callouts/2.png
Normal file
|
After Width: | Height: | Size: 446 B |
17
doc/html/images/callouts/2.svg
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M9.668,12.328c0-6.469,4.732-7.028,6.496-7.028c3.808,0,6.833,2.24,6.833,6.271
|
||||||
|
c0,3.416-2.213,5.152-4.145,6.469c-2.632,1.848-4.004,2.744-4.452,3.668h8.624v3.472H9.444c0.14-2.324,0.308-4.76,4.62-7.896
|
||||||
|
c3.584-2.604,5.012-3.612,5.012-5.853c0-1.315-0.84-2.828-2.744-2.828c-2.744,0-2.828,2.269-2.856,3.725H9.668z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 926 B |
20
doc/html/images/callouts/20.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M23.172,7.46c4.008,0,5.904,2.76,5.904,8.736c0,5.976-1.896,8.76-5.904,8.76
|
||||||
|
s-5.904-2.784-5.904-8.76C17.268,10.22,19.164,7.46,23.172,7.46z M23.172,22.268c1.92,0,2.448-1.68,2.448-6.071
|
||||||
|
c0-4.393-0.528-6.049-2.448-6.049s-2.448,1.656-2.448,6.049C20.724,20.588,21.252,22.268,23.172,22.268z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
18
doc/html/images/callouts/21.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M5.306,13.151c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392v2.976H5.114c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H5.306z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M19.49,10.079h0.48c3.239,0,4.104-1.681,4.176-2.952h2.761v17.04h-3.361V12.431H19.49V10.079z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
20
doc/html/images/callouts/22.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M17.316,13.484c0-5.545,4.056-6.024,5.568-6.024c3.265,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.553,5.544c-2.256,1.584-3.432,2.353-3.815,3.145h7.392V24.5h-11.64c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.353-2.424c-2.352,0-2.423,1.944-2.447,3.192H17.316z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
22
doc/html/images/callouts/23.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M21.612,14.636h0.528c1.008,0,2.855-0.096,2.855-2.304c0-0.624-0.287-2.185-2.136-2.185
|
||||||
|
c-2.304,0-2.304,2.185-2.304,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.28,0,5.28,1.152,5.28,4.752
|
||||||
|
c0,1.728-1.08,2.808-2.04,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.377,5.496-5.809,5.496
|
||||||
|
c-1.607,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.521-0.911,2.521-2.808
|
||||||
|
c0-2.328-2.257-2.424-3.816-2.424V14.636z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
19
doc/html/images/callouts/24.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M4.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H4.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H4.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M30.124,20.732h-1.896V24.5h-3.36v-3.768h-6.72v-2.904L24.412,7.46h3.816v10.656h1.896V20.732z
|
||||||
|
M24.868,18.116c0-4.128,0.071-6.792,0.071-7.32h-0.047l-4.272,7.32H24.868z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
21
doc/html/images/callouts/25.svg
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M20.676,14.276c0.624-0.433,1.393-0.937,3.049-0.937c2.279,0,5.16,1.584,5.16,5.496
|
||||||
|
c0,2.328-1.177,6.12-6.193,6.12c-2.664,0-5.375-1.584-5.543-5.016h3.36c0.144,1.392,0.889,2.327,2.376,2.327
|
||||||
|
c1.608,0,2.544-1.367,2.544-3.191c0-1.513-0.72-3.048-2.496-3.048c-0.455,0-1.607,0.023-2.256,1.224l-3-0.144l1.176-9.36h9.36
|
||||||
|
v2.832h-6.937L20.676,14.276z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
22
doc/html/images/callouts/26.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M25.309,11.78c-0.097-0.96-0.721-1.633-1.969-1.633c-2.184,0-2.688,2.496-2.808,4.704L20.58,14.9
|
||||||
|
c0.456-0.624,1.296-1.416,3.191-1.416c3.529,0,5.209,2.712,5.209,5.256c0,3.72-2.28,6.216-5.568,6.216
|
||||||
|
c-5.16,0-6.168-4.32-6.168-8.568c0-3.24,0.432-8.928,6.336-8.928c0.695,0,2.641,0.264,3.48,1.104
|
||||||
|
c0.936,0.912,1.271,1.416,1.584,3.217H25.309z M23.172,16.172c-1.271,0-2.568,0.792-2.568,2.928c0,1.849,1.056,3.168,2.664,3.168
|
||||||
|
c1.225,0,2.353-0.936,2.353-3.239C25.62,16.868,24.229,16.172,23.172,16.172z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
19
doc/html/images/callouts/27.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M29.172,10.34c-1.632,1.776-5.808,6.816-6.216,14.16H19.5c0.36-6.816,4.632-12.24,6.072-13.776
|
||||||
|
H17.1l0.072-2.976h12V10.34z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
23
doc/html/images/callouts/28.svg
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M23.172,24.956c-4.392,0-5.904-2.856-5.904-5.185c0-0.863,0-3.119,2.592-4.319
|
||||||
|
c-1.344-0.672-2.064-1.752-2.064-3.336c0-2.904,2.328-4.656,5.304-4.656c3.528,0,5.4,2.088,5.4,4.44
|
||||||
|
c0,1.464-0.6,2.712-1.968,3.432c1.632,0.815,2.544,1.896,2.544,4.104C29.076,21.596,27.684,24.956,23.172,24.956z M23.124,16.916
|
||||||
|
c-1.224,0-2.4,0.792-2.4,2.64c0,1.632,0.936,2.712,2.472,2.712c1.752,0,2.424-1.512,2.424-2.688
|
||||||
|
C25.62,18.38,24.996,16.916,23.124,16.916z M25.284,12.26c0-1.296-0.888-2.112-1.968-2.112c-1.512,0-2.305,0.864-2.305,2.112
|
||||||
|
c0,1.008,0.744,2.112,2.185,2.112C24.516,14.372,25.284,13.484,25.284,12.26z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
22
doc/html/images/callouts/29.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
|
||||||
|
c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
|
||||||
|
c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M20.893,20.564v0.023c0.191,1.176,0.936,1.68,1.967,1.68c1.393,0,2.785-1.176,2.809-4.752
|
||||||
|
l-0.048-0.048c-0.769,1.152-2.088,1.44-3.24,1.44c-3.264,0-5.16-2.473-5.16-5.328c0-4.176,2.472-6.12,5.807-6.12
|
||||||
|
c5.904,0,6.001,6.36,6.001,8.76c0,6.601-3.12,8.736-6.192,8.736c-2.904,0-4.992-1.68-5.28-4.392H20.893z M23.1,16.22
|
||||||
|
c1.176,0,2.473-0.84,2.473-2.855c0-1.944-0.84-3.145-2.568-3.145c-0.863,0-2.424,0.433-2.424,2.88
|
||||||
|
C20.58,15.668,21.828,16.22,23.1,16.22z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
BIN
doc/html/images/callouts/3.png
Normal file
|
After Width: | Height: | Size: 431 B |
19
doc/html/images/callouts/3.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M15.127,14.005h0.616c1.176,0,3.332-0.112,3.332-2.688c0-0.728-0.336-2.548-2.492-2.548
|
||||||
|
c-2.688,0-2.688,2.548-2.688,3.248h-3.64c0-3.724,2.1-6.384,6.58-6.384c2.66,0,6.16,1.344,6.16,5.544
|
||||||
|
c0,2.016-1.261,3.276-2.38,3.78v0.056c0.699,0.196,2.996,1.232,2.996,4.62c0,3.752-2.772,6.412-6.776,6.412
|
||||||
|
c-1.876,0-6.916-0.42-6.916-6.636h3.836l-0.028,0.027c0,1.064,0.28,3.473,2.912,3.473c1.568,0,2.94-1.064,2.94-3.276
|
||||||
|
c0-2.716-2.632-2.828-4.452-2.828V14.005z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
22
doc/html/images/callouts/30.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M8.268,14.636h0.528c1.008,0,2.856-0.096,2.856-2.304c0-0.624-0.288-2.185-2.136-2.185
|
||||||
|
c-2.304,0-2.304,2.185-2.304,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.28,0,5.28,1.152,5.28,4.752
|
||||||
|
c0,1.728-1.08,2.808-2.04,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.376,5.496-5.808,5.496
|
||||||
|
c-1.608,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.52-0.911,2.52-2.808
|
||||||
|
c0-2.328-2.256-2.424-3.816-2.424V14.636z"/>
|
||||||
|
<path style="fill:#FFFFFF;" d="M23.172,7.46c4.008,0,5.904,2.76,5.904,8.736c0,5.976-1.896,8.76-5.904,8.76
|
||||||
|
s-5.904-2.784-5.904-8.76C17.268,10.22,19.164,7.46,23.172,7.46z M23.172,22.268c1.92,0,2.448-1.68,2.448-6.071
|
||||||
|
c0-4.393-0.528-6.049-2.448-6.049s-2.448,1.656-2.448,6.049C20.724,20.588,21.252,22.268,23.172,22.268z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
BIN
doc/html/images/callouts/4.png
Normal file
|
After Width: | Height: | Size: 441 B |
16
doc/html/images/callouts/4.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M21.891,20.784h-2.212v4.396h-3.92v-4.396h-7.84v-3.389L15.227,5.3h4.452v12.432h2.212V20.784z
|
||||||
|
M15.759,17.731c0-4.815,0.084-7.924,0.084-8.54h-0.056l-4.984,8.54H15.759z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 783 B |
BIN
doc/html/images/callouts/5.png
Normal file
|
After Width: | Height: | Size: 423 B |
18
doc/html/images/callouts/5.svg
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M14.035,14.252c0.728-0.504,1.624-1.092,3.556-1.092c2.66,0,6.02,1.848,6.02,6.411
|
||||||
|
c0,2.717-1.372,7.141-7.224,7.141c-3.108,0-6.272-1.849-6.468-5.853h3.92c0.168,1.624,1.036,2.717,2.772,2.717
|
||||||
|
c1.876,0,2.968-1.597,2.968-3.725c0-1.764-0.839-3.556-2.912-3.556c-0.532,0-1.876,0.028-2.632,1.428l-3.5-0.168l1.372-10.92
|
||||||
|
h10.919v3.304h-8.092L14.035,14.252z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 967 B |
BIN
doc/html/images/callouts/6.png
Normal file
|
After Width: | Height: | Size: 431 B |
19
doc/html/images/callouts/6.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M19.106,10.673c-0.112-1.12-0.84-1.904-2.296-1.904c-2.548,0-3.136,2.912-3.276,5.488l0.056,0.056
|
||||||
|
c0.532-0.728,1.512-1.651,3.724-1.651c4.116,0,6.077,3.164,6.077,6.131c0,4.34-2.66,7.252-6.497,7.252
|
||||||
|
c-6.02,0-7.196-5.039-7.196-9.996c0-3.78,0.504-10.416,7.392-10.416c0.812,0,3.08,0.308,4.061,1.288
|
||||||
|
c1.092,1.063,1.483,1.652,1.848,3.752H19.106z M16.614,15.797c-1.484,0-2.996,0.924-2.996,3.416c0,2.156,1.232,3.697,3.108,3.697
|
||||||
|
c1.428,0,2.745-1.094,2.745-3.781C19.471,16.609,17.846,15.797,16.614,15.797z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
BIN
doc/html/images/callouts/7.png
Normal file
|
After Width: | Height: | Size: 397 B |
16
doc/html/images/callouts/7.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M24.28,9.66c-1.904,2.071-6.776,7.951-7.252,16.52h-4.032c0.42-7.952,5.404-14.28,7.084-16.072
|
||||||
|
h-9.884l0.084-3.472h14V9.66z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 738 B |
BIN
doc/html/images/callouts/8.png
Normal file
|
After Width: | Height: | Size: 434 B |
20
doc/html/images/callouts/8.svg
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M16.28,26.712c-5.124,0-6.888-3.332-6.888-6.048c0-1.009,0-3.641,3.024-5.04
|
||||||
|
c-1.568-0.784-2.408-2.044-2.408-3.893c0-3.388,2.716-5.432,6.188-5.432c4.116,0,6.3,2.436,6.3,5.18
|
||||||
|
c0,1.708-0.7,3.164-2.296,4.004c1.903,0.952,2.968,2.212,2.968,4.788C23.168,22.792,21.544,26.712,16.28,26.712z M16.224,17.332
|
||||||
|
c-1.428,0-2.8,0.924-2.8,3.08c0,1.903,1.092,3.164,2.884,3.164c2.043,0,2.829-1.765,2.829-3.137
|
||||||
|
C19.137,19.04,18.408,17.332,16.224,17.332z M18.744,11.899c0-1.512-1.036-2.464-2.296-2.464c-1.764,0-2.688,1.008-2.688,2.464
|
||||||
|
c0,1.177,0.868,2.464,2.548,2.464C17.848,14.363,18.744,13.328,18.744,11.899z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
doc/html/images/callouts/9.png
Normal file
|
After Width: | Height: | Size: 420 B |
19
doc/html/images/callouts/9.svg
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||||
|
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||||
|
]>
|
||||||
|
<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
|
||||||
|
style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
|
||||||
|
<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
|
||||||
|
<g>
|
||||||
|
<g style="enable-background:new ;">
|
||||||
|
<path style="fill:#FFFFFF;" d="M13.953,21.921v0.027c0.224,1.372,1.092,1.961,2.296,1.961c1.624,0,3.248-1.372,3.276-5.545
|
||||||
|
l-0.057-0.056c-0.896,1.344-2.436,1.68-3.78,1.68c-3.808,0-6.02-2.884-6.02-6.216c0-4.872,2.884-7.14,6.776-7.14
|
||||||
|
c6.888,0,7,7.42,7,10.22c0,7.7-3.641,10.192-7.224,10.192c-3.388,0-5.824-1.96-6.16-5.124H13.953z M16.529,16.853
|
||||||
|
c1.372,0,2.884-0.979,2.884-3.332c0-2.268-0.98-3.668-2.996-3.668c-1.008,0-2.828,0.504-2.828,3.36
|
||||||
|
C13.589,16.209,15.045,16.853,16.529,16.853z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
BIN
doc/html/images/caution.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
68
doc/html/images/caution.svg
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) --><svg height="120.648" id="Layer_1" inkscape:version="0.42" sodipodi:docbase="F:\openclip\svg da inviare" sodipodi:docname="Attenzione.svg" sodipodi:version="0.32" space="preserve" style="overflow:visible;enable-background:new 0 0 133.878 120.648;" version="1.1" viewBox="0 0 133.878 120.648" width="133.878" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<metadata>
|
||||||
|
<rdf:RDF xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
||||||
|
<cc:Work rdf:about="">
|
||||||
|
<dc:title>Attenzione</dc:title>
|
||||||
|
<dc:description></dc:description>
|
||||||
|
<dc:subject>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>pulsante</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:subject>
|
||||||
|
<dc:publisher>
|
||||||
|
<cc:Agent rdf:about="http://www.openclipart.org/">
|
||||||
|
<dc:title>Open Clip Art Library</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:publisher>
|
||||||
|
<dc:creator>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Architetto Francesco Rollandin</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:creator>
|
||||||
|
<dc:rights>
|
||||||
|
<cc:Agent>
|
||||||
|
<dc:title>Architetto Francesco Rollandin</dc:title>
|
||||||
|
</cc:Agent>
|
||||||
|
</dc:rights>
|
||||||
|
<dc:date></dc:date>
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||||
|
<cc:license rdf:resource="http://web.resource.org/cc/PublicDomain"/>
|
||||||
|
<dc:language>en</dc:language>
|
||||||
|
</cc:Work>
|
||||||
|
<cc:License rdf:about="http://web.resource.org/cc/PublicDomain">
|
||||||
|
<cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
|
||||||
|
<cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
|
||||||
|
<cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
|
||||||
|
</cc:License>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs id="defs43"/>
|
||||||
|
<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="Layer_1" inkscape:cx="66.939003" inkscape:cy="60.324001" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="510" inkscape:window-width="787" inkscape:window-x="44" inkscape:window-y="58" inkscape:zoom="2.9838869" pagecolor="#ffffff"/>
|
||||||
|
<g id="g3">
|
||||||
|
<linearGradient gradientTransform="matrix(56.9977 90.4964 90.4964 -56.9977 -27343.9609 47971.0547)" gradientUnits="userSpaceOnUse" id="XMLID_4_" x1="-244.5732" x2="-242.8169" y1="455.4199" y2="455.4199">
|
||||||
|
<stop id="stop6" offset="0" style="stop-color:#FFFA5F"/>
|
||||||
|
<stop id="stop8" offset="1" style="stop-color:#9F3300"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path d="M51.333,8.834C34.985,37.343,18.638,65.854,2.289,94.363 c-7.081,12.352,3.352,26.285,16.453,26.285c6.708,0,13.418,0,20.128,0c22.109,0,44.217,0,66.327,0c3.644,0,7.286,0,10.931,0 c13.293,0,20.963-14.273,16.452-26.031c-4.114-10.729-11.861-20.99-17.542-30.922c-8.81-15.403-17.618-30.809-26.429-46.212 c-1.813-3.167-3.622-6.333-5.434-9.5C76.601-3.516,57.616-2.03,51.333,8.834 M53.973,9.064" id="path10" style="fill:url(#XMLID_4_);"/>
|
||||||
|
<path d="M55.474,12.388c-8.247,14.279-16.492,28.559-24.739,42.839 c-5.526,9.567-11.05,19.137-16.577,28.707c-2.732,4.73-7.323,10.456-8.284,16c-3.799,21.9,34.927,15.743,46.734,15.743 c20.073,0,40.144,0,60.215,0c13.716,0,18.636-11.963,12.229-23.063c-6.462-11.195-12.927-22.388-19.389-33.582 c-7.249-12.557-14.499-25.113-21.75-37.671c-1.682-2.916-3.364-5.829-5.049-8.745C73.767,3.785,60.676,3.364,55.474,12.388" id="path12" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFF200;"/>
|
||||||
|
<path d="M55.474,12.388c-8.247,14.279-16.492,28.559-24.739,42.839c-5.526,9.567-11.05,19.137-16.577,28.707 c-2.732,4.73-7.323,10.456-8.284,16c-3.799,21.9,34.927,15.743,46.734,15.743c20.073,0,40.144,0,60.215,0 c13.716,0,18.636-11.963,12.229-23.063c-6.462-11.195-12.927-22.388-19.389-33.582c-7.249-12.557-14.499-25.113-21.75-37.671 c-1.682-2.916-3.364-5.829-5.049-8.745C73.767,3.785,60.676,3.364,55.474,12.388" id="path14" style="fill:#FFCE00;"/>
|
||||||
|
<path d="M126.731,95.522c-8.733-15.127-17.468-30.253-26.201-45.379 c-5.537-9.595-11.078-19.188-16.616-28.781c-3.938-6.821-7.459-15.689-16.813-15.689c1.013,0,5.901,10.225,6.469,11.196 c5.451,9.314,10.902,18.63,16.352,27.947c9.217,15.749,18.433,31.498,27.646,47.249c2.302,3.933,5.356,10.555,1.308,14.397 c-3.148,2.987-7.99,3.196-12.099,3.196c-7.225,0-14.448,0-21.674,0c-22.125,0-44.251,0-66.377,0c-3.598,0-7.197,0-10.794,0 c5.285,7.909,16.341,6.02,24.546,6.02c13.009,0,26.017,0,39.023,0c11.979,0,23.958,0,35.937,0c2.516,0,5.032,0,7.547,0 C125.136,115.678,131.878,104.435,126.731,95.522" id="path16" style="fill:#FFB600;"/>
|
||||||
|
<path d="M14.615,112.457c-4.483-7.751,1.908-16.103,5.793-22.834 c4.698-8.138,9.398-16.276,14.097-24.414C44.54,47.83,54.574,30.448,64.61,13.069c0.789-1.367,3.725-4.568,2.594-5.539 c-3.913-3.353-10.287,1.936-12.107,5.087c-3.129,5.417-6.258,10.835-9.386,16.252c-11.105,19.226-22.209,38.453-33.313,57.68 c-1.649,2.854-3.299,5.713-4.95,8.569c-4.771,8.265-0.075,19.162,9.658,20.446C16.124,114.65,15.294,113.615,14.615,112.457" id="path18" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFE600;"/>
|
||||||
|
<path d="M77.076,34.654c0,10.183-1.788,20.758-3.439,30.772 c-0.369,2.239-4.03,23.609-7.796,14.179c-4.247-10.632-4.832-23.419-5.958-34.696c-0.363-3.638-1.538-8.425-0.563-12.06 C61.667,24.099,77.076,25.199,77.076,34.654" id="path20" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFE1;"/>
|
||||||
|
<path d="M77.076,34.654c-2.018,0.995-1.521,8.717-1.797,11.395c-0.685,6.643-1.505,13.282-2.614,19.869 c-0.79,4.701-1.301,10.862-3.954,14.981c-1.642,2.567-3.405-5.958-3.634-6.932c-2.948-12.443-4.464-25.664-5.09-38.43 c-0.272-5.52,5.164-8.854,10.277-7.622c3.87,0.933,5.217,7.36,7.688,6.738c0.009-11.451-19.755-11.453-19.746,0 c0.017,11.956,2.087,24.599,4.423,36.294c0.501,2.507,1.642,12.376,5.449,12.376c4.059-0.021,5.285-11.432,5.79-14.137 c1.261-6.765,2.139-13.605,2.887-20.444C77.084,45.722,79.281,35.942,77.076,34.654" id="path22" style="fill:#FFFFFF;"/>
|
||||||
|
<linearGradient gradientTransform="matrix(68.2284 33.0019 33.0019 -68.2284 1613.9791 39385.6641)" gradientUnits="userSpaceOnUse" id="XMLID_5_" x1="-246.981" x2="-245.2275" y1="458.29" y2="458.29">
|
||||||
|
<stop id="stop25" offset="0" style="stop-color:#FFFA5F"/>
|
||||||
|
<stop id="stop27" offset="1" style="stop-color:#9F3300"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path d="M57.957,34.654c0,10.053,1.632,20.54,3.242,30.431 c0.479,2.936,4.912,26.502,9.99,15.164c4.987-11.134,5.351-25.201,6.386-37.184c0.273-3.169,1.153-7.045,0.421-10.221 C75.628,22.587,57.957,23.788,57.957,34.654 M60.207,34.654c0-8.061,13.138-9.015,15.459-1.792c1.156,3.597-0.13,8.748-0.508,12.38 c-1.135,10.904-2.052,22.602-5.501,33.069c-2.816,8.545-5.546-10.187-5.934-12.522C62.039,55.63,60.207,44.985,60.207,34.654" id="path29" style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#XMLID_5_);"/>
|
||||||
|
<path d="M77.076,96.788c0,11.964-18.555,11.964-18.555,0 C58.521,84.822,77.076,84.822,77.076,96.788" id="path31" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFE1;"/>
|
||||||
|
<path d="M77.076,96.788c-2.605,1.661-2.157,6.757-7.044,8.101c-6.178,1.7-12.033-4.159-10.336-10.335 c1.439-5.23,7.657-7.767,12.341-5.021c2.91,1.704,3.164,7.913,5.915,7.256c0-14.267-22.698-12.238-20.143,1.826 c0.987,5.444,6.375,9.15,11.814,8.162C72.417,106.271,81.44,98.19,77.076,96.788" id="path33" style="fill:#FFFFFF;"/>
|
||||||
|
<linearGradient gradientTransform="matrix(68.2241 32.9998 32.9998 -68.2241 1604.682 39402.625)" gradientUnits="userSpaceOnUse" id="XMLID_6_" x1="-246.998" x2="-245.2348" y1="458.0625" y2="458.0625">
|
||||||
|
<stop id="stop36" offset="0" style="stop-color:#FFFA5F"/>
|
||||||
|
<stop id="stop38" offset="1" style="stop-color:#9F3300"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path d="M57.395,96.788c0,13.41,20.805,13.41,20.805,0 C78.2,83.376,57.395,83.375,57.395,96.788 M59.647,96.788c0-10.514,16.301-10.514,16.301,0 C75.948,107.3,59.647,107.3,59.647,96.788" id="path40" style="fill-rule:evenodd;clip-rule:evenodd;fill:url(#XMLID_6_);"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.3 KiB |
BIN
doc/html/images/draft.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
doc/html/images/home.png
Normal file
|
After Width: | Height: | Size: 358 B |
26
doc/html/images/home.svg
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY st0 "fill-rule:nonzero;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
|
||||||
|
<!ENTITY st1 "fill:none;stroke:none;">
|
||||||
|
<!ENTITY st2 "fill:#000000;">
|
||||||
|
<!ENTITY st3 "fill:none;stroke:#FFFFFF;stroke-width:6.3469;stroke-linejoin:round;">
|
||||||
|
<!ENTITY st4 "fill-rule:evenodd;clip-rule:evenodd;stroke:none;">
|
||||||
|
<!ENTITY st5 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
|
||||||
|
]>
|
||||||
|
<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="Layer_x0020_3" style="&st0;">
|
||||||
|
<g style="&st4;">
|
||||||
|
<path style="&st3;" d="M22.9,7.1L5.1,21.8l0,0c-0.3,0.3-0.5,0.8-0.5,1.2c0,0.2,0,0.4,0.1,0.6c0.3,0.6,0.9,1,1.6,1c0,0,1.1,0,2.2,0c0,2.4,0,14.2,0,14.2c0,1.1,0.8,1.9,1.8,1.9h27.4c1.1,0,1.9-0.9,1.9-2c0,0,0-11.8,0-14.2c1,0,2,0,2,0c0.8,0,1.4-0.5,1.7-1.2
|
||||||
|
c0.1-0.2,0.1-0.4,0.1-0.6c0-0.5-0.2-1-0.7-1.4c0,0-3.6-3-4.5-3.7c0-1.2,0-6.9,0-6.9c0-1.2-0.8-2-2-2h-4.8c-1,0-1.7,0.6-1.9,1.5c-1.9-1.6-4.1-3.5-4.1-3.5l0.1,0.1c-0.7-0.7-1.8-0.8-2.7-0.1z"/>
|
||||||
|
<path style="&st2;" d="M22.9,7.1L5.1,21.8l0,0c-0.3,0.3-0.5,0.8-0.5,1.2c0,0.2,0,0.4,0.1,0.6c0.3,0.6,0.9,1,1.6,1c0,0,1.1,0,2.2,0c0,2.4,0,14.2,0,14.2c0,1.1,0.8,1.9,1.8,1.9h27.4c1.1,0,1.9-0.9,1.9-2c0,0,0-11.8,0-14.2c1,0,2,0,2,0c0.8,0,1.4-0.5,1.7-1.2
|
||||||
|
c0.1-0.2,0.1-0.4,0.1-0.6c0-0.5-0.2-1-0.7-1.4c0,0-3.6-3-4.5-3.7c0-1.2,0-6.9,0-6.9c0-1.2-0.8-2-2-2h-4.8c-1,0-1.7,0.6-1.9,1.5c-1.9-1.6-4.1-3.5-4.1-3.5l0.1,0.1c-0.7-0.7-1.8-0.8-2.7-0.1z"/>
|
||||||
|
<path style="&st2;" d="M41.8,22.8l-5.1-4.2v-0.1L31,13.7v0l-6.5-5.5C24.2,8,24,8,23.8,8.2L6.2,22.9c-0.1,0.1-0.1,0.3,0.1,0.3h1.6H10h28.1h1.2h2.3c0.2,0,0.4-0.2,0.2-0.4z"/>
|
||||||
|
<path d="M35.8,16.8l0-5.1c0-0.2-0.1-0.4-0.3-0.4h-3.2c-0.2,0-0.3,0.1-0.3,0.3v2.2l3.9,2.9z"/>
|
||||||
|
<path d="M11.9,24.7V37c0,0.3,0.1,0.4,0.3,0.4h23.6c0.3,0,0.4-0.2,0.4-0.4V24.7H11.9z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="crop_x0020_marks" style="&st5;">
|
||||||
|
<path style="&st1;" d="M48,48H0V0h48v48z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
BIN
doc/html/images/important.png
Normal file
|
After Width: | Height: | Size: 722 B |
25
doc/html/images/important.svg
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
|
||||||
|
<!DOCTYPE svg [
|
||||||
|
<!ENTITY st0 "fill:#FFFFFF;stroke:none;">
|
||||||
|
<!ENTITY st1 "fill:#FFFFFF;stroke-width:6.6112;stroke-linecap:round;stroke-linejoin:round;">
|
||||||
|
<!ENTITY st2 "stroke:#FFFFFF;stroke-width:6.6112;">
|
||||||
|
<!ENTITY st3 "fill:none;stroke:none;">
|
||||||
|
<!ENTITY st4 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
|
||||||
|
<!ENTITY st5 "stroke:none;">
|
||||||
|
]>
|
||||||
|
<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g id="Layer_x0020_3" style="&st4;">
|
||||||
|
<g>
|
||||||
|
<path style="&st2;" d="M41.7,35.3L26.6,9.4c-0.6-1-1.7-1.7-2.9-1.6c-1.2,0-2.3,0.7-2.9,1.7L6.3,35.4c-0.6,1-0.6,2.3,0,3.3c0.6,1,1.7,1.6,2.9,1.6h29.6c1.2,0,2.3-0.6,2.9-1.7c0.6-1,0.6-2.3,0-3.3z"/>
|
||||||
|
<path style="&st1;" d="M23.7,11L9.2,37h29.6L23.7,11z"/>
|
||||||
|
<path style="&st0;" d="M23.7,11.9L10.3,36.1h27.5l-14-24.1z"/>
|
||||||
|
<g>
|
||||||
|
<path style="&st5;" d="M24.1,34c-1.1,0-1.8-0.8-1.8-1.8c0-1.1,0.7-1.8,1.8-1.8c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.8-1.8,1.8h0z M22.9,29.3l-0.4-9.1h3.2l-0.4,9.1h-2.3z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="crop_x0020_marks" style="&st4;">
|
||||||
|
<path style="&st3;" d="M48,48H0V0h48v48z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
doc/html/images/jam.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
doc/html/images/next.png
Normal file
|
After Width: | Height: | Size: 336 B |