[NFC] Update some mlir python documentation.

* Development setup recommendations.
* Test updates to match what we actually do.
* Update cmake variable `PYTHON_EXECUTABLE` -> `Python3_EXECUTABLE` to match the upgrade to python3 repo wide.
This commit is contained in:
Stella Laurenzo 2021-01-18 11:49:06 -08:00
parent 01a13f127a
commit 417f613743
1 changed files with 35 additions and 49 deletions

View File

@ -17,6 +17,13 @@ Current status: Under development and not enabled by default
Enables building the Python bindings. Defaults to `OFF`.
* **`Python3_EXECUTABLE`**:`STRING`
Specifies the `python` executable used for the LLVM build, including for
determining header/link flags for the Python bindings. On systems with
multiple Python implementations, setting this explicitly to the preferred
`python3` executable is strongly recommended.
* **`MLIR_PYTHON_BINDINGS_VERSION_LOCKED`**`:BOOL`
Links the native extension against the Python runtime library, which is
@ -25,12 +32,32 @@ Current status: Under development and not enabled by default
compile time errors for unresolved symbols on all platforms, which makes for a
smoother development workflow. Defaults to `ON`.
* **`PYTHON_EXECUTABLE`**:`STRING`
### Recommended development practices
Specifies the `python` executable used for the LLVM build, including for
determining header/link flags for the Python bindings. On systems with
multiple Python implementations, setting this explicitly to the preferred
`python3` executable is strongly recommended.
It is recommended to use a python virtual environment. Many ways exist for this,
but the following is the simplest:
```shell
# Make sure your 'python' is what you expect. Note that on multi-python
# systems, this may have a version suffix, and on many Linuxes and MacOS where
# python2 and python3 co-exist, you may also want to use `python3`.
which python
python -m venv ~/.venv/mlirdev
source ~/.venv/mlirdev/bin/activate
# Now the `python` command will resolve to your virtual environment and
# packages will be installed there.
python -m pip install pybind11 numpy
# Now run `cmake`, `ninja`, et al.
```
For interactive use, it is sufficient to add the `python` directory in your
`build/` directory to the `PYTHONPATH`. Typically:
```shell
export PYTHONPATH=$(cd build && pwd)/python
```
## Design
@ -292,57 +319,16 @@ mutually exclusive with a more complete mapping of the backing constructs.
Tests should be added in the `test/Bindings/Python` directory and should
typically be `.py` files that have a lit run line.
While lit can run any python module, prefer to lay tests out according to these
rules:
We use `lit` and `FileCheck` based tests:
* For tests of the API surface area, prefer
[`doctest`](https://docs.python.org/3/library/doctest.html).
* For generative tests (those that produce IR), define a Python module that
constructs/prints the IR and pipe it through `FileCheck`.
* Parsing should be kept self-contained within the module under test by use of
raw constants and an appropriate `parse_asm` call.
* Any file I/O code should be staged through a tempfile vs relying on file
artifacts/paths outside of the test module.
### Sample Doctest
```python
# RUN: %PYTHON %s
"""
>>> m = load_test_module()
Test basics:
>>> m.operation.name
"module"
>>> m.operation.is_registered
True
>>> ... etc ...
Verify that repr prints:
>>> m.operation
<operation 'module'>
"""
import mlir
TEST_MLIR_ASM = r"""
func @test_operation_correct_regions() {
// ...
}
"""
# TODO: Move to a test utility class once any of this actually exists.
def load_test_module():
ctx = mlir.ir.Context()
ctx.allow_unregistered_dialects = True
module = ctx.parse_asm(TEST_MLIR_ASM)
return module
if __name__ == "__main__":
import doctest
doctest.testmod()
```
* For convenience, we also test non-generative API interactions with the same
mechanisms, printing and `CHECK`ing as needed.
### Sample FileCheck test