# Copyright 2023 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

cmake_minimum_required(VERSION 3.21...3.24)

project(IREE_PJRT)
cmake_policy(SET CMP0069 NEW)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(IREE_CXX_STANDARD ${CMAKE_CXX_STANDARD})

enable_testing()

# This project uses explicit symbol visibility.
set(CMAKE_C_VISIBILITY_PRESET "hidden")
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")

# All python binaries go into one tree.
set(IREE_PJRT_PYTHON_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/python")
set(IREE_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../..)

# Enable LTO if supported.
option(IREE_PJRT_ENABLE_LTO "Enable LTO (link time optimization) if supported" OFF)
include(CheckIPOSupported)
check_ipo_supported(RESULT _ireert_lto_supported OUTPUT error)
if(IREE_PJRT_ENABLE_LTO)
  if(_ireert_lto_supported)
    message(STATUS "Enabling LTO")
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ON)
  else()
    message(WARNING "LTO not supported by toolchain bit requested (ignored)")
  endif()
endif()

# Customize defaults.
# IREE_BUILD_COMPILER should be enabled to make target IREELLVMIncludeSetup available,
# which is required by PJRT dylib targets
option(IREE_BUILD_COMPILER "Enable compiler for runtime-library build" ON)
option(IREE_BUILD_SAMPLES "Disable samples for runtime-library build" OFF)

# Include IREE.
message(STATUS "Including IREE from ${IREE_ROOT_DIR}")
add_subdirectory("${IREE_ROOT_DIR}" "iree_core" EXCLUDE_FROM_ALL)

# Include local sources.
# Handle various global definitions that need to be set at the global
# toolchain level.
iree_setup_toolchain()

# Setup protoc and protobuf library
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
include(protobuf_cc_library)

add_subdirectory(src)
add_subdirectory(third_party/pjrt_c_api)

#-------------------------------------------------------------------------------
# Convenience test target.
#-------------------------------------------------------------------------------

add_custom_target(iree-pjrt-test-deps)

set(IREE_PJRT_CTEST_ARGS "-L;^iree_pjrt.+")
add_custom_target(iree-pjrt-run-tests
  COMMENT
    "Run IREE PJRT Tests"
    WORKING_DIRECTORY
    "${CMAKE_CURRENT_BINARY_DIR}"
  USES_TERMINAL
  VERBATIM
  COMMAND_EXPAND_LISTS
  COMMAND
    "${CMAKE_COMMAND}" -E echo
    "The 'iree-pjrt-run-tests' target is a helper for running ctest. For advanced"
    "options, build dependencies and invoke ctest independently as in:"
  COMMAND
    "${CMAKE_COMMAND}" -E echo
    "  (cd ${CMAKE_CURRENT_BINARY_DIR} && cmake --build . --target iree-pjrt-run-tests && ctest ${IREE_PJRT_CTEST_ARGS} --output-on-failure)"
  COMMAND
    "${CMAKE_COMMAND}" -E echo
    "Run tests in parallel by setting a variable like CTEST_PARALLEL_LEVEL=25."
  COMMAND
    "${CMAKE_CTEST_COMMAND}" ${IREE_PJRT_CTEST_ARGS} --output-on-failure
)
add_dependencies(iree-pjrt-run-tests iree-pjrt-test-deps)
