Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion mlir/cmake/modules/AddMLIRPython.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down