blob: f293aae5eb75f136eedb5cf849169c9044e81c10 [file]
.. Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
.. http://www.apache.org/licenses/LICENSE-2.0
.. Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
Build from Source
=================
This guide covers two common workflows:
- Python package building, which automatically includes building the core C++
library;
- C++-only package building without Python.
.. admonition:: Prerequisite
:class: tip
- Python: 3.9 or newer
- Compiler: C++17-capable toolchain
- Linux: GCC or Clang with C++17 support
- macOS: Apple Clang (via Xcode Command Line Tools)
- Windows: MSVC (Visual Studio 2019 or 2022, x64)
- Build tools: CMake 3.18+; Ninja
Build the Python Package
------------------------
Download the source via:
.. code-block:: bash
git clone --recursive https://github.com/apache/tvm-ffi
cd tvm-ffi
.. note::
Always clone with ``--recursive`` to pull submodules. If you already cloned
without it, run:
.. code-block:: bash
git submodule update --init --recursive
Build the Python package with scikit-build-core, which drives CMake to compile
the C++ core and Cython extension:
.. code-block:: bash
uv pip install --force-reinstall --verbose -e .
The ``--force-reinstall`` flag forces a rebuild, and ``-e`` (editable) install
means future Python-only changes are reflected immediately without having to
rebuild.
**CMake flags** can be passed via ``--config-settings cmake.define.<FLAG>=<VALUE>``.
For example, to attach debug symbols:
.. code-block:: bash
uv pip install --force-reinstall --verbose -e . \
--config-settings cmake.define.TVM_FFI_ATTACH_DEBUG_SYMBOLS=ON
Available CMake options (see `CMakeLists.txt <https://github.com/apache/tvm-ffi/blob/main/CMakeLists.txt>`__) include:
- ``TVM_FFI_ATTACH_DEBUG_SYMBOLS`` -- Attach debug symbols even in release
mode (default: ``OFF``).
- ``TVM_FFI_USE_LIBBACKTRACE`` -- Enable libbacktrace (default: ``ON``).
- ``TVM_FFI_USE_EXTRA_CXX_API`` -- Enable extra C++ API in shared lib
(default: ``ON``).
- ``TVM_FFI_BACKTRACE_ON_SEGFAULT`` -- Set signal handler to print backtrace
on segfault (default: ``ON``).
- ``CMAKE_EXPORT_COMPILE_COMMANDS`` -- Generate ``compile_commands.json`` for
clangd and other tools (default: ``OFF``).
.. warning::
However, changes to C++/Cython always require re-running the install
command.
Verify the install:
.. code-block:: bash
uv run python -c "import tvm_ffi; print(tvm_ffi.__version__)"
uv run tvm-ffi-config -h
.. tip::
Use ``tvm-ffi-config`` to query include and link flags when consuming TVM
FFI from external C/C++ projects:
.. code-block:: bash
tvm-ffi-config --includedir
tvm-ffi-config --dlpack-includedir
tvm-ffi-config --libfiles # or --libs/--ldflags on Unix
Build the C/C++ Library Only
----------------------------
TVM FFI can be used as a standalone C/C++ library without Python. The
instruction below should work for Linux, macOS and Windows.
.. code-block:: 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, you should see:
- Headers are installed under ``dist/include/``;
- Libraries are installed under ``dist/lib/``.
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 your dynamic loader can find the
shared library. If built from source, add the ``lib`` directory to
``LD_LIBRARY_PATH`` (Linux), ``DYLD_LIBRARY_PATH`` (macOS), or ``PATH``
(Windows).
- **Wrong generator/build type**: Ninja/Unix Makefiles use
``-DCMAKE_BUILD_TYPE=...``; Visual Studio requires ``--config ...`` at
build/ctest time.
.. seealso::
- :doc:`ci_cd`: Reproduce linters, unit tests, and wheel builds locally.
- :doc:`../get_started/quickstart`: End-to-end walkthrough of building and
running a C++/CUDA kernel.
- :doc:`../packaging/cpp_tooling`: CMake integration, compiler flags, and
library distribution for downstream projects.