Skip to content

Commit

Permalink
add pybind11 build-system as option
Browse files Browse the repository at this point in the history
  • Loading branch information
ayeankit committed Aug 3, 2023
1 parent 3dc8562 commit f816654
Show file tree
Hide file tree
Showing 11 changed files with 173 additions and 8 deletions.
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,11 @@ for a Python package.
[Flit](https://flit.pypa.io),
[meson-python](https://meson-python.readthedocs.io/en/latest/index.html),
[Setuptools](https://setuptools.pypa.io/en/latest/),
[PDM](https://pdm.fming.dev/) or
[Hatch](https://hatch.pypa.io)
[Maturin](https://pypi.org/project/maturin/0.8.2/)
[scikit-build-core](https://scikit-build-core.readthedocs.io/en/latest/)
[PDM](https://pdm.fming.dev/),
[Hatch](https://hatch.pypa.io),
[Maturin](https://pypi.org/project/maturin/0.8.2/),
[scikit-build-core](https://scikit-build-core.readthedocs.io/en/latest/) or
[pybind11](https://pybind11.readthedocs.io/en/stable/)
based on your preference.
- The structure of the project can use the *src layout* or *flat
layout*. The “src layout” moving the code that is intended to be
Expand Down
5 changes: 4 additions & 1 deletion docs/guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,10 @@ packages. SciCookie support the following:
build requirements. With its capabilities, it facilitates cross-platform
builds using CMake and effortless integration with C/C++ libraries, making
it a valuable asset for research software engineers.


- [**Pybind11**](https://pybind11.readthedocs.io/en/stable/): It's build system designed
for C++ library that simplifies the creation of Python bindings for C++ code, enabling easy integration of C++ functions and classes into Python scripts. It acts as a bridge between the two languages, allowing C++ algorithms and functionality to be directly called from Python as if they were native Python modules. Pybind11's user-friendly syntax reduces boilerplate code, making binding generation more straightforward, while standard C++ build systems like CMake or Make facilitate the compilation of projects using pybind11. Its efficiency, ease of use, and strong community support have made it a popular choice for projects requiring seamless interoperability between C++ and Python, ranging from scientific computing to game development and automation. Staying up-to-date with the latest pybind11 documentation ensures the best practices are followed.

The idea behind the options in SciCookie is that you can choose from some of the
most popular system compilers to suit your needs and preferences for developing
Python packages. If you think we should add more options, you can submit your
Expand Down
3 changes: 2 additions & 1 deletion src/scicookie/cookiecutter.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
"pdm",
"hatch",
"maturin",
"scikit-build-core"
"scikit-build-core",
"pybind11"
],
"use_bandit": "yes",
"use_black": "no",
Expand Down
17 changes: 16 additions & 1 deletion src/scicookie/hooks/post_gen_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@
BUILD_SYSTEM = "maturin"
{% elif cookiecutter.build_system == "scikit-build-core" -%}
BUILD_SYSTEM = "scikit-build-core"
{% elif cookiecutter.build_system == "pybind11" -%}
BUILD_SYSTEM = "pybind11"
{%- else %}
BUILD_SYSTEM = None
{%- endif %}
Expand Down Expand Up @@ -214,7 +216,20 @@ def clean_up_build_system():
shutil.move(
build_system_dir / "skcdemo.cpp",
PROJECT_DIRECTORY / 'skcdemo.cpp'
)
)
elif BUILD_SYSTEM == "pybind11":
shutil.move(
build_system_dir / "pybind11-pyproject.toml",
PROJECT_DIRECTORY / 'pyproject.toml'
)
shutil.move(
build_system_dir / "CMakeLists.txt",
PROJECT_DIRECTORY / 'CMakeLists.txt'
)
shutil.move(
build_system_dir / "skcdemo.cpp",
PROJECT_DIRECTORY / 'skcdemo.cpp'
)
else:
shutil.move(
build_system_dir / "base-pyproject.toml",
Expand Down
1 change: 1 addition & 0 deletions src/scicookie/profiles/base.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ build_system:
- hatch
- maturin
- scikit-build-core
- pybind11
enabled: false

command_line_interface:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
[build-system]
requires = ["setuptools>=42", "wheel", "pybind11~=2.6.1"]
build-backend = "setuptools.build_meta"

[project]
name = "{{ cookiecutter.project_slug }}"
authors = [
{ name = "{{ cookiecutter.author_full_name }}", email = "{{ cookiecutter.author_email }}" },
]
description = "{{ cookiecutter.project_short_description }}"
readme = "README.md"
classifiers = [
"Development Status :: 1 - Planning",
"Intended Audience :: Science/Research",
"Intended Audience :: Developers",
{%- if cookiecutter.project_license == "MIT" %}
"License :: OSI Approved :: MIT License",
{%- elif cookiecutter.project_license == "BSD 3 Clause" %}
"License :: OSI Approved :: BSD License",
{%- elif cookiecutter.project_license == "Apache Software License 2.0" %}
"License :: OSI Approved :: Apache Software License",
{%- elif cookiecutter.project_license == "GNU General Public License v3" %}
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
{%- endif %}
"Operating System :: OS Independent",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Scientific/Engineering",
"Typing :: Typed",
]
dynamic = ["version"]
requires-python = ">=3.8.1"
dependencies = [
{# keep this line here #}
{%- if cookiecutter.use_pytest == "yes" -%}
"pytest >= 7.3.2",
{% if cookiecutter.use_coverage == "yes" -%}
"pytest-cov >= 4.1.0",
{% endif %}
{%- endif -%}{#- end of use_pytest -#}
{%- if cookiecutter.use_hypothesis == "yes" -%}
"hypothesis >= 6.0",
{% endif %}
{%- if cookiecutter.use_coverage == "yes" -%}
"coverage >= 7.2.7",
{% endif %}
{%- if cookiecutter.use_blue == "yes" -%}
"blue >= 0.9.1",
{% endif %}
{%- if cookiecutter.use_black == "yes" -%}
"black >= 23.3.0",
{% endif %}
{%- if cookiecutter.use_isort == "yes" -%}
"isort >= 5.12.0",
{% endif %}
{%- if cookiecutter.use_pre_commit -%}
"pre-commit >= 3.3.2",
{% endif %}
{%- if cookiecutter.use_flake8 == "yes" -%}
"flake8 >= 4.0.1, < 7",
{% endif %}
{%- if cookiecutter.use_ruff == "yes" -%}
"ruff >= 0.0.272",
{% endif %}
{%- if cookiecutter.use_mypy == "yes" -%}
"mypy >= 1.3.0",
{% endif %}
{%- if cookiecutter.use_bandit == "yes" -%}
"bandit >= 1.7.5",
{% endif %}
{%- if cookiecutter.use_pydocstyle == "yes" -%}
"pydocstyle >= 6.3.0",
{% endif %}
{%- if cookiecutter.use_vulture == "yes" -%}
"vulture >= 2.7",
{% endif %}
{%- if cookiecutter.use_mccabe == "yes" -%}
"mccabe >= 0.6.1",
{% endif %}
{%- if cookiecutter.use_containers in ['Docker', 'Podman'] -%}
# if you want to use docker-compose from your system, remove compose-go here
"compose-go >= 2.18.1",
{% endif %}
{%- if cookiecutter.documentation_engine == 'mkdocs' -%}
"Jinja2 >= 3.1.2",
"mkdocs >= 1.4.3",
"mkdocs-exclude >= 1.0.2",
"mkdocs-jupyter >= 0.24.1",
"mkdocs-literate-nav >= 0.6.0",
"mkdocs-macros-plugin >= 0.7.0, < 1",
"mkdocs-material >= 9.1.15",
"mkdocstrings >= 0.21.2",
"mkdocstrings-python >= 1.1.2",
{% elif cookiecutter.documentation_engine == 'sphinx' -%}
"Sphinx >= 6.2.1",
"sphinx-rtd-theme >= 1.2.2",
"importlib-metadata >= 6.5.1",
"myst-parser >= 0.19.2",
"nbsphinx >= 0.9.2",
"pandoc >= 2.3",
{% elif cookiecutter.documentation_engine == 'jupyter-book' -%}
"jupyter-book >= 0.15.1",
"myst-parser >= 0.18.1",
{% endif %}
]

[project.urls]
Homepage = "{{ cookiecutter.project_url }}"
"Bug Tracker" = "{{ cookiecutter.project_url }}/issues"
Discussions = "{{ cookiecutter.project_url }}/discussions"
Changelog = "{{ cookiecutter.project_url }}/releases"

[tool.hatch.version]
{# keep this line here #}
{%- if cookiecutter.project_layout == 'flat' -%}
path = "{{ cookiecutter.package_slug }}/__init__.py"
{% elif cookiecutter.project_layout == 'src' -%}
path = "src/{{ cookiecutter.package_slug }}/__init__.py"
{% endif %}

{% include "build-system/base-pyproject.toml" %}
{#- keep this line at the end of the file -#}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace py = pybind11;

PYBIND11_MODULE(skcdemo, m) {
m.def("hello", [](){
py::print("Hello, scikit-build-core!");
py::print("Hello !!!");
});
}
3 changes: 3 additions & 0 deletions src/scicookie/{{cookiecutter.project_slug}}/conda/dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ dependencies:
{%- elif cookiecutter.build_system == "scikit-build-core" %}
- scikit-build-core
- cmake
{%- elif cookiecutter.build_system == "pybind11" %}
- pybind11
- cmake
{%- endif %}
- nodejs # used by semantic-release
- shellcheck
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ In addition, you should know that to build our package we use
{%- elif cookiecutter.build_system == "scikit-build-core" -%}
In addition, you should know that to build our package we use
[scikit-build-core](https://scikit-build-core.readthedocs.io/en/latest/): It's a Python packaging tool and build system an improved build system generator for CPython C extensions. It provides better support for additional compilers, build systems, cross compilation, and locating dependencies and their associated build requirements.This tool improves package management in the scientific Python ecosystem, enabling cross-platform builds with CMake, and seamless integration with C/C++ libraries for research software engineers.
{%- elif cookiecutter.build_system == "pybind11" -%}
In addition, you should know that to build our package we use
[pybind11](https://pybind11.readthedocs.io/en/stable/): It's a Python packaging tool for C++ build system that simplifies creating Python bindings for C++ code, allowing easy integration of C++ functions and classes into Python scripts. Acting as a bridge between the two languages, it enables direct calls to C++ functionality from Python as if it were a native Python module. Its user-friendly syntax reduces boilerplate code, while standard C++ build systems like CMake or Make aid in project compilation. Pybind11's efficiency and strong community support make it a popular choice for projects requiring seamless interoperability between C++ and Python, from scientific computing to game development.

{%- endif %}

Contributions are welcome, and they are greatly appreciated! Every little bit
Expand Down
8 changes: 8 additions & 0 deletions tests/smoke/base.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ elif command -v maturin &> /dev/null; then
pip install -e .
elif [ "$(pip list|grep -c scikit_build_core)" -ne "0" ]; then
pip install -e .
elif [ "$(pip list|grep -c pybind11)" -ne "0" ]; then
# Assuming you are inside the root of the CMake source directory
mkdir build
cd build
cmake ..
cmake --build .
cd ..
pip install -e .
else
# use setuptools
pip install --editable .
Expand Down
1 change: 1 addition & 0 deletions tests/smoke/build-system.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ SMOKE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
. ${SMOKE_DIR}/base.sh "build_system=hatch"
. ${SMOKE_DIR}/base.sh "build_system=maturin"
. ${SMOKE_DIR}/base.sh "build_system=scikit-build-core"
. ${SMOKE_DIR}/base.sh "build_system=pybind11"

0 comments on commit f816654

Please sign in to comment.