@@ -123,12 +123,12 @@ function(mlir_generate_type_stubs)
123
123
"IMPORT_PATHS;DEPENDS_TARGETS;OUTPUTS;DEPENDS_TARGET_SRC_DEPS"
124
124
${ARGN} )
125
125
126
- # for people installing a distro (e.g., pip install) of nanobind
126
+ # for people doing find_package( nanobind)
127
127
if (EXISTS ${nanobind_DIR} /../src/stubgen.py)
128
128
set (NB_STUBGEN "${nanobind_DIR} /../src/stubgen.py" )
129
129
elseif (EXISTS ${nanobind_DIR} /../stubgen.py)
130
130
set (NB_STUBGEN "${nanobind_DIR} /../stubgen.py" )
131
- # for people using nanobind git source tree (e.g., FetchContent_Declare and FetchContent_MakeAvailable)
131
+ # for people using FetchContent_Declare and FetchContent_MakeAvailable
132
132
elseif (EXISTS ${nanobind_SOURCE_DIR} /src/stubgen.py)
133
133
set (NB_STUBGEN "${nanobind_SOURCE_DIR} /src/stubgen.py" )
134
134
elseif (EXISTS ${nanobind_SOURCE_DIR} /stubgen.py)
@@ -226,10 +226,11 @@ endfunction()
226
226
# EMBED_CAPI_LINK_LIBS: Dependent CAPI libraries that this extension depends
227
227
# on. These will be collected for all extensions and put into an
228
228
# aggregate dylib that is linked against.
229
+ # PYTHON_BINDINGS_LIBRARY: Either pybind11 or nanobind.
229
230
function (declare_mlir_python_extension name )
230
231
cmake_parse_arguments (ARG
231
232
""
232
- "ROOT_DIR;MODULE_NAME;ADD_TO_PARENT"
233
+ "ROOT_DIR;MODULE_NAME;ADD_TO_PARENT;PYTHON_BINDINGS_LIBRARY "
233
234
"SOURCES;PRIVATE_LINK_LIBS;EMBED_CAPI_LINK_LIBS"
234
235
${ARGN} )
235
236
@@ -238,15 +239,20 @@ function(declare_mlir_python_extension name)
238
239
endif ()
239
240
set (_install_destination "src/python/${name} " )
240
241
242
+ if (NOT ARG_PYTHON_BINDINGS_LIBRARY)
243
+ set (ARG_PYTHON_BINDINGS_LIBRARY "pybind11" )
244
+ endif ()
245
+
241
246
add_library (${name} INTERFACE )
242
247
set_target_properties (${name} PROPERTIES
243
248
# Yes: Leading-lowercase property names are load bearing and the recommended
244
249
# way to do this: https://gitlab.kitware.com/cmake/cmake/-/issues/19261
245
- EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_EXTENSION_MODULE_NAME;mlir_python_EMBED_CAPI_LINK_LIBS;mlir_python_DEPENDS"
250
+ EXPORT_PROPERTIES "mlir_python_SOURCES_TYPE;mlir_python_EXTENSION_MODULE_NAME;mlir_python_EMBED_CAPI_LINK_LIBS;mlir_python_DEPENDS;mlir_python_BINDINGS_LIBRARY "
246
251
mlir_python_SOURCES_TYPE extension
247
252
mlir_python_EXTENSION_MODULE_NAME "${ARG_MODULE_NAME} "
248
253
mlir_python_EMBED_CAPI_LINK_LIBS "${ARG_EMBED_CAPI_LINK_LIBS} "
249
254
mlir_python_DEPENDS ""
255
+ mlir_python_BINDINGS_LIBRARY "${ARG_PYTHON_BINDINGS_LIBRARY} "
250
256
)
251
257
252
258
# Set the interface source and link_libs properties of the target
@@ -335,12 +341,14 @@ function(add_mlir_python_modules name)
335
341
elseif (_source_type STREQUAL "extension" )
336
342
# Native CPP extension.
337
343
get_target_property (_module_name ${sources_target} mlir_python_EXTENSION_MODULE_NAME)
344
+ get_target_property (_bindings_library ${sources_target} mlir_python_BINDINGS_LIBRARY)
338
345
# Transform relative source to based on root dir.
339
346
set (_extension_target "${modules_target} .extension.${_module_name} .dso" )
340
347
add_mlir_python_extension(${_extension_target} "${_module_name} "
341
348
INSTALL_COMPONENT ${modules_target}
342
349
INSTALL_DIR "${ARG_INSTALL_PREFIX} /_mlir_libs"
343
350
OUTPUT_DIRECTORY "${ARG_ROOT_PREFIX} /_mlir_libs"
351
+ PYTHON_BINDINGS_LIBRARY ${_bindings_library}
344
352
LINK_LIBS PRIVATE
345
353
${sources_target}
346
354
${ARG_COMMON_CAPI_LINK_LIBS}
@@ -745,69 +753,78 @@ endfunction()
745
753
function (add_mlir_python_extension libname extname)
746
754
cmake_parse_arguments (ARG
747
755
""
748
- "INSTALL_COMPONENT;INSTALL_DIR;OUTPUT_DIRECTORY"
756
+ "INSTALL_COMPONENT;INSTALL_DIR;OUTPUT_DIRECTORY;PYTHON_BINDINGS_LIBRARY "
749
757
"SOURCES;LINK_LIBS"
750
758
${ARGN} )
751
759
if (ARG_UNPARSED_ARGUMENTS)
752
760
message (FATAL_ERROR "Unhandled arguments to add_mlir_python_extension(${libname} , ... : ${ARG_UNPARSED_ARGUMENTS} " )
753
761
endif ()
754
762
755
763
# The extension itself must be compiled with RTTI and exceptions enabled.
756
- # Also, some warning classes triggered by nanobind are disabled.
764
+ # Also, some warning classes triggered by pybind11 are disabled.
757
765
set (eh_rtti_enable)
758
766
if (MSVC )
759
767
set (eh_rtti_enable /EHsc /GR)
760
768
elseif (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL)
761
769
set (eh_rtti_enable -frtti -fexceptions)
762
770
endif ()
763
771
764
- nanobind_add_module(${libname}
765
- NB_DOMAIN ${MLIR_BINDINGS_PYTHON_NB_DOMAIN}
766
- FREE_THREADED
767
- ${ARG_SOURCES}
768
- )
772
+ # The actual extension library produces a shared-object or DLL and has
773
+ # sources that must be compiled in accordance with pybind11 needs (RTTI and
774
+ # exceptions).
775
+ if (NOT DEFINED ARG_PYTHON_BINDINGS_LIBRARY OR ARG_PYTHON_BINDINGS_LIBRARY STREQUAL "pybind11" )
776
+ pybind11_add_module(${libname}
777
+ ${ARG_SOURCES}
778
+ )
779
+ elseif (ARG_PYTHON_BINDINGS_LIBRARY STREQUAL "nanobind" )
780
+ nanobind_add_module(${libname}
781
+ NB_DOMAIN ${MLIR_BINDINGS_PYTHON_NB_DOMAIN}
782
+ FREE_THREADED
783
+ ${ARG_SOURCES}
784
+ )
769
785
770
- if (NOT MLIR_DISABLE_CONFIGURE_PYTHON_DEV_PACKAGES
771
- AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
772
- # Avoid some warnings from upstream nanobind.
773
- # If a superproject set MLIR_DISABLE_CONFIGURE_PYTHON_DEV_PACKAGES, let
774
- # the super project handle compile options as it wishes.
775
- get_property (NB_LIBRARY_TARGET_NAME TARGET ${libname} PROPERTY LINK_LIBRARIES )
776
- target_compile_options (${NB_LIBRARY_TARGET_NAME}
777
- PRIVATE
778
- -Wall -Wextra -Wpedantic
779
- -Wno-c++98-compat-extra-semi
780
- -Wno-cast-qual
781
- -Wno-covered-switch-default
782
- -Wno-deprecated-literal-operator
783
- -Wno-nested-anon-types
784
- -Wno-unused-parameter
785
- -Wno-zero-length -array
786
- ${eh_rtti_enable} )
787
-
788
- target_compile_options (${libname}
789
- PRIVATE
790
- -Wall -Wextra -Wpedantic
791
- -Wno-c++98-compat-extra-semi
792
- -Wno-cast-qual
793
- -Wno-covered-switch-default
794
- -Wno-deprecated-literal-operator
795
- -Wno-nested-anon-types
796
- -Wno-unused-parameter
797
- -Wno-zero-length -array
798
- ${eh_rtti_enable} )
799
- endif ()
786
+ if (NOT MLIR_DISABLE_CONFIGURE_PYTHON_DEV_PACKAGES
787
+ AND (LLVM_COMPILER_IS_GCC_COMPATIBLE OR CLANG_CL))
788
+ # Avoid some warnings from upstream nanobind.
789
+ # If a superproject set MLIR_DISABLE_CONFIGURE_PYTHON_DEV_PACKAGES, let
790
+ # the super project handle compile options as it wishes.
791
+ get_property (NB_LIBRARY_TARGET_NAME TARGET ${libname} PROPERTY LINK_LIBRARIES )
792
+ target_compile_options (${NB_LIBRARY_TARGET_NAME}
793
+ PRIVATE
794
+ -Wall -Wextra -Wpedantic
795
+ -Wno-c++98-compat-extra-semi
796
+ -Wno-cast-qual
797
+ -Wno-covered-switch-default
798
+ -Wno-deprecated-literal-operator
799
+ -Wno-nested-anon-types
800
+ -Wno-unused-parameter
801
+ -Wno-zero-length -array
802
+ ${eh_rtti_enable} )
803
+
804
+ target_compile_options (${libname}
805
+ PRIVATE
806
+ -Wall -Wextra -Wpedantic
807
+ -Wno-c++98-compat-extra-semi
808
+ -Wno-cast-qual
809
+ -Wno-covered-switch-default
810
+ -Wno-deprecated-literal-operator
811
+ -Wno-nested-anon-types
812
+ -Wno-unused-parameter
813
+ -Wno-zero-length -array
814
+ ${eh_rtti_enable} )
815
+ endif ()
800
816
801
- if (APPLE )
802
- # NanobindAdaptors.h uses PyClassMethod_New to build `pure_subclass`es but nanobind
803
- # doesn't declare this API as undefined in its linker flags. So we need to declare it as such
804
- # for downstream users that do not do something like `-undefined dynamic_lookup`.
805
- # Same for the rest.
806
- target_link_options (${libname} PUBLIC
807
- "LINKER:-U,_PyClassMethod_New"
808
- "LINKER:-U,_PyCode_Addr2Location"
809
- "LINKER:-U,_PyFrame_GetLasti"
810
- )
817
+ if (APPLE )
818
+ # NanobindAdaptors.h uses PyClassMethod_New to build `pure_subclass`es but nanobind
819
+ # doesn't declare this API as undefined in its linker flags. So we need to declare it as such
820
+ # for downstream users that do not do something like `-undefined dynamic_lookup`.
821
+ # Same for the rest.
822
+ target_link_options (${libname} PUBLIC
823
+ "LINKER:-U,_PyClassMethod_New"
824
+ "LINKER:-U,_PyCode_Addr2Location"
825
+ "LINKER:-U,_PyFrame_GetLasti"
826
+ )
827
+ endif ()
811
828
endif ()
812
829
813
830
target_compile_options (${libname} PRIVATE ${eh_rtti_enable} )
@@ -845,11 +862,11 @@ function(add_mlir_python_extension libname extname)
845
862
if (WIN32 )
846
863
# On Windows, pyconfig.h (and by extension python.h) hardcode the version of the
847
864
# python library which will be used for linkage depending on the flavor of the build.
848
- # nanobind has a workaround which depends on the definition of Py_DEBUG (if Py_DEBUG
849
- # is not passed in as a compile definition, nanobind undefs _DEBUG when including
865
+ # pybind11 has a workaround which depends on the definition of Py_DEBUG (if Py_DEBUG
866
+ # is not passed in as a compile definition, pybind11 undefs _DEBUG when including
850
867
# python.h, so that the release python library would be used).
851
- # Since mlir uses nanobind , we can leverage their workaround by never directly
852
- # pyconfig.h or python.h and instead relying on the nanobind headers to include the
868
+ # Since mlir uses pybind11 , we can leverage their workaround by never directly
869
+ # pyconfig.h or python.h and instead relying on the pybind11 headers to include the
853
870
# necessary python headers. This results in mlir always linking against the
854
871
# release python library via the (undocumented) cmake property Python3_LIBRARY_RELEASE.
855
872
target_link_libraries (${libname} PRIVATE ${Python3_LIBRARY_RELEASE} )
0 commit comments