aboutsummaryrefslogtreecommitdiff
path: root/mlir/cmake/modules/AddMLIRPython.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/cmake/modules/AddMLIRPython.cmake')
-rw-r--r--mlir/cmake/modules/AddMLIRPython.cmake25
1 files changed, 24 insertions, 1 deletions
diff --git a/mlir/cmake/modules/AddMLIRPython.cmake b/mlir/cmake/modules/AddMLIRPython.cmake
index 208cbdd..fa6aec8 100644
--- a/mlir/cmake/modules/AddMLIRPython.cmake
+++ b/mlir/cmake/modules/AddMLIRPython.cmake
@@ -173,9 +173,32 @@ function(mlir_generate_type_stubs)
if(ARG_VERBOSE)
message(STATUS "Generating type-stubs outputs ${_generated_type_stubs}")
endif()
+
+ # If PYTHONPATH is set and points to the build location of the python package then when stubgen runs, _mlir will get
+ # imported twice and bad things will happen (e.g., Assertion `!instance && “PyGlobals already constructed”’).
+ # This happens because mlir is a namespace package and the importer/loader can't distinguish between
+ # mlir._mlir_libs._mlir and _mlir_libs._mlir imported from CWD.
+ # So try to filter out any entries in PYTHONPATH that end in "MLIR_BINDINGS_PYTHON_INSTALL_PREFIX/.."
+ # (e.g., python_packages/mlir_core/).
+ set(_pythonpath "$ENV{PYTHONPATH}")
+ cmake_path(CONVERT "${MLIR_BINDINGS_PYTHON_INSTALL_PREFIX}/.." TO_NATIVE_PATH_LIST _install_prefix NORMALIZE)
+ if(WIN32)
+ set(_path_sep ";")
+ set(_trailing_sep "\\")
+ else()
+ set(_path_sep ":")
+ set(_trailing_sep "/")
+ # `;` is the CMake list delimiter so Windows paths are automatically lists
+ # and Unix paths can be made into lists by replacing `:` with `;`
+ string(REPLACE "${_path_sep}" ";" _pythonpath "${_pythonpath}")
+ endif()
+ string(REGEX REPLACE "${_trailing_sep}$" "" _install_prefix "${_install_prefix}")
+ list(FILTER _pythonpath EXCLUDE REGEX "(${_install_prefix}|${_install_prefix}${_trailing_sep})$")
+ # Note, ${_pythonpath} is a list but "${_pythonpath}" is not a list - it's a string with ";" chars in it.
+ string(JOIN "${_path_sep}" _pythonpath ${_pythonpath})
add_custom_command(
OUTPUT ${_generated_type_stubs}
- COMMAND ${_nb_stubgen_cmd}
+ COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH="${_pythonpath}" ${_nb_stubgen_cmd}
WORKING_DIRECTORY "${CMAKE_CURRENT_FUNCTION_LIST_DIR}"
DEPENDS "${ARG_DEPENDS_TARGETS}"
DEPFILE "${_depfile}"