===============================
Building the CMake Python wheel
===============================
Overview
--------
This project has been designed to work with `scikit-build-core `_.
This is done ensuring source files and build artifacts
are copied and/or generated in expected locations.
Prerequisites
-------------
In addition of ``Git``, ``Python`` and `CMake `_, building
the wheel with ``BUILD_CMAKE_FROM_SOURCE`` set to ``ON`` also requires a
``C++ Compiler``.
Quick start
-----------
Build the CMake Python wheel with the following command::
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements-dev.txt build
python -m build --wheel
Source distribution (sdist)
---------------------------
CMake sources will always be downloaded in the ``/src``
directory.
This will ensure that the rules specified in ``/MANIFEST.in``
can successfully glob the source files.
The source distribution is generated using the following
command::
python -m build --sdist
Binary distribution (build, bdist, bdist_wheel)
-----------------------------------------------
The project has two mode of operations:
#. build CMake from source (``BUILD_CMAKE_FROM_SOURCE`` set to ``ON``)
#. download CMake binaries (``BUILD_CMAKE_FROM_SOURCE`` set to ``OFF``)
The binary distribution is generated using the following
command::
python -m build --wheel
Changing the default mode is achieved by explicitly passing the option
to CMake::
python -m build --wheel -Ccmake.define.BUILD_CMAKE_FROM_SOURCE=ON
Default value for ``BUILD_CMAKE_FROM_SOURCE``
---------------------------------------------
Depending on the platform, option ``BUILD_CMAKE_FROM_SOURCE`` has
different default:
- Linux: ON
- MacOSX: OFF
- Windows: OFF
Controlling verbosity
---------------------
configure and build output
^^^^^^^^^^^^^^^^^^^^^^^^^^
By default, the output associated to the configure and build steps of the
`CMakeProject-build` external project are logged into files. This can be
changed by setting the ``BUILD_VERBOSE`` option::
python -m build --wheel -Ccmake.define.BUILD_VERBOSE=ON
Optimizations
-------------
On a given platform, when building different "flavor" of CMake python wheels (one
for each ``-`` tag), the whole process can be made faster in two
ways.
Caching downloads
^^^^^^^^^^^^^^^^^
To avoid the re-download of CMake sources and/or binary packages, passing the
option ``-Ccmake.define.CMakePythonDistributions_ARCHIVE_DOWNLOAD_DIR=/path/to/cache``
enables successive build to re-use existing archives instead of re-downloading them.
Re-using build tree
^^^^^^^^^^^^^^^^^^^
And finally, on a given platform, to avoid rebuilding CMake, the idea is to
first create a standalone build of the CMake project and then building the
wheel using it.
Step 1: Standalone build::
mkdir -p standalone-build && cd $_
cmake -DCMakePythonDistributions_ARCHIVE_DOWNLOAD_DIR:PATH=/path/to/cache -G Ninja ../
Step 2: Faster build reusing download and build directories::
python -m build -Ccmake.define.CMakePythonDistributions_ARCHIVE_DOWNLOAD_DIR=/path/to/cache
-Ccmake.define.CMakeProject_BINARY_DIR=/path/to/standalone-build