|  | # 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() |