Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

330 lines
12 KiB
CMake

################################################################################
#
# Copyright (C) 2016-2022 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
################################################################################
################################################################################
# Sample cmake usage:
# set(Tensile_LIBRARY_FORMAT <"msgpack"/"yaml">)
# set(Tensile_ROOT <path to Tensile folder>)
# find_package(Tensile <version> EXACT REQUIRED [HIP] PATHS ${Tensile_ROOT})
#
# get_target_property(TensileHost_INCLUDES TensileHost INCLUDE_DIRECTORIES)
# include_directories(${TensileHost_INCLUDES})
# target_link_libraries(<project name> TensileHost)
#
# TensileCreateLibraryFiles(<args...>)
#
include(CMakeParseArguments)
if(NOT DEFINED Tensile_ROOT)
# Compute the installation prefix relative to this file.
get_filename_component(Tensile_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(Tensile_PREFIX "${Tensile_PREFIX}" PATH)
if (WIN32)
execute_process(COMMAND "${Tensile_PREFIX}/bin/TensileGetPath.exe" OUTPUT_VARIABLE Tensile_ROOT)
else()
execute_process(COMMAND "${Tensile_PREFIX}/bin/TensileGetPath" OUTPUT_VARIABLE Tensile_ROOT)
endif()
endif()
list(APPEND CMAKE_MODULE_PATH "${Tensile_ROOT}/Source/cmake/")
list(APPEND CMAKE_MODULE_PATH "${Tensile_ROOT}/Source/")
if("HIP" IN_LIST Tensile_FIND_COMPONENTS)
set(TENSILE_USE_HIP ON CACHE BOOL "Use HIP")
else()
set(TENSILE_USE_HIP OFF CACHE BOOL "Use HIP")
endif()
if("LLVM" IN_LIST Tensile_FIND_COMPONENTS)
set(TENSILE_USE_LLVM ON CACHE BOOL "Use LLVM")
else()
set(TENSILE_USE_LLVM OFF CACHE BOOL "Use LLVM")
endif()
if("Client" IN_LIST Tensile_FIND_COMPONENTS)
if(TENSILE_USE_HIP AND TENSILE_USE_LLVM)
set(TENSILE_BUILD_CLIENT ON CACHE BOOL "Build Client")
elseif(Tensile_FIND_REQUIRED_Client)
message("Tensile client requires both Hip and LLVM.")
set(Tensile_FOUND false)
else()
set(TENSILE_BUILD_CLIENT OFF CACHE BOOL "Build Client")
endif()
else()
set(TENSILE_BUILD_CLIENT OFF CACHE BOOL "Build Client")
endif()
if("STATIC_ONLY" IN_LIST Tensile_FIND_COMPONENTS)
set(TENSILE_STATIC_ONLY ON CACHE BOOL "Disable exporting symbols from shared library.")
else()
set(TENSILE_STATIC_ONLY OFF CACHE BOOL "Disable exporting symbols from shared library.")
endif()
add_subdirectory("${Tensile_ROOT}/Source" "Tensile")
# Output target: ${Tensile_VAR_PREFIX}_LIBRARY_TARGET. Ensures that the libs get built in Tensile_OUTPUT_PATH/library.
# Output symbol: ${Tensile_VAR_PREFIX}_ALL_FILES. List of full paths of all expected library files in manifest.
function(TensileCreateLibraryFiles
Tensile_LOGIC_PATH
Tensile_OUTPUT_PATH
)
# Boolean options
set(options
MERGE_FILES
NO_MERGE_FILES
SHORT_FILE_NAMES
GENERATE_PACKAGE
SEPARATE_ARCHITECTURES
LAZY_LIBRARY_LOADING
KEEP_BUILD_TMP
)
# Single value settings
set(oneValueArgs
CODE_OBJECT_VERSION
COMPILER
COMPILER_PATH
EMBED_KEY
EMBED_LIBRARY
LIBRARY_FORMAT
TENSILE_ROOT
VAR_PREFIX
CPU_THREADS
VERBOSE
)
# Multi value settings
set(multiValueArgs
ARCHITECTURE
)
cmake_parse_arguments(Tensile "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(Tensile_UNPARSED_ARGUMENTS)
message(WARNING "Unrecognized arguments: ${Tensile_UNPARSED_ARGUMENTS}")
endif()
if(Tensile_KEYWORDS_MISSING_VALUES)
message(WARNING "Malformed arguments: ${Tensile_KEYWORDS_MISSING_VALUES}")
endif()
# Parse incoming options
if(Tensile_TENSILE_ROOT)
set(Script "${Tensile_TENSILE_ROOT}/bin/TensileCreateLibrary")
else()
set(Script "${Tensile_ROOT}/bin/TensileCreateLibrary")
endif()
message(STATUS "Tensile script: ${Script}")
# Older NO_MERGE_FILES flag overrides MERGE_FILES option.
if(Tensile_NO_MERGE_FILES)
set(Tensile_MERGE_FILES FALSE)
endif()
if(Tensile_MERGE_FILES)
set(Options ${Options} "--merge-files")
else()
set(Options ${Options} "--no-merge-files")
endif()
if(Tensile_SEPARATE_ARCHITECTURES)
set(Options ${Options} "--separate-architectures")
endif()
if(Tensile_LAZY_LIBRARY_LOADING)
set(Options ${Options} "--lazy-library-loading")
endif()
if(Tensile_GENERATE_PACKAGE)
set(Options ${Options} "--package-library")
endif()
if(Tensile_SHORT_FILE_NAMES)
set(Options ${Options} "--short-file-names")
else()
set(Options ${Options} "--no-short-file-names")
endif()
if(Tensile_KEEP_BUILD_TMP)
set(Options ${Options} "--keep-build-tmp")
endif()
if(Tensile_VERBOSE)
set(Options ${Options} "--verbose=${Tensile_VERBOSE}")
else()
set(Options ${Options} "--verbose=0")
endif()
if(Tensile_EMBED_LIBRARY)
set(Options ${Options} "--embed-library=${Tensile_EMBED_LIBRARY}")
endif()
if(Tensile_EMBED_KEY)
set(Options ${Options} "--embed-library-key=${Tensile_EMBED_KEY}")
endif()
if(Tensile_CODE_OBJECT_VERSION)
set(Options ${Options} "--code-object-version=${Tensile_CODE_OBJECT_VERSION}")
endif()
if(Tensile_COMPILER)
set(Options ${Options} "--cxx-compiler=${Tensile_COMPILER}")
endif()
if(Tensile_COMPILER_PATH)
set(Options ${Options} "--cmake-cxx-compiler=${Tensile_COMPILER_PATH}")
endif()
if(Tensile_CPU_THREADS)
set(Options ${Options} "--jobs=${Tensile_CPU_THREADS}")
endif()
if(Tensile_LIBRARY_FORMAT)
set(Options ${Options} "--library-format=${Tensile_LIBRARY_FORMAT}")
if(Tensile_LIBRARY_FORMAT MATCHES "yaml")
target_compile_definitions( TensileHost PUBLIC -DTENSILE_YAML=1)
endif()
endif()
if(Tensile_ARCHITECTURE)
string (REPLACE ";" "_" archString "${Tensile_ARCHITECTURE}")
# uses _ separator to avoid cmake ; list interpretation, either ; or _ decoded in TensileCreateLibrary
set(Options ${Options} "--architecture=${archString}")
endif()
if(Tensile_NO_ENUMERATE)
set(Options ${Options} "--no-enumerate")
endif()
set(CommandLine ${Script} ${Options} ${Tensile_LOGIC_PATH} ${Tensile_OUTPUT_PATH} HIP)
if (WIN32 OR (VIRTUALENV_BIN_DIR AND VIRTUALENV_PYTHON_EXENAME))
set(CommandLine ${VIRTUALENV_BIN_DIR}/${VIRTUALENV_PYTHON_EXENAME} ${CommandLine})
endif()
# Tensile relies on the tools from the path, so capture the configure time
# path. It would be better if this were explicit, but that would be a pretty
# big change.
set(ESC_PATH "$ENV{PATH}")
if(WIN32)
string(REPLACE ";" "$<SEMICOLON>" ESC_PATH "${ESC_PATH}")
endif()
set(ENV_PATH_ARG "PATH=${ESC_PATH}")
set(CommandLine
"${CMAKE_COMMAND}" -E env "PATH=${ESC_PATH}" --
${CommandLine})
message(STATUS "Tensile_CREATE_COMMAND: ${CommandLine}")
if(Tensile_EMBED_LIBRARY)
set(Tensile_EMBED_LIBRARY_SOURCE "${Tensile_OUTPUT_PATH}/library/${Tensile_EMBED_LIBRARY}.cpp")
endif()
if($ENV{TENSILE_SKIP_LIBRARY})
message(STATUS "Skipping build of ${Tensile_OUTPUT_PATH}")
else()
if(NOT Tensile_VAR_PREFIX)
set(Tensile_VAR_PREFIX TENSILE)
endif()
# Compute the manifest path using the same routing logic as TensileCreateLibrary.py
# libraryDir(): route by distinct base arch count, not raw arch string count.
# xnack variants of one arch (e.g. gfx90a:xnack+;gfx90a:xnack-) form a single-family
# shard and share a library/gfx90a/ subdirectory; truly multi-arch builds use library/.
set(_tensile_manifest_dir "${Tensile_OUTPUT_PATH}/library")
list(LENGTH Tensile_ARCHITECTURE _tensile_arch_count)
if(_tensile_arch_count GREATER 0)
# Collect unique base arch names (strip everything from ':' onwards).
set(_tensile_base_archs "")
foreach(_arch IN LISTS Tensile_ARCHITECTURE)
string(REGEX REPLACE ":.*$" "" _base "${_arch}")
list(APPEND _tensile_base_archs "${_base}")
endforeach()
list(REMOVE_DUPLICATES _tensile_base_archs)
list(LENGTH _tensile_base_archs _tensile_base_arch_count)
if(_tensile_base_arch_count EQUAL 1)
# Single base arch (possibly multiple xnack variants): use arch subdir.
list(GET _tensile_base_archs 0 _tensile_base_arch)
if(_tensile_arch_count EQUAL 1)
# Exactly one variant: use full dash-form arch name (e.g. gfx90a-xnack-).
list(GET Tensile_ARCHITECTURE 0 _tensile_single_arch)
string(REPLACE ":" "-" _tensile_arch_dir "${_tensile_single_arch}")
else()
# Multiple xnack variants of same arch: use base arch name (e.g. gfx90a).
set(_tensile_arch_dir "${_tensile_base_arch}")
endif()
set(_tensile_manifest_dir "${Tensile_OUTPUT_PATH}/library/${_tensile_arch_dir}")
endif()
endif()
set(Tensile_MANIFEST_FILE_PATH "${_tensile_manifest_dir}/TensileManifest.txt")
message(STATUS "Tensile_MANIFEST_FILE_PATH: ${Tensile_MANIFEST_FILE_PATH}")
if($ENV{ENABLE_ADDRESS_SANITIZER})
# Must populate LD_PRELOAD with ASAN runtime if ASAN is being used.
# Find the ASAN RT with compiler and update env for Tensile call.
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=libclang_rt.asan-x86_64.so
OUTPUT_VARIABLE ASAN_LIB_PATH
COMMAND_ECHO STDOUT)
string(STRIP ${ASAN_LIB_PATH} ASAN_LIB_PATH)
set(CommandLine ${CMAKE_COMMAND} -E env "'LD_PRELOAD=${ASAN_LIB_PATH}'" --
${CommandLine})
endif()
add_custom_command(
OUTPUT "${Tensile_OUTPUT_PATH}/library"
DEPENDS ${Tensile_LOGIC_PATH}
COMMAND ${CommandLine}
COMMENT "Generating libraries with TensileCreateLibrary"
# To normalize special command line char handling between platforms.
VERBATIM
# To see progress vs buffering when built with ninja.
USES_TERMINAL)
add_custom_target(${Tensile_VAR_PREFIX}_LIBRARY_TARGET
DEPENDS "${Tensile_OUTPUT_PATH}/library"
COMMAND ${CommandLine} "--verify-manifest"
COMMENT "Verifying files in ${Tensile_MANIFEST_FILE_PATH} were generated"
VERBATIM)
endif()
if(Tensile_EMBED_LIBRARY)
set_source_files_properties(${Tensile_EMBED_LIBRARY_SOURCE} PROPERTIES GENERATED TRUE)
add_library(${Tensile_EMBED_LIBRARY} ${Tensile_EMBED_LIBRARY_SOURCE})
target_link_libraries(${Tensile_EMBED_LIBRARY} PUBLIC TensileHost)
add_dependencies(${Tensile_EMBED_LIBRARY} ${Tensile_VAR_PREFIX}_LIBRARY_TARGET)
add_custom_command(
TARGET ${Tensile_EMBED_LIBRARY} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${Tensile_EMBED_LIBRARY_SOURCE}
"${Tensile_OUTPUT_PATH}/library"
DEPENDS ${Tensile_EMBED_LIBRARY_SOURCE}
VERBATIM)
endif()
endfunction()