[Mlir-commits] [mlir] 75ae846 - [mlir] Make Python bindings installable.

Stella Laurenzo llvmlistbot at llvm.org
Mon Oct 12 15:20:17 PDT 2020


Author: Stella Laurenzo
Date: 2020-10-12T15:17:03-07:00
New Revision: 75ae846de69cccd6ed66357f3ee3ad3301849d95

URL: https://github.com/llvm/llvm-project/commit/75ae846de69cccd6ed66357f3ee3ad3301849d95
DIFF: https://github.com/llvm/llvm-project/commit/75ae846de69cccd6ed66357f3ee3ad3301849d95.diff

LOG: [mlir] Make Python bindings installable.

* Links against libMLIR.so if the project is built for DYLIBs.
* Puts things in the right place in build and install time python/ trees so that RPaths line up.
* Adds install actions to install both the extension and sources.
* Copies py source files to the build directory to match (consistent layout between build/install time and one place to point a PYTHONPATH for tests and interactive use).
* Finally, "import mlir" from an installed LLVM just works.

Differential Revision: https://reviews.llvm.org/D89167

Added: 
    

Modified: 
    mlir/lib/Bindings/Python/CMakeLists.txt
    mlir/test/lit.cfg.py

Removed: 
    mlir/lib/Bindings/Python/unix_version.lds


################################################################################
diff  --git a/mlir/lib/Bindings/Python/CMakeLists.txt b/mlir/lib/Bindings/Python/CMakeLists.txt
index 0f03445c2711..f7b04fff7f63 100644
--- a/mlir/lib/Bindings/Python/CMakeLists.txt
+++ b/mlir/lib/Bindings/Python/CMakeLists.txt
@@ -1,3 +1,30 @@
+################################################################################
+# Copy python source tree.
+################################################################################
+
+set(PY_SRC_FILES
+  mlir/__init__.py
+)
+
+add_custom_target(MLIRBindingsPythonSources ALL
+  DEPENDS ${PY_SRC_FILES}
+)
+
+foreach(PY_SRC_FILE ${PY_SRC_FILES})
+  set(PY_DEST_FILE "${PROJECT_BINARY_DIR}/python/${PY_SRC_FILE}")
+  add_custom_command(
+    TARGET MLIRBindingsPythonSources PRE_BUILD
+    COMMENT "Copying python source ${PY_SRC_FILE} -> ${PY_DEST_FILE}"
+    DEPENDS "${PY_SRC_FILE}"
+    COMMAND "${CMAKE_COMMAND}" -E copy_if_
diff erent
+        "${CMAKE_CURRENT_SOURCE_DIR}/${PY_SRC_FILE}" "${PY_DEST_FILE}"
+  )
+endforeach()
+
+################################################################################
+# Build python extension
+################################################################################
+
 # Normally on unix-like platforms, extensions are built as "MODULE" libraries
 # and do not explicitly link to the python shared object. This allows for
 # some greater deployment flexibility since the extension will bind to
@@ -5,13 +32,15 @@
 # linker from erroring on undefined symbols, leaving this to (usually obtuse)
 # runtime errors. Building in "SHARED" mode with an explicit link to the
 # python libraries allows us to build with the expectation of no undefined
-# symbols, which is better for development.
-if(MLIR_PYTHON_BINDINGS_VERSION_LOCKED)
-  set(PYEXT_LINK_MODE SHARED)
-  set(PYEXT_LIBADD ${PYTHON_LIBRARIES})
-else()
+# symbols, which is better for development. Note that not all python
+# configurations provide build-time libraries to link against, in which
+# case, we fall back to MODULE linking.
+if(PYTHON_LIBRARIES STREQUAL "" OR NOT MLIR_PYTHON_BINDINGS_VERSION_LOCKED)
   set(PYEXT_LINK_MODE MODULE)
   set(PYEXT_LIBADD)
+else()
+  set(PYEXT_LINK_MODE SHARED)
+  set(PYEXT_LIBADD ${PYTHON_LIBRARIES})
 endif()
 
 # The actual extension library produces a shared-object or DLL and has
