# 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

# On Windows, DLLs go to the runtime directory and import
# libraries go to the lib directory.
# TODO: We should really be dumping binaries into bin/ not
# tools/. This must line up with binaries built this way because
# DLLs must be in the same directory as the binary.
# See: https://github.com/openxla/iree/issues/11297
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/tools")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
if(WIN32)
  set(IREE_COMPILER_DYLIB_DIR "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
  set(IREE_COMPILER_DYLIB_INSTALL_PREFIX "bin/")
else()
  set(IREE_COMPILER_DYLIB_DIR "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
  set(IREE_COMPILER_DYLIB_INSTALL_PREFIX "lib/")
endif()

# Always build the C bindings, since the API is available apart from
# actually building the compiler.
add_subdirectory(bindings/c)

# The compiler implementation is gated on the global setting.
if(IREE_BUILD_COMPILER)
  # Force enable BUILD_SHARED_LIBS for the compiler if instructed.
  set(_IREE_ORIG_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
  if(IREE_COMPILER_BUILD_SHARED_LIBS)
    set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
  endif()

  # Must configure plugins before processing the compiler sources so that
  # the static link list can be set.
  iree_include_cmake_plugin_dirs(
    LOG_LABEL
      compiler
    BINARY_DIR
      "${IREE_BINARY_DIR}/compiler/plugins"
    PLUGIN_CMAKE_FILE
      "iree_compiler_plugin.cmake"
  )
  add_subdirectory(src)

  # Reset BUILD_SHARED_LIBS.
  set(BUILD_SHARED_LIBS ${_IREE_ORIG_BUILD_SHARED_LIBS} CACHE BOOL "" FORCE)

  # Copy Python packaging files to the build dir so that we can install from
  # there.
  if(IREE_BUILD_PYTHON_BINDINGS)
    configure_file(pyproject.toml pyproject.toml COPYONLY)
    configure_file(setup.py setup.py @ONLY)
    add_subdirectory(bindings/python)
  endif()

  # Post processing.
  get_property(_iree_compiler_dylib_depends GLOBAL PROPERTY IREE_COMPILER_DYLIB_DEPENDS)
  if(_iree_compiler_dylib_depends)
    add_dependencies(iree_compiler_API_SharedImpl ${_iree_compiler_dylib_depends})
  endif()
endif()

