blob: 76caebb180cc68930e679e3937bf1569a86f26b0 [file] [log] [blame]
# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
################################################################################
# CAPI library using the LLVM build system.
#
# WARNING WILL ROBINSON!
# This does not look like the rest of IREE. It is directly using the upstream
# LLVM build system in order to create bundled compiler API binaries that
# are consistent with LLVM. Consult upstream CMake macros if you don't
# understand what this does.
################################################################################
include(AddLLVM)
include(AddMLIR)
include(AddMLIRPython)
# Specifies that all MLIR packages are co-located under npcomp.
# TODO: Add an upstream cmake param for this vs having a global here.
add_compile_definitions("MLIR_PYTHON_PACKAGE_PREFIX=iree.compiler.")
set(_PYTHON_BUILD_PREFIX "${IREE_BINARY_DIR}/compiler/bindings/python")
set(_PYTHON_INSTALL_PREFIX "python_packages/iree_compiler")
# HACK: This should not be necessary, but add_mlir_python_extension is
# accidentally closing over an errant include_directories from up-tree, so
# when built in-tree it is somehow working based on that. This will need
# to be fixed to capture the correct include directories in that macro.
include_directories(
"${IREE_SOURCE_DIR}/compiler/src"
"${IREE_SOURCE_DIR}/compiler/bindings/c"
"${IREE_SOURCE_DIR}/llvm-external-projects/iree-dialects/include"
"${IREE_SOURCE_DIR}/third_party/llvm-project/mlir/include"
"${IREE_SOURCE_DIR}/third_party/stablehlo/include"
"${IREE_SOURCE_DIR}/third_party/stablehlo"
)
# On Unixes, disable the creation of versioned/symlinked `.so` files. With
# this set, we just generate libIREECompilerAggregateCAPI.so vs making that
# a symlink to a versioned file right next to it. When packaging for Python,
# symlinks are duplicated, so this is pretty important. It is usually set at
# a toolchain level for dedicated Python builds, but is nice to override since
# it makes the build directory suitable for directly packaging.
set(CMAKE_PLATFORM_NO_VERSIONED_SONAME 1)
################################################################################
# Sources
################################################################################
declare_mlir_python_sources(IREEPythonSources)
declare_mlir_python_sources(IREEPythonSources.Dialects
ADD_TO_PARENT IREEPythonSources
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/FlowBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/flow.py
DIALECT_NAME flow
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/HALBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/hal.py
DIALECT_NAME hal
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/StreamBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/stream.py
DIALECT_NAME stream
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/UtilBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/util.py
DIALECT_NAME util
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/VMBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/vm.py
DIALECT_NAME vm
)
declare_mlir_dialect_python_bindings(
ADD_TO_PARENT IREEPythonSources.Dialects
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
TD_FILE dialects/IREEGPUBinding.td
GEN_ENUM_BINDINGS
SOURCES dialects/iree_gpu.py
DIALECT_NAME iree_gpu
)
declare_mlir_python_sources(IREECompilerAPIPythonCore
ADD_TO_PARENT IREEPythonSources
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
SOURCES
_package_test.py
api/__init__.py
api/ctypes_dl.py
)
# Note that some tools rely on optional features but we unconditionally
# include them because they are referenced from console scripts and
# other package metadata. They will detect mis-configuration and error
# accordingly at runtime.
declare_mlir_python_sources(IREECompilerAPIPythonTools
ADD_TO_PARENT IREEPythonSources
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/compiler"
SOURCES
__init__.py
tf.py
tflite.py
tools/__init__.py
tools/binaries.py
tools/core.py
tools/debugging.py
tools/tf.py
tools/tflite.py
tools/import_onnx/__main__.py
tools/ir_tool/__main__.py
tools/scripts/iree_compile/__main__.py
tools/scripts/iree_opt/__main__.py
)
# The Python bindings are monolithic and we don't have a good way for the
# torch plugin to contribute Python sources, so we just gate it here
# versus having more complicated indirection. May want to rethink this
# if others need it.
if(IREE_INPUT_TORCH)
declare_mlir_python_sources(IREEPythonSources.Torch.Importers
ADD_TO_PARENT IREEPythonSources
ROOT_DIR "${IREE_SOURCE_DIR}/third_party/torch-mlir/python/torch_mlir"
SOURCES
extras/fx_importer.py
extras/onnx_importer.py
)
endif()
################################################################################
# Extensions
################################################################################
declare_mlir_python_sources(IREECompilerPythonExtensions)
declare_mlir_python_extension(IREECompilerPythonExtensions.Registration
MODULE_NAME _site_initialize_0
ADD_TO_PARENT IREECompilerPythonExtensions
SOURCES
IREECompilerRegistration.cpp
EMBED_CAPI_LINK_LIBS
iree_compiler_API_SharedImpl
PRIVATE_LINK_LIBS
LLVMSupport
)
declare_mlir_python_extension(IREECompilerPythonExtensions.CompilerDialects
MODULE_NAME _ireeCompilerDialects
ADD_TO_PARENT IREECompilerPythonExtensions
SOURCES
IREECompilerDialectsModule.cpp
EMBED_CAPI_LINK_LIBS
iree_compiler_API_SharedImpl
PRIVATE_LINK_LIBS
LLVMSupport
)
################################################################################
# Generate packages and shared library
################################################################################
set(_SOURCE_COMPONENTS
# Local sources.
IREECompilerAPIPythonTools
IREECompilerPythonExtensions
IREEPythonSources
MLIRPythonSources.Core
# Core dialects.
MLIRPythonSources.Dialects.amdgpu
MLIRPythonSources.Dialects.arith
MLIRPythonSources.Dialects.builtin
MLIRPythonSources.Dialects.cf
MLIRPythonSources.Dialects.complex
MLIRPythonSources.Dialects.func
MLIRPythonSources.Dialects.gpu
MLIRPythonSources.Dialects.linalg
MLIRPythonSources.Dialects.llvm
MLIRPythonSources.Dialects.math
MLIRPythonSources.Dialects.memref
MLIRPythonSources.Dialects.pdl
MLIRPythonSources.Dialects.scf
MLIRPythonSources.Dialects.shape
MLIRPythonSources.Dialects.structured_transform
MLIRPythonSources.Dialects.tensor
MLIRPythonSources.Dialects.tosa
MLIRPythonSources.Dialects.transform
MLIRPythonSources.Dialects.transform.extras
MLIRPythonSources.Dialects.transform.interpreter
MLIRPythonSources.Dialects.vector
# iree-dialects project.
IREEDialectsPythonSources
IREEDialectsPythonExtensions
)
add_mlir_python_modules(IREECompilerPythonModules
ROOT_PREFIX "${_PYTHON_BUILD_PREFIX}/iree/compiler"
INSTALL_PREFIX "${_PYTHON_INSTALL_PREFIX}/iree/compiler"
DECLARED_SOURCES ${_SOURCE_COMPONENTS}
COMMON_CAPI_LINK_LIBS
iree_compiler_API_SharedImpl
)
################################################################################
# iree.build package
# This is a pure Python part of the namespace, not rooted under iree.compiler
# like the above. It is only using the same build support for compatibility
# with the existing development flow.
# If the build system for Python code is ever redone, this can just be
# source namespace in the project definition.
################################################################################
# The iree.build package.
declare_mlir_python_sources(IREECompilerBuildPythonPackage
ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/iree/build"
SOURCES
__init__.py
__main__.py
args.py
compile_actions.py
executor.py
lang.py
main.py
metadata.py
net_actions.py
onnx_actions.py
target_machine.py
)
add_mlir_python_modules(IREECompilerBuildPythonModules
ROOT_PREFIX "${_PYTHON_BUILD_PREFIX}/iree/build"
INSTALL_PREFIX "${_PYTHON_INSTALL_PREFIX}/iree/build"
DECLARED_SOURCES
IREECompilerBuildPythonPackage
)
add_dependencies(IREECompilerPythonModules IREECompilerBuildPythonModules)
################################################################################
# Tools linked against the shared CAPI library
################################################################################
function(add_iree_compiler_busybox_tool target)
cmake_parse_arguments(ARG
""
"OUTPUT_NAME"
"SRCS"
${ARGN})
add_executable(
${target}
${ARG_SRCS}
)
target_link_libraries(${target}
iree_compiler_bindings_c_headers
iree_compiler_API_Impl)
set_target_properties(${target}
PROPERTIES
OUTPUT_NAME "${ARG_OUTPUT_NAME}"
RUNTIME_OUTPUT_DIRECTORY "${_PYTHON_BUILD_PREFIX}/iree/compiler/_mlir_libs"
)
mlir_python_setup_extension_rpath(${target})
add_dependencies(IREECompilerPythonModules ${target})
install(TARGETS ${target}
DESTINATION "${_PYTHON_INSTALL_PREFIX}/iree/compiler/_mlir_libs"
)
endfunction()
add_iree_compiler_busybox_tool(
IREECompilerIREECompileTool
OUTPUT_NAME iree-compile
SRCS
IREECompileTool.c
)
add_iree_compiler_busybox_tool(
IREECompilerIREEOptTool
OUTPUT_NAME iree-opt
SRCS
IREEOptTool.c
)
if(TARGET lld)
add_iree_compiler_busybox_tool(
IREECompilerLldTool
OUTPUT_NAME iree-lld
SRCS
LldTool.c
)
endif()
################################################################################
# libIREECompiler.so dylib tree
# We copy the compiler shared library and its related files to both the build
# and install tree for consistency. Note that on Windows, this is load bearing
# since the DLL must be colocated in the same directory. On Unix, CMake's
# automatic RPATH handling in the build tree will cause binaries to resolve
# against the project level library, so this is just cosmetic, but it does
# have the side effect of making the Python build tree relocatable and making
# logic that expects to find the compiler libraries in a consistent place
# simple. Since a symlink is used on Unix and it is not the versioned dylib,
# the realpath will still be the build-tree wide shared library. This also means
# that any tools or files that must be colocated with the dylib will come from
# the project-wide location.
################################################################################
# Copy compiler dylib files into the python _mlir_libs tree so that the
# binaries can find them with a relative rpath.
get_property(_dylib_relpaths GLOBAL PROPERTY IREE_COMPILER_DYLIB_RELPATHS)
set(_dylib_copy_commands)
set(_dylib_target_files)
set(_dylib_src_files)
foreach (_dylib_relpath ${_dylib_relpaths})
set(_dylib_srcpath "${IREE_COMPILER_DYLIB_DIR}/${_dylib_relpath}")
set(_dylib_outputpath "${_PYTHON_BUILD_PREFIX}/iree/compiler/_mlir_libs/${_dylib_relpath}")
cmake_path(GET _dylib_outputpath PARENT_PATH _parent_dir)
file(MAKE_DIRECTORY "${_parent_dir}")
list(APPEND _dylib_copy_commands
COMMAND ${CMAKE_COMMAND} -E create_symlink
"${_dylib_srcpath}" "${_dylib_outputpath}"
)
list(APPEND _dylib_target_files "${_dylib_outputpath}")
list(APPEND _dylib_src_files "${_dylib_srcpath}")
cmake_path(GET _dylib_relpath PARENT_PATH _dylib_install_destination)
install(FILES "${_dylib_srcpath}"
DESTINATION "${_PYTHON_INSTALL_PREFIX}/iree/compiler/_mlir_libs/${_dylib_install_destination}"
)
endforeach()
add_custom_command(
OUTPUT ${_dylib_target_files}
DEPENDS ${_dylib_src_files}
POST_BUILD
${_dylib_copy_commands}
)
add_custom_target(IREECompilerPythonDylibFiles
DEPENDS ${_dylib_target_files}
)
add_dependencies(IREECompilerPythonModules IREECompilerPythonDylibFiles)
################################################################################
# Subdirectories
################################################################################
add_subdirectory(test)