# Copyright Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT

# Auxiliary Overlay
#
# This project contains some odds and ends needed in order to complete
# assembly of a full SDK. This includes:
#
# * Various redirect files to account for where things live in the tree from
# a user perspective.
# * Symlinks to account for distribution-level layout changes.
# * Other hacks as needed.

cmake_minimum_required(VERSION 3.25)

project(therock-aux-overlay)

if(NOT WIN32)
  add_custom_target(symlinks ALL
    COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/bin"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "lib/llvm" "${CMAKE_CURRENT_BINARY_DIR}/llvm"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "lib/llvm/amdgcn" "${CMAKE_CURRENT_BINARY_DIR}/amdgcn"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdclang" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdflang" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdflang"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdclang++" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang++"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdclang-cl" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang-cl"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdclang-cpp" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang-cpp"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdlld" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdlld"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/amdllvm" "${CMAKE_CURRENT_BINARY_DIR}/bin/amdllvm"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "../lib/llvm/bin/offload-arch" "${CMAKE_CURRENT_BINARY_DIR}/bin/offload-arch"
  )
  # llvm and amdgcn are symlinks to directories; install(FILES) rejects
  # directories, so create the symlinks directly at install time.
  # Targets must match those created by the symlinks target above.
  # See https://github.com/ROCm/TheRock/issues/3714
  install(CODE "
    file(MAKE_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\")
    file(CREATE_LINK \"lib/llvm\"
      \"\${CMAKE_INSTALL_PREFIX}/llvm\" SYMBOLIC)
    file(CREATE_LINK \"lib/llvm/amdgcn\"
      \"\${CMAKE_INSTALL_PREFIX}/amdgcn\" SYMBOLIC)
  ")
  install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdflang"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang++"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang-cl"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdclang-cpp"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdlld"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/amdllvm"
    "${CMAKE_CURRENT_BINARY_DIR}/bin/offload-arch"
    DESTINATION bin
  )
endif()

install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/overlay/" DESTINATION ".")

# Generate distribution info.
string(JSON dist_info_json_str SET "{}"
  "dist_amdgpu_targets" "\"${GPU_TARGETS}\""
)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dist_info.json" "${dist_info_json_str}")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dist_info.json"
  DESTINATION "share/therock"
)

# ---------------------------------------------------------------------------
# TheRock manifest generation
# ---------------------------------------------------------------------------

find_package(Python3 COMPONENTS Interpreter REQUIRED)

set(THEROCK_MANIFEST_JSON "${CMAKE_CURRENT_BINARY_DIR}/therock_manifest.json")
set(THEROCK_MANIFEST_SCRIPT "${THEROCK_SOURCE_DIR}/build_tools/generate_therock_manifest.py")

set(_manifest_flag_args)
if(THEROCK_FLAG_SETTINGS_FILE)
  list(APPEND _manifest_flag_args --flag-settings "${THEROCK_FLAG_SETTINGS_FILE}")
endif()

if(THEROCK_PACKAGE_VERSION)
  list(APPEND _manifest_flag_args --rocm-package-version "${THEROCK_PACKAGE_VERSION}")
endif()

add_custom_command(
  OUTPUT "${THEROCK_MANIFEST_JSON}"
  COMMAND "${Python3_EXECUTABLE}" "${THEROCK_MANIFEST_SCRIPT}"
    -o "${THEROCK_MANIFEST_JSON}"
    ${_manifest_flag_args}
  WORKING_DIRECTORY "${THEROCK_SOURCE_DIR}"
  DEPENDS "${THEROCK_MANIFEST_SCRIPT}" "${THEROCK_SOURCE_DIR}/.gitmodules"
  COMMENT "Generating TheRock manifest"
  VERBATIM
)

add_custom_target(aux-overlay-manifest ALL DEPENDS "${THEROCK_MANIFEST_JSON}")

install(FILES "${THEROCK_MANIFEST_JSON}" DESTINATION "share/therock")
