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

257 lines
11 KiB
CMake

# Copyright © Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
# The ROCm toolchain can be discovered by cmake if the ROCm bin/hipconfig and lib/llvm/bin/clang++
# programs are available in your system PATH.
#
# If the path does *not* contain those programs, the ROCM_CMAKE_PATH CMake variable can be set to
# the ROCM root folder to specify where CMake should look for the toolchains. E.g.:
#
# * Linux: cmake --preset release -DROCM_CMAKE_PATH="/opt/rocm"
# * Windows: cmake --preset release -DROCM_CMAKE_PATH="C:/AMD/ROCm/7.0"
#
# When ROCM_CMAKE_PATH is provided, the path will be updated to include the following folders during
# the toolchain discovery:
#
# * $ROCM_CMAKE_PATH/bin
# * $ROCM_CMAKE_PATH/lib/llvm/bin
#
# The above folders must be present on your system so that the toolchain system inspection can
# locate the following files:
#
# * $ROCM_CMAKE_PATH/bin/hipconfig
# * $ROCM_CMAKE_PATH/lib/llvm/bin/clang++
#
# ** To skip automatic detection** and force cmake to use hard-coded compiler names from a ROCm
# install, set ROCM_PATH instead of ROCM_CMAKE_PATH.
#
# DO NOT SET ROCM_PATH IN YOUR ENVIRONMENT. Setting ROCM_PATH in the environment will cause the
# compiler check to fail. Instead, use the -D option to cmake. E.g.:
#
# * Linux: cmake --preset release -DROCM_PATH="/opt/rocm"
# * Windows: cmake --preset release -DROCM_PATH="C:/AMD/ROCm/7.0"
#
# The CXX and HIP compilers will be set as $ROCM_PATH/lib/llvm/bin/clang++.
# Platform-specific compiler configuration
if(WIN32)
set(DEFAULT_ROCM_COMPILER_EXTENSION ".exe")
set(CMAKE_RC_COMPILER "CMAKE_RC_COMPILER-NOTREQUIRED")
# No suitable default on windows, use this as a possible example.
set(DEFAULT_ROCM_CMAKE_PATH "c:/dist/therock")
else()
# Can use /opt/rocm as the typical default install path on Linux
set(DEFAULT_ROCM_CMAKE_PATH "/opt/rocm")
endif()
# Common compiler configuration
set(DEFAULT_ROCM_LLVM_BIN_SUFFIX "/lib/llvm/bin")
message(
VERBOSE
"hipDNN-ClangToolChain start: CXX=${CMAKE_CXX_COMPILER} TOOLCHAIN_COMPLETED=${_ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED} ROCM_PATH=${ROCM_PATH} ROCM_CMAKE_PATH=${ROCM_CMAKE_PATH} ROCM_CMAKE_LLVM_BIN_PATH=${ROCM_CMAKE_LLVM_BIN_PATH}"
)
if(NOT _ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED)
if(DEFINED ROCM_PATH)
message(STATUS "ROCM_PATH provided: ${ROCM_PATH}")
elseif(DEFINED ROCM_CMAKE_HIPCONFIG_PATH)
set(TRY_TO_FIND_ROCM_PATH_USING_HIPCONFIG "TRUE")
message(STATUS "ROCM_CMAKE_HIPCONFIG_PATH provided: ${ROCM_CMAKE_HIPCONFIG_PATH}")
elseif(DEFINED ROCM_CMAKE_PATH)
message(STATUS "ROCM_CMAKE_PATH provided: ${ROCM_CMAKE_PATH}")
elseif(DEFINED ENV{ROCM_CMAKE_PATH})
set(ROCM_CMAKE_PATH $ENV{ROCM_CMAKE_PATH})
message(STATUS "ROCM_CMAKE_PATH set from environment: ${ROCM_CMAKE_PATH}")
else()
set(TRY_TO_FIND_ROCM_PATH_USING_HIPCONFIG "TRUE")
message(
STATUS
"No helper variables provided; attempting to detect ROCm path and hip package using system PATH and CMAKE_PREFIX_PATH."
)
endif()
endif()
# Prioritize the C/C++ compiler search to ROCm compiler names: clang/clang++.
set(CMAKE_CXX_COMPILER_NAMES clang++)
set(CMAKE_C_COMPILER_NAMES clang)
# Warn if ROCM_PATH is set in environment (can interfere with toolchain discovery).
if(DEFINED ENV{ROCM_PATH})
message(
WARNING "\nROCM_PATH is set in the environment and may interfere with toolchain detection. "
"Remove ROCM_PATH from the environment and use the following instead:\n"
" cmake -DROCM_PATH=$ENV{ROCM_PATH}\n\n"
)
endif()
if(NOT DEFINED ROCM_PATH AND NOT DEFINED ROCM_CMAKE_PATH AND TRY_TO_FIND_ROCM_PATH_USING_HIPCONFIG)
find_program(
HIPCONFIG_EXECUTABLE hipconfig PATHS ${ROCM_CMAKE_HIPCONFIG_PATH} ${ROCM_CMAKE_PATH}
${DEFAULT_ROCM_CMAKE_PATH} PATH_SUFFIXES "/bin"
)
if(HIPCONFIG_EXECUTABLE)
message(VERBOSE "Found hipconfig: ${HIPCONFIG_EXECUTABLE}")
# Try to detect ROCm path using hipconfig --rocmpath
if(HIPCONFIG_EXECUTABLE)
execute_process(
COMMAND ${HIPCONFIG_EXECUTABLE} --rocmpath
OUTPUT_VARIABLE DETECTED_ROCM_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE HIPCONFIG_RESULT
ERROR_QUIET
)
if(HIPCONFIG_RESULT EQUAL 0 AND DETECTED_ROCM_PATH)
set(ROCM_CMAKE_PATH "${DETECTED_ROCM_PATH}")
message(
STATUS
"Automatically detected ROCM_CMAKE_PATH using hipconfig: ${ROCM_CMAKE_PATH}"
)
else()
message(
STATUS
"hipconfig found but failed to detect ROCm path; relying on system PATH to locate ROCm toolchain."
)
endif()
execute_process(
COMMAND ${HIPCONFIG_EXECUTABLE} --hipclangpath
OUTPUT_VARIABLE DETECTED_HIP_CLANG_PATH OUTPUT_STRIP_TRAILING_WHITESPACE
RESULT_VARIABLE HIPCONFIG_RESULT ERROR_QUIET
)
if(HIPCONFIG_RESULT EQUAL 0 AND DETECTED_HIP_CLANG_PATH)
set(ROCM_CMAKE_LLVM_BIN_PATH "${DETECTED_HIP_CLANG_PATH}")
message(
STATUS
"Automatically detected ROCM_CMAKE_LLVM_BIN_PATH using hipconfig: ${ROCM_CMAKE_LLVM_BIN_PATH}"
)
else()
message(
STATUS
"hipconfig found but failed to detect ROCm clang path; relying on system PATH to locate ROCm toolchain."
)
endif()
endif()
else()
message(
STATUS
"hipconfig not found in PATH; relying on defaults, system PATH, and CMAKE_PREFIX_PATH to locate ROCm toolchain and HIP package."
)
endif()
endif()
if(DEFINED ROCM_CMAKE_PATH)
file(TO_NATIVE_PATH "${ROCM_CMAKE_PATH}/bin" ROCM_BIN_DIR)
if(EXISTS "${ROCM_BIN_DIR}")
# Check if ROCM_BIN_DIR is already in PATH Normalize both paths to ensure consistent
# delimiter comparison
file(TO_NATIVE_PATH "$ENV{PATH}" _normalized_env_path)
string(FIND "${_normalized_env_path}" "${ROCM_BIN_DIR}" _rocm_bin_in_path)
if(_rocm_bin_in_path EQUAL -1)
# Not in PATH, so add it
if(WIN32)
set(ENV{PATH} "${ROCM_BIN_DIR};$ENV{PATH}")
else()
set(ENV{PATH} "${ROCM_BIN_DIR}:$ENV{PATH}")
endif()
message(STATUS "Added ${ROCM_BIN_DIR} to system PATH for ROCm tool discovery")
else()
message(VERBOSE "ROCm bin directory already in system PATH: ${ROCM_BIN_DIR}")
endif()
unset(_rocm_bin_in_path)
unset(_normalized_env_path)
else()
message(FATAL_ERROR "ROCm bin directory does not exist: ${ROCM_BIN_DIR}")
endif()
if(ROCM_CMAKE_LLVM_BIN_PATH)
file(TO_NATIVE_PATH ${ROCM_CMAKE_LLVM_BIN_PATH} ROCM_LLVM_BIN_DIR)
else()
file(TO_NATIVE_PATH "${ROCM_CMAKE_PATH}/lib/llvm/bin" ROCM_LLVM_BIN_DIR)
endif()
if(EXISTS "${ROCM_LLVM_BIN_DIR}")
# Check if ROCM_LLVM_BIN_DIR is already in PATH Normalize both paths to ensure consistent
# delimiter comparison
file(TO_NATIVE_PATH "$ENV{PATH}" _normalized_env_path)
string(FIND "${_normalized_env_path}" "${ROCM_LLVM_BIN_DIR}" _rocm_bin_in_path)
if(_rocm_bin_in_path EQUAL -1)
# Not in PATH, so add it
if(WIN32)
set(ENV{PATH} "${ROCM_LLVM_BIN_DIR};$ENV{PATH}")
else()
set(ENV{PATH} "${ROCM_LLVM_BIN_DIR}:$ENV{PATH}")
endif()
message(STATUS "Added ${ROCM_LLVM_BIN_DIR} to system PATH for ROCm LLVM tool discovery")
else()
message(VERBOSE "ROCm LLVM bin directory already in system PATH: ${ROCM_LLVM_BIN_DIR}")
endif()
unset(_rocm_bin_in_path)
unset(_normalized_env_path)
else()
message(FATAL_ERROR "ROCm LLVM bin directory does not exist: ${ROCM_LLVM_BIN_DIR}")
endif()
endif()
# If ROCM_PATH is provided, explicitly set compilers (bypasses toolchain auto-discovery).
#
# Only use ROCM_PATH to hard-code the compiler if ROCM_CMAKE_PATH is not defined to ensure
# consistent behaviour when ROCM_PATH is set by an included package but the usr provided only
# ROCM_CMAKE_PATH.
if(DEFINED ROCM_PATH AND NOT DEFINED ROCM_CMAKE_PATH)
file(TO_NATIVE_PATH "${ROCM_PATH}${DEFAULT_ROCM_LLVM_BIN_SUFFIX}" ROCM_LLVM_BIN_DIR)
if(EXISTS ${ROCM_LLVM_BIN_DIR})
set(CMAKE_C_COMPILER ${ROCM_LLVM_BIN_DIR}/clang${DEFAULT_ROCM_COMPILER_EXTENSION})
set(CMAKE_CXX_COMPILER ${ROCM_LLVM_BIN_DIR}/clang++${DEFAULT_ROCM_COMPILER_EXTENSION})
message(STATUS "Using ROCm Clang compilers from ${ROCM_LLVM_BIN_DIR}")
else()
message(
FATAL_ERROR
"The directory ${ROCM_LLVM_BIN_DIR} does not exist. Cannot set ROCm Clang compilers."
)
endif()
# In case the toolchain is not in the system path, add the ROCm folder to the CMAKE_PREFIX_PATH
# so that find_package(hip) works.
if(NOT "${ROCM_PATH}" IN_LIST CMAKE_PREFIX_PATH)
list(PREPEND CMAKE_PREFIX_PATH "${ROCM_PATH}")
message(STATUS "Added ${ROCM_PATH} to CMAKE_PREFIX_PATH for finding HIP package")
else()
message(VERBOSE "ROCM_PATH already in CMAKE_PREFIX_PATH")
endif()
endif()
if(NOT _ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED)
# Validate that a compatible generator is being used
if(CMAKE_GENERATOR)
string(TOLOWER "${CMAKE_GENERATOR}" _generator_lower)
if(NOT (_generator_lower MATCHES "ninja" OR _generator_lower MATCHES "makefile"))
message(WARNING "\nIncompatible generator detected: '${CMAKE_GENERATOR}'\n"
"The ROCm Clang toolchain requires Ninja or Makefile generators.\n"
"Use \"cmake -G <generator>\" to select a compatible generator.\n"
)
endif()
unset(_generator_lower)
endif()
endif()
message(
VERBOSE
"hipDNN-ClangToolChain stop : CXX=${CMAKE_CXX_COMPILER} TOOLCHAIN_COMPLETED=${_ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED} ROCM_PATH=${ROCM_PATH} ROCM_CMAKE_PATH=${ROCM_CMAKE_PATH} ROCM_CMAKE_LLVM_BIN_PATH=${ROCM_CMAKE_LLVM_BIN_PATH}"
)
if(NOT _ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED)
set(_ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED TRUE)
# Forward variables to try_compile() so the toolchain file works correctly during compiler
# checks
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES ROCM_CMAKE_PATH ROCM_CMAKE_LLVM_BIN_PATH
_ROCM_CLANG_TOOLCHAIN_FIRST_RUN_COMPLETED
)
# Only forward ROCM_PATH to try_compile() if ROCM_CMAKE_PATH is not defined to ensure consistent
# behaviour when ROCM_PATH is set by an included package but the usr provided only
# ROCM_CMAKE_PATH.
if(DEFINED ROCM_PATH AND NOT DEFINED ROCM_CMAKE_PATH)
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES ROCM_PATH)
endif()
endif()