mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 00:20:25 +08:00
[MLIR][Python] add Python wheel build demo/test (#160388)
This PR demos and tests building Python wheels using
[scikit-build-core](https://scikit-build-core.readthedocs.io/en/latest/).
The test is added to standalone and thus demos "out-of-tree" use cases
but the same `pyproject.toml` will work for in-tree builds. Note, one
can easily pair this with
[cibuildwheel](3264909755/docs/guide/build.md (L221-L226))
to build for all Python versions, OSs, architectures, etc.
This commit is contained in:
@@ -63,8 +63,12 @@ if(MLIR_ENABLE_BINDINGS_PYTHON)
|
||||
include(MLIRDetectPythonEnv)
|
||||
mlir_configure_python_dev_packages()
|
||||
# Note: for EXTERNAL_PROJECT_BUILD this must be set from the command line.
|
||||
set(MLIR_PYTHON_PACKAGE_PREFIX "mlir_standalone" CACHE STRING "" FORCE)
|
||||
set(MLIR_BINDINGS_PYTHON_INSTALL_PREFIX "python_packages/standalone/${MLIR_PYTHON_PACKAGE_PREFIX}" CACHE STRING "" FORCE)
|
||||
if(NOT MLIR_PYTHON_PACKAGE_PREFIX)
|
||||
set(MLIR_PYTHON_PACKAGE_PREFIX "mlir_standalone" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
if(NOT MLIR_BINDINGS_PYTHON_INSTALL_PREFIX)
|
||||
set(MLIR_BINDINGS_PYTHON_INSTALL_PREFIX "python_packages/standalone/${MLIR_PYTHON_PACKAGE_PREFIX}" CACHE STRING "" FORCE)
|
||||
endif()
|
||||
add_subdirectory(python)
|
||||
endif()
|
||||
add_subdirectory(test)
|
||||
|
||||
65
mlir/examples/standalone/pyproject.toml
Normal file
65
mlir/examples/standalone/pyproject.toml
Normal file
@@ -0,0 +1,65 @@
|
||||
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
# See https://llvm.org/LICENSE.txt for license information.
|
||||
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
# Copyright (c) 2025.
|
||||
|
||||
[project]
|
||||
name = "standalone-python-bindings"
|
||||
dynamic = ["version"]
|
||||
requires-python = ">=3.8,<=3.14"
|
||||
dependencies = [
|
||||
"numpy>=1.19.5, <=2.1.2",
|
||||
"PyYAML>=5.4.0, <=6.0.1",
|
||||
"ml_dtypes>=0.1.0, <=0.6.0; python_version<'3.13'",
|
||||
"ml_dtypes>=0.5.0, <=0.6.0; python_version>='3.13'",
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
Homepage = "https://github.com/llvm/llvm-project"
|
||||
Discussions = "https://discourse.llvm.org/"
|
||||
"Issue Tracker" = "https://github.com/llvm/llvm-project/issues?q=is%3Aissue%20state%3Aopen%20label%3Amlir%3Apython%20"
|
||||
"Source Code" = "https://github.com/llvm/llvm-project/tree/main/mlir/python"
|
||||
|
||||
[build-system]
|
||||
requires = [
|
||||
"scikit-build-core>=0.10.7",
|
||||
"typing_extensions>=4.12.2",
|
||||
"nanobind>=2.9, <3.0",
|
||||
"pybind11>=2.10.0, <=2.13.6",
|
||||
]
|
||||
build-backend = "scikit_build_core.build"
|
||||
|
||||
[tool.scikit-build]
|
||||
# This is the minimum version of scikit-build-core.
|
||||
minimum-version = "0.10.7"
|
||||
# This pyproject.toml must be adjacent to the root CMakeLists.txt (wherever project(...) is specified).
|
||||
cmake.source-dir = "."
|
||||
# This is for installing/distributing the python bindings target and only the python bindings target.
|
||||
build.targets = ["StandalonePythonModules"]
|
||||
install.components = ["StandalonePythonModules"]
|
||||
|
||||
[tool.scikit-build.cmake.define]
|
||||
# Optional
|
||||
CMAKE_C_COMPILER = { env = "CMAKE_C_COMPILER", default = "" }
|
||||
CMAKE_CXX_COMPILER = { env = "CMAKE_CXX_COMPILER", default = "" }
|
||||
CMAKE_C_COMPILER_LAUNCHER = { env = "CMAKE_C_COMPILER_LAUNCHER", default = "" }
|
||||
CMAKE_CXX_COMPILER_LAUNCHER = { env = "CMAKE_CXX_COMPILER_LAUNCHER", default = "" }
|
||||
CMAKE_GENERATOR = { env = "CMAKE_GENERATOR", default = "Ninja" }
|
||||
LLVM_USE_LINKER = { env = "LLVM_USE_LINKER", default = "" }
|
||||
# Optional but highly recommended (this makes the bindings compatible with other bindings packages
|
||||
# by preventing symbol collisions).
|
||||
CMAKE_VISIBILITY_INLINES_HIDDEN = "ON"
|
||||
CMAKE_C_VISIBILITY_PRESET = "hidden"
|
||||
CMAKE_CXX_VISIBILITY_PRESET = "hidden"
|
||||
|
||||
# Non-optional (alternatively you could use CMAKE_PREFIX_PATH here).
|
||||
MLIR_DIR = { env = "MLIR_DIR", default = "" }
|
||||
# Non-optional
|
||||
CMAKE_BUILD_TYPE = { env = "CMAKE_BUILD_TYPE", default = "Release" }
|
||||
MLIR_ENABLE_BINDINGS_PYTHON = "ON"
|
||||
# Effectively non-optional (any downstream project should specify this).
|
||||
MLIR_PYTHON_PACKAGE_PREFIX = "mlir_standalone"
|
||||
# This specifies the directory in the install directory (i.e., /tmp/pip-wheel/platlib) where _mlir_libs, dialects, etc.
|
||||
# are installed. Thus, this will be the package location (and the name of the package) that pip assumes is
|
||||
# the root package.
|
||||
MLIR_BINDINGS_PYTHON_INSTALL_PREFIX = "mlir_standalone"
|
||||
@@ -1,3 +1,5 @@
|
||||
import os
|
||||
|
||||
# Disable with sanitizers for now, this require some more setup apparently.
|
||||
for san in ["asan", "msan", "ubsan"]:
|
||||
if san in config.available_features:
|
||||
@@ -7,7 +9,10 @@ config.substitutions.append(("%cmake_exe", config.host_cmake))
|
||||
config.substitutions.append(("%cmake_generator", config.host_cmake_generator))
|
||||
config.substitutions.append(("%host_cxx", config.host_cxx))
|
||||
config.substitutions.append(("%host_cc", config.host_cc))
|
||||
config.substitutions.append(("%hostc_compiler_launcher", config.host_c_compiler_launcher))
|
||||
config.substitutions.append(("%hostcxx_compiler_launcher", config.host_cxx_compiler_launcher))
|
||||
config.substitutions.append(("%enable_libcxx", config.enable_libcxx))
|
||||
config.substitutions.append(("%mlir_cmake_dir", config.mlir_cmake_dir))
|
||||
config.substitutions.append(("%mlir_obj_root", config.mlir_obj_root))
|
||||
config.substitutions.append(("%llvm_use_linker", config.llvm_use_linker))
|
||||
config.substitutions.append(("%cmake_build_type", config.cmake_build_type))
|
||||
|
||||
31
mlir/test/Examples/standalone/test.wheel.toy
Normal file
31
mlir/test/Examples/standalone/test.wheel.toy
Normal file
@@ -0,0 +1,31 @@
|
||||
# There's no real issue with windows here, it's just that some CMake generated paths for targets end up being longer
|
||||
# than 255 chars when combined with the fact that pip wants to install into a tmp directory buried under
|
||||
# C/Users/ContainerAdministrator/AppData/Local/Temp.
|
||||
# UNSUPPORTED: target={{.*(windows).*}}
|
||||
|
||||
# RUN: export CMAKE_BUILD_TYPE=%cmake_build_type
|
||||
# RUN: export CMAKE_CXX_COMPILER=%host_cxx
|
||||
# RUN: export CMAKE_CXX_COMPILER_LAUNCHER=%hostcxx_compiler_launcher
|
||||
# RUN: export CMAKE_C_COMPILER=%host_cc
|
||||
# RUN: export CMAKE_C_COMPILER_LAUNCHER=%hostc_compiler_launcher
|
||||
# RUN: export CMAKE_GENERATOR=%cmake_generator
|
||||
# RUN: export LLVM_USE_LINKER=%llvm_use_linker
|
||||
# RUN: export MLIR_DIR="%mlir_cmake_dir"
|
||||
|
||||
# RUN: %python -m pip wheel "%mlir_src_root/examples/standalone" -w "%mlir_obj_root/wheelhouse" -v | tee %t
|
||||
|
||||
# RUN: rm -rf "%mlir_obj_root/standalone-python-bindings-install"
|
||||
# RUN: %python -m pip install standalone_python_bindings -f "%mlir_obj_root/wheelhouse" --target "%mlir_obj_root/standalone-python-bindings-install" -v | tee -a %t
|
||||
|
||||
# RUN: export PYTHONPATH="%mlir_obj_root/standalone-python-bindings-install"
|
||||
# RUN: %python "%mlir_src_root/examples/standalone/test/python/smoketest.py" nanobind | tee -a %t
|
||||
|
||||
# RUN: FileCheck --input-file=%t %s
|
||||
|
||||
# CHECK: Successfully built standalone-python-bindings
|
||||
|
||||
# CHECK: module {
|
||||
# CHECK: %[[C2:.*]] = arith.constant 2 : i32
|
||||
# CHECK: %[[V0:.*]] = standalone.foo %[[C2]] : i32
|
||||
# CHECK: }
|
||||
|
||||
@@ -15,6 +15,8 @@ config.native_target = "@LLVM_NATIVE_ARCH@"
|
||||
config.host_os = "@HOST_OS@"
|
||||
config.host_cc = "@HOST_CC@"
|
||||
config.host_cxx = "@HOST_CXX@"
|
||||
config.host_c_compiler_launcher = "@CMAKE_C_COMPILER_LAUNCHER@"
|
||||
config.host_cxx_compiler_launcher = "@CMAKE_CXX_COMPILER_LAUNCHER@"
|
||||
config.enable_libcxx = "@LLVM_ENABLE_LIBCXX@"
|
||||
config.host_cmake = "@CMAKE_COMMAND@"
|
||||
config.host_cmake_generator = "@CMAKE_GENERATOR@"
|
||||
|
||||
Reference in New Issue
Block a user