1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake) 5include(${CMAKE_ROOT}/Modules/CMakeParseImplicitLinkInfo.cmake) 6 7if( NOT ( ("${CMAKE_GENERATOR}" MATCHES "Make") OR 8 ("${CMAKE_GENERATOR}" MATCHES "Ninja") ) ) 9 message(FATAL_ERROR "HIP language not currently supported by \"${CMAKE_GENERATOR}\" generator") 10endif() 11 12 13if(NOT CMAKE_HIP_COMPILER) 14 set(CMAKE_HIP_COMPILER_INIT NOTFOUND) 15 16 # prefer the environment variable HIPCXX 17 if(NOT $ENV{HIPCXX} STREQUAL "") 18 if("$ENV{HIPCXX}" MATCHES "hipcc") 19 message(FATAL_ERROR 20 "The HIPCXX environment variable is set to the hipcc wrapper:\n" 21 " $ENV{HIPCXX}\n" 22 "This is not supported. Use Clang directly, or let CMake pick a default." 23 ) 24 endif() 25 get_filename_component(CMAKE_HIP_COMPILER_INIT $ENV{HIPCXX} PROGRAM PROGRAM_ARGS CMAKE_HIP_FLAGS_ENV_INIT) 26 if(CMAKE_HIP_FLAGS_ENV_INIT) 27 set(CMAKE_HIP_COMPILER_ARG1 "${CMAKE_HIP_FLAGS_ENV_INIT}" CACHE STRING "Arguments to CXX compiler") 28 endif() 29 if(NOT EXISTS ${CMAKE_HIP_COMPILER_INIT}) 30 message(FATAL_ERROR "Could not find compiler set in environment variable HIPCXX:\n$ENV{HIPCXX}.\n${CMAKE_HIP_COMPILER_INIT}") 31 endif() 32 endif() 33 34 # finally list compilers to try 35 if(NOT CMAKE_HIP_COMPILER_INIT) 36 set(CMAKE_HIP_COMPILER_LIST clang++) 37 38 # Look for the Clang coming with ROCm to support HIP. 39 execute_process(COMMAND hipconfig --hipclangpath 40 OUTPUT_VARIABLE _CMAKE_HIPCONFIG_CLANGPATH 41 RESULT_VARIABLE _CMAKE_HIPCONFIG_RESULT 42 ) 43 if(_CMAKE_HIPCONFIG_RESULT EQUAL 0 AND EXISTS "${_CMAKE_HIPCONFIG_CLANGPATH}") 44 set(CMAKE_HIP_COMPILER_HINTS "${_CMAKE_HIPCONFIG_CLANGPATH}") 45 endif() 46 endif() 47 48 _cmake_find_compiler(HIP) 49elseif(CMAKE_HIP_COMPILER MATCHES "hipcc") 50 message(FATAL_ERROR 51 "CMAKE_HIP_COMPILER is set to the hipcc wrapper:\n" 52 " ${CMAKE_HIP_COMPILER}\n" 53 "This is not supported. Use Clang directly, or let CMake pick a default." 54 ) 55else() 56 _cmake_find_compiler_path(HIP) 57endif() 58 59mark_as_advanced(CMAKE_HIP_COMPILER) 60 61# Build a small source file to identify the compiler. 62if(NOT CMAKE_HIP_COMPILER_ID_RUN) 63 set(CMAKE_HIP_COMPILER_ID_RUN 1) 64 65 # Try to identify the compiler. 66 set(CMAKE_HIP_COMPILER_ID) 67 set(CMAKE_HIP_PLATFORM_ID) 68 file(READ ${CMAKE_ROOT}/Modules/CMakePlatformId.h.in 69 CMAKE_HIP_COMPILER_ID_PLATFORM_CONTENT) 70 71 list(APPEND CMAKE_HIP_COMPILER_ID_TEST_FLAGS_FIRST "-v") 72 73 include(${CMAKE_ROOT}/Modules/CMakeDetermineCompilerId.cmake) 74 CMAKE_DETERMINE_COMPILER_ID(HIP HIPFLAGS CMakeHIPCompilerId.hip) 75 76 _cmake_find_compiler_sysroot(HIP) 77endif() 78 79if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT AND CMAKE_HIP_COMPILER_ID STREQUAL "Clang") 80 execute_process(COMMAND "${CMAKE_HIP_COMPILER}" -v -print-targets 81 OUTPUT_STRIP_TRAILING_WHITESPACE 82 RESULT_VARIABLE _CMAKE_HIP_COMPILER_RESULT 83 OUTPUT_VARIABLE _CMAKE_HIP_COMPILER_STDOUT 84 ERROR_VARIABLE _CMAKE_HIP_COMPILER_STDERR 85 ) 86 87 if(_CMAKE_HIP_COMPILER_RESULT EQUAL 0 AND _CMAKE_HIP_COMPILER_STDERR MATCHES "Found HIP installation: *([^,]*)[,\n]") 88 set(CMAKE_HIP_COMPILER_ROCM_ROOT "${CMAKE_MATCH_1}") 89 endif() 90endif() 91if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT) 92 execute_process( 93 COMMAND hipconfig --rocmpath 94 OUTPUT_VARIABLE _CMAKE_HIPCONFIG_ROCMPATH 95 RESULT_VARIABLE _CMAKE_HIPCONFIG_RESULT 96 ) 97 if(_CMAKE_HIPCONFIG_RESULT EQUAL 0 AND EXISTS "${_CMAKE_HIPCONFIG_ROCMPATH}") 98 set(CMAKE_HIP_COMPILER_ROCM_ROOT "${_CMAKE_HIPCONFIG_ROCMPATH}") 99 endif() 100endif() 101if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT) 102 message(FATAL_ERROR "Failed to find ROCm root directory.") 103endif() 104if(NOT EXISTS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib/cmake/hip-lang/hip-lang-config.cmake") 105 message(FATAL_ERROR 106 "The ROCm root directory:\n" 107 " ${CMAKE_HIP_COMPILER_ROCM_ROOT}\n" 108 "does not contain the HIP runtime CMake package, expected at:\n" 109 " ${CMAKE_HIP_COMPILER_ROCM_ROOT}/lib/cmake/hip-lang/hip-lang-config.cmake\n" 110 ) 111endif() 112 113if (NOT _CMAKE_TOOLCHAIN_LOCATION) 114 get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_HIP_COMPILER}" PATH) 115endif () 116 117set(_CMAKE_PROCESSING_LANGUAGE "HIP") 118include(CMakeFindBinUtils) 119include(Compiler/${CMAKE_HIP_COMPILER_ID}-FindBinUtils OPTIONAL) 120unset(_CMAKE_PROCESSING_LANGUAGE) 121 122if(CMAKE_HIP_COMPILER_SYSROOT) 123 string(CONCAT _SET_CMAKE_HIP_COMPILER_SYSROOT 124 "set(CMAKE_HIP_COMPILER_SYSROOT \"${CMAKE_HIP_COMPILER_SYSROOT}\")\n" 125 "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_HIP_COMPILER_SYSROOT}\")") 126else() 127 set(_SET_CMAKE_HIP_COMPILER_SYSROOT "") 128endif() 129 130if(CMAKE_HIP_COMPILER_ARCHITECTURE_ID) 131 set(_SET_CMAKE_HIP_COMPILER_ARCHITECTURE_ID 132 "set(CMAKE_HIP_COMPILER_ARCHITECTURE_ID ${CMAKE_HIP_COMPILER_ARCHITECTURE_ID})") 133else() 134 set(_SET_CMAKE_HIP_COMPILER_ARCHITECTURE_ID "") 135endif() 136 137if(MSVC_HIP_ARCHITECTURE_ID) 138 set(SET_MSVC_HIP_ARCHITECTURE_ID 139 "set(MSVC_HIP_ARCHITECTURE_ID ${MSVC_HIP_ARCHITECTURE_ID})") 140endif() 141 142if(NOT DEFINED CMAKE_HIP_ARCHITECTURES) 143 # Use 'rocm_agent_enumerator' to get the current GPU architecture. 144 set(_CMAKE_HIP_ARCHITECTURES) 145 find_program(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR 146 NAMES rocm_agent_enumerator 147 HINTS "${CMAKE_HIP_COMPILER_ROCM_ROOT}/bin" 148 NO_CACHE) 149 if(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR) 150 execute_process(COMMAND "${_CMAKE_HIP_ROCM_AGENT_ENUMERATOR}" -t GPU 151 RESULT_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_RESULT 152 OUTPUT_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT 153 ERROR_VARIABLE _CMAKE_ROCM_AGENT_ENUMERATOR_STDERR 154 ) 155 if(_CMAKE_ROCM_AGENT_ENUMERATOR_RESULT EQUAL 0) 156 separate_arguments(_hip_archs NATIVE_COMMAND "${_CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT}") 157 foreach(_hip_arch ${_hip_archs}) 158 if(_hip_arch STREQUAL "gfx000") 159 continue() 160 endif() 161 string(FIND ${_hip_arch} ":" pos) 162 if(NOT pos STREQUAL "-1") 163 string(SUBSTRING ${_hip_arch} 0 ${pos} _hip_arch) 164 endif() 165 list(APPEND _CMAKE_HIP_ARCHITECTURES "${_hip_arch}") 166 endforeach() 167 endif() 168 unset(_CMAKE_ROCM_AGENT_ENUMERATOR_RESULT) 169 unset(_CMAKE_ROCM_AGENT_ENUMERATOR_STDOUT) 170 unset(_CMAKE_ROCM_AGENT_ENUMERATOR_STDERR) 171 endif() 172 unset(_CMAKE_HIP_ROCM_AGENT_ENUMERATOR) 173 if(_CMAKE_HIP_ARCHITECTURES) 174 set(CMAKE_HIP_ARCHITECTURES "${_CMAKE_HIP_ARCHITECTURES}" CACHE STRING "HIP architectures") 175 elseif(CMAKE_HIP_COMPILER_PRODUCED_OUTPUT MATCHES " -target-cpu ([a-z0-9]+) ") 176 set(CMAKE_HIP_ARCHITECTURES "${CMAKE_MATCH_1}" CACHE STRING "HIP architectures") 177 else() 178 message(FATAL_ERROR "Failed to find a default HIP architecture.") 179 endif() 180 unset(_CMAKE_HIP_ARCHITECTURES) 181endif() 182 183# configure variables set in this file for fast reload later on 184configure_file(${CMAKE_ROOT}/Modules/CMakeHIPCompiler.cmake.in 185 ${CMAKE_PLATFORM_INFO_DIR}/CMakeHIPCompiler.cmake 186 @ONLY 187 ) 188set(CMAKE_HIP_COMPILER_ENV_VAR "HIPCXX") 189