From 17ca4ca8dcb3e2f352f5b9be29cd64027c6aaee6 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Wed, 28 Oct 2020 16:17:33 -0400 Subject: [PATCH] SWDEV-264220 - Provide CMake hip language configuration information This provides the required information for CMake to bootstrap HIP language and runtime support. In particular this file is consumed by CMake during HIP compiler detection to determine the required flags needed for compilation and linking. Initial design was discussed in #2158 Add copyright / license header Change-Id: I10acb860bf6291b2deb6b678e6e916faa7c82c2a [ROCm/hip commit: 8c90ab196bc3732187277c063e933d62d5f65e1d] --- projects/hip/CMakeLists.txt | 1 + projects/hip/hip-lang-config.cmake.in | 132 ++++++++++++++++++++++++++ projects/hip/rocclr/CMakeLists.txt | 24 +++++ 3 files changed, 157 insertions(+) create mode 100644 projects/hip/hip-lang-config.cmake.in diff --git a/projects/hip/CMakeLists.txt b/projects/hip/CMakeLists.txt index 8c2e4049fe..de7969e13b 100755 --- a/projects/hip/CMakeLists.txt +++ b/projects/hip/CMakeLists.txt @@ -257,6 +257,7 @@ set(BIN_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/bin) set(LIB_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/lib) set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/include) set(CONFIG_PACKAGE_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/hip) +set(CONFIG_LANG_PACKAGE_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/hip-lang) # Build clang hipify if enabled if (BUILD_HIPIFY_CLANG) diff --git a/projects/hip/hip-lang-config.cmake.in b/projects/hip/hip-lang-config.cmake.in new file mode 100644 index 0000000000..9d3c9cc22a --- /dev/null +++ b/projects/hip/hip-lang-config.cmake.in @@ -0,0 +1,132 @@ +# Copyright (C) 2021 Kitware, 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. + +@PACKAGE_INIT@ +include(CMakeFindDependencyMacro OPTIONAL RESULT_VARIABLE _CMakeFindDependencyMacro_FOUND) +if (NOT _CMakeFindDependencyMacro_FOUND) + macro(find_dependency dep) + if (NOT ${dep}_FOUND) + set(cmake_fd_version) + if (${ARGC} GREATER 1) + set(cmake_fd_version ${ARGV1}) + endif() + set(cmake_fd_exact_arg) + if(${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION_EXACT) + set(cmake_fd_exact_arg EXACT) + endif() + set(cmake_fd_quiet_arg) + if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) + set(cmake_fd_quiet_arg QUIET) + endif() + set(cmake_fd_required_arg) + if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) + set(cmake_fd_required_arg REQUIRED) + endif() + find_package(${dep} ${cmake_fd_version} + ${cmake_fd_exact_arg} + ${cmake_fd_quiet_arg} + ${cmake_fd_required_arg} + ) + string(TOUPPER ${dep} cmake_dep_upper) + if (NOT ${dep}_FOUND AND NOT ${cmake_dep_upper}_FOUND) + set(${CMAKE_FIND_PACKAGE_NAME}_NOT_FOUND_MESSAGE "${CMAKE_FIND_PACKAGE_NAME} could not be found because dependency ${dep} could not be found.") + set(${CMAKE_FIND_PACKAGE_NAME}_FOUND False) + return() + endif() + set(cmake_fd_version) + set(cmake_fd_required_arg) + set(cmake_fd_quiet_arg) + set(cmake_fd_exact_arg) + endif() + endmacro() +endif() + +set(HIP_COMPILER "@HIP_COMPILER@") +set(HIP_RUNTIME "@HIP_RUNTIME@") + +find_dependency(AMDDeviceLibs) +find_dependency(amd_comgr) + +include( "${CMAKE_CURRENT_LIST_DIR}/hip-lang-targets.cmake" ) + +#get_filename_component cannot resolve the symlinks if called from /opt/rocm/lib/hip +#and do three level up again +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_DIR}" REALPATH) +get_filename_component(_IMPORT_PREFIX "${_DIR}/../../../" REALPATH) + + +#need _IMPORT_PREFIX to be set +file(GLOB HIP_CLANG_INCLUDE_SEARCH_PATHS "${_IMPORT_PREFIX}/../llvm/lib/clang/*/include") +find_path(HIP_CLANG_INCLUDE_PATH __clang_cuda_math.h + HINTS ${HIP_CLANG_INCLUDE_SEARCH_PATHS} + NO_DEFAULT_PATH) +get_filename_component(HIP_CLANG_INCLUDE_PATH "${HIP_CLANG_INCLUDE_PATH}" DIRECTORY) + +#If HIP isnot installed under ROCm, need this to find HSA assuming HSA is under ROCm +if( DEFINED ENV{ROCM_PATH} ) + set(ROCM_PATH "$ENV{ROCM_PATH}") +endif() + +#if HSA is not under ROCm then provide CMAKE_PREFIX_PATH= +find_path(HSA_HEADER hsa/hsa.h + PATHS + "${_IMPORT_PREFIX}/../include" + /opt/rocm/include +) + +if (HSA_HEADER-NOTFOUND) + message (FATAL_ERROR "HSA header not found! ROCM_PATH environment not set") +endif() + +set_target_properties(hip-lang::device PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "$<$:${_IMPORT_PREFIX}/../include;${HIP_CLANG_INCLUDE_PATH}>" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "$<$:${_IMPORT_PREFIX}/../include;${HIP_CLANG_INCLUDE_PATH}>" +) + +set_target_properties(hip-lang::amdhip64 PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "$<$:__HIP_ROCclr__=1>" + INTERFACE_INCLUDE_DIRECTORIES "$<$:${_IMPORT_PREFIX}/include;${HSA_HEADER}>" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "$<$:${_IMPORT_PREFIX}/include;${HSA_HEADER}>" +) +set_target_properties(hip-lang::device PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "$<$:__HIP_ROCclr__=1>" +) + +set_property(TARGET hip-lang::device APPEND PROPERTY + INTERFACE_COMPILE_OPTIONS "$<$:SHELL:-mllvm;-amdgpu-early-inline-all=true;-mllvm;-amdgpu-function-calls=false>" +) + +if (NOT EXISTS "${AMD_DEVICE_LIBS_PREFIX}/amdgcn/bitcode") + set_property(TARGET hip-lang::device APPEND PROPERTY + INTERFACE_COMPILE_OPTIONS "$<$:--hip-device-lib-path=${AMD_DEVICE_LIBS_PREFIX}/lib>" + ) +endif() + +set_property(TARGET hip-lang::device APPEND PROPERTY + INTERFACE_LINK_OPTIONS "$<$:--hip-link>" +) + +# Add support for __fp16 and _Float16, explicitly link with compiler-rt +set_property(TARGET hip-lang::device APPEND PROPERTY + INTERFACE_LINK_LIBRARIES "$<$:${HIP_CLANG_INCLUDE_PATH}/lib/linux/libclang_rt.builtins-x86_64.a>" +) + +# Approved by CMake to use this name. This is used so that HIP can +# change the name of the target and not require any modifications in CMake +set(_CMAKE_HIP_DEVICE_RUNTIME_TARGET "hip-lang::device") diff --git a/projects/hip/rocclr/CMakeLists.txt b/projects/hip/rocclr/CMakeLists.txt index 2d170944e6..b8081ab078 100755 --- a/projects/hip/rocclr/CMakeLists.txt +++ b/projects/hip/rocclr/CMakeLists.txt @@ -235,3 +235,27 @@ INSTALL(PROGRAMS $ DESTINATION lib COMPONENT MAIN) INSTALL(TARGETS amdhip64 host device EXPORT hip-targets DESTINATION ${LIB_INSTALL_DIR}) INSTALL(EXPORT hip-targets DESTINATION ${CONFIG_PACKAGE_INSTALL_DIR} NAMESPACE hip::) +INSTALL(TARGETS amdhip64 host device EXPORT hip-lang-targets DESTINATION ${LIB_INSTALL_DIR}) +INSTALL(EXPORT hip-lang-targets DESTINATION ${CONFIG_LANG_PACKAGE_INSTALL_DIR} NAMESPACE hip-lang::) + +include(CMakePackageConfigHelpers) + +configure_package_config_file( + ${PROJECT_SOURCE_DIR}/hip-lang-config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/hip-lang-config.cmake + INSTALL_DESTINATION ${CONFIG_LANG_PACKAGE_INSTALL_DIR} + PATH_VARS LIB_INSTALL_DIR INCLUDE_INSTALL_DIR BIN_INSTALL_DIR + ) + +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/hip-lang-config-version.cmake + VERSION "${HIP_VERSION_MAJOR}.${HIP_VERSION_MINOR}.${HIP_VERSION_GITDATE}" + COMPATIBILITY SameMajorVersion + ) +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/hip-lang-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/hip-lang-config-version.cmake + DESTINATION + ${CONFIG_LANG_PACKAGE_INSTALL_DIR}/ + )