devtools
Developer reference for Apache TVM-FFI.
Quellinformationen
- Repository
- apache/tvm-ffi
- Letzte Quellaktivität
- 13. Juli 2026 um 07:49
- Erkannte Sprache von SKILL.md
- Englisch
- Sterne
- 471
- Forks
- 104
Installationsoptionen
Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
SKILL.md wird angezeigt
SKILL.md
Quellanweisungen · Schreibgeschützte Vorschau- name
- devtools
- description
- Developer reference for Apache TVM-FFI.
- argument-hint
- [lint | cpp | python | docs]
# TVM-FFI Developer Guide
Condensed reference from `docs/dev/`. Use this when working on the TVM-FFI codebase.
## Prerequisites
- **Python**: 3.9+ (managed via `uv`; default virtualenv at `.venv`)
- **Compiler**: C++17-capable toolchain (GCC/Clang on Linux, Apple Clang on macOS, MSVC on Windows)
- **Build tools**: CMake 3.26+, Ninja
- **Source**: Always clone with `--recursive`, or run `git submodule update --init --recursive`
All Python-related commands below use [`uv`](https://docs.astral.sh/uv/). The default virtual environment is `.venv` in the repo root.
---
## 1. Run Linters and clang-tidy
### Pre-commit hooks (primary linting workflow)
Install and register git hooks:
```bash
uv tool install pre-commit
pre-commit install # register git hooks (runs automatically before each commit)
```
Run hooks manually:
```bash
pre-commit run --all-files # all hooks on every file
pre-commit run # all hooks on staged files only
pre-commit run <hook-id> --all-files # single hook, e.g. ruff-check, clang-format
```
**Linters by language:**
| Language | Formatter | Linter / Type Checker |
|----------|---------------------------------|----------------------------------|
| Python | `ruff` (format) | `ruff` (lint), `ty` (type check) |
| C/C++ | `clang-format` | `clang-tidy` (see below) |
| Cython | `double-quote-cython-strings` | `cython-lint` |
| CMake | `cmake-format` | `cmake-lint` |
| Shell | `shfmt` | `shellcheck` |
| YAML | `yamllint` | |
| TOML | `taplo-format` | |
| Markdown | `markdownlint-cli2` | |
| RST | `rstcheck` | |
**Troubleshooting pre-commit:**
- **Version problems**: Ensure pre-commit 2.18.0+ (`pre-commit --version`).
- **Stale cache**: Run `pre-commit clean` to clear the hook cache.
- **Auto-fixed files**: Most formatting hooks fix issues in place. Review changes, stage with `git add -u`, and commit again.
### clang-tidy (separate from pre-commit)
`clang-tidy` is **not** a pre-commit hook. It runs as a separate CI job and only checks changed C++ files. To reproduce locally:
```bash
# Run on specific files
uv run --no-project --with "clang-tidy==21.1.1" \
python tests/lint/clang_tidy_precommit.py \
--build-dir=build-pre-commit \
--jobs=$(sysctl -n hw.ncpu) \
include/tvm/ffi/c_api.h src/some_file.cc
# Run on all C++ sources
uv run --no-project --with "clang-tidy==21.1.1" \
python tests/lint/clang_tidy_precommit.py \
--build-dir=build-pre-commit \
--jobs=$(sysctl -n hw.ncpu) \
./src/ ./include ./tests
```
> On macOS, `clang-tidy` is resolved via `xcrun`; the wrapper script handles this automatically.
> On Linux, replace `$(sysctl -n hw.ncpu)` with `$(nproc)`.
---
## 2. Build and Test the C++ Package
### Build the C++ library (no Python)
```bash
cmake . -B build_cpp -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build_cpp --parallel --config RelWithDebInfo --target tvm_ffi_shared
cmake --install build_cpp --config RelWithDebInfo --prefix ./dist
```
After installation:
- Headers: `dist/include/`
- Libraries: `dist/lib/`
### Build and run C++ tests
Set parallel build level first:
```bash
export CMAKE_BUILD_PARALLEL_LEVEL=$(sysctl -n hw.ncpu) # macOS
# export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) # Linux
```
Configure, build, and run:
```bash
cmake . -B build_test -DTVM_FFI_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug
cmake --build build_test --clean-first --config Debug --target tvm_ffi_tests
ctest -V -C Debug --test-dir build_test --output-on-failure
```
### Key CMake options
| Option | Default | Description |
|----------------------------------|---------|----------------------------------------------|
| `TVM_FFI_BUILD_TESTS` | `OFF` | Enable C++ test targets |
| `TVM_FFI_ATTACH_DEBUG_SYMBOLS` | `OFF` | Attach debug symbols in release mode |
| `TVM_FFI_USE_LIBBACKTRACE` | `ON` | Enable libbacktrace |
| `TVM_FFI_USE_EXTRA_CXX_API` | `ON` | Enable extra C++ API in shared lib |
| `TVM_FFI_BACKTRACE_ON_SEGFAULT` | `ON` | Print backtrace on segfault |
| `CMAKE_EXPORT_COMPILE_COMMANDS` | `OFF` | Generate `compile_commands.json` for clangd |
> On Windows, run from a **Developer Command Prompt for VS** or ensure the MSVC toolchain is on your `PATH`.
---
## 3. Build and Test the Python Package
### Build (editable install)
The Python build uses `scikit-build-core` which drives CMake to compile the C++ core and Cython extension:
```bash
uv pip install --force-reinstall --verbose -e .
```
- `--force-reinstall` forces a full rebuild.
- `-e` (editable) means pure Python changes are reflected immediately without rebuilding.
- **C++/Cython changes always require re-running this command.**
Pass CMake flags via `--config-settings`:
```bash
uv pip install --force-reinstall --verbose -e . \
--config-settings cmake.define.TVM_FFI_ATTACH_DEBUG_SYMBOLS=ON
```
Verify the install:
```bash
uv run python -c "import tvm_ffi; print(tvm_ffi.__version__)"
```
### Update Python stubs
After building (or after C++/Cython reflection changes), regenerate inline type stubs:
```bash
uv run tvm-ffi-stubgen python
```
This updates inline stub blocks (between `tvm-ffi-stubgen(begin)` / `tvm-ffi-stubgen(end)`
markers) inside `.py` files with type annotations derived from the C++ reflection
registry (field types, method signatures, global function schemas).
### Run Python tests
Install with test dependencies, then run pytest:
```bash
uv pip install --force-reinstall --verbose --group test -e .
uv run pytest -vvs tests/python
```
### Run Rust tests
Rust tests require the Python package to be installed first (Rust FFI bindings link against the built shared library):
```bash
cd rust && cargo test
```
### Troubleshooting
- **Rebuilding after C++/Cython changes**: Re-run `uv pip install --force-reinstall -e .`. Editable installs only auto-reflect pure Python changes.
- **Submodules missing**: Run `git submodule update --init --recursive` from the repo root.
- **Library not found at import time**: Ensure the dynamic loader can find the shared library. Add the `lib` directory to `LD_LIBRARY_PATH` (Linux), `DYLD_LIBRARY_PATH` (macOS), or `PATH` (Windows).
---
## 4. Build Documentation Website
Building documentation requires the Python package to be installed first (see section 3).
### Interactive build (auto-reload)
Serves locally at `http://127.0.0.1:8000` with live reload:
```bash
uv run --group docs sphinx-autobuild docs docs/_build/html \
--ignore docs/reference/cpp/generated
```
### One-off build
```bash
uv run --group docs sphinx-build -M html docs docs/_build
```
### With C++ API reference (requires Doxygen)
```bash
# Install Doxygen
brew install doxygen # macOS
# sudo apt install doxygen # Linux
# Interactive
BUILD_CPP_DOCS=1 uv run --group docs sphinx-autobuild docs docs/_build/html \
--ignore docs/reference/cpp/generated --watch include
# One-off
BUILD_CPP_DOCS=1 uv run --group docs sphinx-build -M html docs docs/_build
```
### With Rust API reference (requires cargo)
```bash
# Interactive
BUILD_RUST_DOCS=1 uv run --group docs sphinx-autobuild docs docs/_build/html \
--ignore docs/reference/rust/generated --watch rust
# One-off
BUILD_RUST_DOCS=1 uv run --group docs sphinx-build -M html docs docs/_build
```
### Build all documentation
```bash
BUILD_CPP_DOCS=1 BUILD_RUST_DOCS=1 uv run --group docs sphinx-build \
-M html docs docs/_build
```
### Cleanup
```bash
rm -rf docs/_build/ docs/reference/python/generated docs/reference/cpp/generated docs/reference/rust/generated
```
Auf GitHub ansehen