From d6d54ce483c27ef2cddb4d43e6e775c5c496ec62 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Mon, 18 Dec 2017 15:04:23 -0500 Subject: [PATCH 01/10] This is an object, not a function declaration. Really. --- src/object/enum.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object/enum.cpp b/src/object/enum.cpp index 4d73ee23..10122ad1 100644 --- a/src/object/enum.cpp +++ b/src/object/enum.cpp @@ -44,7 +44,7 @@ extern "C" static PyObject* enum_repr(PyObject* self_) { PyObject *mod = PyObject_GetAttrString( self_, "__module__"); - object auto_free(handle<>(mod)); + object auto_free = object(handle<>(mod)); enum_object* self = downcast(self_); if (!self->name) { From 660487c43fde76f3e64f1cb2e644500da92fe582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20Rosenkr=C3=A4nzer?= Date: Fri, 9 Feb 2018 18:20:30 +0100 Subject: [PATCH 02/10] Fix build with Python 3.7 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python 3.7 changes the return type of _PyUnicode_AsString() from void* to const char* -- causing the build of boost-python to fail. Signed-off-by: Bernhard Rosenkränzer --- src/converter/builtin_converters.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/converter/builtin_converters.cpp b/src/converter/builtin_converters.cpp index 1c28af7f..ee2d5b47 100644 --- a/src/converter/builtin_converters.cpp +++ b/src/converter/builtin_converters.cpp @@ -45,11 +45,16 @@ namespace { return PyString_Check(obj) ? PyString_AsString(obj) : 0; } -#else +#elif PY_VERSION_HEX < 0x03070000 void* convert_to_cstring(PyObject* obj) { return PyUnicode_Check(obj) ? _PyUnicode_AsString(obj) : 0; } +#else + void* convert_to_cstring(PyObject* obj) + { + return PyUnicode_Check(obj) ? const_cast(reinterpret_cast(_PyUnicode_AsString(obj))) : 0; + } #endif // Given a target type and a SlotPolicy describing how to perform a From d4d41d94aecc9f8098aabd3587fcb95458451f71 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Tue, 6 Feb 2018 16:59:45 -0500 Subject: [PATCH 03/10] Add Python version to library suffix. --- Jamfile | 68 ++++++++ build/Jamfile | 227 ++++++++++--------------- fabscript | 1 + include/boost/python/detail/config.hpp | 6 +- include/boost/python/numpy/config.hpp | 6 +- src/fabscript | 4 +- 6 files changed, 159 insertions(+), 153 deletions(-) create mode 100644 Jamfile diff --git a/Jamfile b/Jamfile new file mode 100644 index 00000000..3a35dde0 --- /dev/null +++ b/Jamfile @@ -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 ] ; + 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) ] ; +} diff --git a/build/Jamfile b/build/Jamfile index 1fd6d030..98c386c7 100644 --- a/build/Jamfile +++ b/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,146 +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 + static:BOOST_PYTHON_STATIC_LIB + BOOST_PYTHON_SOURCE -rule lib_boost_python ( version ) -{ - lib $(lib_boost_python($(version))) - : # sources - 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 ] : /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 - static:BOOST_PYTHON_STATIC_LIB - 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 ] : /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 ] : no ] - 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 ] : no ] + config-warning + on:BOOST_DEBUG_PYTHON + -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag + @$(__name__).python-tag + @python.require-py - on:BOOST_DEBUG_PYTHON - $(version) + : # default build + shared + : # usage requirements + static:BOOST_PYTHON_STATIC_LIB + on:BOOST_DEBUG_PYTHON + ; - -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).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 + static:BOOST_NUMPY_STATIC_LIB + BOOST_NUMPY_SOURCE + [ cond [ python.numpy ] : /python//python_for_extensions ] + [ unless [ python.numpy ] : no ] + $(numpy-include) + boost_python + on:BOOST_DEBUG_PYTHON + -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag + @$(__name__).python-tag + @python.require-py - @python.require-py - - : # default build - shared - : # usage requirements - static:BOOST_PYTHON_STATIC_LIB - on:BOOST_DEBUG_PYTHON - ; -} - -lib_boost_numpy(2) = boost_numpy ; -lib_boost_numpy(3) = boost_numpy3 ; - -lib_boost_numpy($(py2-version)) = $(lib_boost_numpy(2)) ; -lib_boost_numpy($(py3-version)) = $(lib_boost_numpy(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 - static:BOOST_NUMPY_STATIC_LIB - BOOST_NUMPY_SOURCE - [ cond [ python.numpy ] : /python//python_for_extensions ] - [ unless [ python.numpy ] : no ] - $(numpy-include) - $(lib_boost_python($(version))) - on:BOOST_DEBUG_PYTHON - $(version) - - -@$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).tag - @$(BOOST_JAMROOT_MODULE)%$(BOOST_JAMROOT_MODULE).python-tag - - @python.require-py - - : # default build - shared - : # usage requirements - static:BOOST_NUMPY_STATIC_LIB - on: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 + shared + : # usage requirements + static:BOOST_NUMPY_STATIC_LIB + on:BOOST_DEBUG_PYTHON + ; diff --git a/fabscript b/fabscript index 59be9e18..054321d5 100644 --- a/fabscript +++ b/fabscript @@ -20,6 +20,7 @@ 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): diff --git a/include/boost/python/detail/config.hpp b/include/boost/python/detail/config.hpp index 3e4b7c9e..acf58831 100644 --- a/include/boost/python/detail/config.hpp +++ b/include/boost/python/detail/config.hpp @@ -105,11 +105,7 @@ // Set the name of our library, this will get undef'ed by auto_link.hpp // once it's done with it: // -#if PY_MAJOR_VERSION == 2 -# define BOOST_LIB_NAME boost_python -#elif PY_MAJOR_VERSION == 3 -# define BOOST_LIB_NAME boost_python3 -#endif +#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: // diff --git a/include/boost/python/numpy/config.hpp b/include/boost/python/numpy/config.hpp index 97178906..e6484bc5 100644 --- a/include/boost/python/numpy/config.hpp +++ b/include/boost/python/numpy/config.hpp @@ -62,11 +62,7 @@ // Set the name of our library, this will get undef'ed by auto_link.hpp // once it's done with it: // -#if PY_MAJOR_VERSION == 2 -# define BOOST_LIB_NAME boost_numpy -#elif PY_MAJOR_VERSION == 3 -# define BOOST_LIB_NAME boost_numpy3 -#endif +#define BOOST_LIB_NAME boost_numpy##PY_MAJOR_VERSION##PY_MINOR_VERSION // // If we're importing code from a dll, then tell auto_link.hpp about it: // diff --git a/src/fabscript b/src/fabscript index d5dbf603..0ebeac60 100644 --- a/src/fabscript +++ b/src/fabscript @@ -13,7 +13,7 @@ from faber.tools.compiler import define root = module('..') -bpl = library('boost_python', +bpl = library('boost_python' + root.py_suffix, ['list.cpp', 'long.cpp', 'dict.cpp', @@ -44,7 +44,7 @@ bpl = library('boost_python', dependencies=root.config, features=features + define('BOOST_PYTHON_SOURCE')) -bnl = library('boost_numpy', +bnl = library('boost_numpy' + root.py_suffix, ['numpy/dtype.cpp', 'numpy/matrix.cpp', 'numpy/ndarray.cpp', From 65be0e0f0f96975fbe43eceae5409237934a96bb Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Thu, 15 Feb 2018 20:23:46 -0500 Subject: [PATCH 04/10] Only iterate over multiple calling conventions on x86. --- test/calling_conventions.cpp | 8 +++++--- test/calling_conventions_mf.cpp | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/test/calling_conventions.cpp b/test/calling_conventions.cpp index 54f49aeb..c1c2b5a4 100644 --- a/test/calling_conventions.cpp +++ b/test/calling_conventions.cpp @@ -17,9 +17,11 @@ //------------------------------------------------------------------------------ // this section is the main body of the test extension module -#define BOOST_PYTHON_ENABLE_CDECL -#define BOOST_PYTHON_ENABLE_STDCALL -#define BOOST_PYTHON_ENABLE_FASTCALL +#if defined(_WIN32) && !defined(_WIN64) +# define BOOST_PYTHON_ENABLE_CDECL +# define BOOST_PYTHON_ENABLE_STDCALL +# define BOOST_PYTHON_ENABLE_FASTCALL +#endif #include #include #include diff --git a/test/calling_conventions_mf.cpp b/test/calling_conventions_mf.cpp index 80ccc406..83a97acf 100644 --- a/test/calling_conventions_mf.cpp +++ b/test/calling_conventions_mf.cpp @@ -17,9 +17,11 @@ //------------------------------------------------------------------------------ // this section is the main body of the test extension module -#define BOOST_PYTHON_ENABLE_CDECL -#define BOOST_PYTHON_ENABLE_STDCALL -#define BOOST_PYTHON_ENABLE_FASTCALL +#if defined(_WIN32) && !defined(_WIN64) +# define BOOST_PYTHON_ENABLE_CDECL +# define BOOST_PYTHON_ENABLE_STDCALL +# define BOOST_PYTHON_ENABLE_FASTCALL +#endif #include #include #include From 2f6e728de5c394f2b26c802b0388cf3f757c84fa Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Tue, 20 Feb 2018 16:43:58 -0500 Subject: [PATCH 05/10] Fix misspelled operator name. --- doc/reference/operators.qbk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/reference/operators.qbk b/doc/reference/operators.qbk index 892d33b7..8276f681 100644 --- a/doc/reference/operators.qbk +++ b/doc/reference/operators.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`]] From ed3cbf8a609cb5a1bc50e8e06f7082add22a188f Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Sun, 25 Feb 2018 17:39:18 -0500 Subject: [PATCH 06/10] Start to collect release notes. --- doc/python.qbk | 2 ++ doc/release_notes.qbk | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 doc/release_notes.qbk diff --git a/doc/python.qbk b/doc/python.qbk index ffd2d0dd..b8b0926d 100644 --- a/doc/python.qbk +++ b/doc/python.qbk @@ -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] diff --git a/doc/release_notes.qbk b/doc/release_notes.qbk new file mode 100644 index 00000000..7e0c82fd --- /dev/null +++ b/doc/release_notes.qbk @@ -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. \ No newline at end of file From 66dad425aaad3bce0b3744735c47779b9003cb0f Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 7 Mar 2018 11:01:20 -0500 Subject: [PATCH 07/10] Build docs with faber. --- .ci/upload_docs.sh | 4 +-- .travis.yml | 19 ++++++----- doc/fabscript | 83 ++++++++++++++++++++++++++++++++++++++++++++++ fabscript | 1 + 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 doc/fabscript diff --git a/.ci/upload_docs.sh b/.ci/upload_docs.sh index aa20838d..1e6f6b5c 100755 --- a/.ci/upload_docs.sh +++ b/.ci/upload_docs.sh @@ -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" diff --git a/.travis.yml b/.travis.yml index e9342193..cd11fd0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ matrix: env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++98 - compiler: clang env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++11 - #- env: PYTHON=python DOC=1 + - env: PYTHON=python DOC=1 addons: @@ -37,7 +37,6 @@ addons: sources: - ubuntu-toolchain-r-test packages: - - scons - gcc-4.8 - g++-4.8 - clang @@ -80,11 +79,13 @@ install: rm -rf $HOME/Boost/boost/python* popd # Install Faber, the build tool. - date=2017-11-09 - #wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz - wget https://github.com/stefanseefeld/faber/archive/release/0.2.tar.gz - tar xf 0.2.tar.gz - pushd faber-release-0.2 + 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 fi @@ -95,8 +96,8 @@ before_script: - faber -h script: -- faber --with-boost-include=$HOME/Boost test.report cxx.name=$CXX cxxflags=$CXXFLAGS -#- if [ "$DOC" ]; then scons doc; else scons && scons test; fi +- faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS +- if [ "$DOC" ]; then BOOST_ROOT=$HOME/Boost faber --builddir=build doc.html; fi after_success: # Upload docs only when building upstream. diff --git a/doc/fabscript b/doc/fabscript new file mode 100644 index 00000000..bd8be7a3 --- /dev/null +++ b/doc/fabscript @@ -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 diff --git a/fabscript b/fabscript index 054321d5..054ed90e 100644 --- a/fabscript +++ b/fabscript @@ -77,5 +77,6 @@ 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 From 1db3871f50c7f5e62989dc7b245640554abfe333 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 7 Mar 2018 13:36:26 -0500 Subject: [PATCH 08/10] Remove obsolete scons-based build logic. --- SConstruct | 101 ------ config/__init__.py | 140 -------- config/boost.py | 45 --- config/cxx.py | 30 -- config/numpy.py | 86 ----- config/python.py | 98 ------ config/toolchains/__init__.py | 18 -- config/toolchains/gcc.py | 55 ---- config/toolchains/msvc.py | 57 ---- config/tools/clang.py | 44 --- config/tools/doc.py | 75 ----- config/tools/libs.py | 85 ----- config/tools/sphinx4scons.py | 592 ---------------------------------- config/tools/tests.py | 123 ------- config/ui.py | 96 ------ doc/SConscript | 52 --- src/SConscript | 61 ---- test/SConscript | 169 ---------- 18 files changed, 1927 deletions(-) delete mode 100644 SConstruct delete mode 100644 config/__init__.py delete mode 100644 config/boost.py delete mode 100644 config/cxx.py delete mode 100644 config/numpy.py delete mode 100644 config/python.py delete mode 100644 config/toolchains/__init__.py delete mode 100644 config/toolchains/gcc.py delete mode 100644 config/toolchains/msvc.py delete mode 100644 config/tools/clang.py delete mode 100644 config/tools/doc.py delete mode 100644 config/tools/libs.py delete mode 100644 config/tools/sphinx4scons.py delete mode 100644 config/tools/tests.py delete mode 100644 config/ui.py delete mode 100644 doc/SConscript delete mode 100644 src/SConscript delete mode 100644 test/SConscript diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 848172f9..00000000 --- a/SConstruct +++ /dev/null @@ -1,101 +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_vars['ENV'] = os.environ #{'PATH': os.environ['PATH'], 'TMP' : os.environ['TMP']} -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.65' -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') }) diff --git a/config/__init__.py b/config/__init__.py deleted file mode 100644 index 704124b6..00000000 --- a/config/__init__.py +++ /dev/null @@ -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 diff --git a/config/boost.py b/config/boost.py deleted file mode 100644 index a7cde93e..00000000 --- a/config/boost.py +++ /dev/null @@ -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 " - - 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 diff --git a/config/cxx.py b/config/cxx.py deleted file mode 100644 index deb7be73..00000000 --- a/config/cxx.py +++ /dev/null @@ -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 && (!defined(_MSC_VER) || _MSC_VER < 1800) -#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 diff --git a/config/numpy.py b/config/numpy.py deleted file mode 100644 index 3380ae56..00000000 --- a/config/numpy.py +++ /dev/null @@ -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 diff --git a/config/python.py b/config/python.py deleted file mode 100644 index 0aff24ee..00000000 --- a/config/python.py +++ /dev/null @@ -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 diff --git a/config/toolchains/__init__.py b/config/toolchains/__init__.py deleted file mode 100644 index af38285a..00000000 --- a/config/toolchains/__init__.py +++ /dev/null @@ -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 - diff --git a/config/toolchains/gcc.py b/config/toolchains/gcc.py deleted file mode 100644 index 200ecb6a..00000000 --- a/config/toolchains/gcc.py +++ /dev/null @@ -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") diff --git a/config/toolchains/msvc.py b/config/toolchains/msvc.py deleted file mode 100644 index 576ff819..00000000 --- a/config/toolchains/msvc.py +++ /dev/null @@ -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") diff --git a/config/tools/clang.py b/config/tools/clang.py deleted file mode 100644 index 9af06708..00000000 --- a/config/tools/clang.py +++ /dev/null @@ -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) diff --git a/config/tools/doc.py b/config/tools/doc.py deleted file mode 100644 index 5e81f379..00000000 --- a/config/tools/doc.py +++ /dev/null @@ -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) diff --git a/config/tools/libs.py b/config/tools/libs.py deleted file mode 100644 index da8119d0..00000000 --- a/config/tools/libs.py +++ /dev/null @@ -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") diff --git a/config/tools/sphinx4scons.py b/config/tools/sphinx4scons.py deleted file mode 100644 index dda88d23..00000000 --- a/config/tools/sphinx4scons.py +++ /dev/null @@ -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 diff --git a/config/tools/tests.py b/config/tools/tests.py deleted file mode 100644 index a2e8e084..00000000 --- a/config/tools/tests.py +++ /dev/null @@ -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) diff --git a/config/ui.py b/config/ui.py deleted file mode 100644 index e6e4f24f..00000000 --- a/config/ui.py +++ /dev/null @@ -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) diff --git a/doc/SConscript b/doc/SConscript deleted file mode 100644 index 8eb0fb93..00000000 --- a/doc/SConscript +++ /dev/null @@ -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/') diff --git a/src/SConscript b/src/SConscript deleted file mode 100644 index 6d2e5694..00000000 --- a/src/SConscript +++ /dev/null @@ -1,61 +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.AppendUnique(CPPDEFINES = ["${LINK_DYNAMIC and 'BOOST_PYTHON_DYN_LINK=1' or ''}"]) - -env1 = env.Clone() -env1.AppendUnique(CPPDEFINES = ['BOOST_PYTHON_SOURCE']) - -env1.BoostLibrary( - 'python', - ['list.cpp', - 'long.cpp', - 'dict.cpp', - 'tuple.cpp', - 'str.cpp', - 'slice.cpp', - 'converter/from_python.cpp', - 'converter/registry.cpp', - 'converter/type_id.cpp', - 'object/enum.cpp', - 'object/class.cpp', - 'object/function.cpp', - 'object/inheritance.cpp', - 'object/life_support.cpp', - 'object/pickle_support.cpp', - 'errors.cpp', - 'module.cpp', - 'converter/builtin_converters.cpp', - 'converter/arg_to_python_base.cpp', - 'object/iterator.cpp', - 'object/stl_iterator.cpp', - 'object_protocol.cpp', - 'object_operators.cpp', - 'wrapper.cpp', - 'import.cpp', - 'exec.cpp', - 'object/function_doc_signature.cpp']) - -if env['NUMPY']: - env2 = env.Clone() - env2.Append(CPPPATH=env['NUMPY_CPPPATH']) - build_dir = env.Dir('$BOOST_CURRENT_VARIANT_DIR/src') - env2.AppendUnique(CPPDEFINES = ['BOOST_NUMPY_SOURCE'], - LIBPATH = [build_dir], - LIBS='boost_python' + env["BOOST_SUFFIX"]) - env2.BoostLibrary( - 'numpy', - ['numpy/dtype.cpp', - 'numpy/matrix.cpp', - 'numpy/ndarray.cpp', - 'numpy/numpy.cpp', - 'numpy/scalars.cpp', - 'numpy/ufunc.cpp']) diff --git a/test/SConscript b/test/SConscript deleted file mode 100644 index eaeefaca..00000000 --- a/test/SConscript +++ /dev/null @@ -1,169 +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 platform -import sys - -Import('env') - -if sys.platform == 'win32': - # HACK: This works around a bug in SCons. - # subprocess.check_output will complain unless all environment - # variables are strings. - system_root = env['ENV']['SystemRoot'] - env['ENV']['SystemRoot'] = str(system_root) - - -# libs needed for embedding -ELIBS=env['LIBS'] + env['PYTHONLIBS'] - -def BPLTest(env, name, sources = None, deps = None): - run = env.BoostRunPythonScript(name + '.py') - if sources: - for source in sources: - Depends(run, - env.PythonExtension(source != name and source or (source + '_ext'), source + '.cpp') - ) - else: - Depends(run, env.PythonExtension(name + '_ext', name + '.cpp')) - if deps: - Depends(run, deps) - return run - -env.AddMethod(BPLTest) - -env.AppendENVPath('PYTHONPATH', Dir('.').path) - -tests=[] -tests+=env.BPLTest('crossmod_exception', ['crossmod_exception_a', 'crossmod_exception_b']) - -for test in [('injected',), - ('properties',), - ('return_arg',), - ('staticmethod',), - ('boost_shared_ptr',), - ('enable_shared_from_this',), - ('andreas_beyer',), - ('polymorphism',), - ('polymorphism2',), - ('wrapper_held_type',), - ('minimal',), - ('args',), - ('raw_ctor',), - ('exception_translator',), - ('test_enum', ['enum_ext']), - ('test_cltree', ['cltree']), - ('newtest', ['m1', 'm2']), - ('const_argument',), - ('keywords_test', ['keywords']), - ('test_pointer_adoption',), - ('operators',), - ('operators_wrapper',), - ('callbacks',), - ('defaults',), - ('object',), - ('list',), - ('long',), - ('dict',), - ('tuple',), - ('str',), - ('slice',), - ('virtual_functions',), - ('back_reference',), - ('implicit',), - ('data_members',), - ('ben_scott1',), - ('bienstman1',), - ('bienstman2',), - ('bienstman3',), - ('multi_arg_constructor',), - ('iterator', ['iterator', 'input_iterator']), - ('stl_iterator',), - ('extract',), - ('crossmod_opaque', ['crossmod_opaque_a', 'crossmod_opaque_b']), - ('opaque',), -# ('voidptr',), - ('pickle1',), - ('pickle2',), - ('pickle3',), - ('pickle4',), - ('nested',), - ('docstring',), - ('pytype_function',), - ('vector_indexing_suite',), - ('pointer_vector',)]: - tests+=env.BPLTest(*test) - -if env['CXX11']: - for test in [ - ('shared_ptr',), - ]: - tests+=env.BPLTest(*test) -else: - for test in [ - ('polymorphism2_auto_ptr',), - ('auto_ptr',), - ]: - tests+=env.BPLTest(*test) - - -test = env.BoostRunPythonScript('test_builtin_converters.py') -Depends( - test, - env.PythonExtension('builtin_converters_ext', ['builtin_converters.cpp']) - ) -tests+=test -test = env.BoostRunPythonScript('map_indexing_suite.py') -Depends( - test, - env.PythonExtension('map_indexing_suite_ext', [ - 'map_indexing_suite.cpp', - 'int_map_indexing_suite.cpp', - 'a_map_indexing_suite.cpp']) - ) -tests+=test - -tests+=env.BoostRunTest('import_', 'import_.cpp', '${SOURCES[0]} ${SOURCES[1]}', 'import_.py', LIBS=ELIBS) - -tests+=env.BoostCompileTest('indirect_traits_test') -tests+=env.BoostRunTests(['destroy_test', - 'pointer_type_id_test', - 'bases', - 'if_else', - 'pointee', - 'result'], LIBS=ELIBS) - -tests+=env.BoostCompileTests(['string_literal', - 'borrowed', - 'object_manager', - 'copy_ctor_mutates_rhs']) - -tests+=env.BoostRunTest('upcast', LIBS=ELIBS) -tests+=env.BoostCompileTest('select_holder') -tests+=env.BoostRunTest('select_from_python_test', LIBS=ELIBS) -tests+=env.BoostCompileTest('select_arg_to_python_test') - -if platform.system() == 'Windows': - tests+=env.BPLTest('calling_conventions') - tests+=env.BPLTest('calling_conventions_mf') - -if env['NUMPY']: - numpy_env = env.Clone() - numpy_env.BoostUseLib('numpy') - for test in [('numpy/dtype',), - ('numpy/ufunc',), - ('numpy/templates',), - ('numpy/ndarray',), - ('numpy/indexing',), - ('numpy/shapes',),]: - tests+=numpy_env.BPLTest(*test) - - -env.BoostTestSummary(tests) -AlwaysBuild(tests) From 429ac28c4a7e4a3a1207369dda2c1b1396cc5df2 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 7 Mar 2018 11:56:20 -0500 Subject: [PATCH 09/10] Streamline CI logic. --- .appveyor.yml | 4 ++-- .travis.yml | 40 +++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 714a51bd..4993cdc8 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -72,9 +72,9 @@ install: # pip will build them from source using the MSVC compiler matching the # target Python version and architecture - | - curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/release/0.2.tar.gz + 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-release-0.2 + CD faber-snapshot-2018-03-07 python setup.py install CD .. # report the available MSVC compilers diff --git a/.travis.yml b/.travis.yml index cd11fd0a..af460c39 100644 --- a/.travis.yml +++ b/.travis.yml @@ -63,14 +63,13 @@ 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 @@ -78,26 +77,33 @@ install: dist/bin/bcp python tools/boostbook tools/quickbook $HOME/Boost &> /dev/null rm -rf $HOME/Boost/boost/python* popd - # 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 + 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: - sed -e "s/\$PYTHON/$PYTHON/g" .ci/faber > ~/.faber - $PYTHON --version - faber -h +- ls -l $HOME/Boost script: -- faber --with-boost-include=$HOME/Boost --builddir=build test.report cxx.name=$CXX cxxflags=$CXXFLAGS -- if [ "$DOC" ]; then BOOST_ROOT=$HOME/Boost faber --builddir=build doc.html; 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. From 9039286937218f4e5f987ccc5f0f1683c669dad4 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 7 Mar 2018 16:53:05 -0500 Subject: [PATCH 10/10] Remove references to scons from README. --- README.md | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 373d4e87..c692bb8a 100644 --- a/README.md +++ b/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.