7b7d7a3b4a8506e3dc9246aa303596a1f5bdc4e1
[platform/upstream/cmake.git] / Modules / CMakeDetermineHIPCompiler.cmake
1 # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3
4 include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake)
5 include(${CMAKE_ROOT}/Modules/CMakeParseImplicitLinkInfo.cmake)
6
7 if( NOT ( ("${CMAKE_GENERATOR}" MATCHES "Make") OR
8           ("${CMAKE_GENERATOR}" MATCHES "Ninja") ) )
9   message(FATAL_ERROR "HIP language not currently supported by \"${CMAKE_GENERATOR}\" generator")
10 endif()
11
12
13 if(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)
49 elseif(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     )
55 else()
56   _cmake_find_compiler_path(HIP)
57 endif()
58
59 mark_as_advanced(CMAKE_HIP_COMPILER)
60
61 # Build a small source file to identify the compiler.
62 if(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)
77 endif()
78
79 if(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()
90 endif()
91 if(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()
100 endif()
101 if(NOT CMAKE_HIP_COMPILER_ROCM_ROOT)
102   message(FATAL_ERROR "Failed to find ROCm root directory.")
103 endif()
104 if(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     )
111 endif()
112
113 if (NOT _CMAKE_TOOLCHAIN_LOCATION)
114   get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_HIP_COMPILER}" PATH)
115 endif ()
116
117 set(_CMAKE_PROCESSING_LANGUAGE "HIP")
118 include(CMakeFindBinUtils)
119 include(Compiler/${CMAKE_HIP_COMPILER_ID}-FindBinUtils OPTIONAL)
120 unset(_CMAKE_PROCESSING_LANGUAGE)
121
122 if(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}\")")
126 else()
127   set(_SET_CMAKE_HIP_COMPILER_SYSROOT "")
128 endif()
129
130 if(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})")
133 else()
134   set(_SET_CMAKE_HIP_COMPILER_ARCHITECTURE_ID "")
135 endif()
136
137 if(MSVC_HIP_ARCHITECTURE_ID)
138   set(SET_MSVC_HIP_ARCHITECTURE_ID
139     "set(MSVC_HIP_ARCHITECTURE_ID ${MSVC_HIP_ARCHITECTURE_ID})")
140 endif()
141
142 if(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)
181 endif()
182
183 # configure variables set in this file for fast reload later on
184 configure_file(${CMAKE_ROOT}/Modules/CMakeHIPCompiler.cmake.in
185   ${CMAKE_PLATFORM_INFO_DIR}/CMakeHIPCompiler.cmake
186   @ONLY
187   )
188 set(CMAKE_HIP_COMPILER_ENV_VAR "HIPCXX")