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

if(IREE_BUILD_BENCHMARKS)
  iree_cc_binary(
    NAME
      iree-benchmark-executable
    SRCS
      "iree-benchmark-executable-main.c"
    DEPS
      iree::async::util::proactor_pool
      iree::base
      iree::base::threading
      iree::base::tooling::flags
      iree::hal
      iree::io::file_handle
      iree::modules::hal::types
      iree::testing::benchmark
      iree::tooling::device_util
      iree::tooling::function_io
      iree::vm
    COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
    INSTALL_COMPONENT IREETools-Runtime
  )

  iree_cc_binary(
    NAME
      iree-benchmark-module
    SRCS
      "iree-benchmark-module-main.cc"
    DEPS
      benchmark
      iree::base
      iree::base::tooling::flags
      iree::hal
      iree::hal::replay::recorder
      iree::modules::hal::types
      iree::tooling::context_util
      iree::tooling::device_util
      iree::tooling::function_io
      iree::tooling::process_results
      iree::vm
    COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
    INSTALL_COMPONENT IREETools-Runtime
  )
endif()

iree_cc_binary(
  NAME
    iree-as-module
  SRCS
    "iree-as-module-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::io::file_handle
    iree::vm::bytecode::assembler
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-check-module
  SRCS
    "iree-check-module-main.cc"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::hal::replay::recorder
    iree::modules::check
    iree::testing::gtest
    iree::tooling::context_util
    iree::tooling::device_util
    iree::vm
    iree::vm::bytecode::module
  TESTONLY
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
)

iree_cc_binary(
  NAME
    iree-convert-parameters
  SRCS
    "iree-convert-parameters-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::io::file_handle
    iree::io::formats::irpa
    iree::io::parameter_index
    iree::io::scope_map
    iree::tooling::parameter_util
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  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
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-create-parameters
  SRCS
    "iree-create-parameters-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::io::file_handle
    iree::io::formats::irpa
    iree::io::parameter_index
    iree::io::scope_map
    iree::io::stream
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  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::flatcc::parsing
    iree::io::file_handle
    iree::schemas::instruments
    iree::schemas::instruments::dispatch_def_c_fbs
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-dump-module
  SRCS
    "iree-dump-module-main.c"
  DEPS
    flatcc::runtime
    iree::base
    iree::base::tooling::flags
    iree::base::internal::flatcc::debugging
    iree::base::internal::flatcc::parsing
    iree::io::file_handle
    iree::schemas::bytecode_module_def_c_fbs
    iree::vm
    iree::vm::bytecode::module
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-dump-parameters
  SRCS
    "iree-dump-parameters-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::io::file_handle
    iree::io::parameter_index
    iree::io::scope_map
    iree::tooling::parameter_util
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-dump-replay
  SRCS
    "iree-dump-replay-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal::replay::dump
    iree::io::file_handle
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-run-replay
  SRCS
    "iree-run-replay-main.c"
  DEPS
    iree::async
    iree::async::util::proactor_pool
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::hal::replay::execute
    iree::io::file_handle
    iree::tooling::device_util
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

if(IREE_BUILD_BENCHMARKS)
  iree_cc_binary(
    NAME
      iree-benchmark-replay
    SRCS
      "iree-benchmark-replay-main.cc"
    DEPS
      benchmark
      iree::async
      iree::async::util::proactor_pool
      iree::base
      iree::base::tooling::flags
      iree::hal
      iree::hal::replay::execute
      iree::io::file_handle
      iree::tooling::device_util
    COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
    INSTALL_COMPONENT IREETools-Runtime
  )
endif()

iree_cc_binary(
  NAME
    iree-encode-parameters
  SRCS
    "iree-encode-parameters-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::hal::replay::recorder
    iree::io::file_handle
    iree::io::formats::irpa
    iree::io::parameter_index
    iree::io::parameter_index_provider
    iree::io::scope_map
    iree::io::stream
    iree::modules::hal
    iree::tooling::context_util
    iree::tooling::function_util
    iree::tooling::parameter_util
    iree::vm
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  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::path
    iree::io::file_handle
    iree::hal::local::elf::elf_module
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)
endif()  # IREE_HAL_EXECUTABLE_*_EMBEDDED_ELF

iree_cc_binary(
  NAME
    iree-profile
  SRCS
    "iree-profile-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::tooling::profile::commands
    iree::tooling::profile::help
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

if(IREE_HAL_DRIVER_AMDGPU)
  target_compile_definitions(iree-profile PRIVATE IREE_PROFILE_HAVE_AMDGPU_ATT=1)
  target_link_libraries(iree-profile PRIVATE iree::tooling::profile::att)
else()
  target_compile_definitions(iree-profile PRIVATE IREE_PROFILE_HAVE_AMDGPU_ATT=0)
endif()

install(
  PROGRAMS
    "iree-profile-render"
  DESTINATION
    bin
  COMPONENT
    IREETools-Runtime
)

install(
  DIRECTORY
    "${IREE_SOURCE_DIR}/runtime/src/iree/tooling/profile/render"
  DESTINATION
    "share/iree/profile"
  COMPONENT
    IREETools-Runtime
  FILES_MATCHING
    PATTERN "*.py"
)

iree_cc_binary(
  NAME
    iree-run-module
  SRCS
    "iree-run-module-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::hal
    iree::tooling::context_util
    iree::tooling::run_module
    iree::vm
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  INSTALL_COMPONENT IREETools-Runtime
)

iree_cc_binary(
  NAME
    iree-tokenize
  SRCS
    "iree-tokenize-main.c"
  DEPS
    iree::base
    iree::base::tooling::flags
    iree::base::internal::json
    iree::io::file_handle
    iree::tokenizer::tokenizer
    iree::tokenizer::format::huggingface::tokenizer_json
    iree::tokenizer::format::tiktoken::tiktoken
    iree::tokenizer::vocab
  COVERAGE ${IREE_ENABLE_RUNTIME_COVERAGE}
  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
  )

  iree_cc_binary(
    NAME
      iree-link
    SRCS
      "iree-link-main.cc"
    DEPS
      iree::compiler::bindings::c::headers
      iree::compiler::API::Impl
    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::tooling::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()