@@ -47,7 +76,14 @@ target_compile_options(MLIRBindingsPythonExtension PRIVATE
 # Configure the output to match python expectations.
 set_target_properties(
   MLIRBindingsPythonExtension PROPERTIES
-    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+    # Build-time RPath layouts require to be a directory one up from the
+    # binary root.
+    # TODO: Don't reference the LLVM_BINARY_DIR here: the invariant is that
+    # the output directory must be at the same level of the lib directory
+    # where libMLIR.so is installed. This is presently not optimal from a
+    # project separation perspective and a discussion on how to better
+    # segment MLIR libraries needs to happen.
+    LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/python
     OUTPUT_NAME "_mlir"
     PREFIX "${PYTHON_MODULE_PREFIX}"
     SUFFIX "${PYTHON_MODULE_SUFFIX}${PYTHON_MODULE_EXTENSION}"
@@ -61,15 +97,62 @@ set_target_properties(
 # TODO: Add a Windows .def file and figure out the right thing to do on MacOS.
 set_target_properties(
   MLIRBindingsPythonExtension PROPERTIES CXX_VISIBILITY_PRESET "hidden")
-if(NOT MSVC AND NOT APPLE)
-  set_target_properties(MLIRBindingsPythonExtension
-    PROPERTIES LINK_FLAGS
-    "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/unix_version.lds")
+
+set(PYEXT_DEPS)
+if(LLVM_BUILD_LLVM_DYLIB)
+  list(APPEND PYEXT_DEPS
+    # Depend on libMLIR.so first so that deps primarily come from the shared
+    # library.
+    MLIR
+  )
 endif()
 
-target_link_libraries(MLIRBindingsPythonExtension
-  PRIVATE
+# Full static dependencies are also added and will augment what is in the
+# shared lib if needed (or in fully static builds, will result in mondo-built
+# extension).
+list(APPEND PYEXT_DEPS
+  # Depend only on the MLIR C-API.
   MLIRCAPIIR
   MLIRCAPIRegistration
+)
+
+target_link_libraries(MLIRBindingsPythonExtension
+  PRIVATE
+  ${PYEXT_DEPS}
   ${PYEXT_LIBADD}
 )
+
+add_dependencies(MLIRBindingsPythonExtension MLIRBindingsPythonSources)
+llvm_setup_rpath(MLIRBindingsPythonExtension)
+
+################################################################################
+# Install
+################################################################################
+
+install(TARGETS MLIRBindingsPythonExtension
+  COMPONENT MLIRBindingsPythonExtension
+  LIBRARY DESTINATION python
+  ARCHIVE DESTINATION python
+  # NOTE: Even on DLL-platforms, extensions go in the lib directory tree.
+  RUNTIME DESTINATION python)
+
+# Note that we copy from the source tree just like for headers because
+# it will not be polluted with py_cache runtime artifacts (from testing and
+# such).
+install(
+  DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/mlir
+  DESTINATION python
+  COMPONENT MLIRBindingsPythonSources
+  FILES_MATCHING PATTERN "*.py"
+)
+
+if (NOT LLVM_ENABLE_IDE)
+  add_llvm_install_targets(
+    install-MLIRBindingsPythonExtension
+    DEPENDS MLIRBindingsPythonExtension
+    COMPONENT MLIRBindingsPythonExtension)
+  add_llvm_install_targets(
+    install-MLIRBindingsPythonSources
+    DEPENDS MLIRBindingsPythonSources
+    COMPONENT MLIRBindingsPythonSources)
+endif()

diff  --git a/mlir/lib/Bindings/Python/unix_version.lds b/mlir/lib/Bindings/Python/unix_version.lds
deleted file mode 100644
index b1e59a76229b..000000000000
--- a/mlir/lib/Bindings/Python/unix_version.lds
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  global: PyInit__mlir;
-  local: *;
-};

diff  --git a/mlir/test/lit.cfg.py b/mlir/test/lit.cfg.py
index 04dfaf449c89..67ca6692d10a 100644
--- a/mlir/test/lit.cfg.py
+++ b/mlir/test/lit.cfg.py
@@ -64,7 +64,7 @@
 
 # The following tools are optional
 tools.extend([
-    ToolSubst('%PYTHON', config.python_executable),
+    ToolSubst('%PYTHON', config.python_executable, unresolved='ignore'),
     ToolSubst('toy-ch1', unresolved='ignore'),
     ToolSubst('toy-ch2', unresolved='ignore'),
     ToolSubst('toy-ch3', unresolved='ignore'),
@@ -99,6 +99,11 @@
 # by copying/linking sources to build.
 if config.enable_bindings_python:
     llvm_config.with_environment('PYTHONPATH', [
-        os.path.join(config.mlir_src_root, "lib", "Bindings", "Python"),
-        os.path.join(config.mlir_obj_root, "lib", "Bindings", "Python"),
+        # TODO: Don't reference the llvm_obj_root here: the invariant is that
+        # the python/ must be at the same level of the lib directory
+        # where libMLIR.so is installed. This is presently not optimal from a
+        # project separation perspective and a discussion on how to better
+        # segment MLIR libraries needs to happen. See also
+        # lib/Bindings/Python/CMakeLists.txt for where this is set up.
+        os.path.join(config.llvm_obj_root, 'python'),
     ], append_path=True)


        


More information about the Mlir-commits mailing list