Skip to content
Snippets Groups Projects
Forked from cepc / CEPCSW
Source project has a limited visibility.
user avatar
authored

scikit-build-cpp-python

Why and What

use scikit-build-core to setup a python-cmake project that can be installed with pip install -e .

Conclusion

  • package name has nothing to do with the import path. pacakge named my_package is installed with pip install ., uninstalled with pip uninstall my_package, but can be used as import kk.ss as ks.
  • installation of cpp files:
install(TARGET mylib LIBRARY DESTINATION .)

and set

[tool.scikit-build]
wheel.install-dir = "kk/ss"
  • installation of python files:
[tool.scikit-build.wheel.packages]
"mm/tt" = "python/myproj/simulation"

[tool.scikit-build]
wheel.exclude = ["CMakeLists.txt","*.cc","*.h"]

special variable

  • ${SKBUILD_PLATLIB_DIR}: The original platlib directory. Anything here goes directly to site-packages when a wheel is installed.
  • ${SKBUILD_DATA_DIR}: The data directory. Anything here goes to the root of the environment when a wheel is installed (use with care).
  • ${SKBUILD_HEADERS_DIR}: The header directory. Anything in here gets installed to Python's header directory.
  • ${SKBUILD_SCRIPTS_DIR}: The scripts directory. Anything placed in here will go to bin (Unix) or Scripts (Windows).
  • ${SKBUILD_METADATA_DIR}: The dist-info directory. Licenses go in the licenses subdirectory. _Note that CMake is not run in the prepare_metadata_\* hooks, so anything written to this directory will only be present when writing wheels._
  • ${SKBUILD_NULL_DIR}: Anything installed here will not be placed in the wheel.

style and lint check

notebook output stripping

  • use pre-commit
  1. install
pip install pre-commit nbstripout
  1. set
repos:
  - repo: https://gitlab.cern.ch/pre-commit-hook-mirrors/kynan/nbstripout
    rev: 0.8.0
    hooks:
      - id: nbstripout
        files: \.ipynb$
  1. install
pre-commit install
  1. run and verify
pre-commit run --all-files

or

nox -s pre_commit

c++ formating

  • pre-commit + vscode extensions
  • install extensions
Name: clangd
Id: llvm-vs-code-extensions.vscode-clangd
Description: C/C++ completion, navigation, and insights
Version: 0.1.30
Publisher: LLVM
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd

and make sure this is in settings.json:

  "[cpp]": {
    "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
  }
- repo: https://gitlab.cern.ch/pre-commit-hook-mirrors/pre-commit/mirrors-clang-format
  rev: v19.1.3
  hooks:
    - id: clang-format
      files: \.(cpp|hpp|c|h)$

python formatting

  • pre-commit + vscode extensions
  • install vscode extensions
  • install extensions
Name: Black Formatter
Id: ms-python.black-formatter
Description: Formatting support for Python files using the Black formatter.
Version: 2024.4.0
Publisher: Microsoft
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

and update settings.json

  "[python]": {
    "editor.codeActionsOnSave": {
      "source.organizeImports": "always"
    },
    "editor.defaultFormatter": "ms-python.black-formatter"
  },
  "isort.args": ["--profile", "black"],
  • install pre-commit hooks
repos:
  - repo: https://gitlab.cern.ch/pre-commit-hook-mirrors/psf/black
    rev: 24.10.0  # Use the latest stable version
    hooks:
      - id: black

c++ lint

  • nox + vscode extensions

python lint

  • ruff: pre-commit + vscode extensions
  • pylint: nox + vscode extensions

vscode extensions to install

  • "isort", which sort python import
Name: isort
Id: ms-python.isort
Description: Import organization support for Python files using isort.
Version: 2023.10.1
Publisher: Microsoft
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-python.isort
  • "pylint", for complrehensive code analysis
Name: Pylint
Id: ms-python.pylint
Description: Linting support for Python files using Pylint.
Version: 2024.0.0
Publisher: Microsoft
VS Marketplace Link: https://marketplace.visualstudio.com/items?itemName=ms-python.pylint