From 8328a4f53539483c630a0fcb115f8b7f224308b0 Mon Sep 17 00:00:00 2001 From: Thomas Kent Date: Sun, 13 Dec 2020 08:00:54 -0600 Subject: [PATCH 01/14] New VS2019 version on appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index ffcd7e3b..7f4fd2bc 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -30,7 +30,7 @@ environment: PYTHON: C:\\Python36-x64 PYTHON_VERSION: 3.6.x PYTHON_ARCH: 64 - MSVC: 16.7.4 + MSVC: 16.8.1 ARCH: x86_64 BOOST_PREFIX: C:\Libraries\boost_1_73_0 From c9521a8ef547ee220cb2a55b285c8f361853a058 Mon Sep 17 00:00:00 2001 From: Thomas Kent Date: Fri, 18 Dec 2020 05:52:03 -0600 Subject: [PATCH 02/14] Updated VS2019 to 16.8.3 --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 7f4fd2bc..8c229c2b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -30,7 +30,7 @@ environment: PYTHON: C:\\Python36-x64 PYTHON_VERSION: 3.6.x PYTHON_ARCH: 64 - MSVC: 16.8.1 + MSVC: 16.8.3 ARCH: x86_64 BOOST_PREFIX: C:\Libraries\boost_1_73_0 From 97a8550a9fbd742fdf4be3def21c695626333c85 Mon Sep 17 00:00:00 2001 From: Tom Kent Date: Tue, 22 Dec 2020 15:56:09 -0600 Subject: [PATCH 03/14] Using docker images to execut the github actions for testing (#335) Introduce github action-based test workflow for Ubuntu. --- .github/workflows/build_test_docker.yml | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 .github/workflows/build_test_docker.yml diff --git a/.github/workflows/build_test_docker.yml b/.github/workflows/build_test_docker.yml new file mode 100644 index 00000000..23550cfa --- /dev/null +++ b/.github/workflows/build_test_docker.yml @@ -0,0 +1,47 @@ +name: Build and Test - Linux Docker + +on: [ push, pull_request ] + +jobs: + build: + + # ubuntu-latest will be shortly upgrading to this + runs-on: ubuntu-20.04 + + strategy: + fail-fast: false + matrix: + python: [ python, python3 ] + cxx: [ g++, clang++ ] + std: [ c++98, c++11] + include: + # Add the appropriate docker image for each compiler. + # The images from teeks99/boost-python-test already have boost::python + # pre-reqs installed, see: + # https://github.com/teeks99/boost-python-test-docker + - cxx: clang++ + docker-img: teeks99/boost-python-test:clang-11_1.66.0 + - cxx: g++ + docker-img: teeks99/boost-python-test:gcc-9_1.66.0 + + container: + image: ${{ matrix.docker-img }} + + steps: + - uses: actions/checkout@v2 + + - name: Test + run: | + ${{ matrix.python }} --version + ${{ matrix.cxx }} --version + faber -v + ls -l ${BOOST_PY_DEPS} + + sed -e "s/\$PYTHON/${{ matrix.python }}/g" .ci/faber > ~/.faber + + faber \ + --with-boost-include=${BOOST_PY_DEPS} \ + --builddir=build test.report \ + cxx.name=${{ matrix.cxx }} \ + cxxflags=-std=${{ matrix.std }} \ + -j`nproc` From 3dd6bcf39f4bb6dd51dc87255e6c055253fb122d Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 23 Dec 2020 19:22:22 -0500 Subject: [PATCH 04/14] Add OSX tests. --- .github/workflows/test-osx.yml | 45 +++++++++++++++++++ ...{build_test_docker.yml => test-ubuntu.yml} | 30 +++++++------ 2 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/test-osx.yml rename .github/workflows/{build_test_docker.yml => test-ubuntu.yml} (66%) diff --git a/.github/workflows/test-osx.yml b/.github/workflows/test-osx.yml new file mode 100644 index 00000000..19928d87 --- /dev/null +++ b/.github/workflows/test-osx.yml @@ -0,0 +1,45 @@ +name: Test OSX + +on: [push, pull_request] + +jobs: + build: + runs-on: macOS-latest + + strategy: + fail-fast: false + matrix: + python-version: [3.6] + cxx: [clang++] + std: [c++98, c++11, c++14] # TODO: c++17 is failing ! + + steps: + - uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: setup prerequisites + run: | + brew install boost + python -m pip install --upgrade pip + python -m pip install setuptools faber + - name: build + run: | + python --version + ${{ matrix.cxx }} --version + faber -v + sed -e "s/\$PYTHON/python/g" .ci/faber > ~/.faber + faber \ + --builddir=build \ + cxx.name=${{ matrix.cxx }} \ + cxxflags=-std=${{ matrix.std }} \ + -j`sysctl -n hw.ncpu` + - name: test + run: | + faber \ + --builddir=build\ + cxx.name=${{ matrix.cxx }} \ + cxxflags=-std=${{ matrix.std }} \ + -j`sysctl -n hw.ncpu` \ + test.report diff --git a/.github/workflows/build_test_docker.yml b/.github/workflows/test-ubuntu.yml similarity index 66% rename from .github/workflows/build_test_docker.yml rename to .github/workflows/test-ubuntu.yml index 23550cfa..61a29598 100644 --- a/.github/workflows/build_test_docker.yml +++ b/.github/workflows/test-ubuntu.yml @@ -1,19 +1,17 @@ -name: Build and Test - Linux Docker +name: Test Ubuntu -on: [ push, pull_request ] +on: [push, pull_request] jobs: build: - - # ubuntu-latest will be shortly upgrading to this - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: - python: [ python, python3 ] - cxx: [ g++, clang++ ] - std: [ c++98, c++11] + python: [python, python3] + cxx: [g++, clang++] + std: [c++98, c++11, c++14, c++17] include: # Add the appropriate docker image for each compiler. # The images from teeks99/boost-python-test already have boost::python @@ -30,18 +28,24 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Test + - name: build run: | ${{ matrix.python }} --version ${{ matrix.cxx }} --version faber -v - ls -l ${BOOST_PY_DEPS} - sed -e "s/\$PYTHON/${{ matrix.python }}/g" .ci/faber > ~/.faber - faber \ --with-boost-include=${BOOST_PY_DEPS} \ - --builddir=build test.report \ + --builddir=build \ cxx.name=${{ matrix.cxx }} \ cxxflags=-std=${{ matrix.std }} \ -j`nproc` + - name: test + run: | + faber \ + --with-boost-include=${BOOST_PY_DEPS} \ + --builddir=build \ + cxx.name=${{ matrix.cxx }} \ + cxxflags=-std=${{ matrix.std }} \ + -j`nproc` \ + test.report From 108c93f7c3b5437ea8551c01b0205076e2bf6de0 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Wed, 23 Dec 2020 23:36:14 -0500 Subject: [PATCH 05/14] Deploy documentation via github actions. --- .ci/faber | 4 +++ .github/workflows/deploy-documentation.yml | 37 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 .github/workflows/deploy-documentation.yml diff --git a/.ci/faber b/.ci/faber index b23e8a18..ddb36ddf 100644 --- a/.ci/faber +++ b/.ci/faber @@ -1,3 +1,7 @@ +# -*- python -*- + +from faber.tools.boost import boostbook from faber.tools.python import python +bb = boostbook(prefix='/usr/share/boostbook') p = python(command='$PYTHON') diff --git a/.github/workflows/deploy-documentation.yml b/.github/workflows/deploy-documentation.yml new file mode 100644 index 00000000..83a0f089 --- /dev/null +++ b/.github/workflows/deploy-documentation.yml @@ -0,0 +1,37 @@ +name: deploy documentation + +on: [push, pull_request] + +jobs: + deploy: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: setup + run: | + sudo apt-get update + sudo apt-get install \ + libboost1.71-tools-dev \ + python3 \ + python3-numpy \ + python3-sphinx \ + xsltproc \ + docbook-xsl + sudo python3 -m pip install --upgrade pip + sudo python3 -m pip install faber + - name: build + run: | + sed -e "s/\$PYTHON/python3/g" .ci/faber > ~/.faber + faber --builddir=build doc.html + if [ "${GITHUB_REF##*/}" == master ]; then + echo "destination_dir=doc/html" >> $GITHUB_ENV + else + echo "destination_dir=doc/develop/html" >> $GITHUB_ENV + fi + - name: deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: build/doc/html + destination_dir: ${{ env.destination_dir }} + keep_files: true From 5e4f6278e01f018c32cebc4ffc3b75a743fb1042 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Sat, 26 Dec 2020 13:56:45 -0500 Subject: [PATCH 06/14] Remove travis-ci logic. --- .ci/upload_docs.sh | 58 ---------------------- .travis.yml | 117 --------------------------------------------- README.md | 2 +- 3 files changed, 1 insertion(+), 176 deletions(-) delete mode 100755 .ci/upload_docs.sh delete mode 100644 .travis.yml diff --git a/.ci/upload_docs.sh b/.ci/upload_docs.sh deleted file mode 100755 index 1e6f6b5c..00000000 --- a/.ci/upload_docs.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -set -e # Exit with nonzero exit code if anything fails - -SOURCE_BRANCH="master" -TARGET_BRANCH="gh-pages" - -# Pull requests and commits to other branches shouldn't try to deploy, just build to verify -if [ "$TRAVIS_PULL_REQUEST" != "false" ] || \ - [ "$TRAVIS_BRANCH" != master -a \ - "$TRAVIS_BRANCH" != develop -a \ - "$TRAVIS_BRANCH" != travis ]; then - echo "No docs to upload." - exit 0 -fi - -if [ -z "$GH_TOKEN" ]; then - echo "Error: GH_TOKEN is undefined" - exit 1 -fi - -# Save some useful information -REPO=`git config remote.origin.url` -SHA=`git rev-parse --verify HEAD` - -# 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 build -git init -git config user.name "Travis CI" -git config user.email "travis-ci" - -# Make sure 'GH_TOKEN' is set (as 'secure' variable) in .travis.yml -git remote add upstream "https://$GH_TOKEN@github.com/boostorg/python.git" -git fetch upstream -git reset upstream/gh-pages - -# Prepare version. -if [ "$TRAVIS_BRANCH" = develop -o "$TRAVIS_BRANCH" = travis ]; then - mkdir -p develop/doc/ - cp ../index.html develop/ - cp ../doc/index.html develop/doc/ - cp -a doc/html develop/doc/ - git add develop/index.html - git add develop/doc/index.html - git add -A develop/doc/html -else - cp ../index.html . - cp ../doc/index.html doc/ - git add index.html - git add doc/index.html - git add -A doc/html -fi -# Commit the new version. -git commit -m "Deploy to GitHub Pages: ${SHA}" - -# Now that we're all set up, we can push. -git push -q upstream HEAD:gh-pages diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 657386bb..00000000 --- a/.travis.yml +++ /dev/null @@ -1,117 +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) - -dist: bionic - -language: cpp - -env: - global: - - secure: BRNUkxN3p8f+uYKWC3Hr0VPqZA0PxbWr1DJlcI4hbiZtzKhMCWjDmd9UW9CzzexqeOxpd+9s0G87qvOur+wMSVxugDxtTesZrh1czXHeSVxgQrYD783XJtQJ9aYypbChkiboRD6Xpmbq7itwMuHBJMFtCuDxMynpU1jWwkyTf2Y= - -jobs: - include: - - os: linux - env: CXX=g++ PYTHON=python CXXFLAGS=-std=c++98 - - os: linux - env: CXX=g++ PYTHON=python CXXFLAGS=-std=c++11 - - os: linux - env: CXX=g++ PYTHON=python3 CXXFLAGS=-std=c++98 - - os: linux - env: CXX=g++ PYTHON=python3 CXXFLAGS=-std=c++11 - - os: linux - env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++98 - - os: linux - env: CXX=clang++ PYTHON=python3 CXXFLAGS=-std=c++11 - - os: linux - env: CXX=g++ PYTHON=pypy3 CXXFLAGS=-std=c++11 - - os: osx - env: CXX=clang++ PYTHON=python CXXFLAGS=-std=c++11 - - env: PYTHON=python DOC=1 - allow_failures: - - os: linux - env: CXX=g++ PYTHON=pypy3 CXXFLAGS=-std=c++11 - - os: osx - -addons: - apt: - sources: - - ubuntu-toolchain-r-test - - pypy - packages: - - gcc - - g++ - - clang - - pypy3-dev - - python3-pip - - python-numpy - - python-sphinx - - python3-dev - - python3-numpy - - libboost-all-dev - - xsltproc - - docbook-xsl - - python-docutils - - -cache: - directories: - - $HOME/Boost - -install: - # Install our own version of Boost (the subset we need) as the system version is - # too old (for C++11 support). - - | - 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_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. - python3 -m pip install setuptools - python3 -m pip install faber - #date=2020-08-01 - #wget https://github.com/stefanseefeld/faber/archive/snapshot/$date.tar.gz - #tar xf $date.tar.gz - #pushd faber-snapshot-$date - #sudo python3 setup.py install - #popd - -before_script: -- sed -e "s/\$PYTHON/$PYTHON/g" .ci/faber > ~/.faber -- $PYTHON --version -- faber -h -- ls -l $HOME/Boost - -script: -- | - 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 -j8 - fi - -after_success: -# Upload docs only when building upstream. -- | - if [ "$DOC" -a \ - "$TRAVIS_REPO_SLUG" = "boostorg/python" -a \ - "$TRAVIS_PULL_REQUEST" = "false" ]; then - export GH_TOKEN - .ci/upload_docs.sh - fi diff --git a/README.md b/README.md index 7646d3a8..61f9b24e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ See the [Boost.Python](http://boostorg.github.io/python) documentation for detai **Hint :** Check out the [development version](http://boostorg.github.io/python/develop) of the documentation to see work in progress. -# Building [![Build Status](https://travis-ci.org/boostorg/python.svg?branch=develop)](https://travis-ci.org/boostorg/python) [![Build status](https://ci.appveyor.com/api/projects/status/cgx9xma6v3gjav92/branch/develop?svg=true)](https://ci.appveyor.com/project/stefanseefeld/python/branch/develop) +# Building ![Test Ubuntu](https://github.com/boostorg/python/workflows/Test%20Ubuntu/badge.svg) ![Test OSX](https://github.com/boostorg/python/workflows/Test%20OSX/badge.svg) [![Build status](https://ci.appveyor.com/api/projects/status/cgx9xma6v3gjav92/branch/develop?svg=true)](https://ci.appveyor.com/project/stefanseefeld/python/branch/develop) While Boost.Python is part of the Boost C++ Libraries super-project, and thus can be compiled as part of Boost, it can also be compiled and installed stand-alone, i.e. against a pre-installed Boost package. From cd953cff06bfaca086648795e1cbed260b00a156 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Fri, 25 Dec 2020 15:42:48 -0500 Subject: [PATCH 07/14] Replace appveyor by github actions. --- .appveyor.yml | 111 -------------- .ci/install.ps1 | 229 ----------------------------- .ci/run_with_env.cmd | 88 ----------- .github/workflows/test-windows.yml | 39 +++++ README.md | 3 +- 5 files changed, 40 insertions(+), 430 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .ci/install.ps1 delete mode 100644 .ci/run_with_env.cmd create mode 100644 .github/workflows/test-windows.yml diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 8c229c2b..00000000 --- a/.appveyor.yml +++ /dev/null @@ -1,111 +0,0 @@ -environment: - global: - # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the - # /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" - - matrix: - - # Pre-installed Python versions, which Appveyor may upgrade to - # a later point release. - # See: http://www.appveyor.com/docs/installed-software#python - - - PYTHON: C:\\Python36-x64 - PYTHON_VERSION: 3.6.x - PYTHON_ARCH: 64 - MSVC: 12.0 - ARCH: x86_64 - BOOST_PREFIX: C:\Libraries\boost_1_66_0 - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - PYTHON: C:\\Python36-x64 - PYTHON_VERSION: 3.6.x - PYTHON_ARCH: 64 - MSVC: 15.9.19 - ARCH: x86_64 - BOOST_PREFIX: C:\Libraries\boost_1_69_0 - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - PYTHON: C:\\Python36-x64 - PYTHON_VERSION: 3.6.x - PYTHON_ARCH: 64 - MSVC: 16.8.3 - ARCH: x86_64 - BOOST_PREFIX: C:\Libraries\boost_1_73_0 - -install: - # If there is a newer build queued for the same PR, cancel this one. - # The AppVeyor 'rollout builds' option is supposed to serve the same - # purpose but it is problematic because it tends to cancel builds pushed - # directly to master instead of just PR builds (or the converse). - # credits: JuliaLang developers. - - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod ` - https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | ` - Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { ` - throw "There are newer queued builds for this pull request, failing early." } - - ECHO "Filesystem root:" - - ps: "ls \"C:/\"" - - ECHO "Installed libraries:" - - ps: "ls \"C:/Libraries/\"" - ## This path doesn't exist with the VS 2017 worker images - #- ECHO "Installed SDKs:" - #- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\"" - - # Install Python (from the official .msi of http://python.org) and pip when - # not already installed. - - ps: if (-not(Test-Path($env:PYTHON))) { & .ci\install.ps1 } - - # Prepend newly installed Python to the PATH of this build (this cannot be - # done from inside the powershell script as it would require to restart - # the parent CMD process). - - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" - - # Check that we have the expected version and architecture for Python - - "python --version" - - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" - - # Upgrade to the latest version of pip to avoid it displaying warnings - # about it being out of date. - - "python -m pip install --disable-pip-version-check --user --upgrade pip" - - # Install the build dependencies of the project. If some dependencies contain - # 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 - - - curl -LfsS -o vswhere.exe https://github.com/Microsoft/vswhere/releases/download/2.8.4/vswhere.exe - #- | - # curl -LfsS -o faber.tar.gz https://github.com/stefanseefeld/faber/archive/snapshot/2020-08-01.tar.gz - # tar xf faber.tar.gz - # CD faber-snapshot-2020-08-01 - # python setup.py install - # CD .. - - python -m pip install faber - # report the available MSVC compilers - - faber --log=tools --info=tools cxx - - easy_install sphinx - - python -m pip install numpy - - set FARGS=--log=summary --log=output --log=actions --log=commands --with-boost-include=%BOOST_PREFIX% target.arch=%ARCH% cxx.name=msvc cxx.version=%MSVC% - -build_script: - - faber %FARGS% config || type config.log - - faber %FARGS% -j8 - -test_script: - - faber %FARGS% -j8 test.report - -after_test: - # If tests are successful, create binary packages for the project. - #- "%CMD_IN_ENV% python setup.py bdist_wheel" - #- "%CMD_IN_ENV% python setup.py bdist_wininst" - #- "%CMD_IN_ENV% python setup.py bdist_msi" - #- ps: "ls dist" - -#artifacts: - # Archive the generated packages in the ci.appveyor.com build report. - #- path: dist\* - -#on_success: -# - TODO: upload the content of dist/*.whl to a public wheelhouse -# diff --git a/.ci/install.ps1 b/.ci/install.ps1 deleted file mode 100644 index 94d6f018..00000000 --- a/.ci/install.ps1 +++ /dev/null @@ -1,229 +0,0 @@ -# Sample script to install Python and pip under Windows -# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer -# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ - -$MINICONDA_URL = "http://repo.continuum.io/miniconda/" -$BASE_URL = "https://www.python.org/ftp/python/" -$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" -$GET_PIP_PATH = "C:\get-pip.py" - -$PYTHON_PRERELEASE_REGEX = @" -(?x) -(?\d+) -\. -(?\d+) -\. -(?\d+) -(?[a-z]{1,2}\d+) -"@ - - -function Download ($filename, $url) { - $webclient = New-Object System.Net.WebClient - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 3 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 2 - for ($i = 0; $i -lt $retry_attempts; $i++) { - try { - $webclient.DownloadFile($url, $filepath) - break - } - Catch [Exception]{ - Start-Sleep 1 - } - } - if (Test-Path $filepath) { - Write-Host "File saved at" $filepath - } else { - # Retry once to get the error message if any at the last try - $webclient.DownloadFile($url, $filepath) - } - return $filepath -} - - -function ParsePythonVersion ($python_version) { - if ($python_version -match $PYTHON_PRERELEASE_REGEX) { - return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, - $matches.prerelease) - } - $version_obj = [version]$python_version - return ($version_obj.major, $version_obj.minor, $version_obj.build, "") -} - - -function DownloadPython ($python_version, $platform_suffix) { - $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version - - if (($major -le 2 -and $micro -eq 0) ` - -or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) ` - ) { - $dir = "$major.$minor" - $python_version = "$major.$minor$prerelease" - } else { - $dir = "$major.$minor.$micro" - } - - if ($prerelease) { - if (($major -le 2) ` - -or ($major -eq 3 -and $minor -eq 1) ` - -or ($major -eq 3 -and $minor -eq 2) ` - -or ($major -eq 3 -and $minor -eq 3) ` - ) { - $dir = "$dir/prev" - } - } - - if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) { - $ext = "msi" - if ($platform_suffix) { - $platform_suffix = ".$platform_suffix" - } - } else { - $ext = "exe" - if ($platform_suffix) { - $platform_suffix = "-$platform_suffix" - } - } - - $filename = "python-$python_version$platform_suffix.$ext" - $url = "$BASE_URL$dir/$filename" - $filepath = Download $filename $url - return $filepath -} - - -function InstallPython ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "" - } else { - $platform_suffix = "amd64" - } - $installer_path = DownloadPython $python_version $platform_suffix - $installer_ext = [System.IO.Path]::GetExtension($installer_path) - Write-Host "Installing $installer_path to $python_home" - $install_log = $python_home + ".log" - if ($installer_ext -eq '.msi') { - InstallPythonMSI $installer_path $python_home $install_log - } else { - InstallPythonEXE $installer_path $python_home $install_log - } - if (Test-Path $python_home) { - Write-Host "Python $python_version ($architecture) installation complete" - } else { - Write-Host "Failed to install Python in $python_home" - Get-Content -Path $install_log - Exit 1 - } -} - - -function InstallPythonEXE ($exepath, $python_home, $install_log) { - $install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home" - RunCommand $exepath $install_args -} - - -function InstallPythonMSI ($msipath, $python_home, $install_log) { - $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home" - $uninstall_args = "/qn /x $msipath" - RunCommand "msiexec.exe" $install_args - if (-not(Test-Path $python_home)) { - Write-Host "Python seems to be installed else-where, reinstalling." - RunCommand "msiexec.exe" $uninstall_args - RunCommand "msiexec.exe" $install_args - } -} - -function RunCommand ($command, $command_args) { - Write-Host $command $command_args - Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru -} - - -function InstallPip ($python_home) { - $pip_path = $python_home + "\Scripts\pip.exe" - $python_path = $python_home + "\python.exe" - if (-not(Test-Path $pip_path)) { - Write-Host "Installing pip..." - $webclient = New-Object System.Net.WebClient - $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) - Write-Host "Executing:" $python_path $GET_PIP_PATH - & $python_path $GET_PIP_PATH - } else { - Write-Host "pip already installed." - } -} - - -function DownloadMiniconda ($python_version, $platform_suffix) { - if ($python_version -eq "3.4") { - $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe" - } else { - $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe" - } - $url = $MINICONDA_URL + $filename - $filepath = Download $filename $url - return $filepath -} - - -function InstallMiniconda ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "x86" - } else { - $platform_suffix = "x86_64" - } - $filepath = DownloadMiniconda $python_version $platform_suffix - Write-Host "Installing" $filepath "to" $python_home - $install_log = $python_home + ".log" - $args = "/S /D=$python_home" - Write-Host $filepath $args - Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru - if (Test-Path $python_home) { - Write-Host "Python $python_version ($architecture) installation complete" - } else { - Write-Host "Failed to install Python in $python_home" - Get-Content -Path $install_log - Exit 1 - } -} - - -function InstallMinicondaPip ($python_home) { - $pip_path = $python_home + "\Scripts\pip.exe" - $conda_path = $python_home + "\Scripts\conda.exe" - if (-not(Test-Path $pip_path)) { - Write-Host "Installing pip..." - $args = "install --yes pip" - Write-Host $conda_path $args - Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru - } else { - Write-Host "pip already installed." - } -} - -function main () { - InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON - InstallPip $env:PYTHON -} - -main \ No newline at end of file diff --git a/.ci/run_with_env.cmd b/.ci/run_with_env.cmd deleted file mode 100644 index 5da547c4..00000000 --- a/.ci/run_with_env.cmd +++ /dev/null @@ -1,88 +0,0 @@ -:: To build extensions for 64 bit Python 3, we need to configure environment -:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1) -:: -:: To build extensions for 64 bit Python 2, we need to configure environment -:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0) -:: -:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific -:: environment configurations. -:: -:: Note: this script needs to be run with the /E:ON and /V:ON flags for the -:: cmd interpreter, at least for (SDK v7.0) -:: -:: More details at: -:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows -:: http://stackoverflow.com/a/13751649/163740 -:: -:: Author: Olivier Grisel -:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ -:: -:: Notes about batch files for Python people: -:: -:: Quotes in values are literally part of the values: -:: SET FOO="bar" -:: FOO is now five characters long: " b a r " -:: If you don't want quotes, don't include them on the right-hand side. -:: -:: The CALL lines at the end of this file look redundant, but if you move them -:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y -:: case, I don't know why. -@ECHO OFF - -SET COMMAND_TO_RUN=%* -SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows -SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf - -:: Extract the major and minor versions, and allow for the minor version to be -:: more than 9. This requires the version number to have two dots in it. -SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1% -IF "%PYTHON_VERSION:~3,1%" == "." ( - SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1% -) ELSE ( - SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2% -) - -:: Based on the Python version, determine what SDK version to use, and whether -:: to set the SDK for 64-bit. -IF %MAJOR_PYTHON_VERSION% == 2 ( - SET WINDOWS_SDK_VERSION="v7.0" - SET SET_SDK_64=Y -) ELSE ( - IF %MAJOR_PYTHON_VERSION% == 3 ( - SET WINDOWS_SDK_VERSION="v7.1" - IF %MINOR_PYTHON_VERSION% LEQ 4 ( - SET SET_SDK_64=Y - ) ELSE ( - SET SET_SDK_64=N - IF EXIST "%WIN_WDK%" ( - :: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/ - REN "%WIN_WDK%" 0wdf - ) - ) - ) ELSE ( - ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" - EXIT 1 - ) -) - -IF %PYTHON_ARCH% == 64 ( - IF %SET_SDK_64% == Y ( - ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture - SET DISTUTILS_USE_SDK=1 - SET MSSdk=1 - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 - ) ELSE ( - ECHO Using default MSVC build environment for 64 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 - ) -) ELSE ( - ECHO Using default MSVC build environment for 32 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT 1 -) diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml new file mode 100644 index 00000000..4d5878ea --- /dev/null +++ b/.github/workflows/test-windows.yml @@ -0,0 +1,39 @@ +name: Test Windows + +on: [push, pull_request] + +jobs: + build: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + python-version: [3.7] + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: setup boost prerequisites + uses: lukka/run-vcpkg@v6 + with: + vcpkgGitCommitId: '8a9a97315aefb3f8bc5d81bf66ca0025938b9c91' + vcpkgDirectory: '${{ runner.workspace }}/vcpkg' + vcpkgTriplet: x64-windows + vcpkgArguments: boost-config boost-core boost-function boost-graph boost-iterator boost-lexical-cast boost-mpl boost-preprocessor boost-smart-ptr boost-static-assert + + - name: setup faber + #shell: 'bash' + run: | + python -m pip install --upgrade pip + python -m pip install setuptools faber numpy + faber --info=tools cxx + - name: build + shell: cmd + run: | + faber --builddir=build cxx.name=msvc --with-boost-include=${{ runner.workspace }}/vcpkg/installed/x64-windows/include -j4 + - name: test + shell: cmd + run: | + faber --builddir=build cxx.name=msvc --with-boost-include=${{ runner.workspace }}/vcpkg/installed/x64-windows/include -j4 test.report diff --git a/README.md b/README.md index 61f9b24e..f57b9750 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,7 @@ See the [Boost.Python](http://boostorg.github.io/python) documentation for detai **Hint :** Check out the [development version](http://boostorg.github.io/python/develop) of the documentation to see work in progress. -# Building ![Test Ubuntu](https://github.com/boostorg/python/workflows/Test%20Ubuntu/badge.svg) ![Test OSX](https://github.com/boostorg/python/workflows/Test%20OSX/badge.svg) [![Build status](https://ci.appveyor.com/api/projects/status/cgx9xma6v3gjav92/branch/develop?svg=true)](https://ci.appveyor.com/project/stefanseefeld/python/branch/develop) - +# Building ![Test Ubuntu](https://github.com/boostorg/python/workflows/Test%20Ubuntu/badge.svg) ![Test OSX](https://github.com/boostorg/python/workflows/Test%20OSX/badge.svg) ![Test Windows](https://github.com/boostorg/python/workflows/Test%20Windows/badge.svg) While Boost.Python is part of the Boost C++ Libraries super-project, and thus can be compiled as part of Boost, it can also be compiled and installed stand-alone, i.e. against a pre-installed Boost package. From 500194edb7833d0627ce7a2595fec49d0aae2484 Mon Sep 17 00:00:00 2001 From: Stefan Seefeld Date: Fri, 13 Nov 2020 21:17:24 -0500 Subject: [PATCH 08/14] Fix Python 3.10 (PEP-620) incompatibility. --- include/boost/python/detail/wrap_python.hpp | 4 ++++ include/boost/python/object/make_instance.hpp | 2 +- src/object/class.cpp | 15 +++++---------- src/object/enum.cpp | 2 +- src/object/function.cpp | 2 +- src/object/life_support.cpp | 2 +- 6 files changed, 13 insertions(+), 14 deletions(-) diff --git a/include/boost/python/detail/wrap_python.hpp b/include/boost/python/detail/wrap_python.hpp index 9d5f5422..037e4bf2 100644 --- a/include/boost/python/detail/wrap_python.hpp +++ b/include/boost/python/detail/wrap_python.hpp @@ -227,7 +227,11 @@ typedef int pid_t; # define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, +#endif +#if PY_VERSION_HEX < 0x030900A4 +# define Py_SET_TYPE(obj, type) ((Py_TYPE(obj) = (type)), (void)0) +# define Py_SET_SIZE(obj, size) ((Py_SIZE(obj) = (size)), (void)0) #endif diff --git a/include/boost/python/object/make_instance.hpp b/include/boost/python/object/make_instance.hpp index 31ec08f7..5eb3aa9d 100644 --- a/include/boost/python/object/make_instance.hpp +++ b/include/boost/python/object/make_instance.hpp @@ -47,7 +47,7 @@ struct make_instance_impl // Note the position of the internally-stored Holder, // for the sake of destruction - Py_SIZE(instance) = offsetof(instance_t, storage); + Py_SET_SIZE(instance, offsetof(instance_t, storage)); // Release ownership of the python object protect.cancel(); diff --git a/src/object/class.cpp b/src/object/class.cpp index 9bb9683a..c6bab760 100644 --- a/src/object/class.cpp +++ b/src/object/class.cpp @@ -208,7 +208,7 @@ namespace objects { if (static_data_object.tp_dict == 0) { - Py_TYPE(&static_data_object) = &PyType_Type; + Py_SET_TYPE(&static_data_object, &PyType_Type); static_data_object.tp_base = &PyProperty_Type; if (PyType_Ready(&static_data_object)) return 0; @@ -316,7 +316,7 @@ namespace objects { if (class_metatype_object.tp_dict == 0) { - Py_TYPE(&class_metatype_object) = &PyType_Type; + Py_SET_TYPE(&class_metatype_object, &PyType_Type); class_metatype_object.tp_base = &PyType_Type; if (PyType_Ready(&class_metatype_object)) return type_handle(); @@ -374,12 +374,7 @@ namespace objects // like, so we'll store the total size of the object // there. A negative number indicates that the extra // instance memory is not yet allocated to any holders. -#if PY_VERSION_HEX >= 0x02060000 - Py_SIZE(result) = -#else - result->ob_size = -#endif - -(static_cast(offsetof(instance<>,storage) + instance_size)); + Py_SET_SIZE(result,-static_cast(offsetof(instance<>,storage) + instance_size)); } return (PyObject*)result; } @@ -470,7 +465,7 @@ namespace objects { if (class_type_object.tp_dict == 0) { - Py_TYPE(&class_type_object) = incref(class_metatype().get()); + Py_SET_TYPE(&class_type_object, incref(class_metatype().get())); class_type_object.tp_base = &PyBaseObject_Type; if (PyType_Ready(&class_type_object)) return type_handle(); @@ -739,7 +734,7 @@ void* instance_holder::allocate(PyObject* self_, std::size_t holder_offset, std: assert(holder_offset >= offsetof(objects::instance<>,storage)); // Record the fact that the storage is occupied, noting where it starts - Py_SIZE(self) = holder_offset; + Py_SET_SIZE(self, holder_offset); return (char*)self + holder_offset; } else diff --git a/src/object/enum.cpp b/src/object/enum.cpp index 10122ad1..293e7058 100644 --- a/src/object/enum.cpp +++ b/src/object/enum.cpp @@ -153,7 +153,7 @@ namespace { if (enum_type_object.tp_dict == 0) { - Py_TYPE(&enum_type_object) = incref(&PyType_Type); + Py_SET_TYPE(&enum_type_object, incref(&PyType_Type)); #if PY_VERSION_HEX >= 0x03000000 enum_type_object.tp_base = &PyLong_Type; #else diff --git a/src/object/function.cpp b/src/object/function.cpp index 9d4745d1..787679e1 100644 --- a/src/object/function.cpp +++ b/src/object/function.cpp @@ -107,7 +107,7 @@ function::function( PyObject* p = this; if (Py_TYPE(&function_type) == 0) { - Py_TYPE(&function_type) = &PyType_Type; + Py_SET_TYPE(&function_type, &PyType_Type); ::PyType_Ready(&function_type); } diff --git a/src/object/life_support.cpp b/src/object/life_support.cpp index b7e9aa86..281c3bff 100644 --- a/src/object/life_support.cpp +++ b/src/object/life_support.cpp @@ -93,7 +93,7 @@ PyObject* make_nurse_and_patient(PyObject* nurse, PyObject* patient) if (Py_TYPE(&life_support_type) == 0) { - Py_TYPE(&life_support_type) = &PyType_Type; + Py_SET_TYPE(&life_support_type, &PyType_Type); PyType_Ready(&life_support_type); } From 30dd3fe8b1c83a1120e1b3f61a17bbd3bc603de9 Mon Sep 17 00:00:00 2001 From: Cedric Schmeits Date: Tue, 20 Oct 2020 15:22:22 +0200 Subject: [PATCH 09/14] added includes for call_method.hpp and def.hpp --- doc/reference/call_method.qbk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/reference/call_method.qbk b/doc/reference/call_method.qbk index 926763ce..e8d22f9f 100644 --- a/doc/reference/call_method.qbk +++ b/doc/reference/call_method.qbk @@ -20,6 +20,8 @@ C++ Module Definition `` #include #include +#include +#include #include #include From 0f1945060f608be68bf8e642503c6f9bdc4fe19c Mon Sep 17 00:00:00 2001 From: Cedric Schmeits Date: Tue, 20 Oct 2020 17:14:01 +0200 Subject: [PATCH 10/14] noncopyable is located in the boost namespace --- doc/reference/call_method.qbk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/reference/call_method.qbk b/doc/reference/call_method.qbk index e8d22f9f..fcf68667 100644 --- a/doc/reference/call_method.qbk +++ b/doc/reference/call_method.qbk @@ -30,7 +30,7 @@ class Base { public: virtual char const* class_name() const { return "Base"; } - virtual ~Base(); + virtual ~Base() {}; }; bool is_base(Base* b) @@ -58,7 +58,7 @@ BOOST_PYTHON_MODULE(my_module) { def("is_base", is_base); - class_("Base") + class_("Base") .def("class_name", &Base_callback::Base_name) ; From cbd2d9f033c61d29d0a1df14951f4ec91e7d05cd Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 6 Jan 2021 10:07:29 +0100 Subject: [PATCH 11/14] Fix compatibility with Python 3.10.0a4: fopen Replace private _Py_fopen() with public fopen(): private _Py_fopen() function was removed in 3.10.0a4: https://bugs.python.org/issue32381 --- src/exec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/exec.cpp b/src/exec.cpp index b2eabe59..dd0c3310 100644 --- a/src/exec.cpp +++ b/src/exec.cpp @@ -116,7 +116,7 @@ object BOOST_PYTHON_DECL exec_file(char const *filename, object global, object l #elif PY_VERSION_HEX >= 0x03000000 // Let python open the file to avoid potential binary incompatibilities. PyObject *fo = Py_BuildValue("s", f); - FILE *fs = _Py_fopen(fo, "r"); // Private CPython API + FILE *fs = fopen(fo, "r"); Py_DECREF(fo); #else // Let python open the file to avoid potential binary incompatibilities. From bffcb99ae7ae99ed41ef6df0e517d2aebdc66811 Mon Sep 17 00:00:00 2001 From: Edward Diener Date: Thu, 21 Jan 2021 00:04:25 -0500 Subject: [PATCH 12/14] [skip ci] Add "cxxstd" json field. The "cxxstd" json field is being added to each Boost library's meta json information for libraries in order to specify the minumum C++ standard compilation level. The value of this field matches one of the values for 'cxxstd' in Boost.Build. The purpose of doing this is to provide information for the Boost website documentation for each library which will specify the minimum C++ standard compilation that an end-user must employ in order to use the particular library. This will aid end-users who want to know if they can successfully use a Boost library based on their C++ compiler's compilation level, without having to search the library's documentation to find this out. --- meta/libraries.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta/libraries.json b/meta/libraries.json index e2f2a054..80f20f84 100644 --- a/meta/libraries.json +++ b/meta/libraries.json @@ -10,5 +10,6 @@ ], "maintainers": [ "Stefan Seefeld " - ] + ], + "cxxstd": "03" } From f7254f5d8ab113908e2ad3721e5122e5c5ef7b89 Mon Sep 17 00:00:00 2001 From: Dmitry Bely Date: Wed, 3 Feb 2021 13:49:32 +0300 Subject: [PATCH 13/14] Add a test case for issue #280 --- test/fabscript | 1 + test/module_init_exception.cpp | 14 ++++++++++++++ test/module_init_exception.py | 12 ++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 test/module_init_exception.cpp create mode 100644 test/module_init_exception.py diff --git a/test/fabscript b/test/fabscript index 03e4c6f9..eb9379e0 100644 --- a/test/fabscript +++ b/test/fabscript @@ -67,6 +67,7 @@ for t in [('injected',), ('args',), ('raw_ctor',), ('exception_translator',), + ('module_init_exception',), ('test_enum', ['enum_ext']), ('test_cltree', ['cltree']), ('newtest', ['m1', 'm2']), diff --git a/test/module_init_exception.cpp b/test/module_init_exception.cpp new file mode 100644 index 00000000..d8cec57d --- /dev/null +++ b/test/module_init_exception.cpp @@ -0,0 +1,14 @@ +// Copyright (C) 2003 Rational Discovery LLC +// 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) + +#include +#include + +using namespace boost::python; + +BOOST_PYTHON_MODULE(module_init_exception_ext) +{ + throw std::runtime_error("Module init failed"); +} diff --git a/test/module_init_exception.py b/test/module_init_exception.py new file mode 100644 index 00000000..3da53e19 --- /dev/null +++ b/test/module_init_exception.py @@ -0,0 +1,12 @@ +# Copyright (C) 2003 Rational Discovery LLC. 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) + +print("running...") + +try: + import module_init_exception_ext +except RuntimeError as e: + print(e) + +print("Done.") From f5d14ef15e98838b3cf18692d46c481287ed50d0 Mon Sep 17 00:00:00 2001 From: Dmitry Bely Date: Wed, 3 Feb 2021 13:52:14 +0300 Subject: [PATCH 14/14] Fix issue #280 --- src/module.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/module.cpp b/src/module.cpp index 96284819..57675fa2 100644 --- a/src/module.cpp +++ b/src/module.cpp @@ -21,7 +21,7 @@ namespace object m_obj(((borrowed_reference_t*)m)); scope current_module(m_obj); - handle_exception(init_function); + if (handle_exception(init_function)) return NULL; } return m;