blob: 9e2c20f8098d49506d6cc51815943c8bb2712ca7 [file] [log] [blame]
# Copyright 2019 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
# Special case package namespace for tools/ -> "" (empty string)
# For example, tools/iree-compile -> iree-compile (no namespace)
set(IREE_PACKAGE_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}")
# Tools IREE provides for compiling, executing, and benchmarking programs, as
# well as other utilities.
#
# Only binary targets and their associated main files should go in this
# directory. Library targets and header files should be placed in the
# appropriate subtree, e.g. `compiler/src/iree/compiler/Tools/`.
#
# Compiler tools are designed to run on host platforms (Linux, macOS, Windows),
# so they are only built when IREE_BUILD_COMPILER is set and are tagged
# "hostonly". When cross-compiling (or generally wanting to use already-built
# compiler tools), set the IREE_HOST_BIN_DIR CMake option.
#
# This file does not use bazel_to_cmake because of special logic throughout.
# Write some important CMake options to a file for convenient use from scripts.
configure_file(build_config_template.txt.in build_config.txt)
# If cross-compiling and not building the compiler, then attempt to find
# the compiler tools.
# This is actual broken because the situation is tri-state:
# 1. Cross-compiling with no built compiler: Should work the same as
# IREE_BUILD_COMPILER=OFF in a host build (i.e. nothing depending
# on the compiler should be built).
# 2. Cross-compiling with a compiler built for the target: Anything
# on the host which needs the compiler, still must have host tools.
# 3. Normal host build.
# This simplistic setup makes #2 impossible and it overloads #1 to
# also support building things that depend on the compiler. The targets
# need to be aliased/forked for host variants to fully support. For now
# we just make all of these as OPTIONAL and let things break if not set up
# right.
if(IREE_HOST_BIN_DIR AND NOT IREE_BUILD_COMPILER)
iree_import_binary(NAME iree-tblgen OPTIONAL)
iree_import_binary(NAME iree-compile OPTIONAL)
iree_import_binary(NAME iree-opt OPTIONAL)
iree_import_binary(NAME iree-run-mlir OPTIONAL)
iree_import_binary(NAME FileCheck OPTIONAL)
iree_import_binary(NAME not OPTIONAL)
iree_import_binary(NAME clang OPTIONAL)
iree_import_binary(NAME llvm-link OPTIONAL)
endif()
# For sub-directories, we want targets fully qualified relative to the
# root. But after, we want those in *this* directory to be unqualified
# (i.e. 'iree-compile').
set(IREE_PACKAGE_ROOT_PREFIX "iree/tools")
iree_add_all_subdirs()
set(IREE_PACKAGE_ROOT_PREFIX "")
# TODO(#6353): Tools has thread dependencies in gtest, benchmark, yaml, etc.
# This should be split between runtime/compiler with optional threading support.
if(NOT IREE_ENABLE_THREADING)
return()
endif()
iree_cc_binary(
NAME
iree-benchmark-executable
SRCS
"iree-benchmark-executable-main.c"
DEPS
iree::base
iree::base::internal::flags
iree::hal
iree::modules::hal::types
iree::testing::benchmark
iree::tooling::device_util
iree::tooling::function_io
iree::vm
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-benchmark-module
SRCS
"iree-benchmark-module-main.cc"
DEPS
benchmark
iree::base
iree::base::internal::flags
iree::hal
iree::modules::hal::types
iree::tooling::context_util
iree::tooling::device_util
iree::tooling::function_io
iree::vm
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-check-module
SRCS
"iree-check-module-main.cc"
DEPS
iree::base
iree::base::internal::file_io
iree::base::internal::flags
iree::hal
iree::modules::check
iree::testing::gtest
iree::tooling::context_util
iree::tooling::device_util
iree::vm
iree::vm::bytecode::module
TESTONLY
)
iree_cc_binary(
NAME
iree-convert-parameters
SRCS
"iree-convert-parameters-main.c"
DEPS
iree::base
iree::base::internal::file_io
iree::base::internal::flags
iree::hal
iree::io::formats::irpa
iree::io::parameter_index
iree::io::scope_map
iree::tooling::parameter_util
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-cpuinfo
SRCS
"iree-cpuinfo.c"
DEPS
iree::base
iree::base::internal::cpu
iree::schemas::cpu_data
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-create-parameters
SRCS
"iree-create-parameters-main.c"
DEPS
iree::base
iree::base::internal::file_io
iree::base::internal::flags
iree::hal
iree::io::formats::irpa
iree::io::parameter_index
iree::io::scope_map
iree::io::stream
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-dump-instruments
SRCS
"iree-dump-instruments-main.c"
DEPS
flatcc::runtime
iree::base
iree::base::internal::file_io
iree::base::internal::flatcc::parsing
iree::schemas::instruments
iree::schemas::instruments::dispatch_def_c_fbs
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-dump-module
SRCS
"iree-dump-module-main.c"
DEPS
flatcc::runtime
iree::base
iree::base::internal::file_io
iree::base::internal::flags
iree::base::internal::flatcc::debugging
iree::base::internal::flatcc::parsing
iree::schemas::bytecode_module_def_c_fbs
iree::vm::bytecode::module
INSTALL_COMPONENT IREETools-Runtime
)
iree_cc_binary(
NAME
iree-dump-parameters
SRCS
"iree-dump-parameters-main.c"
DEPS
iree::base
iree::base::internal::file_io
iree::base::internal::flags
iree::io::parameter_index
iree::io::scope_map
iree::tooling::parameter_util
INSTALL_COMPONENT IREETools-Runtime
)
# Only enable fatelf tool when we're compiling it in.
# Currently it requires that the host and target both support embedded ELFs as
# the ELF implementation is only compiled when the target supports it.
if(IREE_HAL_EXECUTABLE_LOADER_EMBEDDED_ELF OR
IREE_HAL_EXECUTABLE_PLUGIN_EMBEDDED_ELF)
iree_cc_binary(
NAME
iree-fatelf
SRCS
"iree-fatelf.c"
DEPS
iree::base
iree::base::internal::file_io
iree::base::internal::path
iree::hal::local::elf::elf_module
INSTALL_COMPONENT IREETools-Runtime
)
endif() # IREE_HAL_EXECUTABLE_*_EMBEDDED_ELF
iree_cc_binary(
NAME
iree-run-module
SRCS
"iree-run-module-main.c"
DEPS
iree::base
iree::base::internal::flags
iree::hal
iree::tooling::context_util
iree::tooling::run_module
iree::vm
INSTALL_COMPONENT IREETools-Runtime
)
if(IREE_BUILD_COMPILER)
if(IREE_LLVM_LINK_TARGET)
install(
TARGETS llvm-link
COMPONENT IREETools-CompilerExtra
RUNTIME DESTINATION bin
)
endif()
if(IREE_CLANG_TARGET)
install(
TARGETS clang
COMPONENT IREETools-CompilerExtra
RUNTIME DESTINATION bin
)
endif()
if(IREE_FILECHECK_TARGET)
install(
TARGETS FileCheck
COMPONENT IREETools-CompilerDev
RUNTIME DESTINATION bin
)
endif()
if(IREE_NOT_TARGET)
install(
TARGETS not
COMPONENT IREETools-CompilerDev
RUNTIME DESTINATION bin
)
endif()
# Tablegen binaries are special snowflakes among special snowflakes.
# They must be statically linked against internal LLVM libraries, and they
# therefore must not depend on anything outside of the upstream tablegen
# libraries. These targets are specially set up to link in the correct
# way. This is a necessary diversion from how Bazel deals with it (which
# must deep-link to everything to satisfy its checks).
iree_cc_binary(
NAME
iree-tblgen
SRCS
"iree-tblgen.cpp"
"${IREE_SOURCE_DIR}/compiler/src/iree/compiler/Dialect/VM/Tools/VMOpEncoderGen.cpp"
"${IREE_SOURCE_DIR}/compiler/src/iree/compiler/Dialect/VM/Tools/VMOpTableGen.cpp"
DEPS
LLVMSupport
MLIRTblgenLib
HOSTONLY
DISABLE_LLVM_LINK_LLVM_DYLIB
INSTALL_COMPONENT IREETools-CompilerDev
)
iree_cc_binary(
NAME
iree-compile
SRCS
"iree-compile-main.cc"
DEPS
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
DATA
${IREE_LLD_TARGET}
HOSTONLY
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
iree_cc_binary(
NAME
iree-reduce
SRCS
"iree-reduce.cc"
DEPS
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
DATA
${IREE_LLD_TARGET}
HOSTONLY
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
# Only build IREE's busybox lld if the backing LLVM has LLD enabled.
# Otherwise, it will build but fail at runtime saying that it is not
# supported, and this fouls up tools search heuristics.
if(IREE_LLD_TARGET)
iree_cc_binary(
NAME
iree-lld
SRCS
"iree-lld-main.cc"
DEPS
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
HOSTONLY
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
endif()
iree_cc_binary(
NAME
iree-opt
SRCS
"iree-opt-main.cc"
DEPS
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
DATA
${IREE_LLD_TARGET}
HOSTONLY
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
iree_cc_binary(
NAME
iree-mlir-lsp-server
SRCS
"iree-mlir-lsp-server.cc"
DEPS
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
iree_cc_binary(
NAME
iree-run-mlir
SRCS
"iree-run-mlir-main.cc"
DEPS
iree::base
iree::base::internal::flags
iree::compiler::bindings::c::headers
iree::compiler::API::Impl
iree::hal
iree::tooling::context_util
iree::tooling::device_util
iree::tooling::run_module
iree::vm
DATA
${IREE_LLD_TARGET}
HOSTONLY
SETUP_INSTALL_RPATH
INSTALL_COMPONENT IREETools-Compiler
)
# Ensure FileCheck and associated binaries get built. Tests don't have
# dependencies in CMake because they aren't targets. So until we fix that, we
# just force this to get built.
# Limiting this to when IREE_BUILD_TESTS is set prevents the installation
# below, which we use for cross-platform testing.
set_target_properties(FileCheck PROPERTIES EXCLUDE_FROM_ALL OFF)
set_target_properties(not PROPERTIES EXCLUDE_FROM_ALL OFF)
elseif(NOT IREE_HOST_BIN_DIR)
message(STATUS
"*Not* building or importing IREE's compiler tools.\n "
"Set IREE_BUILD_COMPILER to build them or IREE_HOST_BIN_DIR to "
"import them.")
endif()