From 396feff4224a4eaa759f9c69e8317eabb44b5a03 Mon Sep 17 00:00:00 2001 From: Bryan Weber Date: Sun, 7 May 2023 14:27:31 -0400 Subject: [PATCH] Fixes after splitting the Cython module --- interfaces/python_sdist/MANIFEST.in | 5 +- interfaces/python_sdist/setup.cfg.in | 1 + interfaces/python_sdist/setup.py | 77 +++++++++++++++++----------- 3 files changed, 50 insertions(+), 33 deletions(-) diff --git a/interfaces/python_sdist/MANIFEST.in b/interfaces/python_sdist/MANIFEST.in index 9b1ae04f4..78bbd163b 100644 --- a/interfaces/python_sdist/MANIFEST.in +++ b/interfaces/python_sdist/MANIFEST.in @@ -2,10 +2,11 @@ # the wheel file if they are also listed in setup.cfg:options.package_data and not # listed in setup.cfg:options.exclude_package_data. -include cantera/_cantera.cpp +recursive-include cantera *.cpp +recursive-include cantera *.h recursive-include cantera *.pyx +recursive-include cantera *.pxd include sundials_config.h.in -include config.h.in graft include # The C/C++ files in these folders are included automatically because they're in diff --git a/interfaces/python_sdist/setup.cfg.in b/interfaces/python_sdist/setup.cfg.in index 77aa5557b..219e53a3f 100644 --- a/interfaces/python_sdist/setup.cfg.in +++ b/interfaces/python_sdist/setup.cfg.in @@ -45,6 +45,7 @@ install_requires = packaging python_requires @py_requires_ver_str@ packages = + cantera cantera.data cantera.examples cantera.test diff --git a/interfaces/python_sdist/setup.py b/interfaces/python_sdist/setup.py index 10cd08273..f6a7e6b2e 100644 --- a/interfaces/python_sdist/setup.py +++ b/interfaces/python_sdist/setup.py @@ -8,13 +8,14 @@ from pathlib import Path import numpy import shutil +PY_SRC = Path("cantera") CT_SRC = Path("src") EXT_SRC = Path("ext") CT_INCLUDE = Path("include") BOOST_INCLUDE = None FORCE_CYTHON_COMPILE = False -CYTHON_BUILT_FILES = [Path("cantera") / f"_cantera.{ext}" for ext in ("cpp", "h")] +CYTHON_BUILT_FILES = [pth.with_suffix(".cpp") for pth in PY_SRC.glob("*.pyx")] class CanteraOptionsMixin: @@ -22,6 +23,7 @@ class CanteraOptionsMixin: Modeled after https://stackoverflow.com/a/53833930 """ + user_options = [ ("force-cython-compile", None, "Force compilation of .pyx files via Cython"), ("boost-include", None, "Location of the Boost header files."), @@ -46,13 +48,15 @@ class CanteraOptionsMixin: class InstallCommand(CanteraOptionsMixin, install): - user_options = (getattr(install, "user_options", []) - + CanteraOptionsMixin.user_options) + user_options = ( + getattr(install, "user_options", []) + CanteraOptionsMixin.user_options + ) class DevelopCommand(CanteraOptionsMixin, develop): - user_options = (getattr(develop, "user_options", []) - + CanteraOptionsMixin.user_options) + user_options = ( + getattr(develop, "user_options", []) + CanteraOptionsMixin.user_options + ) if ( @@ -62,6 +66,7 @@ if ( or os.environ.get("FORCE_CYTHON_COMPILE", False) ): from Cython.Build import cythonize + CYTHON_EXT = ".pyx" for p in CYTHON_BUILT_FILES: if p.exists(): @@ -69,12 +74,13 @@ if ( else: CYTHON_EXT = ".cpp" - def cythonize(extensions): + def cythonize(extensions, **kwargs): """Define a no-op for when we're not using Cython.""" return extensions -source_files = ["cantera/_cantera" + CYTHON_EXT] -source_files += list(map(str, CT_SRC.glob("**/*.cpp"))) + +ct_sources = list(map(str, CT_SRC.glob("**/*.cpp"))) +py_sources = list(map(str, PY_SRC.glob(f"*{CYTHON_EXT}"))) sundials_sources = list(map(str, EXT_SRC.glob("sundials/**/*.c"))) yaml_cpp_sources = list(map(str, EXT_SRC.glob("yaml-cpp/**/*.cpp"))) fmt_sources = list(map(str, EXT_SRC.glob("fmt/*.cc"))) @@ -83,7 +89,8 @@ include_dirs = [ str(CT_INCLUDE), str(CT_INCLUDE / "cantera" / "ext"), str(CT_SRC), - numpy.get_include() + "cantera", + numpy.get_include(), ] if "BOOST_INCLUDE" in os.environ: @@ -94,8 +101,12 @@ elif BOOST_INCLUDE is not None: def configure_build(): boost_version = "" - boost_locs = (os.environ.get("BOOST_INCLUDE", None), BOOST_INCLUDE, "/usr/include", - "/usr/local/include") + boost_locs = ( + os.environ.get("BOOST_INCLUDE", None), + BOOST_INCLUDE, + "/usr/include", + "/usr/local/include", + ) for boost_dir in boost_locs: if boost_dir is None: continue @@ -123,24 +134,22 @@ def configure_build(): f"Could not convert Boost minor version to integer: '{boost_version}'" ) from None if boost_minor_version < 61: - raise ValueError( - "Cantera requires Boost version 1.61 or newer." - ) + raise ValueError("Cantera requires Boost version 1.61 or newer.") if sys.platform != "win32": extra_compile_flags = ["-std=c++17", "-g0"] sundials_configh = { "SUNDIALS_USE_GENERIC_MATH": "#define SUNDIALS_USE_GENERIC_MATH 1", - "SUNDIALS_BLAS_LAPACK": "/* #undef SUNDIALS_BLAS_LAPACK */" + "SUNDIALS_BLAS_LAPACK": "/* #undef SUNDIALS_BLAS_LAPACK */", } sundials_cflags = ["-w"] sundials_macros = [] else: - extra_compile_flags = [] + extra_compile_flags = ["/EHsc", "/std:c++17"] sundials_macros = [("_CRT_SECURE_NO_WARNINGS", None)] sundials_configh = { "SUNDIALS_USE_GENERIC_MATH": "/* #undef SUNDIALS_USE_GENERIC_MATH */", - "SUNDIALS_BLAS_LAPACK": "/* #undef SUNDIALS_BLAS_LAPACK */" + "SUNDIALS_BLAS_LAPACK": "/* #undef SUNDIALS_BLAS_LAPACK */", } sundials_cflags = [] @@ -160,31 +169,37 @@ else: sundials_cflags = [] sundials_macros = [] -extensions = cythonize([ - Extension( - "cantera._cantera", - source_files, - include_dirs=include_dirs, - extra_compile_args=extra_compile_flags, - language="c++", - ), -]) - def lib_def(sources, cflags, include_dirs, macros): """Convenience factory to create the dictionary for a Setuptools library build.""" - return dict(sources=sources, cflags=cflags, include_dirs=include_dirs, - macros=macros) + return dict( + sources=sources, cflags=cflags, include_dirs=include_dirs, macros=macros + ) sundials_inc_dir = include_dirs + [str(EXT_SRC / "sundials" / "sundials")] libraries = [ - ("sundials", lib_def(sundials_sources, sundials_cflags, sundials_inc_dir, - sundials_macros)), + ( + "sundials", + lib_def(sundials_sources, sundials_cflags, sundials_inc_dir, sundials_macros), + ), ("yaml-cpp", lib_def(yaml_cpp_sources, extra_compile_flags, include_dirs, [])), ("fmtlib", lib_def(fmt_sources, extra_compile_flags, include_dirs, [])), ] +extensions = cythonize( + [ + Extension( + name=f"cantera._cantera", + sources=py_sources + ct_sources, + include_dirs=include_dirs, + extra_compile_args=extra_compile_flags, + language="c++", + ) + ], + compiler_directives={"binding": True, "language_level": 3}, +) + setup( ext_modules=extensions, libraries=libraries,