@@ -114,10 +114,11 @@ endfunction()
114114# EMBED_CAPI_LINK_LIBS: Dependent CAPI libraries that this extension depends
115115# on. These will be collected for all extensions and put into an
116116# aggregate dylib that is linked against.
117+ # PYTHON_BINDINGS_LIBRARY: Either pybind11 or nanobind.
117118function (declare_mlir_python_extension name )
118119 cmake_parse_arguments (ARG
119120 ""
120- "ROOT_DIR;MODULE_NAME;ADD_TO_PARENT"
121+ "ROOT_DIR;MODULE_NAME;ADD_TO_PARENT;PYTHON_BINDINGS_LIBRARY "
121122 "SOURCES;PRIVATE_LINK_LIBS;EMBED_CAPI_LINK_LIBS"
122123 ${ARGN} )
123124
@@ -126,15 +127,20 @@ function(declare_mlir_python_extension name)
126127 endif ()
127128 set (_install_destination "src/python/${name} " )
128129
130+ if (NOT ARG_PYTHON_BINDINGS_LIBRARY)
131+ set (ARG_PYTHON_BINDINGS_LIBRARY "pybind11" )
132+ endif ()
133+
129134 add_library (${name} INTERFACE )
130135 set_target_properties (${name} PROPERTIES
131136 # Yes: Leading-lowercase property names are load bearing and the recommended
132137 # way to do this: https://gitlab.kitware.com/cmake/cmake/-/issues/19261
133- EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_EXTENSION_MODULE_NAME;mlir_python_EMBED_CAPI_LINK_LIBS;mlir_python_DEPENDS"
138+ EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_EXTENSION_MODULE_NAME;mlir_python_EMBED_CAPI_LINK_LIBS;mlir_python_DEPENDS;mlir_python_BINDINGS_LIBRARY "
134139 mlir_python_SOURCES_TYPE extension
135140 mlir_python_EXTENSION_MODULE_NAME "${ARG_MODULE_NAME} "
136141 mlir_python_EMBED_CAPI_LINK_LIBS "${ARG_EMBED_CAPI_LINK_LIBS} "
137142 mlir_python_DEPENDS ""
143+ mlir_python_BINDINGS_LIBRARY "${ARG_PYTHON_BINDINGS_LIBRARY} "
138144 )
139145
140146 # Set the interface source and link_libs properties of the target
@@ -223,12 +229,14 @@ function(add_mlir_python_modules name)
223229 elseif (_source_type STREQUAL "extension" )
224230 # Native CPP extension.
225231 get_target_property (_module_name ${sources_target} mlir_python_EXTENSION_MODULE_NAME)
232+ get_target_property (_bindings_library ${sources_target} mlir_python_BINDINGS_LIBRARY)
226233 # Transform relative source to based on root dir.
227234 set (_extension_target "${modules_target} .extension.${_module_name} .dso" )
228235 add_mlir_python_extension(${_extension_target} "${_module_name} "
229236 INSTALL_COMPONENT ${modules_target}
230237 INSTALL_DIR "${ARG_INSTALL_PREFIX} /_mlir_libs"
231238 OUTPUT_DIRECTORY "${ARG_ROOT_PREFIX} /_mlir_libs"
239+ PYTHON_BINDINGS_LIBRARY ${_bindings_library}
232240 LINK_LIBS PRIVATE
233241 ${sources_target}
234242 ${ARG_COMMON_CAPI_LINK_LIBS}
@@ -634,7 +642,7 @@ endfunction()
634642function (add_mlir_python_extension libname extname)
635643 cmake_parse_arguments (ARG
636644 ""
637- "INSTALL_COMPONENT;INSTALL_DIR;OUTPUT_DIRECTORY"
645+ "INSTALL_COMPONENT;INSTALL_DIR;OUTPUT_DIRECTORY;PYTHON_BINDINGS_LIBRARY "
638646 "SOURCES;LINK_LIBS"
639647 ${ARGN} )
640648 if (ARG_UNPARSED_ARGUMENTS)
@@ -644,9 +652,16 @@ function(add_mlir_python_extension libname extname)
644652 # The actual extension library produces a shared-object or DLL and has
645653 # sources that must be compiled in accordance with pybind11 needs (RTTI and
646654 # exceptions).
647- pybind11_add_module(${libname}
648- ${ARG_SOURCES}
649- )
655+ if (NOT DEFINED ARG_PYTHON_BINDINGS_LIBRARY OR ARG_PYTHON_BINDINGS_LIBRARY STREQUAL "pybind11" )
656+ pybind11_add_module(${libname}
657+ ${ARG_SOURCES}
658+ )
659+ elseif (ARG_PYTHON_BINDINGS_LIBRARY STREQUAL "nanobind" )
660+ nanobind_add_module(${libname}
661+ NB_DOMAIN mlir
662+ ${ARG_SOURCES}
663+ )
664+ endif ()
650665
651666 # The extension itself must be compiled with RTTI and exceptions enabled.
652667 # Also, some warning classes triggered by pybind11 are disabled.
0 commit comments