# -*- coding: utf-8 -*- import os import sys import subprocess from textwrap import dedent import pytest DIR = os.path.abspath(os.path.dirname(__file__)) MAIN_DIR = os.path.dirname(os.path.dirname(DIR)) @pytest.mark.parametrize("parallel", [False, True]) @pytest.mark.parametrize("std", [11, 0]) def test_simple_setup_py(monkeypatch, tmpdir, parallel, std): monkeypatch.chdir(tmpdir) monkeypatch.syspath_prepend(MAIN_DIR) (tmpdir / "setup.py").write_text( dedent( u"""\ import sys sys.path.append({MAIN_DIR!r}) from setuptools import setup, Extension from pybind11.setup_helpers import build_ext, Pybind11Extension std = {std} ext_modules = [ Pybind11Extension( "simple_setup", sorted(["main.cpp"]), cxx_std=std, ), ] cmdclass = dict() if std == 0: cmdclass["build_ext"] = build_ext parallel = {parallel} if parallel: from pybind11.setup_helpers import ParallelCompile ParallelCompile().install() setup( name="simple_setup_package", cmdclass=cmdclass, ext_modules=ext_modules, ) """ ).format(MAIN_DIR=MAIN_DIR, std=std, parallel=parallel), encoding="ascii", ) (tmpdir / "main.cpp").write_text( dedent( u"""\ #include int f(int x) { return x * 3; } PYBIND11_MODULE(simple_setup, m) { m.def("f", &f); } """ ), encoding="ascii", ) subprocess.check_call( [sys.executable, "setup.py", "build_ext", "--inplace"], stdout=sys.stdout, stderr=sys.stderr, ) # Debug helper printout, normally hidden for item in tmpdir.listdir(): print(item.basename) assert ( len([f for f in tmpdir.listdir() if f.basename.startswith("simple_setup")]) == 1 ) assert len(list(tmpdir.listdir())) == 4 # two files + output + build_dir (tmpdir / "test.py").write_text( dedent( u"""\ import simple_setup assert simple_setup.f(3) == 9 """ ), encoding="ascii", ) subprocess.check_call( [sys.executable, "test.py"], stdout=sys.stdout, stderr=sys.stderr )