Re-applies D111513:
* Adds a full-fledged Python example dialect and tests to the Standalone example (need to do a bit of tweaking in the top level CMake and lit tests to adapt better to if not building with Python enabled).
* Rips out remnants of custom extension building in favor of pybind11_add_module which does the right thing.
* Makes python and extension sources installable (outputs to src/python/${name} in the install tree): Both Python and C++ extension sources get installed as downstreams need all of this in order to build a derived version of the API.
* Exports sources targets (with our properties that make everything work) by converting them to INTERFACE libraries (which have export support), as recommended for the forseeable future by CMake devs. Renames custom properties to start with lower-case letter, as also recommended/required (groan).
* Adds a ROOT_DIR argument to declare_mlir_python_extension since now all C++ sources for an extension must be under the same directory (to line up at install time).
* Downstreams will need to adapt by:
* Remove absolute paths from any SOURCES for declare_mlir_python_extension (I believe all downstreams are just using ${CMAKE_CURRENT_SOURCE_DIR} here, which can just be ommitted). May need to set ROOT_DIR if not relative to the current source directory.
* To allow further downstreams to install/build, will need to make sure that all C++ extension headers are also listed under SOURCES for declare_mlir_python_extension.
This reverts commit 1a6c26d1f5.
Reviewed By: stephenneuendorffer
Differential Revision: https://reviews.llvm.org/D113732
391 lines
12 KiB
CMake
391 lines
12 KiB
CMake
include(AddMLIRPython)
|
|
|
|
################################################################################
|
|
# Structural groupings.
|
|
################################################################################
|
|
|
|
declare_mlir_python_sources(MLIRPythonSources)
|
|
declare_mlir_python_sources(MLIRPythonSources.Dialects
|
|
ADD_TO_PARENT MLIRPythonSources)
|
|
|
|
################################################################################
|
|
# Pure python sources and generated code
|
|
################################################################################
|
|
|
|
declare_mlir_python_sources(MLIRPythonSources.Core
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
ADD_TO_PARENT MLIRPythonSources
|
|
SOURCES
|
|
_mlir_libs/__init__.py
|
|
ir.py
|
|
passmanager.py
|
|
dialects/_ods_common.py
|
|
)
|
|
|
|
declare_mlir_python_sources(MLIRPythonSources.ExecutionEngine
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
ADD_TO_PARENT MLIRPythonSources
|
|
SOURCES
|
|
execution_engine.py
|
|
SOURCES_GLOB
|
|
runtime/*.py
|
|
)
|
|
|
|
declare_mlir_python_sources(MLIRPythonSources.Passes
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
ADD_TO_PARENT MLIRPythonSources
|
|
SOURCES_GLOB
|
|
all_passes_registration/*.py
|
|
conversions/*.py
|
|
transforms/*.py
|
|
)
|
|
|
|
declare_mlir_python_sources(MLIRPythonCAPIHeaderSources
|
|
ROOT_DIR "${MLIR_SOURCE_DIR}/include"
|
|
SOURCES_GLOB "mlir-c/*.h"
|
|
DEST_PREFIX "_mlir_libs/include"
|
|
)
|
|
|
|
################################################################################
|
|
# Dialect bindings
|
|
################################################################################
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/AsyncOps.td
|
|
SOURCES_GLOB dialects/async_dialect/*.py
|
|
DIALECT_NAME async_dialect)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/BuiltinOps.td
|
|
SOURCES
|
|
dialects/builtin.py
|
|
dialects/_builtin_ops_ext.py
|
|
DIALECT_NAME builtin)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/GPUOps.td
|
|
SOURCES_GLOB dialects/gpu/*.py
|
|
DIALECT_NAME gpu)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/LinalgOps.td
|
|
SOURCES
|
|
dialects/_linalg_ops_ext.py
|
|
SOURCES_GLOB
|
|
dialects/linalg/*.py
|
|
DIALECT_NAME linalg
|
|
DEPENDS LinalgOdsGen)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/MathOps.td
|
|
SOURCES dialects/math.py
|
|
DIALECT_NAME math)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/ArithmeticOps.td
|
|
SOURCES
|
|
dialects/arith.py
|
|
dialects/_arith_ops_ext.py
|
|
DIALECT_NAME arith)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/MemRefOps.td
|
|
SOURCES
|
|
dialects/memref.py
|
|
dialects/_memref_ops_ext.py
|
|
DIALECT_NAME memref)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/SCFOps.td
|
|
SOURCES
|
|
dialects/scf.py
|
|
dialects/_scf_ops_ext.py
|
|
DIALECT_NAME scf)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/ShapeOps.td
|
|
SOURCES dialects/shape.py
|
|
DIALECT_NAME shape)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/SparseTensorOps.td
|
|
SOURCES dialects/sparse_tensor.py
|
|
DIALECT_NAME sparse_tensor)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/StandardOps.td
|
|
SOURCES
|
|
dialects/std.py
|
|
dialects/_std_ops_ext.py
|
|
DIALECT_NAME std)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/TensorOps.td
|
|
SOURCES dialects/tensor.py
|
|
DIALECT_NAME tensor)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/TosaOps.td
|
|
SOURCES dialects/tosa.py
|
|
DIALECT_NAME tosa)
|
|
|
|
declare_mlir_dialect_python_bindings(
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
TD_FILE dialects/VectorOps.td
|
|
SOURCES dialects/vector.py
|
|
DIALECT_NAME vector)
|
|
|
|
################################################################################
|
|
# Python extensions.
|
|
# The sources for these are all in lib/Bindings/Python, but since they have to
|
|
# be rebuilt for each package and integrate with the source setup here, we
|
|
# just reference them here instead of having ordered, cross package target
|
|
# dependencies.
|
|
################################################################################
|
|
|
|
set(PYTHON_SOURCE_DIR "${MLIR_SOURCE_DIR}/lib/Bindings/Python")
|
|
declare_mlir_python_extension(MLIRPythonExtension.Core
|
|
MODULE_NAME _mlir
|
|
ADD_TO_PARENT MLIRPythonSources.Core
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
DialectLinalg.cpp # TODO: Break this out.
|
|
DialectSparseTensor.cpp # TODO: Break this out.
|
|
MainModule.cpp
|
|
IRAffine.cpp
|
|
IRAttributes.cpp
|
|
IRCore.cpp
|
|
IRInterfaces.cpp
|
|
IRModule.cpp
|
|
IRTypes.cpp
|
|
PybindUtils.cpp
|
|
Pass.cpp
|
|
|
|
# Headers must be included explicitly so they are installed.
|
|
Dialects.h
|
|
Globals.h
|
|
IRModule.h
|
|
Pass.h
|
|
PybindUtils.h
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIDebug
|
|
MLIRCAPIIR
|
|
MLIRCAPIInterfaces
|
|
MLIRCAPIRegistration # TODO: See about dis-aggregating
|
|
|
|
# Dialects
|
|
MLIRCAPILinalg # TODO: Remove when above is removed.
|
|
MLIRCAPISparseTensor # TODO: Remove when above is removed.
|
|
MLIRCAPIStandard
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.AllPassesRegistration
|
|
MODULE_NAME _mlirAllPassesRegistration
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
AllPassesRegistration.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIConversion
|
|
MLIRCAPITransforms
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.AsyncDialectPasses
|
|
MODULE_NAME _mlirAsyncPasses
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects.async_dialect
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
AsyncPasses.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIAsync
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.Conversions
|
|
MODULE_NAME _mlirConversions
|
|
ADD_TO_PARENT MLIRPythonSources.Passes
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
Conversions/Conversions.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIConversion
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.ExecutionEngine
|
|
MODULE_NAME _mlirExecutionEngine
|
|
ADD_TO_PARENT MLIRPythonSources.ExecutionEngine
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
ExecutionEngineModule.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCEXECUTIONENGINE
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.GPUDialectPasses
|
|
MODULE_NAME _mlirGPUPasses
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects.gpu
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
GPUPasses.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIGPU
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.LinalgPasses
|
|
MODULE_NAME _mlirLinalgPasses
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects.linalg
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
LinalgPasses.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPILinalg
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.SparseTensorDialectPasses
|
|
MODULE_NAME _mlirSparseTensorPasses
|
|
ADD_TO_PARENT MLIRPythonSources.Dialects.sparse_tensor
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
SparseTensorPasses.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPISparseTensor
|
|
)
|
|
|
|
declare_mlir_python_extension(MLIRPythonExtension.Transforms
|
|
MODULE_NAME _mlirTransforms
|
|
ADD_TO_PARENT MLIRPythonSources.Passes
|
|
ROOT_DIR "${PYTHON_SOURCE_DIR}"
|
|
SOURCES
|
|
Transforms/Transforms.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPITransforms
|
|
)
|
|
|
|
# TODO: Figure out how to put this in the test tree.
|
|
# This should not be included in the main Python extension. However,
|
|
# putting it into MLIRPythonTestSources along with the dialect declaration
|
|
# above confuses Python module loader when running under lit.
|
|
set(_ADDL_TEST_SOURCES)
|
|
if(MLIR_INCLUDE_TESTS)
|
|
set(_ADDL_TEST_SOURCES MLIRPythonTestSources)
|
|
declare_mlir_python_sources(MLIRPythonTestSources)
|
|
declare_mlir_python_sources(MLIRPythonTestSources.Dialects
|
|
ADD_TO_PARENT MLIRPythonTestSources)
|
|
|
|
# TODO: this uses a tablegen file from the test directory and should be
|
|
# decoupled from here.
|
|
declare_mlir_python_sources(
|
|
MLIRPythonTestSources.Dialects.PythonTest
|
|
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/mlir"
|
|
ADD_TO_PARENT MLIRPythonTestSources.Dialects
|
|
SOURCES dialects/python_test.py)
|
|
set(LLVM_TARGET_DEFINITIONS
|
|
"${MLIR_MAIN_SRC_DIR}/test/python/python_test_ops.td")
|
|
mlir_tablegen(
|
|
"dialects/_python_test_ops_gen.py"
|
|
-gen-python-op-bindings
|
|
-bind-dialect=python_test)
|
|
add_public_tablegen_target(PythonTestDialectPyIncGen)
|
|
declare_mlir_python_sources(
|
|
MLIRPythonTestSources.Dialects.PythonTest.ops_gen
|
|
ROOT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
|
|
ADD_TO_PARENT MLIRPythonTestSources.Dialects.PythonTest
|
|
SOURCES "dialects/_python_test_ops_gen.py")
|
|
|
|
declare_mlir_python_extension(MLIRPythonTestSources.PythonTestExtension
|
|
MODULE_NAME _mlirPythonTest
|
|
ADD_TO_PARENT MLIRPythonTestSources.Dialects
|
|
ROOT_DIR "${MLIR_SOURCE_DIR}/test/python/lib"
|
|
SOURCES
|
|
PythonTestModule.cpp
|
|
PRIVATE_LINK_LIBS
|
|
LLVMSupport
|
|
EMBED_CAPI_LINK_LIBS
|
|
MLIRCAPIPythonTestDialect
|
|
)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Common CAPI dependency DSO.
|
|
# All python extensions must link through one DSO which exports the CAPI, and
|
|
# this must have a globally unique name amongst all embeddors of the python
|
|
# library since it will effectively have global scope.
|
|
#
|
|
# The presence of this aggregate library is part of the long term plan, but its
|
|
# use needs to be made more flexible.
|
|
#
|
|
# TODO: Upgrade to the aggregate utility in https://reviews.llvm.org/D106419
|
|
# once ready.
|
|
################################################################################
|
|
|
|
add_mlir_python_common_capi_library(MLIRPythonCAPI
|
|
INSTALL_COMPONENT MLIRPythonModules
|
|
INSTALL_DESTINATION python_packages/mlir_core/mlir/_mlir_libs
|
|
OUTPUT_DIRECTORY "${MLIR_BINARY_DIR}/python_packages/mlir_core/mlir/_mlir_libs"
|
|
RELATIVE_INSTALL_ROOT "../../../.."
|
|
DECLARED_SOURCES
|
|
MLIRPythonSources
|
|
MLIRPythonExtension.AllPassesRegistration
|
|
${_ADDL_TEST_SOURCES}
|
|
)
|
|
|
|
################################################################################
|
|
# The fully assembled package of modules.
|
|
# This must come last.
|
|
################################################################################
|
|
|
|
add_mlir_python_modules(MLIRPythonModules
|
|
ROOT_PREFIX "${MLIR_BINARY_DIR}/python_packages/mlir_core/mlir"
|
|
INSTALL_PREFIX "python_packages/mlir_core/mlir"
|
|
DECLARED_SOURCES
|
|
MLIRPythonSources
|
|
MLIRPythonExtension.AllPassesRegistration
|
|
MLIRPythonCAPIHeaderSources
|
|
${_ADDL_TEST_SOURCES}
|
|
COMMON_CAPI_LINK_LIBS
|
|
MLIRPythonCAPI
|
|
)
|