blob: 86cdf4030322b93e0212475ee1c021c68eeee29b [file] [log] [blame]
# This is a standalone project for the creation of compiler API and tools
# packages. It is meant to be built directly and aggregates all other projects
# that make up the IREE compiler input surface area. As a standalone
# project intended for direct distribution, it hard-codes a number of important
# CMake settings for producing optimal binaries and packages.
cmake_minimum_required(VERSION 3.17...3.22)
if(POLICY CMP0068)
cmake_policy(SET CMP0068 NEW)
set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
endif()
if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()
if(POLICY CMP0077)
cmake_policy(SET CMP0077 NEW)
endif()
# Honor all visibility presets (please, please, pretty-please).
# This needs to be set as a default because some IREE dependencies specify
# a CMake min version of 3.0, which causes them to set it locally to OLD.
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
project(IREE_COMPILER_API LANGUAGES C CXX)
if(IREE_COMPILER_API_SUB_PROJECT)
# Building as part of a top-level IREE project.
message(STATUS "Building iree-compiler-api as part of IREE")
set(LLVM_MAIN_SRC_DIR "${IREE_SOURCE_DIR}/third_party/llvm-project/llvm")
set(LLVM_MAIN_BINARY_DIR "${IREE_BINARY_DIR}/third_party/llvm-project")
else()
# Standalone build.
message(STATUS "Building iree-compiler-api standalone")
set(IREE_COMPILER_API_STANDALONE ON)
set(IREE_BUILD_TESTS OFF) # Conflicts with our tests if we are top-level.
set(IREE_BUILD_SAMPLES OFF)
set(LLVM_EXTERNAL_MLIR_IREE_DIALECTS_SOURCE_DIR "${IREE_COMPILER_API_SOURCE_DIR}/../iree-dialects")
set(IREE_SOURCE_DIR "${IREE_COMPILER_API_SOURCE_DIR}/../..")
set(IREE_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/iree")
set(LLVM_MAIN_SRC_DIR "${IREE_COMPILER_API_SOURCE_DIR}/../../third_party/llvm-project/llvm")
set(LLVM_MAIN_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/llvm")
set(LLVM_EXTERNAL_MLIR_HLO_SOURCE_DIR "${IREE_COMPILER_API_SOURCE_DIR}/../../third_party/mlir-hlo")
if(${IREE_BUILD_TORCH_MLIR_SUPPORT})
set(LLVM_EXTERNAL_TORCH_MLIR_DIALECTS_SOURCE_DIR "${IREE_COMPILER_API_SOURCE_DIR}/../../third_party/torch-mlir-dialects")
endif()
# Resources generated on windows must have valid version numbers.
# See set_windows_version_resource_properties.
set(LLVM_VERSION_MAJOR 0)
set(LLVM_VERSION_MINOR 0)
set(LLVM_VERSION_PATCH 0)
set(PACKAGE_VERSION 0)
enable_testing()
endif()
message(STATUS "iree-compiler-api Directories:
IREE_COMPILER_API_SOURCE_DIR = ${IREE_COMPILER_API_SOURCE_DIR}
IREE_COMPILER_API_BINARY_DIR = ${IREE_COMPILER_API_BINARY_DIR}
IREE_SOURCE_DIR = ${IREE_SOURCE_DIR}
IREE_BINARY_DIR = ${IREE_BINARY_DIR}
LLVM_MAIN_SRC_DIR = ${LLVM_MAIN_SRC_DIR}
LLVM_MAIN_BINARY_DIR = ${LLVM_MAIN_BINARY_DIR}")
# LLVM dependent project directories.
set(LLD_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../lld)
set(LLD_MAIN_BINARY_DIR ${LLVM_MAIN_BINARY_DIR}/tools/lld)
set(MLIR_MAIN_SRC_DIR ${LLVM_MAIN_SRC_DIR}/../mlir)
set(MLIR_MAIN_BINARY_DIR "${LLVM_MAIN_BINARY_DIR}/tools/mlir")
# Configuration includes.
include(${IREE_SOURCE_DIR}/build_tools/cmake/iree_cmake_options.cmake)
include(${IREE_SOURCE_DIR}/build_tools/cmake/iree_external_cmake_options.cmake)
# CMake settings.
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_PLATFORM_NO_VERSIONED_SONAME ON)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
set(CMAKE_C_VISIBILITY_PRESET "hidden")
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")
# Hack system includes to account for LLVM not doing includes right.
# TODO: Fix this upstream. Each of these system include hacks is broken in
# a different way, so there is not an easy local fix. They should be removed
# one be one until this project builds. Since this is the first time all of this
# has been mashed together, this is disappointing but not unexpected.
macro(add_system_include_hack include_dir)
if("${include_dir}" STREQUAL "")
message(SEND_ERROR "Cannot add empty include dir (will kill tablegen): ${include_dir}")
endif()
include_directories(SYSTEM "${include_dir}")
endmacro()
add_system_include_hack(${LLVM_MAIN_SRC_DIR}/include)
add_system_include_hack(${LLVM_MAIN_BINARY_DIR}/include)
add_system_include_hack(${LLD_MAIN_SRC_DIR}/include)
add_system_include_hack(${LLD_MAIN_BINARY_DIR}/include)
add_system_include_hack(${MLIR_MAIN_SRC_DIR}/include)
add_system_include_hack(${MLIR_MAIN_BINARY_DIR}/include)
add_system_include_hack(${IREE_SOURCE_DIR})
add_system_include_hack(${IREE_BINARY_DIR})
add_system_include_hack(${LLVM_EXTERNAL_MLIR_IREE_DIALECTS_SOURCE_DIR}/include)
add_system_include_hack(${LLVM_MAIN_BINARY_DIR}/tools/iree-dialects/include)
add_system_include_hack(${LLVM_EXTERNAL_MLIR_HLO_SOURCE_DIR}/include)
add_system_include_hack(${LLVM_MAIN_BINARY_DIR}/tools/mlir-hlo/include)
if(${IREE_BUILD_TORCH_MLIR_SUPPORT})
add_system_include_hack(${LLVM_EXTERNAL_TORCH_MLIR_DIALECTS_SOURCE_DIR}/include)
add_system_include_hack(${LLVM_MAIN_BINARY_DIR}/tools/torch-mlir-dialects/include)
endif()
add_system_include_hack(${IREE_COMPILER_API_SOURCE_DIR}/include)
function(iree_compiler_target_includes target)
target_include_directories(${target} PUBLIC
$<BUILD_INTERFACE:${IREE_COMPILER_API_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${IREE_COMPILER_API_BINARY_DIR}/include>
)
endfunction()
# Common CMake module paths.
list(APPEND CMAKE_MODULE_PATH ${MLIR_MAIN_SRC_DIR}/cmake/modules)
list(APPEND CMAKE_MODULE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules)
# Configure Python3 deps so that everyone downstream of here latches to the same
# thing.
include(MLIRDetectPythonEnv)
mlir_configure_python_dev_packages()
# Include IREE and LLVM if building standalone.
if(IREE_COMPILER_API_STANDALONE)
iree_set_compiler_cmake_options()
iree_set_llvm_cmake_options()
iree_add_llvm_external_project(mlir-iree-dialects MLIR_IREE_DIALECTS ${LLVM_EXTERNAL_MLIR_IREE_DIALECTS_SOURCE_DIR})
iree_add_llvm_external_project(mlir-hlo MLIR_HLO ${LLVM_EXTERNAL_MLIR_HLO_SOURCE_DIR})
if(${IREE_BUILD_TORCH_MLIR_SUPPORT})
iree_add_llvm_external_project(torch-mlir-dialects TORCH_MLIR_DIALECTS ${LLVM_EXTERNAL_TORCH_MLIR_DIALECTS_SOURCE_DIR})
endif()
set(MLIR_ENABLE_BINDINGS_PYTHON ON)
# Required mlir-hlo settings.
# TODO: Consider removing this upstream and just using the main
# MLIR_ENABLE_BINDINGS_PYTHON option.
set(MHLO_ENABLE_BINDINGS_PYTHON ON)
# Required IREE settings.
set(IREE_BUILD_PYTHON_BINDINGS ON)
# Include LLVM.
message(STATUS "Configuring LLVM from (${LLVM_MAIN_SRC_DIR} into ${LLVM_MAIN_BINARY_DIR})...")
add_subdirectory("${LLVM_MAIN_SRC_DIR}" "${LLVM_MAIN_BINARY_DIR}" EXCLUDE_FROM_ALL)
# Include IREE.
message(STATUS "Configuring IREE from (${IREE_SOURCE_DIR} into ${IREE_BINARY_DIR}")
add_subdirectory("${IREE_SOURCE_DIR}" "${IREE_BINARY_DIR}" EXCLUDE_FROM_ALL)
endif()
# Sub-directories.
# Since building outside of the LLVM build system, setup options for local
# sources.
include(HandleLLVMOptions)
add_subdirectory(lib)
add_subdirectory(python)
add_subdirectory(unittests)