mirror of
https://github.com/boostorg/python.git
synced 2026-01-19 16:32:16 +00:00
Compare commits
61 Commits
boost-1.64
...
boost-1.67
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a383ecdd88 | ||
|
|
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 | ||
|
|
5121fc11f9 | ||
|
|
471e6181b2 | ||
|
|
398e7f02b8 | ||
|
|
1e315242ce | ||
|
|
77ee91d5c5 |
@@ -4,7 +4,7 @@ environment:
|
||||
# /E:ON and /V:ON options are not enabled in the batch script intepreter
|
||||
# See: http://stackoverflow.com/a/13751649/163740
|
||||
CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd"
|
||||
BOOST_PREFIX: C:\Libraries\boost_1_60_0
|
||||
BOOST_PREFIX: C:\Libraries\boost_1_63_0
|
||||
|
||||
matrix:
|
||||
|
||||
@@ -15,7 +15,8 @@ environment:
|
||||
- PYTHON: "C:\\Python27"
|
||||
PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
||||
PYTHON_ARCH: "32"
|
||||
ARCH: "x86"
|
||||
MSVC: "14.0"
|
||||
ARCH: x86
|
||||
|
||||
#- PYTHON: "C:\\Python27-x64"
|
||||
# PYTHON_VERSION: "2.7.x" # currently 2.7.9
|
||||
@@ -26,9 +27,11 @@ environment:
|
||||
# PYTHON_VERSION: "3.5.x" # currently 3.4.3
|
||||
# PYTHON_ARCH: "32"
|
||||
|
||||
#- PYTHON: "C:\\Python35-x64"
|
||||
# PYTHON_VERSION: "3.5.x" # currently 3.4.3
|
||||
# PYTHON_ARCH: "64"
|
||||
- PYTHON: "C:\\Python36-x64"
|
||||
PYTHON_VERSION: "3.6.x"
|
||||
PYTHON_ARCH: "64"
|
||||
MSVC: "12.0"
|
||||
ARCH: x86_64
|
||||
|
||||
install:
|
||||
# If there is a newer build queued for the same PR, cancel this one.
|
||||
@@ -68,19 +71,22 @@ install:
|
||||
# compiled extensions and are not provided as pre-built wheel packages,
|
||||
# pip will build them from source using the MSVC compiler matching the
|
||||
# target Python version and architecture
|
||||
- easy_install scons
|
||||
#- "%CMD_IN_ENV% pip install -r dev-requirements.txt"
|
||||
- |
|
||||
curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2018-03-07.tar.gz
|
||||
tar xf faber.tar.gz
|
||||
CD faber-snapshot-2018-03-07
|
||||
python setup.py install
|
||||
CD ..
|
||||
# report the available MSVC compilers
|
||||
- python -m faber.tools.msvc
|
||||
- easy_install sphinx
|
||||
- pip install numpy
|
||||
|
||||
build_script:
|
||||
# Build the compiled extension
|
||||
#- "%CMD_IN_ENV% python setup.py build"
|
||||
- scons config arch=%ARCH% --boost-include=%BOOST_PREFIX%
|
||||
- scons arch=%ARCH%
|
||||
- faber --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% msvc.version=%MSVC%
|
||||
|
||||
test_script:
|
||||
# Run the project tests
|
||||
#- "%CMD_IN_ENV% python setup.py nosetests"
|
||||
- scons test arch=%ARCH% --verbose
|
||||
- faber --with-boost-include=%BOOST_PREFIX% test.report target.arch=%ARCH% msvc.version=%MSVC%
|
||||
|
||||
after_test:
|
||||
# If tests are successful, create binary packages for the project.
|
||||
@@ -95,4 +101,4 @@ after_test:
|
||||
|
||||
#on_success:
|
||||
# - TODO: upload the content of dist/*.whl to a public wheelhouse
|
||||
#
|
||||
#
|
||||
3
.ci/faber
Normal file
3
.ci/faber
Normal file
@@ -0,0 +1,3 @@
|
||||
from faber.tools.python import python
|
||||
|
||||
p = python(command='$PYTHON')
|
||||
@@ -22,10 +22,10 @@ fi
|
||||
REPO=`git config remote.origin.url`
|
||||
SHA=`git rev-parse --verify HEAD`
|
||||
|
||||
# bin.SCons happens to contain the "doc/html" tree that we want to push
|
||||
# build happens to contain the "doc/html" tree that we want to push
|
||||
# into the gh-pages branch. So we step into that directory, create a new repo,
|
||||
# set the remote appropriately, then commit and push.
|
||||
cd bin.SCons
|
||||
cd build
|
||||
git init
|
||||
git config user.name "Travis CI"
|
||||
git config user.email "travis-ci"
|
||||
|
||||
43
.travis.yml
43
.travis.yml
@@ -26,11 +26,9 @@ matrix:
|
||||
- compiler: gcc
|
||||
env: CXX=g++ PYTHON=python3 CXXFLAGS=-std=c++11
|
||||
- compiler: clang
|
||||
# clang generates an 'illegal instruction' error in the NumPy check.
|
||||
# Perhaps we need to upgrade clang to a newer version ?
|
||||
env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++98 OPTIONS=--no-numpy
|
||||
env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++98
|
||||
- compiler: clang
|
||||
env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++11 OPTIONS=--no-numpy
|
||||
env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++11
|
||||
- env: PYTHON=python DOC=1
|
||||
|
||||
|
||||
@@ -39,7 +37,6 @@ addons:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- scons
|
||||
- gcc-4.8
|
||||
- g++-4.8
|
||||
- clang
|
||||
@@ -66,27 +63,47 @@ before_install:
|
||||
install:
|
||||
# Install our own version of Boost (the subset we need) as the system version is
|
||||
# too old (for C++11 support).
|
||||
- rm -rf $HOME/Boost
|
||||
- |
|
||||
set -e
|
||||
if [ ! -d $HOME/Boost ]; then
|
||||
echo "rebuilding Boost prerequisites"
|
||||
wget https://sourceforge.net/projects/boost/files/boost/1.61.0/boost_1_61_0.tar.gz/download
|
||||
if [ ! -d $HOME/Boost/tools/boostbook ]; then
|
||||
echo "rebuilding Boost prerequisites."
|
||||
wget https://sourceforge.net/projects/boost/files/boost/1.66.0/boost_1_66_0.tar.gz/download
|
||||
tar xf download
|
||||
pushd boost_1_61_0
|
||||
pushd boost_1_66_0
|
||||
./bootstrap.sh
|
||||
./b2 tools/bcp
|
||||
mkdir -p $HOME/Boost
|
||||
# Install Boost.Python prerequisites, but not Boost.Python itself.
|
||||
dist/bin/bcp python tools/boostbook tools/quickbook $HOME/Boost &> /dev/null
|
||||
rm -rf $HOME/Boost/boost/python*
|
||||
popd
|
||||
else
|
||||
echo "using cached Boost prerequisites."
|
||||
fi
|
||||
# Install Faber, the build tool.
|
||||
date=2018-03-07
|
||||
wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz
|
||||
tar xf $date.tar.gz
|
||||
pushd faber-snapshot-$date
|
||||
#wget https://github.com/stefanseefeld/faber/archive/release/0.2.tar.gz
|
||||
#tar xf 0.2.tar.gz
|
||||
#pushd faber-release-0.2
|
||||
sudo python setup.py install
|
||||
popd
|
||||
|
||||
before_script:
|
||||
- scons --version
|
||||
- sed -e "s/\$PYTHON/$PYTHON/g" .ci/faber > ~/.faber
|
||||
- $PYTHON --version
|
||||
- faber -h
|
||||
- ls -l $HOME/Boost
|
||||
|
||||
script:
|
||||
- scons config --python=$PYTHON --boost-include=$HOME/Boost $OPTIONS
|
||||
- if [ "$DOC" ]; then scons doc; else scons && scons test; fi
|
||||
- |
|
||||
if [ "$DOC" ]; then
|
||||
BOOST_ROOT=$HOME/Boost faber --builddir=build doc.html
|
||||
else
|
||||
faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS
|
||||
fi
|
||||
|
||||
after_success:
|
||||
# Upload docs only when building upstream.
|
||||
|
||||
68
Jamfile
Normal file
68
Jamfile
Normal file
@@ -0,0 +1,68 @@
|
||||
# Copyright (c) 2018 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)
|
||||
|
||||
import option ;
|
||||
import regex ;
|
||||
import python ;
|
||||
|
||||
#
|
||||
# The `version-suffix` rule really belongs into python.jam, and
|
||||
# should be moved there. `split-version` is only duplicated here
|
||||
# as a prerequisite. (See https://github.com/boostorg/build/pull/290)
|
||||
#
|
||||
|
||||
|
||||
# Validate the version string and extract the major/minor part we care about.
|
||||
#
|
||||
local rule split-version ( version )
|
||||
{
|
||||
local major-minor = [ MATCH "^([0-9]+)\.([0-9]+)(.*)$" : $(version) : 1 2 3 ] ;
|
||||
if ! $(major-minor[2]) || $(major-minor[3])
|
||||
{
|
||||
ECHO "Warning: \"using python\" expects a two part (major, minor) version number; got" $(version) instead ;
|
||||
|
||||
# Add a zero to account for the missing digit if necessary.
|
||||
major-minor += 0 ;
|
||||
}
|
||||
|
||||
return $(major-minor[1]) $(major-minor[2]) ;
|
||||
}
|
||||
|
||||
# Define a version suffix for libraries depending on Python.
|
||||
# For example, Boost.Python built for Python 2.7 uses the suffix "27"
|
||||
rule version-suffix ( version )
|
||||
{
|
||||
local major-minor = [ split-version $(version) ] ;
|
||||
local suffix = $(major-minor:J="") ;
|
||||
return $(suffix) ;
|
||||
}
|
||||
|
||||
|
||||
# Python build id (for Python libraries only).
|
||||
python-id = [ option.get "python-buildid" ] ;
|
||||
if $(python-id)
|
||||
{
|
||||
PYTHON_ID = [ regex.replace $(python-id) "[*\\/:.\"\']" _ ] ;
|
||||
}
|
||||
|
||||
rule python-tag ( name : type ? : property-set )
|
||||
{
|
||||
local result = $(name) ;
|
||||
if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB
|
||||
{
|
||||
local version = [ $(property-set).get <python> ] ;
|
||||
local lib-suffix = [ version-suffix $(version) ] ;
|
||||
result = $(result)$(lib-suffix) ;
|
||||
}
|
||||
if $(type) in STATIC_LIB SHARED_LIB IMPORT_LIB && $(PYTHON_ID)
|
||||
{
|
||||
result = $(result)-$(PYTHON_ID) ;
|
||||
}
|
||||
|
||||
# forward to the boost tagging rule
|
||||
return [ tag $(result) : $(type) : $(property-set) ] ;
|
||||
}
|
||||
21
README.md
21
README.md
@@ -27,27 +27,14 @@ While Boost.Python is part of the Boost C++ Libraries super-project, and thus ca
|
||||
|
||||
* [Python](http://www.python.org)
|
||||
* [Boost](http://www.boost.org)
|
||||
* [SCons](http://www.scons.org)
|
||||
|
||||
## Configure
|
||||
|
||||
Simply run
|
||||
|
||||
```
|
||||
scons config [options]
|
||||
```
|
||||
to prepare a build. See `scons -h` for a description of the available options. For example
|
||||
```
|
||||
scons config --boost=/path/to/boost --python=/path/to/python
|
||||
```
|
||||
will configure Boost.Python to be built against the two specific versions of Boost and Python.
|
||||
* [Faber](https://stefanseefeld.github.io/faber)
|
||||
|
||||
## Build
|
||||
|
||||
Run
|
||||
|
||||
```
|
||||
scons
|
||||
faber
|
||||
```
|
||||
to build the library.
|
||||
|
||||
@@ -56,7 +43,7 @@ to build the library.
|
||||
Run
|
||||
|
||||
```
|
||||
scons test
|
||||
faber test.report
|
||||
```
|
||||
to run the tests.
|
||||
|
||||
@@ -65,6 +52,6 @@ to run the tests.
|
||||
Run
|
||||
|
||||
```
|
||||
scons doc
|
||||
faber doc.html
|
||||
```
|
||||
to build the documentation.
|
||||
|
||||
100
SConstruct
100
SConstruct
@@ -1,100 +0,0 @@
|
||||
# -*- 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)
|
||||
|
||||
import SCons.Script.Main
|
||||
import config
|
||||
import config.ui
|
||||
import platform
|
||||
import os
|
||||
import subprocess
|
||||
import re
|
||||
|
||||
#
|
||||
# We try to mimic the typical autotools-workflow.
|
||||
#
|
||||
# * In a 'configure' step all the essential build parameters are established
|
||||
# (either by explicit command-line arguments or from configure checks)
|
||||
# * A subsequent build step can then simply read the cached variables, so
|
||||
# users don't have to memorize and re-issue the arguments on each subsequent
|
||||
# invocation, and neither do the config checks need to be re-run.
|
||||
#
|
||||
# The essential part here is to define a 'config' target, which removes any
|
||||
# caches that may still be lingering around, then runs the checks.
|
||||
|
||||
if 'config' in COMMAND_LINE_TARGETS:
|
||||
# Clear the cache
|
||||
try: os.remove('bin.SCons/config.py')
|
||||
except: pass
|
||||
if not os.path.exists('bin.SCons/'):
|
||||
os.mkdir('bin.SCons/')
|
||||
vars = Variables('bin.SCons/config.py', ARGUMENTS)
|
||||
config.add_options(vars)
|
||||
arch = ARGUMENTS.get('arch', platform.machine())
|
||||
env_vars = {}
|
||||
if 'CXX' in os.environ: env_vars['CXX'] = os.environ['CXX']
|
||||
if 'CXXFLAGS' in os.environ: env_vars['CXXFLAGS'] = os.environ['CXXFLAGS'].split()
|
||||
env = Environment(toolpath=['config/tools'],
|
||||
tools=['default', 'libs', 'tests', 'doc', 'sphinx4scons'],
|
||||
variables=vars,
|
||||
TARGET_ARCH=arch,
|
||||
**env_vars)
|
||||
if 'gcc' in env['TOOLS']:
|
||||
# Earlier SCons versions (~ 2.3.0) can't handle CXX=clang++.
|
||||
version = subprocess.check_output([env['CXX'], '--version'])
|
||||
match = re.search(r'[0-9]+(\.[0-9]+)+', version)
|
||||
if match:
|
||||
version = match.group(0)
|
||||
else:
|
||||
version = 'unknown'
|
||||
env['CXXVERSION'] = version
|
||||
|
||||
Help(config.ui.help(vars, env) + """
|
||||
Variables are saved in bin.SCons/config.py and persist between scons invocations.
|
||||
""")
|
||||
|
||||
if GetOption('help'):
|
||||
Return()
|
||||
|
||||
build_dir = config.prepare_build_dir(env)
|
||||
config_log = '{}/config.log'.format(build_dir)
|
||||
|
||||
# configure
|
||||
SConsignFile('{}/.sconsign'.format(build_dir))
|
||||
#env.Decider('MD5-timestamp')
|
||||
env.Decider('timestamp-newer')
|
||||
checks = config.get_checks(env)
|
||||
if 'config' in COMMAND_LINE_TARGETS:
|
||||
conf=env.Configure(custom_tests=checks, log_file=config_log, conf_dir=build_dir)
|
||||
if False in (getattr(conf, c)() for c in checks):
|
||||
Exit(1)
|
||||
env = conf.Finish()
|
||||
vars.Save('bin.SCons/config.py', env)
|
||||
|
||||
if not os.path.exists(config_log):
|
||||
print('Please run `scons config` first. (See `scons -h` for available options.)')
|
||||
Exit(1)
|
||||
|
||||
if not GetOption('verbose'):
|
||||
config.ui.pretty_output(env)
|
||||
|
||||
# build
|
||||
env['BPL_VERSION'] = '1.62'
|
||||
for e in config.variants(env):
|
||||
variant_dir=e.subst("$BOOST_CURRENT_VARIANT_DIR")
|
||||
e.SConscript('src/SConscript', variant_dir=variant_dir + '/src',
|
||||
exports = { 'env' : e.Clone(BOOST_LIB = 'python') })
|
||||
if 'test' in COMMAND_LINE_TARGETS:
|
||||
test_env = e.Clone(BOOST_LIB = 'python', BOOST_TEST = True)
|
||||
test_env.BoostUseLib('python')
|
||||
e.SConscript('test/SConscript', variant_dir=variant_dir + '/test',
|
||||
exports = { 'env' : test_env })
|
||||
|
||||
if 'doc' in COMMAND_LINE_TARGETS:
|
||||
env.SConscript('doc/SConscript', variant_dir='bin.SCons/doc',
|
||||
exports = { 'env' : e.Clone(BOOST_LIB = 'python') })
|
||||
228
build/Jamfile
228
build/Jamfile
@@ -7,7 +7,6 @@ import indirect ;
|
||||
import modules ;
|
||||
import feature ;
|
||||
import property ;
|
||||
|
||||
import python ;
|
||||
|
||||
if ! [ python.configured ] && ! ( --without-python in [ modules.peek : ARGV ] )
|
||||
@@ -31,9 +30,6 @@ else
|
||||
;
|
||||
}
|
||||
|
||||
py2-version = [ py-version 2 ] ;
|
||||
py3-version = [ py-version 3 ] ;
|
||||
|
||||
project boost/python
|
||||
: source-location ../src
|
||||
;
|
||||
@@ -42,147 +38,95 @@ rule cond ( test ? : yes * : no * ) { if $(test) { return $(yes) ; } else { retu
|
||||
rule unless ( test ? : yes * : no * ) { if ! $(test) { return $(yes) ; } else { return $(no) ; } }
|
||||
local rule eq ( a : b ) { if $(a) = $(b) { return 1 ; } }
|
||||
|
||||
lib_boost_python(2) = boost_python ;
|
||||
lib_boost_python(3) = boost_python3 ;
|
||||
lib boost_python
|
||||
: # sources
|
||||
list.cpp
|
||||
long.cpp
|
||||
dict.cpp
|
||||
tuple.cpp
|
||||
str.cpp
|
||||
slice.cpp
|
||||
|
||||
lib_boost_python($(py2-version)) = $(lib_boost_python(2)) ;
|
||||
lib_boost_python($(py3-version)) = $(lib_boost_python(3)) ;
|
||||
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
|
||||
|
||||
rule lib_boost_python ( version )
|
||||
{
|
||||
lib $(lib_boost_python($(version)))
|
||||
: # sources
|
||||
numeric.cpp
|
||||
list.cpp
|
||||
long.cpp
|
||||
dict.cpp
|
||||
tuple.cpp
|
||||
str.cpp
|
||||
slice.cpp
|
||||
# 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 ]
|
||||
|
||||
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
|
||||
# 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>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||
<tag>@$(__name__).python-tag
|
||||
<conditional>@python.require-py
|
||||
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
<python>$(version)
|
||||
: # default build
|
||||
<link>shared
|
||||
: # usage requirements
|
||||
<link>static:<define>BOOST_PYTHON_STATIC_LIB
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
;
|
||||
|
||||
-<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||
<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).python-tag
|
||||
numpy-include = [ python.numpy-include ] ;
|
||||
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 ]
|
||||
<include>$(numpy-include)
|
||||
<library>boost_python
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
-<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||
<tag>@$(__name__).python-tag
|
||||
<conditional>@python.require-py
|
||||
|
||||
<conditional>@python.require-py
|
||||
|
||||
: # default build
|
||||
<link>shared
|
||||
: # usage requirements
|
||||
<link>static:<define>BOOST_PYTHON_STATIC_LIB
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
;
|
||||
}
|
||||
|
||||
lib_boost_numpy(2) = boost_numpy ;
|
||||
lib_boost_numpy(3) = boost_numpy3 ;
|
||||
|
||||
lib_boost_numpy($(py2-version)) = $(lib_boost_python(2)) ;
|
||||
lib_boost_numpy($(py3-version)) = $(lib_boost_python(3)) ;
|
||||
|
||||
rule lib_boost_numpy ( version )
|
||||
{
|
||||
numpy-include = [ python.numpy-include ] ;
|
||||
lib $(lib_boost_numpy($(version)))
|
||||
: # 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 ]
|
||||
<include>$(numpy-include)
|
||||
<library>$(lib_boost_python($(version)))
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
<python>$(version)
|
||||
|
||||
-<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag
|
||||
<tag>@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).python-tag
|
||||
|
||||
<conditional>@python.require-py
|
||||
|
||||
: # default build
|
||||
<link>shared
|
||||
: # usage requirements
|
||||
<link>static:<define>BOOST_NUMPY_STATIC_LIB
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
;
|
||||
}
|
||||
|
||||
libraries = ;
|
||||
|
||||
for local N in 2 3
|
||||
{
|
||||
if $(py$(N)-version)
|
||||
{
|
||||
lib_boost_python $(py$(N)-version) ;
|
||||
libraries += $(lib_boost_python($(py$(N)-version))) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
alias $(lib_boost_python($(N))) ;
|
||||
}
|
||||
if $(py$(N)-version) && [ python.numpy ]
|
||||
{
|
||||
lib_boost_numpy $(py$(N)-version) ;
|
||||
libraries += $(lib_boost_numpy($(py$(N)-version))) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
alias $(lib_boost_numpy($(N))) ;
|
||||
}
|
||||
}
|
||||
|
||||
boost-install $(libraries) ;
|
||||
: # default build
|
||||
<link>shared
|
||||
: # usage requirements
|
||||
<link>static:<define>BOOST_NUMPY_STATIC_LIB
|
||||
<python-debugging>on:<define>BOOST_DEBUG_PYTHON
|
||||
;
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
#
|
||||
# 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 SCons.Variables import *
|
||||
from SCons.Script import AddOption
|
||||
from collections import OrderedDict
|
||||
import platform
|
||||
from . import ui
|
||||
from . import cxx
|
||||
from . import python
|
||||
from . import numpy
|
||||
from . import boost
|
||||
|
||||
def add_options(vars):
|
||||
ui.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose mode: print full commands.')
|
||||
ui.add_option('--no-numpy', dest='numpy', action='store_false', help='do not attempt to build NumPy bindings.')
|
||||
python.add_options(vars)
|
||||
numpy.add_options(vars)
|
||||
boost.add_options(vars)
|
||||
|
||||
vars.Add('CXX')
|
||||
vars.Add('CPPPATH', converter=lambda v:v.split())
|
||||
vars.Add('CCFLAGS', converter=lambda v:v.split())
|
||||
vars.Add('CXXFLAGS', converter=lambda v:v.split())
|
||||
vars.Add('LIBPATH', converter=lambda v:v.split())
|
||||
vars.Add('LIBS', converter=lambda v:v.split())
|
||||
vars.Add('PYTHON')
|
||||
vars.Add('PYTHONLIBS')
|
||||
vars.Add('prefix')
|
||||
vars.Add('boostbook_prefix')
|
||||
vars.Add('CXX11')
|
||||
vars.Add('NUMPY')
|
||||
vars.Add('NUMPY_CPPPATH', converter=lambda v:v.split())
|
||||
|
||||
ui.add_variable(vars, ("arch", "target architeture", platform.machine()))
|
||||
ui.add_variable(vars, ("toolchain", "toolchain to use", 'gcc'))
|
||||
ui.add_variable(vars, ListVariable("variant", "Build configuration", "release", ["release", "debug", "profile"]))
|
||||
ui.add_variable(vars, ListVariable("link", "Library linking", "dynamic", ["static", "dynamic"]))
|
||||
ui.add_variable(vars, ListVariable("threading", "Multi-threading support", "multi", ["single", "multi"]))
|
||||
ui.add_variable(vars, EnumVariable("layout", "Layout of library names and header locations", "versioned", ["versioned", "system"]))
|
||||
ui.add_variable(vars, PathVariable("stagedir", "If --stage is passed install only compiled library files in this location", "stage", PathVariable.PathAccept))
|
||||
ui.add_variable(vars, PathVariable("prefix", "Install prefix", "/usr/local", PathVariable.PathAccept))
|
||||
|
||||
|
||||
def get_checks(env):
|
||||
checks = OrderedDict()
|
||||
checks['cxx'] = cxx.check
|
||||
checks['python'] = python.check
|
||||
if env.GetOption('numpy') is not False:
|
||||
checks['numpy'] = numpy.check
|
||||
else:
|
||||
env['NUMPY'] = False
|
||||
checks['boost'] = boost.check
|
||||
return checks
|
||||
|
||||
|
||||
def set_property(env, **kw):
|
||||
|
||||
from toolchains.gcc import features as gcc_features
|
||||
from toolchains.msvc import features as msvc_features
|
||||
|
||||
if 'gcc' in env['TOOLS']: features = gcc_features
|
||||
elif 'msvc' in env['TOOLS']: features = msvc_features
|
||||
else: raise Error('unknown toolchain')
|
||||
features.init_once(env)
|
||||
for (prop,value) in kw.items():
|
||||
getattr(features, prop, lambda x, y : None)(env, value)
|
||||
env[prop.upper()] = value
|
||||
|
||||
|
||||
def boost_suffix(env):
|
||||
suffix = str()
|
||||
|
||||
if env["layout"] == "versioned":
|
||||
if "gcc" in env["TOOLS"]:
|
||||
if env['CXX'] in ('clang', 'clang++'):
|
||||
suffix += "-clang" + "".join(env["CXXVERSION"].split(".")[0:2])
|
||||
else: # assume g++
|
||||
suffix += "-gcc" + "".join(env["CXXVERSION"].split(".")[0:2])
|
||||
if env["THREADING"] == "multi":
|
||||
suffix += "-mt"
|
||||
if env["DEBUG"]:
|
||||
suffix += "-d"
|
||||
if env["layout"] == "versioned":
|
||||
suffix += "-" + "_".join(env["BPL_VERSION"].split("."))
|
||||
|
||||
return suffix
|
||||
|
||||
|
||||
def prepare_build_dir(env):
|
||||
|
||||
vars = {}
|
||||
env["boost_suffix"] = boost_suffix
|
||||
build_dir="bin.SCons"
|
||||
# FIXME: Support 'toolchain' variable properly.
|
||||
# For now, we simply check whether $CXX refers to clang or gcc.
|
||||
if "gcc" in env["TOOLS"]:
|
||||
if env['CXX'] in ('clang', 'clang++'):
|
||||
build_dir+="/clang-%s"%env["CXXVERSION"]
|
||||
else: # assume g++
|
||||
build_dir+="/gcc-%s"%env["CXXVERSION"]
|
||||
default_cxxflags = ['-ftemplate-depth-128', '-Wall', '-g', '-O2']
|
||||
vars['CXXFLAGS'] = env.get('CXXFLAGS', default_cxxflags)
|
||||
elif "msvc" in env["TOOLS"]:
|
||||
build_dir+="/msvc-%s"%env["MSVS_VERSION"]
|
||||
vars['BOOST_BUILD_DIR'] = build_dir
|
||||
vars['BOOST_SUFFIX'] = "${boost_suffix(__env__)}"
|
||||
env.Replace(**vars)
|
||||
return build_dir
|
||||
|
||||
|
||||
def variants(env):
|
||||
|
||||
env.Prepend(CPPPATH = "#/include", CPPDEFINES = ["BOOST_ALL_NO_LIB=1"])
|
||||
set_property(env, architecture = env['TARGET_ARCH'])
|
||||
for variant in env["variant"]:
|
||||
e = env.Clone()
|
||||
e["current_variant"] = variant
|
||||
set_property(env, profile = False)
|
||||
if variant == "release":
|
||||
set_property(e, optimize = "speed", debug = False)
|
||||
elif variant == "debug":
|
||||
set_property(e, optimize = "no", debug = True)
|
||||
elif variant == "profile":
|
||||
set_property(e, optimize = "speed", profile = True, debug = True)
|
||||
for linking in env["link"]:
|
||||
e["linking"] = linking
|
||||
if linking == "dynamic":
|
||||
e["LINK_DYNAMIC"] = True
|
||||
else:
|
||||
e["LINK_DYNAMIC"] = False
|
||||
for threading in e["threading"]:
|
||||
e["current_threading"] = threading
|
||||
set_property(e, threading = threading)
|
||||
yield e
|
||||
@@ -1,45 +0,0 @@
|
||||
#
|
||||
# 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 . import ui
|
||||
import os
|
||||
|
||||
def add_options(vars):
|
||||
|
||||
ui.add_option("--boost-prefix", dest="boost_prefix", type="string", nargs=1, action="store",
|
||||
metavar="DIR", default=os.environ.get("BOOST_DIR"),
|
||||
help="prefix for Boost libraries; should have 'include' and 'lib' subdirectories, 'boost' and 'stage\\lib' subdirectories on Windows")
|
||||
ui.add_option("--boost-include", dest="boost_include", type="string", nargs=1, action="store",
|
||||
metavar="DIR", help="location of Boost header files")
|
||||
ui.add_option("--boostbook-prefix", dest="boostbook_prefix", type="string",
|
||||
nargs=1, action="store",
|
||||
metavar="DIR", default="/usr/share/boostbook",
|
||||
help="prefix for BoostBook stylesheets")
|
||||
|
||||
def check(context):
|
||||
|
||||
boost_source_file = r"#include <boost/config.hpp>"
|
||||
|
||||
context.Message('Checking for Boost...')
|
||||
|
||||
boost_prefix = context.env.GetOption('boost_prefix')
|
||||
boost_include = context.env.GetOption('boost_include')
|
||||
boostbook_prefix = context.env.GetOption('boostbook_prefix')
|
||||
incpath=None
|
||||
if boost_include:
|
||||
incpath=boost_include
|
||||
elif boost_prefix:
|
||||
incpath=boost_prefix
|
||||
if incpath:
|
||||
context.env.AppendUnique(CPPPATH=[incpath])
|
||||
if not context.TryCompile(boost_source_file, '.cpp'):
|
||||
context.Result(0)
|
||||
return False
|
||||
context.env.AppendUnique(boostbook_prefix=boostbook_prefix)
|
||||
context.Result(1)
|
||||
return True
|
||||
@@ -1,30 +0,0 @@
|
||||
#
|
||||
# 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 . import ui
|
||||
import os
|
||||
|
||||
def add_options(vars):
|
||||
|
||||
pass
|
||||
|
||||
def check(context):
|
||||
|
||||
source = r"""#if __cplusplus < 201103L
|
||||
#error no C++11
|
||||
#endif"""
|
||||
|
||||
context.Message('Checking for C++11 support...')
|
||||
|
||||
if not context.TryCompile(source, '.cpp'):
|
||||
context.env['CXX11'] = False
|
||||
context.Result(0)
|
||||
else:
|
||||
context.env['CXX11'] = True
|
||||
context.Result(1)
|
||||
return True
|
||||
@@ -1,86 +0,0 @@
|
||||
#
|
||||
# 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 . import ui
|
||||
from contextlib import contextmanager
|
||||
|
||||
@contextmanager
|
||||
def saved(context):
|
||||
save_cpppath = context.env.get('CPPPATH', [])
|
||||
save_libs = context.env.get('LIBS', [])
|
||||
yield context
|
||||
context.env.Replace(LIBS=save_libs)
|
||||
context.env.Replace(CPPPATH=save_cpppath)
|
||||
|
||||
|
||||
def add_options(vars):
|
||||
|
||||
pass
|
||||
|
||||
|
||||
def check(context):
|
||||
|
||||
numpy_source_file = r"""
|
||||
// If defined, enforces linking againg PythonXXd.lib, which
|
||||
// is usually not included in Python environments.
|
||||
#undef _DEBUG
|
||||
#include "Python.h"
|
||||
#include "numpy/arrayobject.h"
|
||||
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
void *initialize() { import_array();}
|
||||
#else
|
||||
void initialize() { import_array();}
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
int result = 0;
|
||||
Py_Initialize();
|
||||
initialize();
|
||||
if (PyErr_Occurred())
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
npy_intp dims = 2;
|
||||
PyObject * a = PyArray_SimpleNew(1, &dims, NPY_INT);
|
||||
if (!a) result = 1;
|
||||
Py_DECREF(a);
|
||||
}
|
||||
Py_Finalize();
|
||||
return result;
|
||||
}
|
||||
"""
|
||||
|
||||
import platform
|
||||
import subprocess
|
||||
import re, os
|
||||
|
||||
def check_python(cmd):
|
||||
try:
|
||||
return True, subprocess.check_output([python, '-c', cmd]).strip()
|
||||
except subprocess.CalledProcessError as e:
|
||||
return False, e
|
||||
|
||||
context.Message('Checking for NumPy...')
|
||||
with saved(context):
|
||||
python = context.env['PYTHON']
|
||||
result, numpy_incpath = check_python('import numpy; print(numpy.get_include())')
|
||||
if result:
|
||||
context.env.AppendUnique(CPPPATH=numpy_incpath)
|
||||
context.env.AppendUnique(LIBS=context.env['PYTHONLIBS'])
|
||||
result, output = context.TryRun(numpy_source_file,'.cpp')
|
||||
if not result:
|
||||
context.Result(0)
|
||||
return False
|
||||
context.env['NUMPY'] = True
|
||||
context.env['NUMPY_CPPPATH'] = numpy_incpath
|
||||
context.Result(1)
|
||||
return True
|
||||
@@ -1,98 +0,0 @@
|
||||
#
|
||||
# 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 . import ui
|
||||
|
||||
def add_options(vars):
|
||||
|
||||
ui.add_option('--python', help='the python executable')
|
||||
|
||||
|
||||
def check(context):
|
||||
|
||||
python_source_file = r"""
|
||||
// If defined, enforces linking againg PythonXXd.lib, which
|
||||
// is usually not included in Python environments.
|
||||
#undef _DEBUG
|
||||
#include "Python.h"
|
||||
int main()
|
||||
{
|
||||
Py_Initialize();
|
||||
Py_Finalize();
|
||||
return 0;
|
||||
}
|
||||
"""
|
||||
|
||||
import platform
|
||||
import subprocess
|
||||
import re, os
|
||||
|
||||
def check_python(cmd):
|
||||
return subprocess.check_output([python, '-c', cmd]).strip()
|
||||
|
||||
def check_sysconfig(cmd):
|
||||
r = check_python('import distutils.sysconfig as c; print(c.%s)'%cmd)
|
||||
return r if r != 'None' else ''
|
||||
|
||||
context.Message('Checking for Python...')
|
||||
python = context.env.GetOption('python') or 'python'
|
||||
context.env['PYTHON'] = python
|
||||
incpath = check_sysconfig('get_python_inc()')
|
||||
context.env.AppendUnique(CPPPATH=[incpath])
|
||||
if platform.system() == 'Windows':
|
||||
version = check_python('import sys; print("%d%d"%sys.version_info[0:2])')
|
||||
prefix = check_python('import sys; print(sys.prefix)')
|
||||
libfile = os.path.join(prefix, 'libs', 'python%s.lib'%version)
|
||||
libpath = os.path.join(prefix, 'libs')
|
||||
lib = 'python%s'%version
|
||||
context.env.AppendUnique(LIBS=[lib])
|
||||
else:
|
||||
libpath = check_sysconfig('get_config_var("LIBDIR")')
|
||||
libfile = check_sysconfig('get_config_var("LIBRARY")')
|
||||
match = re.search('(python.*)\.(a|so|dylib)', libfile)
|
||||
lib = None
|
||||
if match:
|
||||
lib = match.group(1)
|
||||
context.env.AppendUnique(PYTHONLIBS=[lib])
|
||||
if match.group(2) == 'a':
|
||||
flags = check_sysconfig('get_config_var("LINKFORSHARED")')
|
||||
if flags is not None:
|
||||
context.env.AppendUnique(LINKFLAGS=flags.split())
|
||||
context.env.AppendUnique(LIBPATH=[libpath])
|
||||
oldlibs = context.AppendLIBS([lib])
|
||||
flags = check_sysconfig('get_config_var("MODLIBS")')
|
||||
flags += ' ' + check_sysconfig('get_config_var("SHLIBS")')
|
||||
flags = [f[2:] for f in flags.strip().split() if f.startswith('-l')]
|
||||
if flags:
|
||||
context.AppendLIBS([flags])
|
||||
result = context.TryLink(python_source_file,'.cpp')
|
||||
if not result and context.env['PLATFORM'] == 'darwin':
|
||||
# Sometimes we need some extra stuff on Mac OS
|
||||
frameworkDir = libpath # search up the libDir tree for the proper home for frameworks
|
||||
while frameworkDir and frameworkDir != "/":
|
||||
frameworkDir, d2 = os.path.split(frameworkDir)
|
||||
if d2 == "Python.framework":
|
||||
if not "Python" in os.listdir(os.path.join(frameworkDir, d2)):
|
||||
context.Result(0)
|
||||
print((
|
||||
"Expected to find Python in framework directory %s, but it isn't there"
|
||||
% frameworkDir))
|
||||
return False
|
||||
break
|
||||
context.env.AppendUnique(LINKFLAGS="-F%s" % frameworkDir)
|
||||
result = context.TryLink(python_source_file,'.cpp')
|
||||
if not result:
|
||||
context.Result(0)
|
||||
print("Cannot link program with Python.")
|
||||
return False
|
||||
if context.env['PLATFORM'] == 'darwin':
|
||||
context.env['LDMODULESUFFIX'] = '.so'
|
||||
context.Result(1)
|
||||
context.SetLIBS(oldlibs)
|
||||
context.env.AppendUnique(PYTHONLIBS=[lib] + flags)
|
||||
return True
|
||||
@@ -1,18 +0,0 @@
|
||||
#
|
||||
# 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)
|
||||
|
||||
import traceback
|
||||
|
||||
def append_feature_flag(env, **kw):
|
||||
stack = traceback.extract_stack(limit = 3)
|
||||
feature = stack[0][2].upper()
|
||||
for (key, val) in kw.items():
|
||||
feature_var = feature + "_" + key
|
||||
env.AppendUnique(**{ key : "$" + feature_var })
|
||||
env[feature_var] = val
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
#
|
||||
# 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 . import append_feature_flag
|
||||
|
||||
class features:
|
||||
|
||||
@classmethod
|
||||
def init_once(cls, env):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def architecture(env, arch):
|
||||
if arch:
|
||||
flag = {'x86' : '-m32',
|
||||
'x86_64' : '-m64',}.get(arch)
|
||||
if flag:
|
||||
append_feature_flag(env, CCFLAGS = flag)
|
||||
|
||||
@staticmethod
|
||||
def optimize(env, optimize):
|
||||
if not optimize or optimize == "no":
|
||||
append_feature_flag(env, CCFLAGS = "-O0 -fno-inline")
|
||||
elif optimize == "speed":
|
||||
append_feature_flag(env, CCFLAGS = "-O3 -finline-functions -Wno-inline")
|
||||
elif optimize == "space":
|
||||
append_feature_flag(env, CCFLAGS = "-Os")
|
||||
else:
|
||||
append_feature_flag(env, CCFLAGS = "")
|
||||
|
||||
@staticmethod
|
||||
def profile(env, profile):
|
||||
if profile:
|
||||
append_feature_flag(env, CCFLAGS = "-pg", LINKFLAGS = "-pg")
|
||||
else:
|
||||
append_feature_flag(env, CCFLAGS = "", LINKFLAGS = "")
|
||||
|
||||
@staticmethod
|
||||
def threading(env, threading):
|
||||
if threading == "multi":
|
||||
append_feature_flag(env, CCFLAGS = "-pthread", LINKFLAGS = "-pthread")
|
||||
else:
|
||||
append_feature_flag(env, CCFLAGS = "", LINKFLAGS = "")
|
||||
|
||||
@staticmethod
|
||||
def debug(env, debug):
|
||||
if debug:
|
||||
append_feature_flag(env, CCFLAGS = "-g", CPPDEFINES = [])
|
||||
else:
|
||||
append_feature_flag(env, CCFLAGS = "", CPPDEFINES = "NDEBUG")
|
||||
@@ -1,57 +0,0 @@
|
||||
#
|
||||
# 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 . import append_feature_flag
|
||||
|
||||
class features:
|
||||
|
||||
@classmethod
|
||||
def init_once(cls, env):
|
||||
env.AppendUnique(CCFLAGS = ['-TP', '/Z7', '/W3' ,'/GR', '/MDd', '/Zc:forScope', '/Zc:wchar_t', '/wd4675', '/EHs'])
|
||||
env.AppendUnique(LINKFLAGS = ['/subsystem:console'])
|
||||
|
||||
@staticmethod
|
||||
def architecture(env, arch):
|
||||
if arch:
|
||||
flag = {'x86' : '/MACHINE:X86',
|
||||
'x86_64' : '/MACHINE:X64',}.get(arch)
|
||||
if flag:
|
||||
append_feature_flag(env, LINKFLAGS = flag)
|
||||
|
||||
@staticmethod
|
||||
def optimize(env, optimize):
|
||||
#if not optimize or optimize == "no":
|
||||
# append_feature_flag(env, CCFLAGS = "-O0 -fno-inline")
|
||||
#elif optimize == "speed":
|
||||
# append_feature_flag(env, CCFLAGS = "-O3 -finline-functions -Wno-inline")
|
||||
#elif optimize == "space":
|
||||
# append_feature_flag(env, CCFLAGS = "-Os")
|
||||
#else:
|
||||
append_feature_flag(env, CCFLAGS = "")
|
||||
|
||||
@staticmethod
|
||||
def profile(env, profile):
|
||||
#if profile:
|
||||
# append_feature_flag(env, CCFLAGS = "-pg", LINKFLAGS = "-pg")
|
||||
#else:
|
||||
append_feature_flag(env, CCFLAGS = "", LINKFLAGS = "")
|
||||
|
||||
@staticmethod
|
||||
def threading(env, threading):
|
||||
#if threading == "multi":
|
||||
# append_feature_flag(env, CCFLAGS = "/MT")
|
||||
#else:
|
||||
# append_feature_flag(env, CCFLAGS = "", LINKFLAGS = "")
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def debug(env, debug):
|
||||
#if debug:
|
||||
# append_feature_flag(env, CCFLAGS = "-g", CPPDEFINES = [])
|
||||
#else:
|
||||
append_feature_flag(env, CCFLAGS = "", CPPDEFINES = "NDEBUG")
|
||||
@@ -1,44 +0,0 @@
|
||||
#
|
||||
# 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)
|
||||
|
||||
# Based on SCons/Tool/gcc.py
|
||||
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
import SCons.Util
|
||||
import SCons.Tool.cc
|
||||
|
||||
compilers = ['clang']
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables for clang to an Environment."""
|
||||
SCons.Tool.cc.generate(env)
|
||||
|
||||
env['CC'] = env.Detect(compilers) or 'clang'
|
||||
if env['PLATFORM'] in ['cygwin', 'win32']:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
|
||||
else:
|
||||
env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
|
||||
# determine compiler version
|
||||
if env['CC']:
|
||||
#pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'],
|
||||
pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
|
||||
stdin = 'devnull',
|
||||
stderr = 'devnull',
|
||||
stdout = subprocess.PIPE)
|
||||
if pipe.wait() != 0: return
|
||||
# clang -dumpversion is of no use
|
||||
line = pipe.stdout.readline()
|
||||
match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line)
|
||||
if match:
|
||||
env['CCVERSION'] = match.group(1)
|
||||
|
||||
def exists(env):
|
||||
return env.Detect(compilers)
|
||||
@@ -1,75 +0,0 @@
|
||||
#
|
||||
# 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 SCons.Script import AddOption, Flatten
|
||||
from SCons.Script import Builder
|
||||
from SCons.Action import Action
|
||||
from SCons.Defaults import Copy
|
||||
from SCons.Script import *
|
||||
from subprocess import check_output, STDOUT, CalledProcessError
|
||||
import sys
|
||||
import os
|
||||
|
||||
def QuickBook(env, target, source, dependencies=[]):
|
||||
"""Compile a QuickBook document to BoostBook."""
|
||||
|
||||
for d in dependencies:
|
||||
env.Depends(target, d)
|
||||
env.Command(target, source, 'quickbook --input-file=$SOURCE --output-file=$TARGET')
|
||||
|
||||
|
||||
def BoostBook(env, target, source, resources=[], args=[]):
|
||||
"""Compile a BoostBook document to DocBook."""
|
||||
|
||||
bb_prefix = env.GetOption('boostbook_prefix')
|
||||
stylesheet = bb_prefix + '/xsl/docbook.xsl'
|
||||
env.Command(target, source,
|
||||
'xsltproc {} -o $TARGET {} $SOURCE'.format(' '.join(args), stylesheet))
|
||||
|
||||
|
||||
def BoostHTML(env, target, source, resources=[], args=[]):
|
||||
"""Compile a DocBook document to HTML."""
|
||||
|
||||
bb_prefix = env.GetOption('boostbook_prefix')
|
||||
stylesheet = bb_prefix + '/xsl/html.xsl'
|
||||
env.Command(target, source,
|
||||
'xsltproc {} -o $TARGET/ {} $SOURCE'.format(' '.join(args), stylesheet))
|
||||
prefix=Dir('.').path
|
||||
for r in resources:
|
||||
r = File(r).path[len(prefix)+1:]
|
||||
env.Depends(target, target + r)
|
||||
env.Command(target + r, r, Copy('$TARGET', '$SOURCE'))
|
||||
|
||||
|
||||
def BoostRST(env, target, source, resources=[]):
|
||||
"""Compile an RST document to HTML."""
|
||||
|
||||
prefix=Dir('.').path
|
||||
for r in resources:
|
||||
r = File(r).path[len(prefix)+1:]
|
||||
env.Depends('html/' + r, r)
|
||||
env.Command('html/' + r, r, Copy('$TARGET', '$SOURCE'))
|
||||
env.Command(target, source,
|
||||
'rst2html --link-stylesheet --traceback --trim-footnote-reference-space --footnote-references=superscript --stylesheet=rst.css $SOURCE $TARGET')
|
||||
|
||||
|
||||
def BoostSphinx(env, target, source):
|
||||
env.Sphinx(target, source)
|
||||
|
||||
|
||||
def exists(env):
|
||||
return True
|
||||
|
||||
|
||||
def generate(env):
|
||||
|
||||
env.AddMethod(QuickBook)
|
||||
env.AddMethod(BoostBook)
|
||||
env.AddMethod(BoostHTML)
|
||||
env.AddMethod(BoostRST)
|
||||
env.AddMethod(BoostSphinx)
|
||||
@@ -1,85 +0,0 @@
|
||||
#
|
||||
# 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 SCons.Script import AddOption, COMMAND_LINE_TARGETS, BUILD_TARGETS
|
||||
import distutils.sysconfig
|
||||
import platform
|
||||
|
||||
|
||||
def BoostLibrary(env, lib, sources, make_aliases = True, **kw):
|
||||
if env["LINK_DYNAMIC"]:
|
||||
lib_node = env.SharedLibrary("boost_" + lib + env["BOOST_SUFFIX"], sources, **kw)
|
||||
else:
|
||||
lib_node = env.StaticLibrary("boost_" + lib + env["BOOST_SUFFIX"], sources, **kw)
|
||||
|
||||
if make_aliases:
|
||||
if env.GetOption("stage"):
|
||||
env.Alias(lib, env.Install(env.Dir("$stagedir", "#"), lib_node))
|
||||
env.Default(env.Alias(lib, lib_node))
|
||||
|
||||
if env.GetOption("install"):
|
||||
env.Alias(lib, env.Install("$prefix/lib", lib_node))
|
||||
env.Alias(lib, env.Install('$prefix/include/boost', '#/include/boost/python'))
|
||||
env.Alias(lib, env.Install('$prefix/include/boost', '#/include/boost/python.hpp'))
|
||||
return lib_node
|
||||
|
||||
|
||||
def BoostUseLib(env, lib):
|
||||
build_dir = env.Dir('$BOOST_CURRENT_VARIANT_DIR/src')
|
||||
env.AppendUnique(LIBPATH = [build_dir],
|
||||
LIBS = ["boost_" + lib + env["BOOST_SUFFIX"]])
|
||||
if env.get("BOOST_TEST"):
|
||||
env.AppendUnique(RPATH = [build_dir])
|
||||
if platform.system() == 'Windows':
|
||||
env.PrependENVPath('PATH', build_dir.abspath)
|
||||
else:
|
||||
env.PrependENVPath('LD_LIBRARY_PATH', build_dir.abspath)
|
||||
|
||||
|
||||
def PythonExtension(env, lib, sources, **kw):
|
||||
if env["LINK_DYNAMIC"]:
|
||||
ext = env.SharedLibrary(lib, sources, SHLIBPREFIX='', SHLIBSUFFIX=distutils.sysconfig.get_config_var("SO"), **kw)
|
||||
return ext
|
||||
|
||||
|
||||
def boost_copy_func(dest, source, env):
|
||||
import os, stat, shutil
|
||||
|
||||
if os.path.isdir(source):
|
||||
if os.path.exists(dest):
|
||||
if not os.path.isdir(dest):
|
||||
raise SCons.Errors.UserError, "cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source))
|
||||
else:
|
||||
os.makedirs(dest)
|
||||
for file in os.listdir(source):
|
||||
if file == ".svn": continue
|
||||
boost_copy_func(os.path.join(dest, file), os.path.join(source, file), env)
|
||||
else:
|
||||
shutil.copy2(source, dest)
|
||||
st = os.stat(source)
|
||||
os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def exists(env):
|
||||
return True
|
||||
|
||||
|
||||
def generate(env):
|
||||
env.AddMethod(BoostLibrary)
|
||||
env.AddMethod(BoostUseLib)
|
||||
env.AddMethod(PythonExtension)
|
||||
|
||||
env.Replace(
|
||||
INSTALL = boost_copy_func,
|
||||
BOOST_CURRENT_VARIANT_DIR = "#/$BOOST_BUILD_DIR/$current_variant/$linking/threading-$current_threading"
|
||||
)
|
||||
|
||||
AddOption('--stage', dest='stage', action="store_true")
|
||||
AddOption('--install', dest='install', action="store_true")
|
||||
@@ -1,592 +0,0 @@
|
||||
"""SCons.Tool.spinx4scons
|
||||
|
||||
Tool-specific initialization for the Sphinx document build system.
|
||||
|
||||
There normally shouldn't be any need to import this module directly.
|
||||
It will usually be imported through the generic SCons.Tool.Tool()
|
||||
selection method.
|
||||
|
||||
It should be placed in e.g. ~/site_scons/site_tools/sphinx4scons/
|
||||
directory. Then it may be loaded by placing
|
||||
|
||||
sphinx = Tool('sphinx4scons')
|
||||
sphinx(env)
|
||||
|
||||
in your SConstruct file.
|
||||
|
||||
For further details, please see the SCons documentation on how to
|
||||
install and enable custom tools.
|
||||
"""
|
||||
|
||||
#
|
||||
# This package is provided under the Expat license
|
||||
#
|
||||
# Copyright (c) 2012 Orlando Wingbrant
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining
|
||||
# a copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish,
|
||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||
# permit persons to whom the Software is furnished to do so, subject to
|
||||
# the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# 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 AND NONINFRINGEMENT.
|
||||
# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
__author__ = "Orlando Wingbrant"
|
||||
__email__ = "orlando@widesite.org"
|
||||
__url__ = "https://bitbucket.org/wingbrant/sphinx4scons"
|
||||
__license__ = "Expat license"
|
||||
|
||||
import SCons.Action
|
||||
import SCons.Builder
|
||||
import SCons.Defaults
|
||||
import SCons.Util
|
||||
import SCons.Node.FS
|
||||
import os
|
||||
|
||||
from sphinx.util.matching import patfilter, compile_matchers
|
||||
from sphinx.util.osutil import make_filename
|
||||
|
||||
|
||||
class ToolSphinxWarning(SCons.Warnings.Warning):
|
||||
pass
|
||||
|
||||
|
||||
class SphinxBuilderNotFound(ToolSphinxWarning):
|
||||
pass
|
||||
|
||||
SCons.Warnings.enableWarningClass(ToolSphinxWarning)
|
||||
|
||||
|
||||
def exists(env):
|
||||
return _detect(env)
|
||||
|
||||
|
||||
def _detect(env):
|
||||
"""Try to detect the sphinx-build script."""
|
||||
try:
|
||||
return env['SPHINXBUILD']
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
sphinx = env.WhereIs('sphinx-build')
|
||||
if sphinx:
|
||||
return sphinx
|
||||
|
||||
raise SCons.Errors.StopError(
|
||||
SphinxBuilderNotFound,
|
||||
"Could not detect sphinx-build script")
|
||||
return None
|
||||
|
||||
|
||||
def generate(env):
|
||||
"""Add Builders and construction variables to the Environment."""
|
||||
|
||||
env['SPHINXBUILD'] = _detect(env)
|
||||
sphinx = _create_sphinx_builder(env)
|
||||
|
||||
env.SetDefault(
|
||||
# Additional command-line flags
|
||||
SPHINXFLAGS = '',
|
||||
|
||||
# Tag definitions, each entry will appear on the command line preceded by -t
|
||||
SPHINXTAGS = [],
|
||||
|
||||
# Directory for doctrees
|
||||
SPHINXDOCTREE = '',
|
||||
|
||||
# Path to sphinx configuration file
|
||||
SPHINXCONFIG = '',
|
||||
|
||||
# Config file override settings, each entry will be preceded by -D
|
||||
SPHINXSETTINGS = {},
|
||||
|
||||
# Default sphinx builder,
|
||||
SPHINXBUILDER = 'html',
|
||||
|
||||
# Sphinx command
|
||||
SPHINXCOM = "$SPHINXBUILD $_SPHINXOPTIONS ${SOURCE.attributes.root} ${TARGET.attributes.root}",
|
||||
|
||||
# Alternate console output when building sphinx documents
|
||||
SPHINXCOMSTR = ""
|
||||
)
|
||||
|
||||
try:
|
||||
env.AddMethod(Sphinx, "Sphinx")
|
||||
except AttributeError:
|
||||
# Looks like we use a pre-0.98 version of SCons...
|
||||
from SCons.Script.SConscript import SConsEnvironment
|
||||
SConsEnvironment.Sphinx = Sphinx
|
||||
|
||||
|
||||
def Sphinx(env, target, source, **kw):
|
||||
"""A pseudo-builder wrapper for the sphinx builder."""
|
||||
builder = env['BUILDERS']['Sphinx4Scons']
|
||||
env_kw = env.Override(kw)
|
||||
options = _get_sphinxoptions(env_kw, target, source)
|
||||
output = builder(env, target, source, _SPHINXOPTIONS=options, **kw)
|
||||
return output
|
||||
|
||||
|
||||
def _get_sphinxoptions(env, target, source):
|
||||
"""Concatenates all the options for the sphinx command line."""
|
||||
options = []
|
||||
|
||||
builder = _get_sphinxbuilder(env)
|
||||
options.append("-b %s" % env.subst(builder, target=target, source=source))
|
||||
|
||||
flags = env.get('options', env.get('SPHINXFLAGS', ''))
|
||||
options.append(env.subst(flags, target=target, source=source))
|
||||
|
||||
tags = env.get('tags', env.get('SPHINXTAGS', None))
|
||||
if tags is not None:
|
||||
if not SCons.SCons.Util.is_List(tags):
|
||||
tags = [tags]
|
||||
for tag in tags:
|
||||
if tag != '':
|
||||
tag = env.subst(tag, target=target, source=source)
|
||||
options.append("-t %s" % tag)
|
||||
|
||||
settings = env.get('settings', env.get('SPHINXSETTINGS', None))
|
||||
if settings is not None:
|
||||
if not SCons.SCons.Util.is_Dict(settings):
|
||||
raise TypeError('SPHINXSETTINGS and/or settings argument must be a dictionary')
|
||||
for key, value in settings.iteritems():
|
||||
if value != '':
|
||||
value = env.subst(value, target=target, source=source)
|
||||
options.append('-D "%s=%s"' % (key, value))
|
||||
|
||||
doctree = env.get('doctree', env.get("SPHINXDOCTREE", None))
|
||||
if isinstance(doctree, SCons.Node.FS.Dir):
|
||||
options.append("-d %s" % doctree.get_abspath())
|
||||
elif doctree is not None and doctree != '':
|
||||
doctree = env.subst(doctree, target=target, source=source)
|
||||
options.append("-d %s" % env.Dir(doctree).get_abspath())
|
||||
|
||||
config = _get_sphinxconfig_path(env, None)
|
||||
if config is not None and config != '':
|
||||
config = env.subst(config, target=target, source=source)
|
||||
options.append("-c %s" % env.Dir(config).File('conf.py').rfile().dir.get_abspath())
|
||||
return " ".join(options)
|
||||
|
||||
|
||||
def _create_sphinx_builder(env):
|
||||
try:
|
||||
sphinx = env['BUILDERS']['Sphinx4Scons']
|
||||
except KeyError:
|
||||
fs = SCons.Node.FS.get_default_fs()
|
||||
sphinx_com = SCons.Action.Action('$SPHINXCOM', '$SPHINXCOMSTR')
|
||||
sphinx = SCons.Builder.Builder(action=sphinx_com,
|
||||
emitter=sphinx_emitter,
|
||||
target_factory=fs.Dir,
|
||||
source_factory=fs.Dir
|
||||
)
|
||||
env['BUILDERS']['Sphinx4Scons'] = sphinx
|
||||
return sphinx
|
||||
|
||||
|
||||
def sphinx_emitter(target, source, env):
|
||||
target[0].must_be_same(SCons.Node.FS.Dir)
|
||||
targetnode = target[0]
|
||||
|
||||
source[0].must_be_same(SCons.Node.FS.Dir)
|
||||
srcnode = source[0]
|
||||
|
||||
configdir = _get_sphinxconfig_path(env, None)
|
||||
if not configdir:
|
||||
confignode = srcnode
|
||||
else:
|
||||
confignode = env.Dir(configdir)
|
||||
|
||||
srcinfo = SourceInfo(srcnode, confignode, env)
|
||||
targets, sources = _get_emissions(env, target, srcinfo)
|
||||
env.Clean(targets, target[0])
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def sphinx_path(os_path):
|
||||
"""Create sphinx-style path from os-style path."""
|
||||
return os_path.replace(os.sep, "/")
|
||||
|
||||
|
||||
def os_path(sphinx_path):
|
||||
"""Create os-style path from sphinx-style path."""
|
||||
return sphinx_path.replace("/", os.sep)
|
||||
|
||||
|
||||
class SourceInfo(object):
|
||||
"""
|
||||
Data container for all different kinds of source files used in
|
||||
a sphinx project.
|
||||
"""
|
||||
def __init__(self, srcnode, confignode, env):
|
||||
self.confignode = confignode
|
||||
self.config = self._get_config(self.confignode, env)
|
||||
self.templates = self._get_templates(self.confignode, self.config)
|
||||
self.statics = self._get_statics(self.confignode, self.config)
|
||||
self.srcnode = srcnode
|
||||
self.sources = self._get_sources(self.srcnode, self.config)
|
||||
|
||||
self.srcroot = srcnode
|
||||
if not srcnode.duplicate:
|
||||
self.srcroot = srcnode.srcnode().rdir()
|
||||
|
||||
|
||||
def _get_config(self, confignode, env):
|
||||
config = {}
|
||||
execfile(confignode.File('conf.py').rfile().get_abspath(), config)
|
||||
return config
|
||||
|
||||
|
||||
def _get_templates(self, confignode, config):
|
||||
"""Returns template files defined in the project."""
|
||||
templates = []
|
||||
for path in config.get('templates_path', []):
|
||||
# Check if path is dir or file.
|
||||
# We can't use FS.Entry since that will create nodes, and
|
||||
# these nodes don't know about the source tree and will
|
||||
# get disambiguated to files even if they are directories in the
|
||||
# source tree.
|
||||
p = confignode.File('conf.py').rfile().dir.srcnode().get_abspath()
|
||||
p = os.path.join(p, os_path(path))
|
||||
if os.path.isfile(p):
|
||||
templates.append(confignode.File(path))
|
||||
elif os.path.isdir(p):
|
||||
node = confignode.Dir(path)
|
||||
for root, dirs, files in os.walk(p):
|
||||
mydir = node.Dir(os.path.relpath(root, p))
|
||||
templates += [mydir.File(f) for f in files]
|
||||
return templates
|
||||
|
||||
|
||||
def _get_statics(self, confignode, config):
|
||||
"""Returns static files, filtered through exclude_patterns."""
|
||||
statics = []
|
||||
matchers = compile_matchers(config.get('exclude_patterns', []))
|
||||
|
||||
for path in config.get('html_static_path', []):
|
||||
# Check _get_templates() why we use this construction.
|
||||
p = confignode.File('conf.py').rfile().dir.srcnode().get_abspath()
|
||||
p = os.path.join(p, os_path(path))
|
||||
if os.path.isfile(p):
|
||||
statics.append(confignode.File(path))
|
||||
elif os.path.isdir(p):
|
||||
node = confignode.Dir(path)
|
||||
for root, dirs, files in os.walk(p):
|
||||
relpath = os.path.relpath(root, p)
|
||||
for entry in [d for d in dirs if
|
||||
self._anymatch(matchers,
|
||||
sphinx_path(os.path.join(relpath, d)))]:
|
||||
dirs.remove(entry)
|
||||
statics += [node.File(os_path(f)) for f in
|
||||
self._exclude(matchers,
|
||||
[sphinx_path(os.path.join(relpath, name))
|
||||
for name in files])]
|
||||
return statics
|
||||
|
||||
|
||||
def _get_sources(self, srcnode, config):
|
||||
"""Returns all source files in the project filtered through exclude_patterns."""
|
||||
suffix = config.get('source_suffix', '.rst')
|
||||
matchers = compile_matchers(config.get('exclude_patterns', []))
|
||||
|
||||
srcfiles = []
|
||||
scannode = srcnode.srcnode().rdir()
|
||||
|
||||
for root, dirs, files in os.walk(scannode.get_abspath()):
|
||||
relpath = os.path.relpath(root, scannode.get_abspath())
|
||||
for entry in [d for d in dirs if
|
||||
self._anymatch(matchers,
|
||||
sphinx_path(os.path.join(relpath, d)))]:
|
||||
dirs.remove(entry)
|
||||
srcfiles += [srcnode.File(os_path(f)) for f in
|
||||
self._exclude(matchers,
|
||||
[sphinx_path(os.path.join(relpath, name))
|
||||
for name in files if name.endswith(suffix)])]
|
||||
return srcfiles
|
||||
|
||||
|
||||
def _exclude(self, matchers, items):
|
||||
result = items
|
||||
for matcher in matchers:
|
||||
result = filter(lambda x: not matcher(x), result)
|
||||
return result
|
||||
|
||||
|
||||
def _anymatch(self, matchers, item):
|
||||
for matcher in matchers:
|
||||
if matcher(item):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _get_sphinxconfig_path(env, default):
|
||||
path = env.get('config', env.get('SPHINXCONFIG', None))
|
||||
if path is None or path == '':
|
||||
path = default
|
||||
return path
|
||||
|
||||
|
||||
def _get_emissions(env, target, srcinfo):
|
||||
targets = []
|
||||
sources = []
|
||||
builder = _get_sphinxbuilder(env)
|
||||
if builder == 'changes':
|
||||
targets, sources = _get_changes_emissions(env, target, srcinfo)
|
||||
if builder == 'devhelp':
|
||||
targets, sources = _get_help_emissions(env, target, srcinfo,
|
||||
['.devhelp.gz'])
|
||||
elif builder == 'dirhtml':
|
||||
targets, sources = _get_dirhtml_emissions(env, target, srcinfo)
|
||||
elif builder == 'doctest':
|
||||
targets, sources = _get_doctest_emissions(env, target, srcinfo)
|
||||
elif builder == 'epub':
|
||||
targets, sources = _get_epub_emissions(env, target, srcinfo)
|
||||
elif builder == 'html':
|
||||
targets, sources = _get_serialize_emissions(env, target, srcinfo)
|
||||
elif builder == 'htmlhelp':
|
||||
targets, sources = _get_help_emissions(env, target, srcinfo,
|
||||
['.hhp'], 'htmlhelp_basename')
|
||||
elif builder == 'gettext':
|
||||
targets, sources = _get_gettext_emissions(env, target, srcinfo)
|
||||
elif builder == 'json':
|
||||
targets, sources = _get_serialize_emissions(env, target, srcinfo,
|
||||
'.fjson',
|
||||
['globalcontext.json',
|
||||
'searchindex.json',
|
||||
'self.environment.pickle'])
|
||||
elif builder == 'latex':
|
||||
targets, sources = _get_latex_emissions(env, target, srcinfo)
|
||||
elif builder == 'linkcheck':
|
||||
targets, sources = _get_linkcheck_emissions(env, target, srcinfo)
|
||||
elif builder == 'man':
|
||||
targets, sources = _get_man_emissions(env, target, srcinfo)
|
||||
elif builder == 'pickle':
|
||||
targets, sources = _get_serialize_emissions(env, target, srcinfo,
|
||||
'.fpickle',
|
||||
['globalcontext.pickle',
|
||||
'searchindex.pickle',
|
||||
'environment.pickle'])
|
||||
elif builder == 'qthelp':
|
||||
targets, sources = _get_help_emissions(env, target, srcinfo,
|
||||
['.qhp', '.qhcp'])
|
||||
elif builder == 'singlehtml':
|
||||
targets, sources = _get_singlehtml_emissions(env, target, srcinfo)
|
||||
elif builder == 'texinfo':
|
||||
targets, sources = _get_texinfo_emissions(env, target, srcinfo)
|
||||
elif builder == 'text':
|
||||
targets, sources = _get_text_emissions(env, target, srcinfo)
|
||||
|
||||
sources.append(srcinfo.confignode.File('conf.py'))
|
||||
|
||||
for s in sources:
|
||||
s.attributes.root = srcinfo.srcroot
|
||||
|
||||
for t in targets:
|
||||
t.attributes.root = target[0]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_sphinxbuilder(env):
|
||||
builder = env.get('builder', env["SPHINXBUILDER"])
|
||||
if builder is None or builder == '':
|
||||
raise SCons.Errors.UserError(("Missing construction variable " +
|
||||
"SPHINXBUILDER or variable is empty."))
|
||||
return builder
|
||||
|
||||
|
||||
def _get_changes_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
targets = [target[0].File("changes.html")]
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_dirhtml_emissions(env, target, srcinfo):
|
||||
suffix = srcinfo.config.get('html_file_suffix', ".html")
|
||||
|
||||
def get_outfilename(pagename):
|
||||
pagename = os.path.splitext(pagename)[0]
|
||||
|
||||
#Special treatment of files named "index". Don't create directory.
|
||||
if pagename == 'index' or pagename.endswith(os.sep + 'index'):
|
||||
outfilename = pagename + suffix
|
||||
else:
|
||||
outfilename = os.path.join(pagename, 'index' + suffix)
|
||||
return outfilename
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend(srcinfo.templates)
|
||||
sources.extend(srcinfo.statics)
|
||||
|
||||
targets = []
|
||||
for s in srcinfo.sources:
|
||||
t = os.path.relpath(str(s), str(srcinfo.srcroot))
|
||||
targets.append(target[0].File(get_outfilename(t)))
|
||||
|
||||
for key in srcinfo.config.get('html_additional_pages', {}):
|
||||
t = target[0].File(get_outfilename(key))
|
||||
targets.append(t)
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_doctest_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
targets = [target[0].File("output.txt")]
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_epub_emissions(env, target, srcinfo):
|
||||
epubPreFiles = srcinfo.config.get('epub_pre_files', [])
|
||||
epubPostFiles = srcinfo.config.get('epub_post_files', [])
|
||||
epubCover = srcinfo.config.get('epub_cover', (None, None))
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend([srcinfo.srcroot.File(os_path(f[0])) for f in epubPreFiles])
|
||||
sources.extend([srcinfo.srcroot.File(os_path(f[0])) for f in epubPostFiles])
|
||||
if not (epubCover[0] is None or epubCover[0] == ''):
|
||||
sources.append(srcinfo.srcroot.File(os_path(epubCover[0])))
|
||||
if not (epubCover[1] is None or epubCover[1] == ''):
|
||||
sources.append(srcinfo.srcroot.File(os_path(epubCover[1])))
|
||||
|
||||
t = srcinfo.config.get('epub_basename',
|
||||
srcinfo.config.get('project',
|
||||
'Python'))
|
||||
|
||||
targets = [target[0].File("%s.epub" % make_filename(t))]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_gettext_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
|
||||
targets = [os.path.relpath(str(s), str(srcinfo.srcroot)) for s in sources]
|
||||
targets = [os.path.splitext(t)[0] for t in targets]
|
||||
targets = set([t.split(os.sep)[0] for t in targets])
|
||||
targets = [target[0].File(t + ".pot") for t in targets]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_help_emissions(env, target, srcinfo, suffixes, basenameConfigKey='project'):
|
||||
basename = make_filename(
|
||||
srcinfo.config.get(basenameConfigKey, srcinfo.config['project']))
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend(srcinfo.templates)
|
||||
sources.extend(srcinfo.statics)
|
||||
|
||||
targets = [target[0].File(basename + s) for s in suffixes]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_latex_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
|
||||
targets = map(lambda x: target[0].File(os_path(x[1])),
|
||||
srcinfo.config.get('latex_documents'))
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_linkcheck_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
targets = [target[0].File("output.txt")]
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_man_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
targets = map(lambda x: target[0].File(os_path("%s.%s" % (x[1], x[4]))),
|
||||
srcinfo.config.get('man_pages'))
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_serialize_emissions(env, target, srcinfo, suffix=None, extrafiles=[]):
|
||||
if suffix is None:
|
||||
suffix = srcinfo.config.get('html_file_suffix', '.html')
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend(srcinfo.templates)
|
||||
sources.extend(srcinfo.statics)
|
||||
|
||||
targets = []
|
||||
for s in srcinfo.sources:
|
||||
t = os.path.splitext(str(s))[0] + suffix
|
||||
t = os.path.relpath(t, str(srcinfo.srcroot))
|
||||
targets.append(t)
|
||||
|
||||
for key in srcinfo.config.get('html_additional_pages', {}):
|
||||
targets.append(os_path("%s%s" % (key, suffix)))
|
||||
|
||||
targets.extend(extrafiles)
|
||||
targets = [target[0].File(t) for t in targets]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_singlehtml_emissions(env, target, srcinfo):
|
||||
suffix = srcinfo.config.get('html_file_suffix', ".html")
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend(srcinfo.templates)
|
||||
sources.extend(srcinfo.statics)
|
||||
|
||||
t = os.path.relpath(srcinfo.config['master_doc'] + suffix,
|
||||
str(srcinfo.srcroot))
|
||||
targets = [target[0].File(t)]
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_texinfo_emissions(env, target, srcinfo):
|
||||
suffix = srcinfo.config.get('source_suffix', '.rst')
|
||||
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
sources.extend(map(lambda x: source[0].File(os_path(x + suffix)),
|
||||
srcinfo.config.get('texinfo_appendices', [])))
|
||||
|
||||
targets = map(lambda x: target[0].File(os_path("%s.texi" % x[1])),
|
||||
srcinfo.config.get('texinfo_documents'))
|
||||
|
||||
return targets, sources
|
||||
|
||||
|
||||
def _get_text_emissions(env, target, srcinfo):
|
||||
sources = []
|
||||
sources.extend(srcinfo.sources)
|
||||
|
||||
targets = []
|
||||
for s in sources:
|
||||
t = os.path.relpath(str(s), str(srcinfo.srcroot))
|
||||
t = os.path.splitext(t)[0] + ".txt"
|
||||
targets.append(target[0].File(t))
|
||||
|
||||
return targets, sources
|
||||
@@ -1,123 +0,0 @@
|
||||
#
|
||||
# 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 SCons.Script import AddOption, Flatten
|
||||
from SCons.Script import Builder
|
||||
from SCons.Action import Action
|
||||
from subprocess import check_output, STDOUT, CalledProcessError
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
||||
def BoostCompileTest(env, test, source = None, **kw):
|
||||
|
||||
def gen_result(target, source, env=env):
|
||||
target_file = target[0].abspath
|
||||
result_file = os.path.splitext(target_file)[0] + '.result'
|
||||
if sys.stdout.isatty():
|
||||
env['RESULT']='\033[92mPASS\033[0m'
|
||||
else:
|
||||
env['RESULT']='PASS'
|
||||
|
||||
with open(result_file, 'w+') as result:
|
||||
result.write('Result: {}\n'.format('pass'))
|
||||
|
||||
obj = env.Object(test, source if source is not None else test + '.cpp')
|
||||
env.AddPostAction(obj, Action(gen_result, cmdstr=None))
|
||||
env.AddPostAction(obj, Action('@echo $RESULT'))
|
||||
return obj
|
||||
|
||||
def BoostRun(env, prog, target, command = '$SOURCE'):
|
||||
|
||||
def call(target, source, env=env):
|
||||
cmd = env.subst(command, target=target, source=source)
|
||||
result_file = env.subst('$TARGET', target=target)
|
||||
output=''
|
||||
try:
|
||||
output=check_output(cmd, stderr=STDOUT, shell=True, env=env['ENV'])
|
||||
success=True
|
||||
except CalledProcessError as e:
|
||||
output=e.output
|
||||
success=False
|
||||
with open(result_file, 'w+') as result:
|
||||
result.write('Result: {}\n'.format(success and 'pass' or 'fail'))
|
||||
result.write('Output: {}\n'.format(output))
|
||||
if sys.stdout.isatty():
|
||||
env['RESULT']=success and '\033[92mPASS\033[0m' or '\033[91mFAIL\033[0m'
|
||||
else:
|
||||
env['RESULT']=success and 'PASS' or 'FAIL'
|
||||
|
||||
testcomstr = env.get('TESTCOMSTR')
|
||||
if testcomstr:
|
||||
run = env.Command(target, prog, Action(call, cmdstr=testcomstr))
|
||||
else:
|
||||
run = env.Command(target, prog, Action(call, cmdstr=command))
|
||||
env.AddPostAction(target, Action('@echo $RESULT'))
|
||||
return run
|
||||
|
||||
|
||||
def BoostRunPythonScript(env, script):
|
||||
return env.BoostRun(env.File(script), script.replace('.py', '.result'), '"${PYTHON}" $SOURCE')
|
||||
|
||||
|
||||
def BoostRunTest(env, test, source = None, command = '$SOURCE', command_sources = [], **kw):
|
||||
test_prog = env.Program(test, (source is None) and (test + ".cpp") or source, **kw)
|
||||
command += '> $TARGET'
|
||||
run = env.BoostRun([test_prog, command_sources], test + '.result', command)
|
||||
return run
|
||||
|
||||
|
||||
def BoostRunTests(env, tests, **kw):
|
||||
run = []
|
||||
for test in Flatten(tests):
|
||||
run += env.BoostRunTest(test, **kw)
|
||||
return run
|
||||
|
||||
def BoostCompileTests(env, tests, **kw):
|
||||
comp = []
|
||||
for test in Flatten(tests):
|
||||
comp += env.BoostCompileTest(test, **kw)
|
||||
return comp
|
||||
|
||||
|
||||
def BoostTestSummary(env, tests, **kw):
|
||||
|
||||
def print_summary(target, source, **kw):
|
||||
results = tests
|
||||
failures = [r for r in results
|
||||
if r.get_path().endswith('.result') and not 'Result: pass' in r.get_contents()]
|
||||
print('%s tests; %s pass; %s fails'%(len(results), len(results)-len(failures), len(failures)))
|
||||
if failures:
|
||||
print('For detailed failure reports, see:')
|
||||
for f in failures:
|
||||
print(f.get_path())
|
||||
|
||||
testsumcomstr = env.get('TESTSUMCOMSTR')
|
||||
if testsumcomstr:
|
||||
run = env.Command('summary', tests, Action(print_summary, cmdstr=testsumcomstr))
|
||||
else:
|
||||
run = env.Command('summary', tests, print_summary, cmdstr='')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def exists(env):
|
||||
return True
|
||||
|
||||
|
||||
def generate(env):
|
||||
AddOption('--test', dest='test', action="store_true")
|
||||
|
||||
env.AddMethod(BoostCompileTest)
|
||||
env.AddMethod(BoostRun)
|
||||
env.AddMethod(BoostRunPythonScript)
|
||||
env.AddMethod(BoostRunTest)
|
||||
env.AddMethod(BoostRunTests)
|
||||
env.AddMethod(BoostCompileTests)
|
||||
env.AddMethod(BoostTestSummary)
|
||||
96
config/ui.py
96
config/ui.py
@@ -1,96 +0,0 @@
|
||||
#
|
||||
# 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 SCons.Script import AddOption
|
||||
import sys
|
||||
|
||||
variables=[] # remember 'public' variables
|
||||
options=[]
|
||||
|
||||
def add_option(*args, **kwds):
|
||||
"""Capture the help messages so we can produce a helpful usage text."""
|
||||
options.append('{:25} {}'.format(', '.join(args), kwds.get('help', '')))
|
||||
AddOption(*args, **kwds)
|
||||
|
||||
def add_variable(vars, var):
|
||||
variables.append(var[0])
|
||||
vars.Add(var)
|
||||
|
||||
|
||||
def options_help(env):
|
||||
|
||||
return '\n '.join(options)
|
||||
|
||||
|
||||
def variables_help(vars, env):
|
||||
"""This is cloned from SCons' Variables.GenerateHelpText, to only report 'public' variables."""
|
||||
|
||||
opts = [o for o in vars.options if o.key in variables]
|
||||
|
||||
def format(opt):
|
||||
if opt.key in env:
|
||||
actual = env.subst('${%s}' % opt.key)
|
||||
else:
|
||||
actual = None
|
||||
return vars.FormatVariableHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases)
|
||||
text = ''.join([f for f in map(format, opts) if f])
|
||||
lines = [' %s'%l for l in text.split('\n')] # Add some indentation
|
||||
return '\n'.join(lines)
|
||||
|
||||
|
||||
|
||||
def help(vars, env):
|
||||
|
||||
return """Usage: scons [--option...] [variable=value...] [target...]
|
||||
|
||||
available options:
|
||||
|
||||
{}
|
||||
|
||||
available variables:
|
||||
{}
|
||||
""".format(options_help(env), variables_help(vars, env))
|
||||
|
||||
def pretty_output(env):
|
||||
|
||||
colors = {}
|
||||
colors['red'] = '\033[31m'
|
||||
colors['green'] = '\033[32m'
|
||||
colors['blue'] = '\033[34m'
|
||||
colors['yellow'] = '\033[93m'
|
||||
colors['Red'] = '\033[91m'
|
||||
colors['Green'] = '\033[92m'
|
||||
colors['Blue'] = '\033[94m'
|
||||
colors['Purple'] = '\033[95m'
|
||||
colors['Cyan'] = '\033[96m'
|
||||
colors['end'] = '\033[0m'
|
||||
|
||||
#If the output is not a terminal, remove the colors
|
||||
if not sys.stdout.isatty():
|
||||
for key, value in colors.iteritems():
|
||||
colors[key] = ''
|
||||
|
||||
compile_source_message = '{green}Compiling $TARGET{end}'.format(**colors)
|
||||
compile_shared_source_message = '{green}Compiling $TARGET{end}'.format(**colors)
|
||||
link_program_message = '{blue}Linking $TARGET{end}'.format(**colors)
|
||||
link_library_message = '{blue}Linking $TARGET{end}'.format(**colors)
|
||||
ranlib_library_message = '{blue}Ranlib $TARGET{end}'.format(**colors)
|
||||
link_shared_library_message = '{blue}Linking $TARGET{end}'.format(**colors)
|
||||
test_message = '{blue}Testing $SOURCE{end}'.format(**colors)
|
||||
testsum_message = '{Blue}Test Summary{end}'.format(**colors)
|
||||
|
||||
env.Replace(CXXCOMSTR = compile_source_message,
|
||||
CCCOMSTR = compile_source_message,
|
||||
SHCCCOMSTR = compile_shared_source_message,
|
||||
SHCXXCOMSTR = compile_shared_source_message,
|
||||
ARCOMSTR = link_library_message,
|
||||
RANLIBCOMSTR = ranlib_library_message,
|
||||
SHLINKCOMSTR = link_shared_library_message,
|
||||
LINKCOMSTR = link_program_message,
|
||||
TESTCOMSTR = test_message,
|
||||
TESTSUMCOMSTR = testsum_message)
|
||||
@@ -1,52 +0,0 @@
|
||||
# -*- 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)
|
||||
|
||||
Import('env')
|
||||
|
||||
env.QuickBook('python.bbk', 'python.qbk',
|
||||
['building.qbk',
|
||||
'configuration.qbk',
|
||||
'support.qbk',
|
||||
'faq.qbk',
|
||||
'glossary.qbk'])
|
||||
|
||||
env.QuickBook('tutorial.bbk', 'tutorial.qbk')
|
||||
env.QuickBook('reference.bbk', 'reference.qbk',
|
||||
Glob('reference/*.qbk'))
|
||||
|
||||
|
||||
env.BoostBook('python.dbk', 'python.bbk')
|
||||
env.BoostBook('tutorial.dbk', 'tutorial.bbk')
|
||||
env.BoostBook('reference.dbk', 'reference.bbk')
|
||||
|
||||
images = Glob('images/*.*') + Glob('images/callouts/*.*')
|
||||
|
||||
env.BoostHTML('html/', 'python.dbk',
|
||||
resources=['boostbook.css'] + images,
|
||||
args=['--stringparam', 'generate.toc', '"library nop; chapter 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'])
|
||||
env.BoostHTML('html/tutorial/', 'tutorial.dbk',
|
||||
args=['--stringparam', 'html.stylesheet', '../boostbook.css',
|
||||
'--stringparam', 'boost.image.src', '../images/bpl.png',
|
||||
'--stringparam', 'boost.graphics.root', '../images/'])
|
||||
env.BoostHTML('html/reference/', 'reference.dbk',
|
||||
args=['--stringparam', 'html.stylesheet', '../boostbook.css',
|
||||
'--stringparam', 'boost.image.src', '../images/bpl.png',
|
||||
'--stringparam', 'boost.graphics.root', '../images/'])
|
||||
|
||||
env.BoostRST('html/article.html', 'article.rst', resources=['rst.css'])
|
||||
|
||||
if env['NUMPY']:
|
||||
env.BoostSphinx('html/numpy', 'numpy/')
|
||||
83
doc/fabscript
Normal file
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
|
||||
0
doc/html/images/python_cpp_mix.png
Executable file → Normal file
0
doc/html/images/python_cpp_mix.png
Executable file → Normal file
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
BIN
doc/images/jam.png
Normal file
BIN
doc/images/jam.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
0
doc/internals.html
Executable file → Normal file
0
doc/internals.html
Executable file → Normal file
0
doc/internals.rst
Executable file → Normal file
0
doc/internals.rst
Executable file → Normal file
@@ -43,6 +43,7 @@ The development of these features was funded in part by grants to `Boost Consult
|
||||
|
||||
[section Contents]
|
||||
|
||||
* [link rn Release Notes]
|
||||
* _tutorial_
|
||||
* [link building Building and Testing]
|
||||
* _reference_
|
||||
@@ -58,6 +59,7 @@ The development of these features was funded in part by grants to `Boost Consult
|
||||
|
||||
[@article.html Building Hybrid Systems With Boost Python], by Dave Abrahams and Ralf W. Grosse-Kunstleve
|
||||
|
||||
[include release_notes.qbk]
|
||||
[include building.qbk]
|
||||
[include configuration.qbk]
|
||||
[include support.qbk]
|
||||
|
||||
@@ -38,7 +38,7 @@ The `indexing_suite` class is the base class for the management of C++ container
|
||||
[[__iter__(self)]
|
||||
[This method is called when an iterator is required for a container. This method should return a new iterator object that can iterate over all the objects in the container. For mappings, it should iterate over the keys of the container, and should also be made available as the method iterkeys().
|
||||
|
||||
Iterator objects also need to implement this method; they are required to return themselves. For more information on iterator objects, see [@http://www.python.org/doc/current/lib/typeiter.html Iterator Types] in the [@http://www.python.org/doc/current/lib/lib.html Python Library Reference].]]
|
||||
Iterator objects also need to implement this method; they are required to return themselves. For more information on iterator objects, see [@https://docs.python.org/3/library/stdtypes.html#iterator-types Iterator Types] in the [@https://docs.python.org/3/library/index.html Python Library Reference].]]
|
||||
|
||||
[[__contains__(self, item)]
|
||||
[Called to implement membership test operators. Should return true if item is in self, false otherwise. For mapping objects, this should consider the keys of the mapping rather than the values or the key-item pairs.]]
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
[section boost/python/numeric.hpp]
|
||||
[section Introduction]
|
||||
Exposes a [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] for the Python [@http://www.python.org/dev/doc/devel/lib/typesmapping.html array] type.
|
||||
[endsect]
|
||||
[section Class `array`]
|
||||
Provides access to the array types of [@http://www.pfdubois.com/numpy/ Numerical Python]\ 's [@http://www.pfdubois.com/numpy/#Numeric Numeric] and [@http://stsdas.stsci.edu/numarray/index.html NumArray] modules. With the exception of the functions documented below, the semantics of the constructors and member functions defined below can be fully understood by reading the [link concepts.objectwrapper.typewrapper_concept_requirements TypeWrapper] concept definition. Since array is publicly derived from object, the public object interface applies to array instances as well.
|
||||
|
||||
The default behavior is to use numarray.NDArray as the associated Python type if the numarray module is installed in the default location. Otherwise it falls back to use Numeric.ArrayType. If neither extension module is installed, overloads of wrapped C++ functions with numeric::array parameters will never be matched, and other attempted uses of numeric::array will raise an appropriate Python exception. The associated Python type can be set manually using the set_module_and_type(...) static function.
|
||||
``
|
||||
namespace boost { namespace python { namespace numeric
|
||||
{
|
||||
class array : public object
|
||||
{
|
||||
public:
|
||||
object astype();
|
||||
template <class Type>
|
||||
object astype(Type const& type_);
|
||||
|
||||
template <class Type>
|
||||
array new_(Type const& type_) const;
|
||||
|
||||
template <class Sequence>
|
||||
void resize(Sequence const& x);
|
||||
void resize(long x1);
|
||||
void resize(long x1, long x2);
|
||||
...
|
||||
void resize(long x1, long x2,...long xn);
|
||||
|
||||
template <class Sequence>
|
||||
void setshape(Sequence const& x);
|
||||
void setshape(long x1);
|
||||
void setshape(long x1, long x2);
|
||||
...
|
||||
void setshape(long x1, long x2,...long xn);
|
||||
|
||||
template <class Indices, class Values>
|
||||
void put(Indices const& indices, Values const& values);
|
||||
|
||||
template <class Sequence>
|
||||
object take(Sequence const& sequence, long axis = 0);
|
||||
|
||||
template <class File>
|
||||
void tofile(File const& f) const;
|
||||
|
||||
object factory();
|
||||
template <class Sequence>
|
||||
object factory(Sequence const&);
|
||||
template <class Sequence, class Typecode>
|
||||
object factory(Sequence const&, Typecode const&, bool copy = true, bool savespace = false);
|
||||
template <class Sequence, class Typecode, class Type>
|
||||
object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&);
|
||||
template <class Sequence, class Typecode, class Type, class Shape>
|
||||
object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&, Shape const&);
|
||||
|
||||
template <class T1>
|
||||
explicit array(T1 const& x1);
|
||||
template <class T1, class T2>
|
||||
explicit array(T1 const& x1, T2 const& x2);
|
||||
...
|
||||
template <class T1, class T2,...class Tn>
|
||||
explicit array(T1 const& x1, T2 const& x2,...Tn const& xn);
|
||||
|
||||
static void set_module_and_type();
|
||||
static void set_module_and_type(char const* package_path = 0, char const* type_name = 0);
|
||||
static void get_module_name();
|
||||
|
||||
object argmax(long axis=-1);
|
||||
|
||||
object argmin(long axis=-1);
|
||||
|
||||
object argsort(long axis=-1);
|
||||
|
||||
void byteswap();
|
||||
|
||||
object copy() const;
|
||||
|
||||
object diagonal(long offset = 0, long axis1 = 0, long axis2 = 1) const;
|
||||
|
||||
void info() const;
|
||||
|
||||
bool is_c_array() const;
|
||||
bool isbyteswapped() const;
|
||||
void sort();
|
||||
object trace(long offset = 0, long axis1 = 0, long axis2 = 1) const;
|
||||
object type() const;
|
||||
char typecode() const;
|
||||
|
||||
object getflat() const;
|
||||
long getrank() const;
|
||||
object getshape() const;
|
||||
bool isaligned() const;
|
||||
bool iscontiguous() const;
|
||||
long itemsize() const;
|
||||
long nelements() const;
|
||||
object nonzero() const;
|
||||
|
||||
void ravel();
|
||||
object repeat(object const& repeats, long axis=0);
|
||||
void setflat(object const& flat);
|
||||
void swapaxes(long axis1, long axis2);
|
||||
str tostring() const;
|
||||
void transpose(object const& axes = object());
|
||||
object view() const;
|
||||
};
|
||||
}}}
|
||||
``
|
||||
[endsect]
|
||||
[section Class `array` observer functions]
|
||||
``
|
||||
object factory();
|
||||
template <class Sequence>
|
||||
object factory(Sequence const&);
|
||||
template <class Sequence, class Typecode>
|
||||
object factory(Sequence const&, Typecode const&, bool copy = true, bool savespace = false);
|
||||
template <class Sequence, class Typecode, class Type>
|
||||
object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&);
|
||||
template <class Sequence, class Typecode, class Type, class Shape>
|
||||
object factory(Sequence const&, Typecode const&, bool copy, bool savespace, Type const&, Shape const&);
|
||||
``
|
||||
These functions map to the underlying array type's array() function family. They are not called "array" because of the C++ limitation that you can't define a member function with the same name as its enclosing class.
|
||||
``
|
||||
template <class Type>
|
||||
array new_(Type const&) const;
|
||||
``
|
||||
This function maps to the underlying array type's new() function. It is not called "new" because that is a keyword in C++.
|
||||
[endsect]
|
||||
[section Class `array` static functions]
|
||||
``
|
||||
static void set_module_and_type(char const* package_path, char const* type_name);
|
||||
static void set_module_and_type();
|
||||
``
|
||||
[variablelist
|
||||
[[Requires][package_path and type_name, if supplied, is an [link ntbs].]]
|
||||
[[Effects][The first form sets the package path of the module that supplies the type named by type_name to package_path. The second form restores the default search behavior. The associated Python type will be searched for only the first time it is needed, and thereafter the first time it is needed after an invocation of set_module_and_type.]]
|
||||
]
|
||||
``static std::string get_module_name()``
|
||||
[variablelist
|
||||
[[Effects][Returns the name of the module containing the class that will be held by new `numeric::array` instances.]]
|
||||
]
|
||||
[endsect]
|
||||
[section Example]
|
||||
``
|
||||
#include <boost/python/numeric.hpp>
|
||||
#include <boost/python/tuple.hpp>
|
||||
|
||||
// sets the first element in a 2d numeric array
|
||||
void set_first_element(numeric::array& y, double value)
|
||||
{
|
||||
y[make_tuple(0,0)] = value;
|
||||
}
|
||||
``
|
||||
[endsect]
|
||||
[endsect]
|
||||
@@ -5,7 +5,6 @@
|
||||
[include dict.qbk]
|
||||
[include list.qbk]
|
||||
[include long.qbk]
|
||||
[include numeric.qbk]
|
||||
[include object.qbk]
|
||||
[include str.qbk]
|
||||
[include slice.qbk]
|
||||
|
||||
@@ -86,8 +86,8 @@ The column of Python Expressions illustrates the expressions that will be suppor
|
||||
[[C++ Expression][Python Method Name][C++ Implementation][Python Expression (primary, secondary)]]
|
||||
[[`self == r`][`__eq__`][`x == y`][`x == y`, `y == x`]]
|
||||
[[`l == self`][`__eq__`][`y == x`][`y == x`, `x == y`]]
|
||||
[[`self != r`][`__nq__`][`x != y`][`x != y`, `y != x`]]
|
||||
[[`l != self`][`__nq__`][`y != x`][`y != x`, `x != y`]]
|
||||
[[`self != r`][`__ne__`][`x != y`][`x != y`, `y != x`]]
|
||||
[[`l != self`][`__ne__`][`y != x`][`y != x`, `x != y`]]
|
||||
[[`self < r`][`__lt__`][`x < y`][`x < y`, `y > x`]]
|
||||
[[`l < self`][`__gt__`][`y < x`][`y > x`, `x < y`]]
|
||||
[[`self > r`][`__gt__`][`x > y`][`x > y`, `y < x`]]
|
||||
|
||||
@@ -4,7 +4,7 @@ Pickle is a Python module for object serialization, also known as persistence, m
|
||||
|
||||
It is often necessary to save and restore the contents of an object to a file. One approach to this problem is to write a pair of functions that read and write data from a file in a special format. A powerful alternative approach is to use Python's pickle module. Exploiting Python's ability for introspection, the pickle module recursively converts nearly arbitrary Python objects into a stream of bytes that can be written to a file.
|
||||
|
||||
The Boost Python Library supports the pickle module through the interface as described in detail in the [@http://www.python.org/doc/current/lib/module-pickle.html Python Library Reference for pickle]. This interface involves the special methods `__getinitargs__`, `__getstate__` and `__setstate__` as described in the following. Note that `Boost.Python` is also fully compatible with Python's cPickle module.
|
||||
The Boost Python Library supports the pickle module through the interface as described in detail in the [@https://docs.python.org/2/library/pickle.html Python Library Reference for pickle]. This interface involves the special methods `__getinitargs__`, `__getstate__` and `__setstate__` as described in the following. Note that `Boost.Python` is also fully compatible with Python's cPickle module.
|
||||
[endsect]
|
||||
[section The Pickle Interface]
|
||||
At the user level, the Boost.Python pickle interface involves three special methods:
|
||||
|
||||
@@ -105,14 +105,6 @@ list odd_elements(list l)
|
||||
return l[slice(_,_,2)];
|
||||
}
|
||||
|
||||
// Perform a multidimensional extended slice of a Numeric.array
|
||||
numeric::array even_columns(numeric::array arr)
|
||||
{
|
||||
// select every other column, starting with the second, of a 2-D array.
|
||||
// Equivalent to "return arr[:, 1::2]" in Python.
|
||||
return arr[make_tuple( slice(), slice(1,_,2))];
|
||||
}
|
||||
|
||||
// Perform a summation over a slice of a std::vector.
|
||||
double partial_sum(std::vector<double> const& Foo, const slice index)
|
||||
{
|
||||
|
||||
11
doc/release_notes.qbk
Normal file
11
doc/release_notes.qbk
Normal file
@@ -0,0 +1,11 @@
|
||||
[chapter Release Notes
|
||||
[quickbook 1.7]
|
||||
[id rn]
|
||||
]
|
||||
|
||||
[section Version 1.67]
|
||||
|
||||
* The Boost.Python library names now contain the Python version suffix.
|
||||
A variant compiled with Python 2.7 will thus produce library names
|
||||
`boost_python27` and `boost_numpy27`, etc., making it possible to host
|
||||
variants for multiple Python versions next to each other.
|
||||
@@ -92,7 +92,7 @@ who had to use a different tool.
|
||||
|
||||
We will skip over the details. Our objective will be to simply create
|
||||
the hello world module and run it in Python. For a complete reference to
|
||||
building Boost.Python, check out: [@../../../building.html
|
||||
building Boost.Python, check out: [@../building.html
|
||||
building.html]. After this brief ['bjam] tutorial, we should have built
|
||||
the DLLs and run a python program using the extension.
|
||||
|
||||
@@ -1417,6 +1417,8 @@ eval evaluates the given expression and returns the resulting value.
|
||||
exec executes the given code (typically a set of statements) returning the result,
|
||||
and exec_file executes the code contained in the given file.
|
||||
|
||||
There are also overloads taking `char const*` instead of str as the first argument.
|
||||
|
||||
The [^globals] and [^locals] parameters are Python dictionaries
|
||||
containing the globals and locals of the context in which to run the code.
|
||||
For most intents and purposes you can use the namespace dictionary of the
|
||||
|
||||
82
fabscript
Normal file
82
fabscript
Normal file
@@ -0,0 +1,82 @@
|
||||
# -*- 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.feature import set
|
||||
from faber.types import cxx
|
||||
from faber.tools.compiler import cxxflags, define, include
|
||||
from faber.tools.python import python
|
||||
from faber.config import report, cxx_checks
|
||||
from faber.config.try_run import try_run
|
||||
|
||||
features += include('include')
|
||||
features += define('BOOST_ALL_NO_LIB') # disable auto-linking
|
||||
boost_include = options.get_with('boost-include')
|
||||
if boost_include:
|
||||
features += include(boost_include)
|
||||
python = python.instance()
|
||||
py_suffix = '{}{}'.format(*python.version.split('.')[:2])
|
||||
features |= set(python.include, python.linkpath, python.libs)
|
||||
|
||||
class has_numpy(try_run):
|
||||
|
||||
src = r"""
|
||||
// If defined, enforces linking against PythonXXd.lib, which
|
||||
// is usually not included in Python environments.
|
||||
#undef _DEBUG
|
||||
#include "Python.h"
|
||||
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
|
||||
#include "numpy/arrayobject.h"
|
||||
|
||||
#if PY_VERSION_HEX >= 0x03000000
|
||||
void *initialize() { import_array();}
|
||||
#else
|
||||
void initialize() { import_array();}
|
||||
#endif
|
||||
|
||||
int main()
|
||||
{
|
||||
int result = 0;
|
||||
Py_Initialize();
|
||||
initialize();
|
||||
if (PyErr_Occurred())
|
||||
{
|
||||
result = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
npy_intp dims = 2;
|
||||
PyObject * a = PyArray_SimpleNew(1, &dims, NPY_INT);
|
||||
if (!a) result = 1;
|
||||
Py_DECREF(a);
|
||||
}
|
||||
Py_Finalize();
|
||||
return result;
|
||||
}
|
||||
"""
|
||||
def __init__(self, features=()):
|
||||
|
||||
inc = ''
|
||||
try:
|
||||
inc = python.check_python('import numpy; print(numpy.get_include())')
|
||||
features |= include(inc)
|
||||
except Exception:
|
||||
# ignore errors, the check will fail during compilation...
|
||||
pass
|
||||
try_run.__init__(self, 'has_numpy', has_numpy.src, cxx, features,
|
||||
if_=(include(inc), define('HAS_NUMPY')))
|
||||
|
||||
checks = [cxx_checks.has_cxx11(features, define('HAS_CXX11')),
|
||||
has_numpy(features)]
|
||||
config = report('config', checks)
|
||||
|
||||
src = module('src', features=config.use)
|
||||
test = module('test', features=config.use)
|
||||
doc = module('doc', features=config.use)
|
||||
|
||||
default = src.default
|
||||
@@ -42,7 +42,6 @@
|
||||
# include <boost/python/make_function.hpp>
|
||||
# include <boost/python/manage_new_object.hpp>
|
||||
# include <boost/python/module.hpp>
|
||||
# include <boost/python/numeric.hpp>
|
||||
# include <boost/python/object.hpp>
|
||||
# include <boost/python/object_protocol.hpp>
|
||||
# include <boost/python/object_protocol_core.hpp>
|
||||
|
||||
6
include/boost/python/arg_from_python.hpp
Executable file → Normal file
6
include/boost/python/arg_from_python.hpp
Executable file → Normal file
@@ -9,7 +9,7 @@
|
||||
# include <boost/python/converter/arg_from_python.hpp>
|
||||
# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
|
||||
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
#endif
|
||||
|
||||
namespace boost { namespace python {
|
||||
@@ -19,7 +19,7 @@ struct arg_from_python
|
||||
: converter::select_arg_from_python<
|
||||
# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
|
||||
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))
|
||||
typename boost::remove_cv<T>::type
|
||||
typename detail::remove_cv<T>::type
|
||||
# else
|
||||
T
|
||||
# endif
|
||||
@@ -28,7 +28,7 @@ struct arg_from_python
|
||||
typedef typename converter::select_arg_from_python<
|
||||
# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
|
||||
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))
|
||||
typename boost::remove_cv<T>::type
|
||||
typename detail::remove_cv<T>::type
|
||||
# else
|
||||
T
|
||||
# endif
|
||||
|
||||
@@ -11,10 +11,7 @@
|
||||
# include <boost/config.hpp>
|
||||
# include <boost/python/detail/preprocessor.hpp>
|
||||
# include <boost/python/detail/type_list.hpp>
|
||||
|
||||
# include <boost/type_traits/is_reference.hpp>
|
||||
# include <boost/type_traits/remove_reference.hpp>
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/preprocessor/enum_params.hpp>
|
||||
# include <boost/preprocessor/repeat.hpp>
|
||||
@@ -116,9 +113,9 @@ namespace detail
|
||||
template <class T>
|
||||
struct is_reference_to_keywords
|
||||
{
|
||||
BOOST_STATIC_CONSTANT(bool, is_ref = is_reference<T>::value);
|
||||
typedef typename remove_reference<T>::type deref;
|
||||
typedef typename remove_cv<deref>::type key_t;
|
||||
BOOST_STATIC_CONSTANT(bool, is_ref = detail::is_reference<T>::value);
|
||||
typedef typename detail::remove_reference<T>::type deref;
|
||||
typedef typename detail::remove_cv<deref>::type key_t;
|
||||
BOOST_STATIC_CONSTANT(bool, is_key = is_keywords<key_t>::value);
|
||||
BOOST_STATIC_CONSTANT(bool, value = (is_ref & is_key));
|
||||
|
||||
|
||||
0
include/boost/python/base_type_traits.hpp
Executable file → Normal file
0
include/boost/python/base_type_traits.hpp
Executable file → Normal file
@@ -6,8 +6,8 @@
|
||||
# define BASES_DWA2002321_HPP
|
||||
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/python/detail/type_list.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
# include <boost/preprocessor/enum_params_with_a_default.hpp>
|
||||
|
||||
0
include/boost/python/borrowed.hpp
Executable file → Normal file
0
include/boost/python/borrowed.hpp
Executable file → Normal file
9
include/boost/python/cast.hpp
Executable file → Normal file
9
include/boost/python/cast.hpp
Executable file → Normal file
@@ -6,9 +6,8 @@
|
||||
# define CAST_DWA200269_HPP
|
||||
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/type_traits/same_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/type.hpp>
|
||||
# include <boost/python/base_type_traits.hpp>
|
||||
# include <boost/python/detail/convertible.hpp>
|
||||
@@ -76,9 +75,9 @@ namespace detail
|
||||
template <class Source, class Target>
|
||||
inline Target* upcast_impl(Source* x, Target*)
|
||||
{
|
||||
typedef typename add_cv<Source>::type src_t;
|
||||
typedef typename add_cv<Target>::type target_t;
|
||||
bool const same = is_same<src_t,target_t>::value;
|
||||
typedef typename detail::add_cv<Source>::type src_t;
|
||||
typedef typename detail::add_cv<Target>::type target_t;
|
||||
bool const same = detail::is_same<src_t,target_t>::value;
|
||||
|
||||
return detail::upcaster<same>::execute(x, (Target*)0);
|
||||
}
|
||||
|
||||
@@ -28,13 +28,10 @@
|
||||
# include <boost/python/detail/operator_id.hpp>
|
||||
# include <boost/python/detail/def_helper.hpp>
|
||||
# include <boost/python/detail/force_instantiate.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/detail/unwrap_type_id.hpp>
|
||||
# include <boost/python/detail/unwrap_wrapper.hpp>
|
||||
|
||||
# include <boost/type_traits/is_same.hpp>
|
||||
# include <boost/type_traits/is_member_function_pointer.hpp>
|
||||
# include <boost/type_traits/is_polymorphic.hpp>
|
||||
|
||||
# include <boost/mpl/size.hpp>
|
||||
# include <boost/mpl/for_each.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
@@ -53,7 +50,6 @@
|
||||
|
||||
# ifdef BOOST_PYTHON_NO_MEMBER_POINTER_ORDERING
|
||||
# include <boost/mpl/and.hpp>
|
||||
# include <boost/type_traits/is_member_pointer.hpp>
|
||||
# endif
|
||||
|
||||
namespace boost { namespace python {
|
||||
@@ -84,8 +80,8 @@ namespace detail
|
||||
template <class T>
|
||||
struct is_data_member_pointer
|
||||
: mpl::and_<
|
||||
is_member_pointer<T>
|
||||
, mpl::not_<is_member_function_pointer<T> >
|
||||
detail::is_member_pointer<T>
|
||||
, mpl::not_<detail::is_member_function_pointer<T> >
|
||||
>
|
||||
{};
|
||||
|
||||
@@ -138,11 +134,11 @@ namespace detail
|
||||
must_be_derived_class_member(Default const&)
|
||||
{
|
||||
// https://svn.boost.org/trac/boost/ticket/5803
|
||||
//typedef typename assertion<mpl::not_<is_same<Default,Fn> > >::failed test0;
|
||||
//typedef typename assertion<mpl::not_<detail::is_same<Default,Fn> > >::failed test0;
|
||||
# if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
|
||||
typedef typename assertion<is_polymorphic<T> >::failed test1 BOOST_ATTRIBUTE_UNUSED;
|
||||
typedef typename assertion<detail::is_polymorphic<T> >::failed test1 BOOST_ATTRIBUTE_UNUSED;
|
||||
# endif
|
||||
typedef typename assertion<is_member_function_pointer<Fn> >::failed test2 BOOST_ATTRIBUTE_UNUSED;
|
||||
typedef typename assertion<detail::is_member_function_pointer<Fn> >::failed test2 BOOST_ATTRIBUTE_UNUSED;
|
||||
not_a_derived_class_member<Default>(Fn());
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,8 +8,7 @@
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/python/converter/from_python.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/type_traits/transform_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/converter/rvalue_from_python_data.hpp>
|
||||
# include <boost/mpl/eval_if.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
@@ -106,7 +105,7 @@ struct reference_arg_from_python : arg_lvalue_from_python_base
|
||||
template <class T>
|
||||
struct arg_rvalue_from_python
|
||||
{
|
||||
typedef typename boost::add_reference<
|
||||
typedef typename boost::python::detail::add_lvalue_reference<
|
||||
T
|
||||
// We can't add_const here, or it would be impossible to pass
|
||||
// auto_ptr<U> args from Python to C++
|
||||
|
||||
12
include/boost/python/converter/arg_to_python.hpp
Executable file → Normal file
12
include/boost/python/converter/arg_to_python.hpp
Executable file → Normal file
@@ -24,11 +24,7 @@
|
||||
# include <boost/python/detail/convertible.hpp>
|
||||
# include <boost/python/detail/string_literal.hpp>
|
||||
# include <boost/python/detail/value_is_shared_ptr.hpp>
|
||||
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/type_traits/composite_traits.hpp>
|
||||
# include <boost/type_traits/function_traits.hpp>
|
||||
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/mpl/or.hpp>
|
||||
|
||||
@@ -116,9 +112,9 @@ namespace detail
|
||||
|
||||
, typename mpl::if_<
|
||||
mpl::or_<
|
||||
is_function<T>
|
||||
boost::python::detail::is_function<T>
|
||||
, indirect_traits::is_pointer_to_function<T>
|
||||
, is_member_function_pointer<T>
|
||||
, boost::python::detail::is_member_function_pointer<T>
|
||||
>
|
||||
, function_arg_to_python<T>
|
||||
|
||||
@@ -127,7 +123,7 @@ namespace detail
|
||||
, object_manager_arg_to_python<T>
|
||||
|
||||
, typename mpl::if_<
|
||||
is_pointer<T>
|
||||
boost::python::detail::is_pointer<T>
|
||||
, pointer_deep_arg_to_python<T>
|
||||
|
||||
, typename mpl::if_<
|
||||
|
||||
0
include/boost/python/converter/context_result_converter.hpp
Executable file → Normal file
0
include/boost/python/converter/context_result_converter.hpp
Executable file → Normal file
@@ -8,7 +8,7 @@
|
||||
# include <boost/python/handle.hpp>
|
||||
# include <boost/python/cast.hpp>
|
||||
# include <boost/python/converter/pyobject_traits.hpp>
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
# define POINTER_TYPE_ID_DWA2002222_HPP
|
||||
|
||||
# include <boost/python/type_id.hpp>
|
||||
# include <boost/type_traits/composite_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace converter {
|
||||
|
||||
@@ -59,7 +59,7 @@ template <class T>
|
||||
type_info pointer_type_id(T(*)() = 0)
|
||||
{
|
||||
return detail::pointer_typeid_select<
|
||||
is_reference<T>::value
|
||||
boost::python::detail::is_lvalue_reference<T>::value
|
||||
>::execute((T(*)())0);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,11 @@
|
||||
|
||||
namespace boost { namespace python { namespace converter {
|
||||
|
||||
BOOST_PYTHON_DECL PyObject* checked_downcast_impl(PyObject*, PyTypeObject*);
|
||||
|
||||
BOOST_PYTHON_DECL inline
|
||||
PyObject* checked_downcast_impl(PyObject *obj, PyTypeObject *type)
|
||||
{
|
||||
return (PyType_IsSubtype(Py_TYPE(obj), type) ? obj : NULL);
|
||||
}
|
||||
// Used as a base class for specializations which need to provide
|
||||
// Python type checking capability.
|
||||
template <class Object, PyTypeObject* pytype>
|
||||
|
||||
9
include/boost/python/converter/pytype_function.hpp
Executable file → Normal file
9
include/boost/python/converter/pytype_function.hpp
Executable file → Normal file
@@ -8,6 +8,7 @@
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/python/converter/registered.hpp>
|
||||
# include <boost/python/detail/unwind_type.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
|
||||
namespace boost { namespace python {
|
||||
@@ -53,7 +54,7 @@ inline python::type_info unwind_type_id_(boost::type<void>* = 0, mpl::true_* =0)
|
||||
template <class T>
|
||||
inline python::type_info unwind_type_id(boost::type<T>* p= 0)
|
||||
{
|
||||
return unwind_type_id_(p, (mpl::bool_<boost::is_void<T>::value >*)0 );
|
||||
return unwind_type_id_(p, (mpl::bool_<boost::python::detail::is_void<T>::value >*)0 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +65,7 @@ struct expected_pytype_for_arg
|
||||
static PyTypeObject const *get_pytype()
|
||||
{
|
||||
const converter::registration *r=converter::registry::query(
|
||||
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
||||
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::python::detail::is_void<T>::value >*)0 )
|
||||
);
|
||||
return r ? r->expected_from_python_type(): 0;
|
||||
}
|
||||
@@ -77,7 +78,7 @@ struct registered_pytype
|
||||
static PyTypeObject const *get_pytype()
|
||||
{
|
||||
const converter::registration *r=converter::registry::query(
|
||||
detail::unwind_type_id_((boost::type<T>*) 0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
||||
detail::unwind_type_id_((boost::type<T>*) 0, (mpl::bool_<boost::python::detail::is_void<T>::value >*)0 )
|
||||
);
|
||||
return r ? r->m_class_object: 0;
|
||||
}
|
||||
@@ -111,7 +112,7 @@ struct to_python_target_type
|
||||
static PyTypeObject const *get_pytype()
|
||||
{
|
||||
const converter::registration *r=converter::registry::query(
|
||||
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::is_void<T>::value >*)0 )
|
||||
detail::unwind_type_id_((boost::type<T>*)0, (mpl::bool_<boost::python::detail::is_void<T>::value >*)0 )
|
||||
);
|
||||
return r ? r->to_python_target_type(): 0;
|
||||
}
|
||||
|
||||
@@ -10,9 +10,7 @@
|
||||
#include <boost/python/type_id.hpp>
|
||||
#include <boost/python/converter/registry.hpp>
|
||||
#include <boost/python/converter/registrations.hpp>
|
||||
#include <boost/type_traits/transform_traits.hpp>
|
||||
#include <boost/type_traits/cv_traits.hpp>
|
||||
#include <boost/type_traits/is_void.hpp>
|
||||
#include <boost/python/detail/type_traits.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/type.hpp>
|
||||
#include <memory>
|
||||
@@ -44,8 +42,8 @@ namespace detail
|
||||
template <class T>
|
||||
struct registered
|
||||
: detail::registered_base<
|
||||
typename add_reference<
|
||||
typename add_cv<T>::type
|
||||
typename boost::python::detail::add_lvalue_reference<
|
||||
typename boost::python::detail::add_cv<T>::type
|
||||
>::type
|
||||
>
|
||||
{
|
||||
@@ -78,7 +76,7 @@ namespace detail
|
||||
registry::lookup_shared_ptr(type_id<shared_ptr<T> >());
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
#if !defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
template <class T>
|
||||
inline void
|
||||
register_shared_ptr0(std::shared_ptr<T>*)
|
||||
|
||||
@@ -7,8 +7,7 @@
|
||||
# include <boost/python/converter/registered.hpp>
|
||||
# include <boost/python/converter/pointer_type_id.hpp>
|
||||
# include <boost/python/converter/registry.hpp>
|
||||
# include <boost/type_traits/transform_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace converter {
|
||||
|
||||
@@ -17,9 +16,9 @@ struct registration;
|
||||
template <class T>
|
||||
struct registered_pointee
|
||||
: registered<
|
||||
typename remove_pointer<
|
||||
typename remove_cv<
|
||||
typename remove_reference<T>::type
|
||||
typename boost::python::detail::remove_pointer<
|
||||
typename boost::python::detail::remove_cv<
|
||||
typename boost::python::detail::remove_reference<T>::type
|
||||
>::type
|
||||
>::type
|
||||
>
|
||||
|
||||
2
include/boost/python/converter/return_from_python.hpp
Executable file → Normal file
2
include/boost/python/converter/return_from_python.hpp
Executable file → Normal file
@@ -14,7 +14,7 @@
|
||||
# include <boost/python/detail/void_return.hpp>
|
||||
# include <boost/python/errors.hpp>
|
||||
# include <boost/python/handle.hpp>
|
||||
# include <boost/type_traits/has_trivial_copy.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/and.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
|
||||
|
||||
@@ -8,9 +8,8 @@
|
||||
# include <boost/python/converter/constructor_function.hpp>
|
||||
# include <boost/python/detail/referent_storage.hpp>
|
||||
# include <boost/python/detail/destroy.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/static_assert.hpp>
|
||||
# include <boost/type_traits/add_reference.hpp>
|
||||
# include <boost/type_traits/add_cv.hpp>
|
||||
# include <cstddef>
|
||||
|
||||
// Data management for potential rvalue conversions from Python to C++
|
||||
@@ -78,7 +77,7 @@ struct rvalue_from_python_storage
|
||||
|
||||
// Storage for the result, in case an rvalue must be constructed
|
||||
typename python::detail::referent_storage<
|
||||
typename add_reference<T>::type
|
||||
typename boost::python::detail::add_lvalue_reference<T>::type
|
||||
>::type storage;
|
||||
};
|
||||
|
||||
@@ -110,7 +109,8 @@ struct rvalue_from_python_data : rvalue_from_python_storage<T>
|
||||
// Destroys any object constructed in the storage.
|
||||
~rvalue_from_python_data();
|
||||
private:
|
||||
typedef typename add_reference<typename add_cv<T>::type>::type ref_type;
|
||||
typedef typename boost::python::detail::add_lvalue_reference<
|
||||
typename boost::python::detail::add_cv<T>::type>::type ref_type;
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
@@ -25,7 +25,7 @@ PyObject* shared_ptr_to_python(shared_ptr<T> const& x)
|
||||
return converter::registered<shared_ptr<T> const&>::converters.to_python(&x);
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
#if !defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
template <class T>
|
||||
PyObject* shared_ptr_to_python(std::shared_ptr<T> const& x)
|
||||
{
|
||||
|
||||
@@ -19,14 +19,7 @@
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/python/detail/not_specified.hpp>
|
||||
# include <boost/python/detail/value_arg.hpp>
|
||||
|
||||
# include <boost/type_traits/add_const.hpp>
|
||||
# include <boost/type_traits/add_reference.hpp>
|
||||
# include <boost/type_traits/is_member_pointer.hpp>
|
||||
|
||||
# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# endif
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/mpl/eval_if.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
@@ -147,20 +140,20 @@ namespace detail
|
||||
// boost::python::make_getter are used to dispatch behavior. The
|
||||
// third argument is a workaround for a CWPro8 partial ordering bug
|
||||
// with pointers to data members. It should be convertible to
|
||||
// mpl::true_ iff the first argument is a pointer-to-member, and
|
||||
// mpl::false_ otherwise. The fourth argument is for compilers
|
||||
// detail::true_ iff the first argument is a pointer-to-member, and
|
||||
// detail::false_ otherwise. The fourth argument is for compilers
|
||||
// which don't support partial ordering at all and should always be
|
||||
// passed 0L.
|
||||
//
|
||||
|
||||
|
||||
#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
|
||||
template <class D, class P>
|
||||
inline object make_getter(D& d, P& p, mpl::false_, ...);
|
||||
inline object make_getter(D& d, P& p, detail::false_, ...);
|
||||
#endif
|
||||
|
||||
// Handle non-member pointers with policies
|
||||
template <class D, class Policies>
|
||||
inline object make_getter(D* d, Policies const& policies, mpl::false_, int)
|
||||
inline object make_getter(D* d, Policies const& policies, detail::false_, int)
|
||||
{
|
||||
return python::make_function(
|
||||
detail::datum<D>(d), policies, mpl::vector1<D&>()
|
||||
@@ -169,18 +162,18 @@ namespace detail
|
||||
|
||||
// Handle non-member pointers without policies
|
||||
template <class D>
|
||||
inline object make_getter(D* d, not_specified, mpl::false_, long)
|
||||
inline object make_getter(D* d, not_specified, detail::false_, long)
|
||||
{
|
||||
typedef typename default_datum_getter_policy<D>::type policies;
|
||||
return detail::make_getter(d, policies(), mpl::false_(), 0);
|
||||
return detail::make_getter(d, policies(), detail::false_(), 0);
|
||||
}
|
||||
|
||||
// Handle pointers-to-members with policies
|
||||
template <class C, class D, class Policies>
|
||||
inline object make_getter(D C::*pm, Policies const& policies, mpl::true_, int)
|
||||
inline object make_getter(D C::*pm, Policies const& policies, detail::true_, int)
|
||||
{
|
||||
#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
||||
typedef typename remove_cv<C>::type Class;
|
||||
typedef typename detail::remove_cv<C>::type Class;
|
||||
#else
|
||||
typedef C Class;
|
||||
#endif
|
||||
@@ -193,18 +186,18 @@ namespace detail
|
||||
|
||||
// Handle pointers-to-members without policies
|
||||
template <class C, class D>
|
||||
inline object make_getter(D C::*pm, not_specified, mpl::true_, long)
|
||||
inline object make_getter(D C::*pm, not_specified, detail::true_, long)
|
||||
{
|
||||
typedef typename default_member_getter_policy<D>::type policies;
|
||||
return detail::make_getter(pm, policies(), mpl::true_(), 0);
|
||||
return detail::make_getter(pm, policies(), detail::true_(), 0);
|
||||
}
|
||||
|
||||
// Handle references
|
||||
template <class D, class P>
|
||||
inline object make_getter(D& d, P& p, mpl::false_, ...)
|
||||
inline object make_getter(D& d, P& p, detail::false_, ...)
|
||||
{
|
||||
// Just dispatch to the handler for pointer types.
|
||||
return detail::make_getter(&d, p, mpl::false_(), 0L);
|
||||
return detail::make_getter(&d, p, detail::false_(), 0L);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -217,7 +210,7 @@ namespace detail
|
||||
|
||||
// Handle non-member pointers
|
||||
template <class D, class Policies>
|
||||
inline object make_setter(D* p, Policies const& policies, mpl::false_, int)
|
||||
inline object make_setter(D* p, Policies const& policies, detail::false_, int)
|
||||
{
|
||||
return python::make_function(
|
||||
detail::datum<D>(p), policies, mpl::vector2<void,D const&>()
|
||||
@@ -226,7 +219,7 @@ namespace detail
|
||||
|
||||
// Handle pointers-to-members
|
||||
template <class C, class D, class Policies>
|
||||
inline object make_setter(D C::*pm, Policies const& policies, mpl::true_, int)
|
||||
inline object make_setter(D C::*pm, Policies const& policies, detail::true_, int)
|
||||
{
|
||||
return python::make_function(
|
||||
detail::member<D,C>(pm)
|
||||
@@ -237,9 +230,9 @@ namespace detail
|
||||
|
||||
// Handle references
|
||||
template <class D, class Policies>
|
||||
inline object make_setter(D& x, Policies const& policies, mpl::false_, ...)
|
||||
inline object make_setter(D& x, Policies const& policies, detail::false_, ...)
|
||||
{
|
||||
return detail::make_setter(&x, policies, mpl::false_(), 0L);
|
||||
return detail::make_setter(&x, policies, detail::false_(), 0L);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,13 +246,13 @@ namespace detail
|
||||
template <class D, class Policies>
|
||||
inline object make_getter(D& d, Policies const& policies)
|
||||
{
|
||||
return detail::make_getter(d, policies, is_member_pointer<D>(), 0L);
|
||||
return detail::make_getter(d, policies, detail::is_member_pointer<D>(), 0L);
|
||||
}
|
||||
|
||||
template <class D, class Policies>
|
||||
inline object make_getter(D const& d, Policies const& policies)
|
||||
{
|
||||
return detail::make_getter(d, policies, is_member_pointer<D>(), 0L);
|
||||
return detail::make_getter(d, policies, detail::is_member_pointer<D>(), 0L);
|
||||
}
|
||||
|
||||
template <class D>
|
||||
@@ -267,7 +260,7 @@ inline object make_getter(D& x)
|
||||
{
|
||||
detail::not_specified policy
|
||||
= detail::not_specified(); // suppress a SunPro warning
|
||||
return detail::make_getter(x, policy, is_member_pointer<D>(), 0L);
|
||||
return detail::make_getter(x, policy, detail::is_member_pointer<D>(), 0L);
|
||||
}
|
||||
|
||||
# if !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
|
||||
@@ -276,7 +269,7 @@ inline object make_getter(D const& d)
|
||||
{
|
||||
detail::not_specified policy
|
||||
= detail::not_specified(); // Suppress a SunPro warning
|
||||
return detail::make_getter(d, policy, is_member_pointer<D>(), 0L);
|
||||
return detail::make_getter(d, policy, detail::is_member_pointer<D>(), 0L);
|
||||
}
|
||||
# endif
|
||||
|
||||
@@ -290,26 +283,26 @@ inline object make_getter(D const& d)
|
||||
template <class D, class Policies>
|
||||
inline object make_setter(D& x, Policies const& policies)
|
||||
{
|
||||
return detail::make_setter(x, policies, is_member_pointer<D>(), 0);
|
||||
return detail::make_setter(x, policies, detail::is_member_pointer<D>(), 0);
|
||||
}
|
||||
|
||||
template <class D, class Policies>
|
||||
inline object make_setter(D const& x, Policies const& policies)
|
||||
{
|
||||
return detail::make_setter(x, policies, is_member_pointer<D>(), 0);
|
||||
return detail::make_setter(x, policies, detail::is_member_pointer<D>(), 0);
|
||||
}
|
||||
|
||||
template <class D>
|
||||
inline object make_setter(D& x)
|
||||
{
|
||||
return detail::make_setter(x, default_call_policies(), is_member_pointer<D>(), 0);
|
||||
return detail::make_setter(x, default_call_policies(), detail::is_member_pointer<D>(), 0);
|
||||
}
|
||||
|
||||
# if !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
|
||||
template <class D>
|
||||
inline object make_setter(D const& x)
|
||||
{
|
||||
return detail::make_setter(x, default_call_policies(), is_member_pointer<D>(), 0);
|
||||
return detail::make_setter(x, default_call_policies(), detail::is_member_pointer<D>(), 0);
|
||||
}
|
||||
# endif
|
||||
|
||||
|
||||
0
include/boost/python/def_visitor.hpp
Executable file → Normal file
0
include/boost/python/def_visitor.hpp
Executable file → Normal file
@@ -8,10 +8,8 @@
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/python/to_python_value.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/detail/value_arg.hpp>
|
||||
# include <boost/type_traits/transform_traits.hpp>
|
||||
# include <boost/type_traits/is_pointer.hpp>
|
||||
# include <boost/type_traits/is_reference.hpp>
|
||||
# include <boost/mpl/or.hpp>
|
||||
# include <boost/mpl/front.hpp>
|
||||
|
||||
@@ -64,7 +62,7 @@ struct default_result_converter
|
||||
struct apply
|
||||
{
|
||||
typedef typename mpl::if_<
|
||||
mpl::or_<is_pointer<R>, is_reference<R> >
|
||||
mpl::or_<detail::is_pointer<R>, detail::is_reference<R> >
|
||||
, detail::specify_a_return_value_policy_to_wrap_functions_returning<R>
|
||||
, boost::python::to_python_value<
|
||||
typename detail::value_arg<R>::type
|
||||
|
||||
@@ -8,8 +8,7 @@
|
||||
# include <boost/config.hpp>
|
||||
# include <boost/type.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/tag.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
# include <boost/python/detail/invoke.hpp>
|
||||
# include <boost/python/detail/signature.hpp>
|
||||
# include <boost/python/detail/preprocessor.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/python/arg_from_python.hpp>
|
||||
# include <boost/python/converter/context_result_converter.hpp>
|
||||
@@ -31,9 +32,6 @@
|
||||
|
||||
# include <boost/compressed_pair.hpp>
|
||||
|
||||
# include <boost/type_traits/is_same.hpp>
|
||||
# include <boost/type_traits/is_convertible.hpp>
|
||||
|
||||
# include <boost/mpl/apply.hpp>
|
||||
# include <boost/mpl/eval_if.hpp>
|
||||
# include <boost/mpl/identity.hpp>
|
||||
@@ -50,7 +48,7 @@ inline PyObject* get(mpl::int_<N>, PyObject* const& args_)
|
||||
return PyTuple_GET_ITEM(args_,N);
|
||||
}
|
||||
|
||||
inline unsigned arity(PyObject* const& args_)
|
||||
inline Py_ssize_t arity(PyObject* const& args_)
|
||||
{
|
||||
return PyTuple_GET_SIZE(args_);
|
||||
}
|
||||
@@ -236,7 +234,7 @@ struct caller_arity<N>
|
||||
typedef typename select_result_converter<Policies, rtype>::type result_converter;
|
||||
|
||||
static const signature_element ret = {
|
||||
(boost::is_void<rtype>::value ? "void" : type_id<rtype>().name())
|
||||
(is_void<rtype>::value ? "void" : type_id<rtype>().name())
|
||||
, &detail::converter_target_type<result_converter>::get_pytype
|
||||
, boost::detail::indirect_traits::is_reference_to_non_const<rtype>::value
|
||||
};
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
// Set the name of our library, this will get undef'ed by auto_link.hpp
|
||||
// once it's done with it:
|
||||
//
|
||||
#define BOOST_LIB_NAME boost_python
|
||||
#define BOOST_LIB_NAME boost_python##PY_MAJOR_VERSION##PY_MINOR_VERSION
|
||||
//
|
||||
// If we're importing code from a dll, then tell auto_link.hpp about it:
|
||||
//
|
||||
|
||||
4
include/boost/python/detail/convertible.hpp
Executable file → Normal file
4
include/boost/python/detail/convertible.hpp
Executable file → Normal file
@@ -7,11 +7,11 @@
|
||||
|
||||
# if defined(__EDG_VERSION__) && __EDG_VERSION__ <= 241
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/type_traits/conversion_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# endif
|
||||
|
||||
// Supplies a runtime is_convertible check which can be used with tag
|
||||
// dispatching to work around the Metrowerks Pro7 limitation with boost::is_convertible
|
||||
// dispatching to work around the Metrowerks Pro7 limitation with boost/std::is_convertible
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
typedef char* yes_convertible;
|
||||
|
||||
0
include/boost/python/detail/copy_ctor_mutates_rhs.hpp
Executable file → Normal file
0
include/boost/python/detail/copy_ctor_mutates_rhs.hpp
Executable file → Normal file
@@ -4,7 +4,7 @@
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
#ifndef CV_CATEGORY_DWA200222_HPP
|
||||
# define CV_CATEGORY_DWA200222_HPP
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
@@ -26,8 +26,8 @@ struct cv_category
|
||||
// BOOST_STATIC_CONSTANT(bool, c = is_const<T>::value);
|
||||
// BOOST_STATIC_CONSTANT(bool, v = is_volatile<T>::value);
|
||||
typedef cv_tag<
|
||||
::boost::is_const<T>::value
|
||||
, ::boost::is_volatile<T>::value
|
||||
is_const<T>::value
|
||||
, is_volatile<T>::value
|
||||
> type;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright Gottfried Ganßauge 2003.
|
||||
// Copyright Gottfried Ganßauge 2003.
|
||||
// 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)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
# include <boost/python/type_id.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
|
||||
@@ -6,12 +6,11 @@
|
||||
# define DEF_HELPER_DWA200287_HPP
|
||||
|
||||
# include <boost/python/args.hpp>
|
||||
# include <boost/type_traits/same_traits.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/not.hpp>
|
||||
# include <boost/mpl/and.hpp>
|
||||
# include <boost/mpl/or.hpp>
|
||||
# include <boost/type_traits/add_reference.hpp>
|
||||
# include <boost/mpl/lambda.hpp>
|
||||
# include <boost/mpl/apply.hpp>
|
||||
# include <boost/tuple/tuple.hpp>
|
||||
@@ -73,7 +72,8 @@ namespace detail
|
||||
struct tuple_extract_base_select
|
||||
{
|
||||
typedef typename Tuple::head_type head_type;
|
||||
typedef typename mpl::apply1<Predicate, typename add_reference<head_type>::type>::type match_t;
|
||||
typedef typename mpl::apply1<Predicate,
|
||||
typename add_lvalue_reference<head_type>::type>::type match_t;
|
||||
BOOST_STATIC_CONSTANT(bool, match = match_t::value);
|
||||
typedef typename tuple_extract_impl<match>::template apply<Tuple,Predicate> type;
|
||||
};
|
||||
|
||||
0
include/boost/python/detail/def_helper_fwd.hpp
Executable file → Normal file
0
include/boost/python/detail/def_helper_fwd.hpp
Executable file → Normal file
@@ -12,7 +12,7 @@
|
||||
#define DEFAULTS_DEF_JDG20020811_HPP
|
||||
|
||||
#include <boost/python/detail/defaults_gen.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/python/detail/type_traits.hpp>
|
||||
#include <boost/mpl/front.hpp>
|
||||
#include <boost/mpl/size.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
@@ -238,7 +238,7 @@ namespace detail
|
||||
typedef typename OverloadsT::non_void_return_type non_void_return_type;
|
||||
|
||||
typedef typename mpl::if_c<
|
||||
boost::is_same<void, return_type>::value
|
||||
is_same<void, return_type>::value
|
||||
, void_return_type
|
||||
, non_void_return_type
|
||||
>::type stubs_type;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#ifndef DESTROY_DWA2002221_HPP
|
||||
# define DESTROY_DWA2002221_HPP
|
||||
|
||||
# include <boost/type_traits/is_array.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/detail/workaround.hpp>
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
@@ -30,7 +30,7 @@ struct value_destroyer<true>
|
||||
for (T const volatile* p = first; p != first + sizeof(A)/sizeof(T); ++p)
|
||||
{
|
||||
value_destroyer<
|
||||
boost::is_array<T>::value
|
||||
is_array<T>::value
|
||||
>::execute(p);
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,7 @@ inline void destroy_referent_impl(void* p, T& (*)())
|
||||
// note: cv-qualification needed for MSVC6
|
||||
// must come *before* T for metrowerks
|
||||
value_destroyer<
|
||||
(boost::is_array<T>::value)
|
||||
(is_array<T>::value)
|
||||
>::execute((const volatile T*)p);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
# include <boost/python/detail/preprocessor.hpp>
|
||||
# include <boost/python/detail/none.hpp>
|
||||
|
||||
# include <boost/type_traits/is_member_function_pointer.hpp>
|
||||
|
||||
# include <boost/preprocessor/iterate.hpp>
|
||||
# include <boost/preprocessor/facilities/intercept.hpp>
|
||||
# include <boost/preprocessor/repetition/enum_trailing_params.hpp>
|
||||
|
||||
2
include/boost/python/detail/is_shared_ptr.hpp
Executable file → Normal file
2
include/boost/python/detail/is_shared_ptr.hpp
Executable file → Normal file
@@ -13,7 +13,7 @@
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
BOOST_PYTHON_IS_XXX_DEF(shared_ptr, shared_ptr, 1)
|
||||
#if __cplusplus >= 201103L
|
||||
#if !defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
template <typename T>
|
||||
struct is_shared_ptr<std::shared_ptr<T> > : std::true_type {};
|
||||
#endif
|
||||
|
||||
0
include/boost/python/detail/is_wrapper.hpp
Executable file → Normal file
0
include/boost/python/detail/is_wrapper.hpp
Executable file → Normal file
0
include/boost/python/detail/nullary_function_adaptor.hpp
Executable file → Normal file
0
include/boost/python/detail/nullary_function_adaptor.hpp
Executable file → Normal file
@@ -5,7 +5,7 @@
|
||||
#ifndef POINTEE_DWA2002323_HPP
|
||||
# define POINTEE_DWA2002323_HPP
|
||||
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
|
||||
0
include/boost/python/detail/prefix.hpp
Executable file → Normal file
0
include/boost/python/detail/prefix.hpp
Executable file → Normal file
0
include/boost/python/detail/python_type.hpp
Executable file → Normal file
0
include/boost/python/detail/python_type.hpp
Executable file → Normal file
@@ -11,8 +11,8 @@
|
||||
# include <boost/type.hpp>
|
||||
|
||||
# include <boost/python/detail/preprocessor.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
|
||||
# include <boost/preprocessor/comma_if.hpp>
|
||||
|
||||
0
include/boost/python/detail/sfinae.hpp
Executable file → Normal file
0
include/boost/python/detail/sfinae.hpp
Executable file → Normal file
@@ -7,8 +7,7 @@
|
||||
|
||||
# include <cstddef>
|
||||
# include <boost/type.hpp>
|
||||
# include <boost/type_traits/array_traits.hpp>
|
||||
# include <boost/type_traits/same_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
# include <boost/detail/workaround.hpp>
|
||||
|
||||
|
||||
@@ -6,11 +6,9 @@
|
||||
# define TRANSLATE_EXCEPTION_TDS20091020_HPP
|
||||
|
||||
# include <boost/python/detail/exception_handler.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
# include <boost/call_traits.hpp>
|
||||
# include <boost/type_traits/add_const.hpp>
|
||||
# include <boost/type_traits/add_reference.hpp>
|
||||
# include <boost/type_traits/remove_reference.hpp>
|
||||
|
||||
# include <boost/function/function0.hpp>
|
||||
|
||||
@@ -33,7 +31,7 @@ struct translate_exception
|
||||
typename add_const<ExceptionType>::type
|
||||
>::type exception_non_ref;
|
||||
# else
|
||||
typedef typename add_reference<
|
||||
typedef typename add_lvalue_reference<
|
||||
typename add_const<ExceptionType>::type
|
||||
>::type exception_cref;
|
||||
# endif
|
||||
|
||||
111
include/boost/python/detail/type_traits.hpp
Normal file
111
include/boost/python/detail/type_traits.hpp
Normal file
@@ -0,0 +1,111 @@
|
||||
// Copyright Shreyans Doshi 2017.
|
||||
// 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)
|
||||
|
||||
#ifndef BOOST_PYTHON_DETAIL_TYPE_TRAITS_HPP
|
||||
# define BOOST_PYTHON_DETAIL_TYPE_TRAITS_HPP
|
||||
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#ifdef BOOST_NO_CXX11_HDR_TYPE_TRAITS
|
||||
# include <boost/type_traits/transform_traits.hpp>
|
||||
# include <boost/type_traits/same_traits.hpp>
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/type_traits/is_polymorphic.hpp>
|
||||
# include <boost/type_traits/composite_traits.hpp>
|
||||
# include <boost/type_traits/conversion_traits.hpp>
|
||||
# include <boost/type_traits/add_pointer.hpp>
|
||||
# include <boost/type_traits/remove_pointer.hpp>
|
||||
# include <boost/type_traits/is_void.hpp>
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/type_traits/add_lvalue_reference.hpp>
|
||||
# include <boost/type_traits/function_traits.hpp>
|
||||
# include <boost/type_traits/is_scalar.hpp>
|
||||
# include <boost/type_traits/alignment_traits.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
#else
|
||||
# include <type_traits>
|
||||
#endif
|
||||
|
||||
# include <boost/type_traits/is_base_and_derived.hpp>
|
||||
# include <boost/type_traits/alignment_traits.hpp>
|
||||
# include <boost/type_traits/has_trivial_copy.hpp>
|
||||
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
#ifdef BOOST_NO_CXX11_HDR_TYPE_TRAITS
|
||||
using boost::alignment_of;
|
||||
using boost::add_const;
|
||||
using boost::add_cv;
|
||||
using boost::add_lvalue_reference;
|
||||
using boost::add_pointer;
|
||||
|
||||
using boost::is_array;
|
||||
using boost::is_class;
|
||||
using boost::is_const;
|
||||
using boost::is_convertible;
|
||||
using boost::is_enum;
|
||||
using boost::is_function;
|
||||
using boost::is_integral;
|
||||
using boost::is_lvalue_reference;
|
||||
using boost::is_member_function_pointer;
|
||||
using boost::is_member_pointer;
|
||||
using boost::is_pointer;
|
||||
using boost::is_polymorphic;
|
||||
using boost::is_reference;
|
||||
using boost::is_same;
|
||||
using boost::is_scalar;
|
||||
using boost::is_union;
|
||||
using boost::is_void;
|
||||
using boost::is_volatile;
|
||||
|
||||
using boost::remove_reference;
|
||||
using boost::remove_pointer;
|
||||
using boost::remove_cv;
|
||||
using boost::remove_const;
|
||||
|
||||
using boost::mpl::true_;
|
||||
using boost::mpl::false_;
|
||||
#else
|
||||
using std::alignment_of;
|
||||
using std::add_const;
|
||||
using std::add_cv;
|
||||
using std::add_lvalue_reference;
|
||||
using std::add_pointer;
|
||||
|
||||
using std::is_array;
|
||||
using std::is_class;
|
||||
using std::is_const;
|
||||
using std::is_convertible;
|
||||
using std::is_enum;
|
||||
using std::is_function;
|
||||
using std::is_integral;
|
||||
using std::is_lvalue_reference;
|
||||
using std::is_member_function_pointer;
|
||||
using std::is_member_pointer;
|
||||
using std::is_pointer;
|
||||
using std::is_polymorphic;
|
||||
using std::is_reference;
|
||||
using std::is_same;
|
||||
using std::is_scalar;
|
||||
using std::is_union;
|
||||
using std::is_void;
|
||||
using std::is_volatile;
|
||||
|
||||
using std::remove_reference;
|
||||
using std::remove_pointer;
|
||||
using std::remove_cv;
|
||||
using std::remove_const;
|
||||
|
||||
typedef std::integral_constant<bool, true> true_;
|
||||
typedef std::integral_constant<bool, false> false_;
|
||||
#endif
|
||||
using boost::is_base_and_derived;
|
||||
using boost::type_with_alignment;
|
||||
using boost::has_trivial_copy;
|
||||
}}} // namespace boost::python::detail
|
||||
|
||||
|
||||
#endif //BOOST_DETAIL_TYPE_TRAITS_HPP
|
||||
6
include/boost/python/detail/unwind_type.hpp
Executable file → Normal file
6
include/boost/python/detail/unwind_type.hpp
Executable file → Normal file
@@ -7,7 +7,7 @@
|
||||
|
||||
# include <boost/python/detail/cv_category.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/type_traits/object_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
@@ -155,10 +155,10 @@ unwind_type(boost::type<U>*p =0, Generator* =0)
|
||||
#endif
|
||||
{
|
||||
BOOST_STATIC_CONSTANT(int, indirection
|
||||
= (boost::is_pointer<U>::value ? pointer_ : 0)
|
||||
= (is_pointer<U>::value ? pointer_ : 0)
|
||||
+ (indirect_traits::is_reference_to_pointer<U>::value
|
||||
? reference_to_pointer_
|
||||
: boost::is_reference<U>::value
|
||||
: is_lvalue_reference<U>::value
|
||||
? reference_
|
||||
: 0));
|
||||
|
||||
|
||||
0
include/boost/python/detail/unwrap_type_id.hpp
Executable file → Normal file
0
include/boost/python/detail/unwrap_type_id.hpp
Executable file → Normal file
0
include/boost/python/detail/unwrap_wrapper.hpp
Executable file → Normal file
0
include/boost/python/detail/unwrap_wrapper.hpp
Executable file → Normal file
5
include/boost/python/detail/value_arg.hpp
Executable file → Normal file
5
include/boost/python/detail/value_arg.hpp
Executable file → Normal file
@@ -6,8 +6,7 @@
|
||||
|
||||
# include <boost/python/detail/copy_ctor_mutates_rhs.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/type_traits/add_reference.hpp>
|
||||
# include <boost/type_traits/add_const.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
@@ -16,7 +15,7 @@ struct value_arg
|
||||
: mpl::if_<
|
||||
copy_ctor_mutates_rhs<T>
|
||||
, T
|
||||
, typename add_reference<
|
||||
, typename add_lvalue_reference<
|
||||
typename add_const<T>::type
|
||||
>::type
|
||||
>
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
# include <boost/mpl/bool.hpp>
|
||||
# include <boost/preprocessor/enum_params.hpp>
|
||||
|
||||
|
||||
# include <boost/type_traits/remove_reference.hpp>
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/detail/is_xxx.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
# define BOOST_PYTHON_VALUE_IS_XXX_DEF(name, qualified_name, nargs) \
|
||||
template <class X_> \
|
||||
struct value_is_##name \
|
||||
@@ -24,9 +24,10 @@ struct value_is_##name \
|
||||
typename remove_reference<X_>::type \
|
||||
>::type \
|
||||
>::value); \
|
||||
typedef mpl::bool_<value> type; \
|
||||
typedef mpl::bool_<value> type; \
|
||||
\
|
||||
};
|
||||
|
||||
}}} // namespace boost::python::detail
|
||||
|
||||
#endif // VALUE_IS_XXX_DWA2003224_HPP
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#ifndef VOID_PTR_DWA200239_HPP
|
||||
# define VOID_PTR_DWA200239_HPP
|
||||
|
||||
# include <boost/type_traits/remove_cv.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python { namespace detail {
|
||||
|
||||
|
||||
@@ -5,8 +5,7 @@
|
||||
# define WRAPPER_BASE_DWA2004722_HPP
|
||||
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/type_traits/is_polymorphic.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python {
|
||||
|
||||
@@ -21,14 +20,14 @@ namespace detail
|
||||
inline PyObject* get_owner(wrapper_base const volatile& w);
|
||||
|
||||
inline PyObject*
|
||||
owner_impl(void const volatile* /*x*/, mpl::false_)
|
||||
owner_impl(void const volatile* /*x*/, detail::false_)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline PyObject*
|
||||
owner_impl(T const volatile* x, mpl::true_);
|
||||
owner_impl(T const volatile* x, detail::true_);
|
||||
|
||||
template <class T>
|
||||
inline PyObject*
|
||||
@@ -59,7 +58,7 @@ namespace detail
|
||||
{
|
||||
template <class T>
|
||||
inline PyObject*
|
||||
owner_impl(T const volatile* x, mpl::true_)
|
||||
owner_impl(T const volatile* x, detail::true_)
|
||||
{
|
||||
if (wrapper_base const volatile* w = dynamic_cast<wrapper_base const volatile*>(x))
|
||||
{
|
||||
|
||||
0
include/boost/python/docstring_options.hpp
Executable file → Normal file
0
include/boost/python/docstring_options.hpp
Executable file → Normal file
@@ -20,6 +20,10 @@ object
|
||||
BOOST_PYTHON_DECL
|
||||
eval(str string, object global = object(), object local = object());
|
||||
|
||||
object
|
||||
BOOST_PYTHON_DECL
|
||||
eval(char const *string, object global = object(), object local = object());
|
||||
|
||||
// Execute an individual python statement from str.
|
||||
// global and local are the global and local scopes respectively,
|
||||
// used during execution.
|
||||
@@ -27,6 +31,10 @@ object
|
||||
BOOST_PYTHON_DECL
|
||||
exec_statement(str string, object global = object(), object local = object());
|
||||
|
||||
object
|
||||
BOOST_PYTHON_DECL
|
||||
exec_statement(char const *string, object global = object(), object local = object());
|
||||
|
||||
// Execute python source code from str.
|
||||
// global and local are the global and local scopes respectively,
|
||||
// used during execution.
|
||||
@@ -34,6 +42,10 @@ object
|
||||
BOOST_PYTHON_DECL
|
||||
exec(str string, object global = object(), object local = object());
|
||||
|
||||
object
|
||||
BOOST_PYTHON_DECL
|
||||
exec(char const *string, object global = object(), object local = object());
|
||||
|
||||
// Execute python source code from file filename.
|
||||
// global and local are the global and local scopes respectively,
|
||||
// used during execution.
|
||||
@@ -41,6 +53,10 @@ object
|
||||
BOOST_PYTHON_DECL
|
||||
exec_file(str filename, object global = object(), object local = object());
|
||||
|
||||
object
|
||||
BOOST_PYTHON_DECL
|
||||
exec_file(char const *filename, object global = object(), object local = object());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
0
include/boost/python/handle_fwd.hpp
Executable file → Normal file
0
include/boost/python/handle_fwd.hpp
Executable file → Normal file
@@ -27,7 +27,7 @@
|
||||
#include <boost/mpl/joint_view.hpp>
|
||||
#include <boost/mpl/back.hpp>
|
||||
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
#include <boost/preprocessor/enum_params_with_a_default.hpp>
|
||||
#include <boost/preprocessor/enum_params.hpp>
|
||||
|
||||
@@ -8,12 +8,10 @@
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
|
||||
# include <boost/python/detail/target.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/python/object/iterator.hpp>
|
||||
# include <boost/python/object_core.hpp>
|
||||
|
||||
# include <boost/type_traits/cv_traits.hpp>
|
||||
# include <boost/type_traits/transform_traits.hpp>
|
||||
|
||||
# if defined(BOOST_MSVC) && (BOOST_MSVC == 1400) /*
|
||||
> warning C4180: qualifier applied to function type has no meaning; ignored
|
||||
Peter Dimov wrote:
|
||||
@@ -80,7 +78,7 @@ namespace detail
|
||||
template <class T>
|
||||
struct iterators
|
||||
: detail::iterators_impl<
|
||||
boost::is_const<T>::value
|
||||
detail::is_const<T>::value
|
||||
>::template apply<T>
|
||||
{
|
||||
};
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# include <boost/python/type_id.hpp>
|
||||
# include <boost/python/converter/registry.hpp>
|
||||
# include <boost/python/detail/void_ptr.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
|
||||
namespace boost { namespace python {
|
||||
|
||||
@@ -35,7 +36,7 @@ namespace detail
|
||||
{
|
||||
static inline void* execute(PyObject* op)
|
||||
{
|
||||
typedef typename boost::add_reference<U>::type param;
|
||||
typedef typename add_lvalue_reference<U>::type param;
|
||||
return &Extractor::execute(
|
||||
boost::python::detail::void_ptr_to_reference(
|
||||
op, (param(*)())0 )
|
||||
|
||||
@@ -43,19 +43,19 @@ namespace detail
|
||||
|
||||
private:
|
||||
template <class U>
|
||||
void dispatch(U* x, mpl::true_) const
|
||||
void dispatch(U* x, detail::true_) const
|
||||
{
|
||||
#if __cplusplus < 201103L
|
||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
std::auto_ptr<U> owner(x);
|
||||
dispatch(owner, mpl::false_());
|
||||
dispatch(owner, detail::false_());
|
||||
#else
|
||||
std::unique_ptr<U> owner(x);
|
||||
dispatch(std::move(owner), mpl::false_());
|
||||
dispatch(std::move(owner), detail::false_());
|
||||
#endif
|
||||
}
|
||||
|
||||
template <class Ptr>
|
||||
void dispatch(Ptr x, mpl::false_) const
|
||||
void dispatch(Ptr x, detail::false_) const
|
||||
{
|
||||
typedef typename pointee<Ptr>::type value_type;
|
||||
typedef objects::pointer_holder<Ptr,value_type> holder;
|
||||
@@ -63,7 +63,7 @@ namespace detail
|
||||
|
||||
void* memory = holder::allocate(this->m_self, offsetof(instance_t, storage), sizeof(holder));
|
||||
try {
|
||||
#if __cplusplus < 201103L
|
||||
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||
(new (memory) holder(x))->install(this->m_self);
|
||||
#else
|
||||
(new (memory) holder(std::move(x)))->install(this->m_self);
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
|
||||
# include <boost/python/detail/prefix.hpp>
|
||||
# include <boost/python/detail/indirect_traits.hpp>
|
||||
# include <boost/python/detail/type_traits.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/python/to_python_indirect.hpp>
|
||||
# include <boost/type_traits/composite_traits.hpp>
|
||||
|
||||
namespace boost { namespace python {
|
||||
|
||||
@@ -29,7 +29,7 @@ struct manage_new_object
|
||||
struct apply
|
||||
{
|
||||
typedef typename mpl::if_c<
|
||||
boost::is_pointer<T>::value
|
||||
detail::is_pointer<T>::value
|
||||
, to_python_indirect<T, detail::make_owning_holder>
|
||||
, detail::manage_new_object_requires_a_pointer_return_type<T>
|
||||
>::type type;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user